輸入子系統由 驅動層、輸入子系統核心、事件處理層 三部分組成。一個輸入事件,如滑鼠移動、鍵盤按下等通過Driver->Inputcore->Event handler->userspace的順序到達使用者控制項的應用程式。
驅動層:將底層的硬體輸入轉化為統一事件形式,想輸入核心(Input Core)彙報。
輸入子系統核心:承上啟下。為驅動層提供輸入裝置註冊與操作介面,如:input_register_device;通知事件處理層對事件進行處理;在/Proc下產生相應的裝置資訊
事件處理層:主要是和使用者空間互動。(Linux中在使用者空間將所有的裝置都當初檔案來處理,由於在一般的驅動程式中都有提供fops介面,以及在/dev下產生相應的裝置檔案nod,這些操作在輸入子系統中由事件處理層完成)
裝置描述:
input_dev結構
實現裝置驅動核心工作是:向系統報告按鍵、觸控螢幕等輸入事件(event,通過input_event結構描述),不再需要關心檔案操作介面。驅動報告事件經過inputCore和Eventhandler到達使用者空間。
註冊輸入裝置函數:
int input_register_device(struct input_dev *dev)
登出輸入裝置函數:
void input_unregister_device(struct input_dev *dev)
驅動實現——初始化(事件支援):
set_bit()告訴input輸入子系統支援哪些事件,哪些按鍵。例如:
set_bit(EV_KEY,button_dev.evbit) (其中button_dev是struct
input_dev類型)
struct input_dev中有兩個成員為:
evbit:
事件類型(包括
EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)
keybit:
按鍵類型(當事件類型為EV_KEY時包括
BTN_LEFT,BTN_0,BTN_1,BTN_MIDDLE等)
驅動實現——報告事件:
用於報告EV_KEY,EV_REL,EV_ABS事件的函數分別為void
input_report_key(struct
input_dev *dev,unsigned int code,int value)
void input_report_rel(struct
input_dev *dev,unsigned int code,int value)
void input_report_abs(struct
input_dev *dev,unsigned int code,int value)
驅動實現——報告結束:
input_sync()同步用於告訴input core子系統報告結束。
執行個體:觸控螢幕裝置驅動中,一次點擊的整個報告過程如下:
input_reprot_abs(input_dev,ABS_X,x); //x座標
input_reprot_abs(input_dev,ABS_Y,y); // y座標
input_reprot_abs(input_dev,ABS_PRESSURE,1);
input_sync(input_dev);//同步結束
執行個體分析(按鍵中斷程式):
//按鍵初始化
static int __init button_init(void)
{//申請中斷
if(request_irq(BUTTON_IRQ,button_interrupt,0,”button”,NUll))
return –EBUSY;
set_bit(EV_KEY,button_dev.evbit); //支援EV_KEY事件
set_bit(BTN_0,button_dev.keybit); //支援裝置兩個鍵
set_bit(BTN_1,button_dev.keybit); //
input_register_device(&button_dev);//註冊input裝置
}
/*在按鍵中斷中報告事件*/
Static void button_interrupt(int irq,void *dummy,struct pt_regs *fp)
{
input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT0));//讀取寄存器BUTTON_PORT0的值
input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT1));
input_sync(&button_dev);
}
總結:input子系統仍然是字元裝置驅動程式,但是代碼量減少很多,input子系統只需要完成兩個工作:初始化和附隨報告(這裡在linux中是通過中斷來實現的)。讀者不妨用sourceinsignt 輸入input_init去搜關於輸入子系統的實現