Gestione alimentazione

Per supportare la gestione energetica specifica del veicolo, Android fornisce un servizio CarPowerManagementService e un'interfaccia CarPowerManager .

Le transizioni di stato vengono attivate dall'unità di controllo principale del veicolo (VMCU). Per comunicare con la VMCU, gli integratori devono implementare diversi componenti. Gli integratori sono responsabili dell'integrazione con il livello di astrazione dell'hardware del veicolo (VHAL) e l'implementazione del kernel. Gli integratori sono inoltre responsabili della disabilitazione delle sorgenti di riattivazione e della garanzia che gli arresti non vengano posticipati indefinitamente.

Terminologia

Questi termini vengono utilizzati in tutto questo documento:

processore dell'app (AP)
Parte del sistema su un chip (SoC) .
Pacchetto di supporto scheda (BSP)
Il livello di software che contiene firmware di avvio e driver di dispositivo specifici dell'hardware che consentono a un sistema operativo incorporato di funzionare in un determinato ambiente hardware (una scheda madre), integrato con il sistema operativo incorporato.
CarPower Manager (CPM)
Espone un'API per consentire alle app di registrarsi per le modifiche dello stato di alimentazione.
Servizio di gestione dell'energia elettrica (CPMS)
Implementa la macchina a stati di alimentazione dell'auto, si interfaccia con VHAL ed esegue le chiamate finali a suspend() e shutdown() .
CarPowerPolicyDaemon (CPPD)
Espone le interfacce AIDL per i processi nativi per registrare il listener della politica di alimentazione.
ingresso o uscita per uso generale (GPIO)
Un pin di segnale digitale per uso generale.
livello di astrazione hardware (HAL)
Un livello software con cui tutti gli altri moduli di livello superiore devono interagire per accedere alle funzionalità hardware.
ibernare
Chiamato anche sospensione su disco (S2D/S4). Il SoC viene posto in modalità di alimentazione S4 (ibernazione) e il contenuto della RAM viene scritto su un supporto non volatile (come flash o disco) e l'intero sistema viene spento.
processore multimediale (MP)
Vedere sistema su chip (SoC) .
circuito integrato di gestione dell'energia (PMIC)
Chip utilizzato per gestire i requisiti di alimentazione per il sistema host.
sistema su un chip (SoC)
Processore principale che esegue AAOS, generalmente fornito da produttori come Intel, MediaTek, Nvidia, Qualcomm, Renesas e Texas Instruments.
sospendere
Chiamato anche Suspend-to-RAM (S2R o STR). Il SoC viene messo in modalità di alimentazione S3 e la CPU viene spenta mentre la RAM rimane accesa.
HAL del veicolo (VHAL)
L'API Android utilizzata per interfacciarsi con la rete del veicolo. Il partner di livello 1 o l'OEM è responsabile della scrittura di questo modulo. La rete del veicolo può utilizzare qualsiasi livello fisico (come CAN, LIN, MOST ed Ethernet). Il VHAL astrae questa rete di veicoli per consentire ad AAOS di interagire con il veicolo.
Processore di interfaccia del veicolo (VIP)
Vedere MCU del veicolo.
Unità di controllo principale del veicolo (VMCU)
Il microcontrollore che fornisce l'interfaccia tra la rete del veicolo e il SoC. Il SoC comunica con la VMCU tramite segnali USB, UART, SPI e GPIO.

Sistema di design

Questa sezione descrive come AAOS rappresenta lo stato di alimentazione del processore dell'app e quali moduli implementano il sistema di gestione dell'alimentazione. Questo materiale descrive inoltre come questi moduli interagiscono e come avvengono in genere le transizioni di stato.

Macchina dello stato di potenza dell'auto

AAOS utilizza una macchina a stati per rappresentare lo stato di alimentazione dell'AP. La macchina a stati fornisce gli stati illustrati di seguito:

Macchina dello stato di potenza dell'auto

Figura 1. Macchina dello stato di potenza dell’auto.

