正文

8.2.1 input驅(qū)動程序

Android系統(tǒng)級深入開發(fā):移植與調(diào)試 作者:韓超


Input驅(qū)動程序是Linux輸入設(shè)備的驅(qū)動程序,分成游戲桿(joystick)、鼠標(biāo)(mouse和mice)和事件設(shè)備(Event queue)3種驅(qū)動程序。其中事件驅(qū)動程序是目前通用的驅(qū)動程序,可支持鍵盤、鼠標(biāo)、觸摸屏等多種輸入設(shè)備。

Input驅(qū)動程序的主設(shè)備號是13,3種驅(qū)動程序的設(shè)備號分配如下所示。

  joystick游戲桿:0~31

  mouse鼠標(biāo):32~62

  mice鼠標(biāo):63

 事件(Event)設(shè)備:64~95

實際上,每一種Input設(shè)備占用5位,因此每種設(shè)備包含的個數(shù)是32個。

Event設(shè)備在用戶空間大多使用read、ioctl、poll等文件系統(tǒng)的接口進(jìn)行操作,read用于讀取輸入信息,ioctl用于獲得和設(shè)置信息,poll調(diào)用可以進(jìn)行用戶空間的阻塞,當(dāng)內(nèi)核有按鍵等中斷時,通過在中斷中喚醒poll的內(nèi)核實現(xiàn),這樣在用戶空間的poll調(diào)用也可以返回。

Event設(shè)備在文件系統(tǒng)中的設(shè)備節(jié)點為:/dev/input/eventX。

主設(shè)備號為13,次設(shè)備號遞增生成,為64~95,各個具體的設(shè)備在misc、touchscreen,keyboard等目錄中。

Event輸入驅(qū)動的架構(gòu)如圖8-3所示。

輸入設(shè)備驅(qū)動程序的頭文件:include/linux/input.h。

輸入設(shè)備驅(qū)動程序的核心和Event部分代碼分別是:drivers/input/input.c和drivers/input/ evdev.c。

 

input.h中定義了struct input_dev結(jié)構(gòu),它表示Input驅(qū)動程序的各種信息,對于Event設(shè)備分為同步設(shè)備、鍵盤、相對設(shè)備(鼠標(biāo))、絕對設(shè)備(觸摸屏)等。

input_dev中定義并歸納了各種設(shè)備的信息,例如按鍵、相對設(shè)備、絕對設(shè)備、雜項設(shè)備、LED、聲音設(shè)備,強(qiáng)制反饋設(shè)備、開關(guān)設(shè)備等。

在具體的Event驅(qū)動程序的實現(xiàn)中,如果得到按鍵的事件,通常需要通過以下的接口向上進(jìn)行通知,這些內(nèi)容也在input.h中定義如下所示:

事實上,對不同設(shè)備內(nèi)容的報告均是通過input_event()函數(shù)來完成的,選擇使用了不同參數(shù)而已。

在手機(jī)系統(tǒng)中經(jīng)常使用的鍵盤(keyboard)和小鍵盤(kaypad)屬于按鍵設(shè)備EV_KEY,軌跡球?qū)儆谙鄬υO(shè)備EV_REL,觸摸屏屬于絕對設(shè)備EV_ABS。

關(guān)于按鍵數(shù)值的定義的片斷如下所示:

可以使用getevent對Event設(shè)備進(jìn)行調(diào)試,在Android的模擬器環(huán)境中,使用getevent的情況如下所示:

點擊數(shù)字按鍵1,出現(xiàn)了上面的信息,0002是按鍵的掃描碼,00000001和00000000分別是按下和抬起的附加信息。最前面的0001實際上是輸入設(shè)備的類型。

使用getevent可以最直接地獲得按鍵的掃描碼,對于Android系統(tǒng)中用戶輸入設(shè)備的調(diào)試,可以從源頭確定底層輸入設(shè)備傳遞上來的信息。

 


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號