USB 复合设备上的接口集合枚举概述

复合 USB 设备上的接口可以分组到集合中。 USB 通用父驱动程序(Usbccgp.sys)可以通过四种方式枚举接口集合。

这些四种接口集合枚举方法按分层方式排列:

  1. 供应商提供的回调例程

    如果供应商向 USB 泛型父驱动程序(Usbccgp.sys)注册了回调例程,则泛型父驱动程序优先于回调例程,并允许回调例程对接口进行分组,而不是使用其他方法。 有关使用供应商提供的回调例程枚举接口集合的详细信息,请参阅 USB 复合设备上的接口集合枚举。

  2. Union 功能描述符

    。 如果供应商在 USB 通用父驱动程序中启用了 CDC 和 WMCDC 枚举,则泛型父驱动程序使用 联合功能描述符 (UFDs)将接口分组到集合中。 启用后,此方法优先于所有其他方法,但供应商提供的回调例程除外。

  3. 接口关联描述符

    如果 存在接口关联描述符 (IAD),USB 泛型父驱动程序始终使用 IAD 而不是使用旧方法对接口进行分组。 Microsoft建议供应商使用 IAD 来定义接口集合。

  4. 旧版音频方法

    USB 泛型父驱动程序可以使用为音频函数保留的旧技术枚举接口集合。 如果设备上有任何 IAD,则通用父驱动程序不使用此方法。

自定义复合设备的接口集合的枚举

某些 USB 设备具有 USB 接口关联描述符(IAD)无法描述的接口集合。 在 Windows Vista 及更高版本的操作系统中,供应商可以自定义 USB 通用父驱动程序(Usbccgp.sys)定义和枚举设备的接口集合的方式。 这是通过 筛选器驱动程序中的枚举回调例程 完成的。 回调例程可帮助通用父驱动程序为设备定义自定义接口集合。

要使通用父驱动程序定义自定义接口集合,复合设备的供应商必须:

  1. 实现枚举回调例程(USBC_START_DEVICE_CALLBACK)。
  2. 提供指向 USB 设备配置接口(USBC_DEVICE_CONFIGURATION_INTERFACE_V1的 StartDeviceCallback 成员)中的回调例程的指针。
  3. 提供与复合设备的设备 ID 匹配的 INF 文件,并显式加载 USB 通用父驱动程序和筛选器驱动程序。

实施注意事项

包含枚举回调例程的筛选器驱动程序可以是上限或较低的筛选器驱动程序。 当 USB 通用父驱动程序收到启动复合设备的IRP_MN_START_DEVICE请求时,它会通过向驱动程序堆栈顶部发送IRP_MN_QUERY_INTERFACE请求来查询 USB 设备配置接口。

收到IRP_MN_QUERY_INTERFACE请求时,筛选器驱动程序必须检查请求的 InterfaceType 成员中的 GUID 类型,以验证请求的接口的类型是否为USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID。 如果是,筛选器驱动程序将返回指向 IRP 接口成员中的 接口 的指针。

枚举回调例程必须返回指向描述接口集合的 函数描述符USBC_FUNCTION_DESCRIPTOR)数组的指针。 每个函数描述符都包含描述接口描述符(USB_INTERFACE_DESCRIPTOR)数组,用于描述接口集合。 回调例程必须同时从非分页池分配函数描述符和接口描述符。 通用父驱动程序释放此内存。 回调例程必须确保每个USB_INTERFACE_DESCRIPTOR的 NumberOfInterfaces 成员准确报告接口集合中的接口数。

通用父驱动程序为每个函数描述符创建物理设备对象(PDO)。

USB 设备配置接口和枚举回调例程在通用父驱动程序例程汇总。

USB 通用父驱动程序加载机制

当复合设备满足 USB 复合设备枚举中所述的要求时,操作系统将生成兼容的 ID,USB\COMPOSITE以指示设备是复合的。 兼容的 ID 在 Usb.inf 中生成匹配项,操作系统会自动加载 USB 通用父驱动程序,而无需供应商提供的 INF 文件帮助。

但是,此默认机制不适用于需要接口集合自定义枚举的复合设备,因为在默认机制中,系统不会加载所需的供应商提供的筛选器驱动程序。 若要使枚举回调例程机制正常工作,当 USB 泛型父级枚举复合设备的接口集合时,必须已加载公开 USB 设备配置接口的筛选器驱动程序。 这要求复合设备的供应商安装与复合设备的设备 ID 匹配的 INF 文件,并显式加载 USB 通用父驱动程序和筛选器驱动程序。

对无线移动通信设备类的支持

