Linux裝置驅動工程師之路 input子系統

2022-09-03 00:21:25 字數 2589 閱讀 2105

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訊息處理上有區別。在和驅動通訊過程中,我們一般都會碰到應該選擇何種型別的緩衝型別進行通訊。本文將簡要的介...