Norme relative al potere

Per garantire che i componenti hardware e software (come display, audio e interazione vocale) vengano attivati e disattivati selettivamente in base alle necessità, AAOS fornisce una policy di alimentazione, che consiste in un insieme di stati di accensione e spegnimento previsti per i componenti hardware e software. VHAL, o servizi del fornitore con privilegi di sistema, può applicare una nuova policy di alimentazione quando lo stato di alimentazione di Android cambia o quando vengono soddisfatte le condizioni che sta aspettando.

L'applicazione di una policy di alimentazione è consentita negli stati Wait for VHAL, On e Pre Shutdown Prepare (a volte con alcune limitazioni). A differenza di Wait for VHAL e On, non è possibile configurare un criterio di alimentazione predefinito per Pre Shutdown Prepare in un gruppo di criteri di alimentazione. Nella fase principale di preparazione allo spegnimento, la modalità Garage è in esecuzione e non deve essere interrotta da una modifica dello stato di alimentazione. Sebbene non sia possibile applicare una normale policy di alimentazione, nella fase di preparazione all'arresto del sistema viene applicata una policy di alimentazione speciale, ovvero la policy di alimentazione del sistema denominata nessuna interazione utente.

Stato di alimentazione di AAOS

I dispositivi AAOS seguono questo diagramma degli stati di alimentazione:

Diagramma dello stato di alimentazione di AAOS

Figura 1. Diagramma dello stato di alimentazione di AAOS.

Di seguito è descritto ogni stato di alimentazione:

Valore Descrizione
Off
  • Non viene fornita alimentazione fisica all'Application Processor (AP), alla memoria e alle periferiche.
Attendi VHAL
  • Quando il conducente interagisce con il veicolo (ad esempio aprendo una portiera), la VMCU alimenta l'AP, la memoria e le periferiche.
  • AAOS passa da uno dei tre stati (Off, Suspend-to-RAM (STR, Wait for VHAL to finish)) e poi entra in Wait for VHAL, dove attende il coordinamento con VHAL.
On
  • VHAL indica ad AAOS di entrare nello stato On. In questo stato, AAOS è in esecuzione e interagisce con il conducente.
  • Il display è controllato dalla policy di alimentazione e non dalle chiamate di attivazione/disattivazione del display Android per altri fattori di forma.
Shutdown prepare
  • Quando il conducente ha smesso di guidare, VHAL indica ad AAOS di entrare nella fase di preparazione all'arresto, che inizia con la fase di preparazione all'arresto preliminare, seguita dalla fase di preparazione all'arresto principale. Nella fase principale, il display e l'audio sono disattivati e AAOS non interagisce con il conducente. Il sistema Android è ancora in esecuzione e può aggiornare le app e il sistema Android. Al termine degli aggiornamenti, il sistema Android entra in attesa del completamento di VHAL.
Attendi il completamento di VHAL
  • AAOS comunica a VHAL che può essere arrestato. L'unità microcontrollore del veicolo (VMCU) dovrebbe mettere il System-on-Chip (SoC) in sospensione profonda e rimuovere l'alimentazione dall'AP. AAOS si trova quindi nello stato STR, anche se non viene eseguito alcun codice.
  • Se VHAL non viene completato e il conducente torna, l'unità principale (HU) deve passare direttamente a Wait for VHAL.
Sospensione alla RAM (STR)
  • Il veicolo e il PA sono spenti, non viene eseguito alcun codice e l'alimentazione viene mantenuta alla RAM del PA.
Sospensione su disco (STD)
  • Il veicolo e l'AP sono spenti, non viene eseguito alcun codice e non viene mantenuta l'alimentazione all'unità di elaborazione e alla RAM dell'AP.

Come viene definita la policy di alimentazione?

