一、開發環境
二、前提知識
1、Linux輸入子系統(Input Subsystem):
在Linux中,輸入子系統是由輸入子系統設備驅動層、輸入子系統核心層(Input Core)和輸入子系統事件處理層(Event Handler)組成。其中設備驅動層提供對硬件各寄存器的讀寫訪問和將底層硬件對用戶輸入訪問的響應轉換為標准的輸入事件,再通過核心層提交給事件處理層;而核心層對下提供了設備驅動層的編程接口,對上又提供了事件處理層的編程接口;而事件處理層就為我們用戶空間的應用程序提供了統一訪問設備的接口和驅動層提交來的事件處理。所以這使得我們輸入設備的驅動部分不在用關心對設備文件的操作,而是要關心對各硬件寄存器的操作和提交的輸入事件。下面用圖形來描述一下這三者的關系吧!
另外,又找了另一幅圖來說明Linux輸入子系統的結構,可能更加形象容易理解。如下:
2、輸入子系統設備驅動層實現原理:
在Linux中,Input設備用input_dev結構體描述,定義在input.h中。設備的驅動只需按照如下步驟就可實現了。
①、在驅動模塊加載函數中設置Input設備支持input子系統的哪些事件;
②、將Input設備注冊到input子系統中;
③、在Input設備發生輸入操作時(如:鍵盤被按下/抬起、觸摸屏被觸摸/抬起/移動、鼠標被移動/單擊/抬起時等),www.linuxidc.com提交所發生的事件及對應的鍵值/坐標等狀態。
Linux中輸入設備的事件類型有(這裡只列出了常用的一些,更多請看linux/input.h中):
EV_SYN 0x00 同步事件
EV_KEY 0x01 按鍵事件
EV_REL 0x02 相對坐標(如:鼠標移動,報告的是相對最後一次位置的偏移)
EV_ABS 0x03 絕對坐標(如:觸摸屏和操作桿,報告的是絕對的坐標位置)
EV_MSC 0x04 其它
EV_LED 0x11 LED
EV_SND 0x12 聲音
EV_REP 0x14 Repeat
EV_FF 0x15 力反饋
用於提交較常用的事件類型給輸入子系統的函數有:
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系統,設備驅動已經發出了一個完整的報告:
void input_sync(struct input_dev *dev)