Linux裝置驅動子系統第三彈 - Input__Linux

來源:互聯網
上載者:User

1. 總論

2. 導航

3. 執行個體

 3.1 鍵盤

 3.2 觸控螢幕

1. 總論

  Input子系統為一些常用的小規模資料轉送的裝置提供統一的資料上報系統,把資料以統一的格式上傳到使用者空間。適用於Input子系統的裝置有搖杆、滑鼠、鍵盤、觸控螢幕,Misc等。

 

 

2. 導航

   Input子系統配置步驟如下, 申請和初始化input裝置 設定input與裝置相關的bit位 註冊input裝置 上報資料

2.1 申請和初始化input裝置 input_allocate_device();

  裝置的資料結構裡存放一個struct input_dev類型的結構,用於存放input裝置。該結構定義於/include/linux/input.c,

2.2 設定input與裝置相關的bit位

linux為input的裝置提供以上不同類型的事件,每一類事件比如keybit[],其中的每一位代表一個事件,比如按鍵的上、下、左、右等。

驅動程式裡只要對裝置相關的事件設定對應的bit位即可。

2.3 註冊input裝置   input_register_device(input_dev);

2.4 上報資料 input_report_xxx(input_dev, code, value)

 

   驅動程式將裝置資料value通過input_report_xxx()的方式上報給input核心層,核心層完成將資料從核心空間上傳到使用者空間。

   xxx表示事件的類型,比如鍵盤事件就是input_report_key(), code代表按鍵的類型(由input系統定義),value代表該按鍵的狀態(通過驅動得到資料);觸控螢幕事件就是input_report_abs(),code代表觸摸的類型(由input系統定義),比如壓力,或者x軸,y軸,value代表壓力值或座標值(通過驅動得到資料)。

 

下面進入input核心層,看看資料具體是如何上報的,以input_report_key()為例,

最終調用了回呼函數handle->handler->event(); 注意到handle這個資料結構,它是struct input_dev裡的一個成員,而struct input_dev在裝置驅動初始化的時候被唯一地申請並註冊,這裡的handle就是用來指代這個input裝置,即鍵盤,這樣,回呼函數handle->handler->event()就可以通過這個handle找到指定的鍵盤裝置。

struct evdev *evdev裡存放的就是通過handle從底層得到的裝置驅動的資料結構

struct evdev_client *client為終端使用者空間可以訪問的資料結構,其中存放了事件類型type,資料類型code和資料數值value。

下圖為一個上層應用的例子,

 

 

3. 執行個體

 3.1 鍵盤

 

1)橙色部分為系統初始化後得到的platform_device結構的資料,包括,鍵盤控制器的物理地址,中斷號,以及鍵盤矩陣對應的索引值等。

2)藍色部分就是通過input子系統註冊的鍵盤裝置驅動,分別完成了上文提到的1,2,3步,即申請input,設定input相關bit,註冊input。

注意到粉紅色的代碼所實現的,就把把鍵盤矩陣對應的索引值(按鍵類型code)申報到input子系統中相對應的bit位中,具體地,

如圖所示,確認鍵的矩陣座標(0,0),左鍵對應的矩陣座標(2,0),

首先,系統初始化時對這些矩陣座標配置索引值(按鍵類型code),(0,0)配置為confirm,(2,0)配置為left,然後把索引值存放到platform_device裡,接著,驅動程式提取索引值,並將其賦給input系統中相對應的位,這些位定義於/include/linux/input.h。

3)綠色部分就是上文提到的第4步-上報資料。

當有鍵按下或者彈起,驅動程式引發中斷函數,即鍵盤掃描函數。

通過鍵盤控制器的寄存器得到按下或彈起鍵的矩陣座標(row, col),再由座標得到相對應的索引值(按鍵類型code),最後由input_report_key(input, code, value)完成資料的上報。注意上報完資料後要用input_sync()同步。

 

 3.2 觸控螢幕

1)橙色部分為系統初始化後得到的platform_device結構的資料,主要為晶片上的引腳申請GPIO口,電路圖如下圖所示,

2)藍色部分就是通過input子系統註冊的觸控螢幕裝置驅動,即申請input,設定input相關bit,註冊input裝置。這裡主要設定了觸控螢幕的壓力pressure以及座標軸X,Y事件。

3)上報資料。

觸摸筆按下產生中斷,觸發中斷處理函數,喚醒一個讀取和解析觸控螢幕座標資料的線程(之所以使用線程,是因為讀取和解析資料的開銷比較大),最終通過input子系統上報座標值。同樣,用input_sync()同步。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.