IR使用参考


REVISION HISTORY

Revision No. Description Date
1.0
  • Initial release
  • 04/18/2023
    1.1
  • 增加第八章DEBUG&FAQ
  • 04/08/2025

    1. 概述

    Infrared Receiver(红外接收器,下文简称IR),主要用于解析红外遥控器发出的信号,即一连串的二进制脉冲码;为了使红外信号在无线传输过程中免受其他信号的干扰,通常是先将其调制在特定的载波频率(38KHZ)后再经红外发射二极管发射出去,IR则要滤除其他杂波后接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调;SigmaStar IR支持的解码方式有Full、Raw、SW、RC,支持的协议有NEC、RC5和RC6

    2. 关键字说明

    暂无。

    3. 功能描述

    3.1. 基本功能

    • 支持5组IR硬件

    • 低于小于170us的脉冲信号会被过滤

    • 默认使用的时钟频率为12MHZ,不支持时钟调整

    • 支持的解码模式为Full、Raw、SW、RC5(注意RC6软件暂未支持),配置详见IR DTS配置说明

    3.2. IR解码方式

    SigmaStar的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

      硬件可以解码NEC/NEC-like格式的IR_IN信号,并识别出用户编码和关键编码。

    • Raw mode

      硬件可以解码NEC/NEC-like格式的IR_IN信号,但无法识别出哪一部分是用户编码或关键编码,这需要由软件来决定。

    • SW mode

      硬件无法从IR_IN信号识别任何格式,需要软件解码信号格式、用户编码和关键编码。

    • RC mode

      硬件可以解码RC格式的IR_IN信号,并识别出用户编码和关键编码。

    从下面框图可以看出,红外译码主要有两种路径。上面的路径是Full/Raw/SW模式,下面的路径是RC模式。

    图2-1 IR decode block diagram

    3.3. 各协议电平标准

    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-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

      图2-3 RC5 format standard

    RC5-Extend format:

    • Same as RC5 expect the second bit of SB is represented the 6th bit of address code

      图2-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.

      图2-5 RC6 mode 0 format standard

    4. 硬件连接介绍

    将红外接收器按照原理图中指示方向连接到开发板。

    图4-1 IR硬件原理图

    5. Uboot用法介绍

    不支持。

    6. Kernel用法介绍

    驱动路径:kernel/drivers/sstar/ir

    6.1. 配置Kennel Config

    在编译kernel时需要选择的配置如下:

    如果不使用SW模式,仅需配置如下两处config:

    Device Driver->
    
        <*> SStar SoC platform drivers->
    
            <*> Sstar IR driver
    
    Device Driver->
    
        Input device support->
    
            <*> Generic input layer(needed for keyboard, mouse….)
    

    如果使用SW模式,则需要搭配decoder使用,可以选择Kernel的decoder解码,以NEC协议举例:

    Device Driver->
    
        <*> Remote Controller support->
    
            <*> Remote Controller decoders->
    
                <*> Enable IR raw decoder for the NEC protocol
    

    6.2. 配置DTS

    IR的DTS配置只需要在对应的chipname.dtsi中配置如下信息:

    ir4: ir@1F007A00 {
        compatible = "sstar,ir";
        reg = <0x1F007A00 0x200>;
        clocks = <&CLK_ir>;
        interrupts = <GIC_SPI INT_FIQ_IR IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI INT_FIQ_IR_RC IRQ_TYPE_LEVEL_HIGH>;
        group = <4>;
        /*
         * decode mode selection
         * FULL   1  Format: NEC/NECX
         * RAW    2  Format: NEC/NECX
         * RC5    3  Format: RC5
         * SW     4  Format: /
         */
        mode = <2>;
        //choose enum rc_proto for sw mode
        protocol = <9>;
        vendor = <0x000E>;
        product = <0x3412>;
        //rc-map-table = <customer_code + command_code  input_key_code>
        rc-map-table =
            //NEC Remote Control NO.1
            <0x00FFA8 KEY_POWER>,          <0x00FFC0 KEY_F5>,            <0x00FFDD KEY_GREEN>,
            <0x00FF44 KEY_F19>,            <0x00FFCA KEY_UP>,            <0x00FFD2 KEY_DOWN>,
            <0x00FF99 KEY_LEFT>,           <0x00FFC1 KEY_RIGHT>,         <0x00FFCE KEY_ENTER>,
            <0x00FFCB KEY_BACK>,           <0x00FF87 KEY_HOMEPAGE>,      <0x00FF97 KEY_COMPOSE>,
            <0x00FF41 KEY_PLAYPAUSE>,      <0x00FF0F KEY_F16>,           <0x00FF60 KEY_F20>,
            <0x00FF90 KEY_VOLUMEUP>,       <0x00FF98 KEY_VOLUMEDOWN>,    <0x00FFD1 KEY_MUTE>,
            //NEC Remote Control NO.2
            <0x807F46  KEY_POWER>,          <0x807F50  KEY_0>,           <0x807F49  KEY_1>,
            <0x807F55  KEY_2>,              <0x807F59  KEY_3>,           <0x807F4D  KEY_4>,
            <0x807F51  KEY_5>,              <0x807F5D  KEY_6>,           <0x807F48  KEY_7>,
            <0x807F54  KEY_8>,              <0x807F58  KEY_9>,           <0x807F47  KEY_RED>,
            <0x807F4B  KEY_GREEN>,          <0x807F57  KEY_YELLOW>,      <0x807F5B  KEY_BLUE>,
            <0x807F52  KEY_UP>,             <0x807F13  KEY_DOWN>,        <0x807F06  KEY_LEFT>,
            <0x807F1A  KEY_RIGHT>,          <0x807F0F  KEY_ENTER>,       <0x807F1F  KEY_CHANNELUP>,
            <0x807F19  KEY_CHANNELDOWN>,    <0x807F16  KEY_VOLUMEUP>,    <0x807F15  KEY_VOLUMEDOWN>,
            <0x807F03  KEY_PAGEUP>,         <0x807F05  KEY_PAGEDOWN>,    <0x807F17  KEY_HOME>,
            <0x807F07  KEY_MENU>,           <0x807F1B  KEY_BACK>,        <0x807F5A  KEY_MUTE>,
            <0x807F0D  KEY_RECORD>,         <0x807F42  KEY_HELP>,        <0x807F14  KEY_INFO>,
            <0x807F40  KEY_KP0>,            <0x807F04  KEY_KP1>,         <0x807F0E  KEY_REWIND>,
            <0x807F12  KEY_FORWARD>,        <0x807F4C  KEY_ZOOM>,        <0x807F02  KEY_PREVIOUSSONG>,
            <0x807F1E  KEY_NEXTSONG>,       <0x807F01  KEY_PLAY>,        <0x807F1D  KEY_PAUSE>,
            <0x807F11  KEY_STOP>,           <0x807F44  KEY_AUDIO>,       <0x807F56  KEY_CAMERA>,
            <0x807F5C  KEY_CHANNEL>,        <0x807F45  KEY_SLEEP>,       <0x807F4A  KEY_EPG>,
            <0x807F10  KEY_LIST>,           <0x807F53  KEY_SUBTITLE>,    <0x807F41  KEY_FN_F1>,
            <0x807F4E  KEY_FN_F2>,          <0x807F0A  KEY_FN_F3>,       <0x807F09  KEY_FN_F4>,
            <0x807F1C  KEY_FN_F5>,          <0x807F08  KEY_FN_F6>,       <0x807F0B  KEY_F1>,
            <0x807F18  KEY_F2>,             <0x807F00  KEY_F3>,          <0x807F0C  KEY_F4>,
            <0x807F4F  KEY_F5>,             <0x807F5E  KEY_F6>,          <0x807F43  KEY_F7>,
            <0x807F5F  KEY_F8>,             <0x807FFE  KEY_POWER2>,      <0x807FFF  KEY_OK>,
            //RC5 Remote Control
            <0x150C  KEY_POWER>,          <0x153F  KEY_AUX>,         <0x141D  KEY_MEDIA_REPEAT>,
            <0x141C  KEY_SHUFFLE>,        <0x100D  KEY_MUTE>,        <0x104F  KEY_F4>,
            <0x143F  KEY_F1>,             <0x112D  KEY_F2>,          <0x112E  KEY_F3>,
            <0x1010  KEY_VOLUMEUP>,       <0x1011  KEY_VOLUMEDOWN>,  <0x1521  KEY_PREVIOUSSONG>,
            <0x1520  KEY_NEXTSONG>,       <0x1536  KEY_PAUSE>,       <0x1535  KEY_PLAY>,
            <0x151F  KEY_BACK>,           <0x151E  KEY_FORWARD>,     <0x1063  KEY_MAX>,
            <0x1040  KEY_F6>,             <0x1120  KEY_CHANNELUP>,   <0x1121  KEY_CHANNELDOWN>;
        status = "ok";
    };
    

    IR DTS配置说明

    属性 描述 设定值 备注
    compatible 匹配驱动进行驱动注册 "sstar,ir" 禁止修改
    reg 设定寄存器bank地址 <0x1F007A00 0x200> 禁止修改
    interrupts 设定中断号及属性 INT_FIQ_IR , INT_FIQ_IR_RC 禁止修改
    clocks 设定时钟源 <&CLK_ir> 不需要更改
    group 设定IR硬件编号序列号 0 不需要修改
    mode 设定初始化时的解码模式 ½/¾对应FULL/RAW/RC5/SW 可根据需要修改
    protocol SW模式下匹配decoder的协议 详见图5-5 rc_proto选项 可根据需要修改
    vendor 设定RC设备input id属性 0x0000~0XFFFF,可用于区分遥控器 可根据遥控器设定更改
    product 设定RC设备product属性 0x0000~0XFFFF,可用于区分遥控器 可根据遥控器设定更改
    rc-map-table 遥控器发送的码值及对应的Input event codes 0x00FFA8:高16位是用户编码,低8位是关键编码;KEY_POWER:Input event codes 可以设定不同遥控器的map table
    status 选择是否使能IR驱动 "ok" or "disable" 可根据需要修改

    结合图5-4所示,说明rc-map-table填写:

    ADDR + IADDR:0x807F,即用户编码为0x807F;

    CMD:0x4A,即关键编码为0x4A;

    因此rc-map-table键值对左列填写的数值为0x807F4A,右列填入想要上报的某一个Input event codes。

    图5-4 逻辑分析仪解析的遥控器信号

    如果使用SW模式,make menuconfig配置kernel原生的decoder或者自己编写解码器后,需要在DTS修改如下配置:

    属性"rc-map-table"的用户编码如果是高8位和低八位互补,kernel原生的decoder会将上报的用户编码做处理,需要按如下举例修改:

    <0x00FFA8 KEY_POWER> -> <0x00A8 KEY_POWER>
    

    属性"protocol",以匹配decoder,以NEC协议举例:

    protocol = <9>;
    

    kernel 5.10版本支持可匹配的协议选择如下:

    图5-5 rc_proto选项

    6.3. 配置padmux

    IR的padmux配置只需要根据选择的引脚在对应的pcupid-xxxx-padmux.dtsi中加入如下所示的代码(只需配置一种MODE):

    <PAD_GPIOC_00 PINMUX_FOR_IR0_IN_MODE_1   MDRV_PUSE_IR>,
    <PAD_GPIOC_01 PINMUX_FOR_IR1_IN_MODE_1   MDRV_PUSE_IR1>,
    <PAD_GPIOC_02 PINMUX_FOR_IR2_IN_MODE_1   MDRV_PUSE_IR2>,
    <PAD_GPIOC_03 PINMUX_FOR_IR3_IN_MODE_1   MDRV_PUSE_IR3>,
    <PAD_PM_GPIO2 PINMUX_FOR_PM_IR_IN_MODE_1 MDRV_PUSE_IR4>,
    

    第一列为引脚索引号,可以在/drivers/sstar/inlcude/pcupid/gpio.h中查到;

    第二列为模式定义,在/drivers/sstar/gpio/pcupid/hal_pinmux.c中m_hal_gpio_st_padmode_info_tbl数组里,罗列了所有引脚的复用关系,查询该引脚支持哪些复用功能可以查询该数组;

    第三列为引脚及搭配模式的索引名称,可在/drivers/sstar/include/drv_puse.h里查询。

    6.4. 模块使用介绍

    IR驱动会在/dev/input/目录下生成对应的event文件,可通过操作event接口获取驱动解码后并上报给input系统的键值:

    • linux环境下获取键值:输入hexdump /dev/input/event0,用遥控器发送信号即可看到图5-6的信息(配置几组IR设备就对应有几个event节点)。

      图5-6 /dev/input/event0下接收到数据现象

    • 目前支持在user space切换IR的解码模式,查看/sys/class/sstar目录下的文件,配置几组IR设备就对应有几个ir节点,echo [mode] > decode_mode可切换IR的解码模式,mode输入值可为:1→FULL、2→RAW、3→RC5、4→SW

      图5-7 cat /sys/class/sstar/ir0/decode_mode的结果

    6.5. Sample code

    进入driver/sstar/ir/ut路径下输入指令make,编译ut_ir.c,将在该路径下生成ut_ir文件。

    ut_ir.c主要是通过读evet接口获取input事件类型和键值,并通过struct input_event将信息传到用户态,遥控器每发送一次IR信号,input_event的事件类型type会按如下顺序变化:EV_MSC->EV_KEY->EV_SYN->EV_KEY->EV_SYN。

    Type Code Value
    EV_MSC MSC_SCAN(0x4) 码值
    EV_SYN SYN_REPORT(0x0) 0x0
    EV_KEY 码值在rc_map_table对应的键值 1:按下 0:抬起

    将生成的ut_ir文件拷贝到板子上运行,输入./ut_ir [group][event][mode] [count]count为按下遥控器按键的次数,例如输入./ut_ir 0 event0 1 5,即测试IR0解码模式为FULL时的功能,遥控器对着IR按下按键,log打印读取到的按下抬起信号和相关键值。如图5-8的遥控器测试结果,其中EV_MSC为遥控器信号经过IR解码后的码值,EV_KEY_DONW/EV_KEY_UP值即为码值经过rc-map-table转换后的键值。

    图5-8 运行ut_ir并接收到信号的log

    7. API使用参考

    暂无对外API。

    8. FAQ

    遥控器按下后没有触发Input事件,即hexdump /dev/input/event0没有任何打印信息,可以从以下几方面排查:

    8.1. IR驱动接收不到IR信号

    1. 检查padmux是否已经配置,详见配置padmux

    2. 检查kernel config是否配置完善,详见配置Kennel Config

    3. 检查DTS IR节点的status是否为ok

    4. 检查硬件原理图中IR Receiver中是否有需要短接的地方(如图5-9的JP55)

      图5-9 IR硬件原理图

    5. 检查遥控器波形判断IR_IN信号是否符合NEC、RC5格式,并且当前的解码模式与源信号匹配

    8.2. EVENT事件未触发

    1. EV_MISC事件和EV_KEY事件均未触发,检查DTS的rc_map_table,键值对左列的码值是否与遥控器发出的一致

    2. EV_MISC事件触发,EV_KEY事件未触发,检查DTS的rc_map_table,键值对左列的码值是否一一对应右列的input event code,并且被kernel支持

    3. 若解码模式为SW,确认遥控器所属协议的decoder是否编译