IR使用参考
REVISION HISTORY¶
Revision No. | Description | Date |
---|---|---|
1.0 | 04/18/2023 | |
1.1 | 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模式。
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. 硬件连接介绍¶
将红外接收器按照原理图中指示方向连接到开发板。
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。
如果使用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版本支持可匹配的协议选择如下:
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转换后的键值。

7. API使用参考¶
暂无对外API。
8. FAQ¶
遥控器按下后没有触发Input事件,即hexdump /dev/input/event0
没有任何打印信息,可以从以下几方面排查:
8.1. IR驱动接收不到IR信号¶
-
检查padmux是否已经配置,详见配置padmux
-
检查kernel config是否配置完善,详见配置Kennel Config
-
检查DTS IR节点的
status
是否为ok
-
检查硬件原理图中IR Receiver中是否有需要短接的地方(如图5-9的JP55)
图5-9 IR硬件原理图 -
检查遥控器波形判断IR_IN信号是否符合NEC、RC5格式,并且当前的解码模式与源信号匹配
8.2. EVENT事件未触发¶
-
EV_MISC事件和EV_KEY事件均未触发,检查DTS的rc_map_table,键值对左列的码值是否与遥控器发出的一致
-
EV_MISC事件触发,EV_KEY事件未触发,检查DTS的rc_map_table,键值对左列的码值是否一一对应右列的input event code,并且被kernel支持
-
若解码模式为SW,确认遥控器所属协议的decoder是否编译