android键盘映射之三

转载 2012年03月31日 09:58:49
在系统启动后,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上层可以识别的按键。


相关文章推荐

Android 模拟器和PC物理键盘映射

  • 2010年12月21日 20:00
  • 5KB
  • 下载

Android之硬键盘字符映射------KeyCharacterMap

Android之硬键盘映射----字符映射KeyCharacterMap 预备基础知识: http://source.android.com/porting/keymaps_keyboard_...

android 键盘映射、定义

键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout

Android Studio 模拟器对应键盘快捷键映射

Android Studio 模拟器对应键盘快捷键映射Android SDK2.0.1自带的虚拟机尺寸都比较小(不针对机型,只为了在PC上看的舒服一点,当然越大越好了,我最大设置成1050*450,但...

android:添加usb键盘+按键布局和映射的修改

android下的按键布局和映射这个笔记整理一下使用usb键盘遇到的问题,比如添加usb键盘的keylayout,添加按键,修改按键映射等。本文参考了:http://blog.csdn.net/kie...

DOM事件探秘之三-键盘事件

键盘事件 keyDown:按下任意字符键事触发,如果按着不放会重复触发此事件; keyPress:按下任意字符键事触发,如果按着不放会重复触发此事件; keyUp:松开时触发的事件...
  • sofia92
  • sofia92
  • 2016年01月18日 14:58
  • 884

android键盘映射(转)

原文网址:http://www.cnblogs.com/cnhome/archive/2009/12/22/1629435.html   按键事件 对于按键事件,调用mDevices...

android键盘映射

转:http://blog.chinaunix.net/u3/90973/showart_2207472.htmlAndroid底层和中间层共同学习系列之android键盘映射 介绍 功能键布局映射 ...
  • eustoma
  • eustoma
  • 2011年06月07日 12:36
  • 880

【IPC进程间通讯之三】内存映射文件Mapping File

IPC进程间通信+共享内存Mapping                IPC(Inter-Process Communication,进程间通信)。         文件映射(Mapping)是...

Hibernate框架学习之三:深入映射文件的配置

前言这里主要是对XML版的Hibernate框架的开发进行说明,Annotation版会在另外的文章中在说明。由于Hibernate是一个全方位的ORM框架,那么要实现从Object到Record的完...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android键盘映射之三
举报原因:
原因补充:

(最多只允许输入30个字)