【Android源码 栏目提醒】:网学会员在Android源码 频道为大家收集整理了“Android系统移植(二)-按键移植 - 电子设计“提供大家参考,希望对大家有所帮助!
Android系统移植二-按键移植 . 分类
Android系统开发 2010-11-10 16:35 7303人阅读 评论8 收藏 举报 这一部分主要是移植
android的键盘和按键 1
Android使用标准的linux输入事件设备/dev/input目录下和驱动按键定义在内核include/linux/input.h文件中 按键定义形式如下 define KEY_ESC 1 define KEY_1 2 define KEY_2 3 2内核中我的平台是arch/arm/mach-mmp/merlin.c文件中按键的定义如下形式 static struct gpio_keys_button btn_button_table 0 .code KEY_F1 .gpio MFP_PIN_GPIO2 .active_low 1 / 0 for down 0 up 1 1 for down 1 up 0 / .desc H_BTN button .type EV_KEY / .wakeup / .debounce_interval 10 / 10 msec jitter elimination / 1 .code KEY_F2 .gpio MFP_PIN_GPIO3 .active_low 1 / 0 for down 0 up 1 1 for down 1 up 0 / .desc O_BTN button .type EV_KEY / .wakeup / .debounce_interval 10 / 10 msec jitter elimination / 2 .code KEY_F4 .gpio MFP_PIN_GPIO1 .active_low 1 / 0 for down 0 up 1 1 for down 1 up 0 / .desc S_BTN button .type EV_KEY / .wakeup / .debounce_interval 10 / 10 msec jitter elimination / static struct gpio_keys_platform_data gpio_keys_data .buttons btn_button_table .nbuttons ARRAY_SIZEbtn_button_table static struct platform_device gpio_keys .name gpio-keys .dev .platform_data gpio_keys_data .id -1 上面定义是将MFP_PIN_GPIO2这个GPIO口的按键映射到Linux的KEY_F1按键MPF_PIN_GPIO3映射到KEY_F2MFP_PIN_GPIO1映射到KEY_F4 3上面2步实现了从硬件GPIO口到内核标准按键的映射但是
android并没有直接使用映射后的键值而且对其再进行了一次映射从内核标准键值 到
android所用键值的映射表定义在
android文件系统的/system/usr/keylayout目录下。
标准的映射文件为qwerty.kl定义如下 key 399 GRAVE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0 key 158 BACK WAKE_DROPPED key 230 SOFT_RIGHT WAKE key 60 SOFT_RIGHT WAKE key 107 ENDCALL WAKE_DROPPED key 62 ENDCALL WAKE_DROPPED key 229 MENU WAKE_DROPPED key 139 MENU WAKE_DROPPED key 59 MENU WAKE_DROPPED key 127 SEARCH WAKE_DROPPED key 217 SEARCH WAKE_DROPPED key 228 POUND key 227 STAR key 231 CALL WAKE_DROPPED key 61 CALL WAKE_DROPPED key 232 DPAD_CENTER WAKE_DROPPED key 108 DPAD_DOWN WAKE_DROPPED key 103 DPAD_UP WAKE_DROPPED key 102 HOME WAKE key 105 DPAD_LEFT WAKE_DROPPED key 106 DPAD_RIGHT WAKE_DROPPED key 115 VOLUME_UP key 114 VOLUME_DOWN key 116 POWER WAKE key 212 CAMERA key 16 Q key 17 W key 18 E key 19 R key 20 T key 21 Y key 22 U key 23 I key 24 O key 25 P key 26 LEFT_BRACKET key 27 RIGHT_BRACKET key 43 BACKSLASH key 30 A key 31 S key 32 D key 33 F key 34 G key 35 H key 36 J key 37 K key 38 L key 39 SEMICOLON key 40 APOSTROPHE key 14 DEL key 44 Z key 45 X key 46 C key 47 V key 48 B key 49 N key 50 M key 51 COMMA key 52 PERIOD key 53 SLASH key 28 ENTER key 56 ALT_LEFT key 100 ALT_RIGHT key 42 SHIFT_LEFT key 54 SHIFT_RIGHT key 15 TAB key 57 SPACE key 150 EXPLORER key 155 ENVELOPE key 12 MINUS key 13 EQUALS key 215 AT 4
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 5举例 上面2步我们在内核中声明了一个名为gpio-keys的按键设备此设备定义在内核drivers/input/keyboard/gpio_keys.c文件中 然后我们在内核启动过程中注册此设备 platform_device_registergpio_keys 然后我们可以自己定义一个名为gpio-keys.kl的
android按键映射文件此文件的定义可以参考querty.kl的内容比如说我们想将MPF_PIN_GPIO3 对应的按键作
android中的MENU键用首先我们在内核中将MPF_PIN_GPIO3映射到KEY_F2在内核include/linux/input.h中查找KEY_F2发现 define KEY_F2 60 参照KEY_F2的值我们在gpio-keys.kl中加入如下映射即可 key 60 MENU WAKE 其它按键也照此添加完成后将按键表放置到/system/usr/keylayout目录下即可。
补充 1
android按键设备的映射关系可以在logcat开机日志中找的到查找EventHub即可 2
android按键设备由Window Manager负责Window Manager从按键驱动读取内核按键码然后将内核按键码转换成
android按键码转换完成 后Window Manager会将内核按键码和
android按键码一起发给应用程序来使用这一点一定要注意。