Le transizioni più comuni sono evidenziate in blu. Questi sono gli stati e le transizioni comuni:

  • Sospensione su RAM. Il veicolo e il SoC sono spenti. Nessun codice viene eseguito. L'alimentazione viene mantenuta alla RAM del SoC.
  • Aspetta VHAL. Quando il conducente interagisce con il veicolo, ad esempio aprendo una porta, la VMCU alimenta il SoC. AAOS riprende da Suspend-to-RAM ed entra in Wait for VHAL, dove attende il coordinamento con il VHAL.
  • SU. Il VHAL dice ad AAOS di entrare nello stato On. In questo stato, AAOS è completamente in esecuzione e interagisce con il conducente.
  • Preparazione allo spegnimento. Quando il conducente ha finito di guidare, il VHAL dice ad AAOS di entrare in Shutdown Prepare. In questo stato, il display e l'audio sono spenti e AAOS non interagisce con il conducente. Il sistema Android è ancora in esecuzione ed è possibile aggiornare gratuitamente le app e il sistema Android. Una volta completati gli eventuali aggiornamenti, il sistema Android entra in Attendi la fine VHAL.
  • Attendi la fine di VHAL. A questo punto, AAOS informa il VHAL che è pronto per lo spegnimento. Si prevede che la VMCU metterà il SoC in Deep Sleep e rimuoverà l'alimentazione dal processore dell'app. AAOS si trova quindi nello stato Suspend-to-RAM, sebbene non venga eseguito alcun codice.

Moduli di gestione dell'energia

Il sistema di gestione dell'energia è composto da questi moduli:

Nome del modulo Descrizione
CarPower Manager API Java o C++.
Servizio di gestione dell'alimentazione dell'auto Coordina le transizioni degli stati di potere.
CarPowerPolicyDaemon Comunica con i client della politica di alimentazione nativa.
Veicolo HAL Interfaccia con la VMCU.
Nocciolo Sospendere l'implementazione della RAM o del disco.

La funzionalità di sospensione/ibernazione profonda (sospensione di Android su RAM/disco) è implementata nel kernel. Questa funzionalità è esposta nello spazio utente come un file speciale situato in /sys/power/state . AAOS viene sospeso scrivendo mem o disk su questo file.

Il CPMS coordina lo stato di potere con altri servizi e HAL. Il CPMS implementa la macchina a stati sopra descritta e invia notifiche a ogni osservatore quando si verifica una transizione di stato di alimentazione. Questo servizio utilizza anche il VHAL per inviare messaggi all'hardware.

Il CPPD gestisce la politica energetica finché il CPMS non assume il controllo. Invia inoltre notifiche di modifica della politica di alimentazione agli ascoltatori nativi.

Alcune proprietà sono definite nel VHAL. Per comunicare con la VMCU, il CPMS legge e scrive queste proprietà. le app possono utilizzare l'interfaccia definita nel CPM per monitorare le modifiche dello stato di alimentazione. Questa interfaccia consente inoltre alle app di registrare i listener dei criteri di alimentazione . Questa API può essere richiamata da Java ed è annotata con l'API @hide/@System, il che significa che è disponibile solo per le app privilegiate. La relazione tra questi moduli, app e servizi è illustrata di seguito:

Schema di riferimento dei componenti di potenza

Figura 2. Diagramma di riferimento dei componenti di potenza.

Sequenza dei messaggi

La sezione precedente descriveva i moduli che compongono il sistema di gestione dell'energia. Questa sezione utilizza gli esempi di entrata e uscita dalla modalità deep sleep per spiegare come comunicano i moduli e le app:

Entra nel sonno profondo

Solo la VMCU può avviare il sonno profondo. Una volta avviato il sonno profondo, la VMCU invia una notifica al CPMS tramite il VHAL. Il CPMS modifica lo stato in SHUTDOWN PREPARE e trasmette questa transizione di stato a tutti gli osservatori (le app e i servizi che monitorano CPMS) chiamando il metodo onStateChanged() con un nuovo ID di stato fornito dal CPM.

Il CPM media tra le app/i servizi e il CPMS. Il metodo onStateChanged() per le app/i servizi viene richiamato in modo sincrono nel metodo onStateChanged() del CPM. Per la maggior parte delle app e dei servizi è necessario completare la preparazione prima di tornare da questa chiamata. Ai servizi privilegiati è consentito continuare la preparazione in modo asincrono dopo la restituzione di PRE_SHUTDOWN_PREPARE , SUSPEND_ENTER , POST_SUSPEND_ENTER . In questo caso, il servizio privilegiato dovrebbe chiamare complete() sull'oggetto CompletablePowerStateChangeFuture fornito quando termina la preparazione. Tieni presente che la preparazione asincrona non è consentita per SHUTDOWN_PREPARE . Prima che DEEP_SLEEP_ENTRY venga inviato al VHAL, il CPMS invia periodicamente richieste di rinvio dell'arresto al VHAL.

Quando tutti gli oggetti CPM hanno completato i preparativi per l'arresto, il CPMS invia AP_POWER_STATE_REPORT al VHAL, che poi notifica alla VMCU che l'AP è pronto per la sospensione. Il CPMS chiama anche il suo metodo suspend, che sospende il kernel.

