Android系统移植之按键驱动篇(3)

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

方法二相比方法一,多了一个步骤,但是推荐采用方法二,这样更容易理解,也不易混淆。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwwsgy.html