USB-NCM数据传输机制NTB
2025-07-07
0
0
NCM允许设备和主机使用单个USB传输有效地传输一个或多个以太网帧。USB传输被格式化为NCM传输块(NTB)。
1. NTB的核心结构
每个NTB由三部分组成,按顺序排列:
NCM Transfer Header (NTH)
- 作用:标识NTB的起始,提供元数据(如NTB类型、长度、NDP指针位置)。
- 特点:必须位于NTB的首部,接收端依赖NTH解析后续内容。
- 字段示例:
dwSignature
:标识NTB类型(如0x484D434E
表示NTB-32)。wBlockLength
:NTB总长度。wNdpIndex
:指向NDP结构的偏移量。
NCM Datagram Pointer (NDP)
- 作用:指向NTB内封装的以太网帧的起始位置(类似索引表)。
- 特点:
- 每个NDP可指向多个以太网帧,形成链表结构。
- 支持16位(NTB-16)或32位(NTB-32)偏移量(见下图对比)。
- 字段示例:
dwDatagramIndex[]
:以太网帧的偏移量数组。wDatagramLength[]
:对应帧的长度。
以太网帧数据
- 封装格式:原始IEEE 802.3帧(含MAC头、载荷、FCS等)。
- 排列方式:可由发送方自由排列,接收方通过NDP快速定位,无需拷贝重组。
2. NTB的两种格式
NCM定义了两种NTB格式,适配不同USB速率和设备需求:
格式类型 | 最大容量 | 偏移量位数 | 适用场景 | 结构图示 |
---|---|---|---|---|
NTB-16 | ≤ 64 KiB | 16位 | USB 2.0 High Speed | 图3-1 |
NTB-32 | ≤ 4 GiB | 32位 | USB 3.0 SuperSpeed | 图3-2 |
关键差异:
- NTB-16的字段(如
wBlockLength
、wNdpIndex
)为16位,限制单次传输最多承载40个标准以太网帧(1514字节/帧 × 40 ≈ 60 KiB)。 - NTB-32支持更大块传输,适合高速USB 3.0+设备。
3. NTB的工作流程
发送端(Host/Device):
- 将多个以太网帧打包为NTB,按需选择NTB-16或NTB-32格式。
- 填充NTH和NDP,确保接收端能正确解析帧位置。
- 通过USB批量传输(Bulk Transfer)发送整个NTB。
接收端(Device/Host):
- 读取NTH,确认NTB类型和长度。
- 根据
wNdpIndex
找到NDP,遍历dwDatagramIndex
提取所有以太网帧。 - 直接处理帧数据,无需内存拷贝(零拷贝优化)。
4. 关键设计优势
- 减少中断开销:单次USB传输替代多次小包传输,降低主机CPU负载。
- 灵活性与兼容性:
- 主机动态选择NTB格式(通过初始化协商)。
- 设备可声明不同的发送(TX)和接收(RX) NTB大小上限。
- 动态调整:发送方可按需调整NTB大小(如网络拥塞时减小块大小)。
5. 实现注意事项
- 格式一致性:同一时间仅使用一种NTB格式(NTB-16或NTB-32),且IN/OUT方向需一致。
- 大小限制:设备需在初始化时通过描述符或控制请求告知主机支持的NTB最大尺寸。
- 错误处理:若NTB校验失败(如长度不符),接收端应丢弃整个块并报告错误。
图示参考
- 图3-1(NTB-16结构):
[NTH(16位字段)] → [NDP(16位偏移)] → [以太网帧1][帧2]...[帧N]
- 图3-2(NTB-32结构):
[NTH(32位字段)] → [NDP(32位偏移)] → [以太网帧1][帧2]...[帧N]
通过NTB机制,NCM在USB协议层实现了接近原生以太网的高效数据传输,同时保持对高低速USB的兼容性。