[Android] hid設(shè)備按鍵流程簡述
hexdump /dev/hidraw0就能看到usbhid設(shè)備傳輸過來的裸流
如:按下Input鍵
003ae60 0000 0096 8000 006b 0000 0000 0000 0000
*
003aea0 0000 0086 8000 0000 0000 0000 0000 0000
*
前面的估計(jì)是碼流頭(003ae60)扫俺,還有按下(0096)多望,松開(0086)等信息,識(shí)別按鍵有效信息是(006b)
006b其實(shí)是索引值茂嗓,會(huì)在下表中尋找鍵值發(fā)送給Android凶异,如:6b對應(yīng)186
//drivers/hid/hid-input.c
static const unsigned char hid_keyboard[256] = {
0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,
unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,
29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
};
在Android層接收的消息我們可以通過getevent獲得
/dev/input/event2: 0004 0004 0007006b
/dev/input/event2: 0001 00ba 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0004 0004 0007006b
/dev/input/event2: 0001 00ba 00000000
/dev/input/event2: 0000 0000 00000000
可以看到006b這一項(xiàng)就是hid設(shè)備發(fā)送過來的碼值,ba就是186,在linux層獲取到的鍵值
Android通過event2獲得到鍵值后理张,接下來就是標(biāo)準(zhǔn)的Android按鍵映射流程了
首先就是查看/dev/input/event2這個(gè)設(shè)備文件對應(yīng)的設(shè)備信息及映射表
dumpsys input
2: Haier Smart TV RF Receiver
Classes: 0x80000023
Path: /dev/input/event2
Descriptor: 4c674c2e6733e157d6ab300ee6f2c3dc1245e649
Location: usb-rtk-3/input4
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0003, vendor=0x1a1d, product=0x00e0, version=0x0100
KeyLayoutFile: /system/usr/keylayout/Vendor_1a1d_Product_00e0.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false
設(shè)備信息是:vendor=0x1a1d, product=0x00e0
那么根據(jù)我們之前按鍵映射流程的分析,會(huì)先查找是否有Vendor_[vendor]Product[product].kl
這里得到/system/usr/keylayout/Vendor_1a1d_Product_00e0.kl绵患,源碼目錄在frameworks/base/data/keyboards/Vendor_1a1d_Product_00e0.kl
查看映射表文件雾叭,發(fā)現(xiàn)
key 186 TV_INPUT
即最后會(huì)向APK發(fā)送KEYCODE_TV_INPUT
最后需要注意的一點(diǎn)是,如果TV_INPUT在KeycodeLabel中沒定義落蝙,是解析Vendor_1a1d_Product_00e0.kl這個(gè)映射表文件的時(shí)候會(huì)出錯(cuò)织狐,從而導(dǎo)致event2用Generic.kl
因此KeycodeLabel中必須有TV_INPUT項(xiàng):
{ "TV_INPUT", 178 },