Linux輸入子系統

2021-06-07 04:01:52 字數 2597 閱讀 8765

linux系統提供了input子系統,按鍵、觸控螢幕、鍵盤、滑鼠等輸入都可以利用input介面函式來實現裝置驅動,最重要的資料結構是struct input_dev 

在linux 核心中,input裝置用input_dev 結構 體描述,使用input子系統實現輸入裝置驅動的時候,驅動的核心工作是向系統報告按鍵、觸控螢幕、鍵盤、滑鼠等輸入事件(event,通過 input_event結構 體描述),

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

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

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

set_bit(ev_key, button_dev.evbit);

2,在模組載入函式中註冊輸入裝置

註冊輸入裝置的函式為:

int input_register_device(struct input_dev *dev);

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

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

用於報告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);

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

4,在模組解除安裝函式中登出輸入裝置。

登出輸入裝置的函式為:

void input_unregister_device(struct input_dev *dev);

觸控螢幕裝置驅動例項:

input_dev= input_allocate_device();//分配

input_dev->name = "******";//初始化裝置資訊

input_dev->id.bustype = bus_i2c;

set_bit(ev_key, input_dev->evbit);//裝置支援的事件

set_bit(ev_abs,input_dev->evbit);

set_bit(abs_mt_position_x, input_dev->absbit);

set_bit(abs_mt_position_y, input_dev->absbit);

set_bit(abs_mt_touch_major, input_dev->absbit);

set_bit(abs_mt_width_major, input_dev->absbit);

set_bit(abs_mt_tracking_id, input->absbit);

set_bit(key_menu, input->keybit);

set_bit(key_back, input->keybit);

set_bit(key_home, input->keybit);

set_bit(key_search, input->keybit);

input_set_abs_params(input_dev, abs_mt_position_x, 0, screen_max_x, 0, 0);

input_set_abs_params(input_dev, abs_mt_position_y, 0, screen_max_y, 0, 0);

input_set_abs_params(input_dev,abs_mt_touch_major, 0, press_max, 0, 0);

input_set_abs_params(input_dev,abs_mt_width_major, 0, 200, 0, 0);

input_set_abs_params(input_dev,abs_mt_tracking_id, 0, 5, 0, 0);

//初始化引數結束,註冊input dev

input_register_device(input_dev);

Linux輸入子系統

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

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...