USB 驱动描述符资料整理
USB 接口关联描述符
M
O
USB 接口关联描述符 (IAD) 允许设备对属于某个函数的接口进行分组。 本主题介绍客户端驱动程序如何确定设备是否包含函数的 IAD。
通用串行总线规范修订版 2.0 不支持在单个函数中对复合设备的多个接口进行分组。 但是,USB 设备工作组 (DWG) 创建了允许具有多个接口的函数的 USB 设备类,并且 USB 实施者论坛发布了一个工程更改通知 (ECN) ,该通知定义了用于对接口进行分组的机制。
ECN 指定 USB 描述符,称为接口关联描述符 (IAD) ,允许硬件制造商定义接口的分组。 最有可能使用 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
这些代码值还会Windows IAD 的驱动程序版本发出警报,以安装正确枚举设备的特殊用途总线驱动程序。 如果设备描述符中没有这些代码,则系统可能无法枚举设备,或者设备可能无法正常运行。
设备可以具有多个 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) 指定当设备收到来自主机软件对配置描述符 (GetDescriptor 配置) 的请求时,设备返回的配置信息中必须包含 IAD。 主机软件无法使用 GetDescriptor 请求直接检索 IAD。
但是,客户端驱动程序可以查询 USB 设备的父驱动程序,获取设备的硬件标识符 (ID) ,并且设备的硬件 ID 包含有关 IAD 字段的嵌入信息。
USB 接口关联描述符示例
下面演示了复合 USB 设备的描述符布局。 示例设备有两个功能:
函数 1:视频类
此函数由接口关联描述符 (IAD) 定义,并包含两个接口:接口零 (0) 接口和接口 1 (1) 。
系统为 函数生成 (标识符) 标识符,如支持无线 移动设备设备类 中所述。 匹配相应的 INF 文件后,系统将加载视频类驱动程序堆栈。
函数 2:人工输入设备
此函数仅包含一个接口:接口 2 (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
特定于类的描述符 () :
. . . .
. . . .
. . . .
终结点描述符 () :
. . . .
. . . .
. . . .
本文来自博客园,作者:ljymoonlight,转载请注明原文链接:https://www.cnblogs.com/ljymoonlight/p/15192166.html
posted on 2021-08-27 00:17 ljymoonlight 阅读(317) 评论(0) 收藏 举报
浙公网安备 33010602011771号