linux 系統提供了 input 子系統,按鍵、觸控螢幕、鍵盤、 滑鼠等輸入都可以利用 input介面函式來實現裝置驅動
input 裝置用 input_dev 結構體描述,使用 input 子系統實現輸入裝置驅動的時候,驅動的核心工作是向系統報告按鍵、觸控螢幕、鍵盤、滑鼠等輸入事件(event,通過 input_event 結構體描述),不再需要關心檔案操作介面,因為 input子系統已經完成了檔案操作介面。驅動報告的事件經過 inputcore 和 eventhandler 最終到達使用者空間
在模組載入函式中告知 input 子系統它可以報告的事件,裝置驅動通過 set_bit
()告訴
input 子系統它支援哪些事件,如下所示:
set_bit
(ev_key, button_dev.evbit)
; 在模組載入函式中註冊輸入裝置,註冊輸入裝置的函式為:
intinput_register_device
(struct input_dev *dev)
; 在鍵被按下/抬起、觸控螢幕被觸控/抬起/移動、滑鼠被移動/單擊/抬起時通過
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,
intvalue)
;void
input_report_rel
(struct input_dev *dev,
unsigned
int code,
intvalue)
;void
input_report_abs
(struct input_dev *dev,
unsigned
int code,
intvalue)
;
nput_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)
;
最簡單的 input 裝置驅動
/在按鍵中斷中報告事件/
static
void
button_interrupt
(int irq,
void
*dummy,
struct pt_regs *fp)
static
int __init button_init
(void
)//支援 ev_key 事件
button_dev.evbit[0]
=bit
(ev_key)
; button_dev.keybit[
long
(btn_0)]=
bit(btn_0)
;input_register_device
(&button_dev)
;//註冊 input 裝置
}static
void _ _exit button_exit
(void
)
linux驅動子系統之輸入子系統 5
5.總結 5.1 事件資訊的上報過程分析 l 上報的大致過程 裝置驅動層 核心層 事件處理層 應用層 l 具體呼叫的函式 以evdev為例 input event input handle event input pass event handle handler event handle,type...
linux裝置驅動 輸入子系統
輸入裝置都能用輸入子系統來寫,比如說按鍵 觸控螢幕 滑鼠等,但是有的輸入裝置不止用到了輸入子系統,比如說usb輸入裝置,他們還用到了usb子系統。我們以最簡單的按鍵 直接接到cpu上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...
linux驅動之輸入子系統
輸入子系統框架,把核心開啟 搜尋input.c 輸入子系統的 在 driver input目錄下面 最上一層,我們稱它為核心層 要看乙個驅動程式我們應該從他的入口函式開始看 有一行 err register chrdev region mkdev input major,0 input max ch...