Windows USB设备驱动开发 - 常见概念的解释

我们听到许多 USB 术语几乎交替抛出。 它们都是什么意思?假设我们看到类似 "多亏了 USB 3.0,我可以将 SuperSpeed U 盘连接到电脑的 xHCI 主机控制器,并更快地复制文件。"

让我们了解该句子中的 USB 术语。 USB 3.0、USB 2.0 和 USB 1.0 请参阅 USB 论坛中的 USB 规范修订号。 USB 规范定义主机电脑和 USB 设备如何相互通信。

版本号还指示最大传输速度。 最新的规范修订版是 USB 3.0,它指定的最大传输速度高达 5 Gbps。 USB 1.0 定义了两种不同的数据速率:低速 USB (高达 1.5 Mbps) 和全速 USB (高达 12 Mbps) 。 USB 2.0 定义了新的数据速率、高速 USB (480 Mbps) ,同时保持对低速和全速设备的支持。 USB 3.0 将继续使用以前定义的所有数据速率。 如果你查看产品包装,SuperSpeed USB 将参考最新的 USB 3.0 设备。 高速 USB 用于描述高速 USB 2.0 设备。 无描述符的 USB 是指低速和全速设备。

除了 USB 协议之外,USB 主控制器还有第二个规范,即设备连接到的电脑上的硬件。 主机控制器接口规范定义主机控制器硬件和软件的交互方式。 xHCI可扩展主机控制器接口定义 USB 3.0 主机控制器。 增强型主机控制器接口 (EHCI) 定义 USB 2.0 主控制器。 通用主机控制器 (UHCI) 和开放式主机控制器 (OHCI) 是 USB 1.0 主机控制器的两个替代实现。

我的电脑是否具有 USB 3.0 端口?

USB 3.0 端口标有 SuperSpeed USB 徽标,或者端口通常为蓝色。

较新的电脑同时具有 USB 3.0 和 USB 2.0 端口。 如果希望 SuperSpeed USB 设备以最高速度运行,请找到 USB 3.0 端口并将设备连接到该端口; 连接 USB 2.0 端口的 SuperSpeed 设备可以以高速运行。

还可以验证特定端口是否为 设备管理器 中的 USB 3.0 端口。 在 Windows Vista 或更高版本的 Windows 中,打开设备管理器,然后从列表中选择端口。

如果你有一个可扩展的主控制器,则它支持 USB 3.0。

不需要为可扩展主机控制器安装驱动程序,

Windows 8和Windows Server 2012包括了对 USB 3.0 的内置支持。

如果电脑具有 USB 3.0 端口,并且运行的 Windows 版本早于 Windows 8,则主机控制器驱动程序由电脑制造商提供。 如果需要重新安装这些驱动程序,则必须从制造商那里获取它们。

如果将 USB 3.0 控制器卡添加到运行早于 Windows 8 版本的 Windows 的电脑,则必须安装控制器卡制造商提供的驱动程序。

在 Windows 8 中,Microsoft 提供的 USB 3.0 驱动程序集 (USB 驱动程序堆栈) 适用于大多数主机控制器。 Microsoft USB 3.0 驱动程序堆栈不适用于 Fresco Logic FL1000 控制器。 若要确定是否具有 FL1000 控制器,请打开设备管理器并展开"通用串行总线控制器"。 通过选择并按住或右键单击控制器节点来查看控制器属性。 在 "详细信息 "选项卡上,选择列表中的" 硬件 ID" 属性。 如果硬件 ID 以 PCI\VEN_1B73&DEV_1000 开头,则为 FL1000。 对于该控制器,请从电脑或控制器卡制造商下载并安装驱动程序。

为什么我在系统上看到多个主机控制器?

除了连接到电脑的 USB 设备外,电脑中还集成了许多可能通过 USB 连接的设备,例如网络摄像头、指纹读取器、SD 读卡器。 为了连接所有这些设备并仍然提供外部 USB 端口,电脑支持多个 USB 主机控制器。

USB 3.0 xHCI 主机控制器完全向后兼容所有 USB 设备速度、超高速、高速、全速和低速。 你可以将任何设备直接连接到 xHCI 控制器,并期望该设备正常工作。 对于 EHCI 控制器,情况并非如此。 虽然 USB 2.0 规范支持设备的所有速度,但 EHCI 控制器仅支持高速 USB 设备。 为了使全速和低速 USB 设备正常工作,它们必须通过 USB 2.0 集线器连接到 EHCI 控制器,或者必须连接到 UHCI 或 OHCI 控制器。

