USB 接口关联描述符 (IAD) 允许设备将属于一个函数的接口组合在一起。本主题描述客户端驱动程序如何能够确定设备是否包含某个函数的 IAD。
通用串行总线规范版本 2.0 不支持将复合设备的多个接口组合在单一函数中。不过,USB 设备工作组 (DWG) 创建了允许函数具有多个接口的 USB 设备类,而且 USB 实施者论坛发布了工程变更通知 (ECN),为组合接口定义了一种机制。
ECN 指定一个称为接口关联描述符 (IAD) 的 USB 描述符,可让硬件制造商定义接口的组合。最有可能使用 IAD 的设备类包括:
-
USB 视频类规范(类代码 - 0x0E)
-
USB 音频类规范(类代码 - 0x01)
-
USB 蓝牙类规范(类代码 - 0xE0)
Windows 7、Windows Server 2008、Windows Vista、Microsoft Windows Server 2003 Service Pack 1 (SP1) 和 Microsoft Windows XP Service Pack 2 (SP2) 支持 IAD。
以下各小节描述了有关如何使用 IAD 的信息。
复合设备如何提醒操作系统其固件中有 IAD?
复合设备制造商一般按通用串行总线规范的指定对设备描述符中的设备类 (bDeviceClass)、子类 (bDeviceSubClass) 和协议 (bDeviceProtocol) 字段分配零值。这可让制造商将每个接口与不同的设备类和协议关联起来。
USB-IF 核心团队设计了一种特殊类和协议代码集,可通知操作系统设备固件中存在一个或多个 IAD。设备的设备描述符必须具有下表中显示的值,否则操作系统将不能正确检测设备的 IAD 或组合设备的接口。
设备描述符字段 | 字段所需值 |
---|---|
bDeviceClass | 0xEF |
bDeviceSubClass | 0x02 |
bDeviceProtocol | 0x01 |
bDeviceClass:0xEF bDeviceSubClass:0x02 bDeviceProtocol:0x01
这些代码值还提醒不支持 IAD 的 Windows 版本安装一个能够正确枚举设备的专用总线驱动程序。如果设备描述符中没有这些代码,系统可能无法枚举设备,或者设备可能无法正确运行。
一台设备可以具有多个 IAD。每个 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) 指定 IAD 必须包括在设备在收到来自配置描述符(GetDescriptor 配置)的主机软件的请求时返回的配置信息中。主机软件不能通过 GetDescriptor 请求直接检索 IAD。
不过,客户端驱动程序可以查询 USB 设备的父驱动程序以获得设备的硬件描述符 (ID),而设备的硬件 ID 包含有关 IAD 的字段的嵌入信息。
USB 接口关联描述符示例
下面举例说明了复合 USB 设备的描述符布局。示例设备有两个函数:
-
函数 1:Video Class
-
此函数由接口关联描述符 (IAD) 定义,并包含两个接口:接口零 (0) 和接口一 (1)。
系统为该函数生成硬件和兼容描述符 (ID),如通过 IAD 枚举 USB 设备上的接口集合中所述。在匹配适当的 INF 文件之后,系统将加载视频类驱动程序堆栈。
函数 2:Human Input Device
-
此函数仅包含一个接口,即接口二 (2)。
系统为该函数生成硬件和兼容 ID,如枚举 USB 复合设备上的接口中所述。在匹配适当的 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
特定于类的描述符:
. . . . . . . . . . . .
终结点描述符:
. . . . . . . . . . . .
接口描述符(人体学输入设备):
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
特定于类的描述符:
. . . . . . . . . . . .
终结点描述符:
. . . . . . . . . . . .