RIOT IEEE802.15.4 Radio HAL 设计详解:从 RDM 0002 看 802.15.4 无线硬件抽象层的架构与实现
2026/9/19 16:57:24 网站建设 项目流程

RIOT IEEE802.15.4 Radio HAL 设计详解:从 RDM 0002 看 802.15.4 无线硬件抽象层的架构与实现

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

本文以 RIOT 仓库中的设计备忘录 doc/memos/rdm0002.md 为核心,系统讲解 RIOT 为 IEEE802.15.4 无线收发器设计的 Hardware Abstraction Layer(HAL)。你将了解到该 HAL 诞生的背景、三层架构(Radio Ops / Event Notification / Device Driver)、抽象状态机、收发流程以及完整的接口定义,并看到它在sys/include/net/ieee802154/radio.h与各无线驱动(at86rf2xx、kw2xrf、kw41zrf、mrf24j40)中的落地实现。

一、文档背景与定位

RDM(RIOT Developer Memo)0002 是 RIOT 官方设计文档,标题为"The IEEE802.15.4 radio HAL",作者 José Álamos,创建于 2020 年 3 月。其设计目标是:为符合 IEEE 802.15.4 标准的无线收发器提供一个技术专项(technology-specific)的硬件抽象层,让上层能够以硬件无关的方式访问无线设备,从而在其之上实现 802.15.4 PHY / MAC 层,并支持需要直接访问无线硬件的网络协议栈。

需要特别说明的是,该文档头部标注了Status: Deprecated by RDM 0004。也就是说,RDM 0002 是初版设计,其后继版本 doc/memos/rdm0004.md 状态为Active。从仓库实际代码看,RDM 0002 附录中给出的 HAL 头文件与当前 sys/include/net/ieee802154/radio.h 的实现保持一致,因此本文所讲解的设计内容依然适用于当前仓库中的代码,是理解 RIOT 802.15.4 网络栈底层的关键资料。

1.1 术语与缩写

文档采用 RFC2119 的 MUST / SHOULD / MAY 术语约定,并定义了以下缩写与概念:

术语含义
RDMRIOT Developer Memo(RIOT 开发者备忘录)
PIBPhysical Information Base(物理信息库,如信道号、发射功率等)
MIBMAC Information Base(MAC 信息库,如地址、退避参数等)
SubMACIEEE802.15.4 MAC 的下层,提供带 CSMA-CA 逻辑的重传、地址过滤与 CRC 校验
Standalone CCA单次执行的空闲信道评估(Clear Channel Assessment)
Continuous CCA先 CCA 再发送的流程(CSMA-CA 算法所需)
CapsCapabilities,指无线设备具备的(硬件加速)特性
OpsOperations,一组用于控制无线设备的操作

二、为什么需要独立的 Radio HAL:netdev 的缺陷

在 RIOT 当时的底层网络栈架构中,所有网络接口都由统一的netdev接口驱动。RDM 0002 明确指出,将netdev直接作为硬件抽象层存在三方面缺陷:

  1. netdev过于通用:它需要覆盖 RIOT 中差异极大的多种技术(IEEE802.15.4、BLE、Ethernet、WiFi、私有协议等),而标准化无线设备的语义是技术专项且定义明确的(对 802.15.4 而言由 IEEE 标准定义),通用接口无法表达这些语义。

  2. netdev混入了 HAL 范围之外的 PHY/MAC 组件netdev虽以设备驱动形式实现,却为每个设备携带了技术相关组件,例如 PSDU(Physical Service Data Unit)传输、CSMA-CA 重传、ACK 处理等 802.15.4 MAC/PHY 功能。这导致代码重复、同类设备的功能集严重依赖具体实现、新设备集成复杂、维护困难。

  3. netdev硬编码了 MAC 层功能:某些设备自带硬件 MAC 加速,但这些能力只有在硬件提供集成支持时才可用,netdev实现缺少"该驱动提供了哪些 MAC 特性"的指示机制。当上层需要统一的 MAC 实现时,设备驱动之间不同的属性、部分实现的 MAC 特性会干扰"由一个 MAC 实现透明访问硬件"的设计目标。

此外,802.15.4 MAC 的另一部分组件存在于gnrc_netif_ieee802154(GNRC Netif 的 802.15.4 链路层实现)中,用于组帧、解析帧以收发数据。但 802.15.4 的强制 MAC 特性(commissioning、security、信道扫描等)缺失,且这些组件是 GNRC 专属的,无法被其他需要 802.15.4 MAC 的协议栈复用。

