android 中遥控器键值的添加和修改

本文介绍如何在Android系统中添加和修改遥控器按键功能,包括从红外信号到系统按键值的整个流程,以及具体步骤如配置文件的修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 中遥控器键值的添加和修改

原创 2013年09月09日 15:50:14

文章出处:http://blog.youkuaiyun.com/shift_wwx/article/details/11479705

请转载的朋友表明出处~~


前言: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

  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  
.....................
key 9     8
key 10    9
key 11    0
key 228   POUND
key 227   STAR
key 231   CALL
key 61    CALL
key 97    DPAD_CENTER
key 108   DPAD_DOWN
key 103   DPAD_UP
key 102   HOME
key 114   VOLUME_DOWN


 

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

  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. .........................................  
static const KeycodeLabel KEYCODES[] = {
    { "SOFT_LEFT", 1 },
     { "HOME", 3 },
    { "BACK", 4 },
    { "CALL", 5 },
    { "ENDCALL", 6 },
    { "0", 7 },
    { "1", 8 },
    { "2", 9 },
    { "3", 10 },
    { "4", 11 },
    { "5", 12 },
    { "STAR", 17 },
    { "POUND", 18 },
    { "DPAD_UP", 19 }, 
    { "VOLUME_UP", 24 },
.........................................


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

  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. ........   
...... 
#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 
........ 


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

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

 

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

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

 

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

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


补充说明:不同的android版本,可能添加的方式不一样,最近在看5.1的时候,发现机制又变了。留意keyevent.java中的注释部分即可。

【软件功能】 蓝牙遥控器软件,可以将你的手机变成一部电脑遥控器,使用手机可以控制电脑的鼠标操作、键盘的输入,如果你的手机具有手写功能,还可以将你的手机变成手写板。 这个软件分为两部分,一个是安装到手机上,另一个安装在电脑上。 手机端: 软件文件名为BtRemoteControl.jar,它要求安装的手机具有java功能,并支持MIDP2.0,具有蓝牙功能。 电脑端: 要想在电脑上运行遥控器,要求安装蓝牙驱动程序widcomm驱动或IVT BlueSoleil驱动。 同时,还要求电脑上安装.net运行库2.0,如果你的电脑没有安装,必须先安装Microsoft .NET Framework 2.0 。 【使用说明】 电脑端的安装使用: 蓝牙遥控器电脑端在电脑上安装后,双击图标桌面上产生的图标。 首先在“请选择接受遥控的蓝牙虚拟串口”后面,选择蓝牙的虚拟串口名字,软件里已经包括了从com1到com20的串口名字,请根据自己机器上的蓝牙虚拟串口名字选择,如果你无法确定,可以用手机上的蓝牙遥控器软件测试1下。 选择好串口名字后,点下“打开串口”按钮,将显示“蓝牙串口状态:"已打开,这时就可以接受手机方的控制了。 手机端的安装使用: 其它的JAVA程序在手机上的安装过程一样,先用蓝牙、红外线或数据线将手机与电脑连接,将BtRemoteControl.jar安装到手机,在手机的功能表里就会出现“蓝牙遥控器”标志,运行软件,会出现“启动蓝牙”选择,运行该选择,软件将搜索周围准备接受遥控的电脑上的蓝牙设备,搜索片刻后,将显示搜到蓝牙设备,并接着显示蓝牙设备上的蓝牙虚拟串口服务是否存在。 如果搜索后显示未找到蓝牙设备,请检查你的手机是否启动了蓝牙,你的电脑上的蓝牙驱动程序是否启动,蓝牙设备是否插好。 在找到蓝牙设备蓝牙上的虚拟串口后,手机上将会有如下3个菜单选择: 发送测试:用来测试电脑上的蓝牙虚拟串口是否可以接受数据,同时可以测试出蓝牙虚拟串口的名字,供电脑方的遥控软件设置使用,按下这个按钮,就可以向电脑的虚拟串口发送1个数据,测试串口。 控制鼠标键盘:选择了这个菜单,将显示遥控鼠标、键盘界面.这个选择有3个功能,用户可以按下#号键,在这三个功能之间切换,这三个功能: 1、遥控鼠标。手机方向键的上下左右四个键,控制鼠标上下左右移动,按下0键,遥控单击鼠标右键,按下9键,遥控单击鼠标左键,按下ok键,遥控双击鼠标左键。按下1,3,7个键,调整鼠标移动的距离,1键是短距离,3键是中距离,7键是长距离。 2、遥控鼠标自动移动。按下上下左右四个方向键,鼠标将按照操作自动上下左右移动,一直到屏幕的边缘才停止,按下*号键,停止自动运行。 3、遥控键盘。按下手机上的0到9号键,将向电脑发送命令0到9,在电脑上,可以进行设置,当接到命令时如何控制键盘。电脑端的操作如下图,选择接到命令时,要按下的按键,点“添加”按钮,就可以添加成功,选择后,殿下“删除”按钮,就可以删除: 文字输入:按下这个菜单,将可以输入文字到电脑。在手机中输入文字,然后点下“发送文字”按钮,就可以将文字发送到电脑了。
<think>我们正在RK3128 Android 7.1平台上适配红外遥控器(IR模块),目标是获取遥控器键值。根据参考信息,我们可以采用以下步骤: ### 一、内核层配置 1. **启用红外接收驱动**: - RK3128通常使用`rockchip_pwm_remotectl`驱动,需在内核中启用: ```bash Device Drivers ---> Input device support ---> [*] Keyboards ---> <*> Rockchip PWM remote controller ``` 2. **设备树配置**: - 在`dts`文件中添加红外节点(通常在`i2c0`或`pwm`节点附近): ```dts &pwm0 { status = "okay"; }; &remotectl { status = "okay"; handle_cpu_id = <1>; ir_key1 { rockchip,usercode = <0xff00>; // 用户码(需替换为实际值) rockchip,key_table = <0xeb KEY_POWER>, // 键值映射 <0xec KEY_MENU>, <0xfe KEY_BACK>; }; }; ``` - **关键参数**: - `rockchip,usercode`:遥控器的用户码(通过`ir-keytable`工具读取原始值) - `rockchip,key_table`:将原始键值映射到Linux键值(如`KEY_POWER`) ### 二、驱动调试与键值获取 1. **查看原始红外数据**: ```bash adb shell cat /sys/devices/platform/ff680030.pwm/remotectl/decoder # 路径可能不同 ``` 按下遥控器按键,观察输出的用户码键值。 2. **动态调试键值映射**(临时修改): ```bash echo "0xff00 0xeb 116" > /sys/class/remotectl/remotectl/keymap # 116=KEY_POWER ``` ### 三、Android键值映射 1. **创建按键布局文件**: - 在`/system/usr/keylayout/`下创建`Vendor_0001_Product_0001.kl`(文件名根据实际设备ID): ``` key 116 POWER WAKE key 139 MENU key 158 BACK ``` - **注意**:键值(如116)需与驱动上报的Linux键值一致。 2. **验证键值上报**: ```bash getevent -l # 查看原始事件 dumpsys input # 查看Android输入系统状态 ``` ### 四、优化建议(避免冗余设计) - **直接内核上报**:参考引用[2]的吐槽,应避免在用户态做中转,直接在内核驱动中完成键值映射并上报到`input`子系统。 ### 常见问题解决 1. **遥控无响应**: - 检查硬件连接(红外接收器是否接到正确的GPIO) - 确认设备树中`remotectl`的`pinctrl`配置正确: ```dts pinctrl-names = "default"; pinctrl-0 = <&ir_int>; ``` 2. **键值错误或重复**: - 调整驱动去抖参数(设备树中添加): ```dts rockchip,no_delay = <1>; // 禁用去抖(根据实际情况调整) ``` ### 相关问题 1. 如何获取遥控器的用户码原始键值? 2. RK3128的红外接收GPIO应该如何配置? 3. Android 7.1的按键事件处理流程是怎样的? 4. 如何为不同的遥控器动态加载键值映射? 5. 红外遥控响应延迟大如何优化? [^1]: RK3128红外驱动配置与键值映射方法 [^2]: Android输入子系统处理流程</think>### RK3128 Android 7.1 红外遥控器适配指南 #### 一、内核层配置 1. **启用红外驱动**: ```bash make menuconfig # 路径: Device Drivers ---> Input device support ---> [*] Keyboards ---> <*> Rockchip PWM remote controller # RK3128专用驱动 ``` 2. **设备树配置**(修改 `rk3128.dtsi`): ```dts &pwm0 { compatible = "rockchip,remotectl-pwm"; status = "okay"; interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; pinctrl-names = "default"; pinctrl-0 = <&pwm0_pin>; }; &remotectl { status = "okay"; handle_cpu_id = <1>; // CPU核心ID ir_key1 { rockchip,usercode = <0x7f80>; // 遥控器用户码(需实测) rockchip,key_table = <0xeb KEY_POWER>, // 键值映射表 <0xa3 KEY_MENU>, <0xec KEY_HOME>; }; }; ``` **关键参数**: - `usercode`:通过示波器或调试工具获取的遥控器标识码 - `key_table`:原始键值到Linux键值的映射表(如 `KEY_POWER=116`) #### 二、驱动调试与键值获取 1. **查看原始红外数据**: ```bash adb shell cat /sys/devices/platform/ff680030.pwm/remotectl/decoder # 查看原始键值 ``` 按下遥控器按键后,输出格式:`USERCODE=0x7f80, KEY=0xeb` 2. **动态调试键值映射**(临时修改): ```bash echo "0x7f80 0xeb 116" > /sys/class/remotectl/remotectl/keymap # 116=KEY_POWER ``` #### 三、Android键值映射 1. **创建按键布局文件**: - 在 `/system/usr/keylayout/` 下创建 `Vendor_ff00_Product_ff00.kl`: ``` key 116 POWER WAKE key 139 MENU key 102 HOME ``` **说明**:数字键值需与 `rockchip,key_table` 中定义的Linux键值一致 2. **键值转换原理**: ```mermaid graph LR 遥控器按键 --> 红外接收器 --> 内核驱动(rockchip_pwm_remotectl) 内核驱动 --> |原始键值| Linux输入子系统 输入子系统 --> |KEY_POWER| Android框架 Android框架 --> 应用层 ``` #### 四、固件烧写与验证 1. **编译内核**: ```bash ./build.sh -d rockchip/rk3128 -j8 -k ``` 2. **测试流程**: ```bash adb root && adb remount adb push Vendor_ff00_Product_ff00.kl /system/usr/keylayout/ adb reboot # 验证键值上报 adb shell getevent -l # 查看原始输入事件 adb shell dumpsys input # 查看Android输入系统状态 ``` #### 常见问题解决 1. **遥控无响应**: - 检查硬件连接:确认红外接收器连接到正确的PWM引脚(通常PWM0) - 验证时钟配置: ```dts &pwm0 { clocks = <&cru PLL_GPLL>, <&cru PCLK_PWM>; clock-names = "pwm", "pclk"; }; ``` 2. **键值错误**: - 重新校准用户码:使用逻辑分析仪捕获红外波形 - 调整去抖参数(设备树中添加): ```dts rockchip,no_delay = <1>; // 禁用去抖 ``` 3. **长按失效**: - 修改Android策略文件 `/frameworks/base/core/res/res/values/config.xml`: ```xml <integer name="config_longPressOnPowerBehavior">1</integer> ``` ### 相关问题 1. 如何获取遥控器的原始用户码键值? 2. RK3128的PWM接口与红外接收器如何硬件连接? 3. Android 7.1的按键事件处理流程是怎样的? 4. 如何为不同的遥控器动态加载键值映射表? 5. 红外遥控响应延迟大如何优化? [^1]: RK3128红外驱动配置与键值映射方法 [^2]: Android输入子系统事件处理流程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值