组件级电源管理

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

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

若要注册要由 PoFx 管理的设备,驱动程序会调用 PoFxRegisterDevice 例程。 驱动程序向此例程传递 一个PO_FX_DEVICE 结构,该结构在其他数据中,该结构包含 PO_FX_COMPONENT 结构数组。 此数组中的每个元素描述设备中某个组件的 Fx 电源状态以及每个 Fx 状态的属性。 (不支持组件级电源管理的组件至少只实现 F0 state.) 特定组件中特定 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 调用会将指定组件的计数递增 1,而 PoFxIdleComponent 调用会将计数递减 1。

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

如果 PoFxIdleComponent 调用将计数从 1 减为 0,则 PoFx 将启动从活动条件到空闲条件的转换,并在此转换完成时通知驱动程序。 如果 PoFxIdleComponent 调用递减了计数,但计数仍不为零,则组件将保持活动状态,驱动程序不会收到通知。

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

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

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

设备电源管理参考