CDC 扩展单元功能描述符
2025-07-10
0
0
Extension Unit Functional Descriptor(扩展单元功能描述符)扩展单元功能描述符用于描述设备内部的厂商自定义单元及其连接关系,便于主机识别和管理协议栈中的扩展功能。
扩展单元功能描述符为通用驱动程序提供关于扩展单元的最基本信息,至少可以让驱动识别协议栈中存在厂商自定义组件。
bExtensionCode
字段可包含进一步标识扩展单元的厂商自定义代码(如未使用应设为0)。- 单元可有一组厂商自定义参数用于配置和运行,这些参数可被获取、设置或清除。
- 单元初始状态为复位。
- 该描述符只能出现在接口描述符的类特定部分。
描述符结构(Table 38)
偏移 | 字段名 | 大小 | 值/类型 | 描述 |
---|---|---|---|---|
0 | bFunctionLength | 1 | 数值 | 此功能描述符的字节数 |
1 | bDescriptorType | 1 | 常量 | CS_INTERFACE 描述符类型 |
2 | bDescriptorSubtype | 1 | 常量 | 扩展单元功能描述符子类型 |
3 | bEntityId | 1 | 常量 | 唯一标识该单元的ID |
4 | bExtensionCode | 1 | 数值 | 厂商自定义代码(如未用应为0) |
5 | iName | 1 | 索引 | 字符串描述符索引,描述扩展单元名称 |
6 | bChildId0 | 1 | 常量 | 连接到此单元的下级终端或单元的第一个ID |
… | … | … | … | … |
5+N | bChildIdN-1 | 1 | 常量 | 连接到此单元的下级终端或单元的第N个ID |
示例(C结构体及二进制示例)
C结构体定义
typedef struct _USB_CDC_EXTENSION_UNIT_DESCRIPTOR {
uint8_t bFunctionLength; // 描述符长度
uint8_t bDescriptorType; // CS_INTERFACE (0x24)
uint8_t bDescriptorSubtype; // Extension Unit subtype (0x0C)
uint8_t bEntityId; // 单元唯一ID
uint8_t bExtensionCode; // 厂商自定义代码
uint8_t iName; // 名称字符串描述符索引
uint8_t bChildId[1]; // 下级终端/单元ID(可变长度)
} USB_CDC_EXTENSION_UNIT_DESCRIPTOR;
示例数据(假设单元ID为1,扩展码为0xA5,名称字符串索引为2,有两个下级单元ID为3和4)
字节序号 | 值(十六进制) | 含义 |
---|---|---|
0 | 0x09 | bFunctionLength = 9 |
1 | 0x24 | bDescriptorType = CS_INTERFACE |
2 | 0x0C | bDescriptorSubtype = Extension Unit |
3 | 0x01 | bEntityId = 1 |
4 | 0xA5 | bExtensionCode = 0xA5 |
5 | 0x02 | iName = 2 |
6 | 0x03 | bChildId0 = 3 |
7 | 0x04 | bChildId1 = 4 |
二进制示例:
09 24 0C 01 A5 02 03 04
说明
- bFunctionLength:描述符总长度,=6+下级单元数量
- bDescriptorType:固定为0x24(CS_INTERFACE)
- bDescriptorSubtype:扩展单元功能描述符为0x0C
- bEntityId:单元唯一ID
- bExtensionCode:厂商自定义代码(如未用应为0)
- iName:名称字符串描述符索引
- bChildIdN:下级终端/单元ID(可有多个)