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的一项 <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

    
  • Github
  • CSDN
  • 简书

你可能感兴趣的:(Android)