一,編寫觸摸屏驅動程序的准備知識之一:輸入子系統
1.輸入子系統簡單介紹
Linux系統提供了input子系統,按鍵、觸摸屏、鼠標等輸入型設備都可以利用input接口函數來實現設備驅動。
2.輸入子系統的組成
輸入子系統由驅動層(drivers)、輸入子系統核心層(input core)和事件處理層(Event Handler)三部分組成。
驅動層:將底層的硬件輸入轉化為統一的事件型式,向輸入核心層匯報。
輸入子系統核心層:為驅動層提供輸入設備注冊與操作接口,如input_register_device ;通知事件處理層對事件進行處理;在/proc下產生相應的設備信息。
事件處理層:將硬件設備上報的事件分發到用戶空間和內核。
3.設備描述
在Linux內核中,input設備用input_dev結構體描述,使用input子系統實現輸入設備驅動編寫的時候,驅動的核心工作是向系統報告按鍵、觸摸屏、鍵盤、鼠標等輸入事件,不再需要關心文件操作接口,因為input子系統已經完成了文件操作接口。驅動報告的事件經過輸入子系統核心層和事件處理層最終到達用戶空間。
4.input設備驅動的編寫
4.1 設備注冊/注銷
注冊輸入設備的函數為:int input_register_device(struct input_dev*dev)
注銷輸入設備的函數為: void input_unregister_device(struct input_dev*dev)
4.2 事件支持
設備驅動通過set_bit()或者BIT()告訴input子系統它支持哪些事件,哪些按鍵。例如下面的例子:
set_bit(EV_KEY,dev->evbit) 也可以寫成dev->evbit[0] = BIT(EV_KEY)
表示輸入子系統支持按鍵事件。
struct input_dev 中有兩個成員:evbit表示事件類型,Keybit表示按鍵類型。
輸入子系統支持的事件類型:
EV_RST Reset EV_KEY 按鍵 EV_REL 相對坐標
EV_ABS 絕對坐標 EV_MSC 其它 EV_LED LED
EV_SND 聲音 EV_REP Repeat EV_FF 力反饋
EV_SYN 同步事件
當事件類型為EV_KEY時,還需要指明按鍵類型:
BTN_LEFT 鼠標左鍵 BTN_0 數字0鍵
BTN_RIGHT 鼠標右鍵 BTN_1 數字1鍵
BTN_MIDDLE 鼠標中鍵 BTN_TOUCH 觸摸屏點擊
注:更多的事件類型請看linux源碼中的input.h這個頭文件。
4.3 報告事件
用於報告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)
參數說明:
code 事件的代碼,所有事件的代碼都在linux源碼中的input.h頭文件中。
value 事件的值。如果事件的類型是EV_KEY,當按鍵按下時值為1,松開時值為0。
4.4 完成事件的報告
使用input_sync(struct input_dev *dev)來告訴input core 報告事件已經完成。
二,編寫觸摸屏驅動程序的准備知識之二:觸摸屏驅動的原理
觸摸屏的工作流程
1.1 設置觸摸屏接口為等待中斷模式,等待觸摸屏被按下。
1.2 如果中斷發生(TC中斷,即觸摸屏被按下),選擇X、Y坐標轉換模式(X、Y坐標分別轉換模式或者X、Y坐標自動轉換模式),啟動A/D轉換。
1.3 當A/D轉換完成後,通過中斷(AD中斷,用來表示X、Y 坐標轉換完成)獲取X/Y坐標,ADCDAT0 bit[9:0]--X坐標,ADCDAT1 bit[9:0]--Y坐標。
1.4 設置觸摸屏接口為等待中斷模式,等待觸摸筆離開觸摸屏。
1.5 返回步驟1,等待下次觸摸屏被按下。
TQ2440觸摸屏驅動程序整體流程圖
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-10/107953p2.htm