对于较新的电脑,电脑公开的大多数 USB 2.0 端口都是 USB 2.0 集线器的下游端口。 此中心连接到 EHCI 控制器。 这允许电脑的 USB 2.0 端口适用于所有速度的设备。 连接到 2.0 端口时,SuperSpeed 设备的行为与高速设备相同。

USB 2.0 规范发布后,电脑使用主机控制器的组合来支持设备的所有速度。 单个 USB 2.0 端口将连接到两个主机控制器、一个 EHCI 主控制器和一个 UHCI 或 OHCI 主机控制器。 附加设备时,硬件会将连接动态路由到两个主机之一。 例程取决于设备的速度。

当我仅连接一个 USB 3.0 集线器时,为什么在 设备管理器 中看到两个集线器?

虽然 xHCI 主机控制器适用于任何速度的设备,但 SuperSpeed 集线器仅适用于 SuperSpeed 设备。 为了确保 USB 3.0 集线器可以采用所有速度,它们具有两个部分:SuperSpeed 集线器和 USB 2.0 集线器。 USB 3.0 集线器能够通过根据设备速度动态路由设备到 SuperSpeed 集线器或 2.0 集线器来支持所有速度。

打开设备管理器,按连接查看设备,然后找到可扩展主机控制器。 将单个 USB 3.0 集线器连接到 USB 3.0 端口时,控制器根集线器的下游有两个集线器。

在下面的示例中,SuperSpeed USB 存储设备和 USB 音频设备都连接到 USB 3.0 集线器。 可以看到存储设备位于 SuperSpeed 集线器的下游,音频设备位于 USB 2.0 集线器的下游。

usb 3.0 集线器,在设备管理器中连接了设备

为连接到 2.0 端口的设备加载了哪组驱动程序?

为每种类型的主机控制器加载一组不同的二进制文件。 请务必了解,Windows 加载的 USB 驱动程序堆栈与主机控制器的类型相关,而不是与连接设备的速度相关。

在此图中,可以看到为每种不同类型的 USB 主控制器加载了哪些驱动程序。

Windows 8 中的 usb 驱动程序堆栈

如果 USB 3.0 端口正确路由到 xHCI 控制器,Windows 将加载 xHCI 驱动程序堆栈 ,也称为 USB 3.0 驱动程序堆栈。

如果 USB 2.0 端口通过 USB 2.0 集线器连接到 EHCI 控制器,则流量会通过 EHCI 控制器移动,并加载 USB 2.0 驱动程序堆栈。

如果电脑的 USB 2.0 端口使用配套控制器,则端口路由到的主控制器取决于设备速度。 例如,低速设备通过 UHCI 或 OHCI 控制器连接,并使用 USBUHCI 或 USBOHCI 驱动程序。 电脑将高速设备路由到 EHCI 控制器,因此 Windows 使用 USBEHCI 驱动程序。

不同的设备速度无法确定为控制器加载的驱动程序。 但是,不同的设备速度可能会决定使用哪个控制器。 控制器始终使用相同的驱动程序。

如何实现确定我的 USB 3.0 设备是否以 SuperSpeed 运行?

在Windows 8中,首先请确保有 USB 3.0 端口和 xHCI 主机控制器。 如果 SuperSpeed USB 设备已连接到 xHCI 主机控制器,Windows 8在Windows 8 UI 的特定部分中显示"已连接到 USB 3.0"消息。 如果设备连接到 EHCI 控制器而不是 XHCI 控制器,则消息将改为显示"连接到 USB 3.0 时设备可以更快地执行"。

你可以在电脑设置中查看这些 UI 消息。

  • 打开超级按钮栏 (将光标拖到屏幕的右上角或右下角,键入 Windows 键 + C,或用手指) 从右侧轻扫。
  • 选择 "设置" ,然后选择" 更改电脑设置"。
  • 在"电脑设置"下选择"设备"。

此图像显示 USB 3.0 设备在 SuperSpeed 下运行时的 UI 消息。

显示"电脑设置"的屏幕截图,其中选择了"设备"并突出显示了"U S B 3.0 RAIDrive"。

此图显示 USB 设备以低于 SuperSpeed 的总线速度运行时的 UI 消息。

