IR使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 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