Android 红外遥控器适配


红外遥控器协议简介 目前有如下几类标准

  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,1波形](https://note.youdao.com/yws/res/206427/D321AFEA29E54610B19B2B8450FE1622)

逻辑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 中的节点如下, 关键配置项描述如下表

字段名称 字段描述
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
  • 简书

    推荐阅读