linux裝置驅動工程師之路——input子系統
k-style
一、input子系統系統框架
linux核心實現了一套input子系統,很多輸入裝置,比如說按鍵、鍵盤、滑鼠、觸控螢幕等等都可以利用input子系統提供的介面來編寫驅動,這樣可以幫驅動編寫者減少大量工作量。因為input子系統會幫驅動完成open,read,close等一些列的裝置方法。驅動編寫者只需要在按鍵按下或者滑鼠點選事件時想input子系統上層的event hander報告相應的事件資訊就可以了。下圖是input子系統的框架。最下層是輸入裝置的驅動層,也就是我們需要編寫的,在最底層上面的一層是input子系統的core層。由input.c檔案實現。再上面一層是對應裝置的handler層,每種裝置對應一種handler。handler會在/dev/input資料夾下建立對應的檔案,並對底層報告上來的時間進行相應的處理,並且完成一些相應的檔案操作等。
二、input driver編寫要點
1、分配、註冊、登出input裝置
struct input_dev*input_allocate_device(void)
intinput_register_device(struct input_dev *dev)
voidinput_unregister_device(struct input_dev *dev)
2、設定input裝置支援的事件型別、事件碼、事件值的範圍、input_id等資訊
參見usb鍵盤驅動:usbkbd.c
usb_to_input_id(dev,&input_dev->id);//設定bustype、vendo、product等
input_dev->evbit[0] =bit(ev_key) | bit(ev_led) | bit(ev_rep);//支援的事件型別
input_dev->ledbit[0] =bit(led_numl) | bit(led_capsl) | bit(led_scrolll) | bit(led_compose) |bit(led_kana);// ev_led事件支援的事件碼
for (i = 0; i < 255; i++)
set_bit(usb_kbd_keycode[i],input_dev->keybit); //ev_key事件支援的事件碼
include/linux/input.h中定義了支援的型別(下面列出的是2.6.22核心的情況)
#define ev_syn 0x00
#defineev_key 0x01
#defineev_rel 0x02
#defineev_abs 0x03
#defineev_msc 0x04
#defineev_sw 0x05
#defineev_led 0x11
#defineev_snd 0x12
#defineev_rep 0x14
#define ev_ff 0x15
#defineev_pwr 0x16
#defineev_ff_status 0x17
#defineev_max 0x1f
乙個裝置可以支援乙個或多個事件型別。每個事件型別下面還需要設定具體的觸發事件碼。比如:ev_key事件,需要定義其支援哪些按鍵事件碼。
3、如果需要,設定input裝置的開啟、關閉、寫入資料時的處理方法
參見usb鍵盤驅動:usbkbd.c
input_dev->open= usb_kbd_open;
input_dev->close =usb_kbd_close;
input_dev->event =usb_kbd_event;
4、在發生輸入事件時,向子系統報告事件
用於報告ev_key、ev_rel、ev_abs等事件的函式有:
void input_report_key(structinput_dev *dev, unsigned int code, int value)
void input_report_rel(structinput_dev *dev, unsigned int code, int value)
void input_report_abs(structinput_dev *dev, unsigned int code, int value)
如果你覺得麻煩,你也可以只記住1個函式(因為上述函式都是通過它實現的)
voidinput_event(struct input_dev *dev, unsigned int type, unsigned int code, intvalue)
報告時間之後需要呼叫
input_sync(input_dev),它告知事件的接收者:驅動已經發生了乙個完整的報告。
linux驅動工程師面試
首先,我要說的是,就業成功最關鍵的因素在於紮實的基礎,很寬的知識面,豐富的實踐經驗.這些都是,工作學習中我們需要自己積累的內容,這些真的很重要,如果大家現在不是立馬就要找到乙份工作,建議把以上我提到的三點務必達到一定的要求,這些才是根本.當然,我寫這篇文章並不是向大家介紹怎麼學習,我想與大家分享的是...
驅動工程師 筆試題
一 選擇題 1 main 執行結果為 a.0 0 b.0 1 c.1 0 d.1 1 2 某檔案中定義的靜態全域性變數 或稱靜態外部變數 其作用域是 a.只限某個函式 b.本檔案 c.跨檔案 d.不限制作用域 3 設 int a 10 p a 則對陣列元素的正確引用是 a.a p b.p a c.p...
驅動工程師的面試問題
1.nt式的驅動要匯入的標頭檔案是ntddk.h,wdm式的驅動要匯入的是wdm.h。2.nt式不支援即插即用,通過服務來手動載入 wdm是即插即用,通過inf來載入。3.wdm在裝置建立和pnp訊息處理上有區別。在和驅動通訊過程中,我們一般都會碰到應該選擇何種型別的緩衝型別進行通訊。本文將簡要的介...