Linux輸入子系統

2021-06-07 21:54:18 字數 2949 閱讀 5028

位址

linux輸入子系統  

按鍵與觸控螢幕的裝置驅動,在linux系統中實現這類裝置驅動的方法是利用input子系統。  

linux系統提供了input子系統,按鍵、觸控螢幕、鍵盤、滑鼠等輸入都可以利用input介面函式來實現裝置驅動,按鍵和觸控螢幕裝置驅動都可以作為input裝置驅動而實現。  

在linux核心中,input裝置用input_dev結構體描述,使用input子系統實現輸入裝置驅動的時候,驅動的核心工作是向系統報告按鍵、觸控螢幕、鍵盤、滑鼠等輸入事件(event,通過input_event結構體描述),不再需要關心檔案操作介面,因為input子系統已經完成了檔案操作介面。驅動報告的事件經過inputcore和 eventhandler最終到達使用者空間。  

輸入子系統支援的事件型別在檔案  

kernel/include/linux/input.h 中定義:  

event 還定義了標準按鍵的編碼等  

通過input子系統,具體的輸入裝置驅動只需要完成如下工作。  

l 在模組載入函式中告知input子系統它可以報告的事件。  

裝置驅動通過set_bit()告訴input子系統它支援哪些事件,如下所示:  

set_bit(ev_key, button_dev.evbit);  

l 在模組載入函式中註冊輸入裝置。  

註冊輸入裝置的函式為:  

intinput_register_device(

struct

input_dev *dev);  

l 在鍵被按下/抬起、觸控螢幕被觸控/抬起/移動、滑鼠被移動/單擊/抬起時通過input_ report_***()報告發生的事件及對應的鍵值/座標等狀態。  

主要的事件型別包括ev_key(按鍵事件)、ev_rel(相對值,如游標移動,報告的是相對最後一次位置的偏移)和ev_abs(絕對值,如觸控螢幕和操縱桿,它們工作在絕對座標系統)。  

用於報告ev_key、ev_rel和ev_abs事件的函式分別為:  

void

input_report_key(

struct

input_dev *dev, unsigned 

intcode, 

intvalue);  

void

input_report_rel(

struct

input_dev *dev, unsigned 

intcode, 

intvalue);  

void

input_report_abs(

struct

input_dev *dev, unsigned 

intcode, 

intvalue);  

input_sync()用於事件同步,它告知事件的接收者驅動已經發出了乙個完整的報告。  

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

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

在模組解除安裝函式中登出輸入裝置。登出輸入裝置的函式為:  

void

input_unregister_device(

struct

input_dev *dev);  

**清單12.28給出了乙個最簡單的使用input介面實現按鍵裝置驅動的範例,它在中斷服務程式中向系統報告按鍵及同步事件。  

input裝置驅動  

1  /*在按鍵中斷中報告事件*/

2  static

void

button_interrupt(

intirq, 

void

*dummy, 

struct

pt_regs *fp)  

3    

7   

8  static

int_ _init button_init(

void

)  9    

16  

17   button_dev.evbit[0] = bit(ev_key);    //支援ev_key事件

18   button_dev.keybit[long

(btn_0)] = bit(btn_0);  

19  

20   input_register_device(&button_dev);   //註冊input裝置

21 }  

22  

23 static

void

_ _exit button_exit(

void

)  24   

觸控螢幕的註冊  

ts->input_dev = input_allocate_device();  

ts->input_dev->name = "synaptics-rmi-touchscreen"

;  set_bit(ev_syn, ts->input_dev->evbit);  

set_bit(ev_key, ts->input_dev->evbit);  

set_bit(btn_touch, ts->input_dev->keybit);  

set_bit(btn_2, ts->input_dev->keybit);  

set_bit(ev_abs, ts->input_dev->evbit);  

/* ts->input_dev->name = ts->keypad_info->name; */

ret = input_register_device(ts->input_dev);  

Linux輸入子系統

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

Linux輸入子系統

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

linux輸入子系統

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