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