windows USB 设备驱动开发-对无线移动通信设备类的支持

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

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

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

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

此图显示了 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 文件中由 02、00 和 00 对表示的三个 1 字节二进制值构成。 这三个数字分别对应于 USB 实现者论坛分配给 CDC 设备类、CDC 设备子类和 CDC 设备协议的值。

枚举 WMCDC 上的接口集合

(WMCDC) USB 无线移动通信设备类是 USB 通信设备类 (CDC) 的子类。 WMCDC 规范会扩展,但不会对定义接口集合的 CDC 指南进行重大更改。 具体而言,WMCDC 设备必须符合 CDC 指南来定义接口集合。

CDC 接口集合包含一个主接口 (USB_INTERFACE_DESCRIPTOR) ,该接口属于通信接口类 (bInterfaceClass = 0x02) 或数据接口类 (bInterfaceClass = 0x0A) 。 如果主接口属于通信接口类 这是的典型情况,则主接口的子类 (bInterfaceSubClass) 指定 CDC 控制模型。 控件模型指示接口集合中包含的接口的类型。 

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

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

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


例如,若要清除这两个位 (将它们设置为 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 配置。

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

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

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

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

以下示例 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 接口集合的 UFD) 来对从属接口集合进行分组和枚举;
  • 可以将 USB 泛型父驱动程序配置为为 OBEX 控制模型接口集合创建单独的物理设备对象 (PDO) ,或为所有 OBEX 控制模型接口集合创建单个 PDO。
  • UFD 中的接口编号列表可能有间隙。 也就是说,UFD 的接口编号可以引用不连续的接口。 此类编号无效,例如,对于 USB 接口关联描述符 (IAD) ,其接口必须是连续的且具有序列号;
  • UFD 可以包含相关的音频接口集合;
  • CDC 和 WMCDC 接口集合的硬件标识符 (ID) 必须包含接口子类。 其他 USB 接口(其硬件 ID 包含指定接口编号的 MI_%02X 后缀)不包含有关接口子类的信息。 子类信息包含在硬件 ID 中,允许供应商提供具有特定接口集合的硬件 ID 匹配项的 INF 文件,而不是依赖接口在描述符布局中的位置来确定要为集合加载哪个驱动程序。 硬件 ID 中的子类信息还允许逐步迁移路径,从管理 WMCDC 接口集合的当前供应商提供的驱动程序迁移到替代项(例如用户模式驱动程序);
CDC 和 WMCDC 控制模型

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

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

本节中介绍的接口集合如下:

音频类接口

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


CDC 抽象控制模型

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

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


 

CDC ATM 网络控制模型

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


CDC CAPI 控制模型

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


CDC Direct Line 控制模型

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


CDC 以太网控制模型

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


CDC 多通道 ISDN 控制模型

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


CDC 电话控制模型

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


MCPC 供应商唯一接口

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

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


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


WMCDC 抽象控制模型

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

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

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


WMCDC 设备管理模型

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


WMCDC 移动 Direct Line 模型

(MDLM) 接口集合的 USB WMCDC 移动 Direct Line 模型具有以下属性:


WMCDC OBEX 控制模型 (多个 PDO)

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

当 USB 泛型父驱动程序将单独的 PDO 分配给每个 OBEX 接口时,PDO 具有以下属性。


WMCDC OBEX 控制模型 (单个 PDO)

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

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


WMCDC 无线手机控制模型

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

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


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

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

如果 USB 复合设备在其固件中具有接口关联描述符 (IAD) ,Windows 会枚举接口集合,就像每个集合都是单个设备一样,并将单个物理设备对象 (PDO) 分配给每个接口集合,并将硬件和兼容标识符 (ID) 与 PDO 相关联。  本部分介绍) 分配给与 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 字段提取;
  • 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) 、 (2) 和 p (2) 包含分别从 IAD 的 bFunctionClass、 bFunctionSubClass 和 bFunctionProtocol 字段获取的值。

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

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

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

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

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

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

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

没有 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 字段提取。
  • 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) 、 (2) 和 p (2) 分别包含从每个接口集合中第一个 USB 接口描述符的 bInterfaceClass、 bInterfaceSubClass 和 bInterfaceProtocol 字段获取的值。

Usbccgp.sys 中的内容安全功能

数字版权管理 (DRM) 系统通常使用设备序列号来确保合法客户有权访问数字化的知识产权。 如果 USB 设备具有 CSM-1 内容安全接口,则客户端驱动程序可以通过向通用父驱动程序发送 IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER 请求来查询其序列号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值