USB 接口关联描述符(IAD)允许设备对属于函数的接口进行分组。 本文介绍了客户端驱动程序如何确定设备是否包含某功能的 IAD。
通用串行总线规范修订版 2.0 不支持在单个函数中对复合设备的多个接口进行分组。 但是,USB 设备工作组(DWG)创建了允许具有多个接口的函数的 USB 设备类。 USB 实施者论坛发布了一个工程更改通知(ECN),该通知定义了分组接口的机制。
ECN 指定一个 USB 描述符,称为接口关联描述符(IAD),该描述符允许硬件制造商定义接口分组。 最有可能使用 IAD 的设备类包括:
- USB 视频类规范(类代码 - 0x0E)
- USB 音频类规范(类代码 - 0x01)
- USB 蓝牙类规范(类代码 - 0xE0)
如何使用 IAD
以下小节介绍了如何使用 IAD 的信息。
复合设备在固件中向 Windows 报告 IADs
复合设备的制造商通常为设备描述符中的设备类(bDeviceClass)、子类(bDeviceSubClass)和协议(bDeviceProtocol)字段填入零值,这由《通用串行总线规范》规定。 制造商可以将每个单独的接口与不同的设备类和协议相关联。
USB-IF 核心团队设计了一个特殊的类别和协议代码集,用于通知操作系统设备固件中存在一个或多个 IAD。 设备描述符必须具有下表中显示的值,否则操作系统无法检测设备的 IAD,或正确地对设备的接口进行分组。
| 设备描述符字段 | 所需的值 |
|---|---|
| bDeviceClass(设备类别) | 0xEF |
| bDeviceSubClass | 0x02 |
| bDeviceProtocol | 0x01 |
代码值会提醒不支持 IAD 的 Windows 版本,安装能够正确枚举设备的专用总线驱动程序。 如果没有设备描述符中的这些代码,系统可能无法枚举设备,或者设备可能无法正常工作。
设备可以有多个 IAD。 每个 IAD 必须位于其描述的接口组内接口的正前方。
IAD 的函数类(bFunctionClass)、子类(bFunctionSubclassClass)和协议(bFunctionProtocol)字段必须包含 USB 设备类指定的值,这些值描述函数中的接口。
IAD 的类和子类字段不需要与 IAD 描述的接口集合中的接口的类和子类字段匹配。 Microsoft 建议集合的第一个接口的类和子类字段应与 IAD 的类和子类字段相匹配。 下表指示应匹配哪些字段。
| IAD 字段 | 相应的接口字段 |
|---|---|
| bFunctionClass | bInterfaceClass |
| bFunctionSubclassClass | bInterfaceSubClass |
IAD 的 bFirstInterface 字段指示函数中第一个接口的数目。 IAD 的 bInterfaceCount 字段指示接口集合中的接口数。 IAD 接口集合中的接口必须连续(接口编号列表中不能有间隙),因此具有第一个接口号的计数足以指定集合中的所有接口。
访问 IAD 的内容
客户端驱动程序无法直接访问 IAD 描述符。 IAD 工程更改通知(ECN)指定,设备在收到来自配置描述符(GetDescriptor 配置)主机软件的请求时返回的配置信息中必须包含 IAD。 主机软件无法使用 GetDescriptor 请求直接检索 IAD。
但是,客户端驱动程序可以查询 USB 设备的父驱动程序以获取设备的硬件标识符(ID),并且设备的硬件 ID 包含有关 IAD 字段的嵌入式信息。
USB 接口关联描述符示例
本部分演示复合 USB 设备的描述符布局。 示例设备具有两个功能:
视频类函数
接口关联描述符(IAD)定义此函数。 该函数包含两个接口:接口零(0)和接口一(1)。
系统为函数生成硬件和兼容的标识符(ID),如 支持无线移动通信设备类中所述。 OS 与相应的 INF 文件匹配后,系统将加载视频类驱动程序堆栈。
人工输入设备(HID)功能
此函数仅包含接口 2(2)。
系统为功能生成硬件和兼容 ID,如 USB 复合设备上的接口集合枚举中所述。 OS 与相应的 INF 文件匹配后,系统会加载人工输入设备(HID)类驱动程序。
描述符如下所示:
设备描述符
BYTE bLength 0x12
BYTE bDescriptorType 0x01
WORD bcdUSB 0x0200
BYTE bDeviceClass 0xEF
BYTE bDeviceSubClass 0x02
BYTE bDeviceProtocol 0x01
BYTE bMaxPacketSize0 0x40
WORD idVendor 0x045E
WORD idProduct 0xFFFF
WORD bcdDevice 0x0100
BYTE iManufacturer 0x01
WORD iProduct 0x02
WORD iSerialNumber 0x02
BYTE bNumConfigurations 0x01
配置描述符
BYTE bLength 0x09
BYTE bDescriptorType 0x02
WORD wTotalLength 0x...
BYTE bNumInterfaces 0x03
BYTE bConfigurationValue 0x01
BYTE iConfiguration 0x01
BYTE bmAttributes 0x80 // (BUS Powered)
BYTE bMaxPower 0x19 // (50 mA)
接口关联描述符
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
视频控制接口描述符
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x00
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x0E
BYTE bInterfaceSubClass 0x01
BYTE bInterfaceProtocol 0x00
BYTE iInterface 0x05
视频控制类特定描述符
. . . .
. . . .
. . . .
视频控制终结点描述符
. . . .
. . . .
. . . .
视频流式处理接口描述符
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x01
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x0E
BYTE bInterfaceSubClass 0x02
BYTE bInterfaceProtocol 0x00
BYTE iInterface 0x06
视频流类特定的描述符
. . . .
. . . .
. . . .
视频流式处理终结点描述符
. . . .
. . . .
. . . .
人工输入设备(HID)接口描述符
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x02
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x03
BYTE bInterfaceSubClass 0x01
BYTE bInterfaceProtocol 0x01
BYTE iInterface 0x07
HID 类特定的描述符
. . . .
. . . .
. . . .
HID 终结点描述符
. . . .
. . . .
. . . .