设备电源管理

ACPI 6.3 规范定义了一组命名空间对象,用于指定设备的设备电源信息。 例如,一组对象可以指定设备在每个支持的设备电源状态下所需的电源资源。 另一个对象类型可以描述设备响应硬件事件从低功耗状态唤醒的能力。

Windows 中的设备电源管理

当系统正在运行(即系统处于 ACPI 定义的工作状态 S0)时,个别设备可以在设备电源状态(具体取决于活动)之间进行转换,以节省电力。 在传统电脑系统中,ACPI 定义的睡眠状态(S1 到 S4)也用于节省电力,但这些断开连接的高延迟睡眠状态不会在 Windows SoC 平台上使用。 因此,电池使用时间在很大程度上取决于平台如何实现运行时设备电源管理。

集成到 SoC 中的设备可以通过 Windows Power Framework (PoFx) 进行电源管理。 这些框架集成的设备通过特定于 SoC 的电源引擎插件 (microPEP) 由 PoFx 管理,该插件知道 SoC 电源和时钟控件的具体细节。 有关 PoFX 的详细信息,请参阅 Power Management Framework 概述

对于未集成到 SoC 中的外围设备,Windows 会使用 ACPI 设备电源管理。 对于这些 ACPI 托管的设备,设备驱动程序堆栈(通常是函数或类驱动程序)中的电源策略所有者会做出设备电源状态转换决策,而 Windows ACPI 驱动程序 Acpi.sys 会调用 ASL 控制方法以应用所需的平台专用电源控制。

可以,某些设备堆栈会单独使用 ACPI 设备电源管理,或将其与 microPEP 结合使用以进行 SoC 设备电源管理。

ACPI 中的设备电源管理中所述,Windows 支持 ACPI 5.0 规范中定义的 D3cold 电源管理功能。 通过使用此支持,设备、平台和驱动程序可以选择在运行时空闲期间完全移除设备电源。 此功能可以显著延长电池使用时间。 但是,所有受影响的组件必须支持移除电源才能成功返回 D0。 因此,驱动程序(总线和功能)以及平台本身必须指示它们支持这样做。 有关 D3cold 驱动程序选择性加入的详细信息,请参阅在驱动程序中支持 D3cold

ACPI 中的设备电源管理

命名空间设备最多支持 4 个设备电源状态,编号为 D0(完整功能或“on”)到 D3(无功能或“off”)。 每个状态可以有不同的电源要求,并且消耗的功率低于编号较低的状态。 此外,D3 (off) 状态有两个子状态:D3hot 和 D3cold。 D3hot 子状态要求设备在其父总线上保持可访问,以便它可以响应特定于总线的软件命令。 D3cold 中移除了此要求以及用于满足此要求的电源。 最后,由于硬件事件,设备可以预备从低功耗状态唤醒自身,如有必要,还可以使平台退出空闲状态。

当使用平台范围的 OSPM 功能方法进行请求时,平台通过授予对“_PR3 支持”功能(位 2)的 OS 控制来指示对 D3cold 的支持。 有关详细信息,请参阅 ACPI 5.0 规范中的 6.2.10.2 部分“平台范围的 OSPM 功能”。

电源管理设备使用子对象来描述其操作系统的电源功能。 以下各部分介绍了这些功能和对象。

电源资源和状态

设备通过列出它所需的一组电源资源来声明对电源状态的支持,以使其处于该状态。 ACPI 电源资源表示为设备供电的电压轨,以及驱动它们的时钟信号。 这些资源在命名空间的根目录下声明。 每个电源资源都有一个 _ON 和一个 _OFF 方法(通过该方法对该资源进行控制),以及一个用于报告其状态的 _STA 方法。 有关详细信息,请参阅 ACPI 5.0 规范的第 7.1 节“声明电源资源对象”。

Windows ACPI 驱动程序 Acpi.sys 会监视共享资源的设备之间的电源依赖关系,并且当这些设备在电源状态之间转换时,可确保在任何特定时间仅打开设备实际需要的电源资源。

电源资源要求 (_PRx)

每个受支持的设备电源状态都有一个 Power Resource Requirements (_PRx) 对象,其中 x = 0、1、2 或 3。 当设备驱动程序决定过渡到新的电源状态时,Acpi.sys 可确保打开新状态所需的所有电源资源,并且不再使用的所有资源都处于关闭状态。

支持的设备状态 要使用的资源要求对象 要包含在要求对象中的资源
D0(必需) _PR0 设备完整功能所需的所有电源和时钟。
D1 _PR1 此状态的类定义缩减功能所需的任何电源或时钟。
D2 _PR2 此状态的类定义缩减功能所需的任何电源或时钟。
D3hot(必需) _PR3 设备只需电源或时钟即可显示在其总线上,并响应特定于总线的命令。

