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è)備傳遞上來的信息。