Condividi tramite


Batteria definita dal software

Nota

Alcune informazioni riguardano il prodotto non rilasciato, che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Introduzione

L'obiettivo di questo argomento consiste nell'introdurre software defined batteries (SDB), descrivere l'architettura SDB di Windows e descrivere in dettaglio l'API Windows e i contratti DDI per questa funzionalità.

L'argomento inizia introducendo l'algoritmo SDB Simple Age Balancing per un ipotetico sistema a due batterie. Questo è seguito dal layout dell'architettura e dal contratto API necessario per implementare l'algoritmo SDB.

Nomenclatura

  • BattC - Driver di classe batteria

  • CAD - Il driver CAD (Charge Arbitration Driver) è un driver Microsoft che arbitra la potenza tra USB Legacy, USB Type-C e origini di ricarica wireless

  • Batterie scambiabili a freddo - Batterie che non possono essere rimosse dal sistema senza rischi di brownout o interruzioni di alimentazione totali

  • Numero di cicli - Numero di cicli di scaricamento a carica completa sottoposti alla batteria, come descritto nella specifica ACPI

  • Batterie scambiabili a caldo - Batterie che possono essere rimosse in modo sicuro mentre il sistema è in funzione, senza alcun rischio di brownout

  • HPMI - Interfaccia di Hardware Power Manager

  • Batterie non scambiabili a caldo - Una o più batterie scambiabili a freddo e non scambiabili installate nel sistema

  • Batterie non scambiabili - Batterie non progettate e progettate per essere rimosse dall'utente finale

Panoramica di SDB

Il documento di ricerca MSR sulle batterie software-defined è disponibile qui: https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf.

Questo argomento riprende le idee selezionate descritte in questo documento e le presenta con una visualizzazione della funzionalità di bilanciamento dell'età della batteria basata su software nei portatili e in altri dispositivi mobili.

Immaginate un sistema a due batterie. Dove una batteria è una batteria non rimovibile, situata accanto al SOC, chiamiamo questa batteria interna. L'altra batteria è a batteria scambiabile a caldo, situata accanto a una tastiera rimovibile: chiamiamo questa batteria esterna.

Un sistema a batteria multipla

Diagramma di un sistema a batteria multipla con batterie interne ed esterne.

Poiché la tastiera è scollegata per un periodo di tempo, forza le due batterie a essere diverse. Questo crea un ambito per bilanciare l'età delle batterie e prolungare il periodo di usabilità del sistema impiegando l'algoritmo di bilanciamento dell'età semplice SDB.

Algoritmo SDB di bilanciamento dell'età semplice

L'algoritmo è chiamato bilanciamento dell'età semplice perché tenta di bilanciare l'età della batteria. L'algoritmo di bilanciamento dell'età semplice fa sì che il sistema preferisca scaricare la batteria che ha superato il minimo. Una batteria che ha accumulato un numero minore di cicli non solo ha una capacità più elevata per contenere l'alimentazione, ma anche in genere più efficiente per fornire la potenza. In tal modo prolungare il tempo che il sistema può sostenere sulle batterie.

Algoritmo SDB di bilanciamento dell'età semplice

Diagramma che illustra l'algoritmo SDB Simple Age Balancing.