Gli implementatori definiscono le norme di alimentazione in /vendor/etc/automotive/power_policy.xml, che:

  • Definisce la policy di alimentazione.
  • Definisce i gruppi di policy di alimentazione, che includono la policy di alimentazione predefinita e vengono applicati automaticamente quando si verificano transizioni di stato di alimentazione.
  • Esegue l'override della policy di alimentazione del sistema.

Norme relative all'alimentazione

La policy di alimentazione è costituita da un insieme di stati di alimentazione previsti dei componenti hardware e software. AAOS supporta questi componenti nelle norme di alimentazione:

AUDIO
MEDIA
DISPLAY
BLUETOOTH
WI-FI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

I fornitori possono anche definire i propri componenti di alimentazione personalizzati da utilizzare con i criteri di alimentazione. Definisci componenti di alimentazione personalizzati nello stesso file XML dei criteri di alimentazione, come in questo esempio:

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

Gruppo di policy di alimentazione

Il gruppo di criteri di alimentazione specifica i criteri di alimentazione predefiniti da applicare automaticamente alle transizioni dello stato di alimentazione. I fornitori possono definire i criteri di alimentazione predefiniti per Wait for VHAL e On.

Policy di alimentazione del sistema

AAOS supporta due criteri di alimentazione del sistema: nessuna interazione utente e preparazione alla sospensione. Il criterio di alimentazione del sistema viene applicato quando il dispositivo entra in modalità silenziosa, modalità garage, sospensione alla RAM o sospensione su disco.

Le seguenti tabelle elencano il comportamento di ogni componente nelle norme di alimentazione del sistema. Gli implementatori possono ignorare il rilevamento di Bluetooth, NFC e dispositivo attendibile nella policy di alimentazione del sistema senza interazione dell'utente. Gli override vengono applicati in /vendor/etc/automotive/power_policy.xml.

nessuna interazione utente

Il comportamento del criterio di alimentazione del sistema nessuna interazione utente è definito in questa tabella:

Componenti Stato alimentazione Configurabile
Audio Off No
Media Off No
Display Off No
Bluetooth Off Sì
Wifi On No
Cellulare On No
Ethernet On No
Proiezione Off No
NFC Off Sì
Input Off No
Assistente Off No
Interazione utente Off No
Rilevamento di dispositivi attendibili per l'accesso dell'utente On Sì
Località Off No
Microfono Off No
CPU On No

sospendi preparazione

Il comportamento della policy di alimentazione del sistema suspend prep è definito in questa tabella:

Componenti Stato di alimentazione Configurabile dall'OEM
Audio Off No
Media N/D No
Display N/D No
Bluetooth Off No
Wifi Off No
Cellulare N/D No
Ethernet N/D No
Proiezione N/D No
NFC N/D No
Input N/D No
Assistente N/D No
Interazione utente N/D No
Rilevamento di dispositivi attendibili per l'accesso dell'utente N/D No
Località Off No
Microfono Off No
CPU Off No

Interazione con VHAL

Il daemon della policy di alimentazione dell'auto in esecuzione nel livello di sistema sottoscrive due proprietà per ascoltare le richieste di VHAL:

  • POWER_POLICY_REQ il VHAL scrive l'ID della policy di alimentazione in questa proprietà.
  • POWER_POLICY_GROUP_REQ VHAL scrive l'ID del gruppo di policy di alimentazione in questa proprietà.

La norma di alimentazione corrente nel sistema può essere modificata da moduli diversi da VHAL. In questo caso, il daemon della policy di alimentazione dell'auto aggiorna la proprietà CURRENT_POWER_POLICY per comunicare la modifica alla VHAL.

Interazione con i processi nativi

CarPowerManagementService (CPMS) delega la gestione delle norme di alimentazione al daemon delle norme di alimentazione dell'auto. Il daemon è la Single Source Of Truth per le norme di alimentazione del sistema. Il daemon della policy di alimentazione dell'auto gestisce lo stato della policy di alimentazione e notifica le modifiche a CPMS, VHAL e altri client nativi.

