ACPI 电池和电源子系统固件实现
如 ACPI 规范中所述,Windows 平台应使用标准化控制方法接口通过 ACPI 在固件中公开其电池设备和交流适配器。
每个移动 Windows 平台必须有一个电源设备和一个或多个电池。 来自这些子系统的信息用于向用户传达电源状态。 此状态包括平台是使用交流电源还是直流电源运行、每个电池的充电量以及电池充电状态等信息。 Windows 电源管理器聚合此信息,并使其可供 Windows 电池计量器和其他电源管理组件使用。
此主题详细介绍平台如何向 Windows 电源管理器公开电源子系统信息。 有关详细信息,请参阅 ACPI 规范中的第 10 章“电源设备”。
注意
本文中所述的某些信息特定于 Windows,在最近的 ACPI 规范中未予详述。
ACPI 电源对象
ACPI 固件必须按照 ACPI 规范的第 10.3 条提供并实现单个 ACPI 电源设备。 此对象必须使用硬件 ID (_HID)“ACPI0003”报告自身。
注意:对于具有多个电源的系统,所有物理电源必须通过 ACPI 中的单个电源设备对象进行多路复用。 此对象必须代表系统电源输入的复合状态。 客户端系统不得提供多个电源设备对象。 (具有多个电源的服务器系统上可以存在更多电源对象。)
此对象还必须实现电源 (_PSR) 方法。 此方法返回电源的状态,并传达电源当前是联机(交流电源)还是脱机(使用电池)。 _PSR 方法必须仅在系统连接到主电源时报告联机(交流电源)。 当 _PSR 状态发生更改时,平台必须在 ACPI 命名空间中的设备上生成中断和 Notify(0x80) 命令。 必须在平台检测到物理状态更改后立即执行此操作。
ACPI 电池控制方法
ACPI 固件必须按照 ACPI 规范第 10.2 条对系统中的每个电池提供并实现 ACPI 控制方法对象。 每个电池设备必须执行以下所有操作:
- 使用硬件 ID (_HID)“PNP0C0A”标识自身。
- 实现状态 (_STA) 方法以指示设备是已启用、已禁用还是不存在。
- 使用扩展电池信息 (_BIX) 方法报告静态信息。
- 使用电池状态 (_BST) 控制方法报告电池状态。
- 通过使用电池跳变点 (_BTP) 机制支持充电量事件。
(可选)电池设备可以实现插槽单元号 (_SUN),或指示在用户界面 (UI) 中显示的电池顺序。
以下内容提供了这些方法的详细信息并描述了其 Windows 特定要求。
电池静态信息的 ACPI 实现
ACPI 固件必须对每个电池实现 _BIX 方法,以提供有关电池的静态信息,包括设计容量、周期计数和序列号。 下表扩展了 ACPI 规范第 10.2.2.2 条中所述的字段的定义,并列举了此信息的 Windows 特定要求。
主题 | 说明 | Windows 特定要求 |
---|---|---|
修订 | 指示 _BIX 修订版。 | 必须设置为 0x0。 |
电源单元 | 确定硬件报告的单位是毫安和毫安时,还是毫瓦和毫瓦时。 | 必须设置为 0x0,以指示单位是毫瓦和毫瓦时。 在运行时此值不得更改。 |
设计容量 | 指示电池的原始容量,以毫瓦时为单位。 | 必须设置为准确的值,且不能设置为 0x0 或 0xFFFFFFFF。 在运行时此值不得更改。 |
上次电池满充电量 | 指示电池的当前满充容量。 | 必须设置为准确的值,且不能设置为 0x0 或 0xFFFFFFFF。 每次周期计数增加时,此值必须更新。 电池放电时,此值必须保持恒定。 我们建议仅在电池充满电时更新此值。 |
电池技术 | 指示电池是可充电还是一次性电池。 | 必须设置为 0x1,以指示电池是可充电电池。 |
设计电压 | 指示电池的设计电压。 | 必须设置为新电池的设计电压,单位为毫伏。 不得设置为 0x0 或 0xFFFFFFFF。 在运行时此值不得更改。 |
警告设计容量 | 指示 OEM 提供的低电池电量警告级别。 | Windows 将忽略此值。 |
低电量设计容量 | 指示 Windows 在系统关闭电源之前必须立即关机或休眠的关键电池电量。 | 必须设置为介于电池设计容量的 0% 和 5% 之间的值。 |
电池容量粒度 1 | 指示硬件在“警告设计容量”和“低电量设计容量”之间可以检测到的剩余电量变化的最小量。 | 必须设置为不大于电池设计容量的 1% 的值。 |
电池容量粒度 2 | 指示硬件在“上次完全充电容量”和“警告设计容量”之间可以检测到的剩余电量变化的最小量。 | 必须设置为不大于 75 毫瓦(约为 25 瓦时电池的 0.25%)的值。 电池设计容量的 (1/400)。 |
周期计数 | 指示电池周期计数。 必须设置为大于 0x0 的值。 | 不得设置为 0xFFFFFFFF。 |
度量准确度 | 指示电池容量度量的准确度。 | 必须设置为 95,000 或更高,表示准确率为 95% 或更高。 |
最大采样时间 | 两个连续 _BST 评估之间支持的最大采样时间,这将显示剩余容量的差异。 | 无特定要求。 |
最小采样时间 | 两个连续 _BST 评估之间支持的最小采样时间,这将显示剩余容量的差异。 | 无特定要求。 |
最大平均间隔 | 电池电量计支持的最大平均间隔(以毫秒为单位)。 | 无特定要求。 |
最小平均间隔 | 电池电量计支持的最小平均间隔(以毫秒为单位)。 | 无特定要求。 |
型号 | OEM 提供的电池型号。 | 不得为 NULL。 |
序列号 | OEM 提供的电池序列号。 | 不得为 NULL。 |
电池类型 | OEM 提供的电池类型信息。 | 无特定要求。 |
OEM 信息 | OEM 提供的信息。 | 无特定要求。 |
除了这些要求外,每当 _BIX 中的任何电池状态数据发生更改时,平台固件都必须在 ACPI 命名空间中的电池设备上生成中断和 Notify(0x81) 命令。 这些数据包括上次满充容量、设计容量和周期计数。 必须在平台检测到状态更改后立即执行此操作。
上次满充容量表示电池上次充满电后预期可以保持的估计能量。 Windows 假设此值仅在电池充电后更新。 因此,在电池放电时,上次满充容量值不得更改。 我们建议仅在电池充满电时更新此值。
电池实时状态信息的 ACPI 实现
ACPI 固件必须对每个电池实现 _BST 方法,以提供有关电池的实时状态信息,包括剩余容量和当前排放率。 下表扩展了 ACPI 规范第 10.2.2.6 条中所述的字段的定义,并列举了此信息的 Windows 特定要求。
主题 | 说明 | Windows 特定要求 |
---|---|---|
电池状态 | 指示电池当前是正在充电、正在放电还是处于关键状态。 | 仅当电池正在充电时,电池状态才必须报告正在充电。 同样,仅当电池正在放电时,电池状态才必须报告正在放电。 既不在充电也不在放电的电池不得报告这两种状态的任何位。 |
电池当前排放率 | 提供电池的当前排放率,以毫瓦为单位。 | 必须是大于 0x0 且小于 0xFFFFFFFF 的值。 准确度必须在 _BIX 的测量准确度值内。 |
电池剩余容量 | 提供剩余电池容量,以毫瓦时为单位。 | 必须大于 0x0 且小于 0xFFFFFFFF。 准确度必须在 _BIX 的测量准确度值内。 |
电池当前电压 | 指示电池端子两端的当前电压。 | 必须是介于 0x0 和 0xFFFFFFFF 之间的值,以毫伏为单位。 |
当 _BST 中的任何数据发生更改时,平台必须在 ACPI 命名空间中的电池设备上生成中断和 Notify(0x80)。 必须在平台检测到物理状态更改后立即执行此操作。 这包括充电位 (Bit0) 或放电位 (Bit1) 的电池状态字段中的任何更改。
此外,平台必须实现 _BTP 电池跳变点方法。 _BTP 允许 Windows 指定一个剩余容量阈值,超过该阈值时,平台将在 ACPI 命名空间中的电池设备上生成中断和 Notify(0x80)。 _BTP 方法使得 Windows 无需定期轮询电池。
Windows OS 特定的电池控制方法
ACPI 规范通过特定于设备的方法或 _DSM 控制方法为特定于设备和操作系统的控制方法提供了条件。 ACPI 规范的第 9.14.1 条介绍了 _DSM。
Windows 8 支持对电池控制方法设备使用以下 _DSM 方法。
热充电速率方向
主题 | 值 | 说明 |
---|---|---|
UUID | 4c2067e3-887d-475c-9720-4af1d3ed602e | 用于指示 Windows 电池控制方法驱动程序支持扩展的 GUID。 |
修订版 ID | 0 | 此功能的第一个修订版。 |
功能索引 | 0x1 | 设置电池电量限制。 |
参数 | 热限制 | 0 到 100 的整数值,表示热充电限制。 值 40% 表示电池应以最大速率的 40% 充电。 值 0% 表示应停止电池充电,直到再次调用此方法。 |
返回值 | None | 不适用 |
用户可维修的电池
主题 | 值 | 说明 |
---|---|---|
UUID | 4c2067e3-887d-475c-9720-4af1d3ed602e | 用于指示 Windows 电池控制方法驱动程序支持扩展的 GUID。 |
修订版 ID | 0 | 此功能的第一个修订版。 |
功能索引 | 0x2 | 指示此 _DSM 供 OSPM 确定电池设备是否可供用户维修。 |
参数 | 无 | 无需指定参数。 |
返回值 | 包含单个整数的包。 | 如果电池不能由用户维修且无法由最终用户更换,或者最终用户可以使用其他工具更换,则为 0x0。 如果最终用户可以在没有其他工具的情况下更换电池,则为 0x1。 |
需要充电监视器
主题 | 值 | 说明 |
---|---|---|
UUID | 4c2067e3-887d-475c-9720-4af1d3ed602e | 用于指示 Windows 电池控制方法驱动程序支持扩展的 GUID。 |
修订版 ID | 0 | 此功能的第一个修订版。 |
功能索引 | 0x3 | 指示此 _DSM 供 OSPM 确定电池控制方法是否需要定期监视器重置以保持高电流充电以及必须重置监视器的时间段。 |
参数 | 无 | 无需指定参数。 |
返回值 | 包含单个整数的包。 | 如果电池不需要监视器维修,则为 0x0。 包含 0x0000001e 和 0x12C 的值表示最大轮询间隔,以秒为单位。 所有其他值将被忽略并被视为 0x0,并且不需要监视器重置。 如果指定了有效的监视器间隔,则当 _BST 方法中的 BatteryState 值设置为 charging 时,Windows 将以不超过指定监视器值的间隔执行 _BST 方法。 不支持动态更新此值。 |
Windows 在桌面托盘应用程序中提供系统电池的详细视图。 每个电池及其当前状态都会列在 UI 中。 以下示例 UI 显示了两个电池。
Windows 显示电池的顺序可由固件指定。 为此,可以按照 ACPI 规范第 6.1.11 条中的定义使用插槽用户编号 (_SUN) 方法。 _SUN 方法返回一个表示电池唯一 ID 的整数。 Windows 基于 _SUN 方法的值按升序列出每个电池对象。
如果任一电池对象包含 _SUN 方法,则所有电池对象也必须提供 _SUN 方法。 Windows 不支持有些电池包含 _SUN 方法,而有些电池不包含此方法的情况。 如果未提供 _SUN 对象,Windows 将根据电池的完整设备实例路径对电池进行排序;此配置受支持,但不建议。