Règlement sur l'alimentation

Pour s'assurer que les composants matériels et logiciels (tels que l'écran, l'audio et l'interaction vocale) sont activés et désactivés de manière sélective, AAOS fournit une règle d'alimentation, qui consiste en un ensemble d'états d'activation et de désactivation attendus pour les composants matériels et logiciels. La VHAL ou les services de fournisseurs disposant de droits système peuvent appliquer une nouvelle règle d'alimentation lorsque l'état d'alimentation d'Android change ou lorsque les conditions qu'ils attendent sont remplies.

L'application d'une règle d'alimentation est autorisée dans les états "Attendre VHAL", "Activé" et "Préparation avant l'arrêt" (parfois avec certaines restrictions). Contrairement à "Attendre le VHAL" et "Activé", une règle d'alimentation par défaut ne peut pas être configurée pour "Préparation avant l'arrêt" dans un groupe de règles d'alimentation. Dans la phase principale de préparation de l'arrêt, le mode Garage est en cours d'exécution et ne doit pas être perturbé par un changement d'état d'alimentation. Bien qu'une règle d'alimentation standard ne puisse pas être appliquée, une règle d'alimentation spéciale, qui est la règle d'alimentation du système nommée aucune interaction utilisateur, est appliquée lors de la phase principale de préparation de l'arrêt.

État de l'alimentation AAOS

Les appareils AAOS suivent ce schéma d'état d'alimentation :

Schéma de l'état de l'alimentation AAOS

Figure 1. Diagramme d'état d'alimentation AAOS.

Chaque état d'alimentation est décrit ci-dessous :

Valeur Description
Désactivé
  • Aucune alimentation n'est physiquement fournie au processeur d'application (AP), à la mémoire et aux périphériques.
Attendre la VHAL
  • Lorsque le conducteur interagit avec le véhicule (par exemple, en ouvrant une porte), la VMCU alimente l'AP, la mémoire et les périphériques.
  • AAOS passe de l'un des trois états (Désactivé, Suspendre vers la RAM (STR, Attendre que la VHAL se termine)) à l'état "Attendre la VHAL", où il attend la coordination avec la VHAL.
Activé
  • La VHAL indique à AAOS de passer à l'état "On". Dans cet état, AAOS est entièrement opérationnel et interagit avec le conducteur.
  • L'affichage est contrôlé par la règle d'alimentation, et non par les appels d'activation/de désactivation de l'affichage Android pour d'autres facteurs de forme.
Préparation de l'arrêt
  • Lorsque le conducteur a arrêté de conduire, la VHAL demande à AAOS de passer à l'état "Shutdown Prepare" (Préparation de l'arrêt), qui commence par la phase "Pre Shutdown Prepare" (Préparation avant l'arrêt), suivie de la phase principale "Shutdown Prepare" (Préparation de l'arrêt). Dans la phase principale, l'écran et l'audio sont désactivés, et l'AAOS n'interagit pas avec le conducteur. Le système Android est toujours en cours d'exécution et peut mettre à jour les applications et le système Android. Une fois les mises à jour terminées, le système Android passe à l'état "Attendre la fin de la VHAL".
Attendre la fin de la VHAL
  • AAOS informe la VHAL qu'elle peut être arrêtée. Le microcontrôleur du véhicule (VMCU) doit placer le système sur puce (SoC) en veille profonde et couper l'alimentation du processeur d'application. AAOS est alors à l'état STR, bien qu'aucun code ne soit exécuté.
  • Si la VHAL ne se termine pas et que le conducteur revient, l'unité principale doit passer directement à l'état "Attendre la VHAL".
Suspend-to-RAM (STR)
  • Le véhicule et le processeur d'application sont éteints, aucun code n'est exécuté et l'alimentation de la RAM du processeur d'application est maintenue.
Suspension sur disque (STD)
  • Le véhicule et le PA sont éteints, aucun code n'est exécuté et l'unité de traitement et la RAM du PA ne sont pas alimentées.

Comment la règle de gestion de l'alimentation est-elle définie ?

Les implémenteurs définissent les règles d'alimentation dans /vendor/etc/automotive/power_policy.xml, qui :

  • Définit la règle d'alimentation.
  • Définit les groupes de règles d'alimentation, qui incluent la règle d'alimentation par défaut et sont automatiquement appliqués lors des transitions d'état d'alimentation.
  • Remplace la règle d'alimentation du système.

Règles d'alimentation

La règle d'alimentation se compose d'un ensemble d'états d'alimentation attendus des composants matériels et logiciels. AAOS accepte les composants suivants dans la règle d'alimentation :

AUDIO
MEDIA
DISPLAY
BLUETOOTH
WIFI
CELLULAR
ETHERNET
PROJECTION
NFC
INPUT
VOICE_INTERACTION
VISUAL_INTERACTION
TRUSTED_DEVICE_DETECTION
LOCATION
MICROPHONE
CPU

Les fournisseurs peuvent également définir leurs propres composants d'alimentation personnalisés à utiliser avec les règles d'alimentation. Définissez des composants d'alimentation personnalisés dans le même fichier XML que les règles d'alimentation, comme dans cet exemple :

<customComponents>
  CUSTOM_COMPONENT_1000
  CUSTOM_COMPONENT_SPECIAL_SENSOR
  CUSTOM_COMPONENT_AUX_INPUT