在 Windows Vista 中, USB 通用父驱动程序(Usbccgp.sys) 为通用串行总线(USB)通信设备类(CDC)和 USB 无线移动通信设备类(WMCDC)中包含的设备提供支持。

当设备连接到 USB 端口时,USB 无线移动通信设备类(WMCDC)规范为主机与无线移动设备(例如手机)之间的连接、控制和内容交换建立了标准。 WMCDC 是通信设备类(CDC)的扩展,其中包括广泛的通信和网络设备。 本部分介绍在 Windows 操作系统中支持 CDC 和 WMCDC 设备的体系结构。

WMCDC 设备由多个功能组成,这些函数分组到 逻辑手机中。 大多数 WMCDC 设备都有单个逻辑手机,但设备可能有多个逻辑手机。 逻辑手机通常包括数据/传真调制解调器、对象存储和呼叫控制设施等功能。 逻辑手机还可能包括由其他 USB 规范定义的支持函数,例如 USB 音频类规范、USB 人工输入设备(HID)类规范和 USB 视频类规范。

Windows WMCDC 体系结构使用本机 Windows 驱动程序来管理 WMCDC 设备的功能。 例如,可以使用 Windows 电话应用程序接口 (TAPI) 子系统来管理设备的语音和数据/传真调制解调器功能以及 Windows 网络驱动程序接口规范 (NDIS) 子系统来管理设备的以太网 LAN 功能。 此外,还可以在用户模式软件中管理一些函数,例如对象交换协议(OBEX)函数(Winusb.sys)。

此图显示了 WMCDC 设备的示例驱动程序堆栈。

示例设备配置和驱动程序堆栈的关系图。

在上图中,WMCDC 设备包含单个逻辑手机:OBEX 函数和调制解调器函数。 供应商提供的 INF 文件加载本机 Windows 驱动程序来管理调制解调器。 OBEX 函数由供应商提供的用户模式驱动程序管理,该驱动程序在用户模式驱动程序框架(UMDF)中运行。 用户模式驱动程序使用 Windows 可移植设备(WPD)协议与用户应用程序通信,以及面向开发人员的 WinUSB 简介导出以与 USB 堆栈通信的界面。 通常,供应商提供的 INF 文件将为每个使用Winusb.sys的接口集合加载单独的Winusb.sys实例。

注册表设置

USB 堆栈不会自动支持 WMCDC。 必须提供加载Usbccgp.sys实例的 INF 文件。 INF 文件必须包含一个 AddReg 节,该节将与Usbccgp.sys关联的软件键中的 EnumeratorClass 注册表值设置为从三个数字构造的REG_BINARY值:0x02、0x00 和 0x 00。 示例 INF 文件中的以下代码示例演示如何将 EnumeratorClass 设置为适当的值。

[CCGPDriverInstall.NT]
Include=usb.inf
Needs=Composite.Dev.NT
AddReg=CCGPDriverInstall.AddReg

[CCGPDriverInstall.NT.Services]
Include=usb.inf
Needs=Composite.Dev.NT.Services

[CCGPDriverInstall.AddReg]
HKR,,EnumeratorClass, 0x00000001,02,00,00

必须分配给 EnumeratorClass 的值是从 INF 文件中由十六进制数字对表示的三个 1 字节二进制值构造的:02、00 和 00。 这三个数字对应于 USB 实现者论坛分别分配给 CDC 设备类、CDC 设备子类和 CDC 设备协议的值。

以下主题进一步介绍了 WMCDC:

枚举 WMCDC 上的接口集合

USB 无线移动通信设备类(WMCDC)是 USB 通信设备类(CDC)的子类。 WMCDC 规范扩展,但不会大幅更改定义接口集合的 CDC 准则。 具体而言,WMCDC 设备必须符合用于定义接口集合的 CDC 准则。

CDC 接口集合包含属于通信接口类()或数据接口类()的主接口(bInterfaceClass = 0x02USB_INTERFACE_DESCRIPTOR)。bInterfaceClass = 0x0A 如果主接口属于通信接口类(这是典型情况),则主接口 (bInterfaceSubClass) 的子类指定 CDC 控制模型。 控件模型指示接口集合中包含的接口的类型。 有关 USB 实现者论坛定义的控制模型的说明,请参阅 CDC 规范和 WMCDC 规范。

接口集合的主接口后跟一组强制类特定的功能描述符,包括联合功能描述符(UFD)。 UFD 列出属于集合的接口数。 UFD 的 bMasterInterface 字段包含主接口的数目。 零个或多个 bSubordinateInterface 字段包含集合中其他(从属)接口的数目。

