Android(安卓)红外遥控器适配
16lz
2021-01-25
红外遥控器协议简介
目前有如下几类标准
1. RC52. NEC3. SAMSWNG4. ......5. SIRC (Sony Infrared Remote Control) 目前RK平台只支持 NEC 协议.
NEC 协议如下所示
NEC 默认协议采用32bit 帧格式来发送按键指令, 格式如下表
Address | Complement of Address | Command | Complement of Command |
---|---|---|---|
LSB-MSB(0-7) | LSB-MSB(8-15) | LSB-MSB(16-23) | LSB-MSB(24-31) |
NEC 逻辑1和0波形如下图
逻辑0: 562us 的高电平, 跟随 526us的低电平, 周期为1.125ms(小数约掉)逻辑1: 562us 的高电平, 跟随 1.675us的低电平, 周期为2.25ms(小数约掉)
NEC 协议接收按键时运行过程如下
1. 持续9ms 的高电平, 然后4.5ms 的低电平(帧头)2. 发送设备8bits 地址, 如: 101100013. 发送设备8bits 地址的逻辑反向值, 如: 01001110 (在RK平台, 把address和invert address两个字节作为usercode, 部分遥控器并未把invert address按照协议规范发送反码, 而是作为独立的一个byte)4. 发送指令command 8bits, 如: 100011015. 发送指令command 8bits的逻辑反向值, 如: 011100106. 发送截至位, 562us的高电平
红外接收头的原理
红外接接收头由 红外接收二极管/三极管/硅光电池组成, 它们将接收到的红外发射器的信号转换为电信号输出, 在通过PWM接收模块转换为数字信号.
RK3288 红外遥控器配置方法
使能驱动
RK3288 针对红外遥控器的驱动在 kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c在config 文件中对应的名称为 CONFIG_ROCKCHIP_REMOTECTL_PWM, 需要设置为buildin Mode
1631 # CONFIG_HALL_DEVICE is not set1632 CONFIG_ROCKCHIP_REMOTECTL=y1633 CONFIG_ROCKCHIP_REMOTECTL_PWM=y
在dts 中增加按键配置
一般配置前去要确认的信息:1. 红外接收头连接的PWM 控制器序号, R800-P1 连接在PWM02. 配置的遥控器的用户码, 我们当前用的遥控器是 0xff003. 配置的遥控器的按键码, 我们当前用的遥控器按键码如下图
dts 中的节点如下, 关键配置项描述如下表
字段名称 | 字段描述 |
---|---|
remote_pwd_id | 红外接收头连接的PWM控制器id, 这里是0 |
handle_cpu_id | 处理中断的cpu编号, 这里设置为cpu1 |
ir_key1 | 特定遥控器的配置信息 |
对于特定遥控器的配置信息, key_table的一项 <0xe7 KEY_POWER> 描述如下0xe7: 遥控器特定按键的按键码KEY_POWER: 按键码映射的Linux 内核input 系统定义的输入按键值, 定义在./include/dt-bindings/input/input.h
802 /*803 * Due to not have the software of PWM for remotectrl.804 * We can _*HACK*_ do that as the following.805 * TODO Settings806 */807 &pwm0 {808 compatible = "rockchip,remotectl-pwm";809 remote_pwm_id = <0>;810 811 handle_cpu_id = <1>;812 status = "okay";813 ir_key1{814 rockchip,usercode = <0xff00>;815 rockchip,key_table =816 <0xe7 KEY_POWER>,817 <0xa4 KEY_MUTE>,818 <0xa5 KEY_RED>,819 <0xf2 KEY_GREEN>,820 <0xf9 KEY_YELLOW>,821 <0xfd KEY_BLUE>,822 <0xad KEY_PAGEUP>,823 <0xaf KEY_PAGEDOWN>,824 <0xeb KEY_VOLUMEUP>,825 <0xef KEY_VOLUMEDOWN>,826 827 <0xfb KEY_MENU>,828 <0xb8 KEY_LEFT>,829 <0xb9 KEY_UP>,830 <0xb0 KEY_SETUP>,831 <0xea KEY_RIGHT>,832 <0xe9 KEY_DOWN>,833 <0xaa KEY_OK>,834 <0xb1 KEY_HOME>,835 <0xbf KEY_BACK>,836 <0xf0 KEY_1>, // 1837 <0xee KEY_2>, // 2838 <0xed KEY_3>, // 3839 <0xb3 KEY_4>, // 4840 <0xa7 KEY_5>, // 5841 <0xe4 KEY_6>, // 6842 <0xe8 KEY_7>, // 7843 <0xb2 KEY_8>, // 8844 <0xf5 KEY_9>, // 9845 <0xe2 KEY_0>, // 0846 <0xe3 KEY_ENTER>,847 <0xe1 KEY_DELETE>;848 };849 };
Android ir 映射配置文件
通过以上两步, 驱动层已经配置完毕, 但Android APP接收到的key code与驱动上报给 user space的 linux event key code 并不相同, 还需要增加Android input hal层的一个map 配置文件, 对于RK3288, 这个配置文件位于device/rockchip/common/ff680000_pwm.kl详细配置如下
key 116 POWERkey 113 VOLUME_MUTE key 0x18e PROG_REDkey 0x18f PROG_GREENkey 0x190 PROG_YELLOWkey 0x191 PROG_BLUEkey 104 PAGE_UPkey 109 PAGE_DOWNkey 115 VOLUME_UPkey 114 VOLUME_DOWNkey 139 MENUkey 105 DPAD_LEFTkey 103 DPAD_UPkey 106 DPAD_RIGHTkey 108 DPAD_DOWNkey 0x160 DPAD_CENTERkey 102 HOMEkey 158 BACKkey 141 SETTINGS 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 28 ENTERkey 111 DEL
以上的配置项描述
列编号 | 描述 |
---|---|
1 | 描述此配置为按键, 均为: key |
2 | Linux 内核上报的key code, 如10 |
3 | 映射为Android的key code,如ENTER |
调试技巧
获取遥控器按键码
通过如下指令开启驱动打印usercode 和 keycode
echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
打印日志如下, 从日志总看, usercode为0xff00, 按键码为aa
<6>[156027.207783] USERCODE=0xff00<6>[156027.234413] RMC_GETDATA=aa
获取驱动上报的linux key code
dts 配置好后, 按遥控器特定按键, 通过getevent指令, 获取按键上报的linux key code, 日志如下其中的0160 是上报的linux key code, 最后一个字段的1/0分别代表按键按下和松开
130|root@rk3288_box:/ # getevent add device 1: /dev/input/event5 name: "Weida Hi-Tech CoolTouch® System"add device 2: /dev/input/event1 name: "rk29-keypad"add device 3: /dev/input/event0 name: "ff680000.pwm"/dev/input/event0: 0001 0160 00000001/dev/input/event0: 0000 0000 00000000/dev/input/event0: 0001 0160 00000000/dev/input/event0: 0000 0000 00000000
- Github
- CSDN
- 简书
更多相关文章
- (转)Android(安卓)Building System 分析
- Android(安卓)Smali第一次完整的见面
- android 按键映射qwerty.kl文件中的WAKE和WAKE_DROPPED的定义
- android (三) 禁止按返回键,退出系统。
- Android(安卓)主题切换
- Android游戏开发系列教程第三讲(事件处理)
- Android自定义键盘之汉字键盘
- [置顶] Android(安卓)怎么退出整个应用程序?__以及__按键事件捕获
- Android(安卓)WebView封装及定制js的alert,confirm和prompt对话