显示已选择"设备"和"U S B 3.0 RAIDrive"的屏幕截图,其中突出显示了消息"连接到 U S B 3.0 时,设备可以更快地执行"。

可以在"设备和打印机"中查看类似的消息,如这些图像中所示

显示"存储 - 设备和打印机"的屏幕截图,其中选择了显示"已连接到美国 B 3.0"消息的设备。

高速运行的超高速设备

如果 USB 3.0 设备是存储设备,则 Windows 资源管理器在选择卷标签时会显示类似的消息,如下所示。 请注意,必须选择" 视图 -> 详细信息 "窗格才能显示消息。

屏幕截图显示了在"资源管理器"中选择的超速 US B 设备,并在"详细信息"窗格中突出显示了"已连接到 US B 3.0"消息。

高速运行的超高速 USB 设备

如果要编写设备驱动程序,则 Windows 驱动程序工具包 (WDK) 中包含的 USBView 工具非常有用。 对于Windows 8 WDK,Microsoft 更新了 USBView 以显示 SuperSpeed USB 信息。 可以使用此工具确定你的设备是否在 SuperSpeed 中运行。 此图像显示 USBView 中的 SuperSpeed 中运行的 USB 3.0 设备。

超速 USB 设备以超速运行

如果你是设备驱动程序开发人员, USB 驱动程序堆栈 会公开一个名为 IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 的新 IOCTL,可用于查询 USB 3.0 设备的速度信息。

为什么我的 SuperSpeed USB 设备速度不快于等效的高速 USB 设备?

通常,如果 USB 3.0 USB 设备的速度不快于高速 USB 设备,则它不会在 SuperSpeed 中执行。 如果 SuperSpeed USB 设备连接到 USB 3.0 端口,它可能无法在 SuperSpeed 中运行,原因如下:

  • 你使用的是 USB 2.0 集线器。

如果使用的是集线器,请验证它是 USB 3.0 集线器。 如果使用 USB 2.0 集线器,则任何连接的 SuperSpeed USB 设备都将高速运行。 将集线器替换为 USB 3.0 集线器,或将设备直接连接到 USB 3.0 端口。

  • USB 3.0 集线器上的固件已过期。

某些早期的 USB 3.0 集线器无法正常工作。 因此,Windows 仅使用这些中心的 2.0 部分。 如果设备管理器指示此图中所示的"非功能"中心,则Windows 8未使用中心的 3.0 部分。

非功能性超速 USB 集线器

可以将 SuperSpeed 设备直接连接到 USB 3.0 端口,或更新集线器上的固件。 Windows 8识别具有较新固件的中心。

  • 设备使用 USB 2.0 电缆连接。

确保用于连接设备的电缆是 USB 3.0 电缆。 USB 3.0 电缆也可能存在信号完整性问题。 在这种情况下,设备可能会切换到高速。 如果发生这种情况,则必须使用不同的 USB 3.0 电缆。

  • 设备上的固件已过期。

通过从制造商的网站获取最新版本来更新 SuperSpeed USB 设备的固件。 一些 SuperSpeed USB 设备制造商发布了固件更新时在设备中找到的 bug 的修补程序。

  • 主机控制器上的固件已过期。

更新 USB 3.0 控制器的固件,方法是从电脑制造商的站点或从卡制造商站点的添加获取最新版本。 一些 USB 3.0 控制器制造商发布了固件更新时在控制器中发现的 bug 的修补程序。

  • 系统的 BIOS 已过期。

通过从电脑制造商获取最新版本来更新系统的 BIOS。 在某些主板上,BIOS 可能会错误地将连接到 xHCI 主机控制器的设备路由到 EHCI 控制器。 不正确的路由会强制 SuperSpeed USB 设备高速运行。 BIOS 更新可以解决此问题。

是否可以在一个硬件中配置复合和复合设备?

是的。 Microsoft Natural Keyboard Pro 具有三端口总线供电集线器,是复合复合 USB 设备的一个示例。 设备具有连接到端口 1 的复合设备。 向最终用户公开另外两个端口。

连接到端口 1 的设备是低速复合设备。 该设备有两个接口,这两个接口都符合人机接口设备的 USB 标准设备类定义, (HID) 。 复合设备提供两个 HID 接口,而不是使用顶级集合在单个 HID 接口上多路复用所有集合。 选择此设计是为了与旧版 BIOS 兼容。

