转自:http://blog.csdn.net/shift_wwx/article/details/11479705

-----------------------------------------------------------

文章出处:http://blog.csdn.net/shift_wwx

前言:TV 上遥控器键值怎么样对应到android的系统中,最近一个客户需要在我们的平台上修改,所以,我顺便做了一下总结,方便以后参考。

请转载的朋友一定加上出处,十分感谢~~

 

第一步:

init.rc:通过service remotecfg /system/bin/remotecfg /system/etc/remote.conf在开机init阶段,将remote.conf中的配置通过ioctl赋值到ir驱动的变量中(用户空间—>内核空间),这样遥控定制化配置才会生效。remotecfg程序代码位于external/remoteconf/irremote.c,可以在设备的/system/bin/下找到它并手动运行#./system/bin/remotecfg /system/etc/remote.conf

第二步:

红外驱动(Linux内核层):Linux irremote driver将依照红外驱动配置文件,将红外键值ircode映射为Linux标准键盘扫描码scancode。这个过程即将红外遥控器的按键事件转换为Linux的标准input event。a) 红外驱动配置文件/system/etc/remote.confb)标准键盘扫描码kernel/include/linux/input.h(在几次遥控器定制化中,尚未修改过该文件)

第三步:

Andriod层:windows manager从irremote driver中读出key event,再通过/system/usr/keylayout/aml_keypad.kl文件,将标准input设备的scan code映射为Andriod API按键KEYCODE字符串。最终scancode和keycode被window manager发送到应用程序,被其focus view消化处理。例如:key 113 SEARCH官方称.kl为key layout map file。

 

映射/配置文件说明

ircode映射为scan code: device/a***c/xxx/remote.conf

#a***c NEC remote

factory_code = 0xfb040001 //每个设备都有独特的factory code. 格式custom_code(16bit)+index_code(16bit) //例子: 0xfb040001= 0xfb04(客户码) + 0001 (低16位可填写任意值)

key_begin //按键映射表 0x47 11 //0x47是红外键值,11是对应的标准按键scancode,可以多个键值对应一个scancode

0x5C 97

……

key_end //按键映射表结束

 

mouse_begin //鼠标方向映射表,每行

0 0x10 //0是方向数字表示符(Left),对应红外按键键值0x10

1 0x11 //方向键右

2 0x0b //方向键上

3 0x0e //方向键下

mouse_end //鼠标方向映射表结束

 

scancode与KEYCODE字符串映射:

在2.3系统中,位于源码目录的device/a***c/xxx/ aml_keypad.kl

在4.0系统中,位于源码目录的device/a***c/xxx/Vendor_0001_Product_0001.kl

[html]  view plain copy
  1. .....................  
  2. key 9     8  
  3. key 10    9  
  4. key 11    0  
  5. key 228   POUND  
  6. key 227   STAR  
  7. key 231   CALL  
  8. key 61    CALL  
  9. key 97    DPAD_CENTER  
  10. key 108   DPAD_DOWN  
  11. key 103   DPAD_UP  
  12. key 102   HOME  
  13. key 114   VOLUME_DOWN  


 

KEYCODE字符串转换为Andriod UI键值:frameworks/base/include/ui/KeycodeLabels.h

[html]  view plain copy
  1. static const KeycodeLabel KEYCODES[] = {  
  2.     { "SOFT_LEFT", 1 },  
  3.      { "HOME", 3 },  
  4.     { "BACK", 4 },  
  5.     { "CALL", 5 },  
  6.     { "ENDCALL", 6 },  
  7.     { "0", 7 },  
  8.     { "1", 8 },  
  9.     { "2", 9 },  
  10.     { "3", 10 },  
  11.     { "4", 11 },  
  12.     { "5", 12 },  
  13.     { "STAR", 17 },  
  14.     { "POUND", 18 },  
  15.     { "DPAD_UP", 19 },   
  16.     { "VOLUME_UP", 24 },  
  17. .........................................  


键盘scancode定义:kernel/include/linux/input.h

[html]  view plain copy
  1. ......   
  2. #define KEY_SPACE    57   
  3. #define KEY_CAPSLOCK     58   
  4. #define KEY_F1   59   
  5. #define KEY_F2   60   
  6. #define KEY_F3   61   
  7. #define KEY_F4   62   
  8. #define KEY_F5   63   
  9. #define KEY_F6   64   
  10. #define KEY_F7   65   
  11. #define KEY_F8   66   
  12. #define KEY_F9   67   
  13. #define KEY_F10  68   
  14. ........   


案例一:新平台增加/移植遥控器代码

[html]  view plain copy
  1. mid产品往往没有遥控器,如果要增加遥控器的支持,需要从mbox代码中拷贝以下文件和目录:  
  2. 1)遥控器驱动:kernel\drivers\a***c\input\irremote  
  3. 2)Andriod 遥控器service:external\remoteconf目录  
  4. 3)init.rc中启动service remotecfg  
  5. # remote  
  6. service remotecfg /system/bin/remotecfg /system/etc/remote.conf  
  7.     class main  
  8.     oneshot  
  9. 4)拷贝定制化remote.conf与kl两个文件  

 

