红外遥控器协议简介
目前有如下几类标准
1. RC5
2. NEC
3. SAMSWNG
4. ......
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 地址, 如: 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 |
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