为什么我的某些 USB 设备在移动到新端口时会重新安装?

在 Windows 2000 及更高版本的操作系统中,当 USB 设备从一个端口移动到另一个端口时,会创建一个新的 (PDO) 的物理设备对象。 如果硬件报告唯一的 USB 序列号,则不会创建新的 PDO。

若要重复使用同一 PDO 并确保无论设备是重新插入同一端口还是新端口,设备体验保持不变,硬件供应商必须在其设备上存储序列号。 根据 Windows 硬件认证计划要求,对于共享设备安装标识符的所有设备,序列号必须是唯一的。

是否有 USB 产品包装的设计建议列表?

USB-IF 已与 Microsoft 和其他 USB-IF 成员公司合作,为独立硬件供应商制定建议列表,以包含在其包装中。可以参考 USB官网

是否必须重写客户端驱动程序以支持 USB 3.0 设备

当低速、完整或高速设备连接到 USB 3.0 端口时,所有现有的客户端驱动程序应继续工作。 在 Windows 8 中,我们已确保与现有客户端驱动程序兼容。

USB 3.0 驱动程序堆栈维护 IRQL 级别、调用方上下文和错误状态;与设备交互时重试频率和计时等,以确保现有驱动程序继续工作。 测试仍然非常重要。

出现常见故障的原因是:

  • 由于存在 SuperSpeed 终结点配套描述符,驱动程序的终结点描述符分析中断。
  • 由于速度的提高,可能会在应用程序协议级别遇到计时问题。
  • 终结点支持的最大数据包大小可能不同。
  • 由于功能电源管理,选择性挂起操作的计时可能不同。

在 Windows 7 及更低版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供。 因此,强烈建议测试驱动程序以使用第三方 USB 驱动程序堆栈。

适用于高速和超高速 USB 设备的 Windows 8 中的新客户端驱动程序应选择新功能。

为我的 SuperSpeed 存储设备使用、Uaspstor.sys 或 Usbstor.sys 加载了哪个驱动程序?

USB 附加 SCSI (UAS) 协议是一种新的大容量存储协议,旨在通过已建立的 USB 大容量存储协议批量仅传输 (BOT) 提高性能。 它通过减少协议开销、支持 SATA 本机命令排队 (NCQ) 以及并行处理多个命令来执行此操作。 为此,UAS 使用新的 USB 3.0 功能进行称为流的批量传输。

现有的大容量存储驱动程序(Usbstor.sys)使用 BOT 协议。 它适用于所有速度的设备,包括 SuperSpeed USB 设备。

对于Windows 8,Microsoft 包含一个新的大容量存储类驱动程序,Uaspstor.sys 使用 UAS 协议。 由于流是 USB 3.0 的新增功能,因此仅当硬件支持流 (SuperSpeed USB 设备连接到 xHCI 主机控制器) 时,Uaspstor.sys 才能使用流。 驱动程序还包括对软件流的支持,因此无论主机类型如何,它都可以为高速运行的设备加载。

如果将大容量存储设备连接到Windows 8并且该设备支持 UAS,则 Windows 将加载 Uaspstor.sys。 在某些情况下,特定 xHCI 主控制器上的硬件流可能存在已知问题,或者设备的 UAS 协议实现存在已知问题。 在这些情况下,Windows 会回退到 BOT 协议,并改为加载 Usbstor.sys 驱动程序。

Uaspstor.sys 不熟悉Windows 8。 它在早期版本的 Windows 中不存在。

Microsoft 支持哪些 USB DWG 类?

Windows 支持 USB 设备工作组 (DWG) 定义的多个 USB 类。 有关 USB 类规范和类代码的当前列表,请访问 USB DWG 网站 https://www.usb.org/documents。

此表突出显示了 Windows 中支持的 USB DWG 类,并标识了支持每个类的 Windows 版本。

*加载此驱动程序需要特殊说明,因为此驱动程序可能比操作系统晚发布。 Windows 类驱动程序可能不支持 DWG 类规范中描述的所有功能。 在这种情况下,驱动程序不会基于类匹配进行加载。 有关类规范中实现的功能的其他详细信息,请参阅 WDK 文档。

我应该对自定义 USB 设备使用哪个设备设置类?

Microsoft 为大多数设备类型提供系统定义的安装类。 系统定义的安装类 GUID 在 Devguid.h 中定义。

