EthanShan · 2019年10月07日

Android 红外遥控器适配

红外遥控器协议简介

目前有如下几类标准

1. RC5
2. NEC
3. SAMSWNG
4. ......
5. SIRC (Sony Infrared Remote Control) 
目前RK平台只支持 NEC 协议.

NEC 协议如下所示

NEC 完整协议

NEC 默认协议采用32bit 帧格式来发送按键指令, 格式如下表
AddressComplement of AddressCommandComplement of Command
LSB-MSB(0-7)LSB-MSB(8-15)LSB-MSB(16-23)LSB-MSB(24-31)
NEC 逻辑1和0波形如下图

0,1波形

逻辑0: 562us 的高电平, 跟随 526us的低电平, 周期为1.125ms(小数约掉)
逻辑1: 562us 的高电平, 跟随 1.675us的低电平, 周期为2.25ms(小数约掉)

NEC 协议接收按键时运行过程如下

1. 持续9ms 的高电平, 然后4.5ms 的低电平(帧头)
2. 发送设备8bits 地址, 如: 10110001
3. 发送设备8bits 地址的逻辑反向值, 如: 01001110 (在RK平台, 把address和invert address两个字节作为usercode, 部分遥控器并未把invert address按照协议规范发送反码, 而是作为独立的一个byte)
4. 发送指令command 8bits, 如: 10001101
5. 发送指令command 8bits的逻辑反向值, 如: 01110010
6. 发送截至位, 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 set
1632 CONFIG_ROCKCHIP_REMOTECTL=y
1633 CONFIG_ROCKCHIP_REMOTECTL_PWM=y

在dts 中增加按键配置

一般配置前去要确认的信息:
1. 红外接收头连接的PWM 控制器序号, R800-P1 连接在PWM0
2. 配置的遥控器的用户码, 我们当前用的遥控器是 0xff00
3. 配置的遥控器的按键码, 我们当前用的遥控器按键码如下图

遥控器按键码

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 Settings
806  */
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>,            // 1
837             <0xee KEY_2>,            // 2
838             <0xed KEY_3>,            // 3
839             <0xb3 KEY_4>,            // 4
840             <0xa7 KEY_5>,            // 5
841             <0xe4 KEY_6>,            // 6
842             <0xe8 KEY_7>,            // 7
843             <0xb2 KEY_8>,            // 8
844             <0xf5 KEY_9>,            // 9
845             <0xe2 KEY_0>,            // 0
846             <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    POWER
key 113    VOLUME_MUTE                                                                                                                                                                                             
key 0x18e    PROG_RED
key 0x18f    PROG_GREEN
key 0x190    PROG_YELLOW
key 0x191    PROG_BLUE
key 104    PAGE_UP
key 109    PAGE_DOWN
key 115    VOLUME_UP
key 114    VOLUME_DOWN

key 139    MENU
key 105    DPAD_LEFT
key 103    DPAD_UP
key 106    DPAD_RIGHT
key 108    DPAD_DOWN
key 0x160    DPAD_CENTER
key 102    HOME
key 158    BACK
key 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    ENTER
key 111    DEL 
以上的配置项描述

列编号描述
1描述此配置为按键, 均为: key
2Linux 内核上报的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
推荐阅读
关注数
0
文章数
1
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息