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   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
上面(我们在内核中声明了一个名为"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,文件系统,frameworks,linux内核)