红外遥控器协议简介
目前有如下几类标准
- RC5
- NEC
- SAMSWNG
- ......
- SIRC (Sony Infrared Remote Control)
目前RK平台只支持 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,1波形](https://note.youdao.com/yws/res/206427/D321AFEA29E54610B19B2B8450FE1622)
逻辑0: 562us 的高电平, 跟随 526us的低电平, 周期为1.125ms(小数约掉)
逻辑1: 562us 的高电平, 跟随 1.675us的低电平, 周期为2.25ms(小数约掉)
NEC 协议接收按键时运行过程如下
- 持续9ms 的高电平, 然后4.5ms 的低电平(帧头)
- 发送设备8bits 地址, 如: 10110001
- 发送设备8bits 地址的逻辑反向值, 如: 01001110 (在RK平台, 把address和invert address两个字节作为usercode, 部分遥控器并未把invert address按照协议规范发送反码, 而是作为独立的一个byte)
- 发送指令command 8bits, 如: 10001101
- 发送指令command 8bits的逻辑反向值, 如: 01110010
- 发送截至位, 562us的高电平
# 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 中增加按键配置 一般配置前去要确认的信息:
- 红外接收头连接的PWM 控制器序号, R800-P1 连接在PWM0
- 配置的遥控器的用户码, 我们当前用的遥控器是 0xff00
- 配置的遥控器的按键码, 我们当前用的遥控器按键码如下图
dts 中的节点如下, 关键配置项描述如下表
字段名称 | 字段描述 |
---|---|
remotepwdid | 红外接收头连接的PWM控制器id, 这里是0 |
handlecpuid | 处理中断的cpu编号, 这里设置为cpu1 |
ir_key1 | 特定遥控器的配置信息 |
对于特定遥控器的配置信息, key_table的一项 <0xe7KEY_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 {
808compatible = "rockchip,remotectl-pwm";
809remote_pwm_id = <0>;
810
811handle_cpu_id = <1>;
812status = "okay";
813ir_key1{
814rockchip,usercode = <0xff00>;
815rockchip,key_table =
816<0xe7KEY_POWER>,
817<0xa4KEY_MUTE>,
818<0xa5KEY_RED>,
819<0xf2KEY_GREEN>,
820<0xf9KEY_YELLOW>,
821<0xfdKEY_BLUE>,
822<0xadKEY_PAGEUP>,
823<0xafKEY_PAGEDOWN>,
824<0xebKEY_VOLUMEUP>,
825<0xefKEY_VOLUMEDOWN>,
826
827<0xfbKEY_MENU>,
828<0xb8KEY_LEFT>,
829<0xb9KEY_UP>,
830<0xb0KEY_SETUP>,
831<0xeaKEY_RIGHT>,
832<0xe9KEY_DOWN>,
833<0xaaKEY_OK>,
834<0xb1KEY_HOME>,
835<0xbfKEY_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<0xe3KEY_ENTER>,
847<0xe1KEY_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 116POWER
key 113VOLUME_MUTE
key 0x18ePROG_RED
key 0x18fPROG_GREEN
key 0x190PROG_YELLOW
key 0x191PROG_BLUE
key 104PAGE_UP
key 109PAGE_DOWN
key 115VOLUME_UP
key 114VOLUME_DOWNkey 139MENU
key 105DPAD_LEFT
key 103DPAD_UP
key 106DPAD_RIGHT
key 108DPAD_DOWN
key 0x160DPAD_CENTER
key 102HOME
key 158BACK
key 141SETTINGS
key 21
key 32
key 43
key 54
key 65
key 76
key 87
key 98
key 109
key 110
key 28ENTER
key 111DEL
以上的配置项描述
列编号 | 描述 |
---|---|
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=https://www.it610.com/article/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
【Android 红外遥控器适配】
- Github
- CSDN
- 简书