L'idea principale alla base dell'algoritmo di bilanciamento dell'età semplice consiste nell'usare semplicemente la batteria che ha accumulato meno numero di cicli di batteria, come illustrato dalla casella decisionale (2) nel diagramma di flusso precedente. Il sistema ipotetico in questo esempio consente l'uso esclusivo di batterie interne o esterne. Tuttavia, questo potrebbe non essere vero per tutti i sistemi. Altri sistemi potrebbero non essere flessibili o possono avere vincoli elettrici sull'uso di batterie. In questi casi, l'algoritmo prevede un tentativo ottimale di bilanciamento dell'età. Si consideri ad esempio quanto segue.

  1. Un sistema che non è in grado di sostenere l'alimentazione esclusivamente sulla batteria esterna (può essere perché la batteria esterna è progettata per essere solo una fonte di alimentazione supplementare). Questo sistema può implementare l'algoritmo di bilanciamento dell'età semplice scaricando simultaneamente le batterie interne ed esterne nel blocco di processo (A) nel diagramma di flusso precedente.

  2. Un sistema che richiede l'uso della batteria esterna ogni volta che è presente (può essere dovuto alla potenza aggiuntiva associata a mantenere accesa la tastiera rimovibile): questo sistema può implementare l'algoritmo di bilanciamento dell'età semplice scaricando simultaneamente le batterie interne ed esterne nel blocco di processo (B) nel diagramma di flusso precedente.

L'algoritmo di bilanciamento dell'età semplice può essere utilizzato solo quando è presente una carica sufficiente nelle batterie interne ed esterne per eseguire il sistema, la casella delle decisioni (1) illustra questa condizione nel diagramma di flusso precedente. Ad esempio (di nuovo tornando al sistema ipotetico) se la batteria esterna non ha carica in esso, non esiste alcun ambito di bilanciamento dell'età delle batterie e la casella decisionale (1) genererebbe il ramo "NO".

L'OEM è libero di scegliere i vincoli e le condizioni quando l'algoritmo di bilanciamento dell'età semplice non viene messo in vigore, oltre a quando le batterie interne o esterne sono fuori alimentazione. Ad esempio, l'OEM può scegliere di non eseguire alcun bilanciamento dell'età quando:

  1. SoC/Processor è in esecuzione in modalità a prestazioni elevate
  2. Il sistema è termicamente instabile

Quando l'algoritmo di bilanciamento dell'età semplice non viene usato (a causa di una o più condizioni descritte in precedenza), la logica tornerà ai criteri di utilizzo della batteria proprietaria dell'OEM, come illustrato dalla casella di processo (3) nel diagramma di flusso precedente. La casella di elaborazione (3) è l'OEM per la logica avrebbe applicato se SDB non è supportato.

Adattamento dell'algoritmo SDB per l'uso con batterie a scambio frequente

L'algoritmo SDB di bilanciamento dell'età semplice tenta di usare la batteria più sana, anche se questa strategia funziona bene per migliorare la durata della batteria a lungo termine, può influire gravemente sull'usabilità a breve termine del sistema, come descritto nello scenario seguente.

Nei due sistemi a batteria descritti in precedenza, considerare la situazione seguente:

  1. Si prevede che l'utente usi il sistema abbastanza a lungo fino a quando non viene esaurita la carica nelle batterie interne ed esterne.

  2. La batteria esterna è più invecchiata rispetto alla batteria interna.

Quando l'algoritmo di bilanciamento dell'età semplice viene utilizzato su questo sistema, tenterà di esaurire prima la carica memorizzata nella batteria interna (in base alla condizione 1 e n. 2 elencata sopra). Quando l'utente decide di scollegare la batteria esterna dopo un po', si verificherebbe un'esperienza utente errata perché la capacità della batteria resa disponibile per l'uso diminuirebbe drasticamente una volta che la batteria esterna viene scollegata perché la batteria interna verrebbe usata.

In un sistema non SDB, questo problema in genere non si verifica, perché nella maggior parte dei casi la batteria esterna viene esaurita prima che la batteria interna venga usata.

È quindi consigliabile disabilitare in modo selettivo l'algoritmo di bilanciamento dell'età semplice quando è probabile che si verifichi uno scenario precedente.

Per riepilogare, ogni volta che si prevede che l'utente usi il sistema per una lunga durata con batteria esterna rimossa, è ottimale disabilitare l'algoritmo SDB e ripristinare l'uso dei criteri di utilizzo della batteria OEM (che in genere favorisce l'uso della batteria esterna per primo).