La sequenza sopra descritta è di seguito illustrata:

Entra nel sonno profondo

Figura 3. Entra nel sonno profondo.

Interfacce di programmazione fornite da CPM

Questa sezione descrive l'API Java fornita da CPM per app e servizi di sistema. Questa API consente al software di sistema di:

  • Monitorare i cambiamenti dello stato di alimentazione nell'AP.
  • Applicare politiche energetiche.

Utilizza questi passaggi per chiamare le API fornite dal CPM:

  1. Per acquisire l'istanza CPM, chiama l'API Car.
  2. Chiama il metodo appropriato sull'oggetto creato nel passaggio 1.

Crea un oggetto CarPowerManager

Per creare un oggetto CPM, chiamare il metodo getCarManager() dell'oggetto Car. Questo metodo è una facciata utilizzata per creare oggetti CPM. Specifica android.car.Car.POWER_SERVICE come argomento per creare un oggetto CPM.

Car car = Car.createCar(this);
CarPowerManager powerManager =
  (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);

CarPowerStateListener e registrazione

Le app e i servizi di sistema possono ricevere notifiche di modifica dello stato di alimentazione implementando CarPowerManager.CarPowerStateListener . Questa interfaccia definisce un metodo onStateChanged() , che è una funzione di callback richiamata quando viene modificato lo stato di alimentazione del CPMS. L'esempio seguente definisce una nuova classe anonima che implementa l'interfaccia:

private final CarPowerManager.CarPowerStateListener powerListener =
  new CarPowerManager.CarPowerStateListener () {
    @Override
     public void onStateChanged(int state) {
       Log.i(TAG, "onStateChanged() state = " + state);
     }
};

Per istruire questo oggetto listener a monitorare una transizione dello stato di alimentazione, crea un nuovo thread di esecuzione e registra il listener e questo thread sull'oggetto CPM:

executor = new ThreadPerTaskExecutor();
powerManager.setListener(powerListener, executor);

Quando lo stato di alimentazione viene modificato, il metodo onStateChanged() dell'oggetto listener viene richiamato con un valore per rappresentare il nuovo stato di alimentazione. L'associazione tra valore effettivo e stato di potenza è definita in CarPowerManager ed è mostrata nella tabella seguente:

Nome Descrizione
STATO_ON Inserisci lo stato attivo. Il sistema è pienamente operativo.
STATE_SHUTDOWN_CANCELLATO Lo spegnimento viene annullato e lo stato di alimentazione viene riportato allo stato normale.
STATO_SHUTDOWN_ENTER si prevede che le app vengano ripulite e siano pronte per la chiusura.
STATE_POST_SHUTDOWN_ENTER I preparativi per l'arresto sono stati completati e VMCU è pronta per l'arresto. Entra nello stato di spegnimento.
STATO_PRE_SHUTDOWN_PREPARE È richiesto il processo di arresto ma CPMS non lo avvia ancora. Il display e l'audio sono ancora attivi
STATO_SHUTDOWN_PREPARE La modalità Garage potrebbe essere operativa durante il periodo.
STATE_SUSPEND_ENTER si prevede che le app vengano ripulite e siano pronte per la sospensione su RAM.
STATE_POST_SUSPEND_ENTER I preparativi per la sospensione su RAM sono stati completati e VMCU è pronta per la sospensione su RAM. Entra nello stato di sospensione.
STATE_SUSPEND_EXIT Svegliati dalla sospensione o riprendi da una sospensione annullata.
STATE_HIBERNATION_ENTER si prevede che le app vengano ripulite e siano pronte per l'ibernazione.
STATE_POST_HIBERNATION_ENTER La preparazione per l'ibernazione è stata completata e VMCU è pronta per l'ibernazione. Accedere allo stato di ibernazione.
STATE_HIBERNATION_EXIT Risvegliarsi dalla modalità di ibernazione o riprendere da una modalità di ibernazione annullata.
STATO_WAIT_FOR_VHAL Il sistema si sta avviando, ma è in attesa di stabilire la comunicazione con il VHAL prima di passare allo stato ON.

Annullamento della registrazione di CarPowerStateListener

Per annullare la registrazione di tutti gli oggetti listener registrati su CPM, chiamare il metodo clearListener :

powerManager.clearListener();

Integrazione del sistema sulla tua implementazione Android

