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

http://www.apkbus.com/android-16026-1-1.html


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

  • 完善您自己的驱动
  • 示列


  • 介绍:
  •      本文主要描述了键输入怎么转换成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/kernel/git/stable/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:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。

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

    3. key 2     1
    4. key 3     2
    5. key 4     3
    6. key 5     4
    7. key 6     5
    8. key 7     6
    9. key 8     7
    10. key 9     8
    11. key 10    9
    12. key 11    0
    13. key 158   BACK              WAKE_DROPPED
    14. key 230   SOFT_RIGHT        WAKE
    15. key 60    SOFT_RIGHT        WAKE
    16. key 107   ENDCALL           WAKE_DROPPED
    17. key 62    ENDCALL           WAKE_DROPPED
    18. key 229   MENU         WAKE_DROPPED
    19. key 59    MENU         WAKE_DROPPED
    20. key 228   POUND
    21. key 227   STAR
    22. key 231   CALL              WAKE_DROPPED
    23. key 61    CALL              WAKE_DROPPED
    24. key 232   DPAD_CENTER       WAKE_DROPPED
    25. key 108   DPAD_DOWN         WAKE_DROPPED
    26. key 103   DPAD_UP           WAKE_DROPPED
    27. key 102   HOME              WAKE
    28. key 105   DPAD_LEFT         WAKE_DROPPED
    29. key 106   DPAD_RIGHT        WAKE_DROPPED
    30. key 115   VOLUME_UP
    31. key 114   VOLUME_DOWN
    32. key 116   POWER             WAKE
    33. key 212   SLASH

    34. key 16    Q
    35. key 17    W
    36. key 18    E
    37. key 19    R
    38. key 20    T
    39. key 21    Y
    40. key 22    U
    41. key 23    I
    42. key 24    O
    43. key 25    P

    44. key 30    A
    45. key 31    S
    46. key 32    D
    47. key 33    F
    48. key 34    G
    49. key 35    H
    50. key 36    J
    51. key 37    K
    52. key 38    L
    53. key 14    DEL
    54.         
    55. key 44    Z
    56. key 45    X
    57. key 46    C
    58. key 47    V
    59. key 48    B
    60. key 49    N
    61. key 50    M
    62. key 51    COMMA
    63. key 52    PERIOD
    64. key 28    ENTER
    65.         
    66. key 56    ALT_LEFT
    67. key 42    SHIFT_LEFT
    68. key 215   AT
    69. key 57    SPACE
    70. key 53    SLASH
    71. key 127   SYM
    72. key 100   ALT_LEFT

    73. 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主要用于手机,手机一般是全键。
      1. # Copyright 2007 The Android Open Source Project

      2. [type=QWERTY]

      3. # keycode   base    caps    fn      caps_fn number  display_label

      4. A           'a'     'A'     '%'     0x00    '%'     'A'
      5. B           'b'     'B'     '='     0x00    '='     'B'
      6. C           'c'     'C'     '8'     0x00E7  '8'     'C'
      7. D           'd'     'D'     '5'     0x00    '5'     'D'
      8. E           'e'     'E'     '2'     0x0301  '2'     'E'
      9. F           'f'     'F'     '6'     0x00A5  '6'     'F'
      10. G           'g'     'G'     '-'     '_'     '-'     'G'
      11. H           'h'     'H'     '['     '{'     '['     'H'
      12. I           'i'     'I'     '[code]#define KEY_RESERVED                0
      13. #define KEY_ESC                        1
      14. #define KEY_1                        2
      15. #define KEY_2                        3
      16. #define KEY_3                        4
      17. #define KEY_4                        5
      18. #define KEY_5                        6
      19. #define KEY_6                        7
      20. #define KEY_7                        8
      21. #define KEY_8                        9
      22. #define KEY_9                        10
      23. #define KEY_0                        11
      24. #define KEY_MINUS                12
      25. #define KEY_EQUAL                13
      26. #define KEY_BACKSPACE                14
      27. #define KEY_TAB                        15
      28. #define KEY_Q                        16
      29. #define KEY_W                        17
      30. #define KEY_E                        18
      31. #define KEY_R                        19
      32. #define KEY_T                        20
      33. #define KEY_Y                        21
      34. #define KEY_U                        22
      35. #define KEY_I                        23
      36. #define KEY_O                        24
      37. #define KEY_P                        25
      38. #define KEY_LEFTBRACE                26
      39. #define KEY_RIGHTBRACE                27
      40. #define KEY_ENTER                28
      41. #define KEY_LEFTCTRL                29
      42. #define KEY_A                        30
      43. #define KEY_S                        31
      44. #define KEY_D                        32
      45. #define KEY_F                        33
      46. #define KEY_G                        34
      47. #define KEY_H                        35
      48. #define KEY_J                        36
      49. #define KEY_K                        37
      50. #define KEY_L                        38
      51. #define KEY_SEMICOLON                39
      52. #define KEY_APOSTROPHE                40
      53. #define KEY_GRAVE                41
      54. #define KEY_LEFTSHIFT                42
      55. #define KEY_BACKSLASH                43
      56. #define KEY_Z                        44
      57. #define KEY_X                        45
      58. #define KEY_C                        46
      59. #define KEY_V                        47
      60. #define KEY_B                        48
      61. #define KEY_N                        49
      62. #define KEY_M                        50
      63. #define KEY_COMMA                51
      64. #define KEY_DOT                        52
      65. #define KEY_SLASH                53
      66. #define KEY_RIGHTSHIFT                54
      67. #define KEY_KPASTERISK                55
      68. #define KEY_LEFTALT                56
      69. #define KEY_SPACE                57
      70. #define KEY_CAPSLOCK                58
      71. #define KEY_F1                        59
      72. #define KEY_F2                        60
      73. #define KEY_F3                        61
      74. #define KEY_F4                        62
      75. #define KEY_F5                        63
      76. #define KEY_F6                        64
      77. #define KEY_F7                        65
      78. #define KEY_F8                        66
      79. #define KEY_F9                        67
      80. #define KEY_F10                        68
      81. #define KEY_NUMLOCK                69
      82. #define KEY_SCROLLLOCK                70
      83. #define KEY_KP7                        71
      84. #define KEY_KP8                        72
      85. #define KEY_KP9                        73
      86. #define KEY_KPMINUS                74
      87. #define KEY_KP4                        75
      88. #define KEY_KP5                        76
      89. #define KEY_KP6                        77
      90. #define KEY_KPPLUS                78
      91. #define KEY_KP1                        79
      92. #define KEY_KP2                        80
      93. #define KEY_KP3                        81
      94. #define KEY_KP0                        82
      95. #define KEY_KPDOT                83

      96. #define KEY_ZENKAKUHANKAKU        85
      97. #define KEY_102ND                86
      98. #define KEY_F11                        87
      99. #define KEY_F12                        88
      100. #define KEY_RO                        89
      101. #define KEY_KATAKANA                90
      102. #define KEY_HIRAGANA                91
      103. #define KEY_HENKAN                92
      104. #define KEY_KATAKANAHIRAGANA        93
      105. #define KEY_MUHENKAN                94
      106. #define KEY_KPJPCOMMA                95
      107. #define KEY_KPENTER                96
      108. #define KEY_RIGHTCTRL                97
      109. #define KEY_KPSLASH                98
      110. #define KEY_SYSRQ                99
      111. #define KEY_RIGHTALT                100
      112. #define KEY_LINEFEED                101
      113. #define KEY_HOME                102
      114. #define KEY_UP                        103
      115. #define KEY_PAGEUP                104
      116. #define KEY_LEFT                105
      117. #define KEY_RIGHT                106
      118. #define KEY_END                        107
      119. #define KEY_DOWN                108
      120. #define KEY_PAGEDOWN                109
      121. #define KEY_INSERT                110
      122. #define KEY_DELETE                111
      123. #define KEY_MACRO                112
      124. #define KEY_MUTE                113
      125. #define KEY_VOLUMEDOWN                114
      126. #define KEY_VOLUMEUP                115
      127. #define KEY_POWER                116        /* SC System Power Down */
      128. #define KEY_KPEQUAL                117
      129. #define KEY_KPPLUSMINUS                118
      130. #define KEY_PAUSE                119
      131. #define KEY_SCALE                120        /* AL Compiz Scale (Expose) */

      132. #define KEY_KPCOMMA                121
      133. #define KEY_HANGEUL                122
      134. #define KEY_HANGUEL                KEY_HANGEUL
      135. #define KEY_HANJA                123
      136. #define KEY_YEN                        124
      137. #define KEY_LEFTMETA                125
      138. #define KEY_RIGHTMETA                126
      139. #define KEY_COMPOSE                127

      140. #define KEY_STOP                128        /* AC Stop */
      141. #define KEY_AGAIN                129
      142. #define KEY_PROPS                130        /* AC Properties */
      143. #define KEY_UNDO                131        /* AC Undo */
      144. #define KEY_FRONT                132
      145. #define KEY_COPY                133        /* AC Copy */
      146. #define KEY_OPEN                134        /* AC Open */
      147. #define KEY_PASTE                135        /* AC Paste */
      148. #define KEY_FIND                136        /* AC Search */
      149. #define KEY_CUT                        137        /* AC Cut */
      150. #define KEY_HELP                138        /* AL Integrated Help Center */
      151. #define KEY_MENU                139        /* Menu (show menu) */
      152. #define KEY_CALC                140        /* AL Calculator */
      153. #define KEY_SETUP                141
      154. #define KEY_SLEEP                142        /* SC System Sleep */
      155. #define KEY_WAKEUP                143        /* System Wake Up */
      156. #define KEY_FILE                144        /* AL Local Machine Browser */
      157. #define KEY_SENDFILE                145
      158. #define KEY_DELETEFILE                146
      159. #define KEY_XFER                147
      160. #define KEY_PROG1                148
      161. #define KEY_PROG2                149
      162. #define KEY_WWW                        150        /* AL Internet Browser */
      163. #define KEY_MSDOS                151
      164. #define KEY_COFFEE                152        /* AL Terminal Lock/Screensaver */
      165. #define KEY_SCREENLOCK                KEY_COFFEE
      166. #define KEY_DIRECTION                153
      167. #define KEY_CYCLEWINDOWS        154
      168. #define KEY_MAIL                155
      169. #define KEY_BOOKMARKS                156        /* AC Bookmarks */
      170. #define KEY_COMPUTER                157
      171. #define KEY_BACK                158        /* AC Back */
      172. #define KEY_FORWARD                159        /* AC Forward */
      173. #define KEY_CLOSECD                160
      174. #define KEY_EJECTCD                161
      175. #define KEY_EJECTCLOSECD        162
      176. #define KEY_NEXTSONG                163
      177. #define KEY_PLAYPAUSE                164
      178. #define KEY_PREVIOUSSONG        165
      179. #define KEY_STOPCD                166
      180. #define KEY_RECORD                167
      181. #define KEY_REWIND                168
      182. #define KEY_PHONE                169        /* Media Select Telephone */
      183. #define KEY_ISO                        170
      184. #define KEY_CONFIG                171        /* AL Consumer Control Configuration */
      185. #define KEY_HOMEPAGE                172        /* AC Home */
      186. #define KEY_REFRESH                173        /* AC Refresh */
      187. #define KEY_EXIT                174        /* AC Exit */
      188. #define KEY_MOVE                175
      189. #define KEY_EDIT                176
      190. #define KEY_SCROLLUP                177
      191. #define KEY_SCROLLDOWN                178
      192. #define KEY_KPLEFTPAREN                179
      193. #define KEY_KPRIGHTPAREN        180
      194. #define KEY_NEW                        181        /* AC New */
      195. #define KEY_REDO                182        /* AC Redo/Repeat */

      196. #define KEY_F13                        183
      197. #define KEY_F14                        184
      198. #define KEY_F15                        185
      199. #define KEY_F16                        186
      200. #define KEY_F17                        187
      201. #define KEY_F18                        188
      202. #define KEY_F19                        189
      203. #define KEY_F20                        190
      204. #define KEY_F21                        191
      205. #define KEY_F22                        192
      206. #define KEY_F23                        193
      207. #define KEY_F24                        194

      208. #define KEY_PLAYCD                200
      209. #define KEY_PAUSECD                201
      210. #define KEY_PROG3                202
      211. #define KEY_PROG4                203
      212. #define KEY_DASHBOARD                204        /* AL Dashboard */
      213. #define KEY_SUSPEND                205
      214. #define KEY_CLOSE                206        /* AC Close */
      215. #define KEY_PLAY                207
      216. #define KEY_FASTFORWARD                208
      217. #define KEY_BASSBOOST                209
      218. #define KEY_PRINT                210        /* AC Print */
      219. #define KEY_HP                        211
      220. #define KEY_CAMERA                212
      221. #define KEY_SOUND                213
      222. #define KEY_QUESTION                214
      223. #define KEY_EMAIL                215
      224. #define KEY_CHAT                216
      225. #define KEY_SEARCH                217
      226. #define KEY_CONNECT                218
      227. #define KEY_FINANCE                219        /* AL Checkbook/Finance */
      228. #define KEY_SPORT                220
      229. #define KEY_SHOP                221
      230. #define KEY_ALTERASE                222
      231. #define KEY_CANCEL                223        /* AC Cancel */
      232. #define KEY_BRIGHTNESSDOWN        224
      233. #define KEY_BRIGHTNESSUP        225
      234. #define KEY_MEDIA                226

      235. #define KEY_SWITCHVIDEOMODE        227        /* Cycle between available video
      236.                                            outputs (Monitor/LCD/TV-out/etc) */
      237. #define KEY_KBDILLUMTOGGLE        228
      238. #define KEY_KBDILLUMDOWN        229
      239. #define KEY_KBDILLUMUP                230

      240. #define KEY_SEND                231        /* AC Send */
      241. #define KEY_REPLY                232        /* AC Reply */
      242. #define KEY_FORWARDMAIL                233        /* AC Forward Msg */
      243. #define KEY_SAVE                234        /* AC Save */
      244. #define KEY_DOCUMENTS                235

      245. #define KEY_BATTERY                236

      246. #define KEY_BLUETOOTH                237
      247. #define KEY_WLAN                238
      248. #define KEY_UWB                        239

      249. #define KEY_UNKNOWN                240

      250. #define KEY_VIDEO_NEXT                241        /* drive next video source */
      251. #define KEY_VIDEO_PREV                242        /* drive previous video source */
      252. #define KEY_BRIGHTNESS_CYCLE        243        /* brightness up, after max is min */
      253. #define KEY_BRIGHTNESS_ZERO        244        /* brightness off, use ambient */
      254. #define KEY_DISPLAY_OFF                245        /* display device to off state */

      255. #define KEY_WIMAX                246


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值