IR使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 2022/10/26 |
1. 概述¶
IR是通过解析红外接收器接收到的高低电平组合来接受数据的,主要的IR协议格式有NEC、RC5和RC6。IR driver文件位于driver/sstar/ir文件夹下。
1.1. IR解码方式¶
根据当前SigmaStar IR设计,IR_IN信号可以通过四种解码模式进行解码:Full模式、Raw模式、SW模式和RC模式。当IR_IN信号是NEC/NEC-like格式,可以使用Full/Raw/SW模式解码。当IR_IN信号是RC格式,可以用RC/SW模式解码(目前驱动只支持RC5格式)。当IR_IN信号为other格式时,只能使用SW方式解码(需要搭配解码器才可使用)。
-
Full mode
硬件可以识别IR_IN信号格式和用户代码是否填写请求,并向软件发送关键编码。
-
Raw mode
硬件只能识别IR_IN信号格式。它无法知道哪一部分是用户编码或关键编码。这需要由软件来决定。
-
SW mode
硬件无法从IR_IN信号识别任何格式。软件需要解码格式、用户编码和关键编码本身。
-
RC mode
像Full mode,但它用于RC格式。
从下面框图可以看出,红外译码主要有两种路径。上面的路径是Full/Raw/SW模式,下面的路径是RC模式。
图1 IR decode block diagram
1.2. 各协议电平标准¶
NEC format:
-
Logic0 : 0.56ms high + 0.56ms low
-
Logic1 : 0.56ms high + 1.68ms low
-
Header code : 9ms high pulse
-
Off code : 4.5ms low pulse:
-
Customer code : 8-bits customer code + 8-bits inverse or 16-bits customer code
-
Command code : 8-bits command code + 8-bits inverse
-
Total cycle time : 108ms
-
Repeat key : 9ms Header code and 2.5ms Off code
图2 NEC format standard
NEC-like format:
-
Logic0 : short high + short low (usually 1:1)
-
Logic1 : short high + long low (usually 1:3)
-
Header code : ultra long high width
-
Off code : ultra long low width
RC5 format:
-
Logic0 : 888us high + 888us low (Manchester code)
-
Logic1 : 888us low + 888us high (Manchester code)
-
Start bits : 2-bits logic1
-
Toggle bit : Inverted every time when the key is released and pressed again
-
Customer code : 5-bits customer code
-
Command code : 6-bits command code
-
Total cycle time : 114ms
-
If a key is held over 114ms, it will repeat the signal every cycle time
图3 RC5 format standard
RC5-Extend format:
- Same as RC5 expect the second bit of SB is represented the 6th bit of address code
图4 RC5-Extend format standard
RC6 mode 0 format:
-
Logic0 : 444us low + 444us high (Manchester code)
-
Logic1 : 444us high + 444us low (Manchester code)
(Note the logic length is half of RC5 format and the level order is opposite)
-
Header code : 2.666ms high pulse + 888us low pulse
-
Start bit : 1-bit logic1
-
Mode bits : 3-bit logic0 (in mode 0)
-
Toggle bit : Inverted every time when the key is released and pressed again
-
Customer code : 8-bits customer code
-
Command code : 8-bits key code
-
If a key is held over 114ms, it will repeat the signal every cycle time.
图5 RC6 mode 0 format standard
2. 基于alkaid平台配置Kernel¶
2.1. 配置padmux¶
IR的padmux配置只需要在对应的padmux.dtsi中加入或开启如下所示的配置代码。第一列为引脚索引号,可以在/drivers/sstar/inlcude/{chipname}/gpio.h中查到;第二列为模式定义,在/drivers/sstar/gpio/{chipname}/mhal_pinmux.c中m_stPadMuxTbl数组里,罗列了所有引脚的复用关系,查询该引脚支持哪些复用功能可以查询该数组;第三列为引脚及搭配模式的索引名称,可在/drivers/sstar/include/mdrv_puse.h里查询。
1. <PAD_PM_IR_RX PINMUX_FOR_IR_IN_MODE_1 MDRV_PUSE_IR> //IR0 2. 3. <PAD_OUTP_TX0_CH_0 PINMUX_FOR_IR0_MODE_1 MDRV_PUSE_IR1> //IR1 4. <PAD_SR_IO0 PINMUX_FOR_IR0_MODE_2 MDRV_PUSE_IR1> //IR1 5. <PAD_SAR_ADC_20 PINMUX_FOR_IR0_MODE_3 MDRV_PUSE_IR1> //IR1 6. 7. <PAD_OUTN_TX0_CH_0 PINMUX_FOR_IR1_MODE_1 MDRV_PUSE_IR2> //IR2 8. <PAD_SR_IO1 PINMUX_FOR_IR1_MODE_2 MDRV_PUSE_IR2> //IR2 9. <PAD_SAR_ADC_21 PINMUX_FOR_IR1_MODE_3 MDRV_PUSE_IR2> //IR2 10. 11. 12. <PAD_OUTP_TX0_CH_1 PINMUX_FOR_IR2_MODE_1 MDRV_PUSE_IR3> //IR3 13. <PAD_SR_IO2 PINMUX_FOR_IR2_MODE_2 MDRV_PUSE_IR3> //IR3 14. <PAD_SAR_ADC_22 PINMUX_FOR_IR2_MODE_3 MDRV_PUSE_IR3> //IR3 15. 16. <PAD_OUTN_TX0_CH_1 PINMUX_FOR_IR3_MODE_1 MDRV_PUSE_IR4> //IR4 17. <PAD_SR_IO3 PINMUX_FOR_IR3_MODE_2 MDRV_PUSE_IR4> //IR4 18. <PAD_SAR_ADC_23 PINMUX_FOR_IR3_MODE_3 MDRV_PUSE_IR4> //IR4
2.2. Kernel下配置menuconfig¶
在编译kernel时:make menuconfig,需要打开配置如下:
Device Driver-> <*> SStar SoC platform drivers-> <*> SStar IR driver
图6 SStar IR driver配置
Device Driver-> Input device support-> <*> Generic input layer(needed for keyboard, mouse….)
图7 Generic input layer配置
如果使用SW模式,需要搭配decoder使用,可以选择Kernel的decoder解码,以NEC协议举例:
Device Driver-> <*> Remote Controller support-> <*> Remote Controller decoders-> <*> Enable IR raw decoder for the NEC protocol
图8 Remote Controller decoders配置
2.3. 配置dts及自定义遥控器¶
IR的dts配置只需要在对应的chipname.dtsi中配置如下信息(可以根据需求选择性配置IR设备的数量,最多可以同时配置5组IR设备):
图9 IR0 DTS配置
图10 IR1 DTS配置
图11 IR2 DTS配置
图12 IR3 DTS配置
图13 IR4 DTS配置
IR DTS配置说明:
属性 | 描述 | 设定值 | 备注 |
---|---|---|---|
compatible | 匹配驱动进行驱动注册 | 详见DTS配置图 | 禁止修改 |
reg | 设定寄存器bank地址 | 详见DTS配置图 | 不需要修改 |
interrupts | 设定中断号及属性 | 详见DTS配置图 | 不需要更改 |
clocks | 设定时钟源 | 详见DTS配置图 | 不需要更改 |
group | 设定IR外设编号序列号 | 详见DTS配置图 | 不需要修改 |
mode | 设定初始化解码模式 | ½/¾对应FULL/RAW/RC5/SW | 可根据需要修改 |
protocol | 匹配decoder的协议 | 详见图16 | 可根据需要修改 |
rc-name | 设定RC设备的driver name | 任意字符串 | 可根据需要修改 |
input-name | 设定RC设备的device name | 任意字符串 | 可根据需要修改 |
map-name | 设定RC设备的keymap name | 任意字符串 | 可根据需要修改 |
vendor-id | 设定RC设备input id属性 | 0x0000~0XFFFF,可用于区分遥控器 | 可根据遥控器设定更改 |
product-id | 设定RC设备input id属性 | 0x0000~0XFFFF,可用于区分遥控器 | 可根据遥控器设定更改 |
header-code | 遥控器发送的用户编码及其反码 | 0x00~0xFF,不同遥控器的编码不同 | 可用LA获取如图14 |
rc-map-table | 遥控器发送的关键编码及对应的键值 | 0x0000~0X00FF,不同遥控器的编码及对应键值不同 | 格式参考DTS配置图 |
status | 选择是否使能IR驱动 | "ok" or "disable" | 可根据需要修改 |
图14 逻辑分析仪解析的遥控器信号
其余rc_dev的其余属性位于drv_ir.c文件的drv_input_init函数下,用户可根据自己的遥控器参数更改:
图15 自定义遥控器属性配置
如果使用SW模式,make menuconfig配置kernel原生的decoder或者自己编写解码器后,需要在dts修改属性"protocol",以匹配decoder,以NEC协议举例:
1. protocol = <9>;
kernel原生支持可匹配的协议选择:
图16 kernel定义的rc_proto选项
3. 调试与测试¶
3.1. 硬件连接¶
将红外接收头按照原理图中指示方向连接到开发板。
图17 IR接收器(group 0)安装示例
图18 IR接收器(group 1)安装示例
图19 IR接收器(group 2)安装示例
图20 IR接收器(group 3)安装示例
图21 IR接收器(group 4)安装示例
3.2. 编译烧录kernel¶
将编译好的kernel烧录到板子,查看/dev/input/目录下的文件,event0就是IR driver对应的节点,输入cat /dev/input/event0,用遥控器发送信号可以看到命令行会有乱码打出(配置几组IR设备就对应有几个event节点)。
图22 cat /dev/input/event0下接收到数据现象
Android环境下IR驱动会在/dev/input/目录下生成对应的event文件,通过getevent可获取每个event的设备名称来确认对应关系(如图23,驱动配置5组IR设备,分别对应event2~event6),用遥控器发送信号可以查看IR的command code及遥控器键值。
图23 getevent查看event对应关系
图24 遥控器发送信号后获取的键值
目前支持在user space切换IR的解码模式,查看/sys/class/mstar目录下的文件,配置几组IR设备就对应有几个ir节点,echo [mode] > decode_mode可切换IR的解码模式,mode输入值可为:1 (FULL), 2 (RAW), 3 (RC5), 4 (SW)。
图25 cat /sys/class/mstar/ir0/config的结果
如图26举例,是我们用测试APP接收到的我们的遥控器信号,可以看到遥控器每发送一次IR信号可以在/dev/input/event0读取到5次数据,依次是MISC信号(value中的值是实际IR波形的cmd值)、按下信号(type=1 ,value=1,code中的值是cmd值经过rc_map_table转换的值)、sync信号(全0)、抬起信号(type=1,value=0,code中的值是cmd值经过rc_map_table转换的值)、sync信号(全0)。具体值的转换结果根据用户自行修改rc-map-table决定。
图26 测试APP接收到数据的结果示例
3.3. Demo的使用¶
进入driver/sstar/ir/ut路径下输入指令make,对ir_ut.c编译,将在该路径下生成ir_ut文件。
图27 编译ir_ut.c生成的文件
将生成的ir_ut文件拷贝到板子上运行,输入./ir_ut [group][mode]
,例如输入./ir_ut 0 1
,即测试IR0解码模式为FULL时的功能,遥控器对着板子按下按键,log打印读取到的按下抬起信号和相关键值。如图28举例,是我们的遥控器测试结果,其中value即为cmd值,key值即为cmd经过rc-map-table转换后的键值。
图28 运行ir_ut并接收到信号的log