• android键盘映射


    转:http://blog.chinaunix.net/u3/90973/showart_2207472.html

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

    介绍 功能
    键布局映射
            键映射的选择
            文件格式
            键布局映射文件示例
    键字符映射
            键字符映射的选择
            文件格式
            资源二进制文件格式
    完善您自己的驱动
    介绍:
         本文主要描述了键输入怎么转换成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 in the characters table correspond to.
                                                                            padding to the next 16 byte boundary
                                    4*COLS*ROWS                 Characters table. The modifier mask values that each of the columns correspond to.
    完善你自己的键盘事件驱动(略)


    http://blog.163.com/bluesky_07_06_1/blog/static/1644400832010513101529517/

  • 相关阅读:
    webpack篇
    js 中对于this 的理解的 经典案例
    AMD、CMD、CommonJs和es6对比
    vue import异步加载js
    vscode 保存自动 格式化eslint 代码
    git设置
    面向对象的三大特性之继承
    面向对象 类与对象及其属性与方法 类的组合
    hashlib模块 hash算法
    configparser模块 配置文件的解析操作
  • 原文地址:https://www.cnblogs.com/eustoma/p/2415847.html
Copyright © 2020-2023  润新知