Gli integratori sono responsabili dei seguenti elementi:

  • Implementazione dell'interfaccia del kernel per sospendere Android.
  • Implementare le funzioni VHAL per:
    • Propaga l'avvio della sospensione o dello spegnimento dall'auto ad Android.
    • Invia il messaggio di pronto spegnimento da Android all'auto.
    • Avvia l'arresto o la sospensione di Android tramite l'interfaccia del kernel Linux.
  • Assicurarsi che tutte le sorgenti di attivazione siano disabilitate quando il dispositivo è in sospensione.
  • Assicurati che le app si spengano abbastanza velocemente da non posticipare indefinitamente il processo di spegnimento.
  • Assicurarsi che il BSP accenda (o spenga) i componenti del dispositivo in base alla politica di alimentazione in modo da non bloccare la sospensione o l'ibernazione

Interfaccia del kernel: /sys/power/state

AAOS mette un dispositivo in modalità di sospensione quando un'app o un servizio scrive mem per la sospensione su RAM o disk per la sospensione su disco in un file situato in /sys/power/state . L'integratore deve fornire una funzione che monitori questo file e metta Linux nello stato di sospensione dell'alimentazione. Questa funzione può inviare un GPIO alla VMCU per notificare alla VMCU che il dispositivo si è spento completamente. L'integratore è inoltre responsabile della rimozione di eventuali condizioni di competizione tra l'invio del messaggio finale da parte di VHAL alla VMCU e l'entrata del sistema in modalità di sospensione o spegnimento.

Responsabilità VHAL

Il VHAL fornisce un'interfaccia tra la rete del veicolo e Android. Il VHAL:

  • Propaga l'avvio della sospensione o dello spegnimento dall'auto ad Android.
  • Invia il messaggio di pronto spegnimento da Android all'auto.
  • Avvia l'arresto o la sospensione di Android tramite l'interfaccia del kernel Linux.

Quando il CPMS informa il VHAL che è pronto per l'arresto, il VHAL invia il messaggio di pronto per l'arresto alla VMCU. In genere, le periferiche su chip come UART, SPI e USB trasmettono il messaggio. Una volta inviato il messaggio, il CPMS richiama il comando del kernel per sospendere o spegnere il dispositivo. Prima di farlo, il VHAL o il BSP possono attivare un GPIO per istruire la VMCU che è sicuro rimuovere l'alimentazione dal dispositivo.

Il VHAL deve supportare le seguenti proprietà, che controllano la gestione dell'energia tramite il VHAL:

Nome Descrizione
AP_POWER_STATE_REPORT Android segnala le transizioni di stato alla VMCU con questa proprietà, utilizzando i valori di enumerazione VehicleApPowerStateReport.
AP_POWER_STATE_REQ La VMCU utilizza questa proprietà per indicare ad Android di passare a diversi stati di alimentazione, utilizzando i valori enum di VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Utilizza questa proprietà per segnalare l'attuale stato di gestione dell'alimentazione di Android. Questa proprietà contiene due numeri interi:

  • int32Values[0] : enumerazione VehicleApPowerStateReport dello stato corrente.
  • int32Values[1] : tempo in millisecondi per posticipare, sospendere o arrestare. Il significato di questo valore dipende dal primo valore.

Il primo valore può assumere uno dei seguenti valori. VehicleApPowerStateReport.aidl contiene descrizioni più specifiche, archiviate in hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle .

Nome del valore Descrizione Secondo valore
WAIT_FOR_VHAL L'AP sta iniziando e deve stabilire una comunicazione con il VHAL.
PROFONDO_SONNO_ENTRATO L'AP sta entrando nello stato di sonno profondo. La VMCU dovrebbe riaccendere l'AP dopo il tempo specificato nel secondo valore. Deve essere impostato
PROFONDO_SONNO_ESCI L'AP sta uscendo dallo stato di sonno profondo.
HIBERNATION_ENTRY L'AP sta entrando nello stato di ibernazione. La VMCU dovrebbe riaccendere l'AP dopo il tempo specificato nel secondo valore. Deve essere impostato
HIBERNATION_EXIT L'AP sta uscendo dallo stato di ibernazione.
ARRESTO_POSTPONE Android non è pronto per lo spegnimento. La VMCU dovrebbe attendere il tempo specificato nel secondo valore prima di spegnere l'AP. Android potrebbe richiedere un ulteriore rinvio emettendo ulteriori report SHUTDOWN_POSTPONE. Deve essere impostato
ARRESTO_PREPARE Android si sta preparando allo spegnimento. Deve essere impostato
SPEGNIMENTO_AVVIO AP è pronto per l'arresto. La VMCU dovrebbe riaccendere l'AP dopo il tempo specificato nel secondo valore. (Non è necessario che la VMCU supporti la funzione di accensione temporizzata.) Deve essere impostato
SPEGNIMENTO_ANNULLATO Android sta cessando di prepararsi allo spegnimento e procederà con WAIT_FOR_VHAL.
SU Android funziona normalmente.