Il daemon della policy di alimentazione dell'auto esporta interfacce AIDL per l'utilizzo da parte di HAL e altri processi nativi. Possono ricevere una notifica quando viene modificata una nuova policy di alimentazione. In altre parole, quando ciascuno deve cambiare il proprio stato di alimentazione.

ICarPowerPolicyServer.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;
  import android.frameworks.automotive.powerpolicy.CarPowerPolicyFilter;
  import android.frameworks.automotive.powerpolicy.ICarPowerPolicyChangeCallback;
  import android.frameworks.automotive.powerpolicy.PowerComponent;

  /**
   * ICarPowerPolicyServer is an interface implemented by the power policy daemon.
   * VHAL changes the power policy and the power policy daemon notifies the change to
   * registered subscribers. When subscribing to policy changes, a filter can be specified so
   * that the registered callbacks can listen only to a specific power component's change.
   */

  @VintfStability
  interface ICarPowerPolicyServer {
    /**
     * Gets the current power policy.
     * @throws IllegalStateException if the current policy is not set.
     */
    CarPowerPolicy getCurrentPowerPolicy();

    /**
     * Gets whether the power component is turned on or off.
     *
     * @param componentId Power component ID defined in PowerComponent.aidl to check power
     * state.
     * @return True if the component's power state is on.
     * @throws IllegalArgumentException if the componentId is invalid.
     */
    boolean getPowerComponentState(in PowerComponent componentId);

    /**
     * Subscribes to power policy change.
     * Notification is sent to the registered callback when the power policy changes and the
     * power state of the components which the callback is interested in changes.
     *
     * @param callback Callback that is invoked when the power policy changes.
     * @param filter The list of components which the callback is interested in.
     * @throws IllegalArgumentException if the callback is already registered.
     * @throws IllegalStateException if the callback is dead.
     */
    void registerPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback,
        in CarPowerPolicyFilter filter);

    /**
     * Unsubscribes from power policy change.
     *
     * @param callback Callback that doesn't want to receive power policy change.
     * @throws IllegalArgumentException if the callback is not registered.
     */
    void unregisterPowerPolicyChangeCallback(in ICarPowerPolicyChangeCallback callback);

    /**
     * Applies the power policy.
     *
     * 

{@code policyId} should be one of power policy IDs defined in * {@code /vendor/etc/automotive/power_policy.xml} or predefined system power policies. * * @param policyId ID of power policy. * @throws IllegalArgumentException if {@code policyId} is invalid. */ void applyPowerPolicy(in @utf8InCpp String policyId); /** * Sets the current power policy group. * *

{@code policyGroupId} should be one of power policy group IDs defined in * {@code /vendor/etc/automotive/power_policy.xml}. * * @param policyGroupId ID of power policy group. * @throws IllegalArgumentException if {@code policyGroupId} is invalid. */ void setPowerPolicyGroup(in @utf8InCpp String policyGroupId); }

ICarPowerPolicyChangeCallback.aidl

  package android.frameworks.automotive.powerpolicy;

  import android.frameworks.automotive.powerpolicy.CarPowerPolicy;

  /**
   * ICarPowerPolicyChangeCallback is notified when a power policy changes.
   */

  @VintfStability
  oneway interface ICarPowerPolicyChangeCallback {
    /**
     * Called when a power policy is fully changed.
     *
     * @param policy The current policy.
     */
    void onPolicyChanged(in CarPowerPolicy policy);
  }

Interazione con i moduli Java

CarPowerManager fornisce metodi per abilitare la gestione delle policy di alimentazione:

  • Ottieni la policy di alimentazione attuale
  • Applicare una nuova policy di alimentazione
  • Imposta un nuovo gruppo di policy di alimentazione

Solo i moduli con privilegi di sistema possono utilizzare i metodi. I moduli che vogliono essere informati quando viene applicato un criterio di alimentazione possono registrare un listener di modifica del criterio di alimentazione per CarPowerManager