独立硬件供应商必须使用与 USB 设备类型(而不是总线类型)关联的设置类。 如果要开发 Microsoft 尚未提供现有类 GUID 的设备类型,则可以定义新的设备安装类。

在 Windows 8 中,定义了名为 USBDevice (ClassGuid = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}) 的新安装程序类。 如果要开发设备类型,请将设备与 USBDevice (而不是安装类 USB)关联。 USBDevice 类适用于 Windows Vista 和更高版本的操作系统。

安装程序类 USB (ClassGuid = {36fc9e60-c465-11cf-8056-444553540000}) 仅保留用于 USB 主机控制器和 USB 集线器,不得用于其他设备类别。 错误地使用此安装程序类可能会导致设备驱动程序无法通过 Windows 徽标测试。

为什么在连接某些 USB 设备时,CPU 不会进入 C3?

连接 USB 设备时,USB 主控制器会轮询帧计划程序,这是 (DMA) 总线主操作的直接内存访问。 "中断事件"(如总线主流量、中断或其他几个系统活动)将 CPU 移出 C3,因为根据定义,CPU 的缓存在 C3 中时无法窥访问。

可通过两种方法解决此问题:

  • 硬件删除。

有时,可以通过电子方式断开硬件与通用串行总线的连接。 例如,从 USB 读卡器中删除存储介质时,USB 读卡器可以模拟电子断开连接,并在重新插入媒体时重新连接。 在这种情况下,可能会发生 C3 转换,因为主控制器上没有 USB 设备。

  • 选择性挂起。

Windows XP 及更高版本操作系统中唯一可用的替代方法是支持 USB 选择性挂起。 此功能允许驱动程序在设备空闲时挂起它控制的 USB 设备,即使系统本身保持完全工作状态 (S0) 也是如此。 如果所有 USB 功能驱动程序都支持选择性挂起,则选择性挂起功能特别强大。 如果即使有一个驱动程序不支持它,CPU 也无法进入 C3。

哪些 USB 类驱动程序支持选择性挂起?

下面是Windows 8中支持选择性挂起的 USB 类驱动程序的列表:

Bluetooth: 此驱动程序可以选择性地挂起运行 Windows XP Service Pack 2 及更高版本的计算机上的设备。 驱动程序要求蓝牙无线电在配置描述符中设置自供电和远程唤醒位。 当不存在活动蓝牙连接时,驱动程序有选择地暂停 (D2) 蓝牙无线电。

USB HID 此驱动程序可以选择性地挂起 HID 设备。 你有责任在所有设备状态更改上触发远程唤醒信号。 若要在 HID 堆栈中启用选择性挂起,必须为设备的特定 VID+PID 启用 SelectiveSuspendEnabled 注册表值。

在支持Windows 8连接待机的系统上,当系统处于连接待机状态时,此驱动程序将进入选择性挂起 (D2) 。 此驱动程序可以唤醒系统并打开屏幕。

USB 集线器: 在没有连接到根中心或外部中心的设备或连接到该中心的所有设备可以有选择地挂起时,此驱动程序可以选择性地挂起。

USB 调制解调器: 在没有活动调制解调器连接时,此驱动程序可以有选择地挂起设备。

USB 存储: 当支持Windows 8连接待机的系统上,当这些系统进入连接待机状态时,此驱动程序可以有选择地挂起 (D3) 存储设备。 与 HID 一样,注册表重写用于在所有Windows 8系统上启用选择性挂起。

USB 存储 (UAS): 当存储设备在磁盘超时期间处于空闲状态时,此驱动程序可以有选择地挂起 (D3) 。

USB 摄像头: 此驱动程序可以在 Windows Vista 和更高版本的操作系统上选择性地挂起 (D3) 网络摄像头。

USB 音频: 当计算机使用电池电源时,此驱动程序可以在 Windows 7 及更高版本的操作系统上选择性地挂起 (D3) USB 音频设备。

复合 USB 当所有子项都处于挂起状态时,此驱动程序可以选择性地挂起 (D3) 复合设备。 在支持 D3-Cold 的系统上,所有子级都必须选择使用 D3-Cold。

USB 智能卡: 默认情况下,在 Windows 7 及更高版本的操作系统中,此驱动程序可以有选择地挂起 (D2) 智能卡接口设备。

通用 USB 外设 (WinUSB): 默认情况下,此驱动程序可以在 Windows Vista 和更高版本的操作系统上选择性地挂起 (D3) 设备。

