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,需要打开的配置有如下三个:

  1. Device Driver->Input device support->Generic input layer

    图2-2 Generic input layer配置

  2. Device Driver->Multimedia support->Remote Controller support

    图2-3 Remote Controller support配置

  3. Device Driver->SStar SoC platform drivers->SStar IR driver

    图2-4 SStar IR driver配置


2.3. 修改驱动代码

  1. IR_MSTAR_DTV.h文件下的IR_HEADER_CODE要和遥控器发送的IR信号的addr编码对应,否则不会对信号做解析,用户需要根据自己的遥控器协议更改,以下为示例:

    图2-5 IR_HEADER_CODE配置示例

    图2-6 逻辑分析仪解析的遥控器信号

  2. 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的使用

  1. 进入sdk/verify/mi_demo/source路径下输入指令make ir,对IR demo进行编译,将在sdk/verify/mi_demo/out/demo/app路径下生成prog_ir文件。

    图3-3 编译IR demo生成的prog_ir文件

  2. 将生成的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