转自: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(安卓)dialog 去除虚拟按键
  4. Android下模拟按键输入
  5. [置顶] android orm映射框架(类似hibernate)基本使用
  6. OpenGL ES教程VI之纹理贴图(原文对照)
  7. android 模拟按键
  8. android使用ant编译打包
  9. [置顶] Android4.2.2自增物理按键(frameworks)

随机推荐

  1. live555移植到Android过程.
  2. [置顶] Android安全机制分析
  3. android studio 开发 Execution failed f
  4. [Android] Nexus 7 二代连接 Windows 7
  5. android 模拟器访问本机http服务IP地址问
  6. Android程序员学IOS-UI篇
  7. android listview的创建及行删除操作
  8. Android实现悬浮图片
  9. Android 内核源代码交叉编译(创建自己的
  10. Android 开发环境配置--实现第一个app “