Windows calcola la disponibilità della batteria e produce un hint "Mantieni batterie scambiabili non a caldo". Quando questo hint viene utilizzato dall'algoritmo SDB, come illustrato dalla casella decisionale (X) nel diagramma di flusso seguente.

Algoritmo SDB di bilanciamento dell'età semplice adattato per batterie scambiabili a caldo

Diagramma dell'algoritmo SDB di bilanciamento dell'età semplice adattato per le batterie scambiabili a caldo.

Implementazione dell'algoritmo SDB nel firmware

Questa sezione illustra la logica di controllo della scarica della batteria completa implementata nel firmware di sistema. Questo si basa sulla logica di bilanciamento della durata della batteria descritta in precedenza per dimostrare come una logica di scarica a batteria esistente (contrassegnata in un blocco Y) verrebbe incorporata con esso.

Si noti che non si tratta di una prescrizione del modo in cui l'algoritmo SDB deve essere implementato dagli OEM, ma piuttosto un esempio completo per il semplice, ipotetico dispositivo a batteria multipla descritto in questa sezione che viene usato per illustrare il comportamento del database SDB.

Implementazione completa del firmware dell'algoritmo SDB simple age balancing

Diagramma dell'implementazione completa del firmware dell'algoritmo SDB Simple Age Balancing.

Architettura di Power Stack

Questa sezione descrive il layout dei componenti per tutti i componenti che partecipano allo stack di alimentazione e la relativa relazione tra loro.

Diagramma dell'architettura dello stack di alimentazione con il componente HPMI.

Miniport batteria

Le interfacce miniport della batteria rimangono invariate.

Le interfacce SDB non influiscono né influenzano il desiderio dell'OEM di affidarsi al meccanismo ACPI/CmBatt o di sviluppare il miniport proprietario.

Windows inoltra tutti i comandi IOCTL_BATTERY_edizione Standard T_INFORMATION a tutti i dispositivi a batteria enumerati nel sistema.

HPMI

Hardware Power Manager Interface (HPMI) è un nuovo componente introdotto nello stack di alimentazione.

HPMI è un driver sviluppato e di proprietà del produttore OEM/dispositivo.

HPMI ha una conoscenza intima della configurazione e dello stato hardware sottostanti e ha accesso al firmware di sistema.

Per implementare la funzionalità SDB, il driver HPMI:

  1. Registra se stesso con Windows.
  2. Annunciare il supporto SDB.
  3. Utilizzare i parametri di controllo SDB forniti da Windows.

I sistemi a batteria multipla che supportano SDB sono necessari per implementare l'interfaccia HPMI in futuro. Il protocollo API HPMI è un nuovo standard per l'implementazione di più sistemi a batteria.

Ci sono piani in modo che in futuro, HPMI verrà aggiornato per supportare altre funzioni di ricarica, scaricamento e gestione degli addebiti.

Caratteristiche del driver

Non deve essere presente più di un'istanza del driver HPMI in un sistema. HPMI può essere implementato come modalità utente o driver in modalità kernel.

Installazione

HPMI può essere manifesto come un dispositivo ACPI o essere enumerato come radice da uno degli altri servizi/driver OEM a discrezione dell'OEM.

Implementazione dell'algoritmo SDB

Il diagramma seguente illustra due esempi di come l'algoritmo SDB può essere implementato se il componente firmware ospita già la maggior parte della logica di controllo della batteria.

Diagramma delle implementazioni dello stack di algoritmi SDB di esempio di HPMI e firmware.

HPMI implementa l'algoritmo SDB

HPMI può scegliere di implementare l'algoritmo SDB, che richiederà a HPMI di inoltrare hint di addebito/scaricamento al firmware.

Firmware implementa l'algoritmo SDB

