Windows 中的 USB 宿主端驱动程序

本主题概述了 USB 驱动程序堆栈体系结构 (串行总线) 总线。

下图显示了适用于 Windows 8 的 USB 驱动程序堆栈的体系结构Windows 8。 此图显示了适用于 USB 2.0 和 USB 3.0 的单独 USB 驱动程序堆栈。 当设备连接到 xHCI 控制器时,Windows 会加载 USB 3.0 驱动程序堆栈。 USB 3.0 堆栈是 Windows 8。

Windows 为连接到 eHCI、oHCI 或 uHCI 控制器的设备加载 USB 2.0 驱动程序堆栈。 USB 2.0 驱动程序堆栈随 Service Pack 1 (SP1) 及更高版本的 Windows 操作系统一起提供。

usb 2.0 和 3.0 驱动程序堆栈的体系结构块图。

USB 3.0 驱动程序堆栈

USB 3.0 堆栈是 Windows 8。 Microsoft 通过使用内核模式驱动程序框架和 KMDF 接口 (新) 驱动程序。 KMDF 驱动程序模型降低了复杂性并提高稳定性。

USB 3.0 主机控制器驱动程序 (Usbxhci.sys)

xHCI 驱动程序是 USB 3.0 主机控制器驱动程序。 xHCI 驱动程序的职责包括初始化 xHCI 控制器硬件的 MMIO 寄存器和主机基于内存的数据结构、将上层驱动程序的传输请求映射到传输请求块,以及将请求提交到硬件。 完成传输后,驱动程序将处理来自硬件的传输完成事件,并向上传播驱动程序堆栈上的事件。 它还控制 xHCI 控制器设备槽和终结点上下文。

xHCI 驱动程序是 Windows 8中的新增功能,不是早期版本的操作系统中提供的 eHCI 微型端口驱动程序的扩展。 新驱动程序是使用内核模式驱动程序框架 (KMDF) 接口编写的,并针对所有控制器电源管理和 PnP 事件使用 KMDF。 Windows 将 xHCI 驱动程序作为功能设备对象加载 (主机) 设备堆栈中的 FDO 对象。

USB 主机控制器扩展 (Ucx01000.sys)

USB 主机控制器扩展驱动程序 (KMDF 扩展) 是特定于基础类的主机控制器驱动程序(如 xHCI 驱动程序)的新扩展。 新驱动程序是可扩展的,旨在支持将来应开发的其他类型的主机控制器驱动程序。 USB 主机控制器扩展充当中心驱动程序的常见抽象接口,提供一种通用机制,用于将请求排队到主机控制器驱动程序,并替代某些选定的函数。 由上部驱动程序启动的所有 I/O 请求在 xHCI 驱动程序之前到达主机控制器扩展驱动程序。 收到 I/O 请求后,主机控制器扩展将验证该请求,然后将请求转发到与目标终结点关联的适当 KMDF 队列。 xHCI 驱动程序准备好处理时,从队列中检索请求。 USB 主控制器扩展驱动程序的职责包括:

  • 向 xHCI 驱动程序提供特定于 USB 的对象。
  • 向 xHCI 驱动程序提供 KMDF 事件回调例程。
  • 管理和控制与主机控制器关联的根中心的操作。
  • 实现客户端驱动程序可配置的功能,如链接的 MTL、流等。

USB 集线器驱动程序 (Usbhub3.sys)

适用于 3.0 设备的 USB 驱动程序堆栈中的新集线器驱动程序使用 KMDF 驱动程序模型。 中心驱动程序主要执行以下任务:

  • 管理 USB 集线器及其端口。
  • 枚举附加到其下游端口的设备和其他中心。
  • 为枚举的 () PDU 创建物理设备对象。

Windows 将中心驱动程序作为中心设备堆栈中的 FDO 加载。 新驱动程序中的设备枚举和中心管理通过一组状态机实现。 中心驱动程序依赖于 KMDF 进行电源管理和 PnP 功能。 除了中心管理外,中心驱动程序还会对 USB 客户端驱动程序层发送的某些请求执行初步检查和处理。 例如,中心驱动程序分析 select-configuration 请求,以确定请求将配置哪些终结点。 分析信息后,中心驱动程序将请求提交到 USB 主机控制器扩展或进一步处理。

USB 2.0 驱动程序堆栈

Windows 为连接到 eHCI、oHCI 或 uHCI 控制器的设备加载 USB 2.0 驱动程序堆栈。 USB 2.0 驱动程序堆栈中的驱动程序随 SP1 及更高版本的 Windows 操作系统一起在 Windows XP 中提供。 USB 2.0 驱动程序堆栈旨在简化 USB 2.0 规范中定义的高速 USB 设备。

USB 驱动程序堆栈的底部是主机控制器驱动程序。 它由端口驱动程序、Usbport.sys以及同时运行的三个微型端口驱动程序中的一个或多个组成。 当系统检测到主机控制器硬件时,它将加载这些微型端口驱动程序之一。 微型端口驱动程序在加载后加载端口驱动程序,Usbport.sys。 端口驱动程序处理独立于特定协议的主机控制器驱动程序职责的这些方面。

微型Usbuhci.sys (驱动程序) 通用主机控制器接口将Uhcd.sys Windows 2000 附带的微型类驱动程序。 微型Usbohci.sys (驱动程序中打开的) 接口将Openhci.sys。 该Usbehci.sys微型端口驱动程序支持高速 USB 设备,是在 Windows XP SP1 及更高版本以及 Windows Server 2003 及更高版本操作系统中引入的。

