USB 接口关联描述符

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

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