对于大多数类型的控制模型, USB 通用父驱动程序(Usbccgp.sys) 为每个 UFD 创建一个物理设备对象(PDO)。 但某些控件模型包括一个音频接口,泛型父驱动程序独立于音频接口所属的接口集合进行枚举。 音频接口显示在接口集合的 UFD 的从属接口(bSubordinateInterface)列表中,但通用父驱动程序将为音频接口创建单独的 PDO。 音频接口的 PDO 和音频接口所属接口集合的 PDO 都直接高于设备对象树中父复合设备的功能设备对象(FDO)。 音频接口的 PDO 不是接口集合的子级。

注册表中可配置枚举特征的两个控制模型:无线手机控制模型(WHCM),该模型定义逻辑手机,以及对象交换协议(OBEX)控制模型。 若要配置这两个控制模型的枚举特征,必须提供一个 INF 文件,该文件加载Usbccgp.sys实例,并在Usbccgp.sys实例的软件键中设置 CdcFlags 的值。 下表描述了 CdcFlags 的配置选项

CdcFlags 位 位设置为 0 位设置为 1
0 (掩码 = 0x00000001) USB 通用父驱动程序为每个 OBEX 接口创建单独的 PDO。 USB 通用父驱动程序为所有 OBEX 接口创建单个 PDO。
1 (掩码 = 0x00000010) USB 通用父驱动程序不会为 WHCM 接口(逻辑手机)创建 PDO。 这些接口仍从设备对象树的角度隐藏。 USB 通用父驱动程序为每个 WHCM 接口创建 PDO。

例如,若要清除这两个位(将其设置为 0),INF 文件应在 DDInstall.AddReg 节中具有以下行。

HKR, , CdcFlags, 0x00010001, 0x00000000

若要将这两个位设置为 1,INF 文件应具有以下行。

HKR, , CdcFlags, 0x00010001, 0x00000011

若要将位 0 设置为 1 和位 1 到 0,INF 文件应具有以下行。

HKR, , CdcFlags, 0x00010001, 0x00000001

可以独立于其他位设置或重置任一位。

下图说明了不同的注册表配置如何为同一设备创建不同的设备树。

下图演示了当 CdcFlags 的位 0 和位 1 为 0 时 PDO 配置。

显示 CdcFlags = 0x00000000的接口集合到设备对象映射的关系图。

上图中的无线手机控制模型(WHCM)接口集合包含三个从属接口集合(bSubordinateInterface):两个 OBEX 集合和一个调制解调器集合。 CdcFlags位 0 为 0,因此 USB 通用父驱动程序不会为 WHCM 接口集合创建 PDO。 CdcFlags位 1 为 0,因此 USB 通用父驱动程序为每个 OBEX 接口集合生成单独的 PDO。

下图演示了设置 CdcFlags 的位 0 和位 1 时的 PDO 配置。

说明 CdcFlags = 0x00010001 的设备对象映射的接口集合的关系图。

由于 CdcFlags位 0 设置为 1,因此 USB 通用父驱动程序将为 WHCM 接口集合创建 PDO。 由于 CdcFlags位 1 设置为 1,因此 USB 通用父驱动程序将两个 OBEX 集合组合在一起,并为这两个 OBEX 集合生成单个 PDO。

你可能希望在内核级别使用单个 PDO 来表示 OBEX 集合,并区分用户模式驱动程序中的每个 OBEX 集合。 Windows 可移植设备(WPD)协议可帮助你在用户级别的不同 OBEX 函数之间多路复用数据流,当所有 OBEX 函数都分组到内核级别的单个 PDO 中。

以下示例 INF 文件加载 USB 泛型父驱动程序来管理 WMCDC 设备,并指示 USB 泛型父级为逻辑手机创建 PDO,并为逻辑手机中的所有 OBEX 集合创建单个 PDO。

[Version]
Signature="$Windows NT$"
Class=USB
ClassGUID={36FC9E60-C465-11CF-8056-444553540000}
Provider=%MSFT%
DriverVer=07/01/2001,5.1.2600.0
CatalogFile=ExampleCatalog.cat
PnpLockdown=1

[ControlFlags]
ExcludeFromSelect=*

[Manufacturer]
CompanyName=CompanyName,NTamd64

[CompanyName.NTamd64]
%COMPANYNAME.DeviceDesc%=CCGPDriverInstall,USB\Vid_????&Pid_????

[CCGPDriverInstall.NT]
Include=usb.inf
Needs=Composite.Dev.NT
AddReg=CCGPDriverInstall.AddReg

[CCGPDriverInstall.NT.Services]
Include=usb.inf
Needs=Composite.Dev.NT.Services

