5.30 Infrared红外设备
2026/7/20大约 2 分钟设备驱动驱动Infrared红外NEC遥控
5.30 Infrared红外设备
📚 本节导读
学习时长: 约 30 分钟
难度级别: ⭐⭐⭐☆☆
前置知识: C 语言基础、红外协议基础知识、5.1 设备驱动框架
🎯 学习目标
- 理解 OneOS Infrared 红外设备驱动的设计
- 掌握红外接收状态机的工作原理
- 掌握 NEC 协议的解码流程
- 掌握红外发送与接收的使用方法
一、概述
Infrared 红外设备是 OneOS 提供的红外遥控驱动框架,支持 NEC 协议的红外信号接收与发送。驱动源码位于 drivers/infrared/ 目录下,核心头文件为 infrared.h。
Infrared 设备框架的特点:
- NEC 协议支持:支持标准的 NEC 红外遥控协议解码
- 状态机接收:RX 端使用有限状态机(FSM)解码红外信号,包含 6 个状态
- 定时器超时检测:使用硬件定时器检测接收超时,判断一帧数据结束
- 环形缓冲队列:使用 8 条消息的环形缓冲区存储接收到的红外数据
- 双模式支持:同时支持红外接收和红外发送
二、核心数据结构
2.1 红外消息结构体
struct os_infrared_info
{
uint8_t addr; /* 地址码 */
uint8_t data; /* 数据码 */
uint8_t times; /* 重复次数 */
};2.2 红外设备结构体
struct os_infrared_device
{
struct os_device parent;
int tx_pin; /* 发送引脚 */
int rx_pin; /* 接收引脚 */
int rx_status; /* 接收状态机状态 */
uint64_t rx_time_stamp; /* 接收时间戳 */
uint16_t rx_addr, rx_addr_offset;
uint16_t rx_data, rx_data_offset;
int info_head, info_tail; /* 环形缓冲区 */
struct os_infrared_info info[8]; /* 8条消息 */
os_list_node_t list;
};三、关键 API
os_err_t os_infrared_register_device(const char *name, struct os_infrared_device *device);四、使用示例
#include <infrared.h>
#include <device.h>
void infrared_recv_task(void *arg)
{
os_device_t *dev = os_device_open("infrared0");
if (dev == OS_NULL) return;
uint8_t buf[sizeof(struct os_infrared_info)];
while (1)
{
os_size_t len = os_device_read(dev, 0, buf, sizeof(buf));
if (len > 0)
{
struct os_infrared_info *info = (struct os_infrared_info *)buf;
os_kprintf("IR: addr=0x%02x, data=0x%02x, times=%d\r\n",
info->addr, info->data, info->times);
}
}
}📝 本节小结
本节介绍了 Infrared 红外设备驱动,包括 NEC 协议解码、状态机接收、定时器超时检测、环形缓冲队列等核心机制。