2.1 解决方案:下层拆分为三个组件

作为解决方案,文档提出将下层网络栈拆分为三个主要组件:

  1. 802.15.4 Radio HAL:驱动无线设备的硬件无关接口(即本文主题);
  2. 802.15.4 MAC:包含 PHY 定义的完整链路层;
  3. 网络栈接口(netif):控制 802.15.4 MAC 收发报文,提供透明的、技术无关的介质访问。

RDM 0002 中的架构对比图(下文以 ASCII 形式呈现)直观展示了新旧架构的差异——新架构在 GNRC Netif 与设备驱动之间插入了 802.15.4 MAC 层和 Radio HAL API,而基于netdev的旧方案缺少 Radio HAL,导致无法在硬件之上运行硬件无关的 MAC:

OLD | NEW === | === +---------------------+ | +---------------------+ +---------------------+ | GNRC Network Stack | | | GNRC Network Stack | | | +---------------------+ | +---------------------+ | | ^ | ^ | | gnrc_netapi | gnrc_netapi | OpenThread, OpenWSN | v | v | | +---------------------+ | +---------------------+ +---------------------+ | GNRC Netif | | | GNRC Netif | | | +---------------------+ | +---------------------+ +---------------------+ ^ | ^ ^ gnrc_netif_ops_t | gnrc_netif_ops_t | v | v | +---------------------+ | +---------------------+ | |gnrc_netif_ieee802154| | |gnrc_netif_ieee802154| | +---------------------+ | +---------------------+ | ^ | ^ | | | 802.15.4 MAC API Radio HAL API | | v | netdev_driver_t | +---------------------+ | | | | 802.15.4 MAC | | v | +---------------------+ | | ^ | | Radio HAL API ----------------+ | v v +---------------------+ | +---------------------+-------------------------+ | netdev | Device | | | 802.15.4 Radio HAL | | | | Driver | | | | Device Driver | +---------------------+ | +---------------------+ | | +-----------------------------------------------+

从源码结构看,这一设计在仓库中确实落地为独立的 sys/include/net/ieee802154/radio.h,并在多个无线驱动中得到了实现(见下文"仓库中的落地实现"一节)。

三、HAL 整体架构

RDM 0002 给出的 HAL 架构如下(ASCII 图):

+-----------------------------------------------------------------------------+ | Upper layer | +-----------------------------------------------------------------------------+ | ^ | | Radio Ops Event Notification +----------------------------+ | | IRQ Handler | | | | +----------------------| Bottom-Half processor | | | | | | | | | +----------------------------+ v | v ^ +-----------------------------+ | | 802.15.4 Radio HAL | HW independent | |-----------------------------|-------------------------------|---------------- | Device Driver | HW dependent | | |-------------------------------+ +-----------------------------+

如图,802.15.4 Radio HAL 是中央组件:它通过实现Radio HAL API,为任何上层提供技术专项且统一的设备驱动访问。HAL 使用Event Notification(事件通知)机制向上层报告无线事件(如IEEE802154_RADIO_CONFIRM_TX_DONEIEEE802154_RADIO_INDICATION_RX_DONEIEEE802154_RADIO_CONFIRM_CCA)。该机制既可以在中断上下文执行,也可以在线程上下文执行——当设备无法在 ISR 中解决事件时(例如 SPI 设备),Radio HAL 要求上层接管Bottom-Half 处理,即把 ISR 卸载到线程上下文。

3.1 Upper Layer(上层)

上层是需要直接访问无线原语操作及其硬件加速特性的用户,典型例子包括:

  • MAC 层:使用 Radio HAL 实现部分 PHY 层功能(数据通信、参数 set/get、执行 CCA 等);
  • 需要低层无线访问的协议栈:如 OpenWSN、OpenThread,使用 Radio HAL 编写集成代码;
  • 简单收发应用:开发者实现仅依赖硬件加速 MAC 特性的 802.15.4 收发应用。

上层通过 Radio HAL API 访问无线设备,设备触发的事件(收到报文、发送完成)则通过事件通知机制上报。

3.2 Bottom-Half Processor(下半部处理器)