WWAN:3G 或 WiMax 硬件保护装置,此驱动程序可以有选择地挂起设备。 当存在活动订阅时,设备将进入 D2,在没有活动订阅的情况下,设备将进入 D3。

为什么 USB 设备无法从 S3 唤醒 Windows?

USB 设备无法从 S3 唤醒 Windows,原因有多种,包括:

  • BIOS 不正确。

验证计算机上是否已安装最新的 BIOS。 若要获取计算机的最新 BIOS 修订版,请访问 OEM 或 ODM 的网站。

  • 未启用唤醒的 BIOS。

某些 BIOS 可以禁用从 S3 和 S4 唤醒。 验证 BIOS 是否已启用从 S3 唤醒。

  • 未设置 USBBIOSx 注册表项。

Windows XP 的全新安装没有 USBBIOSx 注册表项。 如果 OEM 或 ODM 验证 BIOS 是否可以从 S3 唤醒,请将此注册表项设置为0x00并重新启动计算机。

  • 主机控制器在 S3 或 S4 中没有电源。

很多时候,当电脑处于较低功率状态时,电脑会切断加载项卡电源。 如果加载项卡没有电源,它将无法检测唤醒事件,并且无法唤醒电脑。

是否需要为增强型 (USB 2.0) 主机控制器安装驱动程序?

以下版本的 Windows 支持 USB 2.0 增强型主机控制器:

  • Windows Vista 及更高版本
  • Windows Server 2003 及更高版本
  • Windows XP Service Pack 1
  • Windows 2000 Service Pack 4

注意 由于 Windows 2000 和 Windows XP 是在 USB 2.0 硬件可用之前发布的,因此在 Service Pack 中为这些操作系统发布了驱动程序。 安装驱动程序的方式如下:

1.按照第一个问题的答案中所述的过程,验证计算机是否具有 USB 2.0 端口,以及是否需要为增强型主机控制器安装驱动程序。

2.在"设备管理器"窗口中,展开第一个问题中所述的"其他设备"部分,然后双击"通用串行总线 (USB) 控制器"。

3.在"属性"对话框的" 常规 "选项卡上,选择" 重新安装驱动程序"。

4.在"添加新硬件向导"中,选择" 自动安装软件 (推荐) ",然后选择" 下一步"。 继续执行向导,接受所有默认选项,直到到达向导的最后一页,然后选择" 完成"。 可能需要重新启动计算机才能完成安装。

注意若要确保计算机上安装了最新更新,请定期访问 Windows 更新。

是否可以禁用"HI-SPEED USB 设备已插入非 HI-SPEED USB 端口"通知?

当高速 USB 设备插入不支持高速的 USB 端口时,Windows XP 和更高版本的 Windows 会创建弹出通知。 若要从设备获得最快的性能,用户必须选择通知并按照屏幕上的说明进行操作。

若要禁用该通知,请执行以下步骤:

  1. 如本常见问题解答中的第一个问题中所述,开始设备管理器。
  2. 在"设备管理器"窗口中,展开"通用串行总线控制器"节点。 查找标题中带有"通用"或"打开"字样的主控制器。 如果找到,请双击它。
  3. 在"属性"对话框的"高级"选项卡上,选择"不告诉我 USB 错误"。

注意 上述过程禁用所有 USB 通知,而不仅仅是"HI-SPEED USB 设备已插入非 HI-SPEED 端口"。

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

USB 2.0 集线器可以有一个事务转换器 (TT) ,用于集线器上所有面向下游的端口 (单个 TT) ,也可以为集线器上每个面向下游的端口提供一个 TT (多个 TT) 。

USB 设备描述符的 bDeviceProtocol 字段的值和 USB 接口描述符的 bInterfaceProtocol 字段的值指示集线器是单 TT 还是多 TT:

  • 单一 TT。 bDeviceProtocol == 0x01
  • 多 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 序列号中哪些字符或字节有效?

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

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

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

如果设备具有序列号,则序列号必须唯一标识同一设备的每个实例。

例如,如果两个设备描述符的 idVendor、 idProduct 和 bcdDevice 字段具有相同的值, 则 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 版本也是如此。

如何将数字分配给复合设备上的多个接口?

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

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

  • 接口号必须是从零开始的。
  • 接口编号必须是连续且递增的。

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

