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按键码一起发给应用程序来使用,这一点一定要注意。

更多相关文章

  1. android 遍历assets下的文件
  2. Android(安卓)数据存储与IO (二)
  3. ubuntu 删除android studio
  4. android获取手机内部存储空间和外部存储空间
  5. Android内存泄露利器(hprof篇)
  6. 将新的驱动源文件添加进android内核进行编译
  7. android 加载布局xml文件时报空指针
  8. A31S-camera流程
  9. Android(安卓)开发技术汇总

随机推荐

  1. Android(安卓)openGL hook
  2. Android上多个应用不能同时调用AudioReco
  3. android-google开源资源
  4. Android(安卓)沉浸式状态栏 开源 很好用
  5. android自定义对话框工具类
  6. 自定义dialog的style属性说明
  7. android listview无限循环显示数据
  8. android之相机 VideoSource和AudioSource
  9. Android(安卓)TextView 一些字体颜色、大
  10. android 开机自动启动