BH(Bottom-Half)处理器用于将 IRQ 处理卸载到线程上下文,是 SPI 等无法在 ISR 内解决无线事件的设备所必需的组件。其工作方式为:

  • 初始化时注册 IRQ 处理函数,设备触发中断时执行;
  • 该处理函数借助内部机制,从安全上下文调用 Radio API 的 IRQ handler;
  • IRQ handler 可能在更高优先级上下文运行。虽然 API 实现不应实现可重入,但必须处理 IRQ handler 与 API 函数之间的并发调用。

文档强调,BH 处理器可以依赖或不依赖网络栈实现,网络栈无关的实现更受推荐,以便在不同网络栈之间复用功能。"Bottom Half"一词源自 Linux 内核的 Top and Bottom Halves 概念。

3.3 Radio HAL 的三个组成部分

Radio HAL 由Radio HAL API定义,包含三个主要组件:

  1. Radio Operations(radio_ops:暴露控制 802.15.4 设备所需的通用操作,以及查询硬件能力(如 MAC 加速硬件)的接口;
  2. Event Notification(事件通知):向上层报告设备事件;
  3. Device Specific IEEE802.15.4 HAL Implementation(设备专项实现):即设备驱动部分。
Radio Operations 的职责划分

接口定义了一组必选函数

  • 设置收发器状态(Set the transceiver state);
  • 设置 PHY 配置(信道、发射功率等);
  • 加载并发送帧;
  • 获取设备能力。

以及一组可选函数(是否实现取决于设备硬件加速特性):

  • 读取重传尝试次数;
  • 设置地址过滤地址(扩展地址、短地址、PAN ID);
  • 设置 CSMA-CA 退避参数。

所有radio_ops函数都是非阻塞的,其中部分遵循Request/Confirm 模式:请求的结束通过确认函数指示。确认函数可以被轮询,此时它使用标准错误码表示状态(成功、出错或请求尚未完成)。

Event Notification 的使用约定

上层可以订阅事件以执行不同动作,例如:

  • MAC 层订阅 RX done 事件,用于分配收到的报文;
  • TX done 事件通常用于释放资源或更新统计信息。

由于事件通知既可能在 ISR 上下文、也可能在线程上下文(BH 处理器)被调用,实现事件通知回调时必须考虑这一点——例如IEEE802154_RADIO_INDICATION_RX_DONE事件可能通过向事件队列投递事件的方式来取帧。

Device Driver 的定位

设备驱动封装 Radio HAL 中硬件相关的部分:将radio_ops接口包装在设备专属代码外层,从而获得对设备全部操作能力的访问。设备驱动还负责为需要 BH 处理器的无线设备暴露其 ISR,并且可以包含 Radio HAL API 未暴露的设备专属特性(例如 AT86RF2xx 无线芯片的 Smart Listening 功能)。

四、实现细节:初始化、状态机与收发流程

4.1 设备驱动初始化流程

在设备驱动之上实现 802.15.4 抽象,需要一个执行以下任务的初始化流程:

  1. 设置 IRQ 回调(Set up IRQ callback);
  2. 复位设备(Reset the device);
  3. 确认连接并执行自检(Confirm connectivity and perform self tests);
  4. 使设备进入低功耗状态(Bring device into a low power state);
  5. 设置 IRQ 并禁用它们以降低功耗(Set up IRQs and disable them)。

初始化成功后,radio_ops接口提供的on函数(即头文件中的request_on/confirm_on)负责开启设备并使能中断,上层应在初始化成功后调用它来启用无线设备。

4.2 抽象状态机

Radio HAL 定义了一个抽象状态机(Abstract State Machine),所有 Radio HAL 设备驱动都应据此实现以保证行为统一。瞬态(如 pending requests)不在图中,但上层在有请求挂起时不得触发另一个请求

+---------+ | | | OFF |<------ Any state | | OFF +---------+ | ON | v +---------+ +--------| |--------+ | | TRX_OFF |<----+ | | +----->| | | | | | +---------+ | | SET_TRX_STATE | | | | SET_TRX_STATE | | | | v | | v +---------+ +---------+ | |------------->| | | IDLE | | RX | | |<-------------| | +---------+ +---------+ SET_TRX_STATE

各状态规范如下:

  • OFF:若无线初始化成功,抽象状态机从OFF状态开始。此状态功耗最低,所有硬件组件(收发器、密码加速器等)均被禁用。
  • TRX_OFF:设备已上电但收发器关闭(PLL 未锁定)。功耗高于OFF状态,但设备可以操作收发器和其他硬件组件(如密码加速器)。
  • IDLE:设备专属状态,表示设备已准备好发送、取回接收帧、修改 PIB 或执行 Stand-Alone CCA。
  • RX ON:无线设备能够检测 SFD(Start Frame Delimiter,帧起始定界符),从而接收帧。

4.3 Prepare and Transmit:分离"装载"与"发送"

netdev不同,Radio HAL不定义显式的 send 函数,而是把发送过程拆分为**帧装载(frame loading)触发发送(triggering the transmissions start)**两步。虽然netdev也能通过NETOPT_PRELOADING选项实现装载后发送,但 Radio HAL 的方式更简单、更轻量,因为它不需要内部状态变量。

分离装载与发送对有时序约束的 MAC 层是必需的(例如 802.15.4 MAC 的 TSCH 模式)。文档指出,极少数不支持"装载帧缓冲而不触发发送"的无线设备,仍可通过内部缓冲实现这一模式;不过这种情况几乎不可能出现,因为这样的设备无法满足 802.15.4 的时序要求。

上层通常会定义一个便捷的send函数同时处理装载与发送:典型实现是 802.15.4 MAC——一旦可访问就预装载设备缓冲,并在调度的时间片触发发送操作;对非 MAC 用户则可提供辅助函数。

4.4 TX 与 RX 信息

上层有时需要与报文收发关联的信息:

  • 802.15.4 MAC 的 TSCH 模式可能需要从接收帧中获取LQI 和 RSSI来调度新信元;
  • 802.15.4 MAC 可能需要与帧重传组件相关的信息(frame pending 位、重传次数、状态),前提是硬件支持硬件重传。

Radio HAL API 提供了获取这些数据的函数(即附录头文件中的ieee802154_rx_info_tieee802154_tx_info_t结构)。需要注意的是,在不需要 RX 信息或设备不支持帧重传的情况下,获取这些信息是可选的。

五、接口定义(Interface Definition)

5.1 Radio Operations 接口

Radio Ops 接口使用函数指针实现(即ieee802154_radio_ops结构体)。设计约束:

  • 这些函数应只做设备专属校验;非设备专属的参数校验(合法信道设置、地址长度等)应由更高层完成,以避免冗余;
  • Radio Ops 接口只实现了少数 get 函数,原因是 PIB/MIB 的大部分成员(如地址、发射功率、信道号)已经存储在 RAM 中;
  • 所有函数非阻塞,部分遵循 Request/Confirm 模式。

下表总结了各 Radio Ops 可在哪些状态被调用(标记X[_]表示该状态不允许调用,[X]表示允许调用):

- Send/Receive +---------------------------------+ |`OFF` | `TRX_OFF` | `IDLE` | `RX`| +------------------------------------------------------------+ | `write` | _ | X | X | _ | | `len` | _ | X | X | _ | | `read` | _ | X | X | _ | | `*_op(*_TRANSMIT)` | _ | _ | X | _ | +------------------------------------------------------------+ - CCA related +---------------------------------+ |`OFF` | `TRX_OFF` | `IDLE` | `RX`| +------------------------------------------------------------+ | `set_cca_threshold` | [ ] | [X] | [X] | [X]| | `set_cca_mode` | [ ] | [X] | [X] | [X]| | `*_op(*_CCA)` | [ ] | [ ] | [X] | [ ]| +------------------------------------------------------------+ - PIB/MIB related +---------------------------------+ |`OFF` | `TRX_OFF` | `IDLE` | `RX`| +------------------------------------------------------------+ | `config_phy` | [ ] | [X] | [X] | [ ]| | `set_frame_retrans` | [ ] | [X] | [X] | [X]| | `set_csma_params` | [ ] | [X] | [X] | [X]| | `set_frame_filter_mode` | [ ] | [X] | [X] | [X]| | `config_addr_filter` | [ ] | [X] | [X] | [X]| | `config_src_addr_match` | [ ] | [X] | [X] | [X]| +------------------------------------------------------------+ - Device State Management +---------------------------------+ |`OFF` | `TRX_OFF` | `IDLE` | `RX`| +------------------------------------------------------------+ | `*_op(*_SET_{IDLE,RX})` | [ ] | [X] | [X] | [X]| | `*_on` | [X] | [ ] | [ ] | [ ]| | `off` | [X] | [X] | [X] | [X]| +------------------------------------------------------------+

从上表可以归纳出关键约束:config_phy仅在TRX_OFF/IDLE状态可用(不能在 RX 中改 PHY 配置);write/len/read需要收发器处于关闭接收的状态;发射(TRANSMIT)和 CCA 都只能在IDLE状态发起;而off是唯一在所有状态都允许的操作。这正与 sys/include/net/ieee802154/radio.h 中各函数注释中的@pre条件(如config_phy要求 "the transceiver state is IDLE")相互印证。

5.2 Event Notification 事件表

事件通知机制通过函数回调实现,回调函数由上层实现。事件命名遵循 IEEE Service Access Points(SAP)惯例:因 Request 触发的事件以CONFIRM前缀,其余事件以INDICATION前缀。

MAC 专属事件(如 frame pending 的 TX done、CSMA-CA 介质忙、超过重传次数)不会被显式上报,因为它们在 TX done 事件发生后可以通过 Radio HAL API 提取。此外,ACK Timeout、CSMA Backoff timeout、PLL lock 等事件不在本文档范围内,但上层需要时可随时添加实现。

事件Mandatory触发状态
IEEE802154_RADIO_INDICATION_RX_START[ ]RX
IEEE802154_RADIO_INDICATION_RX_DONE[1][X]RX
IEEE802154_RADIO_INDICATION_CRC_ERROR[2][ ]RX
IEEE802154_RADIO_INDICATION_TX_START[ ]IDLE
IEEE802154_RADIO_CONFIRM_TX_DONE[3][X]IDLE
IEEE802154_RADIO_CONFIRM_CCA[4][ ]IDLE

事件处理约定:

[1]:上层在调用readlen之前必须将抽象状态机状态设为IDLETRX_OFF[2]:应视为IEEE802154_RADIO_INDICATION_RX_DONE事件处理,使用read函数丢弃该帧。[3]:发生时,上层必须调用confirm_op(IEEE802154_RADIO_CONFIRM_TX_DONE)完成发送。抽象状态机保持在 IDLE。[4]:发生时,上层必须调用confirm_op(IEEE802154_RADIO_CONFIRM_CCA)完成 CCA 过程并获取信道状态。抽象状态机保持在 IDLE,可发送下一帧。

注意:虽然强制事件可以被上层忽略或禁用,但所有 Radio HAL 实现必须至少产生强制事件;可选事件的存在必须通过 Radio Caps(见下节)指示。

5.3 Radio Caps(能力位)

Radio HAL 实现通过一组Caps指示特定硬件特性的存在。Caps 使用位标志编码,头文件定义了ieee802154_radio_has_*系列函数来检查无线设备是否支持某项能力。Radio HAL 实现必须指示设备与驱动实现支持的全部能力。

从附录头文件看,Caps 枚举(ieee802154_rf_caps_t)覆盖了以下硬件特性,全部用 BIT 位掩码定义:

Cap 标志含义
IEEE802154_CAP_FRAME_RETRANS支持带 CSMA-CA 的帧重传
IEEE802154_CAP_AUTO_CSMA支持发送前自动执行 CSMA-CA
IEEE802154_CAP_IRQ_ACK_TIMEOUT支持 ACK 超时中断
IEEE802154_CAP_24_GHZ支持 2.4 GHz 频段
IEEE802154_CAP_SUB_GHZ支持 Sub-GHz 频段
IEEE802154_CAP_IRQ_CRC_ERROR上报接收到的 CRC 无效帧
IEEE802154_CAP_IRQ_TX_DONE上报发送完成中断
IEEE802154_CAP_IRQ_RX_START上报收到帧起始(SFD)
IEEE802154_CAP_IRQ_TX_START上报已发出帧起始(SFD)
IEEE802154_CAP_IRQ_CCA_DONE上报 CCA 过程结束
IEEE802154_CAP_FRAME_RETRANS_INFO提供重传次数信息
IEEE802154_CAP_REG_RETENTION关机时保留所有寄存器值
IEEE802154_CAP_PHY_BPSK/ASK/OQPSK/MR_OQPSK/MR_OFDM/MR_FSK各 PHY 调制模式
IEEE802154_CAP_SRC_ADDR_MATCH支持源地址匹配表(Frame Pending 位)

Caps 与 PHY 模式之间还有双向转换工具函数:ieee802154_phy_mode_to_cap()ieee802154_cap_to_phy_mode(),以及通过IEEE802154_RF_CAPS_PHY_MASK掩码提取全部 PHY 模式的ieee802154_radio_get_phy_modes()

5.4 传输状态与数据结构

头文件定义的ieee802154_tx_status_t描述了四种传输结果:

  • TX_STATUS_SUCCESS:成功发送帧(若支持重传/ACK 超时,则意味着"无 ACK Req 位"或"带 ACK Req 位且收到有效 ACK");
  • TX_STATUS_FRAME_PENDING:收到带 Frame Pending 位的有效 ACK(仅当支持重传或 ACK 超时);
  • TX_STATUS_NO_ACK:重传耗尽仍未收到 ACK(仅当支持重传或 ACK 超时);
  • TX_STATUS_MEDIUM_BUSY:CSMA-CA 或 CCA 判定信道忙。

关键数据结构还包括:

  • ieee802154_rx_info_trssi(dBm 单位,取值范围 0(-174 dBm)到 254(80 dBm))与lqi(链路质量指示);
  • ieee802154_tx_info_tstatus(上次传输状态)与retrans(上次发送的重传次数);
  • ieee802154_phy_conf_t:PHY 配置,含phy_mode(PHY 模式)、channel(信道号)、page(信道页)、pow(dBm 发射功率);
  • ieee802154_csma_be_t:CSMA-CA 指数退避参数,含minmax
  • ieee802154_cca_mode_t:四种 CCA 模式(能量检测阈值、载波侦听、能量检测 AND 载波侦听、能量检测 OR 载波侦听),所有无线设备至少必须实现第一种(ED Threshold);
  • ieee802154_filter_mode_t:帧过滤模式(ACCEPT / ACK_ONLY / PROMISC / SNIFFER);
  • ieee802154_af_cmd_t:地址过滤命令(设置短地址、扩展地址、PAN ID、PAN 协调器标志);
  • ieee802154_src_match_t:源地址匹配命令(启用/禁用、增删短地址与扩展地址条目)。

5.5 设备描述符与便捷封装

核心数据结构ieee802154_dev(设备描述符)包含三个字段:

struct ieee802154_dev { const ieee802154_radio_ops_t *driver; /* 设备操作指针 */ void *priv; /* 设备私有描述符 */ ieee802154_cb_t cb; /* 设备事件回调 */ };

其中ieee802154_cb_t是事件回调原型:void (*ieee802154_cb_t)(ieee802154_dev_t *dev, ieee802154_trx_ev_t status)

头文件为上层提供了大量static inline便捷封装,它们都只是对dev->driver->xxx的一次转发,例如:

  • ieee802154_radio_write()ieee802154_radio_len()ieee802154_radio_read()(携带可选的ieee802154_rx_info_t指针);
  • ieee802154_radio_request_transmit()/ieee802154_radio_confirm_transmit()(Request/Confirm 对,内部调用request_op(dev, IEEE802154_HAL_OP_TRANSMIT, NULL));
  • ieee802154_radio_request_set_idle()/ieee802154_radio_confirm_set_idle()ieee802154_radio_request_set_rx()/ieee802154_radio_confirm_set_rx(),以及对应的阻塞版本ieee802154_radio_set_idle(dev, force)ieee802154_radio_set_rx(dev)——阻塞版本内部轮询确认函数直到不再返回-EAGAIN
  • ieee802154_radio_request_cca()/ieee802154_radio_confirm_cca()/ieee802154_radio_cca()(阻塞版),其中确认函数通过bool clear上下文返回信道状态(正数=信道空闲,0=信道忙,-EAGAIN=未完成);
  • 能力查询系列:ieee802154_radio_has_irq_ack_timeout()ieee802154_radio_has_frame_retrans()ieee802154_radio_has_auto_csma()ieee802154_radio_has_sub_ghz()ieee802154_radio_has_24_ghz()ieee802154_radio_has_irq_tx_done()ieee802154_radio_has_irq_rx_start()ieee802154_radio_has_irq_tx_start()ieee802154_radio_has_irq_cca_done()ieee802154_radio_has_frame_retrans_info()以及各 PHY 模式查询。

这些封装函数一一对应 RDM 0002 附录中 2023-02 版本的头文件内容,也与当前仓库 sys/include/net/ieee802154/radio.h 的实现一致,可直接作为上层开发者的调用手册使用。

六、未来兼容性考量(Future Proof Considerations)

Radio HAL 被设计为对不同版本 IEEE802.15.4 标准保持无关性。单个无线设备通常只为某一标准实现硬件加速,而不同标准并非总是兼容——例如 IEEE802.15.4-2006 设备不支持 TSCH 层(IEEE802.15.4-2012)所需的 Enhanced Acknowledgement 报文。为兼容起见,软件 MAC 可以提供此类功能。

6.1 三种传输模式

Radio HAL 接口定义三种传输模式,允许以 (i) CSMA-CA、(ii) CCA 或 (iii) 无任何竞争机制直接发送帧。这样 MAC 层可以方便地:发送数据帧时受益于硬件加速的 CSMA-CA,或发送必须满足时序约束的 Beacon 帧时使用直接发送。

HAL 实现可以提供多种传输模式,但必须至少实现一种。文档建议实现应尽量利用设备内部能力,同时希望提供 direct 模式以支持其上运行软件 MAC 层。

6.2 PHY 定义的可扩展性

PHY 定义与 IEEE802.15.4 版本绑定:旧标准用channel number定义 PHY 信道;现代标准用(channel number,channel page,channel modulation)元组表示。config_phy函数接收指向ieee802154_phy_conf_t结构的指针来描述 PHY 配置,该结构可以在不改变 Radio HAL API 的前提下扩展以支持更新的标准版本。

6.3 未来可扩展的 Radio 操作

radio_ops接口可以被扩展以支持更新标准的功能。例如,大多数 SubGHz 无线设备支持 Listen Before Talk 特性,可以作为新的可选操作加入接口。

七、仓库中的落地实现

RDM 0002 的设计在仓库中已经落实为可运行代码,以下是关键印证:

  • 头文件:sys/include/net/ieee802154/radio.h 定义了完整的 Radio HAL API(ieee802154_radio_ops_tieee802154_dev_t、Caps、事件、便捷封装函数),与 RDM 0002 附录头文件内容一致;
  • SubMAC:sys/include/net/ieee802154/submac.h 对应文档术语表中 SubMAC 的概念,即 MAC 下层提供重传 / CSMA-CA / 地址过滤 / CRC 校验等逻辑;
  • 驱动实现(实现了ieee802154_radio_ops的既有无线驱动):
    • drivers/at86rf2xx/at86rf2xx_rf_ops.c(AT86RF2xx 系列,文档中提到的 Smart Listening 特性即属于该系列设备);
    • drivers/kw2xrf/kw2xrf_radio_hal.c(NXP KW2x 系列);
    • drivers/kw41zrf/kw41zrf_radio_ops.c(NXP KW41Z);
    • drivers/mrf24j40/mrf24j40_radio_hal.c(Microchip MRF24J40)。

这些驱动文件证实了"设备驱动通过将radio_ops接口包裹在设备专属代码外层来提供硬件相关实现"的设计:同一套上层接口可以驱动完全不同的硬件,而上层(802.15.4 MAC、协议栈集成、测试应用)无需感知具体芯片差异。

八、总结

RDM 0002 为 RIOT 定义了 IEEE802.15.4 Radio HAL 的完整设计蓝图,其核心价值可以归纳为三点:

  1. 分离关注点:把netdev中混杂的 PHY/MAC 组件剥离出来,形成"Radio HAL → 802.15.4 MAC → netif"的清晰三层结构,让硬件无关的 MAC 实现真正成为可能;
  2. 统一且可扩展:通过radio_ops(操作)、Event Notification(事件)、Radio Caps(能力位)三个正交维度,既统一了设备访问语义,又为未来标准版本(新 PHY 模式、LBT 等)预留了扩展空间;
  3. 兼顾时序与功耗:Request/Confirm 非阻塞模型、装载/发送分离、抽象状态机等设计,都是为满足 TSCH 等时序敏感 MAC 以及低功耗场景而服务的。

虽然 RDM 0002 本身已被 doc/memos/rdm0004.md 取代,但其核心设计——尤其是附录中的接口定义——仍然是理解当前 sys/include/net/ieee802154/radio.h 及 at86rf2xx、kw2xrf、kw41zrf、mrf24j40 等无线驱动实现的最佳起点。对于希望在 RIOT 中集成新 802.15.4 无线芯片、实现自定义 802.15.4 MAC,或者把 OpenThread / OpenWSN 等协议栈移植到 RIOT 的开发者,这份设计文档与配套源码构成了完整的参考闭环。

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询