Windows 中的 USB 主机端驱动程序

Windows 中的 USB 主机端驱动程序

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

下图显示了 Windows 8 USB 驱动程序堆栈体系结构框图。该图分别显示了 USB 2.0 和 USB 3.0 的 USB 驱动程序堆栈。当设备附加到 xHCI 控制器时,Windows 会加载 USB 3.0 驱动程序堆栈。USB 3.0 堆栈是 Windows 8 中的新功能。

当设备连接到 eHCI、oHCI 或 uHCI 控制器时,Windows 会加载 USB 2.0 驱动程序堆栈。USB 2.0 驱动程序堆栈随 Windows XP 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 驱动程序的责任包括初始化 MMIO 注册和用于 xHCI 控制器硬件的基于主控制器内存的数据结构、从上层驱动程序映射传输请求到传输请求块以及提交请求至硬件。完成传输后,驱动程序将通过硬件处理传输完成事件,并传播事件到驱动程序堆栈。此外,它还控制 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 事件回调例程。
  • 管理和控制主控制器关联的根集线器的操作。
  • 实现可以由客户端驱动程序配置的功能,如链式 MDL、流等。

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

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

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

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

USB 2.0 驱动程序堆栈

当设备连接到 eHCI、oHCI 或 uHCI 控制器时,Windows 会加载 USB 2.0 驱动程序堆栈。USB 2.0 驱动程序堆栈中的驱动程序随 Windows XP SP1 及更高版本的 Windows 操作系统一起提供。USB 2.0 驱动程序堆栈设计用于方便 USB 2.0 规范中定义的高速 USB 设备运行。

在 USB 驱动程序堆栈的底部是主控制器驱动程序。它包括端口驱动程序 Usbport.sys 以及同时运行的三个微型端口驱动程序中的一个或多个。当系统检测到主控制器硬件时,它将加载这些微型端口驱动程序的其中一个。微型端口驱动程序在加载后,将加载端口驱动程序 Usbport.sys。端口驱动程序将处理主控制器驱动程序中那些独立于特定协议的任务。

Usbuhci.sys(通用主控制器接口)微型端口驱动程序将替换随 Windows 2000 提供的 Uhcd.sys 微型类驱动程序。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 随 Windows XP SP1 及更高版本的 Windows 操作系统提供。在 Windows 8 中,将驱动程序更新以实现 USB 3.0 规范中定义的函数暂停和远程唤醒功能。

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

WinUSB (Winusb.sys)

Windows USB (WinUSB) 是 Microsoft 提供的 USB 设备的通用驱动程序。WinUSB 体系结构由内核模式驱动程序 (Winusb.sys) 和用户模式动态链接库 (Winusb.dll) 组成。对于不需要自定义功能驱动程序的设备,可以将 Winusb.sys 安装在设备的内核模式堆栈中,将其作为功能驱动程序。而用户模式进程可通过使用一组设备 I/O 控制请求或调用 WinUsb_Xxx 函数来与 Winusb.sys 通信。 有关详细信息,请参阅 WinUSB

在 Windows 8 中,Microsoft 为 WinUSB 提供的信息 (INF) 文件 (Winusb.inf) 包含 USB\MS_COMP_WINUSB(作为设备标识符字符串)。这可为 MS 操作系统描述符中拥有匹配的 WinUSB 兼容 ID 的那些设备自动加载 Winusb.sys 作为功能驱动程序。此类设备称为 WinUSB 设备。硬件制造商不需要为其 WinUSB 设备分发 INF 文件,从而使最终用户的驱动程序安装过程更为简单。有关详细信息,请参阅 WinUSB 设备

USB 客户端驱动程序

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

除了在驱动程序堆栈中的位置以外,复合设备的客户端驱动程序与非复合设备的客户端驱动程序无任何不同。

非复合设备的客户端驱动程序直接位于集线器驱动程序层上方。

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

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

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

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

  • Usbd.sys

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

  • Usbdex.lib

    此帮助程序库是 Windows 8 的新功能。该库主要为分配和构建 URB 导出例程。这些例程替换 Usbd.sys 导出的某些旧例程。新的例程要求客户端驱动程序在 USB 驱动程序堆栈中注册,这样可维护注册句柄。 该处理用于调用其他 Usbdex.lib 例程。新的例程分配的某些 URB 具有 URB 上下文,USB 驱动程序可用其进行更好的跟踪和处理。 有关详细信息,请参阅分配和构建 URB

  • Winusb.dll

    Winusb.dll 是用户模式 DLL,它提供 WinUSB 功能以便与 Winusb.sys 进行通信,它在内核模式下可加载为设备的功能驱动程序。应用程序使用这些功能配置设备,检索关于设备的信息并执行 I/O 操作。有关使用这些功能的信息,请参阅如何使用 WinUSB 功能访问 USB 设备

相关主题

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

 

 

显示:
© 2016 Microsoft