android键盘映射之三

来源:互联网 发布:拼多多和淘宝衣服一样 编辑:程序博客网 时间:2024/05/16 09:11
在系统启动后,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上层可以识别的按键。


原创粉丝点击