[CCGPDriverInstall.AddReg]
HKR,,EnumeratorClass,0x00000001,02,00,00
HKR,,CdcFlags,0x00010001,0x00010001

[Strings]
MSFT="Microsoft"
COMPANYNAME.DeviceDesc="USB Phone Parent"

处理 CDC 和 WMCDC 接口集合

USB 通用父驱动程序以特殊方式处理无线手机控制模型(WHCM)接口。

以下列表总结了处理 CDC 和 WMCDC 接口集合与其他接口集合不同的最重要的方法:

  • 无线移动通信设备类允许有限数量的接口集合嵌套。 具体而言,逻辑手机接口集合(即 WHCM 接口集合)可以包含其他从属接口集合。 例如,符合 WMCDC 的手机可以具有 WHCM 接口集合,而该集合又包含抽象控件模型集合和 OBEX 集合。
  • 可以将 USB 通用父驱动程序配置为不枚举 WHCM 接口集合。 未枚举的 WHCM 接口集合将保持隐藏状态,但泛型父驱动程序使用属于 WHCM 接口集合的联合函数描述符(UFDs)中的信息对从属接口集合进行分组和枚举。
  • 可以将 USB 通用父驱动程序配置为为 OBEX 控制模型接口集合创建单独的物理设备对象(PDO),或为所有 OBEX 控件模型接口集合创建单个 PDO。
  • UFD 中的接口编号列表可以有差距。 也就是说,UFD 的接口编号可以引用不连续的接口。 此类编号无效,例如,对于 USB 接口关联描述符(IAD),其接口必须连续且具有顺序编号。
  • UFD 可以包含相关的音频接口集合
  • CDC 和 WMCDC 接口集合的硬件标识符(ID)必须包含接口子类。 其他 USB 接口(其硬件 ID 包含指定接口号的 MI_%02X 后缀)不包含有关接口子类的信息。 子类信息包含在硬件 ID 中,允许供应商为特定接口集合提供硬件 ID 匹配项的 INF 文件,而不是依赖描述符布局中的接口位置来确定要为集合加载的驱动程序。 硬件 ID 中的子类信息还允许从当前供应商提供的驱动程序逐步迁移路径,这些驱动程序管理 WMCDC 接口集合,例如用户模式驱动程序。 有关如何设置 USB 接口硬件 ID 格式的一般讨论,请参阅 USB 设备的标识符。

CDC 和 WMCDC 控制模型

CDC 和 WMCDC 控制模型部分介绍了Microsoft Windows 操作系统支持的接口集合的属性。 每个说明包括 USB 通用父驱动程序为接口集合生成的硬件和设备标识符(ID)列表,等等。

Windows 支持的大多数接口集合对应于属于通信设备类(CDC)和无线移动通信设备类(WMCDC)的控制模型,但操作系统还支持旧式音频和视频接口集合以及移动计算推广联盟(MCPC)定义的接口集合。

本节中所述的接口集合如下:

音频类接口

CDC 和 WMCDC 设备上发生的 USB 音频设备类接口集合具有以下属性。

properties 说明
参考 音频设备的通用串行总线设备类定义,版本 1.0。
接口集合中的所有接口都必须属于音频设备类(0x01)。
子类 接口集合中的每个接口都必须具有与集合中第一个接口不同的子类。
协议 无(0x00)。
Enumerated 是的。
相关接口 属于流式处理子类的零个或多个连续接口(0x02)。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&MI_%02x
USB\Vid_%04x&Pid_%04x&MI_%02x

音频接口集合的硬件 ID 不包含特定于接口类的信息。
Compatible IDs USB\Class_01&SubClass_01&Prot_00
USB\Class_01&SubClass_01
USB\Class_01

音频接口集合的兼容 ID 格式包含有关接口类、接口子类和协议的嵌入信息。 对于 CDC 或 WMCDC 设备上的音频接口集合,接口类为 01,子类为 01,协议为 00。

CDC 抽象控制模型

抽象控制模型有两个版本(ACM)。 原始版本在 USB 通信设备类(CDC)规范中定义。 USB 无线移动通信设备类 (WMCDC) 规范包含 ACM 的扩展定义。

此页介绍了符合 WMCDC 规范的接口集合。

符合 CDC 规范的接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.6.2 节。
主接口的类 通信接口类(0x02)。
主接口的子类 ACM (0x02)。
协议 任何。
Enumerated 是的。
相关接口 联合功能描述符 (UFD) 引用的一个数据类接口和可选的音频类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_02&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_02
USB\Vid_%04x&Pid_%04x&Cdc_02&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_02
Compatible IDs USB\Class_02&SubClass_02&Prot_%02X
USB\Class_02&SubClass_02
USB\Class_02
特殊处理 UFD 可以引用独立于 ACM 接口集合枚举的音频接口集合。

