关闭

android键盘映射之三

748人阅读 评论(0) 收藏 举报
在系统启动后,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上层可以识别的按键。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:295134次
    • 积分:3160
    • 等级:
    • 排名:第11257名
    • 原创:13篇
    • 转载:147篇
    • 译文:0篇
    • 评论:8条
    最新评论