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 终结点描述符

    . . . .
    . . . .
    . . . .