輸入子系統(1) 資料結構總結

2021-07-24 19:57:42 字數 2280 閱讀 2377

1:概述

輸入子系統在linux核心中使用廣泛,按鍵,滑鼠,sensor類,touch等驅動都會用到輸入子系統。輸入子系統的結構分為以下三層:

1.1:裝置驅動層

這一層需要使用者在裝置驅動中去實現,呼叫核心層的函式介面,完成輸入裝置的註冊和並將發生的事件上報給子系統核心層;

1.2:輸入子系統核心層

為驅動層和事件處理層提供函式介面,並且註冊input字元裝置,主裝置號是13,次裝置號為0~255,接受來自驅動層的上報事件,並最終通過事件處理層的介面,上報給使用者,為裝置驅動層和事件處理層架起一座橋梁;

1.3:事件處理層

實現了和使用者層的介面,所有使用者的操作都是通過事件處理層提供的介面進行;

2:輸入子系統中重要的資料結構

2.1:input類資料結構:input_handle  input_handler  input_dev

input_dev:代表乙個輸入裝置,需要使用者去填充並註冊進核心,乙個input_dev只能代表乙個輸入裝置;

struct input_dev ;
input_handler:代表某一類輸入裝置對應的事件處理邏輯,也就是乙個input_handler可以對於那個很多個輸入裝置和輸入裝置節點;

struct input_handler ;
input_handle:使input_dev和input_handler建立起對應關係;

struct input_handle ;
2.2:evdev類資料結構:evdev  evdev_clientevdev:代表乙個具體的事件裝置event,和input_dev對應,當註冊input_dev時,如果匹配成功,核心會建立乙個與之對應的evdev結構,乙個evdev就是乙個字元節點,比如:/dev/input/event0;evdev_client:當open乙個event節點的時候,會建立evdev_client結構體,用於儲存裝置驅動上報的事件;2.3:table類資料結構:evdev_table input_tableevdev_table:存放evdev的陣列,table大小為32,也就是說最大有32個event節點;input_table:存放input_handler結構的陣列,大小為8,核心總共支援256個輸入字元裝置,主裝置號為13,次裝置為0~255,核心按照輸入字元裝置次裝置號的不同,將這些裝置號對應到8個input_handler,即乙個input_handler對應32個輸入字元裝置節點,比如:evdev_handler對應的字元裝置次裝置號是從64開始的,比如有乙個輸入字元裝置節點的次裝置號是64,所以input_table[64>>5]中的input_handler就是此輸入裝置對應的input_handler;

3:上述資料結構直接的關係

3.1:輸入子系統會維護evdev_table和input_table兩個表,用來存放event和input_handler;

3.2:input_dev和input_handler會互相匹配,匹配成功後呼叫input_handler中的connect進行連線,連線的時候建立evdev結構並建立檔案節點;

3.3:當使用者空間open乙個輸入裝置節點(/dev/input/event0)的時候,會依據裝置節點的次裝置號找到對應的input_handler,呼叫input_handler中的檔案操作open函式,並建立evdev_client結構;

輸入子系統層次結構

輸入子系統事件處理層 eventhandler 輸入子系統核心層 inputcore 輸入子系統裝置驅動層。裝置節點,dev input 目錄下顯示的是已經註冊在核心中的裝置程式設計介面,使用者通過 open 這些裝置檔案來開啟不同的輸入裝置進行硬體操作。事件處理層為不同硬體型別提供了使用者訪問及處...

輸入子系統(1) 框架認識

入口函式 drivers input input.c input init err register chrdev input major,input input fops static const struct file operations input fops owner this modul...

資料結構(棧子系統 c實現)

include include define n sizeof stacknode 結點所佔位元組數 n 定義結構體 typedef int datatype typedef struct stacknode stacknode 定義棧頂 typedef struct linkstack 進棧,元素...