【感謝終結者投遞本文】
接下來,我們就開始看Input子系統的軟體設計流程,我在閱讀的時候同時整理設計代碼中的相關API,並在下一篇文章詳細介紹input子系統的代碼實現。
input子系統的軟體設計流程
軟體設計流程如下所示:
分配一個輸入裝置——註冊一個輸入裝置——上報輸入事件——登出一個輸入裝置——釋放一個輸入裝置
設計有關的API
分配一個輸入裝置
C/C++代碼
- struct input_dev *input_allocate_device*(void);
註冊一個輸入裝置
C/C++代碼
- int input_register_device(struct input_dev *dev);
驅動實現-事件支援
C/C++代碼
- Set_bit(EV_KEY,button_dev.evbit)
- //Set_bit告訴inout子系統它支援哪些事件
- //Struct input_dev中有兩個成員,一個是evbit;一個是keybit;分別用來表示裝置所支援的事件類型和按鍵類型。
事件類型
Linux中輸入裝置的事件類型有(這裡只列出了常用的一些,更多請看linux/input.h中):
C/C++代碼
- 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 Force feedback事件
按鍵類型
當事件類型為EV_KEY時,還需指明按鍵類型:
C/C++代碼
- BTN_LEFT 滑鼠左鍵
- BTN_RIGHT 滑鼠右鍵
- BTN_MIDDLE 滑鼠中鍵
- BTN_0 數字0鍵
- BTN_1 數字1鍵
上述set_bit函數實則完成了把EV_KEY賦值到button_dev.evbit
驅動實現-報告事件
C/C++代碼
- Void input_event(struct input_dev *dev,unsigned int type,unsigned int code,int value);//報告指定type,code的輸入事件
- Void input_report_key(struct input_dev *dev,unsigned int code,int value);/*報告索引值,code : 事件的代碼,如果事件是ev_key,該代碼則為裝置的鍵盤代碼。例如滑鼠按鍵代碼為0x110~0x116,其中0x110(BTN_LEFT),0x111(BTN_RIGHT),0x112(BTN_MIDDLE)。其它帶按摩含義參考include/linux/input.h檔案*/
- value : 事件的值,如果事件的類型是EV_KEY,當按鍵按下時值為1,鬆開時為0。
- 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);//報告絕對座標
- Void input_sync(struct input_dev *dev);/*報告同步事件,input_sync()用於高速input core 此次報告已經結束,能夠根據上報的資訊往後面處理了*/
在觸控螢幕驅動設計中,一次座標及按下狀態的整個報告過程如下:
C/C++代碼
- Input_report_abs(input_dev,ABS_X,x);//X座標
- Input_report_abs(input_dev,ABS_Y,y);//Y座標
- Input_report_abs(input_dev,ABS_PRESSURE,pres);//壓力
- input_sync(struct input_dev *dev);//同步
釋放與登出裝置
C/C++代碼
- Void input_free_device(struct input_dev *dev);
- Void input_unregister_device(struct input_dev *);
原文連結 http://www.ourunix.org/post/293.html