Android按键的处理是Window Manager负责,主要的映射转换实现在android源代码frameworks/base/libs/ui/EventHub.cpp此文件处理来自底层的所有输入事件,并根据来源对事件进行分类处理,对于按键事件,它首先记录驱动名称,再获取环境变量ANDROID_ROOT为系统路径,默认是/system,定义在android源代码/system/core/rootdir/init.rc文件中。然后查找路径为"系统路径/usr/keylayout/驱动名称.kl"的按键映射文件,如果不存在则默认用路径为"系统路径/usr/keylayout/qwerty.kl"。这个默认的按键映射文件,映射完成后再把经映射得到的android按键码值发给上层应用程序。所以我们可以在内核中定义多个按键设备,然后为每个设备设定不同的按键映射文件,不定义则会默认用qwerty.kl。
有了上面的分析,我们不难发现,上述更改是不可能有效果的,只能越改越不能用。相反,如果仅仅只需要更改某个按键的功能,根本就不用改内核,只需重新定义android系统的gpio-keys.kl即可。
进android系统后找到该文件,
可以发现,在在gpio-keys.kl和qwerty.kl两个文件,因此a ndroid系统会从gpio-keys.kl中查找键值进行映射。里面内容如下:
key 102 HOME WAKE
key 158 BACK WAKE
这不正是开发板上android的两个功能键吗?对于第三个POWER键,是用于开关机的,不属android功能键范畴,因此无须映射。
修改按键功能有两种方法:
方法一:直接修改gpio-keys.kl文件的内容,比如我们想将BACK键改成右键,我们只需做如下修改:
key 102 HOME WAKE
key 106 DPAD_RIGHT WAKE
注意上面的106以及按键名称,都是从qwerty.kl里面找的,千万不要在linux内核的input.h中查找。DPAD_RIGHT不能更改为RIGHT,否则android无法识别。
方法二:修改内核中mx53_loco.c中的数组如下:
static struct gpio_keys_button loco_buttons[] = {
GPIO_BUTTON(MX53_nONKEY,KEY_POWER, 1, "power", 0),
//GPIO_BUTTON(USER_UI1,KEY_BACK, 1, "back", 0),
GPIO_BUTTON(USER_UI2,KEY_HOME, 1, "home", 0),
GPIO_BUTTON(USER_UI1,KEY_RIGHT, 1, "right", 0),//test by lqm.
};
再修改上面的gpio-keys.kl文件,内容如下:
key 102 HOME WAKE
key 106 DPAD_RIGHT WAKE
方法二相比方法一,多了一个步骤,但是推荐采用方法二,这样更容易理解,也不易混淆。