Tiger-Dog

Android底层和中间层共同学习系列之android键盘映射

Android底层和中间层共同学习系列之android键盘映射
                                            (转载请说明来自国内最大Android社区androidin底层驱动论坛分支,国内最大linux社区Linuxforum 嵌入式linux分支)
                                               
                                            (Email :hongjiujing@gmail.com)
                                                   (此文章适合于初学者,说的不对的地方欢迎大家指正和完善。大牛们可以绕道^^)

 

介绍
功能
键布局映射
        键映射的选择
        文件格式
        键布局映射文件示例
键字符映射
        键字符映射的选择
        文件格式
        资源二进制文件格式

完善您自己的驱动
示列


介绍:
     本文主要描述了键输入怎么转换成Android应用层的行为信息和怎样自定义键的布局和键的字符映射表,满足设备的需要。
注:
       Android的应用不仅仅是平板电脑,MID,phone,还可以放到STB机顶盒,智能家庭终端上面去,所以按键的映射是一定要自定义的,不管按键是固定在设备上,还是通过无线设备还是蓝牙遥控,都需要键的映射。
       Android也是基于Linux的核心,大部分时候都是操作系统在调度任务,执行任务。相应的,Android输入系统也是遵循LINUX的input输入输出子系统,关于这部分的分析可以Google,有许多原理方面的分析。Android使用标准的Linux输入事件设备(/dev/event0),驱动描述可以查看内核树头文件include/linux/input.h。如果想深入学习Linux input subsystem,可以访问:http://git.kernel.org/?p=linux/k ... /linux-2.6.24.y.git;a=blob;f=Documentation/input/input.txt

注:event0是您的keypad/gpio-key注册到内核的节点号,如果有其他的输入设备注册进内核,也可以是event1。

 

功能性

   Android输入事件设备,用的是中断(硬件触发)或者轮询结构(软件模拟),捕获设备具体的扫描码,通过input_event()转化成标准的内核可接受的事件。
  键映射驱动的其他主要驱动是建立一个probe函数,用于注册中断或者您的软件模拟的轮询功能函数,硬件初始化,用input_register_device()注册驱动/设备到输入输出系统。
  注:关于probe属于linux设备驱动模型相关知识,可以阅读LDD3或者LINUX设备驱动原理与实践,有很详细的描述。

下面表描述了从键盘输入最终转成相应应用行为的转化步骤

步骤                                                        行为                                                                                              解释  
1                                        窗口管理器从Linux键盘驱动获取键盘事件                                                       按键消息不指定任何逻辑事件,它只与其硬件位置有关, 也就是说,按键的键盘码没有任何软件含义,映射键盘码
2                                        窗口管理器映射扫描码为键码。                                                                      当窗口管理器从驱动读到一个键,它利用那个键布局映射文件将扫描码映射为键值。特别的,这个键值就是屏幕显示的条码。例如
                                                                                                                                                      KEYCODE_DPAD_CENTER是导航五位键的中间的键,即使ALT+G产生一个"?"字符,事实上KEYCODE_G就是这个键值。

