Android中对标准内核的按键映射以及按键驱动
Linux内核的平台代码的按键定义如下:
/* GPIO_KEY for Tablet */static struct gpio_keys_button tablet_gpio_keys_buttons[] = {[0] = {.code= KEY_VOLUMEUP,.gpio= 177,.desc= "volume up",.active_low= 1,},[1] = {.code= KEY_VOLUMEDOWN,.gpio= 178,.desc= "volume down",.active_low= 1,},};static struct gpio_keys_platform_data tablet_gpio_keys = {.buttons= tablet_gpio_keys_buttons,.nbuttons= ARRAY_SIZE(tablet_gpio_keys_buttons),.rep= 0,};static struct platform_device tablet_gpio_keys_device = {.name= "gpio-keypad",.id= -1,.dev= {.platform_data= &tablet_gpio_keys,},};上面是将GPIO177/178按键中断映射到Linux键盘KEY_VOLUMEUP/KEY_VOLUMEDOWN中断, 注意到这里是标注的内核映射(不是Android实际的映射)
Android并没有直接使用上面映射后的键值,而且对其再进行了一次映射,从内核标准键值到android所用键值的映射表定义在android文件系统的/system/usr/keylayout目录下。标准的映射文件为qwerty.kl
key 399 GRAVEkey 2 1key 3 2key 4 3key 5 4key 6 5key 7 6key 8 7key 9 8key 10 9key 11 0key 158 BACK WAKE_DROPPEDkey 230 SOFT_RIGHT WAKEkey 60 SOFT_RIGHT WAKEkey 107 ENDCALL WAKE_DROPPEDkey 62 ENDCALL WAKE_DROPPEDkey 229 MENU WAKE_DROPPEDkey 139 MENU WAKE_DROPPEDkey 59 MENU WAKE_DROPPEDkey 127 SEARCH WAKE_DROPPEDkey 217 SEARCH WAKE_DROPPEDkey 228 POUNDkey 227 STARkey 231 CALL WAKE_DROPPEDkey 61 CALL WAKE_DROPPEDkey 232 DPAD_CENTER WAKE_DROPPEDkey 108 DPAD_DOWN WAKE_DROPPEDkey 103 DPAD_UP WAKE_DROPPEDkey 102 HOME WAKEkey 105 DPAD_LEFT WAKE_DROPPEDkey 106 DPAD_RIGHT WAKE_DROPPEDkey 115 VOLUME_UPkey 114 VOLUME_DOWNkey 116 POWER WAKEkey 212 CAMERAkey 16 Qkey 17 Wkey 18 Ekey 19 Rkey 20 Tkey 21 Ykey 22 Ukey 23 Ikey 24 Okey 25 Pkey 26 LEFT_BRACKETkey 27 RIGHT_BRACKETkey 43 BACKSLASHkey 30 Akey 31 Skey 32 Dkey 33 Fkey 34 Gkey 35 Hkey 36 Jkey 37 Kkey 38 Lkey 39 SEMICOLONkey 40 APOSTROPHEkey 14 DEL key 44 Zkey 45 Xkey 46 Ckey 47 Vkey 48 Bkey 49 Nkey 50 Mkey 51 COMMAkey 52 PERIODkey 53 SLASHkey 28 ENTER key 56 ALT_LEFTkey 100 ALT_RIGHTkey 42 SHIFT_LEFTkey 54 SHIFT_RIGHTkey 15 TABkey 57 SPACEkey 150 EXPLORERkey 155 ENVELOPE key 12 MINUSkey 13 EQUALSkey 215 AT上面(我们在内核中声明了一个名为"gpio-keypad"的按键设备,此设备定义在内核drivers/input/keyboard/gpio_keypad.c文件中
然后我们可以自己定义一个名为gpio-keys.kl的android按键映射文件,此文件的定义可以参考querty.kl的内容,比如说我们想将GPIO177
对应的按键作Android中的MENU键用,首先我们在内核中将GPIO177映射到KEY_VOLUMEUP,在内核include/linux/input.h中查找KEY_VOLUMEUP发现
#define KEY_VOLUMEUP 115
参照KEY_VOLUMEUP的值我们在gpio-keys.kl中加入如下映射即可
key 115 MENU WAKE
其它按键也照此添加,完成后将按键表放置到/system/usr/keylayout目录下即可。
补充:
1.Android对底层按键的处理方法
android按键的处理是Window Manager负责,主要的映射转换实现在android源代码frameworks/base/libs/ui/EventHub.cpp
此文件处理来自底层的所有输入事件,并根据来源对事件进行分类处理,对于按键事件,处理过程如下:
(a)记录驱动名称为
(b)获取环境变量ANDROID_ROOT为系统路径(默认是/system,定义在android源代码/system/core/rootdir/init.rc文件中)
(c)查找路径为"系统路径/usr/keylayout/驱动名称.kl"的按键映射文件,如果不存在则默认用路径为"系统路径/usr/keylayout/qwerty.kl"
这个默认的按键映射文件,映射完成后再把经映射得到的android按键码值发给上层应用程序。
所以我们可以在内核中定义多个按键设备,然后为每个设备设定不同的按键映射文件,不定义则会默认用qwerty.kl
(d)android按键设备的映射关系可以在logcat开机日志中找的到(查找EventHub即可)
(e)android按键设备由Window Manager负责,Window Manager从按键驱动读取内核按键码,然后将内核按键码转换成android按键码,转换完成
后Window Manager会将内核按键码和android按键码一起发给应用程序来使用,这一点一定要注意。
更多相关文章
- android 遍历assets下的文件
- Android(安卓)数据存储与IO (二)
- ubuntu 删除android studio
- android获取手机内部存储空间和外部存储空间
- Android内存泄露利器(hprof篇)
- 将新的驱动源文件添加进android内核进行编译
- android 加载布局xml文件时报空指针
- A31S-camera流程
- Android(安卓)开发技术汇总