Software-definierter Akku
Hinweis
Einige Informationen beziehen sich auf Vorabversionen, die vor der kommerziellen Freigabe grundlegend geändert werden können. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Einführung
Ziel dieses Themas ist es, software-definierte Akkus (Software Defined Batteries, SDB) vorzustellen, die Windows SDB-Architektur zu beschreiben und die Windows API und DDI-Verträge für diese Funktion zu erläutern.
Das Thema beginnt mit einer Einführung in den Simple Age Balancing SDB-Algorithmus für ein hypothetisches System mit zwei Akkus. Es folgen der Aufbau der Architektur und der API-Vertrag, der für die Implementierung des SDB-Algorithmus erforderlich ist.
Benennung
BattC – Treiber für die Akkuklasse
CAD – Der Charge Arbitration Driver (CAD) ist ein Microsoft-Treiber, der die Stromversorgung zwischen veralteten USB-, USB Typ-C- und drahtlosen Ladequellen vermittelt.
Cold Swappable-Akkus – Akkus, die nicht aus dem System entfernt werden können, ohne dass die Gefahr eines Stromausfalls besteht.
Cycle Count – Die Anzahl der vollständigen Lade-/Entladezyklen, die der Akku durchlaufen hat, wie in der ACPI-Spezifikation beschrieben
Hot-Swap-Akkus – Akkus, die während des Betriebs sicher entfernt werden können, ohne dass die Gefahr eines Stromausfalls besteht
HPMI – Hardware Power Manager Schnittstelle
Non-Hot-Swappable-Akkus – Eine oder mehrere Cold-Swappable- und Non-Swappable-Akkus, die im System installiert sind
Non-Swappable-Akkus – Akkus, die nicht dafür konzipiert und gedacht sind, von Benutzenden entfernt zu werden
SDB-Übersicht
Die Untersuchung von MSR über software-definierte Akkus finden Sie hier: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf.
Dieses Thema greift ausgewählte Ideen aus diesem Papier auf und präsentiert sie im Hinblick auf die Einführung einer softwarebasierten Funktion zum Ausgleich des Akkualters in Laptops und anderen mobilen Geräten.
Stellen Sie sich ein System mit zwei Akkus vor. Der eine Akku ist ein nicht entfernbarer Akku, der sich neben dem SOC befindet – nennen wir ihn interner Akku. Der andere Akku ist ein im laufenden Betrieb austauschbarer Akku, der sich neben einer abnehmbaren Tastatur befindet – nennen wir ihn externer Akku.
Ein Multi-Akku-System
Da die Tastatur über einen bestimmten Zeitraum hinweg angebracht und abgenommen wird, altern die beiden Akkus unterschiedlich. Dies schafft einen Bereich für den Altersausgleich der Akkus und die Verlängerung der Nutzungsdauer des Systems, indem der Simple Age Balancing SDB-Algorithmus verwendet wird.
Simple Age Balancing SDB-Algorithmus
Der Algorithmus wird einfacher Altersausgleich genannt, weil er versucht, das Alter des Akkus auszugleichen. Der Simple Age Balancing-Algorithmus veranlasst das System, den Akku zu entladen, der am wenigsten gealtert ist. Ein Akku mit einer geringeren Anzahl von Zyklen hat nicht nur eine höhere Speicherkapazität, sondern ist auch allgemein effizienter bei der Energiebereitstellung. Dadurch verlängert sich die Zeit, die das System mit einem Akku auskommen kann.
Simple Age Balancing SDB-Algorithmus
Der Kerngedanke hinter dem Simple Age Balancing-Algorithmus besteht darin, einfach den Akku zu verwenden, der die wenigsten Akkuzyklen aufweist, wie in der Entscheidungsbox (2) im obigen Flussdiagramm dargestellt. Das hypothetische System in diesem Beispiel lässt die ausschließliche Verwendung von internen oder externen Akkus zu. Dies trifft jedoch nicht auf alle Systeme zu. Andere Systeme sind möglicherweise nicht so flexibel oder haben elektrische Beschränkungen für die Verwendung von Akkus. In solchen Fällen erwartet der Algorithmus einen bestmöglichen Versuch des Altersausgleichs. Nehmen wir zum Beispiel Folgendes an.
Ein System, das nicht in der Lage ist, sich ausschließlich über den externen Akku zu versorgen (z. B. weil der externe Akku nur als zusätzliche Energiequelle vorgesehen ist). Dieses System kann den Simple Age Balancing-Algorithmus implementieren, indem es gleichzeitig den internen und den externen Akku im Prozessblock (A) des obigen Flussdiagramms entlädt.
Ein System, das verlangt, dass der externe Akku immer dann verwendet wird, wenn er vorhanden ist (z. B. wegen des zusätzlichen Stromverbrauchs, der durch die Stromversorgung der abnehmbaren Tastatur entsteht): Dieses System kann den Simple Age Balancing-Algorithmus implementieren, indem es gleichzeitig den internen und den externen Akku im Prozessblock (B) des obigen Flussdiagramms entlädt.
Der Simple Age Balancing-Algorithmus kann nur dann zum Einsatz kommen, wenn die internen und externen Akkus ausreichend geladen sind, um das System auszuführen. Das Entscheidungsfeld (1) zeigt, wie diese Bedingung im obigen Flussdiagramm überprüft werden kann. Wenn z. B. der externe Akku keine Ladung enthält, gibt es keinen Bereich für den Altersausgleich der Akkus und das Entscheidungsfeld (1) würde zu einem „NO“ Branch führen.
Der OEM kann frei entscheiden, welche Einschränkungen und Bedingungen gelten sollen, wenn der Simple Age Balancing-Algorithmus nicht zum Einsatz kommt, außer wenn entweder die internen oder die externen Akkus keinen Strom mehr haben. Zum Beispiel kann der OEM entscheiden, keinen Altersausgleich durchzuführen, wenn:
- der SOC/Prozessor im High Performance Modus ausgeführt wird
- das System thermisch instabil ist
Wenn der Simple Age Balancing-Algorithmus nicht zum Einsatz kommt (aufgrund einer oder mehrerer der oben beschriebenen Bedingungen), kehrt die Logik zur OEM-eigenen Richtlinie für die Nutzung des Akkus zurück, wie in Prozessfeld (3) im obigen Flussdiagramm dargestellt. Prozessfeld (3) ist die Logik, die OEM in Kraft gesetzt hätte, wenn SDB nicht unterstützt worden wäre.
Anpassung des SDB-Algorithmus für die Verwendung mit Hot-Swappable-Akkus
Der Simple Age Balancing SDB-Algorithmus versucht, den Akku zu verwenden, der am gesündesten ist. Obwohl diese Strategie gut funktioniert, um die langfristige Lebensdauer des Akkus zu verlängern, kann sie die kurzfristige Nutzbarkeit des Systems stark beeinträchtigen, wie im folgenden Szenario beschrieben.
Stellen Sie sich bei dem oben beschriebenen System mit zwei Akkus die folgende Situation vor:
Der/die Benutzer*in verwendet das System so lange, bis die Ladung sowohl des internen als auch des externen Akkus erschöpft ist.
Der externe Akku ist im Vergleich zum internen Akku stärker gealtert.
Wenn der Simple Age Balancing-Algorithmus auf dieses System angewendet wird, wird er versuchen, zuerst die im internen Akku gespeicherte Ladung zu verbrauchen (basierend auf den oben genannten Bedingungen #1 und #2). Wenn der/die Benutzer*in beschließt, den externen Akku nach einer Weile zu entfernen, würde dies zu einer schlechten User-Experience führen, da die für die Nutzung zur Verfügung stehende Akkukapazität nach dem Entfernen des externen Akkus drastisch abnehmen würde, da der interne Akku aufgebraucht wäre.
Auf einem Nicht-SDB-System tritt dieses Problem allgemein nicht auf, da in den meisten Fällen der externe Akku erschöpft ist, bevor der interne Akku in Betrieb genommen wird.
Es ist daher wünschenswert, den Simple Age Balancing-Algorithmus selektiv zu deaktivieren, wenn das obige Szenario wahrscheinlich eintritt.
Zusammenfassend lässt sich sagen, dass es immer dann, wenn der/die Benutzer*in das System voraussichtlich über einen längeren Zeitraum mit entnommenem externen Akku verwenden wird, optimal ist, den SDB-Algorithmus zu deaktivieren und zur Richtlinie für die Verwendung des OEM-Akkus zurückzukehren (die allgemein die Verwendung des externen Akkus zuerst bevorzugt).
Windows berechnet die Verfügbarkeit des Akkus und gibt den Hinweis „Nicht austauschbare Akkus schützen“ aus. Wenn dieser Hinweis vom SDB-Algorithmus verbraucht wird, wie durch das Entscheidungsfeld (X) im folgenden Flow-Diagramm dargestellt.
Simple Age Balancing SDB-Algorithmus angepasst für Hot-Swappable-Akkus
Implementierung des SDB-Algorithmus in der Firmware
In diesem Abschnitt wird die vollständige Logik zur Steuerung der Akku-Entladung dargestellt, die in der System-Firmware implementiert ist. Er erstellt die oben beschriebene Logik für den Altersausgleich der Akkus, um zu zeigen, wie eine bestehende Logik für die Entladung mehrerer Akkus (markiert im Block (Y)) in diese Logik integriert werden kann.
Beachten Sie, dass es sich hierbei nicht um eine Vorgabe handelt, wie der SDB-Algorithmus von den OEMs implementiert werden sollte, sondern vielmehr um ein umfassendes Beispiel für das in diesem Abschnitt beschriebene vereinfachte, hypothetische Gerät mit mehreren Akkus, das zur Veranschaulichung des SDB-Verhaltens dient.
Vollständige Firmware-Implementierung des Simple Age Balancing SDB-Algorithmus
Power-Stack-Architektur
Dieser Abschnitt beschreibt das Komponentenlayout für alle am Power-Stack beteiligten Komponenten und ihre relative Beziehung zueinander.
Akku-Miniport
Die Schnittstellen des Akku-Miniports bleiben unverändert.
Die SDB-Schnittstellen haben keinen Einfluss auf den Wunsch der OEMs, sich auf den ACPI/CmBatt-Mechanismus zu verlassen oder ihren eigenen Miniport zu entwickeln.
Windows leitet alle IOCTL_BATTERY_SET_INFORMATION-Befehle an alle auf dem System aufgeführten Akku-Geräte weiter.
HPMI
Das Hardware Power Manager Interface (HPMI) ist eine neue Komponente, die in den Power-Stack eingeführt wurde.
HPMI ist ein Treiber, der vom OEM/Gerätehersteller entwickelt wurde und ihm gehört.
HPMI kennt die zugrunde liegende Hardwarekonfiguration und den Status und hat Zugriff auf die Systemfirmware.
Zur Implementierung der SDB Funktion führt der HPMI-Treiber folgende Schritte durch:
- Sich bei Windows registrieren.
- SDB-Support ankündigen.
- Die von Windows bereitgestellten SDB-Steuerungsparameter verwenden.
Multi-Akku-Systeme, die SDB unterstützen, müssen in Zukunft die HPMI-Schnittstelle implementieren. Das HPMI-API-Protokoll ist ein neuer Standard für die Implementierung von Systemen mit mehreren Akkus.
Es ist geplant, dass HPMI in Zukunft aktualisiert wird, um weitere Funktionen für das Laden, Entladen und die Ladeverwaltung zu unterstützen.
Merkmale des Treibers
Es sollte nicht mehr als eine Instanz des HPMI-Treibers auf einem System vorhanden sein. HPMI kann entweder als User-Modus- oder als Kernel-Modus-Treiber implementiert werden.
Installation
HPMI kann entweder als ACPI-Gerät manifestiert oder als Root-Treiber von einem der anderen OEM-Dienste/Treiber aufgelistet werden, je nach Ermessen des OEMs.
Implementierung des SDB-Algorithmus
Das folgende Diagramm zeigt anhand von zwei Beispielen, wie der SDB-Algorithmus implementiert werden kann, wenn die Firmware-Komponente bereits einen Großteil der Logik zur Steuerung des Akkus gehostet hat.
HPMI implementiert SDB-Algorithmus
HPMI kann sich dafür entscheiden, den SDB-Algorithmus zu implementieren. In diesem Fall muss HPMI Hinweise zum Laden/Entladen an die Firmware weiterleiten.
Firmware implementiert SDB-Algorithmus
Alternativ kann HPMI auch als Forwarder fungieren und die Windows-Hinweise zur Nutzung des Akkus einfach an die Firmware weiterleiten, in der der SDB-Algorithmus implementiert ist, wie in der obigen Abbildung dargestellt. Die Verwendung dieses Modells wird aus den folgenden Gründen empfohlen:
Die für die Implementierung des SDB-Algorithmus benötigten Informationen sind sofort verfügbar – es besteht keine Notwendigkeit, diese Informationen an HPMI weiterzugeben
Der SDB-Algorithmus ist eine Erweiterung der Entladelogik, die bereits in den Multi-Akku-Systemen implementiert ist.
Ein vollständiges Flow-Chart-Modell, das zeigt, wie der SDB-Algorithmus implementiert wird, finden Sie in Implementierung des SDB-Algorithmus in Firmware.
Schnittstellen-Definitionen
Es wurde eine neue Geräte-Schnittstellenklasse-GUID für HPMI-Geräte eingeführt. Das HPMI-Gerät muss sich selbst als Implementierung der Geräteschnittstellenklassen identifizieren. Weitere Informationen finden Sie unter Geräteschnittstellen verwenden im WDK.
Windows verwendet die Benachrichtigung über die Verfügbarkeit des Geräts, um das HPMI-Gerät abzufragen und zu konfigurieren.
//
// 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 sollte in der Lage sein, mehrere gleichzeitige IOCTL-Aufrufe zu bedienen.
Beachten Sie, dass der Geräteindex auf Null festgelegt werden sollte.
Feature-Ermittlung
IOCTL_HPMI_QUERY_CAPABILITIES wird verwendet, um von HPMI unterstützte Funktionen zu ermitteln. IOCTL_HPMI_QUERY_CAPABILITIES ist eine Anforderung an die IOCTL.
Windows gibt diese IOCL einmal an HPMI aus, nachdem eine neue HPMI-Treiberinstanz entdeckt wurde.
//
// 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;
//
Befehlsformat
Windows gibt diese IOCTL mit HPMI_QUERY_CAPABILITIES aus.
Die Version wird auf HPMI_QUERY_CAPABILITIES_VERSION_1 festgelegt.
Antwortformat
HPMI muss den Code STATUS_SUCCESS zurückgeben.
HPMI reagiert, indem es die folgenden Werte in der HPMI_QUERY_CAPABILITIES_RESPONSE-Struktur festlegt:
- Version ist festgelegt auf HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1
- RequestService ist auf HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS festgelegt, um sicherzustellen, dass der HPMI-Treiber IOCTL_HPMI_BATTERY_UTILIZATION_HINT erhält.
- SdbCapabilities ist auf HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING festgelegt, um die Unterstützung für den Altersausgleich des Akkus anzuzeigen.
Akku-Auslastung
Windows gibt IOCTL_HPMI_BATTERY_UTILIZATION_HINT an HPMI aus, um die aktuellsten Hinweise zur Nutzung des Akkus bereitzustellen. IOCTL_HPMI_BATTERY_UTILIZATION_HINT ist eine Anforderung an die IOCTL.
HPMI kann den PreserveNonHotSwappableBatteries-Hint verwenden, wie in Anpassen des SDB-Algorithmus für die Verwendung mit Hot-Swappable-Akkus beschrieben, um die internen Akkus zu schonen.
//
// 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)
Befehlsformat
Windows gibt diese IOCTL mit HPMI_BATTERY_UTILIZATION_HINT aus. Die Version ist festgelegt auf HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
PreserveNonHotSwappableBatteries ist auf einen der folgenden Werte festgelegt:
- HpmiBoolUnavailable: Wird festgelegt, wenn kein Hinweis auf die Nutzung des Akkus gegeben werden kann. Als Reaktion darauf sollte HPMI/Fimware allgemein die Richtlinien zur Entladung einschalten.
- HpmiBoolFalse: Wird festgelegt, wenn Windows einen günstigen Zeitpunkt für den Ausgleich des Akku-Alters bestimmt.
- HpmiBoolTrue: Wird festgelegt, wenn Windows die Notwendigkeit feststellt, die in den internen Akkus gespeicherte Energie zu sparen.
Antwortformat
HPMI muss den Code STATUS_SUCCESS zurückgeben.
In der Antwort werden keine Daten zurückgegeben.
Beispiel eines Schnittstellenvertrags
In HMPI.h finden Sie einen vollständigen (Beispiel-)API-Vertrag für die hier beschriebenen Schnittstellendefinitionen.
Hinweis
Der Inhalt dieses Dokuments kann ohne vorherige Ankündigung geändert werden.