应为所有版本的 Windows 分配接口的备用设置,如下所示:

  • 接口的默认值始终为备用设置零。
  • 其他备用设置数必须是连续的且不断增加的。

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

Usbccgp.sys 支持以下各项的复合设备:

  • Windows Me
  • Windows XP
  • Windows Server 2003
  • Windows Vista
  • Windows Server 2008

尽管仍可以在这些及更高版本的 Windows 上加载 Usbhub.sys 作为复合设备的父驱动程序,但 Microsoft 不建议这样做,因为这可能会导致硬件兼容性错误。 应改用 Usbccgp.sys 。

若要确保为复合设备加载正确的驱动程序,请在 INF 文件中使用 Include 和 Needs 指令,如下所示:

Include = USB.INF
Needs = Composite.Dev

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

  • Usbccgp 仅支持默认配置,即配置 0。
  • Usbccgp 在 Windows XP 和 Windows Server 2003 中不支持选择性挂起。 此功能仅在 Windows Vista 和更高版本的 Windows 中受支持。 注意 Usbccgp 在 Windows XP SP1 和更高版本的 Windows XP 中支持选择性挂起,但功能有限。 对于这些版本的 Windows,仅当设备的每个子功能都有挂起的空闲 IRP 时,复合设备才会进入选择性挂起状态。 Usbccgp 不支持 Windows XP RTM 中的选择性挂起
  • Usbccgp 仅在 Windows XP SP2、Windows Server 2003 SP1 和更高版本的 Windows 中支持 IAD (IAD) 接口关联描述符。
  • Usbccgp 仅在 Windows XP SP2、Windows Server 2003 SP1 和更高版本的 Windows 中支持非连续接口号。

Windows 是否支持接口关联描述符?

是的。 USB 2.0 接口关联描述符 (IAD) 工程更改通知 (ECN) 引入了一种新的标准方法,用于描述接口分组及其函数中的备用设置。 IAD 可用于标识一个函数中的两个或多个连续接口和备用设置。

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

  • Windows XP Service Pack 2 及更高版本
  • Windows Server 2003 Service Pack 1 及更高版本
  • Windows Vista

USB 堆栈是否处理 URB 中链接的 MDL?

Windows 附带的 USB 3.0 驱动程序堆栈支持此功能。

驱动程序是否可以在 IRP 中有多个 URB?

错误。 Windows 附带的 USB 堆栈不支持此功能。

Windows 是否支持 USB 复合集线器?

复合 USB 设备(也称为多功能 USB 设备)公开多个功能,其中每个功能都可以视为独立的设备。 系统加载 USB 泛型父驱动程序 (Usbccgp.sys),以充当设备功能的父驱动程序。 USB 泛型父驱动程序枚举复合设备的功能,就像它们是单独的 USB 设备一样,然后创建 PDO 并为每个函数构造设备堆栈。

复合 USB 设备无法公开用作集线器的函数。 Windows 未正确枚举此类中心,并且尝试安装设备可能会导致系统崩溃。

相关推荐
2202_7544215418 分钟前
一个计算频率的模块
驱动开发·fpga开发
嵌入(师)1 天前
嵌入式驱动开发详解1(系统调用)
驱动开发
昵称p1 天前
杂项驱动开发
驱动开发·gpio子系统·杂项驱动开发
7yewh1 天前
嵌入式硬件杂谈(四)-高速板PCB设计 高速信号全面讲解 蛇形线 等长线 差分对 阻抗对
驱动开发·嵌入式硬件·mcu·物联网·硬件工程·pcb工艺·精益工程
lishing62 天前
Linux驱动开发(9):pinctrl子系统和gpio子系统--led实验
linux·运维·驱动开发
lishing62 天前
Linux驱动开发(7):使用设备树实现RGB 灯驱动
linux·驱动开发
TeYiToKu2 天前
笔记整理—linux驱动开发部分(13)块设备
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
网易独家音乐人Mike Zhou2 天前
【Linux驱动开发】irq中断配置API及中断应用 阻塞休眠和非阻塞的驱动操作
linux·c语言·驱动开发·stm32·单片机·mcu·iot
believe、悠闲2 天前
GetVolumeInformation函数使用记录
c++·windows·驱动开发
不怕犯错,就怕不做2 天前
修复kernel编译栈帧大小异常问题error: the frame size of 1928 bytes is larger than 1024 bytes
linux·arm开发·驱动开发