在所有支持 USB 2.0 的 Windows 版本中,操作系统能够同时管理 USB 1.1 和 USB 2.0 主机控制器。 每当操作系统检测到这两种类型的控制器都存在时,它会创建两个单独的设备节点,每个主机控制器各有一个。 Windows 随后为符合 USB 2.0 的主机控制器硬件加载 Usbehci.sys 微型端口驱动程序,为符合 USB 1.1 的硬件加载 Usbohci.sys 或 Openhci.sys,具体取决于系统配置。

端口驱动程序上方是 USB 总线驱动程序,Usbhub.sys集线器驱动程序。 这是系统上每个中心的设备驱动程序。

USB 公共类泛型父驱动程序 (Usbccgp.sys)

USB 通用类通用父驱动程序是 Microsoft 为复合设备提供的父驱动程序。 如果 deviceClass 为 0 或 0xef且设备描述符中的 numInterfaces 大于 1,中心驱动程序将枚举并加载父复合驱动程序。 中心驱动程序将父复合驱动程序的兼容 ID 生成为"USB \ COMPOSITE"。 Usbccgp.sys使用 Windows 驱动模型 (WDM) 例程。

父复合驱动程序枚举复合设备中的所有函数,并为每个函数创建 PDO。 这会导致为设备中的每个函数加载相应的类或客户端驱动程序。 每个函数驱动程序 (PDO) 向父驱动程序发送请求,父驱动程序将请求提交到 USB 集线器驱动程序。

Usbccgp.sys SP1 及更高版本的 Windows 操作系统的 Windows XP 中提供。 在Windows 8中,驱动程序已更新,实现了 USB 3.0 规范中定义的函数挂起和远程唤醒功能。

有关详细信息,请参阅USB 通用父驱动程序 (Usbccgp.sys) 。

WinUSB (Winusb.sys)

Windows USB (WinUSB) 是 Microsoft 提供的适用于 USB 设备的通用驱动程序。 WinUSB 体系结构包括内核模式驱动程序 (Winusb.sys) 和用户模式动态链接库 (Winusb.dll) 。 对于不需要自定义函数驱动程序的设备,Winusb.sys作为函数驱动程序安装在设备的内核模式堆栈中。 然后,用户模式进程Winusb.sys一组设备 I/O 控制请求或调用 WinUsb Xxx 函数来与用户 _ 模式进程 通信。 有关详细信息,请参阅 WinUSB

在Windows 8中,Microsoft 为 WinUSB (Winusb.inf 提供的 INF) 文件包含 USB \ MS _ COMP _ WINUSB 作为设备标识符字符串。 这Winusb.sys在 MS OS 描述符中具有匹配 WinUSB 兼容 ID 的设备自动加载为函数驱动程序。 此类设备称为 WinUSB 设备。 硬件制造商无需分发其 WinUSB 设备的 INF 文件,使最终用户的驱动程序安装过程更简单。 有关详细信息,请参阅 WinUSB 设备

USB 客户端驱动程序

每个 USB 设备(复合或非复合)由客户端驱动程序管理。 USB 客户端驱动程序是作为 USB 驱动程序堆栈的客户端的类或设备驱动程序。 此类驱动程序包括 Microsoft 或第三方供应商提供的类和设备特定的驱动程序。 若要查看 Microsoft 提供的类驱动程序列表,请参阅支持的 USB 设备类的驱动程序。 客户端驱动程序通过调用 USB 驱动程序堆栈公开的公共接口来创建与设备通信的请求。

复合设备的客户端驱动程序与非复合设备的客户端驱动程序没有什么不同,但驱动程序堆栈中的位置除外。

非复合设备的客户端驱动程序直接分层在中心驱动程序之上。

对于公开多个函数且没有父类驱动程序的复合 USB 设备,Windows 将加载 USB 通用父驱动程序 (Usbccgp.sys) 中心驱动程序和客户端驱动程序层之间。 父驱动程序为复合设备的每个功能创建单独的 PDO。 在通用 (驱动程序上方加载) 函数的客户端驱动程序和 FDOS。 供应商可能会选择为每个函数提供单独的客户端驱动程序。

USB 客户端驱动程序可以在用户模式或内核模式下运行,具体取决于驱动程序的要求。 可以使用 KMDF、UMDF 或 WDM 例程编写 USB 客户端驱动程序。

客户端驱动程序的帮助程序库

Microsoft 提供以下帮助程序库来帮助内核模式驱动程序和应用程序与 USB 驱动程序堆栈进行通信:

  • Usbd.sys

    Microsoft 提供了Usbd.sys USB 客户端驱动程序的例程的库。 帮助程序例程简化了客户端驱动程序的操作任务。 例如,通过使用帮助程序例程,USB 客户端驱动程序可以针对某些特定操作(例如选择配置)生成 USB 请求块 (URB) , 并提交这些 URB 到 USB 驱动程序堆栈。

  • Usbdex.lib

    此帮助程序库是适用于 Windows 8。 库导出主要用于分配和生成 URB 的例程。 这些例程替换了由 Usbd.sys 导出的一些旧例程。 新例程要求客户端驱动程序向 USB 驱动程序堆栈注册,该堆栈维护用于注册的句柄。 该句柄用于调用其他 Usbdex.lib 例程。 新例程分配的某些 URB 具有 USB 驱动程序用于更好地跟踪和处理的 URB 上下文。 有关详细信息,请参阅分配和生成 URB。

  • Winusb.dll

    Winusb.dll是一个用户模式 DLL,它公开 WinUSB 函数以与 Winusb.sys 通信,该函数在内核模式下作为设备的函数驱动程序加载。 应用程序使用这些函数来配置设备、检索有关设备的信息以及执行 I/O 操作。 有关使用这些函数的信息,请参阅如何使用 WinUSB函数访问 USB 设备。

USB 驱动程序 (串行总线) 驱动程序
USB 驱动程序开发指南