案例二:遥控器静音键改为设置键(不新增按键)

[html]  view plain copy
  1. 1) 按下遥控静音键,观察串口打印出的ircode  
  2. 2) 在板子的/system/etc/remote.conf文件中找到静音键的ircode与scancode对应行,如下: 0x0c  113   
  3. 3) 在板子的/system/usr/keylayout/aml_keypad.kl或Vendor_0001_Product_0001.kl中找到scancode 113所在行:  
  4. key  113   SEARCH  
  5. 4) 将keycode ‘SEARCH’ 修改为需要的KEYCODE字符串。  
  6. 5) 重新编译  

 

案例三:遥控器增加新按键功能

[html]  view plain copy
  1. 新增按键的遥控器往往不是我们公版遥控器,不能利用现有按键实现特定功能,需要在系统中新增以支持特定APK应用场景。  
  2. 1) 通过打印找出新增按键的ircode  
  3. 2) 在device\a***c\xxx\remote.conf找到ircode对应行,或新建一行。这个文件中需要注意factory_code = 0xfd020001 是遥控器的客户码,必须与实体遥控器对应。  
  4. 3) 修改device\a***c\xxx\aml_keypad.kl或Vendor_0001_Product_0001.kl  
  5. 添加时依照上下文的格式:例如 key 1     BACK这行中,"1"对应remote.conf 中的scancode,"BACK" 就是需要在后面keycodeLabels.h中定义的字串,新增按键可以自定义这个字串,比如RED。  
  6. 4) frameworks/base/include/ui/KeycodeLabels.h,在KEYCODES[]数组后面顺序添加:  
  7.   ...       
  8.   { "RED", 141},  
  9.   { NULL, 0 }  
  10.  注意:  
  11. a) 追加的按键须在末行的{ NULL, 0 }前面。 在这个地方,会将RED等这些字符串转换成数值、键值,传送到KeyEvent.java中。  
  12. b) RED后面的数值,需要与客户协商,客户APK应该专门处理这个新建的141值。  
  13. c) 141的值不应与其他keycode重复,建议新增键的取值依照上文的值,依次累加。  
  14. 5)在frameworks/base/core/res/res/values/attrs.xml中追加:  
  15.        <enum name="KEYCODE_RED" value="141" />  
  16. 6)在frameworks/base/core/java/android/view/KeyEvent.java中添加:  
  17.   public static final int KEYCODE_RED = 141;   
  18.  KeyEvent.java中添加的数值要与上面attrs.xml中的数值保持一致,如果是在最后面追加的话,需要注意修改LAST_KEYCODE的值 为最后一个。   
  19. 7)修改完后,需要在根目录下先执行make update-api更新current.xml(frameworks\base\api目录下)文件,再进行编译,否则会报错。

更多相关文章

  1. Android 底部虚拟按键颜色修改
  2. android 隐藏虚拟按键
  3. android string.xml中格式资源字符串
  4. Android dialog 去除虚拟按键
  5. Android下模拟按键输入
  6. android 中使用TextView实现分段显示不同颜色的字符串
  7. android 模拟按键
  8. android 解析xml字符串
  9. android字符串 优化(一)

随机推荐

  1. Android(安卓)getSystemService
  2. Android(安卓)地图
  3. Android计算器界面布局
  4. Android应用程序启动过程源代码分析(3)
  5. Android学习笔记_20_访问应用权限汇总
  6. MultiDex 遇到的大坑
  7. Android(安卓)Glide加载四周圆角图
  8. CheckedTextView 复选框左显示
  9. android 工程,点击图片,在屏幕显示
  10. Android(安卓)sensor 学习--sensor介绍