USB 驱动程序 (WDF) 中的选择性挂起

USB 函数驱动程序通过实现 USB 选择性挂起支持运行时空闲检测。 下面是面向驱动程序开发人员的内容,介绍如何在基于 Windows® Driver Foundation (WDF) 的 USB 驱动程序中实现选择性挂起。

关于选择性挂起

选择性挂起是能够关闭并稍后恢复空闲 USB 设备,而连接到该设备的计算机保持工作状态 (S0) 。 对于节能操作(尤其是在移动电脑上),所有 USB 设备和驱动程序都应支持选择性挂起。 在设备处于空闲状态时关闭设备,但当系统保持 S0 状态时,具有以下显著优势:

  • 选择性挂起可节省电量。
  • 选择性暂停有助于减少环境因素,如热负载和噪音。

如果设备硬件在空闲时可以关机,驱动程序应支持此功能。 基于 Windows® Driver Foundation (WDF) 的 USB 驱动程序中的选择性挂起支持最多需要一些额外的回调,而不需要基本即插即用支持所需的回调。

USB 设备的每个功能驱动程序都应实现积极的电源管理,以便在系统运行时挂起空闲设备。 本主题介绍如何在基于 WDF 的驱动程序中实现选择性挂起。 如果不熟悉 WDF,请参阅 Windows 驱动程序工具包 (WDK) 和使用 Windows Driver Foundation 开发驱动程序。

USB 设备支持通过 USB 选择性挂起进行运行时空闲检测。 选择性挂起允许将空闲设备置于挂起状态,而不会影响连接到同一集线器的其他设备(如果是多功能设备),而不会影响设备中的其他功能。 当所有设备或功能都已挂起时,整个集线器或多功能设备可以关闭电源。

从硬件的角度来看,选择性挂起是 USB 端口上的一种物理状态。 当附加到端口的所有函数都空闲时,该端口可以进入选择性挂起。

为了符合 USB 规范,所有 USB 设备都必须支持选择性挂起。 当 USB 总线空闲时,设备必须能够关闭电源。 Microsoft 提供的 USB 集线器驱动程序在硬件级别实现选择性挂起。

USB 功能驱动程序应通过 WDF 为其各个设备功能实现选择性挂起,WDF 与总线驱动程序通信,并管理暂停和恢复设备功能的设备 I/O 控制请求。 WDF 使内核模式和用户模式驱动程序都支持选择性挂起。

函数驱动程序的 USB 选择性挂起代码的详细信息取决于驱动程序是在用户模式还是内核模式下运行。 请考虑以下准则:

  • 尽可能使用用户模式驱动程序框架 (UMDF) 来实现 USB 驱动程序。 用户模式驱动程序损坏系统数据的可能性较小,并且比内核模式驱动程序更易于调试。
  • 仅当驱动程序通过常时等量终结点流式传输数据或需要仅在内核模式下可用的其他功能或资源时,才使用内核模式驱动程序框架 (KMDF) 。

电源策略所有权、I/O 队列和选择性挂起

设备堆栈的电源策略所有者 (PPO) 是确定设备在任何给定时间应处于哪个电源状态的驱动程序。 每个设备堆栈中只有一个驱动程序可以是 PPO。 函数驱动程序通常是其设备的 PPO。

如果 USB 驱动程序支持选择性挂起,并且其设备堆栈中的 PPO 之上分层,则驱动程序不得使用电源管理的队列。 这适用于 UMDF 和 KMDF 驱动程序。 如果在设备挂起时收到电源管理队列的请求,整个设备堆栈可能会停止。

图 1 显示了通过 USB 驱动程序的 I/O 队列向 USB 驱动程序发出的 I/O 请求流。

对 WDF USB 驱动程序的请求的流程图。

在图中,针对 USB 驱动程序的请求到达。 框架将请求添加到相应的队列。

如果队列不受电源管理,框架将根据驱动程序为队列配置的调度类型向驱动程序提供请求,该调度类型 (顺序、并行或手动) 。 然后,驱动程序处理请求。

如果队列受电源管理且设备未挂起,则框架会根据配置的调度类型向驱动程序提供请求。

但是,如果设备挂起,框架的操作取决于驱动程序是否是设备堆栈的 PPO。 如果驱动程序是 PPO,则框架将与 USB 父驱动程序通信以启动设备。 设备恢复后,框架向驱动程序提供请求。

如果驱动程序不是 PPO,则框架不会执行进一步的操作,因为只有 PPO 可以恢复设备。 请求保留在队列中。 如果 PPO 未收到导致它恢复设备的任何请求,则设备堆栈将停止。

在本节中

主题 说明
UMDF 驱动程序中的选择性挂起 本主题介绍 UMDF 函数驱动程序如何支持 USB 选择性挂起。
USB KMDF 功能驱动程序中的选择性挂起 本主题介绍 KMDF 函数驱动程序如何支持 USB 选择性挂起。