</customComponents>

Groupe de règles d'alimentation

Le groupe de règles d'alimentation spécifie la règle d'alimentation par défaut à appliquer automatiquement lors des transitions d'état d'alimentation. Les fournisseurs peuvent définir la règle d'alimentation par défaut pour les états "Wait for VHAL" (Attente de la VHAL) et "On" (Activé).

La règle d'alimentation par défaut pour "Attendre le VHAL" ou "Activé" est appliquée à chaque transition vers cet état, y compris lorsqu'un arrêt est annulé et qu'Android revient à l'état "Attendre le VHAL". Si aucune règle d'alimentation par défaut n'est définie pour un état donné dans le groupe de règles d'alimentation actuel, le daemon de règle d'alimentation de la voiture applique une règle d'alimentation intégrée. Une exception s'applique lorsque le système est en mode silencieux : le daemon de règle d'alimentation de la voiture enregistre la règle d'alimentation standard actuelle ou demandée comme étant en attente, verrouille les modifications de la règle d'alimentation standard et applique la règle d'alimentation du système sans interaction de l'utilisateur. L'application d'une règle d'alimentation ne modifie que les composants couverts par la règle, laissant les composants non concernés dans leur état actuel.

Règles d'alimentation du système

AAOS est compatible avec deux règles d'alimentation du système : aucune interaction utilisateur et préparation de la suspension. La règle d'alimentation du système est appliquée lorsque l'appareil passe en mode silencieux, en mode Garage, en mode Suspend-to-RAM ou en mode Suspend-to-disk.

Les tableaux suivants décrivent le comportement de chaque composant dans la règle d'alimentation du système. Les implémenteurs peuvent ignorer la détection du Bluetooth, du NFC et des appareils vérifiés dans la règle d'alimentation du système sans interaction de l'utilisateur. Les remplacements sont appliqués dans /vendor/etc/automotive/power_policy.xml.

aucune interaction de l'utilisateur

Le comportement de la règle d'alimentation du système Aucune interaction utilisateur est défini dans ce tableau :

Composants État de l'alimentation Configurable
Audio Désactivé Non
Multimédia Désactivé Non
Écran Désactivé Non
Bluetooth Désactivé Oui
Wi-Fi Activé Non
Mobile Activé Non
Ethernet Activé Non
Projection Désactivé Non
NFC Désactivé Oui
Entrée Désactivé Non
Assistant Désactivé Non
Interaction de l'utilisateur Désactivé Non
Détection des appareils de confiance pour la connexion des utilisateurs Activé Oui
Emplacement Désactivé Non
Micro Désactivé Non
Processeur Activé Non

suspendre la préparation

Le comportement de la règle d'alimentation du système suspend prep est défini dans ce tableau :

Composants État d'alimentation Configurable par l'OEM
Audio Désactivé Non
Multimédia N/A Non
Écran N/A Non
Bluetooth Désactivé Non
Wi-Fi Désactivé Non
Mobile N/A Non
Ethernet N/A Non
Projection N/A Non
NFC N/A Non
Entrée N/A Non
Assistant N/A Non
Interaction de l'utilisateur N/A Non
Détection des appareils de confiance pour la connexion des utilisateurs N/A Non
Emplacement Désactivé Non
Micro Désactivé Non
Processeur Désactivé Non

Interaction avec la VHAL

Le daemon de la règle d'alimentation de la voiture qui s'exécute dans la couche système s'abonne à deux propriétés pour écouter les requêtes de la VHAL :

  • POWER_POLICY_REQ : le VHAL écrit l'ID de la règle d'alimentation dans cette propriété.
  • POWER_POLICY_GROUP_REQ : le VHAL écrit l'ID du groupe de règles d'alimentation dans cette propriété.

La règle d'alimentation actuelle du système peut être modifiée par des modules autres que la VHAL. Dans ce cas, le daemon de la règle d'alimentation de la voiture met à jour la propriété CURRENT_POWER_POLICY pour notifier la modification au VHAL.

Interaction avec les processus natifs

Le service CarPowerManagementService (CPMS) délègue la gestion des règles d'alimentation au daemon de règles d'alimentation de la voiture. Le daemon est la source unique de vérité pour les règles d'alimentation du système. Le daemon de règle d'alimentation de la voiture gère l'état de la règle d'alimentation et informe le CPMS, le VHAL et les autres clients natifs des modifications.

Le daemon de règle d'alimentation de la voiture exporte les interfaces AIDL pour qu'elles soient utilisées par les HAL et d'autres processus natifs. Ils peuvent être avertis lorsqu'une nouvelle règle d'alimentation est modifiée. En d'autres termes, quand chacun doit changer d'état d'alimentation.

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);
  }

Interaction avec les modules Java

CarPowerManager fournit des méthodes pour activer la gestion des règles d'alimentation :

  • Obtenir la stratégie d'alimentation actuelle
  • Appliquer une nouvelle règle d'alimentation
  • Définir un nouveau groupe de règles d'alimentation

Seuls les modules disposant de droits système peuvent utiliser les méthodes. Les modules qui souhaitent être informés lorsqu'une règle d'alimentation est appliquée peuvent enregistrer un écouteur de modification de règle d'alimentation sur CarPowerManager.