CDC ATM 网络控制模型

USB CDC ATM 网络控制模型 (ANCM) 接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.8.3 节
主接口的类 通信接口类 (0x02)
主接口的子类 ANCM (0x07)
协议 无(0x00)
Enumerated
相关接口 联合功能描述符 (UFD) 引用的一个数据类接口
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_07&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_07
USB\Vid_%04x&Pid_%04x&Cdc_07&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_07
Compatible IDs USB\Class_02&SubClass_07&Prot_00
USB\Class_02&SubClass_07
USB\Class_02
特殊处理

CDC CAPI 控制模型

USB CDC Common ISDN API (CAPI) 控制模型接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.7.2 节
主接口的类 通信接口类 (0x02)
主接口的子类 CAPI (0x05)
协议 无(0x00)
Enumerated
相关接口 联合功能描述符(UFD)引用的一个数据类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_05&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_05
Compatible IDs USB\Class_02&SubClass_05&Prot_00
USB\Class_02&SubClass_05
特殊处理

CDC 直接线控制模型

USB CDC 直接线控制模型 (DLCM) 接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.6.1 节。
主接口的类 通信接口类(0x02)。
主接口的子类 DLCM (0x01)。
协议 无(0x00)。
Enumerated 是的。
相关接口 联合功能描述符(UFD)引用的音频类或供应商定义的接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_01&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_01
USB\Vid_%04x&Pid_%04x&Cdc_01&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_01
Compatible IDs USB\Class_02&SubClass_01&Prot_00
USB\Class_02&SubClass_01``USB\Class_02
特殊处理 UFD 引用独立于 DLCM 接口集合枚举的音频类接口集合。

CDC 以太网网络控制模型

USB CDC 以太网网络控制模型 (ENCM) 接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.8.2 节。
主接口的类 通信接口类(0x02)。
主接口的子类 ENCM (0x06)。
协议 无(0x00)。
Enumerated 是的。
相关接口 联合功能描述符(UFD)引用的一个数据类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_06&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_06
USB\Vid_%04x&Pid_%04x&Cdc_06&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_06
Compatible IDs USB\Class_02&SubClass_06&Prot_00
USB\Class_02&SubClass_06
USB\Class_02
特殊处理 此控件模型的兼容 ID 在Microsoft提供的 INF 文件中具有匹配项。 如果操作系统找不到供应商提供的 INF 文件中某个硬件 ID 的匹配项,则系统会自动加载本机 NDIS 微型端口驱动程序来管理接口集合。

CDC 多通道 ISDN 控制模型

USB CDC 多通道 ISDN 控制模型 (MCCM) 接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.7.1 节
主接口的类 通信接口类 (0x02)
主接口的子类 MCCM (0x04)
协议 无(0x00)
Enumerated
相关接口 联合功能描述符(UFD)引用的多个数据类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_04&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_04
USB\Vid_%04x&Pid_%04x&Cdc_04&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_04
Compatible IDs USB\Class_02&SubClass_04&Prot_00
USB\Class_02&SubClass_04
USB\Class_02
特殊处理

CDC 电话控制模型

USB CDC 电话控制模型 (TCM) 接口集合具有以下属性。

properties 说明
参考 通信设备的通用串行总线类定义,版本 1.1,第 3.6.3 节。
主接口的类 通信接口类(0x02)。
主接口的子类 中医(0x03)。
协议 任何。
Enumerated 是的。
相关接口 联合功能描述符 (UFD) 引用的音频类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_03&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_03
USB\Vid_%04x&Pid_%04x&Cdc_03&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_03
兼容 ID USB\Class_02&SubClass_03&Prot_%02X
USB\Class_02&SubClass_03
USB\Class_02
特殊处理 UFD 可以引用独立于 TCM 接口集合枚举的音频类接口集合。

MCPC 供应商唯一接口

移动计算推广联盟(MCPC)在无线移动通信设备类(WMCDC)规范为供应商唯一 CDC 设备提供格式之前为接口集合定义了格式。 因此,MCPC 接口集合不符合 WMCDC 标准。

但是,如果启用了 WMCDC,USB 泛型父驱动程序可以枚举 MCPC 接口集合。 MCPC 接口集合具有以下属性。

properties 说明
参考 移动计算推广联盟 (MCPC) GL-004 规范
CDC(0x02)
子类 0x88
协议 无(0x00)
Enumerated
相关接口 联合功能描述符(UFD)引用的零个或多个数据类接口
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_88&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_88
USB\Vid_%04x&Pid_%04x&Cdc_88&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_88
Compatible IDs USB\Class_02&SubClass_88&Prot_00
USB\Class_02&SubClass_88
USB\Class_02
特殊处理

