RTOS_IR使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 01/25/2024 |
1. 概述¶
Infrared Receiver(红外接收器,下文简称IR),主要用于解析红外遥控器发出的信号,即一连串的二进制脉冲码;为了使红外信号在无线传输过程中免受其他信号的干扰,通常是先将其调制在特定的载波频率(38KHZ)后再经红外发射二极管发射出去,IR则要滤除其他杂波后接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调;SigmaStar IR支持的解码方式有Full、Raw、SW、RC,支持的协议有NEC、RC5和RC6。
2. 解码方式及协议说明¶
2.1. 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.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-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
3. 功能描述¶
-
支持一组IR硬件
-
低于小于170us的脉冲信号会被过滤
-
默认使用的时钟频率为12MHZ,不支持时钟调整
-
支持的解码模式为Full、Raw、SW、RC5(注意RC6软件暂未支持)
4. 硬件连接介绍¶
将红外接收器按照原理图中指示方向连接到开发板。
5. RTOS用法介绍¶
5.1. DRIVER PATH¶
sc/driver/sysdriver/ir/os/ir_os.h sc/driver/sysdriver/ir/drv/pub/drv_ir.h sc/driver/sysdriver/ir/drv/src/drv_ir.c sc/driver/sysdriver/ir/drv/src/drv_ir_test.c sc/driver/sysdriver/ir/hal/chipname/src/hal_ir.c sc/driver/sysdriver/ir/hal/chipname/inc/hal_ir.h sc/driver/sysdriver/ir/hal/chipname/inc/hal_ir_cfg.h
5.2. CONFIG配置¶
#make menuconfig BSP Driver Options ---> <*> Support IR driver
5.3. SYSDESC配置¶
iford_xxx.sys文件是RTOS用于描述外设硬件属性的文件,外设节点中包含的属性值可用于外设的配置,类似Linux的设备树,该文件位于sc/driver/sysdriver/sysdesc/hal/iford/pub
<ir0> [reg_u32_u16] 0x1F007A00 0x200; [interrupts_u32_u32] INT_FIQ_IR INT_FIQ_IR_RC; [camclk_u32] CAMCLK_ir; [status_u8] 1;
属性 | 描述 | 设定值 | 备注 |
---|---|---|---|
reg_u32_u16 | 指定bank地址 | 0x1F007A00 | 禁止修改 |
interrupts_u32_u32 | 指定中断号 | INT_FIQ_IR INT_FIQ_IR_RC | 禁止修改 |
camclk_u32 | 指定时钟源 | CAMCLK_ir | 不需要修改 |
status_u8 | 选择是否使能驱动 | 1-enable;0-disable | 可根据需要修改 |
5.4. PADMUX配置¶
方法一:CONFIG_PADMUX_SUPPORT=Y
该方法通过使能PADMUX驱动,在iford-xxx-padmux.c
文件配置引脚复用功能,该文件位于sc/driver/sysdriver/padmux/hal/iford/src
,只需要在对应的schematic
属性添加如下内容中设定(只需要选择一种MODE):
pad_info_t schematic[] = { {PAD_PM_GPIO8, PINMUX_FOR_PM_IR_IN_MODE_1, MDRV_PUSE_IR}, {PAD_PM_GPIO3, PINMUX_FOR_PM_IR_IN_MODE_2, MDRV_PUSE_IR}, };
第一列为引脚索引号,可以在sc/drivers/sysdriver/gpio/hal/iford/pub/gpio.h
中查询;
第二列为模式定义,可以在sc/drivers/sysdriver/gpio/hal/iford/pub/padmux.h
中查询;
第三列为引脚及搭配模式的索引名称,可以在sc/drivers/sysdriver/padmux/drv/pub/drv_puse.h
中查询;
方法二:CONFIG_PADMUX_SUPPORT=N && CONFIG_GPIO_SUPPORT=Y
该方法通过sc/driver/sysdriver/ir/hal/iford/inc/hal_ir_cfg.h
文件中定义的结构体struct hal_ir_config配置引脚复用功能,只需赋值成员pad_mod
为padmux.h
定义的模式:
struct hal_ir_config ir_cfg[HAL_IR_GROUP] = { { // IR0 ... #ifdef CONFIG_GPIO_SUPPORT .pad_mod = PINMUX_FOR_PM_IR_IN_MODE_1, #else #endif ... } };
方法三:CONFIG_PADMUX_SUPPORT=N && CONFIG_GPIO_SUPPORT=N
该方法通过sc/driver/sysdriver/ir/hal/iford/inc/hal_ir_cfg.h
文件中定义的结构体struct hal_ir_config配置引脚复用功能,只需赋值成员pad_mod
为模式序号:
struct hal_ir_config ir_cfg[HAL_IR_GROUP] = { { // IR0 ... #ifdef CONFIG_GPIO_SUPPORT #else .pad_mod = 1, #endif ... } };
5.5. API说明¶
头文件位于sc/driver/sysdriver/ir/drv/pub/drv_ir.h
typedef u32 (*ir_decode)(u32); extern u64 drv_ir_key_dequeue(u32 group); extern int drv_ir_config(u32 group, u32 decode_mode, u32 customer_code, ir_decode ir_handle);
drv_ir_config
-
目的
设定IR设备的解码模式,客户码及接收IR信号的回调函数
-
语法
int drv_ir_config(u32 group, u32 decode_mode, u32 customer_code, ir_decode ir_handle)
-
参数
参数名称 数值 描述 group 0 IR设备号 decode_mode 1:Full,2:Raw,3:RC5 解码模式 customer_code 16Bit客户码 只有Full mode需要配置 ir_handle 函数指针 用于响应接收到的IR信号 -
返回值
返回值 描述 0 成功 -7 IR设备不支持
drv_ir_key_dequeue
-
目的
获取IR信号解码后的customer code, command code,repeat标志位
-
语法
u64 drv_ir_key_dequeue(u32 group)
-
参数
参数名称 数值 描述 group 0 IR设备号 -
返回值
返回值 描述 data BIT24-BIT9是customer code, BIT8-BIT1是command code,BIT0是repeat标志位
5.6. DEMO¶
demo源码位于sc/driver/sysdriver/ir/drv/src/drv_ir_test.c
/* 回调函数,当接收到IR信号后会被调用 */ u32 ir_get_value(u32 group) { u64 data; u8 repeat; u32 addr; u32 cmd_code; u32 key_value; data = drv_ir_key_dequeue(group); //获取IR信号解析结果 if (data) { repeat = data & 0x1; // repeat标志位,1:发生repeat行为 key_value = (u32)data >> 0x1; addr = (key_value & 0xFFFF00) >> 8; // customer code cmd_code = key_value & 0x00FF; // command code cliPrintf("ir%u addr: [0x%x] cmd_code: [0x%x], repeat [0x%x]\n", group, addr, cmd_code, repeat); } return data; } static int ir_ut_test(CLI_t *cli, char *p) { u32 group; u32 decode_mode; u32 customer_code = 0x00FF; if ((CliTokenCount(cli) == 2) || (CliTokenCount(cli) == 3)) { if (CliTokenPopNum(cli, &group, 0) != eCLI_PARSE_OK) goto ir_help_exit; if (CliTokenPopNum(cli, &decode_mode, 0) != eCLI_PARSE_OK) goto ir_help_exit; if (decode_mode == 1) if (CliTokenPopNum(cli, &customer_code, 0) != eCLI_PARSE_OK) goto ir_help_exit; /* 配置IR设备的解码模式,客户码及接收IR信号的回调函数 */ if (drv_ir_config(group, decode_mode, customer_code, ir_get_value)) return eCLI_PARSE_ERROR; } else { ir_help_exit: cliPrintf("command format : ir [group] [decode_mode:1] [customer code(16bit)]\n"); cliPrintf("command format : ir [group] [decode_mode:2 or 3] \n"); return -eCLI_PARSE_INVALID_PARAMETER; } return eCLI_PARSE_OK; }
6. DEBUG方法¶
6.1. IR驱动接收不到IR信号¶
-
检查padmux是否已经配置,详见5.4. PADMUX配置
-
检查config是否配置,详见5.2. CONFIG配置
-
检查SYSDESC IR节点的
status
是否为ok
-
检查遥控器波形判断IR_IN信号是否符合NEC、RC5格式,并且当前的解码模式与源信号匹配
-
检查硬件原理图中IR Receiver中是否有需要短接或者增加电阻的地方(如图6-1的R1110/R1542)
图6-1 IR硬件原理图