USB 中级常见问题

Updated: October 20, 2008

本文回答了开发人员提出的有关为 Microsoft Windows 开发 USB 设备和驱动程序的常见问题。

*

简介

Windows 98 及 Windows 的更高版本包含对通用串行总线 (USB) 设备的本机支持。本文为那些需要有关 USB 堆栈和 Windows 支持的 USB 功能的中级详细信息的驱动程序开发人员提供了常见问题的答案。

其他有关 USB 设备和驱动程序支持的文档可以在初级常见问题、当前版本的 Windows Driver Kit (WDK)、USB 体系结构和驱动程序支持网页(网址为 http://www.microsoft.com/china/whdc/connect/usb/default.mspx)中找到。.

注意: 除非另有说明,本文中的信息适用于 Windows 2000 及更高版本的操作系统。

Top of pageTop of page

Windows 支持和 USB

此 FAQ 的这一部分回答有关 Windows 如何支持 USB 的一般问题。

我的 USB 2.0 集线器是“单 TT”还是“多 TT”?

USB 2.0 集线器上可以为所有下游端口提供一个事务翻译器 (transaction translator, TT),即“单 TT”,或者也可以为每个下游端口提供一个 TT,即“多 TT”。

USB 设备描述符的 bDeviceProtocol 字段以及 USB 接口描述符的 bInterfaceProtocol 字段的值指出了集线器是“单 TT”还是“多 TT”:

Single-TT. bDeviceProtocol == 0x01

Multi-TT. bDeviceProtocol == 0x02

Usbhub.sys 使用此设置启用“单 TT”模式或“多 TT”模式。在 Windows XP 及更高版本上,Usbhub.sys 总是在“多 TT”集线器上启用“多 TT”。

有关 TT 布局的其他信息,请参阅 USB 2.0 规范的 11.14.1.3 和 11.23.1 节,该规范可以在 USB 网站获得,网址是:http://www.usb.org/developers/docsThis link leaves the Microsoft.com site.

在 USB 序列号中哪些字符或字节是有效的?

USB 设备描述符的 iSerialNumber 字段指出该设备是否拥有序列号以及该序列号存储的位置,如下所示:

iSerialNumber == 0x00 :该 USB 设备没有序列号。

iSerialNumber != 0x00 :该 USB 设备拥有一个序列号。分配给 iSerialNumber 的值是序列号的字符串索引。

如果该设备有一个序列号,那么该序列号必须唯一标识该设备的每个实例。例如,如果两个设备描述符的 idVendoridProductbcdDevice 字段具有完全相同的值,则 iSerialNumber 字段必须不同,以便区分不同的设备。

即插即用要求 USB 序列号中的每个字节都是有效的。如果有一个字节无效,Windows 就会丢弃该序列号,将该设备当作没有序列号对待。

以下字节值对 USB 序列号无效:

0x2C。

小于 0x20 的值。

大于 0x7F 的值。

有关 iSerialNumber 值的更多信息,请参阅 USB 2.0 规范的 9.6.1 节。

在 Windows 的本地化版本上,字符串请求中使用什么语言识别符 (LANGID)?

USB 设备通过将该 USB 设备描述符的 iSerialNumber 字段设置为序列号的字符串索引来指示存在序列号。为了检索该序列号,Windows 会发起一个字符串请求,该字符串请求的语言识别符 (LANGID) 被设置为 0x0409(美国英语)。Windows 始终使用该 LANGID 检索 USB 序列号,即使本地化为其他语言的 Windows 版本也是如此。

使用什么 LANGID 来提取设备的序列号?

USB 设备通过将该 USB 设备描述符的 iSerialNumber 字段设置为序列号的字符串索引来指示存在序列号。为了检索该序列号,Windows 会发起一个字符串请求,该字符串请求的语言识别符 (LANGID) 被设置为 0x0409(美国英语)。Windows 始终使用该 LANGID 检索 USB 序列号,即使本地化为其他语言的 Windows 版本也是如此。

IsDeviceHighSpeed 函数表明什么?

IsDeviceHighSpeed 总线驱动程序接口函数返回该设备在其当前树状拓扑中的实际运行模式。如果将一个高速设备连接到 USB 1.1 集线器或全速主控制器,则该函数表明设备将以全速工作。有关详细信息,请参阅 WDK 中该函数的参考资料页面。

不同 Windows 版本上 USB 传输的最大大小为多少?

请参阅“USB 传输在不同操作系统上的最大大小”。

应该如何给复合设备上的多个接口分配编号?

Windows 将第一次配置时具有多个接口的 USB 设备视为复合设备。

对于 Windows XP Service Pack 1 以及 Windows 的更早版本:

接口编号必须从 0 开始。

接口编号必须是连续且递增的。

对于 Windows XP Service Pack 2 以及 Windows 的更高版本,接口编号只需要是递增的,不需要是连续的。

有关接口编号的详细信息,请参阅以下“资源”部分列出的 "Composite USB devices whose interfaces are not sequentially numbered do not work in Windows XP"(接口编号不连续的复合 USB 设备无法在 Windows XP 下工作)。

对于所有版本的 Windows,接口的备选设置应该按如下分配:

接口的默认值始终是备选设置 0。

其他备选设置编号必须是连续而且递增的。

有关备选设置的其他信息,请参阅 USB 2.0 规范的 9.6.5 节。

USB 复合设备应该加载哪个父驱动程序?

Windows 从 Windows 98 开始就已经支持 USB 复合设备。Usbhub.sys 在以下操作系统上支持复合设备:

Windows 98

Windows 98 SE

Windows 2000

复合设备的新驱动程序 Usbccgp.sys 是与 Windows Millennium Edition (Me) 一起发行的。Usbccgp.sys 在以下操作系统上支持复合设备:

Windows Me

Windows XP

Windows Server 2003

Windows Vista

Windows Server 2008

虽然在这些版本的 Windows 上仍然可以将 Usbhub.sys 作为复合设备的父驱动程序加载,但是 Microsoft 并不推荐这样做。应该使用 Usbccgp.sys。为了保证为复合设备加载正确的驱动程序,请在 INF 文件中使用 IncludeNeeds 指令,如下所示:

Include = USB.INF
Needs = Composite.Dev

重要事项:将引用 Usbhub.sys 的 INF 文件作为复合设备驱动程序,将来可能会无法通过硬件兼容性测试。如果您有一个复合设备,则它应该引用 Usbccgp.sys,而不是 Usbhub.sys。

有关更多信息,请参阅 WDK 中的 "USB Common Class Generic Parent Driver"

Usbccgp.sys 施加的主要限制是什么?

Usbccgp.sys 对硬件设备和驱动程序施加的限制主要包括:

Usbccgp 仅支持默认配置 0。

Usbccgp 在 Windows XP 和 Windows Server 2003 中不支持选择性挂起 (Selective Suspend)。该功能只在 Windows Vista 和更高版本的 Windows 中受支持。

Usbccgp 仅在 Windows XP Service Pack 2、Windows Server 2003 Service Pack 1 和更高版本的 Windows 中支持接口关联描述符 (interface association descriptor, IAD)。

Usbccgp 仅在 Windows XP SP2、Windows Server 2003 SP1 和更高版本的 Windows 中支持不连续的接口编号。

我如何对 USB 核心二进制文件启用调试跟踪?

要启用内核调试:

获得经过检验的 Windows 版本,或者在任意版本的 Windows 上安装经过检验的 USB 模块。

通过设置表 1 和表 2 中显示的全局变量,对各种 USB 核心二进制文件启用调试跟踪。

表 1. 内核调试设置,Windows 2000

模块名调试符号范围

Uhcd.sys

UHCD_Debug_Trace_Level

0-2

Openhci.sys

OHCI_Debug_Trace_Level

0-2

Usbhub.sys

USBH_Debug_Trace_Level

0-3

Usbd.sys

USBD_Debug_Trace_Level

0-3

表 2. 内核调试设置,Windows XP 和 Windows Server 2003

模块名调试符号范围

Usbport.sys

USBPORT_Debug_Trace_Level

0-4

Usbccgp.sys

DbgVerbose

0-1

Usbhub.sys

USBH_Debug_Trace_Level

0-3

Usbd.sys

USBD_Debug_Trace_Level

0-3

有关 USB 核心堆栈调试的更多信息,请参阅 "How to enable verbose debug tracing in various drivers and subsystems"(如何在各种驱动程序和子系统中启用详细调试跟踪)。

在 Windows XP 和更高版本的 Windows 上,错误检测代码 0xFE 表示什么意思?

请参阅http://msdn.microsoft.com/en-us/library/ms797153.aspx.

有关 USB 核心堆栈调试的更多信息,请参阅最新的 WDK 和 Windows 调试工具自带的文档。

EHCI 规范的哪些功能尚未实现?

Windows XP 支持增强型主控制器接口 (Enhanced Host Controller Interface, EHCI) 规范中的很多功能,但是一些功能尚未实现,如下所示。

在 EHCI 0.95 版或更高版本中添加的功能,包括:

Rebalance Lockout (I-Bit)

Frame Span Traversal Nodes (FSTN)

64 位主控制器处理支持。EHCI 控制器仍然可以在 x64 或 Intel Itanium 平台上的 32 位模式中工作。

通过 USB 2.0 进行内核调试。此信息适用于 Windows Vista 和 Windows 的更高版本。

EHCI BIOS 切换。

BIOS 供应商应该支持针对所有 EHCI-aware BIOS 的 EHCI 规范中的 EHCI BIOS handoff 一节。

在 Windows XP Service Pack 2 及 Windows 的更高版本中提供对 EHCI BIOS handoff 的初步支持。

这些功能在 Windows 的未来版本中可能会受到支持。

Windows 支持接口关联描述符 (Interface Association Descriptor, IAD) 吗?

是的。USB 2.0 Interface Association Descriptor (IAD) Engineering Change Notification (ECN) 引入了一种新的标准方法,用于在一个函数内描述一组接口及其备选设置。IAD 可用于在一个函数内识别两个或多个连续接口以及备选设置。

Microsoft 目前正在和 IHV 合作开发支持 IAD 的设备。以下操作系统支持 IAD:

Windows XP Service Pack 2 及更高版本

Windows Server 2003 Service Pack 1 及更高版本

Windows Vista

有关 IAD 的更多信息,请参阅以下“资源”部分的 "Support for USB Interface Association Descriptor in Windows"(Windows 对 USB 接口关联描述符的支持)。

USB 堆栈会在 URB 中处理链接的 MDL 吗?

不会。Windows 包含的 USB 堆栈不支持此功能。

驱动程序在一个 IRP 中可以有多个 URB 吗?

不会。Windows 包含的 USB 堆栈不支持此功能。

Windows 支持 USB 复合集线器吗?

复合 USB 设备(也称之为多功能 USB 设备)提供多项功能,每个都可被当作一个独立的设备。系统加载 USB Generic Parent 驱动程序 Usbccgp.sys,作为该设备的每个功能的父驱动程序。USB Generic Parent 驱动程序将该复合设备的功能当作独立的 USB 设备进行枚举,然后为每个功能创建一个 PDO 并构建一个设备堆栈。

复合 USB 设备无法提供集线器的功能。Windows 不能正确枚举这样的集线器,尝试安装这样的设备可能会引起系统崩溃。

Top of pageTop of page

使用 USB 2.0 连接进行内核调试

USB 2.0 提供了一个串行和 1394 通信链路的替代,用于将调试主机连接到目标计算机。此 FAQ 的这一部分回答有关 USB 2.0 内核调试的问题。

Windows 的哪个版本支持 USB 2.0 内核调试?

目前 Windows Vista 及更高版本支持 USB 2.0 内核调式。

USB 2.0 内核调试需要什么系统支持?

USB 2.0 内核调试需要以下系统支持:

目标计算机必须有一个专门用于支持通过 USB 2.0 连接进行内核调试的 EHCI 控制器。只有一些 EHCI 控制器提供此功能。具有 EHCI 控制器的 Intel 芯片组实现了对内核调试的支持。

调试端口必须可以从外部访问。在一些系统上,EHCI 控制器支持内核调试,但是无法用于此目的,因为调试端口没有连接到可以从计算机外部访问的 USB 连接器。那些想要在其计算机上支持 USB 内核调试的系统制造商不应该将任何内部设备连接到该调试端口,并且应该确保该调试端口被连接到可从外部访问的 USB 连接器。在 Intel 芯片组中,如 usbview.exe 所报告的,调试端口通常是 PORT1。

注意: Usbview.exe 是 Windows 调试工具中包含的一个实用程序,允许查看计算机上的 USB 控制器,以及连接到控制器的每个端口上的设备。

如何确定一个 EHCI 控制器是否支持内核调试?

实现了调试端口的 USB 控制器应该报告它们在控制器的 PCI 配置空间中支持此功能。不幸的是,现在还没有软件可以向用户报告此信息。

所有的 Intel EHCI 控制器支持在 PORT1 上进行 USB 内核调试。

在目标计算机上有多个 EHCI 控制器怎么办?

如果在目标计算机上有多个 EHCI 控制器,那么应该指定用于内核调试的控制器。否则,可能面临这样的情况:当目标计算机的操作系统试图使用其他 EHCI 控制器的调试端口时,您的 USB 调试电缆被插入某个控制器的调试端口连接器。当在测试计算机上有多个 EHCI 控制器时,无法指定用于内核调试的控制器通常会导致 USB 内核调试无法工作。

要指定用于内核调试的 EHCI 控制器,请在目标计算机上使用高权限在命令提示符窗口中键入以下内容:

bcdedit -set {current} loadoptions busparams=x.y.z

x、y 和 z 的值是从用于内核调试的 EHCI 控制器的总线、设备和功能号计算出来的。此信息可以按如下方式从“设备管理器”中获得:

1.

打开“设备管理器”。

2.

展开“通用串行总线控制器”。

3.

双击用于内核调试的 EHCI 控制器。

4.

注意“位置”这一行指示的总线、设备和功能号。

5.

将这三个值转换为十六进制,并在 bcdedit 命令中将其用作 x、y 和 z 的值,在每个值之间插入一个逗号。

这会使目标计算机的操作系统使用该计算机上特定位置的 EHCI 控制器进行内核调试。

例如,如果用于内核调试的 EHCI 控制器在“设备管理器”中显示为 PCI 总线 0、设备 29、功能 7,那么相应的 bcdedit 命令应该是:

bcdedit -set {current} loadoptions busparams=0.1D.7

什么电缆可用于 USB 2.0 内核调试?

必须使用专门设计的调试设备进行 USB 2.0 调试连接。此设备允许使用一条标准的 USB 电缆连接主机和调试设备,并使用另一条标准的 USB 电缆连接目标计算机和调试设备。在主机和目标计算机之间如果不安装此调试设备,则无法进行 USB 内核调试。

PLX Technology 制造了一个叫做 Net20DC 的 USB 调试设备。此 FAQ 的“资源”部分提供了一个到相关网站的链接。其他供应商可能也提供复合设备,但是 Microsoft 还没有测试除 PLX Net20DC 以外的任何调试设备。

我从哪里可以获得该 PLX 调试设备?

http://www.semiconductorstore.com/pages/search/searchinventory.asp?query=net20dcThis link leaves the Microsoft.com site

哪种调试工具支持 USB 2.0 内核调试?

必须使用 Windows 调试工具包的最新版本(6.10.3 版或更高版本)。支持在主机上进行 USB 2.0 调试的驱动程序 usb2dbg.sys 是与调试工具一起安装的。可以在 Program Files\Debugging Tools for Windows\Usb 文件夹中找到该驱动程序包。当指定 USB 内核调试时,调试器会在主机上加载该 USB 调试驱动程序。不需要在目标计算机上安装任何其他 USB 调试驱动程序,因为已经将必要的支持内置到了 Windows Vista 及 Windows 的更高版本中。

Top of pageTop of page

Microsoft 操作系统描述符

Microsoft 操作系统 (OS) 描述符为 IHV 提供了一种在设备固件中存储各种特定于供应商的信息的途径。此 FAQ 的这一部分回答有关 Microsoft OS 描述符的问题。

有关 Microsoft OS 描述符的更多信息,请参阅“Microsoft OS 描述符文档”。

Microsoft OS 描述符是什么?

Microsoft OS 描述符为 IHV 提供了一种方法,可以在设备固件中将各种特定于供应商的信息存储为 OS 功能描述符,而不是与设备分开提供给用户。可感知 Microsoft OS 描述符的 Windows 或 Windows 应用程序的版本可以使用控制请求从设备中检索该描述符,而无需其他的用户交互。尤其是,当初次插入设备时,Windows 可以自动检索该描述符,并使用该信息给用户提供更完美的“即插即用”体验。

Windows 支持什么类型的 OS 功能描述符?

任何作为功能描述符存储的信息必须符合 Microsoft 已定义的标准格式之一。未经 Microsoft 许可,不能定义或实现其他功能描述符。Microsoft 已经定义了以下功能描述符。

Extended Compat ID
Windows 使用类和子类代码帮助找到适合于 USB 设备的默认驱动程序。但是,USB 设备工作组必须分配这些代码。这意味着实现了新功能的设备常常没有合适的类和子类代码,所以 Windows 无法使用该代码选择默认驱动程序。IHV 可以通过将该信息作为扩展的兼容 ID OS 功能描述符存储在固件中来避免此问题。然后 Windows 可以在设备插入时检索此信息,并使用它帮助确定加载哪个默认驱动程序。有关详细信息,请参阅此包中包含的 "Extended Compat ID OS Feature Descriptor Specification"(扩展兼容 ID OS 功能描述符规范)。

Extended Properties
目前,可以在两个层次上声明 USB 设备的属性:类层次和 devnode 层次。该扩展属性 OS 功能描述符允许供应商将其他属性(比如帮助页面、URL 和图标)存储在设备固件中。有关详细信息,请参阅此包中包含的 "Extended Compat ID OS Feature Descriptor Specification"(扩展兼容 ID OS 功能描述符规范)。

Genre
此描述符是为 Windows 的未来版本设计的,现在还没有规范。

哪些 Windows 版本支持 Microsoft OS 描述符?

以下表格展示了哪些 Windows 版本支持各种描述符:

Microsoft OS 描述符支持

描述符Windows 版本

OS 字符串描述符

Windows XP SP1 及更高版本

扩展兼容 ID OS 功能描述符

Windows XP SP2 及更高版本

扩展属性 OS 功能描述符

Windows XP SP2 及更高版本

Genre OS 功能描述符

可能受未来的 Windows 版本支持

为什么必须将 OS 字符串描述符存储在索引 0xEE 上?

一台支持 Microsoft OS 描述符的设备必须包含一个 OS 字符串描述符,存储在字符串索引 0xEE 位置。该 OS 字符串描述符是一个标准的 USB 字符串描述符,具有以下功能:

其存在表明该设备包含一个或多个 OS 功能描述符。

它包含检索相关的 OS 功能描述符所需的数据。

它包含一个签名字段,该字段可将 OS 字符串描述符和其他 IHV 可能选择存储在 0xEE 的字符串别开来。

它包含一个允许未来修改 Microsoft OS 描述符的版本号。

如果在 0xEE 没有字符串描述符,或者该索引位置的字符串描述符不是有效的 OS 字符串描述符,则 Windows 假设该设备不包含任何 OS 功能描述符。

我从何处可以找到有关 Microsoft OS 描述符的更多信息?

请参阅http://www.microsoft.com/china/whdc/connect/usb/os_desc.mspx.

Top of pageTop of page

资源

以下资源提供了有关 Windows 对 USB 设备的支持的其他信息。

接口编号不连续的复合 USB 设备无法在 Windows XP 下工作
http://support.microsoft.com/default.aspx?scid=kb;en-us;814560

Windows 调试工具
http://www.microsoft.com/china/whdc/Windows-DDK-WDK-WLK/Debugging/default.mspx

如何在各种驱动程序和子系统中启用详细调试跟踪
http://support.microsoft.com/default.aspx?scid=kb;en-us;314743

IsDeviceHighSpeed
http://msdn2.microsoft.com/en-us/library/ms790724.aspx

USB 传输在不同操作系统上的最大大小
http://support.microsoft.com/kb/832430

Microsoft OS 描述符文档
http://www.microsoft.com/china/whdc/connect/usb/os_desc.mspx

PLX Technology USB 调试电缆
http://www.plxtech.com/products/NET2000/NET20DC/default.aspThis link leaves the Microsoft.com site

Windows 中的 USB 接口关联描述符支持
http://www.microsoft.com/china/whdc/connect/USB/IAD.mspx

WHDC 中的 USB 资源
http://www.microsoft.com/china/whdc/connect/usb/default.mspx

USB 2.0 规范
http://www.usb.org/developers/docsThis link leaves the Microsoft.com site

Windows Hardware Developer Central
包含 Windows Driver Kit [WDK] 和 Windows Logo Kit [WLK]。
http://www.microsoft.com/china/whdc/default.mspx


Top of pageTop of page