- 介绍
- 功能
- 键布局映射
- 键映射的选择
- 文件格式
- 键布局映射文件示例
- 键字符映射
- 键字符映射的选择
- 文件格式
- 资源二进制文件格式
- 完善您自己的驱动
- 示列
- 介绍:
- 本文主要描述了键输入怎么转换成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:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。
- 键盘映射文件示例:
- 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’ ‘
#define KEY_RESERVED 0
- #define KEY_ESC 1
- #define KEY_1 2
- #define KEY_2 3
- #define KEY_3 4
- #define KEY_4 5
- #define KEY_5 6
- #define KEY_6 7
- #define KEY_7 8
- #define KEY_8 9
- #define KEY_9 10
- #define KEY_0 11
- #define KEY_MINUS 12
- #define KEY_EQUAL 13
- #define KEY_BACKSPACE 14
- #define KEY_TAB 15
- #define KEY_Q 16
- #define KEY_W 17
- #define KEY_E 18
- #define KEY_R 19
- #define KEY_T 20
- #define KEY_Y 21
- #define KEY_U 22
- #define KEY_I 23
- #define KEY_O 24
- #define KEY_P 25
- #define KEY_LEFTBRACE 26
- #define KEY_RIGHTBRACE 27
- #define KEY_ENTER 28
- #define KEY_LEFTCTRL 29
- #define KEY_A 30
- #define KEY_S 31
- #define KEY_D 32
- #define KEY_F 33
- #define KEY_G 34
- #define KEY_H 35
- #define KEY_J 36
- #define KEY_K 37
- #define KEY_L 38
- #define KEY_SEMICOLON 39
- #define KEY_APOSTROPHE 40
- #define KEY_GRAVE 41
- #define KEY_LEFTSHIFT 42
- #define KEY_BACKSLASH 43
- #define KEY_Z 44
- #define KEY_X 45
- #define KEY_C 46
- #define KEY_V 47
- #define KEY_B 48
- #define KEY_N 49
- #define KEY_M 50
- #define KEY_COMMA 51
- #define KEY_DOT 52
- #define KEY_SLASH 53
- #define KEY_RIGHTSHIFT 54
- #define KEY_KPASTERISK 55
- #define KEY_LEFTALT 56
- #define KEY_SPACE 57
- #define KEY_CAPSLOCK 58
- #define KEY_F1 59
- #define KEY_F2 60
- #define KEY_F3 61
- #define KEY_F4 62
- #define KEY_F5 63
- #define KEY_F6 64
- #define KEY_F7 65
- #define KEY_F8 66
- #define KEY_F9 67
- #define KEY_F10 68
- #define KEY_NUMLOCK 69
- #define KEY_SCROLLLOCK 70
- #define KEY_KP7 71
- #define KEY_KP8 72
- #define KEY_KP9 73
- #define KEY_KPMINUS 74
- #define KEY_KP4 75
- #define KEY_KP5 76
- #define KEY_KP6 77
- #define KEY_KPPLUS 78
- #define KEY_KP1 79
- #define KEY_KP2 80
- #define KEY_KP3 81
- #define KEY_KP0 82
- #define KEY_KPDOT 83
- #define KEY_ZENKAKUHANKAKU 85
- #define KEY_102ND 86
- #define KEY_F11 87
- #define KEY_F12 88
- #define KEY_RO 89
- #define KEY_KATAKANA 90
- #define KEY_HIRAGANA 91
- #define KEY_HENKAN 92
- #define KEY_KATAKANAHIRAGANA 93
- #define KEY_MUHENKAN 94
- #define KEY_KPJPCOMMA 95
- #define KEY_KPENTER 96
- #define KEY_RIGHTCTRL 97
- #define KEY_KPSLASH 98
- #define KEY_SYSRQ 99
- #define KEY_RIGHTALT 100
- #define KEY_LINEFEED 101
- #define KEY_HOME 102
- #define KEY_UP 103
- #define KEY_PAGEUP 104
- #define KEY_LEFT 105
- #define KEY_RIGHT 106
- #define KEY_END 107
- #define KEY_DOWN 108
- #define KEY_PAGEDOWN 109
- #define KEY_INSERT 110
- #define KEY_DELETE 111
- #define KEY_MACRO 112
- #define KEY_MUTE 113
- #define KEY_VOLUMEDOWN 114
- #define KEY_VOLUMEUP 115
- #define KEY_POWER 116 /* SC System Power Down */
- #define KEY_KPEQUAL 117
- #define KEY_KPPLUSMINUS 118
- #define KEY_PAUSE 119
- #define KEY_SCALE 120 /* AL Compiz Scale (Expose) */
- #define KEY_KPCOMMA 121
- #define KEY_HANGEUL 122
- #define KEY_HANGUEL KEY_HANGEUL
- #define KEY_HANJA 123
- #define KEY_YEN 124
- #define KEY_LEFTMETA 125
- #define KEY_RIGHTMETA 126
- #define KEY_COMPOSE 127
- #define KEY_STOP 128 /* AC Stop */
- #define KEY_AGAIN 129
- #define KEY_PROPS 130 /* AC Properties */
- #define KEY_UNDO 131 /* AC Undo */
- #define KEY_FRONT 132
- #define KEY_COPY 133 /* AC Copy */
- #define KEY_OPEN 134 /* AC Open */
- #define KEY_PASTE 135 /* AC Paste */
- #define KEY_FIND 136 /* AC Search */
- #define KEY_CUT 137 /* AC Cut */
- #define KEY_HELP 138 /* AL Integrated Help Center */
- #define KEY_MENU 139 /* Menu (show menu) */
- #define KEY_CALC 140 /* AL Calculator */
- #define KEY_SETUP 141
- #define KEY_SLEEP 142 /* SC System Sleep */
- #define KEY_WAKEUP 143 /* System Wake Up */
- #define KEY_FILE 144 /* AL Local Machine Browser */
- #define KEY_SENDFILE 145
- #define KEY_DELETEFILE 146
- #define KEY_XFER 147
- #define KEY_PROG1 148
- #define KEY_PROG2 149
- #define KEY_WWW 150 /* AL Internet Browser */
- #define KEY_MSDOS 151
- #define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
- #define KEY_SCREENLOCK KEY_COFFEE
- #define KEY_DIRECTION 153
- #define KEY_CYCLEWINDOWS 154
- #define KEY_MAIL 155
- #define KEY_BOOKMARKS 156 /* AC Bookmarks */
- #define KEY_COMPUTER 157
- #define KEY_BACK 158 /* AC Back */
- #define KEY_FORWARD 159 /* AC Forward */
- #define KEY_CLOSECD 160
- #define KEY_EJECTCD 161
- #define KEY_EJECTCLOSECD 162
- #define KEY_NEXTSONG 163
- #define KEY_PLAYPAUSE 164
- #define KEY_PREVIOUSSONG 165
- #define KEY_STOPCD 166
- #define KEY_RECORD 167
- #define KEY_REWIND 168
- #define KEY_PHONE 169 /* Media Select Telephone */
- #define KEY_ISO 170
- #define KEY_CONFIG 171 /* AL Consumer Control Configuration */
- #define KEY_HOMEPAGE 172 /* AC Home */
- #define KEY_REFRESH 173 /* AC Refresh */
- #define KEY_EXIT 174 /* AC Exit */
- #define KEY_MOVE 175
- #define KEY_EDIT 176
- #define KEY_SCROLLUP 177
- #define KEY_SCROLLDOWN 178
- #define KEY_KPLEFTPAREN 179
- #define KEY_KPRIGHTPAREN 180
- #define KEY_NEW 181 /* AC New */
- #define KEY_REDO 182 /* AC Redo/Repeat */
- #define KEY_F13 183
- #define KEY_F14 184
- #define KEY_F15 185
- #define KEY_F16 186
- #define KEY_F17 187
- #define KEY_F18 188
- #define KEY_F19 189
- #define KEY_F20 190
- #define KEY_F21 191
- #define KEY_F22 192
- #define KEY_F23 193
- #define KEY_F24 194
- #define KEY_PLAYCD 200
- #define KEY_PAUSECD 201
- #define KEY_PROG3 202
- #define KEY_PROG4 203
- #define KEY_DASHBOARD 204 /* AL Dashboard */
- #define KEY_SUSPEND 205
- #define KEY_CLOSE 206 /* AC Close */
- #define KEY_PLAY 207
- #define KEY_FASTFORWARD 208
- #define KEY_BASSBOOST 209
- #define KEY_PRINT 210 /* AC Print */
- #define KEY_HP 211
- #define KEY_CAMERA 212
- #define KEY_SOUND 213
- #define KEY_QUESTION 214
- #define KEY_EMAIL 215
- #define KEY_CHAT 216
- #define KEY_SEARCH 217
- #define KEY_CONNECT 218
- #define KEY_FINANCE 219 /* AL Checkbook/Finance */
- #define KEY_SPORT 220
- #define KEY_SHOP 221
- #define KEY_ALTERASE 222
- #define KEY_CANCEL 223 /* AC Cancel */
- #define KEY_BRIGHTNESSDOWN 224
- #define KEY_BRIGHTNESSUP 225
- #define KEY_MEDIA 226
- #define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video
- outputs (Monitor/LCD/TV-out/etc) */
- #define KEY_KBDILLUMTOGGLE 228
- #define KEY_KBDILLUMDOWN 229
- #define KEY_KBDILLUMUP 230
- #define KEY_SEND 231 /* AC Send */
- #define KEY_REPLY 232 /* AC Reply */
- #define KEY_FORWARDMAIL 233 /* AC Forward Msg */
- #define KEY_SAVE 234 /* AC Save */
- #define KEY_DOCUMENTS 235
- #define KEY_BATTERY 236
- #define KEY_BLUETOOTH 237
- #define KEY_WLAN 238
- #define KEY_UWB 239
- #define KEY_UNKNOWN 240
- #define KEY_VIDEO_NEXT 241 /* drive next video source */
- #define KEY_VIDEO_PREV 242 /* drive previous video source */
- #define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
- #define KEY_BRIGHTNESS_ZERO 244 /* brightness off, use ambient */
- #define KEY_DISPLAY_OFF 245 /* display device to off state */
- #define KEY_WIMAX 246
0x0302 '[ DISCUZ_CODE_5 ]
'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' '[ DISCUZ_CODE_5 ]
'[ DISCUZ_CODE_5 ]
'[ DISCUZ_CODE_5 ]
'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.
[ DISCUZ_CODE_5 ]
来源:http://www.cmd100.com/bbs/forum-viewthread-tid-2049-extra-page%3D1-ordertype-1.html