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

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

关于选择性挂起

选择性挂起是指能够在计算机仍保持工作状态(S0)的情况下,先对空闲的 USB 设备断电,然后再恢复其电源。 对于节能作(尤其是在移动电脑上),所有 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 显示了 I/O 请求通过 I/O 队列到达 USB 驱动程序的流程。

向 WDF USB 驱动程序发出的请求流程图。

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

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

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

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

如果驱动程序不是 PPO,则框架不会采取任何进一步措施,因为只有 PPO 才能恢复设备。 请求保留在队列中。 如果 PPO 未收到导致设备恢复的任何请求,设备堆栈将停止。

本部分内容

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