Lo stato può essere impostato autonomamente o in risposta a una richiesta tramite VMCU.

AP_POWER_STATE_REQ

Questa proprietà viene inviata dalla VMCU per far passare Android in uno stato di alimentazione diverso e contiene due numeri interi:

  • int32Values[0] : valore enum VehicleApPowerStateReq , che rappresenta il nuovo stato in cui effettuare la transizione.
  • int32Values[1] : valore enum VehicleApPowerStateShutdownParam . Questo valore viene inviato solo per un messaggio SHUTDOWN_PREPARE e trasmette ad Android le opzioni in esso contenute.

Il primo valore intero rappresenta il nuovo stato in cui transiterà Android. La semantica è definita in VehicleApPowerStateReq.aidl e fornita di seguito:

Nome del valore Descrizione
SU L'AP dovrebbe iniziare a funzionare completamente.
ARRESTO_PREPARE L'AP dovrebbe prepararsi a chiudere. Il secondo valore indica se all'AP è consentito posticipare lo spegnimento e se deve aspettarsi lo spegnimento o l'entrata in modalità di sospensione profonda.
ANNULLA_SPEGNIMENTO L'AP dovrebbe smettere di prepararsi allo spegnimento e prepararsi ad andare ON.
FINITO L'AP verrà ora spento o sospeso.

VehicleApPowerStateShutdownParam è definito in VehicleApPowerStateShutdownParam.aidl . Questa enum ha questi elementi:

Nome del valore Descrizione
POTER DORMIRE L'AP può entrare in modalità di sospensione profonda invece di spegnersi completamente. È consentito rinviare.
CAN_HIBERNATE L'AP può entrare in ibernazione invece di spegnersi completamente. È consentito rinviare.
SPEGNIMENTO_SOLO L'AP dovrebbe spegnersi. È consentito rinviare. Il sonno profondo non è consentito.
DORMIRE_IMMEDIATAMENTE L'AP può entrare in modalità di sospensione profonda, ma deve entrare in modalità di sospensione o spegnersi immediatamente. Non è consentito rinviare.
HIBERNATE_IMMEDIATAMENTE L'AP può entrare in sospensione su disco, ma deve ibernare o spegnersi immediatamente. Non è consentito rinviare.
SPEGNERE_IMMEDIATAMENTE L'AP deve spegnersi immediatamente. Non è consentito rinviare. Il sonno profondo non è consentito.

Sorgenti di scia

L'integratore deve disabilitare le sorgenti di riattivazione appropriate quando il dispositivo è in modalità di sospensione. Le fonti di riattivazione comuni includono battiti cardiaci, modem, Wi-Fi e Bluetooth. L'unica fonte di riattivazione valida deve essere un'interruzione dalla VMCU per riattivare il SoC. Ciò presuppone che la VMCU possa ascoltare il modem per eventi di riattivazione remota (come l'avvio remoto del motore). Se questa funzionalità viene inviata all'AP, è necessario aggiungere un'altra fonte di riattivazione per servire il modem.

App

Gli OEM devono fare attenzione a scrivere app in modo che possano essere chiuse rapidamente e non rinviare il processo indefinitamente.

Appendice

Directory nell'albero del codice sorgente

Contenuto Direttorio
Codice relativo a CarPowerManager. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService e così via. packages/services/Car/service/src/com/android/car/power
Servizi che si occupano di VHAL, come VehicleHal e HAlClient . packages/services/Car/service/src/com/android/car/hal
Interfaccia VHAL e definizioni delle proprietà. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
App di esempio per fornire qualche idea su CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Diagramma delle classi

Questo diagramma di classi mostra le classi e le interfacce Java nel sistema di gestione dell'alimentazione:

Diagramma della classe di potenza

Figura 4. Diagramma della classe di potenza.

Relazione oggettuale

La Figura 5 illustra quali oggetti hanno riferimenti ad altri oggetti. Un bordo significa che l'oggetto sorgente contiene un riferimento all'oggetto di destinazione. Ad esempio, VehicleHAL ha un riferimento a un oggetto PropertyHalService.

Diagramma di riferimento dell'oggetto

Figura 5. Diagramma di riferimento dell'oggetto.