NCM数据报文指针-NDP32
2025-07-07
0
0
以下是 NDP32 的完整技术规范解析,重点说明其与 NDP16 的差异和设计意图:
1. NDP32 核心结构
NDP32 由三部分组成,总长度至少为 32字节(且为8的倍数):
- 16字节头部:包含签名、长度和保留字段。
- 1个或多个数据报指针条目(每条目8字节):记录每个以太网帧的位置和长度(32位偏移/长度)。
- 终止条目(8字节全零):标记指针表的结束。
2. NDP32 字段定义(Table 3-4)
偏移量 | 字段名 | 大小 | 值/格式 | 说明 |
---|---|---|---|---|
0 | dwSignature |
4字节 | 0x306D636E 或 0x316D636E |
NDP32标识签名: - 小端序传输为 0x6E,0x63,0x6D,0x30 (”ncm0”)或 0x6E,0x63,0x6D,0x31 (”ncm1”)。- 含义参考 Table 3-5(通常表示NDP版本或类型)。 |
4 | wLength |
2字节 | 总字节数(小端序,≥0x0020) | NDP32总长度: - 必须是8的倍数(因每个条目占8字节)。 - 最小为32字节(16字节头部 + 2个条目 + 8字节终止符)。 |
6 | wReserved6 |
2字节 | 保留(固定为0) | 预留字段:未来扩展用,必须设为0。 |
8 | dwNextNdpIndex |
4字节 | 保留(固定为0) | 预留字段:规范未定义链式NDP32,当前必须为0。 |
12 | dwReserved12 |
4字节 | 保留(固定为0) | 预留字段:未来扩展用,必须设为0。 |
16 | dwDatagramIndex[0] |
4字节 | 数据报偏移量(小端序) | 第一个以太网帧的起始位置: - 从NTB起始字节0计算。 - 必须 ≥ 0x0010 (跳过16字节的NTH32头部)。 |
20 | dwDatagramLength[0] |
4字节 | 数据报长度(小端序,≥14) | 第一个以太网帧的长度: - 以太网帧最小为14字节(MAC头,无载荷)。 - 最大不超过NTB剩余空间(≤4 GiB)。 |
24 | dwDatagramIndex[1] |
4字节 | 数据报偏移量或0(小端序) | 第二个以太网帧的起始位置: - 若为0,表示无更多帧(提前终止)。 |
28 | dwDatagramLength[1] |
4字节 | 数据报长度或0(小端序) | 第二个以太网帧的长度: - 若为0,表示无更多帧(提前终止)。 |
… | dwDatagramIndex[n] |
4字节 | 0(终止条目) | 强制终止条件: - 最后8字节必须为全零( dwDatagramIndex 和dwDatagramLength 均为0)。 |
… | dwDatagramLength[n] |
4字节 | 0(终止条目) |
3. 关键规则与约束
长度对齐
wLength
必须是8的倍数,且 ≥32(如32, 40, 48…)。- 计算条目数:
(wLength - 16) / 8 - 1
(减去头部和终止条目)。
数据报定位
- 每个
dwDatagramIndex
必须指向有效的以太网帧起始位置,且不重叠。 - 帧长度
dwDatagramLength
必须 ≥14(最小以太网帧),且 ≤ NTB剩余空间。
- 每个
终止条件
- 遇到
dwDatagramIndex=0
或dwDatagramLength=0
时停止解析(允许提前终止)。 - 最后8字节必须全零(强制规范)。
- 遇到
签名类型
ncm0
或ncm1
可能表示不同NDP版本(需结合Table 3-5),但规范未强制功能差异。
4. 与NDP16的差异对比
特性 | NDP32 | NDP16 |
---|---|---|
签名 | 0x306D636E /0x316D636E (“ncm0/1”) |
0x304D434E /0x314D434E (“NCM0/1”) |
头部长度 | 16字节 | 8字节 |
条目大小 | 8字节(32位偏移/长度) | 4字节(16位偏移/长度) |
最小总长度 | 32字节 | 16字节 |
最大帧寻址范围 | 4 GiB | 64 KiB |
保留字段 | 更多预留空间(未来扩展) | 仅wNextNdpIndex 保留 |
5. 工作流程示例
假设一个NTB-32包含2个以太网帧,其NDP32结构如下(十六进制小端序):
6E 63 6D 30 20 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 10 00 00 20 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00
- 解析:
dwSignature
=0x306D636E
(“ncm0”)wLength
=0x0020
(32字节)- 所有保留字段 =
0x00000000
- 帧1:
dwDatagramIndex[0]
=0x00000010
(偏移16字节)dwDatagramLength[0]
=0x00001000
(长度4096字节)
- 帧2:
dwDatagramIndex[1]
=0x00000020
(偏移32字节)dwDatagramLength[1]
=0x00002000
(长度8192字节)
- 终止符:
0x00000000 00000000
6. 设计优势
- 大容量支持:32位偏移和长度支持4 GiB单次传输,适配USB 3.0+高速场景。
- 扩展性:更多保留字段为未来功能(如链式NDP、元数据扩展)预留空间。
- 兼容性:与NDP16逻辑一致,仅升级字段宽度,降低解析复杂度。
此结构是NCM在USB 3.0及以上实现超大块数据传输的核心机制,兼顾性能与灵活性。