Android键盘映射之三

来源:互联网 发布:布料软件 编辑:程序博客网 时间:2024/04/30 10:17
在系统启动后,android 会通过 

    static const char *device_path = "/dev/input";

    bool EventHub::penPlatformInput(void)

    res = scan_dir(device_path); 

通过下面的函数打开设备。 
int EventHub::pen_device(const char *deviceName) 

     ... 
     fd = open(deviceName, O_RDWR); 
     ...  
     mFDs[mFDCount].fd = fd; 
     mFDs[mFDCount].events = POLLIN; 
     ... 
     ioctl(mFDs[mFDCount].fd, EVIOCGNAME(sizeof(devname)-1), devname); 
     ... 
    const char* root = getenv("ANDROID_ROOT"); 
     snprintf(keylayoutFilename, sizeof(keylayoutFilename), 
                 "%s/usr/keylayout/%s.kl", root, tmpfn); 
     ... 
     device->layoutMap->load(keylayoutFilename); 
     ... 
}

打开设备的时候,如果 device->classes&CLASS_KEYBOARD 不等于 0 表明是键盘。 

常用输入设备的定义有: 

enum { 
         CLASS_KEYBOARD    = 0x00000001, //键盘

         CLASS_ALPHAKEY    = 0x00000002, //

         CLASS_TOUCHSCREEN = 0x00000004, //触摸屏

         CLASS_TRACKBALL     = 0x00000008 //轨迹球 
}; 

打开键盘设备的时候通过上面的 ioctl 获得设备名称,命令字 EVIOCGNAME 的定义在文件: 

kernel/include/linux/input.h 中。 

#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ 

在内核键盘驱动文件 drivers/input/keyboard/pxa27x_keypad.c 中定义了设备名称:pxa27x-keypad 

static struct platform_driver pxa27x_keypad_driver = { 

.probe        = pxa27x_keypad_probe, 

.remove        = __devexit_p(pxa27x_keypad_remove), 

.suspend = pxa27x_keypad_suspend, 

.resume        = pxa27x_keypad_resume, 

.driver        = { 

       .name = "pxa27x-keypad", 

       .owner = THIS_MODULE, 

}, 

}; 

ANDROID_ROOT 为环境变量,在android的命令模式下通过 printenv 可以知道它为: system 

所以 keylayoutFilename 为:/system/usr/keylayout/pxa27x-keypad.kl 

pxa27x-keypad.kl 定义了按键映射,具体内容如下:

# NUMERIC KEYS 3x4 
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 83 POUND 
key 55 STAR 

# FUNCTIONAL KEYS 
key 231 MENU         WAKE_DROPPED 
key 192 BACK            WAKE_DROPPED 
key 193 HOME        WAKE 
key 107 DEL         WAKE 
key 102 CALL         WAKE_DROPPED 
key 158 ENDCALL      WAKE_DROPPED 
key 28    DPAD_CENTER      WAKE 
key 115 VOLUME_UP 
key 114 VOLUME_DOWN 

如果没有定义键盘映射文件,那么默认使用系统的 /system/usr/keylayout/qwerty.kl 可以修改 /system/usr/keylayout/qwerty.kl 文件改变Android公司的按键映射。 

device->layoutMap->load(keylayoutFilename) 调用的是文件 KeyLayoutMap.cpp (frameworks\base\libs\ui)中的函数:

    status_t KeyLayoutMap::load(const char* filename)通过解析 pxa27x-keypad.kl 
把按键的映射关系保存在 :KeyedVector<int32_t,Key> m_keys; 中。 

当获得按键事件以后调用: 
status_t KeyLayoutMap::map(int32_t scancode, int32_t *keycode, uint32_t *flags) 

由映射关系 KeyedVector<int32_t,Key> m_keys 把扫描码转换成andorid上层可以识别的按键。

原创粉丝点击