Windows10中USB驱动程序架构
Windows10驱动程序从功能上分分为USB主机驱动程序和设备端驱动程序,从支持的协议栈来分为USB3.0驱动程序和USB2.0驱动程序(包括兼容USB1.0和USB1.1)。
USB主机驱动程序
USB主机驱动程序指的是USB控制器和USB集线器驱动程序(包括根集线器)。按协议栈又分为USB3.0和USB2.0驱动程序。
- 对于USB3.0,其USB主机控制器驱动为XHCI,其驱动包括USBXhci.sys. UCX01000.SYS和USB根集线器驱动程序USBhub3.sys
- USB 3.0 驱动程序由内核模式驱动程序框架 (KMDF) 接口创建
- 对于USB2.0,其USB主机控制器驱动为EHCI(1.1的USBUhci和USBohci.sys)和其公共类代码USBPORT.SYS。USB集线器驱动程序为USBHUB.SYS
USB 3.0 主机控制器驱动程序(Usbxhci.sys)
xHCI 驱动程序是 USB 3.0 主机控制器驱动程序。 xHCI 驱动程序的职责包括初始化 xHCI 控制器硬件的 MMIO 寄存器和基于内存的数据结构、将来自上层驱动程序的传输请求映射到传输请求块,以及将请求提交到硬件。 完成传输后,驱动程序处理来自硬件的传输完成事件,并将事件传播到驱动程序堆栈上。 它还控制 xHCI 控制器设备槽和终结点上下文。
Windows 将 xHCI 驱动程序作为主机控制器的设备堆栈中的函数设备对象(FDO)加载。
USB 主机控制器扩展(Ucx01000.sys)
USB 主机控制器扩展驱动程序(KMDF 的扩展)是基础类特定的主机控制器驱动程序(例如 xHCI 驱动程序)的新扩展。 新驱动程序可扩展,旨在支持将来要开发的其他类型的主机控制器驱动程序。 USB 主机控制器扩展充当中心驱动程序的通用抽象接口,提供一种通用机制,用于将请求排队到主机控制器驱动程序,并替代某些选定的函数。 由上层驱动程序启动的所有 I/O 请求在 xHCI 驱动程序之前到达主机控制器扩展驱动程序。 收到 I/O 请求后,主机控制器扩展将验证请求,然后将请求转发到与目标终结点关联的正确 KMDF 队列。 xHCI 驱动程序在准备好进行处理时从队列中检索请求。 USB 主机控制器扩展驱动程序的职责包括:
- 向 xHCI 驱动程序提供特定于 USB 的对象。
- 向 xHCI 驱动程序提供 KMDF 事件回调例程。
- 管理和控制与主机控制器关联的根中心的操作。
- 实现客户端驱动程序可配置的功能,如链接的 MDL、流等。
Usb3.0集线器驱动 (Usbhub3.sys)
适用于 3.0 设备的 USB 驱动程序堆栈中的新中心驱动程序使用 KMDF 驱动程序模型。
- 管理 USB集线器及其端口。
- 枚举附加到其下游端口的设备和其他集线器设备。
- 为枚举设备和集线器创建物理设备对象(PDO)。
Windows 将集线器驱动程序作为 FDO 加载到集线器设备堆栈中。 新驱动程序中的设备枚举和集线器管理通过一组状态机实现。 集线器驱动程序依赖于 KMDF 进行电源管理和 PnP 功能。 除了集线器管理之外,集线器驱动程序还对 USB 客户端驱动程序层发送的某些请求执行初步检查和处理。 例如,集线器驱动程序分析选择配置请求,以确定请求将配置哪些终结点。 分析信息后,集线器驱动程序会将请求提交到 USB 主机控制器扩展或进一步处理。
USB设备端驱动程序
USB设备端驱动程序主要着重的是功能,这里有UVC相机图像驱动程序,UAC音频驱动程序,HIDUSB等USB-mini 端口驱动程序。
当然除了这些标准的类驱动程序外,还包括一些功能驱动程序,如USBCCGP.SSY,winusb.sys,usbd.sys等。
Usbd.sys
Microsoft提供导出 USB 客户端驱动程序例程的Usbd.sys库。 帮助程序例程简化了客户端驱动程序的操作任务。 例如,通过使用帮助程序例程,USB 客户端驱动程序可以针对某些特定操作(例如选择配置)生成 USB 请求块(URB), 并将这些 URB 提交到 USB 驱动程序堆栈。
Usbdex.lib
此帮助程序库是 Windows 8 的新增功能。 库导出例程主要用于分配和生成 URB。 这些例程取代了Usbd.sys导出的一些旧例程。 新例程要求客户端驱动程序向 USB 驱动程序堆栈注册,该堆栈维护注册句柄。 该句柄用于调用其他 Usbdex.lib 例程。 由新例程分配的某些 URI 具有 USB 驱动程序用于更好地跟踪和处理的 URB 上下文。 有关详细信息,请参阅 分配和生成 URB。
Winusb.dll
Winusb.dll是一个用户模式 DLL,它公开 用于与 Winusb.sys 通信的 WinUSB 函数 ,该函数在内核模式下作为设备的功能驱动程序加载。 应用程序使用这些函数配置设备、检索有关设备的信息以及执行 I/O 操作。 有关使用这些函数的信息,请参阅 如何使用 WinUSB 函数访问 USB 设备。