软件定义的电池

注意

某些信息与预发行的产品有关,该产品在商业发布之前可能会进行大幅修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

介绍

本主题的目的是介绍软件定义的电池(SDB),介绍 Windows SDB 体系结构,并详细介绍此功能的 Windows API 和 DDI 协定。

本主题首先介绍假设的两个电池系统的简单年龄均衡 SDB 算法。 随后是实现 SDB 算法所需的体系结构布局和 API 协定。

命名法

  • BattC - 电池类驱动程序

  • CAD - 收费仲裁驱动程序(CAD)是一个 Microsoft 驱动程序,用于在 USB 旧版、USB 类型 C 和无线充电源之间仲裁电源

  • 冷交换电池 - 无法从系统中删除的电池,而没有出现停电或总电源故障的风险

  • 周期计数 - 电池所经历的完整充电释放周期数,如 ACPI 规范中所述

  • 热交换电池 - 在系统运行时可以安全移除的电池,没有任何泄漏风险

  • HPMI - 硬件 Power Manager 接口

  • 不可热交换电池 - 系统中安装的一个或多个可冷交换电池和不可交换电池

  • 不可交换电池 - 未设计和打算由最终用户删除的电池

SDB 概述

可在以下位置找到有关软件定义电池的 MSR 研究论文: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf

本主题将重述本文中所述的选定想法,并向他们介绍在笔记本电脑和其他移动设备中产品化基于软件的电池年龄均衡功能。

想象一下两个电池系统。 其中一个电池是一个不可移动的电池,位于 SOC 旁边 - 让我们调用此 内部电池。 另一个电池是热交换电池,位于可移动键盘旁边 - 让我们调用此 外部电池

多电池系统

包含内部和外部电池的多电池系统示意图。

由于键盘在一段时间内是连接分离的,因此它强制这两个电池以不同的方式老化。 这通过采用 SDB 简单的年龄均衡算法,为电池和延长系统可用性期创造了一个范围。

简单年龄均衡 SDB 算法

该算法称为 简单的年龄均衡 ,因为它尝试平衡电池电量。 简单的年龄均衡算法会导致系统更倾向于释放已过期的电池。 一个电池,累积的循环计数不仅具有更高的容量来保持电源,而且在提供电源方面通常更高效。 从而延长系统可以在电池上维持的时间。

简单年龄均衡 SDB 算法

说明简单年龄均衡 SDB 算法的关系图。

简单年龄均衡算法背后的核心想法是,只需使用已累积最少电池周期计数的电池,如上述流程图中的决策框(2)所描述。 此示例中的假设系统允许独占使用内部或外部电池。 但是,并非所有系统都这样做。 其他系统可能不如灵活,也可能对电池的使用有电气限制。 在这种情况下,算法需要最佳年龄均衡尝试。 例如,请考虑以下事项。

  1. 无法完全维持外部电池电源的系统(可能是因为外部电池设计为仅补充电源)。 此系统可以通过在上述流程图中的进程块(A)中同时释放内部和外部电池来实现简单的年龄均衡算法。

  2. 每当存在时,都需要使用外部电池的系统(可能是由于与保持可移动键盘供电相关的额外电源绘制):此系统可以通过在上述流程图中同时释放进程块(B)中的内部和外部电池来实现简单的年龄均衡算法。

简单的年龄均衡算法只能在内部和外部电池中有足够的充电来运行系统时使用,决策框(1)在上述流程图中描述了这种情况检查。 例如(再次回到假设系统),如果外部电池没有充电,则没有年龄均衡电池的范围,决策盒(1)将导致“NO”分支。

除了内部或外部电池断电外,OEM 还可以自由选择简单的年龄均衡算法未生效的约束和条件。 例如,OEM 可以选择在以下情况下不执行任何年龄均衡:

  1. SOC/处理器在高性能模式下运行
  2. 系统在热不稳定

如果未使用简单的年龄均衡算法(由于上述一个或多个条件),逻辑将还原回到 OEM 的专有电池使用策略,如上述流程图中的流程图(3)所示。 如果 SDB 不受支持,则进程框 (3) 是逻辑 OEM 将生效。

调整用于热交换电池的 SDB 算法

简单的年龄均衡 SDB 算法尝试使用最健康的电池,尽管此策略非常适合改善长期电池使用时间,但它可能会严重影响系统的短期可用性,如以下方案所述。

在上述两个电池系统中,请考虑以下情况:

  1. 用户预期使用系统足够长的时间,直到内部和外部电池的充电耗尽。

  2. 与内部电池相比,外部电池已老化更多。

