Component-Level 电源管理

从 Windows 8 开始,电源管理框架(PoFx)使驱动程序能够管理设备中各个组件的电源状态。 组件级电源管理与设备级电源管理并排存在。 有关简介,请参阅 Power Management Framework 概述

本页介绍用于 Component-Level 电源管理的 PoFx API。

若要注册要由 PoFx 管理的设备,驱动程序将调用 PoFxRegisterDevice 例程。 驱动程序将一个PO_FX_DEVICE结构传递给此例程,该结构包含一个PO_FX_COMPONENT结构数组和其他数据。 此数组中的每个元素描述设备中组件的 Fx 电源状态以及每个 Fx 状态的属性。 (至少,不支持组件级电源管理的组件仅实现 F0 状态。特定组件中特定 Fx 电源状态的属性由 PO_FX_COMPONENT_IDLE_STATE 结构描述,该结构包含以下值:

  • 转换延迟是指从 Fx 状态转换到 F0(全开)状态所需的时间。
  • 驻留时间要求,即组件在此 Fx 状态中必须停留的时间,以便从值得过渡到该状态。
  • 名义电源,即此 Fx 状态下组件消耗的电源。

PoFx 使用此信息(除了其他系统范围的输入和依赖项)来做出智能决策,了解组件在任何特定时间应处于哪个 Fx 电源状态。 PoFx 必须平衡两个竞争目标。 首先,应将空闲的组件配置为尽可能少地消耗电量。 其次,组件必须准备好快速从低功耗 Fx 状态切换到 F0,以有效保持设备始终开启和始终连接的外观。

仅当设备处于 D0(完全打开)电源状态时,才能执行组件级电源管理。 当设备处于 D1(几乎打开)、D2(几乎关闭)或 D3 电源状态时,设备无法访问。 当设备处于 D0 状态时,只有驱动程序正在使用的组件需要保持 F0 状态。 空闲组件可能会切换到低功率 Fx 状态,以减少能耗。

当设备处于 D0 电源状态时,驱动程序遵循简单的协议来启用组件级电源管理。 当驱动程序需要访问组件时,驱动程序调用 PoFxActivateComponent 例程以请求访问组件。 如果组件在此调用发生时处于低功率 Fx 状态,PoFx 将启动到 F0 状态的转换,并在完成此转换时通知驱动程序。 然后,驱动程序可以访问该组件。 当驱动程序不再需要访问组件时,驱动程序将调用 PoFxIdleComponent 例程来通知 PoFx。 为了响应此调用,PoFx 可能会将组件切换到低功率 Fx 状态。

可访问的组件处于 活动状态。 无法访问的组件处于 空闲状态。 若要跟踪设备中组件的可访问性,PoFx 对每个组件维护一个激活引用计数。 PoFxActivateComponent 调用将指定组件上的计数递增一个,PoFxIdleComponent 调用将计数递减一个。

如果 PoFxActivateComponent 调用将计数从零递增为 1,则 PoFx 会启动从空闲条件到活动条件的转换,并在此转换完成时通知驱动程序。 如果组件已处于活动状态时发生 PoFxActivateComponent ,组件将保留在活动状态,并且驱动程序不会收到任何通知。

如果 PoFxIdleComponent 调用将计数从一个减少到零,PoFx 将启动从活动条件到空闲条件的转换,并在完成此转换时通知驱动程序。 如果 PoFxIdleComponent 调用会减少计数,但计数仍为非零,组件将保留在活动状态,并且驱动程序不会收到任何通知。

激活引用计数可以方便地处理同一驱动程序中的两个或多个代码路径可能需要同时访问设备中的同一组件的情况。 通过维护此计数,PoFx 使驱动程序的各个部分能够独立维护对组件的访问,而无需驱动程序集中管理对组件的访问。

组件的活动/空闲条件是驱动程序确定组件是否可访问的唯一可靠方法。 处于 F0 电源状态但处于空闲状态的组件可能即将切换到低功率 Fx 状态。

处于活动状态的组件始终处于 F0 状态。 组件在进入空闲条件之前无法离开 F0。 处于空闲状态的组件可能处于 F0 或处于低功率 Fx 状态。 如果当 PoFxActivateComponent 调用启动从空闲条件到活动条件的转换时,组件处于低功率 Fx 状态,则 PoFx 必须先将组件切换到 F0,然后组件才能进入活动条件。

设备电源管理参考