Linux Input子系統 概述

2021-06-22 23:30:43 字數 1502 閱讀 5186

輸入裝置總類繁雜,包括按鍵,鍵盤,觸控螢幕,滑鼠,搖桿等等,它們本身都是字元裝置,不過核心為了能將這些裝置的共性抽象出來,簡化驅動的開發,建立了乙個input子系統。input子系統分為三層,從下至上分別是輸入裝置驅動層,輸入核心層以及輸入事件驅動層。這三層中的輸入核心層和輸入事件驅動層都是核心已經完成了的,因此需要我們完成的只有輸入裝置驅動層。考慮輸入裝置主要的工作過程都是 動作產生(按鍵,觸屏……)-->產生中斷-->讀取數值(鍵值,座標……)-->將數值傳遞給應用程式。最後乙個步驟就屬於事件的處理,對於同一類裝置,他們的處理方式都是相同的,因此核心已在事件驅動層為我們做好了,不需我們操心,而產生中斷-->讀取數值是因裝置而異的,需要我們根據具體的裝置來編寫驅動。乙個大致的工作流程就是,input device向上層報告-->input core接收報告,並根據在註冊input device時建立好的連線選擇哪一類handler來處理事件-->通過handler將資料存放在相應的dev(evdev,mousedev…)例項的緩衝區中,等待應用程式來讀取。當然,有時候也需要從應用層向裝置層逆向傳遞,比如控制一些和裝置相關的led,蜂鳴器等。裝置驅動層,輸入核心層和事件處理層之間的關係可以用下圖來闡釋:

下面來看看input子系統的關鍵資料結構

[cpp]view plain

copy

struct input_dev ;  

[cpp]view plain

copy

struct input_handler ;  

[cpp]view plain

copy

struct input_handle ;  

我們可以看到,input_device和input_handler中都有乙個h_list,而input_handle擁有指向input_dev和input_handler的指標,也就是說input_handle是用來關聯input_dev和input_handler的,那麼為什麼乙個input_device和input_handler

中擁有的是h_list而不是乙個handle呢?因為乙個device可能對應多個handler,而乙個handler也不能只處理乙個device,比如說乙個滑鼠,它可以對應even handler,也可以對應mouse handler,因此當其註冊時與系統中的handler進行匹配,就有可能產生兩個例項,乙個是evdev,另乙個是mousedev,而任何乙個例項中都只有乙個handle。至於以何種方式來傳遞事件,就由使用者程式開啟哪個例項來決定。後面乙個情況很容易理解,乙個事件驅動不能只為乙個甚至一種裝置服務,系統中可能有多種裝置都能使用這類handler,比如event handler就可以匹配所有的裝置。在input子系統中,有8種事件驅動,每種事件驅動最多可以對應32個裝置,因此dev例項總數最多可以達到256個。下一節將以even handler為例介紹裝置註冊以及開啟的過程。

Linux INPUT子系統實驗

按鍵 滑鼠 鍵盤 觸控螢幕都屬於輸入裝置,針對這些裝置linux核心提供了乙個叫做input的子系統框架來處理輸入時間,本質上還是字元裝置,只是在此基礎上加上了input框架,使用者只需要負責上報輸入事件,input核心層負責處理這些事件。input子系統分為input驅動層 input核心層 in...

linux input 子系統例項分析

一,前言 1,近日要寫乙個很特殊的鍵盤驅動,故對linux的input子系統分析了一番,寫下分析筆記,以防不日即忘。2,使用input子系統的一般流程為 input allocate device 申請乙個input dev裝置 初始化該input dev input register device...

linux input子系統驅動(一)

linux input子系統分析 概述與資料結構 input子系統處理輸入事務,任何輸入裝置的驅動程式都可以通過input輸入子系統提供的介面註冊到核心,利用子系統提供的功能來與使用者空間互動。輸入裝置一般包括鍵盤,滑鼠,觸控螢幕等,在核心中都是以輸入裝置出現的。下面分析input輸入子系統的結構,...