Windows 中的 USB 设备端驱动程序

描述 USB 函数堆栈的体系结构。

在 USB 设备上,当 ACPI 创建 USB 设备物理设备对象 (PDO) 时,USB 函数堆栈是指由 即插即用 管理器枚举的一组驱动程序。

在单个配置设备中,USB 设备可以定义一个或多个接口。 例如,媒体传输协议 (MTP) ,用于将文件传输到设备或从设备传输文件。 复合 USB 设备可以在单个配置中支持多个接口。 USB 函数堆栈为每个接口创建 PDO,PnP 管理器会加载类驱动程序,该驱动程序为该接口创建函数设备对象 (FDO) 。

USB 函数堆栈在此图像中概念化:

usb function stack.

应用程序和服务

  • 所有用户模式请求都会发送到 Microsoft 提供的内核模式类驱动程序GenericUSBFn.sys。 可以通过 (IOCTL) 在 genericusbfnioctl.h 中定义) 发送 I/O 控制代码,创建与GenericUSBFn.sys通信的用户模式服务。 有关这些 IOCTL 的详细信息,请参阅 从用户模式服务与GenericUSBFn.sys通信

USB 函数类驱动程序

USB 函数类驱动程序实现 USB 设备上特定接口 (或接口组) 的功能。 MTP 和 IpOverUsb 是系统提供的类驱动程序的示例。 类驱动程序可以纯粹作为内核模式驱动程序实现,也可以是与系统提供的类驱动程序GenericUSBFn.sys配对的用户模式服务。

函数类驱动程序使用 USB 函数类驱动程序将请求发送到控制器到 UFX 编程接口

UFX) UFX (USB 函数类扩展

UFX) UFX (USB 函数类扩展是内核 模式驱动程序框架 的系统提供的扩展, (KMDF) 。 USB 是标准总线,具有一些必需的功能和功能。 UFX 负责实现所有 USB 函数控制器通用的 USB 函数逻辑,以及处理和/或从 USB 函数类驱动程序调度请求。 具体而言,UFX 处理枚举设备和处理标准控制传输的过程。 若要执行其中一些操作,UFX 需要知道总线的功能。 建立类扩展接口时,这些功能将报告给 UFX。

UFX 公开了标准 IOCTL,上层 (USB 函数类驱动程序和用户模式服务) 可用于将请求发送到控制器。 此外,UFX 会通知上层有关从主机接收的标准请求。

USB 函数客户端驱动程序

UFX 提供了一个抽象接口,该接口可跨不同的控制器一致工作。 但是,控制器具有不同的功能,其限制包括终结点数、终结点类型、低功率、远程唤醒。 例如,某些控制器支持 DMA,而另一些控制器则不支持。 某些控制器在硬件中实现流,而其他控制器则期望驱动程序处理流。 出于这些原因,UFX 中仅处理常见功能。 传输、电源管理、流支持和其他功能因控制器到控制器而异,由客户端驱动程序处理。

USB 函数客户端驱动程序负责实现特定于控制器的操作。 这包括实现终结点数据传输、USB 设备状态更改 (重置、暂停、恢复) 、附加/分离检测、端口/充电器检测。 客户端驱动程序还负责处理电源管理和 PnP 事件。

函数客户端驱动程序使用 USB 函数类驱动程序将作为 内核模式驱动程序框架 (KMDF) 驱动程序写入 UFX 编程接口

Microsoft 为 ChipIdea 和 Synopsys 控制器提供现装函数客户端驱动程序 (UfxChipidea.sys,Ufxsynopsys.sys) 。

USB 较低筛选器驱动程序

如果函数控制器使用内置 Synopsys 和 ChipIdea 驱动程序,USB 下部筛选器驱动程序支持检测充电器。 筛选器驱动程序从 USB 端口检测开始管理 USB 充电。 t 必须为它支持的每个充电器类型发布 GUID,以及该充电器的属性列表。 如果可配置特定充电器,则较低的 USB 筛选器驱动程序定义受支持的 PropertyID 列表及其可发送到它的相应值类型,以配置充电器。 驱动程序还通知电池堆栈何时可以开始充电,设备可以绘制的最大当前量。 对于 Synopsys 和 ChipIdea 驱动程序以外的客户端驱动程序,可以在客户端驱动程序中实现充电逻辑。

函数类驱动程序使用 编程接口支持专有充电器向 UFX 发送请求。

通用串行总线 (USB)