视频类接口

CDC 和 WMCDC 设备上发生的 USB 视频设备类接口集合具有以下属性。

properties 说明
参考 视频设备的通用串行总线设备类定义,版本 1.0。
视频(0x0E)。
子类 视频控制(0x01)。
协议 无(0x00)。
Enumerated 是的。
相关接口 属于流式处理子类的零个或多个连续接口(0x02)。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&MI_%02x
USB\Vid_%04x&Pid_%04x&MI_%02x
Compatible IDs USB\Class_0E&SubClass_01&Prot_00
USB\Class_0E&SubClass_01
USB\Class_0E
特殊处理 视频类接口集合在 CDC 设备上接收特殊处理。 在非 CDC 设备上,视频类接口集合由接口关联描述符(IADs)定义。 在 CDC 设备上,视频类接口集合由联合功能描述符(UFD)定义。

WMCDC 抽象控件模型

抽象控件模型有两个版本(ACM)。 原始版本在 USB 通信设备类(CDC)规范中定义。 USB 无线移动通信设备类 (WMCDC) 规范包含 ACM 的扩展定义。 包含传真/调制解调器功能的 ACM 集合应使用 ACM 的 WMCDC 定义,而不是原始 CDC ACM 定义。

此页介绍了符合 CDC 规范的接口集合。

符合 WMCDC 规范的接口集合具有以下属性。

properties 说明
参考 无线移动通信设备的通用串行总线 CDC 子类规范,版本 1.0,第 6.2 节。
主接口的类 通信接口类(0x02)。
主接口的子类 ACM (0x02)。
协议 如果集合使用 AT 命令集协议,则嵌入在兼容 ID 中的协议值0x01。 如果集合使用 WMCDC 规范描述的协议之一,则嵌入在兼容 ID 中的协议值通过0x06或0xFE 0x2。
Enumerated 是的。
相关接口 联合功能描述符(UFD)引用的一个数据类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_Modem&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_Modem
USB\Vid_%04x&Pid_%04x&Cdc_Modem&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_Modem
Compatible IDs USB\Class_02&SubClass_Modem&Prot_%02X
USB\Class_02&SubClass_Modem
USB\Class_02
特殊处理 UFD 可能引用独立于 ACM 接口集合枚举的音频接口集合。

接口集合必须符合 WMCDC 规范第 6.2 节中指定的特殊描述符和终结点要求。 如果接口集合不符合 WMCDC 要求,但接口符合 CDC 要求,USB 泛型父驱动程序将枚举接口集合和具有 CDC 格式的通用硬件 ID。

此控件模型的兼容 ID 在Microsoft提供的 INF 文件中具有匹配项。 如果操作系统找不到供应商提供的 INF 文件中某个硬件 ID 的匹配项,则系统会自动加载本机电话应用程序编程接口 (TAPI) 调制解调器筛选器驱动程序来管理调制解调器功能并设置相应的 TAPI 注册表设置,除非协议代码0xFE。 如果协议代码0xFE,供应商必须提供设备或类共同安装程序才能正确填充 TAPI 注册表设置。

WMCDC 设备管理模型

USB WMCDC 设备管理模型 (DMM) 接口集合具有以下属性。

properties 说明
参考 无线移动通信设备的通用串行总线 CDC 子类规范,版本 1.0,第 6.6 节。
主接口的类 通信接口类(0x02)。
主接口的子类 DMM (0x09)。
协议 任何。
Enumerated 是的。
相关接口 无。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_09&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_09
USB\Vid_%04x&Pid_%04x&Cdc_09&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_09
Compatible IDs USB\Class_02&SubClass_09&Prot_%02X
USB\Class_02&SubClass_09
USB\Class_02
特殊处理 此控件模型不使用联合功能描述符(UFD)。

WMCDC 移动直接线路模型

USB WMCDC 移动直接线路模型 (MDLM) 接口集合具有以下属性:

properties 说明
参考 无线移动通信设备的通用串行总线 CDC 子类规范,版本 1.0,第 6.7 节
主接口的类 通信接口类 (0x02)
主接口的子类 MDLM (0x0A)
协议 任意
Enumerated
相关接口 联合功能描述符(UFD)引用的一个或多个数据类接口
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_0A&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_0A
USB\Vid_%04x&Pid_%04x&Cdc_0A&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_0A
Compatible IDs USB\Class_02&SubClass_0A&Prot_%02X
USB\Class_02&SubClass_0A
USB\Class_02
特殊处理 无。

