Linux kernel中input子系统会负责从硬件获取按键值根据按键的用户码来分类处理(当时IR的时候),linuxkernel已经定义好了一些按键枚举,input中需要将这些枚举和按键的键值对应。
Kernel/include/linux/input.h 可以看到按键的枚举定义
hexdump/dev/input/event0 可以看到按键数据
Android与 Linux分隔线
Android也定义了一套码,叫作键盘码,通过一个/system/usr/keylayout/来将两套码对应起来
例如:rkxx-remotectl.kl
定义了linux 键值和android键码的对应关系,如下:
key 28 ENTER
key 116 POWER WAKE
key 158 BACK
key 139 MENU
key 217 SEARCH
key 232 DPAD_CENTER
key 108 DPAD_DOWN
key 103 DPAD_UP
key 102 HOME
key 105 DPAD_LEFT
key 106 DPAD_RIGHT
key 115 VOLUME_UP
key 114 VOLUME_DOWN
key 143 NOTIFICATION WAKE
key 113 VOLUME_MUTE
数值就是linux上报的按键值,后面的按键名称是android定义的。
在framework/native/include/input/KeycodeLabels.h中可以查到
KeycodeLabels.h是android的keycode和keyname的对应表
在keyevents.java中有每个按键常量的定义,按键常量的值和KeycodeLabels.h中的keycode是对应的。
例如:KEYCODE_POWER值是 26,在KeycodeLabels.h中26对应的keyname是”POWER”,在rkxx-remotectl.kl中POWER对应的是linux的keyvalue 116,在Kernel/include/linux/input.h中116对应的是KEY_POWER这个枚举。
Keyevent.java KeycodeLabels.h rkxx-remotectl.kl Kernel/include/linux/input.h
KEYCODE_POWER 26 POWER 116 =KEY_POWER