In alternativa, HPMI può fungere da server d'inoltro e inoltrare semplicemente gli hint di utilizzo della batteria di Windows al firmware in cui viene implementato l'algoritmo SDB, come illustrato nella figura precedente. L'uso di questo modello è consigliato per i motivi seguenti:

  1. Le informazioni necessarie per implementare l'algoritmo SDB sono facilmente disponibili. Non è necessario passare queste informazioni a HPMI

  2. L'algoritmo SDB è un'estensione per la logica di scaricamento già implementata nei sistemi a batteria multipla

Un modello di grafico a flusso completo che illustra come viene implementato l'algoritmo SDB in Implementazione dell'algoritmo SDB nel firmware.

Definizioni di interfaccia

È stato introdotto un nuovo GUID della classe di interfaccia dispositivo per il dispositivo HPMI. Il dispositivo HPMI deve identificarsi come implementazione delle classi di interfaccia dispositivo. Per altre informazioni, vedere Uso di interfacce dispositivo in WDK.

Windows usa la notifica di arrivo del dispositivo per eseguire query e configurare il dispositivo 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 dovrebbe essere in grado di gestire più chiamate IOCTL simultanee.

Si noti che l'indice del dispositivo deve essere impostato su zero.

Individuazione delle funzionalità

IOCTL_HPMI_QUERY_CAPABILITIES viene usato per individuare le funzionalità supportate da HPMI. IOCTL_HPMI_QUERY_CAPABILITIES è un IOCTL obbligatorio.

Windows eseguirà questo IOCL a HPMI una volta dopo che viene individuata una nuova istanza del driver 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;

    //

Formato comando

Windows genera questo IOCTL con HPMI_QUERY_CAPABILITIES.

La versione è impostata su HPMI_QUERY_CAPABILITIES_VERSION_1.

Formato risposta

HPMI deve restituire STATUS_SUCCESS codice.

HPMI risponde impostando i valori seguenti in HPMI_QUERY_CAPABILITIES_RESPON edizione Standard struct:

  • La versione è impostata su HPMI_QUERY_CAPABILITIES_RESPON edizione Standard_VERSION_1
  • RequestService è impostato su HPMI_REQUEST_edizione Standard RVICE_BATTERY_UTILIZATION_HINTS per assicurarsi che il driver HPMI riceva IOCTL_HPMI_BATTERY_UTILIZATION_HINT.
  • SdbCapabilities è impostato su HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING per indicare il supporto del bilanciamento dell'età della batteria.

Utilizzo della batteria

I problemi di Windows IOCTL_HPMI_BATTERY_UTILIZATION_HINT a HPMI per fornire suggerimenti per l'utilizzo della batteria più aggiornati. IOCTL_HPMI_BATTERY_UTILIZATION_HINT è un IOCTL obbligatorio.

HPMI può utilizzare l'hint PreserveNonHotSwappableBatteries come descritto in Adattamento dell'algoritmo SDB per l'uso con batterie scambiabili a caldo per risparmiare le batterie interne.

//
// 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)

Formato comando

Windows genera questo IOCTL con HPMI_BATTERY_UTILIZATION_HINT. La versione è impostata su HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.

HPMI_BATTERY_UTILIZATION_HINT

PreserveNonHotSwappableBatteries è impostato su uno dei valori seguenti:

  • HpmiBoolUnavailable: impostare quando non è possibile fornire alcun hint per l'utilizzo della batteria. In risposta, HPMI/Fimware dovrebbe in genere coinvolgere i criteri di scarico di fatto.
  • HpmiBoolFalse: impostare quando Windows determina un tempo appropriato per il bilanciamento della durata della batteria.
  • HpmiBoolTrue: impostare quando Windows determina la necessità di conservare l'energia memorizzata nelle batterie interne.

Formato risposta

HPMI deve restituire STATUS_SUCCESS codice.

Nella risposta non vengono restituiti dati.

Contratto di interfaccia di esempio

Vedere HMPI.h per un contratto API completo (esempio) per le definizioni di interfaccia descritte qui.

Nota

Il contenuto di questo documento è soggetto a modifiche senza preavviso.