3                                       窗口管理器发送扫描码和键码到应用程序`                                                        扫描码和键码被当前焦点所在界面处理,具体"翻译"要看具体的应用场合。       

键布局映射

如何选择一个键布局映射文件
键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout

对于每一个键盘设备xxx,设置系统属性android.keylayout.xxx,如果没有为自己的硬件设备创建一个特定的设备,Android将去读/system/usr/keylayout/qwerty.kl这个配置文件。

注:如果设置系统属性,请查看ttp://www.kandroid.org/android_pdk/build_new_device.html

文件格式:
键映射文件通常以UTF8文本文件格式存储于设备,通常有如下特性:
注释:用#表示,以#开头的内容都将被忽略。
空白:所有的空行被忽略
键定义:键定义遵循如下格式key SCANCODE KEYCODE [FLAGS...],当扫描码是一个数字,键码定义在你描述的布局文件android.keylayout.xxx,另外可以设置相关的FLAGS:
SHIFT: 当按下,自动加上SHIFT键值
ALT:当按下,自动加上ALT
CAPS:当按下,自动带上CAPS大写
WAKE:当按下,当设备进入睡眠的时候,按下这个键将唤醒,而且发送消息给应用层。
WAKE_DROPPED:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。

键盘映射文件示例:
android/src/device/product/generic/tuttle2.kl
# Copyright 2007 The Android Open Source Project

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 59    MENU         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   SLASH

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 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 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 28    ENTER
        
key 56    ALT_LEFT
key 42    SHIFT_LEFT
key 215   AT
key 57    SPACE
key 53    SLASH
key 127   SYM
key 100   ALT_LEFT

key 399   GRAVE
键字符映射:
键字符映射位于:/system/usr/keychars和/data/usr/keychars!
比如对于一个特定的设备xxx,设置android.keychar.xxx系统属性,用全路径表示去描述所需的键字符映射。如果你没有描述任何一个键字符映射,系统将默认使用/system/usr/keychar/qwerty.kl!
注:这一点可以在开发板接USB KEYBOARD的时候,将logcat打开看调试信息,会看到default to qwerty.kl类似的信息。


文件格式:
键字符映射文件以二进制减少加载时间的形式存储于设备中,键字符映射文件有如下特征:
注释:以#开始为注释
空行:所有的空行被忽略
列定义:当一个事件来临的时候按下组合键。这个事通常是MODIFIER_SHIFT,MODIFIER_CTRL,MODIFIER_ALT的组合。
O                                         no modifiers
S                                         MODIFIER_SHIFT
C                                         MODIFIER_CONTROL
L                                         MODIFIER_CAPS_LOCK
A                                         MODIFIER_ALT
键值定义:键值定义遵循如下规则:
键 扫描码 字符[....]
扫描码和字符通常是一个十进制的值或者是UTF8字符,可以通过strtol的解析。

键字符文件的示例:
下面这个文件来自于android/src/device/product/generic/tuttle2.kcm,代表了一个完整的键字符文件。
以type开始的语句描述了你所要描述键盘的类型,大体分为三种
1:NUMERIC,12键的数字键盘
2:Q14:键盘包括所有的字符,但是可以一键多个字符。
3:QWERTY键盘包括了所有可能的字符和数字,类似于全键盘。
下面是一个QWERTY全键盘的定义示例,因为android主要用于手机,手机一般是全键。
# Copyright 2007 The Android Open Source Project

[type=QWERTY]

# keycode   base    caps    fn      caps_fn number  display_label

A           \'a\'     \'A\'     \'%\'     0x00    \'%\'     \'A\'
B           \'b\'     \'B\'     \'=\'     0x00    \'=\'     \'B\'
C           \'c\'     \'C\'     \'8\'     0x00E7  \'8\'     \'C\'
D           \'d\'     \'D\'     \'5\'     0x00    \'5\'     \'D\'
E           \'e\'     \'E\'     \'2\'     0x0301  \'2\'     \'E\'
F           \'f\'     \'F\'     \'6\'     0x00A5  \'6\'     \'F\'
G           \'g\'     \'G\'     \'-\'     \'_\'     \'-\'     \'G\'
H           \'h\'     \'H\'     \'[\'     \'{\'     \'[\'     \'H\'
I           \'i\'     \'I\'     \'$\'     0x0302  \'$\'     \'I\'
J           \'j\'     \'J\'     \']\'     \'}\'     \']\'     \'J\'
K           \'k\'     \'K\'     \'"\'     \'~\'     \'"\'     \'K\'
L           \'l\'     \'L\'     \'\'\'     \'`\'     \'\'\'     \'L\'
M           \'m\'     \'M\'     \'>\'     0x00    \'>\'     \'M\'
N           \'n\'     \'N\'     \'<\'     0x0303  \'<\'     \'N\'
O           \'o\'     \'O\'     \'(\'     0x00    \'(\'     \'O\'
P           \'p\'     \'P\'     \')\'     0x00    \')\'     \'P\'
Q           \'q\'     \'Q\'     \'*\'     0x0300  \'*\'     \'Q\'
R           \'r\'     \'R\'     \'3\'     0x20AC  \'3\'     \'R\'
S           \'s\'     \'S\'     \'4\'     0x00DF  \'4\'     \'S\'
T           \'t\'     \'T\'     \'+\'     0x00A3  \'+\'     \'T\'
U           \'u\'     \'U\'     \'&\'     0x0308  \'&\'     \'U\'
V           \'v\'     \'V\'     \'9\'     \'^\'     \'9\'     \'V\'
W           \'w\'     \'W\'     \'1\'     0x00    \'1\'     \'W\'
X           \'x\'     \'X\'     \'7\'     0xEF00  \'7\'     \'X\'
Y           \'y\'     \'Y\'     \'!\'     0x00A1  \'!\'     \'Y\'
Z           \'z\'     \'Z\'     \'#\'     0x00    \'#\'     \'Z\'

