USB 接口关联描述符
USB 接口关联描述符 (IAD) 允许设备对属于某个函数的接口进行分组。 本文介绍客户端驱动程序如何确定设备是否包含函数的 IAD。
通用串行总线规范(修订版 2.0)不支持在单个函数中对复合设备的多个接口进行分组。 但是,USB 设备工作组 (DWG) 创建了允许具有多个接口的函数的 USB 设备类。 USB 实施者论坛 (ECN) 发布了工程更改通知,该通知定义了接口分组机制。
ECN 指定一个 USB 描述符(称为接口关联描述符 (IAD) ),它允许硬件制造商定义接口分组。 最有可能使用 IAD 的设备类包括:
- USB 视频类规范 (类代码 - 0x0E)
- USB 音频类规范 (类代码 - 0x01)
- USB 蓝牙类规范 (类代码 - 0xE0)
如何使用 IAD
以下小节介绍有关如何使用 IAD 的信息。
在固件中向 Windows 发出 IAD 警报的复合设备
根据通用串行总线规范的指定,复合设备的制造商通常会将值分配给设备类 (bDeviceClass) 、子类 (bDeviceSubClass) 和协议 (bDeviceProtocol) 字段的值。 制造商可以将每个单独的接口与不同的设备类和协议相关联。
USB-IF 核心团队设计了一个特殊的类和协议代码集,用于通知操作系统设备固件中存在一个或多个 IAD。 设备描述符必须具有下表中显示的值,否则操作系统无法正确检测设备的 IAD 或对设备的接口进行分组。
设备描述符字段 | 所需的值 |
---|---|
bDeviceClass | 0xEF |
bDeviceSubClass | 0x02 |
bDeviceProtocol | 0x01 |
代码值警告不支持 IAD 的 Windows 版本安装正确枚举设备的特殊用途总线驱动程序。 如果没有设备描述符中的这些代码,系统可能无法枚举设备,或者设备可能无法正常工作。
一个设备可以有多个 IAD。 每个 IAD 必须紧挨在 IAD 描述的接口组中的接口之前。
函数类 (bFunctionClass) 、子类 (bFunctionSubclassClass) ,以及 IAD 的协议 (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 (0) 和接口 1 (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 终结点描述符
. . . .
. . . .
. . . .