Linux輸入子系統框架分析及輸入裝置驅動程式設計

2021-07-24 23:51:33 字數 2005 閱讀 8459

linux輸入子系統(linux input subsystem)從上到下由三層實現,分別為:輸入子系統事件驅動程式層(eventhandler)、輸入子系統核心層(inputcore)和輸入子系統裝置驅動程式層。它們各自的功能如下:

對於輸入子系統裝置驅動程式層而言,主要實現對硬體裝置的讀寫訪問,中斷設定,並把硬體產生的事件轉換為核心層定義的規範提交給事件處理層。

對於核心層而言,為裝置驅動層提供了規範和介面。裝置驅動層只要關心如何驅動硬體並獲得硬體資料(例如按下的按鍵資料),然後呼叫核心層提供的介面,核心層會自動把資料提交給事件處理層。

對於輸入子系統事件驅動程式層而言,則是使用者程式設計的介面(裝置節點),並處理驅動層提交的資料處理。

linux輸入子系統的框架如下:

編寫符合輸入子系統框架的裝置驅動程式主要有以下四個步驟:

1.分配乙個input_dev結構體,呼叫input_allocate_device()或者devm_input_allocate_device(struct input_dev*)實現;

2.設定input裝置支援的事件型別,其支援的事件型別如下表;

linux輸入子系統支援的事件型別
ev_syn     0x00    同步事件

ev_key 0x01 按鍵事件

ev_rel 0x02 相對座標(如:滑鼠移動,報告相對最後一次位置的偏移)

ev_abs 0x03 絕對座標(如:觸控螢幕或操作杆,報告絕對的座標位置)

ev_msc 0x04 其它

ev_sw 0x05 開關

ev_led 0x11 按鍵/裝置燈

ev_snd 0x12 聲音/警報

ev_rep 0x14 重複

ev_ff 0x15 力反饋

ev_pwr 0x16 電源

ev_ff_status 0x17 力反饋狀態

ev_max 0x1f 事件型別最大個數和提供位掩碼支援

3.將輸入裝置註冊到輸入子系統中,呼叫input_register_device(struct input_dev*)函式實現;

4.硬體相關的**:註冊中斷處理函式,比如鍵盤裝置需要編寫按鍵的抬起、放下,觸控螢幕裝置需要編寫按下、抬起、絕對移動,滑鼠裝置需要編寫單擊、抬起、相對移動,並且需要在必要的時候提交硬體資料(鍵值/座標/狀態等等),即上報輸入事件。

linux輸入子系統提供了裝置驅動層上報輸入事件的函式,在include/linux/input.h中:

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); //上報按鍵事件

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);

linux輸入子系統 5 學習框架

注 本系列 input子系統學習系列文章,是我在實際開發過程中遇到也是必須啃下去的第乙個linux驅動,所以有必要記載下來的。由於剛開始未接觸過input子系統,部分資料還是借鑑網路,本系列文章是本人的學習心得以及集百家所長的產物。input subsystem理論部分 input subsyste...

輸入子系統框架之我見

輸入子系統是linux驅動中很重要的一部分,按鍵 觸控螢幕 滑鼠等等的驅動都可以通過這個框架來構建,下面就來總結下輸入子系統的框架。核心層主要在input.c檔案中,class register input class register chrdev input major,input input ...

Linux輸入子系統

1.1.input子系統概述 輸入裝置 如按鍵,鍵盤,觸控螢幕,滑鼠等 是典型的字元裝置,其一般的工作機制是低層在按鍵,觸控等動作發生時產生乙個中斷 或驅動通過timer定時查詢 然後cpu通過spi,i2c或者外部儲存器匯流排讀取鍵值,座標等資料,放乙個緩衝區,字元裝置驅動管理該緩衝區,而驅動的r...