USB 接口关联描述符

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

特定于类的描述符:

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

终结点描述符:

    . . . .
    . . . .
    . . . .
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值