如果特定平台支持 D3cold 功能,并且设备的设备驱动程序选择加入 D3cold,则在过渡至 D3Cold 的某个时刻,设备 _PR3 电源资源(如果其他设备未使用这些资源)将关闭。

有关支持 D3cold 的设备电源资源要求的详细信息,请参阅 D3cold 的固件要求

设备电源状态 (_PSx)

对于每个受支持的设备电源状态 Dx,都有一个 Power State 方法 _PSx,其中 x = 0、1、2 或 3。 此方法是可选的,但如果存在,则会在关闭相应状态的电源资源之前以及该状态的电源资源处于打开状态后调用此方法。 _PSx 旨在电源周期内执行任何特定于平台的操作。 _PSx 不得访问分配给函数驱动程序的设备寄存器、访问分配给总线驱动程序的总线标准寄存器,或者打开或关闭电源资源,这是为 Acpi.sys 保留的操作。

唤醒功能

电源管理的设备可能能够在处于低功耗状态时检测事件,并导致平台唤醒以处理这些事件。 若要启用此功能,Windows 需要有关平台和设备功能的信息。

Sx 设备唤醒状态 (_SxW)

在给定平台上,设备状态之间存在特定的映射,支持唤醒功能和系统状态,这些状态可以响应唤醒事件。 ACPI 定义了 _SxW 对象,以便向操作系统提供此信息。 每个受支持的系统电源状态 Sx 都有一个 SxW 对象。 由于 SoC 平台始终处于 S0,因此这里的唯一相关对象是 _S0W。 此对象会指定平台能否从低功耗空闲状态唤醒以响应设备的唤醒信号。 Windows 使用该对象来确定设备在系统低功耗空闲期间的目标 D 状态。 有关 _S0W 的详细信息,请参阅 ACPI 5.0 规范中的第 7.2.20 节“_S0W(S0 设备唤醒状态)”。

对于大多数 SoC 平台,系统会在设备在空闲时主动为其提供电源管理以使其进入 D3 状态,并且当设备处于此状态时,系统能够从低功耗空闲中唤醒。 对于此类系统,_S0W 对象会返回 3(或 4,如果它还支持 D3cold)。

_S0W(4) 是 D3Cold 的一项要求,无论设备是否支持唤醒。

任何 D 状态都可以指定为支持最低功耗的唤醒状态,并且某些设备类或总线使用不同的值。 例如,SDIO 和 USB 连接的设备使用 D2 表示此状态。

为了方便将设备驱动程序从 Windows 7 迁移到 Windows 8 或 Windows 8.1,设备可能也需要提供 _S4W。 目前,具有此要求的唯一设备类是网络 (Ndis.sys)。

支持唤醒的中断 (_CRS)

设备的资源说明指示设备能够通过将中断标记为“支持唤醒”(ExclusiveAndWake 或 SharedAndWake)来检测唤醒事件并发出信号。 Windows 和设备驱动程序提供此类中断的特殊处理,以确保在设备转换为低功耗状态时启用这些中断。 有关详细信息,请参阅 ACPI 5.0 规范的第 6.4.3.6 节“扩展中断描述符”和第 6.4.3.8.1 节“GPIO 连接描述符”中的中断和 GpioInt 资源描述符说明。

唤醒启用

根据用户场景或系统策略,支持唤醒的设备可能实际上已准备好唤醒,也可能未准备好唤醒。 因此,当设备处于空闲状态时,可能会也可能不会启用支持唤醒的中断。 除了启用中断之外,Windows 还使用以下机制在设备上启用唤醒。

设备睡眠唤醒 (_DSW)

ACPI 将 _DSW 对象定义为一种方法,供操作系统通知 ACPI 平台固件下一个睡眠或低功耗空闲期。 此对象是可选的,仅当平台需要提前配置特定于平台的唤醒硬件时才使用。 同时提供设备的目标 D 状态和系统的目标 S 状态。 D 状态和 S 状态组合将始终符合设备 _SxW 对象提供的信息。

唤醒电源资源 (_PRW)

在某些情况下,必须为设备启用其他电源资源才能唤醒。 在这种情况下,设备可以提供 _PRW 对象来列出这些额外的电源资源。 Windows ACPI 驱动程序 Acpi.sys 将像平时一样管理这些电源资源,确保设备(即已启用唤醒的设备)需要时打开这些电源资源,否则将其关闭。

_PRW 还用于定义传统(全 ACPI 硬件)电脑平台的唤醒功能。