WMCDC OBEX 控制模型(多个 PDO)

有两种方法可以枚举对象交换协议(OBEX)控制模型接口集合:USB 通用父驱动程序可以将所有 OBEX 接口组合在一起,并为所有 OBEX 接口创建单个物理设备对象(PDO),或者父驱动程序可以为每个 OBEX 接口创建单独的 PDO。

当 USB 通用父驱动程序为每个 OBEX 接口分配单独的 PDO 时,PDO 具有以下属性。

properties 说明
参考 无线移动通信设备的通用串行总线 CDC 子类规范,版本 1.0,第 6.5 节。
主接口的类 通信接口类(0x02)。
主接口的子类 OBEX(0x0B)。
协议 无(0x00)。
Enumerated 是的。
相关接口 联合功能描述符(UFD)引用的一个数据类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_0B&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_0B
USB\Vid_%04x&Pid_%04x&Cdc_0B&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_0B
Compatible IDs USB\Class_02&SubClass_0B&Prot_00
USB\Class_02&SubClass_0B
USB\Class_02
特殊处理 与管理复合设备的 USB 通用父驱动程序实例关联的注册表设置确定 OBEX 接口是使用单个 PDO 还是多个 PDO 进行管理。

WMCDC OBEX 控制模型(单个 PDO)

有两种方法可以枚举对象交换协议(OBEX)控制模型接口集合:USB 通用父驱动程序可以将所有 OBEX 接口组合在一起,并为所有 OBEX 接口创建单个物理设备对象(PDO),或者父驱动程序可以为每个 OBEX 接口创建单独的 PDO。

当 USB 通用父驱动程序将单个 PDO 分配给所有 OBEX 接口时,PDO 具有以下属性。

properties 说明
参考 无线移动通信设备的通用串行总线 CDC 子类规范,版本 1.0,第 6.5 节。
主接口的类 通信接口类(0x02)。
主接口的子类 OBEX(0x0B)。
协议 无(0x00)。
Enumerated 是的。
相关接口 联合功能描述符(UFD)引用的一个数据类接口。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&WPD_OBEX&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&WPD_OBEX
USB\Vid_%04x&Pid_%04x&WPD_OBEX&MI_%02x
USB\Vid_%04x&Pid_%04x&WPD_OBEX
Compatible IDs USB\Class_02&WPD_OBEX
USB\Class_02
特殊处理 与管理复合设备的 USB 通用父驱动程序实例关联的注册表设置确定 OBEX 接口是使用单个 PDO 还是多个 PDO 进行管理。 有关指定 USB 泛型父驱动程序如何枚举 OBEX 接口的注册表设置的说明,请参阅 USB 复合设备上的接口集合枚举。

WMCDC 无线手机控制模型

USB 通用父驱动程序并不总是枚举无线手机控制模型 (WHCM) 接口集合。 与管理 WHCM 接口集合的 USB 通用父驱动程序实例关联的注册表设置确定 USB 泛型父驱动程序是否为接口集合创建物理设备对象(PDO)。 有关指定 USB 通用父驱动程序如何枚举 WHCM 接口的注册表设置的说明,请参阅 USB 复合设备上的接口集合枚举。

枚举的 WHCM 接口集合具有以下属性。

properties 说明
参考 无线移动通信设备的通用串行总线 CDC 子类规范,版本 1.0,第 6.1 节。
主接口的类 通信接口类(0x02)。
主接口的子类 WHCM (0x08)。
协议 无(0x00)。
Enumerated 是的。
相关接口 无。
硬件 ID USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_08&MI_%02x
USB\Vid_%04x&Pid_%04x&Rev_%04x&Cdc_08
USB\Vid_%04x&Pid_%04x&Cdc_08&MI_%02x
USB\Vid_%04x&Pid_%04x&Cdc_08
Compatible IDs USB\Class_02&SubClass_08&Prot_00
USB\Class_02&SubClass_08
USB\Class_02
特殊处理 联合功能描述符(UFD)标识与逻辑手机关联的接口。

上述主题中的硬件 ID 格式使用以下约定:

  • C 语言 printf 格式表示整数。 例如,“%04x”表示 4 位十六进制整数,“%02x”表示 2 位十六进制整数等。
  • 字符串“Vid_”后面的整数是 USB 委员会(<www.usb.org>)分配给供应商的供应商代码的 4 位十六进制表示形式。
  • 字符串“Pid_”后面的整数是供应商分配给设备的代码示例的 4 位十六进制表示形式。
  • 字符串“Rev_”后面的整数是设备的修订号的 4 位十六进制表示形式。
  • 字符串“Cdc_”后面的整数是接口子类。
  • 字符串“Prot_”后面的整数是协议号。
  • 字符串“MI_”后面的整数是接口编号的 2 位十六进制表示形式,该表示形式是从 接口描述符的 bInterfaceNumber 字段中提取的。