COMMA       \',\'     \';\'     \';\'     \'|\'     \',\'     \',\'
PERIOD      \'.\'     \':\'     \':\'     0x2026  \'.\'     \'.\'
AT          \'@\'     \'0\'     \'0\'     0x2022  \'0\'     \'@\'
SLASH       \'/\'     \'?\'     \'?\'     \'\\'     \'/\'     \'/\'

SPACE       0x20    0x20    0x9     0x9     0x20    0x20
NEWLINE     0xa     0xa     0xa     0xa     0xa     0xa

# on pc keyboards
TAB         0x9     0x9     0x9     0x9     0x9     0x9
0           \'0\'     \')\'     \')\'     \')\'     \'0\'     \'0\'
1           \'1\'     \'!\'     \'!\'     \'!\'     \'1\'     \'1\'
2           \'2\'     \'@\'     \'@\'     \'@\'     \'2\'     \'2\'
3           \'3\'     \'#\'     \'#\'     \'#\'     \'3\'     \'3\'
4           \'4\'     \'$\'     \'$\'     \'$\'     \'4\'     \'4\'
5           \'5\'     \'%\'     \'%\'     \'%\'     \'5\'     \'5\'
6           \'6\'     \'^\'     \'^\'     \'^\'     \'6\'     \'6\'
7           \'7\'     \'&\'     \'&\'     \'&\'     \'7\'     \'7\'
8           \'8\'     \'*\'     \'*\'     \'*\'     \'8\'     \'8\'
9           \'9\'     \'(\'     \'(\'     \'(\'     \'9\'     \'9\'

GRAVE         \'`\'     \'~\'     \'`\'     \'~\'     \'`\'     \'`\'
MINUS         \'-\'     \'_\'     \'-\'     \'_\'     \'-\'     \'-\'
EQUALS        \'=\'     \'+\'     \'=\'     \'+\'     \'=\'     \'=\'
LEFT_BRACKET  \'[\'     \'{\'     \'[\'     \'{\'     \'[\'     \'[\'
RIGHT_BRACKET \']\'     \'}\'     \']\'     \'}\'     \']\'     \']\'
BACKSLASH     \'\\'     \'|\'     \'\\'     \'|\'     \'\\'     \'\\'
SEMICOLON     \';\'     \':\'     \';\'     \':\'     \';\'     \';\'
APOSTROPHE    \'\'\'     \'"\'     \'\'\'     \'"\'     \'\'\'     \'\'\'
STAR          \'*\'     \'*\'     \'*\'     \'*\'     \'*\'     \'*\'
POUND         \'#\'     \'#\'     \'#\'     \'#\'     \'#\'     \'#\'
PLUS          \'+\'     \'+\'     \'+\'     \'+\'     \'+\'     \'+\'

资源二进制格式

上面所描述的一段通过makekcharmap工具转换成下面的格式,用户可以通过mmap这个文件,用于进程之间共享大概4K数据,可以节省加载时间。
Offset                          Size (bytes)                          Description
0x00-0x0b                                                         The ascii value "keycharmap1" including the null character
0x0c-0x0f                                                         padding
0x10-0x13                                                         The number of entries in the modifiers table (COLS)
0x14-0x17                                                         The number of entries in the characters table (ROWS)
0x18-0x1f                                                         padding
                                4*COLS                                Modifiers table. The modifier mask values that each of the columns inthe characters table correspond to.
                                                                        padding to the next 16 byte boundary
                                4*COLS*ROWS                 Characterstable. The modifier mask values that each of the columns correspond to.
完善你自己的键盘事件驱动(略)

分类:

技术点:

相关文章:

  • 2021-11-19
  • 2021-08-15
  • 2021-09-16
  • 2022-12-23
  • 2022-12-23
  • 2021-05-07
  • 2021-05-16
  • 2021-06-09
猜你喜欢
  • 2021-06-01
  • 2021-06-09
  • 2022-12-23
  • 2021-09-19
  • 2021-09-02
  • 2021-08-11
相关资源
相似解决方案