星期一, 5月 12, 2008

Linux Driver

最近頻繁的接觸Linux Device Driver, 主要都是寫Character Driver, 因為簡單好入門.

簡單來講, 把握以下要點就可以寫出一支屬於你自己的Linux Driver了.
  • init_module和clean_module: 這兩個functions, 用C++的角度來看, init_module是constructor, 而clean_module則是de-constructor.
  • file_operation: 簡單講, 其實就只是function pointer的對映而已. 你必需分別寫出當open, release, read, write, ioctl時, 你的driver要怎麼處理.

說的比做的簡單, 沒錯, 就這麼簡單, 就可以編譯出你自己的driver然後insmod到Linux裡. 但, 事實上, 即使是最簡單的Character Driver也牽扯到很多事情. 隨便舉例, blocking or non-blocking, mutex (或類似的機制)使用的時機. user-mode和kernel-mode資料的交換(i.e., copy_from_user or copy_to_user), 更進階的mmap.

寫出來正常運作只代表do the right thing, 要怎麼do the thing right才是一門大學問啊!!!

星期六, 5月 03, 2008

讓你的JPanel能取得VK_TAB

問: 怎麼讓一個java.awt.Component的子類別(e.g., javax.swing.JPanel)能抓到KeyEvent.VK_TAB呢?

答: 以實例來說,

JPanel panel = new JPanel();
panel.addKeyListener(your_keylistener);
panel.setFocusTraversalKeysEnabled(false);

但, 這問題還沒完全解決, 如VK_PRINTSCREEN還是抓不到, VK_WINDOWS即使Java Application抓到了, 卻無法阻止(e.g., consum())這個event到OS...

still looking for solution...