NCM 数据接口描述符
2025-07-08
0
0
1. 数据接口的双重配置
NCM设备的数据接口必须实现两个交替设置(Alternate Setting):
Alternate Setting | 端点配置 | 网络流量 | 典型用途 |
---|---|---|---|
0(默认) | 无端点 | ❌ 禁止 | 省电模式/配置阶段 |
1(工作模式) | Bulk IN + Bulk OUT端点 | ✔️ 允许 | 正常数据传输 |
2. 描述符关键字段
所有交替设置必须包含以下相同属性:
bInterfaceClass = 0x0A // CDC数据类
bInterfaceSubClass = 0x00 // 必须为0
bInterfaceProtocol = 0x01 // 表示NTB协议(见表4-3)
3. 端点配置规则(Alternate Setting 1)
Bulk IN端点:
- 方向:Device → Host
- 用于接收来自设备的网络数据
- 必须支持最大包大小≥64字节(USB2.0)或≥512字节(USB3.0)
Bulk OUT端点:
- 方向:Host → Device
- 用于发送网络数据到设备
- 包大小要求同IN端点
4. 实现示例
描述符集合结构:
// Alternate Setting 0(无端点)
InterfaceDescriptor = {
bLength : 0x09,
bDescriptorType : 0x04,
bInterfaceNumber : 0x01, // 数据接口编号
bAlternateSetting : 0x00, // 设置0
bNumEndpoints : 0x00, // 无端点
bInterfaceClass : 0x0A, // CDC数据类
bInterfaceSubClass : 0x00, // 必须为0
bInterfaceProtocol : 0x01, // NTB协议
iInterface : 0x00 // 无字符串描述符
}
// Alternate Setting 1(带端点)
InterfaceDescriptor = {
bLength : 0x09,
bDescriptorType : 0x04,
bInterfaceNumber : 0x01, // 与设置0相同接口编号
bAlternateSetting : 0x01, // 设置1
bNumEndpoints : 0x02, // 两个端点
... // 其他字段同设置0
}
BulkInEndpoint = {
bLength : 0x07,
bDescriptorType : 0x05,
bEndpointAddress : 0x81, // EP1 IN
bmAttributes : 0x02, // Bulk
wMaxPacketSize : 0x0040, // 64字节(USB2.0)
bInterval : 0x00 // 忽略
}
BulkOutEndpoint = {
... // 类似配置
bEndpointAddress : 0x01 // EP1 OUT
}
5. 主机操作流程
初始状态:
- 设备默认使用Alternate Setting 0(无数据传输)
激活网络功能:
usb_set_interface(dev, data_iface_num, 1); // 切换到Alternate Setting 1
错误恢复:
- 传输错误时,主机可切回设置0再重新切回1重置状态
6. 设计原理
- 节能需求:设置0允许设备在不传输数据时关闭端点电路
- 协议兼容性:固定协议代码01h确保主机识别NTB格式
- 灵活性:端点数量/参数可根据设备能力调整(需满足USB规范)
7. 开发者注意事项
端点编号限制:
- 避免与通信接口的中断端点冲突
- 示例安全配置:
Communication IF: Interrupt EP 0x83 (EP3 IN) Data IF: Bulk EP 0x01 (OUT), 0x82 (IN)
USB3.0优化:
wMaxPacketSize = 0x0400; // 1024字节(SuperSpeed) bmAttributes |= 0x08; // 启用流控(Streams)
描述符验证工具:
使用USB-IF的USB Descriptor Validator检查合规性
此设计通过硬件级的配置切换,实现了NCM设备在低功耗与高性能模式间的平衡,同时保持与主机驱动的标准化交互。