Linux輸入子系統分析一

2021-07-08 19:29:35 字數 2821 閱讀 5669

輸入裝置分散不堪,用input子系統可以對分散的,不同類別的輸入裝置進行統一驅動。

好處:

1. 統一了物理形態各異的輸入裝置相似的裝置處理,例如各種滑鼠,鍵盤,觸控螢幕。

2. 提供了用於分發輸入報告給使用者應用程式的簡單事件介面。你的驅動不必建立管理/dev節點以及相關的訪問方法。因此他能夠很方便的呼叫輸入api以傳送滑鼠移動,鍵盤按鍵或者觸控事件給使用者空間。

3. 抽取出了輸入驅動的通用部分,簡化了驅動,並提供一致性。例如:輸入子系統提供了乙個底層驅動的集合,支援對串列埠和鍵盤控制器等硬體輸入的訪問。

* 從上層到底層開始分析:

從上層到底層開始分析:

裝置節點:

/dev/input、目錄下面顯示的是已經註冊在核心中的裝置程式設計介面。使用者通過open這些裝置檔案,來開啟不同的輸入裝置進行硬體操作。

handler事件處理層(純軟體層,不涉及硬體)

.描述:與使用者空間互動。為不同硬體型別提供了使用者訪問以及處理介面。例如:當我們開啟裝置/dev/input/mice時,會呼叫到事件處理層的mouse handler來處理輸入事件,這也使得驅動層無需關心裝置檔案的操作,因為mouse handler已經有了對應事件的處理方法。

主要功能:

包含不同的解決方案,例如鍵盤,滑鼠,觸控螢幕等。對於不同的解決方案,都有乙個input_handler的結構體。主要成員如下:

.id_table: 乙個存放該handler所支援的裝置id的表(其實內部存放的是ev_***事件,用於判斷device是否支援該事件)

.fops: 該handler的file_operation

.connect: 連線該handler和所支援的device的函式

.disconnect: 斷開該連線

.event: 事件處理函式,讓device呼叫

h_list: 乙個鍊錶,該鍊錶儲存著handler到所支援的所有device的中間站:即handler結構體的指標

描述:承上啟下。為驅動層提供輸入裝置的註冊和操作介面。由核心**drivers/input/input.c構成,他的存在遮蔽了使用者到驅動的互動細節,為裝置驅動層和事件處理層提供了相互通訊的介面。

主要功能:

描述:將底層硬體的輸入轉化為統一事件形式,向核心層匯報。純硬體操作,包含不同的硬體介面處理,如gpio等

主要功能:對於不同的具體硬體操作,都對應著乙個不同的input_device結構體

也包含乙個h_list鍊錶

對於handler和device,分別用鍊錶input_handler_list和input_device_list進行維護。

當handler或者device減少的時候,分別往這兩個鍊錶進行增加或刪除節點。

當外部應用程式需要呼叫子系統的open函式時,會先通過主裝置號進入到核心層,然後通過次裝置號進入handler層,再呼叫.fops內的open函式返回fd

當外部應用程式需要呼叫子系統的read函式時,會通過返回的fd呼叫.fops內的read函式,然後休眠,等待被.event函式喚醒

當外部中斷到達的時候,會先確定中斷事件,然後呼叫input_event上報事件,再通過h_list裡面的所有handle呼叫對應的handler中的.event函式,對read進行喚醒,然後在read中返回,也就是當device有多個對應的handler的時候,input_event會向所有的handler上報事件

當需要加入新的handler時,需要先構建handler結構體,然後呼叫註冊函式input_register_handler對該handler進行註冊

input_register_handler內部實現:往input_handler_list加入新增的handler結點,然後對input_device_list的所有結點,也就是對所有的device進行遍歷。通過.id_table檢視該device是否支援該handler。對於支援該handler的device就呼叫.connecet逐一構建input_handler結構體,連線handler和device

當需要加入新的device時,需要先構建input_dev結構體,然後呼叫註冊函式input_register_device對該input_dev進行註冊

input_register_device內部實現:往input_device_list加入新增的device結點,然後對input_handler_list的所有結點,也就是對所有的handler進行遍歷,通過handler的.id_table檢視該handler是否支援device。對於支援該device的handler就呼叫.connect逐一構建input_handler結構體,連線handler和device

在驅動載入模組中,設定你的input裝置支援的事件型別。

註冊中斷處理函式。例如:鍵盤裝置需要編寫鍵盤的抬起,放下。觸控螢幕裝置需要編寫按下,抬起,絕對移動。滑鼠裝置需要編寫單擊,抬起,相對移動,並且需要在必要的時候提交硬體資料。比如:鍵值,座標,狀態等。

將輸入裝置註冊到輸入子系統中。

input_dev

struct input_dev

input_handler:事件處理器的資料結構,代表乙個事件處理器

input_handle:代表乙個配對成功的input_dev和input_handler

struct input_handle

;

struct evdev

;

struct evdev_client

;

Linux 輸入子系統分析(二)

linux 輸入子系統分析 一 linux 輸入子系統分析 二 分析乙個核心提供的input handler input dev驅動程式的工作主要是 申請一些硬體資源,如註冊中斷等,申請input dev並設定,然後呼叫核心層提供的input register device函式進行註冊。裝置有資料時...

input輸入子系統分析

1.檢視input子系統支援哪些裝置 cat proc bus input devices 2.應用程式如何使用 fd mouse open dev input event0 o rdwr event1表示滑鼠事件,input下的裝置檔案主裝置號都為13,如下圖所示 根據開啟裝置的主裝置號為13,知...

input輸入子系統分析1

input register handler struct input handler handler 1 在開始的時候讓input handler的h list指向自己,也就是乙個空的迴圈鍊錶,在後來註冊input handle的時候 讓input handle的hnode與匹配的input ha...