出處: http://blog.sina.com.cn/s/blog_4b4b54da0102vocq.html
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