在此系统上练习简单的年龄均衡算法时,它将尝试首先耗尽存储在内部电池中的电量(基于上面列出的条件 #1 和 #2)。 当用户决定在一段时间后分离外部电池时,这将导致用户体验不佳,因为当外部电池被拆离后,可用的电池容量将显著减少,因为内部电池将用完。

在非 SDB 系统上,此问题通常不会发生,因为在大多数情况下,在内部电池投入使用之前,外部电池会耗尽。

因此,当出现上述情况时,需要有选择地禁用简单的年龄均衡算法。

总之,只要用户预期长时间使用系统并删除外部电池,最好禁用 SDB 算法,并还原使用 OEM 电池使用策略(这通常优先使用外部电池)。

Windows 计算电池可用性并生成“保留不可热交换电池”提示。 当 SDB 算法使用此提示时,如以下流程图中的决策框(X)所示。

适用于热交换电池的简单年龄均衡 SDB 算法

适用于热交换电池的简单年龄均衡 SDB 算法示意图。

在固件中实现 SDB 算法

本部分介绍在系统固件中实现的完整电池排放控制逻辑。 这基于上面所述的电池年龄均衡逻辑来演示现有多电池排放逻辑(标记为 (Y) 块)如何与它合并。

请注意,这不是 OEM 应如何实现 SDB 算法的处方,而是本部分中介绍的简单、假设的多电池设备的综合示例,用于说明 SDB 行为。

简单年龄均衡 SDB 算法的完整固件渗透

简单年龄均衡 SDB 算法的完整固件实现示意图。

Power Stack 体系结构

本部分介绍参与电源堆栈的所有组件的组件布局及其相互相对关系。

具有 HPMI 组件的电源堆栈体系结构示意图。

电池微型端口

电池微型端口接口保持不变。

SDB 接口不会影响或影响 OEM 依赖 ACPI/CmBatt 机制或开发其专有微型端口的愿望。

Windows 将所有IOCTL_BATTERY_标准版T_INFORMATION命令转发到系统上枚举的所有电池设备。

HPMI

硬件电源管理器接口(HPMI)是在电源堆栈中引入的新组件。

HPMI 是 OEM/设备制造商开发的并拥有的驱动程序。

HPMI 对基础硬件配置和状态有深入了解,并且有权访问系统固件。

若要实现 SDB 功能,HPMI 驱动程序将:

  1. 向 Windows 注册自身。
  2. 播发 SDB 支持。
  3. 使用 Windows 提供的 SDB 控件参数。

需要支持 SDB 的多电池系统才能实现 HPMI 接口。 HPMI API 协议是实现多个电池系统的新标准。

有计划,以便将来,HPMI 将更新,以支持其他充电、充电和收费管理功能。

驱动程序特征

系统上不应有多个 HPMI 驱动程序实例。 HPMI 可以作为用户模式或内核模式驱动程序实现。

安装

HPMI 可以显示为 ACPI 设备,也可以由 OEM 的任意一个其他 OEM 服务/驱动程序进行根枚举。

SDB 算法的实现

下图演示了当固件组件已托管大量电池控制逻辑时如何实现 SDB 算法的两个示例。

HPMI 和固件示例 SDB 算法堆栈实现示意图。

HPMI 实现 SDB 算法

HPMI 可以选择实现 SDB 算法,这需要 HPMI 将充电/释放提示转发到固件。

固件实现 SDB 算法

或者,HPMI 可以充当转发器,只需将 Windows 电池利用率提示转发到实现 SDB 算法的固件,如下图所示。 出于以下原因,建议使用此模型:

  1. 实现 SDB 算法所需的信息随时可用 - 无需将此信息传递给 HPMI

  2. SDB 算法是一种扩展,用于释放已在多电池系统中实现的逻辑

完整流程图模型,描述如何在固件中实现 SDB 算法中显示 SDB 算法。

接口定义

引入了适用于 HPMI 设备的新设备接口类 GUID。 HPMI 设备必须将其标识为实现 设备接口类。 有关详细信息,请参阅 WDK 中的“使用设备接口 ”。

Windows 使用设备到达通知来查询和配置 HPMI 设备。

//
// HPMI Device Interface Class.
//

// {DEDAE202-1D20-4C40-A6F3-1897E319D54F}
DEFINE_GUID(GUID_DEVINTERFACE_HPMI, 
            0xdedae202, 0x1d20, 0x4c40, 0xa6, 0xf3, 0x18, 0x97, 0xe3, 0x19, 0xd5, 0x4f);

HPMI 应能够服务多个同时进行的 IOCTL 调用。

请注意,设备索引应设置为零。

功能发现

IOCTL_HPMI_QUERY_CAPABILITIES用于发现 HPMI 支持的功能。 IOCTL_HPMI_QUERY_CAPABILITIES是必需的 IOCTL。

发现新的 HPMI 驱动程序实例后,Windows 会将此 IOCL 颁发给 HPMI。

//
// Query command sent to HPMI to query features supported by HPMI and Windows
// services requested by HPMI.
//
// This IOCTL may be issued multiple times, HPMI must respond with same 
// information in HPMI_QUERY_CAPABILITIES_RESPONSE, as a response to all
// subsequent IOCTL calls.
//

#define IOCTL_HPMI_QUERY_CAPABILITIES                     
    CTL_CODE(FILE_DEVICE_BATTERY, 0x200, 
             METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Command.
//

typedef struct _HPMI_QUERY_CAPABILITIES {

    //
    // Set to HPMI_QUERY_CAPABILITIES_VERSION_1.
    //

    ULONG Version;

} HPMI_QUERY_CAPABILITIES, *PHPMI_QUERY_CAPABILITIES;
#define HPMI_QUERY_CAPABILITIES_VERSION_1                   
    (1)
#define HPMI_QUERY_CAPABILITIES_SIZEOF_VERSION_1         
    sizeof(HPMI_QUERY_CAPABILITIES)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Response.
//

#define HPMI_REQUEST_SERVICE_NONE                           
    (0x00000000)    // No Windows services is requested.
#define HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS      
    (0x00000001)    // Battery utilization hints requested from Windows.

#define HPMI_CAPABILITY_NOT_SUPPORTED                       
    (0x00000000)    // HPMI supports no capabilities.
#define HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING        
    (0x00000001)    // OEM device specific age balancing SDB support
typedef struct _HPMI_QUERY_CAPABILITIES_RESPONSE {

    //
    // Set to HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1.
    //

    ULONG Version;

    //

命令格式

Windows 通过 HPMI_QUERY_CAPABILITIES发出此 IOCTL 问题。

版本设置为HPMI_QUERY_CAPABILITIES_VERSION_1。

响应格式

HPMI 必须返回STATUS_SUCCESS代码。

HPMI 通过在HPMI_QUERY_CAPABILITIES_RESPON标准版结构中设置以下值来响应:

  • 版本设置为HPMI_QUERY_CAPABILITIES_RESPON标准版_VERSION_1
  • RequestService 设置为HPMI_REQUEST_标准版RVICE_BATTERY_UTILIZATION_HINTS,以确保 HPMI 驱动程序接收IOCTL_HPMI_BATTERY_UTILIZATION_HINT
  • SdbCapabilities 设置为HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING以指示电池电量均衡支持。

电池利用率

Windows 问题 IOCTL_HPMI_BATTERY_UTILIZATION_HINT HPMI 以提供更新的电池利用率提示。 IOCTL_HPMI_BATTERY_UTILIZATION_HINT是必需的 IOCTL。

HPMI 可以利用 PreserveNonHotSwappableBatteries 提示,如改编 SDB 算法中所述 ,用于热交换电池 以节省内部电池。

//
// Set command sent to HPMI to provide battery utilization hints.
//
// This IOCTL may be issued multiple times if HPMI requests
// HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS service.
//

#define IOCTL_HPMI_BATTERY_UTILIZATION_HINT                 
    CTL_CODE(FILE_DEVICE_BATTERY, 0x201, 
             METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

//
// Boolean type value.
//

typedef enum _HPMI_HINT_BOOL {
    // No data is available.
    HpmiBoolUnavailable = 0,

    // Condition is asserted to be false.
    HpmiBoolFalse,

    // Condition is asserted to be true.
    HpmiBoolTrue,

    // Value not used.
    HpmiBoolMax

} HPMI_HINT_BOOL, *PHPMI_HINT_BOOL;
//
// IOCTL_HPMI_BATTERY_UTILIZATION_HINT - Command.
//

typedef struct _HPMI_BATTERY_UTILIZATION_HINT {

    //
    // Set to HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
    //

    ULONG Version;

    //
    // This hint indicates if the OEM Battery Manager should attempt to save as
    // much charge as possible in the non-hot swappable batteries (i.e. the
    // batteries are generally referred to as "internal batteries", these
    // batteries cannot be removed while system is operational).
    //
    // Interpretation of values:
    //  - HpmiBoolUnavailable:
    //      Battery utilization hint is unavailable at the moment.
    //  - HpmiBoolFalse:
    //      It is not necessary to preserve charge in the internal batteries
    //      at the moment.
    //  - HpmiBoolTrue:
    //      Every attempt should be made to save as much charge as possible in
    //      the internal batteries.
    //

    HPMI_HINT_BOOL PreserveNonHotSwappableBatteries;

} HPMI_BATTERY_UTILIZATION_HINT, *PHPMI_BATTERY_UTILIZATION_HINT;
#define HPMI_BATTERY_UTILIZATION_HINT_VERSION_1              
    (1)
#define HPMI_BATTERY_UTILIZATION_HINT_SIZEOF_VERSION_1       
    sizeof(HPMI_BATTERY_UTILIZATION_HINT)

命令格式

Windows 通过 HPMI_BATTERY_UTILIZATION_HINT 发出此 IOCTL 问题。 版本设置为 HPMI_BATTERY_UTILIZATION_HINT_VERSION_1

HPMI_BATTERY_UTILIZATION_HINT

PreserveNonHotSwappableBatteries 设置为以下值之一:

  • HpmiBoolUnavailable:设置何时无法提供电池利用率提示。 作为回应,HPMI/Fimware 通常应该采取事实上的排放政策。
  • HpmiBoolFalse:在 Windows 确定电池电量均衡的适时时间进行设置。
  • HpmiBoolTrue:在 Windows 确定需要节省内部电池中存储的能量时设置。

响应格式

HPMI 必须返回STATUS_SUCCESS代码。

响应中未返回任何数据。

示例接口协定

有关此处所述的接口定义的完整(示例)API 协定,请参阅 HMPI.h

注意

本文档的内容可能会更改,而不通知。