軟體定義的電池
注意
某些資訊與發行前發行的產品有關,在正式發行前可能會大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
簡介
本主題的目標是介紹軟體定義電池 (SDB),描述 Windows SDB 架構,並詳細說明此功能的 Windows API 和 DDI 合約。
本主題首先介紹假設兩個電池系統的簡單年齡平衡 SDB 演算法。 接著是實作 SDB 演算法所需的架構配置和 API 合約。
命名
BattC - 電池類別驅動程式
CAD - 收費仲裁驅動程式 (CAD) 是 Microsoft 驅動程式,可仲裁 USB 舊版、USB Type-C 和無線充電來源之間的電源
冷交換電池 - 無法從系統移除的電池,沒有故障或總電源故障的風險
迴圈計數 - 電池所經歷的完整充電迴圈數目,如 ACPI 規格中所述
熱交換電池 - 在系統運作時可以安全地移除的電池,沒有任何棕色風險
HPMI - 硬體電源管理員介面
非熱交換電池 - 安裝在系統中的一或多個可冷交換和不可交換電池
不可交換的電池 - 未設計且打算由終端使用者移除的電池
SDB 概觀
您可以在這裡找到軟體定義電池的 MSR 研究論文: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf。
本主題會重述本文中所述的選取想法,並向他們呈現在膝上型計算機和其他行動裝置中將軟體電池使用時間平衡功能產品化的觀點。
想像一下兩個電池系統。 其中一個電池是非卸除式電池,位於SOC旁邊– 讓我們呼叫這個 內部電池。 另一個電池是熱交換電池,位於卸載式鍵盤旁邊 – 讓我們呼叫這個 外部電池。
多電池系統
由於鍵盤在一段時間內被連接分離,它迫使兩個電池以不同的方式老化。 這會藉由採用 SDB 簡單的年齡平衡演算法來建立年齡平衡電池和延長系統可用性期間的範圍。
簡單年齡平衡 SDB 演算法
演算法稱為 簡單年齡平衡 ,因為它會嘗試平衡電池使用時間。 簡單的年齡平衡演算法會導致系統偏好將已過時的電池放出。 電池,累積的迴圈計數不僅具有更高的容量來容納電源,而且在提供電力方面通常更有效率。 從而延長系統可以在電池上維持的時間。
簡單年齡平衡 SDB 演算法
簡單年齡平衡演算法背後的核心概念是只使用累積最少電池週期計數的電池,如上述流程圖中的決策方塊 (2) 所描述。 此範例中的假設系統允許獨佔使用內部或外部電池。 不過,對於所有系統來說,這可能不是真的。 其他系統可能沒有彈性,也可能對電池的使用有電力限制。 在這種情況下,演算法會預期年齡平衡的最佳嘗試。 例如,請考慮下列各項。
無法完全維持外部電池電源的系統(可能是因為外部電池的設計只是補充電源)。 此系統可以藉由同時在上述流程圖中的進程區塊(A)中卸出內部和外部電池,來實作簡單的年齡平衡演算法。
每當有外部電池時,都需要使用外部電池的系統(可能是因為與保持卸除式鍵盤電源相關的額外電源消耗):此系統可以同時在流程圖中同時卸除進程區塊 (B) 中的內部和外部電池,來實作簡單的年齡平衡演算法。
簡單的年齡平衡演算法只有在內部和外部電池中有足夠的充電才能執行系統時使用,決策框(1)描述上述流程圖中的此條件檢查。 例如,如果外部電池沒有充電,則(再次回到假設系統),沒有年齡平衡電池的範圍,而決策箱(1)將導致“NO”分支。
除了內部或外部電池失電之外,OEM 可以自由選擇簡單年齡平衡演算法未生效的條件約束和條件。 例如,OEM 可以選擇在下列情況下不執行任何年齡平衡:
- SOC/處理器以高效能模式執行
- 系統熱不穩定
當簡單的年齡平衡演算法未投入使用時(因為上述一或多個條件),邏輯會還原回 OEM 的專屬電池使用原則,如上述流程圖中的進程方塊 (3) 所描述。 進程方塊 (3) 是不支援 SDB 時,OEM 會生效的邏輯。
調整 SDB 演算法以搭配熱交換電池使用
簡單年齡平衡 SDB 演算法會嘗試使用最健康的電池,雖然此策略很適合改善長期電池使用時間,但它可能會嚴重影響系統的短期可用性,如下列案例所述。
在上述的兩個電池系統中,請考慮下列情況:
使用者預期使用系統的時間足夠長,直到內部和外部電池充電都用盡為止。
相較於內部電池,外部電池已過時。
在這個系統上練習簡單的年齡平衡演算法時,它會嘗試先耗盡儲存在內部電池中的充電(根據條件 #1 和上面所列 #2)。 當使用者決定在一段時間后卸離外部電池時,會導致用戶體驗不佳,因為一旦外部電池中斷連接,因為內部電池會用完,電池容量會大幅減少。
在非 SDB 系統上,此問題通常不會發生,因為在大部分情況下,外部電池會在內部電池投入使用之前耗盡。
因此,當上述案例可能發生時,建議您選擇性地停用簡單的年齡平衡演算法。
總結來說,每當使用者預期在移除外部電池的情況下長時間使用系統時,最好停用SDB演算法,並使用OEM電池使用原則還原為使用OEM電池使用原則(通常優先使用外部電池)。
Windows 會計算電池可用性,並產生「保留非熱交換電池」提示。 當 SDB 演算法取用此提示時,如下列流程圖中的決策方塊 (X) 所描述。
適用於熱交換電池的簡單年齡平衡 SDB 演算法
在韌體中實作 SDB 演算法
本節描述系統韌體中實作的完整電池排放控制邏輯。 這以上述電池壽命平衡邏輯為基礎,以示範現有多電池排放邏輯(以 (Y) 區塊標示)如何與它結合。
請注意,這不是 OEM 應如何實作 SDB 演算法的處方,而是本節所描述的簡單、假設、多電池裝置的完整範例,用來說明 SDB 行為。
簡單年齡平衡 SDB 演算法的完整韌體實作
Power Stack 架構
本節說明參與電源堆疊之所有元件的元件配置,以及其彼此的相對關聯性。
電池迷你埠
電池迷你埠介面維持不變。
SDB 介面不會影響或影響 OEM 依賴 ACPI/CmBatt 機制或開發其專屬迷你埠的願望。
Windows 會將所有 IOCTL_BATTERY_SET_INFORMATION 命令轉送至系統上列舉的所有電池裝置。
HPMI
硬體電源管理員介面 (HPMI) 是電源堆疊中引進的新元件。
HPMI 是 OEM/裝置製造商所開發的驅動程式。
HPMI 對基礎硬體組態和狀態有密切瞭解,而且可以存取系統韌體。
若要實作 SDB 功能,HPMI 驅動程式會:
- 向 Windows 註冊本身。
- 公告 SDB 支援。
- 取用 Windows 所提供的 SDB 控制項參數。
需要支援 SDB 的多電池系統,才能繼續實作 HPMI 介面。 HPMI API 通訊協定是實作多個電池系統的新標準。
未來將更新 HPMI,以支援其他充電、卸除和收費管理功能。
驅動程式特性
系統上不應有一個以上的 HPMI 驅動程式實例。 HPMI 可以實作為使用者模式或核心模式驅動程式。
安裝
HPMI 可以顯示為 ACPI 裝置,或由 OEM 的其中一個其他 OEM 服務/驅動程式列舉根目錄。
SDB 演算法的實作
下圖說明當韌體元件已經裝載大量電池控制邏輯時,SDB 演算法如何實作的兩個範例。
HPMI 實作 SDB 演算法
HPMI 可以選擇實作 SDB 演算法,這需要 HPMI 將充電/卸除提示轉送至韌體。
韌體實作 SDB 演算法
或者,HPMI 可作為轉寄站,並直接將 Windows 電池使用率提示轉送至實作 SDB 演算法的韌體,如下圖所示。 基於下列原因,建議使用此模型:
實作 SDB 演算法所需的資訊已可供使用 – 不需要將此資訊傳遞至 HPMI
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_RESPONSE在 結構中 設定下列值來 回應:
- 版本設定為 HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1
- RequestService 設定為 HPMI_REQUEST_SERVICE_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。
PreserveNonHotSwappableBatteries 會設定為下列其中一個值:
- HpmiBoolUnavailable:在沒有提供電池使用率提示時設定。 作為回應,HPMI/Fimware 通常應該採取事實上的卸除政策。
- HpmiBoolFalse:設定 Windows 何時決定電池使用時間平衡發生的時間。
- HpmiBoolTrue:設定 Windows 何時決定需要節省儲存在內部電池中的能源。
回應格式
HPMI 必須傳回STATUS_SUCCESS碼。
回應中不會傳回任何數據。
範例介面合約
如需這裡所述的介面定義,請參閱 HMPI.h 以取得完整的(範例)API 合約。
注意
本文件的內容可能會變更而不通知。