IR配置
1. 概述¶
IR是通过解析红外接收器接收到的高低电平组合来接受数据的,主要的IR协议格式有NEC、RC5和RC6。IR driver文件位于driver/sstar/ir文件夹下。
1.1. IR解码方式¶
通过IR设计,IR_IN信号可以通过四种解码模式进行解码:Full模式、Raw模式、SW模式和RC模式。如果IR_IN是NEC/ neclike格式,可以使用Full/Raw/SW模式解码。如果IR_IN是RC格式,可以用RC/SW模式解码。当IR_IN为other格式时,只能使用SW方式解码(目前驱动还不支持SW模式)。
-
Full mode
硬件可以识别IR_IN格式和用户代码是否填写请求,并向软件发送关键编码。
-
Raw mode
硬件只能识别IR_IN格式。它无法知道哪一部分是用户编码或关键编码。这需要由软件来决定。
-
SW mode
硬件无法从IR_IN识别任何格式。软件需要解码格式、用户编码和关键编码本身。
-
RC mode
像Full mode,但它用于RC格式。
从下面框图可以看出,红外译码主要有两种路径。上面的路径是Full/Raw/SW模式,下面的路径是RC模式。
图1-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
图1-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 cyclre time
图1-3 RC5 format standard
RC5-Extend format
- Same as RC5 expect the second bit of SB is represented the 6th bit of address code
图1-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.
图1-5 RC6 mode 0 format standard
2. Kernel相关配置¶
2.1. 配置padmux¶
IR的padmux配置只需要在对应的padmux.dtsi中加入或开启如下所示的配置代码。
<PAD_PM_IRIN PINMUX_FOR_PM_IR_IN_MODE_1 MDRV_PUSE_IR>
图2-1 padmux配置代码
2.2. Kernel下配置menuconfig¶
在kernel/路径下make menuconfig,需要打开的配置有如下三个:
-
Device Driver->Input device support->Generic input layer
图2-2 Generic input layer配置
-
Device Driver->Multimedia support->Remote Controller support
图2-3 Remote Controller support配置
-
Device Driver->SStar SoC platform drivers->SStar IR driver
图2-4 SStar IR driver配置
2.3. 修改驱动代码¶
-
IR_MSTAR_DTV.h文件下的IR_HEADER_CODE要和遥控器发送的IR信号的addr编码对应,否则不会对信号做解析,用户需要根据自己的遥控器协议更改,以下为示例:
图2-5 IR_HEADER_CODE配置示例
图2-6 逻辑分析仪解析的遥控器信号
-
rc_map_table的注册位于ms_ir.c文件的_mdrv_input_init函数下,用户需要根据自己的遥控器更改。
图2-7 rc_map_table注册内容示例
3. 调试与测试¶
3.1. 硬件连接¶
以SSD268G黑色板示例,所用的红外接收头型号是VS1738,红外和板子的连接要按图中引脚标号连接。
Vcc Gnd Out
图3-1 SSD268G黑色板接IR接收器示例
3.2. 编译烧录kernel¶
将编译好的kernel烧录到板子,查看/dev/input/目录下的文件,event0就是IR driver对应的节点,输入cat /dev/input/event0
,用遥控器发送信号可以看到命令行会有乱码打出。
图3-2 cat /dev/input/event0下接收到数据现象
3.3. Demo的使用¶
-
进入sdk/verify/mi_demo/source路径下输入指令make ir,对IR demo进行编译,将在sdk/verify/mi_demo/out/demo/app路径下生成prog_ir文件。
图3-3 编译IR demo生成的prog_ir文件
-
将生成的prog_ir文件拷贝到板子上运行,遥控器对着板子按下按键,log打印读取到的按下抬起信号和相关键值。遥控器每发送一次IR信号可以在/dev/input/event0读取到5次数据,依次是MISC信号、按下信号、sync信号(全0)、抬起信号、sync信号(全0)。如下图举例,是我们的遥控器测试结果,其中value即为cmd值,key的值即为cmd经过rc_map_table转换出的值,用户可以自行修改rc_map_table决定。
图3-4 运行prog_ir并接收到信号的log