學習Linux(34)按鍵輸入檢測

2021-10-08 08:00:14 字數 3077 閱讀 2330

input子系統

input子系統是linux對輸入裝置提供的統一驅動框架。如按鍵、鍵盤、觸控螢幕和滑鼠等輸入裝置的驅動方式是類似的,當出現按鍵、觸控等操作時,硬體產生中斷,然後cpu直接讀取引腳電平,或通過spi、i2c等通訊方式從裝置的暫存器讀取具體的按鍵值或觸控座標,然後把這些資訊提交給核心。使用input子系統 驅動的輸入裝置可以通過統一的資料結構提交給核心,該資料結構包括輸入的時間、型別、代號以及具體的鍵值或座標,而內則通過/dev/input目錄下的檔案介面傳遞給使用者空間。

執行evtest工具,它列出了系統當前可用的/dev/input/event0~6輸入事件 檔案,並且列出了這些事件對應的裝置名。

我們根據裝置名的「virtualbox mouse intergration」推猜它就是接入到電腦 的滑鼠,所以輸入了它對應的event6事件編號6,實驗時請根據自己電腦的輸出來選擇。

輸入編號後它列出了event6的一些裝置資訊,包括驅動版本、裝置id、裝置 名、支援的事件型別、事件代號以及輸入值的取值範圍。

此時移動滑鼠,可以看到它輸出了詳細的事件資訊,如果移動後沒有輸出,說明 你選擇的不是滑鼠裝置,請退出重新選擇。輸出資訊中每一行包含了滑鼠上報事件的具 體時間time、事件型別type 3(ev_abs)、事件代號code 1或code0(abs_y或abs_x)和具體的值value,該值就是滑鼠x/y的座標。

在前面led、gpio子系統中,brightness、direction等裝置檔案直接使用字串來記 錄具體的資訊,所以使用cat命令輸出檔案的內容時,字串的形式非常方便我們閱讀。但是event檔案包 含的資訊較多,使用字串不方便其它程式處理,它採用了純粹的核心事件資料結構來記錄內容,其它 程式使用時 應把讀取到的內容按資料的結構進行格式化轉換,該資料結構定義如下所示。

input_event結構體(核心原始碼的/include/uapi/linux/input.**件)

struct input_event 

;

time:該變數用於記錄事件產生的時間戳,既evtest輸出的time值。

type:輸入裝置的事件型別。系統常用的預設型別有ev_key、 ev_rel和ev_abs,分別用 於表示按鍵狀態改變事件、相對座標改變事件及絕對座標改變事件,特別地,ev_syn用於分隔事件,無特別意義。如果選擇滑鼠(本章第乙個圖) evtest輸出的type型別為ev_abs。相關的列舉值可以參考核心檔案include/uapi/linux/input-event-codes.h。

code:事件代號,它以更精確的方式表示事件。例如 在ev_key事件型別中,code的值常用於表 示鍵盤上具體的按鍵,其取值範圍在0~127之間,例如按鍵q對應的是key_q,該列舉變數的 值為16。如果選擇滑鼠, evtest輸出內容的code分別有abs_x/abs_y,表示上報的是x或y座標。

value:事件的值。對於ev_key事件型別,當按鍵按下時,該值為1;按鍵鬆開時,該值為0。如果選擇 滑鼠,中evtest輸出的內容裡,abs_x事件型別中的value值表示x座標,abs_y型別中的value值表示y座標。

input事件裝置名

「/dev/input/event*」的事件編號與裝置的聯絡不是固定的,它通常按系統檢測 到裝置的先後順序安排event檔案的編號,這對編寫應用程式控制不太方便,我們 可以通過「/dev/input/by-id」或「/dev/input/by-path」目錄檢視具體的硬體裝置,如 下圖所示。

圖中列出了by-path目錄下的內容,該目錄下的檔案實際上都是鏈結,如第 一行的「pci-0000:00:04.0-event-mouse -> …/event6」表示」pci-0000:00:04.0-event- mouse」檔案就是event6的快捷方式,它就是本主機中使用的滑鼠,也就是說訪問該 檔案就是訪問該滑鼠的事件裝置,而且該檔名與硬體的關係是固定的,後面我們的實驗就是採用這樣的方式。

由於/dev下的裝置都是通過/sys匯出的,所以也可以通過「/sys/class/input」目 錄檢視,如下圖所示。

「/sys/class/input」下包含了各個以事件命名的目錄,其對應目錄 下的device/name檔案包含了事件對應的裝置名,如本示例中 的「/sys/class/input/event6/device/name」檔案的內容為」virtualbox mouse integration」,evtest工具列出的事件與裝置名的關係,就是從這裡讀取的。

按鍵檢測

檢測按鍵的裝置檔案:

//開發板上的key按鍵,請根據實際情況修改

const

char default_path=

"/dev/input/by-path/platform-gpio-keys-event"

;//開發板上的on_off按鍵,請根據實際情況修改

//const char default_path = "/dev/input/by-path/platform-20cc000.snvs:snvs-powerkey-event";

intmain

(int argc,

char

*ar**)

printf

("test device: %s.\nwaiting for input...\n"

, path)

;while(1

)}close

(fd)

;return0;

}hankin

2020.07.17

GPIO 輸入 按鍵檢測

這裡要用到一定的模電知識。電容兩端電壓不能突變,電感兩端電流不能突變。這裡利用了電容的放電延時實現硬體消抖。按鍵按下會有抖動,波形有毛刺,使得高低電平顯現不明顯,而按鍵按下時,電容放電一下,馬上又被充電,此時電容兩端的電壓不會突然變化,這個延時時間恰好可以達到消抖作用。這裡需要使用乙個韌體庫函式 b...

Linux3 4核心的基本配置和編譯

了解linux3.4核心的特性及新增功能,掌握linux核心的編譯過程及linux核心配置選項的內容。實驗環境 主機 ubuntu 10.10 64bit 目標機 fs s5pc100平台 nbsnbsp 交叉編譯工具鏈 arm eabi 4.4.0 android4.0.4自帶交叉工具鏈 實驗步驟...

Linux3 4核心的基本配置和編譯

自 華清遠見研發中心講師。了解linux3.4核心的特性及新增功能,掌握linux核心的編譯過程及linux核心配置選項的內容。實驗環境 主機 ubuntu 10.10 64bit 目標機 fs s5pc100平台 交叉編譯工具鏈 arm eabi 4.4.0 android4.0.4自帶交叉工具鏈...