CN51-Android-Key-remap配置方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主题
CN51 Android Key remap配置方法
适用范围
•Intermec CN51 Android 4/6
问题背景
CN51 Android 4 数字键盘,客户需要使用Tab, Star, Esc, Pound 按键映射为F1(131), F2(132), F3(133), F4(134)
解决方案
1.如何在CN51 Android 4/6上映射按键?可以通过使用xml文件映射。
CN51分两种键盘:数字键盘和字母键盘。
数字键盘用Numeric.xml文件进行映射,字母键盘用
Alpha.xml文件进行映射。
将Numeric.xml文件或Alpha.xml文件直接copy到internal storage或/sdcard/根目录下,该文件会被keyremapper service自动解析成命名为Alpha<timestamp>.xml文件后保存在internal storage的根目录下。
注意:无论copy的是Numeric.xml还是Alpha.xml文件,copy后解析成的文件都是以Alpha*******.xml命名的文件,******表示copy文件自动生成的时间戳,表示已被解析完成。
如果copy文件后未生成****.xml,可能性:1. xml文件不匹配或格式错误;2. firmware过低,需升级固件版本。
2.以Numeric.xml文件为例说明文件格式:
注意:xml不能以(<?xml version="1.0" encoding="utf-8"?>). 开头。
xml中ShiftKeys部分定义了:
"Shift Plane 1"作为Gold(Orange) Plane键
"Shift Plane 2"作为Aqua(Green) Shift Plane 键
<!-- ShiftKeys -->
<UINT8 value="0x01" comment="Number of keys in shiftkey 1" />
<BINARY value="0x24,0x02,0x01,0x01" comment="Shift Plane 1 (Gold)" />
<UINT8 value="0x01" comment="Number of keys in shiftkey 2" />
<BINARY value="0x04,0x02,0x01,0x02" comment="Shift Plane 2 (Aqua)" />
xml文件中,通过'shift plane'划分为三个主入口,如下:
<UINT8 value="0x21" comment="Number of keys in shift plane 0" />
------shift plane 0 下定义的key list是通用按键(不按Gold或Aqua键)。
<UINT8 value="0x43" comment="Number of keys in shift plane 1" />
------shift plane 1 下定义的key list是按下Gold键后,映射的键。
如Gold+* -> -.
<UINT8 value="0x29" comment="Number of keys in shift plane 2" />
------shift plane 2 下定义的key list是按下Aqua键后,映射的键。
如Aqua + 1 -> Caps.
按键格式定义:
<BINARY value="pp,uu,aa,bb,cc,sc" comment="Entry for key X" />
pp和uu两组数据组合,定义键盘上某个特定的物理按键key X。
aa, bb, cc, sc 为Key X的关联标志位,赋予其对应的scan code值。
3.案例1:
将侧键volume+/- remap为 up arrow和down arrow.
原始键定义如下:
<BINARY value="0x07,0x3F,0x00,0x02,0x00,0x0B" comment="F6 (Volume+)" /> <BINARY value="0x07,0x40,0x00,0x02,0x00,0x83" comment="F7 (Volume-)" />
<BINARY value="0x07,0x51,0x00,0x01,0x00,0x72" comment="Down Arrow" />
<BINARY value="0x07,0x52,0x00,0x01,0x00,0x75" comment="Up Arrow" />
将需要替换功能的按键后四个字符进行修改,替换成对应的功能键值。
<BINARY value="0x07,0x3F,0x00,0x01,0x00,0x75" comment="F6 (Volume+) -> Up Arrow" />
<BINARY value="0x07,0x40,0x00,0x01,0x00,0x72" comment="F7 (Volume-) -> Down Arrow" />
注意:只需要在shift plane 0定义的entry下进行修改。
4.案例2:
将左侧上键->Scan left
原始按键定义:
<BINARY value="0x07,0x43,0x00,0x0A,0x10,0xC1" comment="A1 (PTT)" />
<BINARY value="0x07,0x91,0x00,0x02,0x02,0x01" comment="Scan Left" />
将后四个字符替换:
<BINARY value="0x07,0x43,0x00,0x02,0x02,0x01" comment="A1 (PTT)" />
注意:只需要在shift plane 0定义的entry下进行修改。
5.案例3:
定义组合按键:Gold(Orange) + 1 -> F1, Orange+2->F2…
原始按键定义(注意需查找"Shift Plane 1"入口下的定义):
<!-- Numeric Keypad -->
<BINARY value="0x07,0x1E,0x00,0x00,0x00,0x16" comment="1" />
<BINARY value="0x07,0x1F,0x00,0x00,0x00,0x1E" comment="2" />
<BINARY value="0x07,0x20,0x00,0x00,0x00,0x26" comment="3" />
<BINARY value="0x07,0x21,0x00,0x00,0x00,0x25" comment="4" />
<BINARY value="0x07,0x22,0x00,0x00,0x00,0x2E" comment="5" />
<BINARY value="0x07,0x23,0x00,0x00,0x00,0x36" comment="6" />
<BINARY value="0x07,0x24,0x00,0x00,0x00,0x3D" comment="7" />
<BINARY value="0x07,0x25,0x00,0x00,0x00,0x3E" comment="8" />
<BINARY value="0x07,0x26,0x00,0x00,0x00,0x46" comment="9" />
<BINARY value="0x07,0x27,0x00,0x00,0x00,0x45" comment="0" />
将这些数字键映射为功能键Function Key值(可在PS/2 keyboard scan code表中查找):<!-- Numeric Keypad -->
<BINARY value="0x07,0x1E,0x00,0x00,0x00,0x05" comment="F1" />
<BINARY value="0x07,0x1F,0x00,0x00,0x00,0x06" comment="F2" />
<BINARY value="0x07,0x20,0x00,0x00,0x00,0x04" comment="F3" />
<BINARY value="0x07,0x21,0x00,0x00,0x00,0x0C" comment="F4" />
<BINARY value="0x07,0x22,0x00,0x00,0x00,0x03" comment="F5" />
<BINARY value="0x07,0x23,0x00,0x00,0x00,0x0B" comment="F6" />
<BINARY value="0x07,0x24,0x00,0x00,0x00,0x83" comment="F7" />
<BINARY value="0x07,0x25,0x00,0x00,0x00,0x0A" comment="F8" />
<BINARY value="0x07,0x26,0x00,0x00,0x00,0x01" comment="F9" />
<BINARY value="0x07,0x27,0x00,0x00,0x00,0x09" comment="F10" />
系统默认F1-F10实现的功能如下:
F1 KEYCODE_MENU
F2 System goes to sleep
F3 KEYCODE_BACK
F4 System go to Home Screen
F5 KEYCODE_STAR
F6 KEYCODE_VOLUME_UP
F7 KEYCODE_VOLUME_DOWN
F8 KEYCODE_POUND
F9 KEYCODE_UNKNOWN (scancode 67)
F10 KEYCODE_UNKNOWN (scancode 68)
6.案例4——该方案由Sheldon提供:
客户不需要系统默认F1-F10功能,而需要实现Orange+1->F1(131), Orange+2->F2(132)…
首先需要升级补丁包:SR16090700_KEY_CN51_ANDROID_ALL.zip
升级方法:“设置->关于手机->System updates”
该包实现了131,132,133,134 keypad键定义
查找原始xml文件中"Shift Plane 1"下的Numeric Keypad,
<!-- Numeric Keypad -->
<BINARY value="0x07,0x1E,0x00,0x00,0x00,0x16" comment="1" />
<BINARY value="0x07,0x1F,0x00,0x00,0x00,0x1E" comment="2" />
<BINARY value="0x07,0x20,0x00,0x00,0x00,0x26" comment="3" />
<BINARY value="0x07,0x21,0x00,0x00,0x00,0x25" comment="4" />
<BINARY value="0x07,0x22,0x00,0x00,0x00,0x2E" comment="5" />
<BINARY value="0x07,0x23,0x00,0x00,0x00,0x36" comment="6" />
<BINARY value="0x07,0x24,0x00,0x00,0x00,0x3D" comment="7" />
<BINARY value="0x07,0x25,0x00,0x00,0x00,0x3E" comment="8" />
<BINARY value="0x07,0x26,0x00,0x00,0x00,0x46" comment="9" />
<BINARY value="0x07,0x27,0x00,0x00,0x00,0x45" comment="0" />
修改为PS2 keyboard scan code中的Keypad_1,Keypad_2…,修改后映射关系如下:
<!-- Numeric Keypad -->
<BINARY value="0x07,0x1E,0x00,0x00,0x00,0x69" comment="KP1" />
<BINARY value="0x07,0x1F,0x00,0x00,0x00,0x70" comment="KP0, KP2 already taken"
/>
<BINARY value="0x07,0x20,0x00,0x00,0x00,0x7A" comment="KP3" />
<BINARY value="0x07,0x21,0x00,0x00,0x00,0x79" comment="KP4" />
<BINARY value="0x07,0x22,0x00,0x00,0x00,0x73" comment="KP5" />
<BINARY value="0x07,0x23,0x00,0x00,0x00,0x7D" comment="KP9, KP6 already taken"
/>
<BINARY value="0x07,0x24,0x00,0x00,0x00,0x6C" comment="KP7" />
<BINARY value="0x07,0x25,0x00,0x00,0x00,0x7C" comment="KP*, KP8 already taken"
/>
<BINARY value="0x07,0x26,0x00,0x00,0x00,0x01" comment="F9" />
<BINARY value="0x07,0x27,0x00,0x00,0x00,0x09" comment="F10" />
7.案例5:
将Tab->F1(131), Star->F2(132), Esc->F3(133), Pound->F4(134).
首先需要升级上面案例一样的补丁包:SR16090700_KEY_CN51_ANDROID_ALL.zip
查找xml中"Shift plane 0"中的Tab,Esc,Star,Pound键:
<BINARY value="0x07,0x2B,0x00,0x00,0x00,0x0D" comment="Tab" />
<BINARY value="0x07,0x41,0x00,0x20,0x00,0x3E" comment="F8 (Star) => *" /> <BINARY value="0x07,0x29,0x00,0x00,0x00,0x76" comment="Escape" />
<BINARY value="0x07,0x42,0x00,0x20,0x00,0x26" comment="F9 (Pound)=> #" />修改为PS2_ScanCode文件中对应的KP1,KP2…修改后映射关系如下:
<BINARY value="0x07,0x2B,0x00,0x00,0x00,0x69" comment="Tab -> KP1" />
<BINARY value="0x07,0x41,0x00,0x20,0x00,0x70" comment="F8 (Star) => * -> KP2"
/>
<BINARY value="0x07,0x29,0x00,0x00,0x00,0x7A" comment="Escape -> KP3" />
<BINARY value="0x07,0x42,0x00,0x20,0x00,0x79" comment="F9 (Pound)=> # -> KP4"
/>
51 Android系统按键映射流程分析:
解压SR16090700_KEY_CN51_ANDROID_ALL.zip,
关键文件在:\system\usr\keylayout\Physical_Keypad.kl 该文件为标准的Android key layout 按键映射表文件。
每个Android设备都会使用默认的Generic.kl文件,CN51案例中替换成了Physical_Keypad.kl 文件。
注意:映射表是设备相关的。
由于不同设备发送到Android系统的scan code可能会不同,因此每个设备需要用自身对应的映射表才能正确解析出key code。
(1). 键盘布局文件(*.kl)
将input event报的键值转换成具体键盘对应的按键,给Android层使用。
key 79F1
key 82 F2
key 81 F3
key 75 F4
其中79为定义在input.h中由kernel层driver上报的键值;
F1为Android中定义的从scan code映射到key code按键对应的key label关键字符
(2). Keycodes.h中的枚举值定义了整数格式的按键码。
AKEYCODE_F1 = 131, ----Android系统处理的真实键值。
AKEYCODE_F2 = 132,
AKEYCODE_F3 = 133,
AKEYCODE_F4 = 134
(3).CN51中PS2_ScanCode中定义的值(这部分开始的映射是Honeywell自己定义的):
Keypad_1 = 0x0069,
Keypad_7 = 0x006C,
Keypad_0 = 0x0070,//KP2已定义用KP0值
Keypad_period = 0x0071,
Keypad_2 = 0x0072,
Keypad_5 = 0x0073,
Keypad_6 = 0x0074,
Keypad_8 = 0x0075,
Keypad_4 = 0x0079,
Keypad_3 = 0x007A,
Keypad_9 = 0x007D,
(4). Numeric.xml文件中定义的KP值:
<BINARY value="0x07,0x2B,0x00,0x00,0x00,0x69" comment="Tab -> KP1" />
<BINARY value="0x07,0x41,0x00,0x20,0x00,0x70" comment="F8 (Star) => * -> KP2"
/>
<BINARY value="0x07,0x29,0x00,0x00,0x00,0x7A" comment="Escape -> KP3" />
<BINARY value="0x07,0x42,0x00,0x20,0x00,0x79" comment="F9 (Pound)=> # -> KP4"
/>
9.总结:
如果不扩展按键,只需要修改xml文件就可以做相应的映射了。
如果需要扩展按键,还是要研发提供底层补丁包,告知对应的按键映射关系。
10.附件:
Numeric.xml Alpha.xml ps2_scancodes.txt SR16090700_KEY_CN51_ANDROID_ALL.zip
(注:可编辑下载,若有不当之处,请指正,谢谢!)。