红外遥控器协议简介

目前有如下几类标准

1. RC52. NEC3. SAMSWNG4. ......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 地址, 如: 101100013. 发送设备8bits 地址的逻辑反向值, 如: 01001110 (在RK平台, 把address和invert address两个字节作为usercode, 部分遥控器并未把invert address按照协议规范发送反码, 而是作为独立的一个byte)4. 发送指令command 8bits, 如: 100011015. 发送指令command 8bits的逻辑反向值, 如: 011100106. 发送截至位, 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 set1632 CONFIG_ROCKCHIP_REMOTECTL=y1633 CONFIG_ROCKCHIP_REMOTECTL_PWM=y

在dts 中增加按键配置

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

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 Settings806  */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>,            // 1837             <0xee KEY_2>,            // 2838             <0xed KEY_3>,            // 3839             <0xb3 KEY_4>,            // 4840             <0xa7 KEY_5>,            // 5841             <0xe4 KEY_6>,            // 6842             <0xe8 KEY_7>,            // 7843             <0xb2 KEY_8>,            // 8844             <0xf5 KEY_9>,            // 9845             <0xe2 KEY_0>,            // 0846             <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    POWERkey 113    VOLUME_MUTE                                                                                                                                                                                             key 0x18e    PROG_REDkey 0x18f    PROG_GREENkey 0x190    PROG_YELLOWkey 0x191    PROG_BLUEkey 104    PAGE_UPkey 109    PAGE_DOWNkey 115    VOLUME_UPkey 114    VOLUME_DOWNkey 139    MENUkey 105    DPAD_LEFTkey 103    DPAD_UPkey 106    DPAD_RIGHTkey 108    DPAD_DOWNkey 0x160    DPAD_CENTERkey 102    HOMEkey 158    BACKkey 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    ENTERkey 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
  • 简书

更多相关文章

  1. (转)Android(安卓)Building System 分析
  2. Android(安卓)Smali第一次完整的见面
  3. android 按键映射qwerty.kl文件中的WAKE和WAKE_DROPPED的定义
  4. android (三) 禁止按返回键,退出系统。
  5. Android(安卓)主题切换
  6. Android游戏开发系列教程第三讲(事件处理)
  7. Android自定义键盘之汉字键盘
  8. [置顶] Android(安卓)怎么退出整个应用程序?__以及__按键事件捕获
  9. Android(安卓)WebView封装及定制js的alert,confirm和prompt对话

随机推荐

  1. 一篇文章弄懂MySQL查询语句的执行过程
  2. 详解MySQL主从复制及读写分离
  3. MySQL 表空间碎片的概念及相关问题解决
  4. MySQL kill不掉线程的原因
  5. MySQL数字类型自增的坑
  6. 教你解决往mysql数据库中存入汉字报错的
  7. MySQL时间设置注意事项的深入总结
  8. MySQL创建高性能索引的全步骤
  9. 将图片保存到mysql数据库并展示在前端页
  10. MySQL的join buffer原理