android 按键处理

移植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_SIZE(btn_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_F2,MFP_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_register(&gpio_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按键码一起发给应用程序来使用,这一点一定要注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值