使用 IAD 的 USB 设备上的接口集合枚举

如果 USB 复合设备在其固件中具有接口关联描述符(IAD),Windows 会枚举接口集合,就像每个集合都是单个设备,并将单个物理设备对象(PDO)分配给每个接口集合,并将硬件和兼容标识符(ID)与 PDO 相关联。 有关 IAD 的详细说明,请参阅 USB 接口关联描述符。 本部分介绍分配给与 IAD 关联的接口集合的硬件 ID 和兼容标识符(ID)。

具有 IAD 的 USB 设备的硬件 ID

USB\VID_v(4)&PID_p(4)&Rev_r(4)&MI_z(2)

USB\VID_v(4)&PID_p(4)&MI_z(2)

在这些硬件 ID 中,

  • v(4) 是 USB 委员会分配给供应商的四位数供应商代码,是从设备描述符的 idVendor 字段中提取的。
  • p(4) 是供应商分配给设备的四位数错误代码,是从设备描述符的 idProduct 字段中提取的。
  • r(4) 是设备描述符的 bcdDevice 字段提取的二进制编码十进制修订版中的四位数设备版本号。供应商分配给设备,并从设备描述符的 bcdDevice 字段中提取
  • z(2) 是从 IAD 的 bFirstInterface 字段中提取的两位数接口编号。

具有 IAD 的 USB 设备的兼容 ID

USB\Class_c(2)&SubClass_s(2)&Prot_p(2)

USB\Class_c(2)&SubClass_s(2)

USB\Class_c(2)

在这些兼容的 ID 中,c(2)、s(2)和 p(2)分别包含从 IAD 的 bFunctionClassbFunctionSubClassbFunctionProtocol 字段获取的值。

不能以递归方式使用 IAD 来绑定函数。 具体而言,如果设备在其固件中具有 IAD 描述符,泛型父驱动程序将不会按音频设备类对接口进行分组,如 USB 复合设备上的接口集合枚举中所述

在没有 IAD 的音频设备上枚举接口集合

对于音频设备,Windows 操作系统可以枚举与函数关联的接口(接口集合)组,并将单个物理设备对象(PDO)分配给每个组,即使设备没有接口关联描述符(IAD)。

如果接口满足以下条件,操作系统会将复合音频设备的接口分组到接口集合中:

  • 接口集合中的所有接口都必须是连续的。 换句话说,接口必须在固件内存中彼此相邻。
  • 接口集合中的所有接口都必须属于音频设备类。 设备制造商通过向接口描述符的 bInterfaceClass 字段分配0x01值,指定接口属于音频设备类。
  • 接口集合中的每个接口都必须具有与集合中第一个接口不同的子类。 接口描述符的 bInterfaceSubClass 字段指定接口的设备子类。

如果接口不满足这三个条件,Windows 将尝试单独枚举它,而不是与其他音频类接口进行分组。

如果设备固件中存在接口关联描述符(IAD),操作系统不会以特殊方式对音频类接口进行分组。 IAD 方法始终是分组 USB 接口的首选方法。

本部分介绍与操作系统为接口集合(其接口属于音频设备类)创建的 PDO 关联的硬件和兼容标识符(ID)。

没有 IAD 的音频设备的硬件 ID

USB\VID_v(4)&PID_p(4)&Rev_r(4)&MI_z(2)

USB\VID_v(4)&PID_p(4)&MI_z(2)

在这些硬件 ID 中,

  • v(4) 是 USB 标准委员会分配给供应商的四位数供应商代码,是从设备描述符的 idVendor 字段中提取的。
  • p(4) 是供应商分配给设备的四位数错误代码,是从设备描述符的 idProduct 字段中提取的。
  • r(4) 是设备描述符的 bcdDevice 字段提取的二进制编码十进制修订版中的四位数设备版本号。供应商分配给设备,并从设备描述符的 bcdDevice 字段中提取
  • z(2) 是从接口描述符的 bInterfaceNumber 字段中提取的两位数接口编号。

不带 IAD 的音频设备的兼容 ID

USB\Class_c(2)&SubClass_s(2)&Prot_p(2)

USB\Class_c(2)&SubClass_s(2)

USB\Class_c(2)

在这些兼容的 ID 中,c(2)、s(2)和 p(2)分别包含从每个接口集合中第一个 USB 接口描述符的 bInterfaceClass、bInterfaceSubClassbInterfaceProtocol 字段获取的值。