Linux輸入子系統

2021-06-06 12:47:50 字數 2639 閱讀 1725

1.1.input子系統概述

輸入裝置(如按鍵,鍵盤,觸控螢幕,滑鼠等)是典型的字元裝置,其一般的工作機制是低層在按鍵,觸控等動作發生時產生乙個中斷(或驅動通過timer定時查詢),然後cpu通過spi,i2c或者外部儲存器匯流排讀取鍵值,座標等資料,放乙個緩衝區,字元裝置驅動管理該緩衝區,而驅動的read()介面讓使用者可以讀取鍵值,座標等資料。

在linux中,輸入子系統是由輸入子系統裝置驅動層、輸入子系統核心層(input core)和輸入子系統事件處理層(event handler)組成。其中裝置驅動層提供對硬體各暫存器的讀寫訪問和將底層硬體對使用者輸入訪問的響應轉換為標準的輸入事件,再通過核心層提交給事件處理層;而核心層對下提供了裝置驅動層的程式設計介面,對上又提供了事件處理層的程式設計介面;而事件處理層就為我們使用者空間的應用程式提供了統一訪問裝置的介面和驅動層提交來的事件處理。所以這使得我們輸入裝置的驅動部分不在用關心對裝置檔案的操作,而是要關心對各硬體暫存器的操作和提交的輸入事件。

1.2. input子系統結構圖

input子系統結構圖如下圖1所示:

圖1 輸入子系統結構圖

1.3.linux中輸入裝置驅動的分層

linux中輸入裝置驅動的分層如下圖2所示:

圖2 linux中輸入裝置的分層

1.4. 輸入子系統裝置驅動層實現原理

在linux中,input裝置用input_dev結構體描述,定義在input.h中。裝置的驅動只需按照如下步驟就可實現了。 

1).在驅動模組載入函式中設定input裝置支援input子系統的哪些事件; 

2).將input裝置註冊到input子系統中; 

3).在input裝置發生輸入操作時(如:鍵盤被按下/抬起、觸控螢幕被觸控/抬起/移動、滑鼠被移動/單擊/抬起時等),提交所發生的事件及對應的鍵值/座標等狀態。

1.5.軟體設計流程

軟體設計流程如下圖3所示

圖 3 input子系統軟體設計流程

1.6.與軟體設計有關的api函式

1.6.1.分配乙個輸入裝置

struct input_dev *input_allocate_device*(void); 

1.6.2.註冊乙個輸入裝置

int input_register_device(struct input_dev *dev);

1.6.3.驅動實現-事件支援

set_bit告訴inout子系統它支援哪些事件 

set_bit(ev_key,button_dev.evbit) 

struct input_dev中有兩個成員,乙個是evbit;乙個是keybit.分別用來表示裝置所支援的事件型別和按鍵型別。

1.6.3.1事件型別

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 力反饋

1.6.4.驅動實現-報告事件

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);//報告同步事件 

在觸控螢幕驅動設計中,一次座標及按下狀態的整個報告過程如下: 

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);//同步 

1.6.5釋放與登出裝置

void input_free_device(struct input_dev *dev); 

void input_unregister_device(struct input_dev *); 

Linux輸入子系統

linux系統提供了input子系統,按鍵 觸控螢幕 鍵盤 滑鼠等輸入都可以利用input介面函式來實現裝置驅動,最重要的資料結構是struct input dev 在linux 核心中,input裝置用input dev 結構 體描述,使用input子系統實現輸入裝置驅動的時候,驅動的核心工作是向...

Linux輸入子系統

位址 linux輸入子系統 按鍵與觸控螢幕的裝置驅動,在linux系統中實現這類裝置驅動的方法是利用input子系統。linux系統提供了input子系統,按鍵 觸控螢幕 鍵盤 滑鼠等輸入都可以利用input介面函式來實現裝置驅動,按鍵和觸控螢幕裝置驅動都可以作為input裝置驅動而實現。在linu...

linux輸入子系統

輸入子系統是基於字元裝置驅動封裝出來的框架,drver那邊已經實現好的,只需要驅動程式員實現device就行。驅動框架如下 1.分配乙個input dev結構體 static struct input dev buttons dev buttons dev input allocate device...