Batterie définie par logiciel
Remarque
Certaines informations portent sur la préversion du produit, qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.
Introduction
L’objectif de cette rubrique est la description des batteries définies par logiciel (SDB), de l’architecture SDB de Windows et des contrats d’API et DDI de Windows pour cette fonctionnalité.
La rubrique commence par la présentation de l’algorithme SDB d’équilibrage de l’âge simple pour un système hypothétique de deux batteries. Viennent ensuite la disposition de l’architecture et le contrat d’API nécessaire pour implémenter l’algorithme SDB.
Nomenclature
BattC - Pilote de classe de batterie
CAD - Le pilote d’arbitrage de la charge (CAD) est un pilote Microsoft qui arbitre la puissance entre l’USB Hérité, l’USB Type-C et les sources de recharge sans fil
Batteries permutables à froid - Batteries qui ne peuvent pas être retirées du système sans risque de baisses de tension ou de pannes totales d’alimentation
Nombre de cycles - Nombre de cycles complets de charge-décharge effectués par la batterie, tel que décrit dans la spécification ACPI.
Batteries permutables à chaud - Batteries qui peuvent être retirées en toute sécurité pendant que le système fonctionne, sans risque de baisses de tension
HPMI - Interface de gestion de l’alimentation matérielle
Batteries non permutables à chaud - Une ou plusieurs batteries permutables et non permutables à froid installées dans le système
Batteries non permutables - Batteries qui ne sont pas conçues et destinées à être retirées par l’utilisateur final
Vue d’ensemble SDB
Le document de recherche MSR sur les batteries définies par logiciel est disponible ici : https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf.
Cette rubrique reprend certaines idées décrites dans ce document et les présente en vue de la production de la fonctionnalité d’équilibrage de l’âge de la batterie basée sur un logiciel dans les ordinateurs portables et autres appareils mobiles.
Imaginez un système de deux batteries. Avec une batterie non amovible, située à côté du SOC, que nous appellerons batterie interne. L’autre batterie est la batterie permutable à chaud, située à côté d’un clavier amovible, nous l’appellerons batterie externe.
Un système à plusieurs batteries
Comme le clavier est installé/désinstallé pendant une période de temps, les deux batteries vieillissent différemment. Ce qui ouvre la possibilité d’équilibrer l’âge des batteries et de prolonger la période d’utilisation du système en employant l’algorithme SDB d’équilibrage d’âge simple.
Algorithme SDB d’équilibrage d’âge simple
L’algorithme est appelé équilibrage d’âge simple, car il vise à équilibrer l’âge de la batterie. L’algorithme d’équilibrage d’âge simple permet au système de préférer décharger la batterie qui a l’âge le moins élevé. Une batterie qui a accumulé moins de cycles a non seulement une plus grande capacité de stockage de l’énergie, elle est aussi généralement plus efficace pour la délivrer. Ainsi, la durée pendant laquelle le système peut être alimenté par des batteries est prolongée.
Algorithme SDB d’équilibrage d’âge simple
L’idée de base de l’algorithme d’équilibrage d’âge simple est d’utiliser simplement la batterie qui a accumulé le moins de cycles de batterie, comme le montre la zone de décision (2) dans l’organigramme ci-dessus. Le système hypothétique de cet exemple permet l’utilisation exclusive de batteries internes ou externes. Toutefois, cela peut ne pas être vrai pour tous les systèmes. Certains d’entre eux peuvent ne pas être aussi flexibles ou présenter des contraintes électriques concernant l’utilisation de batteries. Dans ce cas, l’algorithme s’attend à une meilleure tentative d’équilibrage de l’âge. Examinons les exemples suivants :
Un système incapable de s’alimenter exclusivement sur la batterie externe ( peut être parce que la batterie externe est conçue comme une source d’alimentation complémentaire). Ce système peut implémenter l’algorithme d’équilibrage d’âge simple en déchargeant simultanément les batteries internes et externes dans le bloc de processus (A) dans l’organigramme ci-dessus.
Un système qui nécessite l’utilisation de la batterie externe chaque fois qu’elle est présente (peut-être en raison de la consommation d’énergie supplémentaire associée au maintien du clavier amovible sous tension) : ce système peut implémenter l’algorithme d’équilibrage d’âge simple en déchargeant simultanément les batteries interne et externe dans le bloc de processus (B) de l’organigramme ci-dessus.
L’algorithme d’équilibrage d’âge simple ne peut être utilisé que lorsque la charge des batteries internes et externes est suffisante pour faire fonctionner le système ; la zone de décision (1) illustre cette vérification des conditions dans l’organigramme ci-dessus. Par exemple (pour revenir au système hypothétique), si la batterie externe n’est pas chargée, il n’est pas possible d’équilibrer les batteries en fonction de leur âge et la zone de décision (1) aboutira à la branche « NON ».
L’OEM est libre de choisir les contraintes et les conditions lorsque l’algorithme d’équilibrage d’âge simple n’est pas appliqué, notamment lorsque les batteries internes ou externes sont hors tension. Par exemple, l’OEM peut choisir de ne pas effectuer d’équilibrage d’âge dans les cas suivants :
- Le SOC/processeur s’exécute en mode haute performance
- Le système est thermiquement instable
Lorsque l’algorithme d’équilibrage d’âge simple n’est pas utilisé (en raison d’une ou de plusieurs conditions décrites ci-dessus), la logique revient à la stratégie d’utilisation de batterie propriétaire de l’OEM, comme illustré par la zone de processus (3) dans l’organigramme ci-dessus. La zone de processus (3) correspond à la logique que l’OEM aurait appliquée si SDB n’était pas été pris en charge.
Adaptation de l’algorithme SDB pour son utilisation avec des batteries permutables à chaud
L’algorithme SDB d’équilibrage d’âge simple tente d’utiliser la batterie la plus saine. Bien que cette stratégie fonctionne bien pour améliorer la durée de vie de la batterie à long terme, elle peut avoir un impact néfaste sur l’utilisation à court terme du système, comme décrit dans le scénario suivant.
Dans le système à deux batterie décrits ci-dessus, considérons la situation suivante :
L’utilisateur est censé utiliser le système suffisamment longtemps pour épuiser la charge des batteries internes et externes.
La batterie externe a vieilli davantage que la batterie interne.
Lorsque l’algorithme simple d’équilibrage de l’âge est appliqué à ce système, il tente d’épuiser en premier lieu la charge stockée dans la batterie interne (sur la base des conditions 1 et 2 énumérées ci-dessus). Si l’utilisateur décide de retirer la batterie externe au bout d’un certain temps, il en résultera une mauvaise expérience pour lui, car la capacité de la batterie disponible diminuera considérablement une fois que la batterie externe sera retirée, la batterie interne étant utilisée.
Sur un système non-SDB, ce problème ne se produit généralement pas, car dans la plupart des cas, la batterie externe est épuisée avant que la batterie interne soit utilisée.
Il est donc souhaitable de désactiver sélectivement l’algorithme d’équilibrage d’âge simple lorsque le scénario ci-dessus est susceptible de se produire.
Pour résumer, chaque fois que l’utilisateur est censé utiliser le système pendant une longue durée avec une batterie externe retirée, il est préférable de désactiver l’algorithme SDB et d’appliquer la stratégie d’utilisation de la batterie de l’OEM (qui privilégie généralement l’utilisation de la batterie externe).
Windows calcule la disponibilité de la batterie et affiche un indicateur : « Préserver les batteries non permutables à chaud ». Lorsque cet indicateur est consommé par l’algorithme SDB, comme illustré par la zone de décision (X) dans le diagramme de flux suivant.
Algorithme SDB d’équilibrage d’âge simple adapté pour les batteries permutables à chaud
Implémentation de l’algorithme SDB dans le microprogramme
Cette section décrit la logique de contrôle de la décharge de la batterie implémentée dans le micrologiciel du système. Elle s’appuie sur la logique d’équilibrage d’âge de la batterie décrite ci-dessus pour démontrer comment une logique de décharge de plusieurs batteries existantes (indiquée dans le bloc (Y)) pourrait être incorporée à cette logique.
Il convient de noter qu’il ne s’agit pas d’une prescription de la manière dont l’algorithme SDB devrait être implémenté par l’OEM, mais d’un exemple complet pour le dispositif à plusieurs batteries hypothétique et simplifié décrit dans cette section, qui est utilisé pour illustrer le comportement SDB.
Implémentation complète de l’algorithme SDB d’équilibrage d’âge simple dans le microprogramme
Architecture d’une pile d’alimentation
Cette section décrit l’agencement de tous les composants impliqués dans la pile d’alimentation et leurs relations mutuelles.
Miniport de la batterie
Les interfaces du miniport de la batterie restent les mêmes.
Les interfaces SDB n’affectent pas ou n’influencent pas le souhait de l’OEM de s’appuyer sur le mécanisme ACPI/CmBatt ou de développer leur miniport propriétaire.
Windows transfère toutes les commandes IOCTL_BATTERY_SET_INFORMATION vers tous les appareils de batterie énumérés dans le système.
HPMI
Une HPMI (interface de gestion de l’alimentation matérielle), est un nouveau composant introduit dans la pile d’alimentation.
HPMI est un pilote développé par et propriété de l’OEM/du fabricant de l’appareil.
HPMI a une connaissance profonde de la configuration et de l’état du matériel sous-jacent, et a accès au microprogramme du système.
Pour implémenter la fonctionnalité SDB, le pilote HPMI doit :
- S’inscrire auprès de Windows.
- Annoncer la prise en charge de SDB.
- Utiliser les paramètres de contrôle SDB fournis par Windows.
Les systèmes à plusieurs batteries qui prennent en charge SDB sont désormais nécessaires pour implémenter l’interface HPMI. Le protocole d’API HPMI est une nouvelle norme pour l’implémentation de systèmes à plusieurs batteries.
Une mise à jour de l’interface HPMI est prévue pour prendre en charge d’autres fonctions de charge, de décharge et de gestion de la charge.
Caractéristiques du pilote
Le système ne doit pas comporter plus d’une instance du pilote HPMI. HPMI peut être implémenté en tant que pilote en mode utilisateur ou en mode noyau.
Installation
HPMI peut se manifester sous la forme d’un appareil ACPI ou être énuméré à la racine par l’un des autres services/pilotes de OEM, à la discrétion de l’OEM.
Implémentation de l’algorithme SDB
Le schéma suivant présente deux exemples de la façon dont l’algorithme SDB peut être implémenté si le composant du microprogramme héberge déjà la majeure partie de la logique de contrôle de la batterie.
HPMI implémente l’algorithme SDB
HPMI peut choisir d’implémenter l’algorithme SDB, ce qui nécessite que HPMI transmette des indices de charge/décharge au microprogramme.
Le microprogramme implémente l’algorithme SDB
Par ailleurs, l’interface HPMI peut agir en tant que redirecteur et simplement rediriger les indices d’utilisation de la batterie Windows au micrologiciel dans lequel l’algorithme SDB est implémenté, comme le montre la figure ci-dessus. L’utilisation de ce modèle est recommandée pour les raisons suivantes :
Les informations nécessaires à l’implémentation de l’algorithme SDB sont facilement disponibles : il n’est pas nécessaire de transmettre ces informations à HPMI
L’algorithme SDB est une extension de la logique de décharge déjà implémentée dans les systèmes à plusieurs batteries
Un modèle d’organigramme complet décrivant l’implémentation de l’algorithme SDB est présenté dans Implémentation de l’algorithme SDB dans le microprogramme.
Définitions de l’interface
Un nouveau GUID de classes d’interfaces d’appareils pour l’appareil HPMI est présenté. L’appareil HPMI doit s’identifier comme implémentant les classes d’interfaces d’appareils. Pour en savoir plus, consultez Utilisation des interfaces d’appareils dans le WDK.
Windows utilise la notification d’arrivée d’un appareil pour interroger et configurer l’appareil 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 doit être en mesure de prendre en charge plusieurs appels IOCTL simultanés.
Il convient de noter que l’index de l’appareil doit être défini sur zéro.
Découverte de fonctionnalités
IOCTL_HPMI_QUERY_CAPABILITIES est utilisé pour découvrir les fonctionnalités prises en charge par HPMI. IOCTL_HPMI_QUERY_CAPABILITIES est un IOCTL requis.
Windows émettra cet IOCL vers HPMI une fois après la découverte d’une nouvelle instance de pilote 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;
//
Format de commande
Windows émet cette IOCTL avec HPMI_QUERY_CAPABILITIES.
La version est définie sur HPMI_QUERY_CAPABILITIES_VERSION_1.
Format de la réponse
HPMI doit renvoyer le code STATUS_SUCCESS.
HPMI répond en définissant les valeurs suivantes dans la structure HPMI_QUERY_CAPABILITIES_RESPONSE :
- La version est définie sur HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1
- RequestService est défini sur HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS pour garantir que le pilote HPMI reçoit IOCTL_HPMI_BATTERY_UTILIZATION_HINT.
- SdbCapabilities est défini sur HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING pour indiquer la prise en charge de l’équilibrage d’âge de la batterie.
Utilisation de la batterie
Windows émet IOCTL_HPMI_BATTERY_UTILIZATION_HINT vers HPMI pour fournir les indicateurs d’utilisation de batterie les plus récents. IOCTL_HPMI_BATTERY_UTILIZATION_HINT est une IOCTL requise.
HPMI peut utiliser l’indication PreserveNonHotSwapableBatteries comme décrit dans Adaptation de l’algorithme SDB pour une utilisation avec des batteries permutables à chaud afin de préserver les batteries internes.
//
// 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)
Format de commande
Windows émet cette IOCTL avec HPMI_BATTERY_UTILIZATION_HINT. La version est définie sur HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
PreserveNonHotSwappableBatteries est défini sur l’une des valeurs suivantes :
- HpmiBoolUnavailable : définissez quand aucun indicateur d’utilisation de la batterie ne peut être fourni. En réponse, HPMI/Microprogramme doit généralement engager les stratégies de décharge de facto.
- HpmiBoolFalse : définissez quand Windows détermine un moment opportun pour que l’équilibrage d’âge de la batterie se produise.
- HpmiBoolTrue : définissez quand Windows détermine qu’il faut conserver l’énergie stockée dans les batteries internes.
Format de la réponse
HPMI doit renvoyer le code STATUS_SUCCESS.
Aucune donnée n’est retournée dans la réponse.
Exemple de contrat d’interface
Reportez-vous à HMPI.h pour obtenir un contrat d’API complet (exemple) et les définitions d’interface décrites ici.
Remarque
Le contenu de ce document est susceptible de changer sans préavis.