Gestion de l'alimentation

Pour prendre en charge la gestion de l'alimentation spécifique aux véhicules, Android fournit un service CarPowerManagementService et une interface CarPowerManager.

Les transitions d'état sont déclenchées par l'unité de commande principale du véhicule (VMCU, Vehicle Master Control Unit). Pour communiquer avec le VMCU, les intégrateurs doivent implémenter plusieurs composants. Les intégrateurs sont responsables de l'intégration à la couche d'abstraction matérielle du véhicule (VHAL) et à l'implémentation du noyau. Les intégrateurs sont également responsables de la désactivation des sources de sortie de veille et de la garantie que les arrêts ne sont pas reportés indéfiniment.

Terminologie

Les termes suivants sont utilisés dans ce document :

processeur d'application (AP, application processor)
 Fait partie du système sur une puce (SoC).
Board Support Package (BSP)
Couche logicielle contenant le micrologiciel de démarrage et les pilotes spécifiques au matériel qui permettent à un système d'exploitation intégré de fonctionner dans un environnement matériel donné (une carte mère), intégrée au système d'exploitation intégré.
CarPowerManager (CPM)
Expose une API permettant aux applications de s'inscrire aux changements d'état de l'alimentation.
CarPowerManagementService (CPMS)
Coordonne les transitions d'état de l'alimentation, interagit avec la VHAL pour contrôler l'état de l'alimentation et effectue les appels finaux pour suspendre et arrêter.
CarPowerPolicyDaemon (CPPD)
Gère les règles d'alimentation et expose les interfaces AIDL pour que les processus natifs enregistrent les écouteurs de règles d'alimentation.
entrée ou sortie à usage général (GPIO, general purpose input/output)
Broche de signal numérique à usage général.
couche d'abstraction matérielle (HAL, Hardware Abstraction Layer)
 Couche logicielle avec laquelle tous les autres modules de niveau supérieur doivent interagir pour accéder aux fonctionnalités matérielles.
hiberner
 Également appelé Suspend-to-Disk (S2D/S4). Le SoC est placé en mode d'alimentation S4 (veille prolongée), et le contenu de la RAM est écrit sur un support non volatile (tel qu'une mémoire flash ou un disque). L'ensemble du système est ensuite mis hors tension.
processeur multimédia (MP, media processor)
 Consultez Système sur une puce (SoC).
circuit intégré de gestion de l'alimentation (PMIC, power management integrated circuit)
Puce utilisée pour gérer les besoins en énergie du système hôte.
système sur une puce (SoC)
Processeur principal qui exécute AAOS, généralement fourni par des fabricants tels qu'Intel, MediaTek, Nvidia, Qualcomm, Renesas et Texas Instruments.
suspendre
 Également appelé Suspend-to-RAM (S2R ou STR). Le SoC est placé en mode d'alimentation S3 et le processeur est éteint, tandis que la RAM reste sous tension.
HAL véhicule (VHAL)
 API Android utilisée pour interagir avec le réseau du véhicule. Le partenaire ou l'OEM de niveau 1 est responsable de l'écriture de ce module. Le réseau du véhicule peut utiliser n'importe quelle couche physique (CAN, LIN, MOST et Ethernet, par exemple). La VHAL fait abstraction de ce réseau de véhicules pour permettre à AAOS d'interagir avec le véhicule.
Processeur d'interface du véhicule (VIP)
 Consultez "MCU du véhicule".
Unité de commande principale du véhicule (VMCU)
Microcontrôleur qui fournit l'interface entre le réseau du véhicule et le SoC. Le SoC communique avec le VMCU via les signaux USB, UART, SPI et GPIO.

Conception du système

Cette section décrit comment AAOS représente l'état d'alimentation du processeur d'application et les modules qui implémentent le système de gestion de l'alimentation. Ce contenu décrit également le fonctionnement de ces modules ensemble et la façon dont les transitions d'état se produisent généralement.

Machine à états de l'alimentation de la voiture

AAOS utilise une machine à états pour représenter l'état d'alimentation de l'AP. La machine à états fournit les états illustrés ci-dessous :

Machine à états de l'alimentation de la voiture

Figure 1. Machine à états de l'alimentation de la voiture.

Les transitions les plus courantes sont mises en évidence en bleu. Voici les états et les transitions courantes :

  • Suspendre vers la RAM Le véhicule et le SoC sont éteints. Aucun code n'est exécuté. L'alimentation est maintenue pour la RAM du SoC.
  • Attendez VHAL. Lorsque le conducteur interagit avec le véhicule, par exemple en ouvrant une portière, le VMCU alimente le SoC. AAOS reprend l'exécution à partir de la suspension vers la RAM et passe à l'état "Attente de VHAL", où il attend la coordination avec le VHAL.
  • Activé Le VHAL indique à AAOS de passer à l'état "On" (Activé). Dans cet état, AAOS est entièrement opérationnel et interagit avec le conducteur.
  • Préparation avant la mise hors service Lorsque le conducteur a terminé de conduire, la VHAL indique à AAOS de passer à la phase de préparation à l'arrêt en envoyant SHUTDOWN_PREPARE. Dans cet état, les écouteurs de changement d'état de l'alimentation reçoivent STATE_PRE_SHUTDOWN_PREPARE. Cela sert d'avertissement précoce indiquant que l'arrêt est en cours.
  • Préparez-vous à l'arrêt. Lorsque tous les écouteurs sont terminés ou que le délai d'expiration de la préparation avant l'arrêt est atteint, le système Android passe à la phase de préparation avant l'arrêt du cœur, en informant les écouteurs avec STATE_SHUTDOWN_PREPARE. L'écran et le son sont désactivés, et AAOS n'interagit pas avec le conducteur. Le système Android est toujours en cours d'exécution et peut effectuer des opérations de nettoyage et de mise à jour, comme l'exécution du mode Garage.
  • Attendez que la VHAL ait terminé. À ce stade, AAOS informe le VHAL qu'il est prêt à s'éteindre. Le VMCU est censé mettre le SoC en veille profonde et couper l'alimentation du processeur d'application. AAOS est alors en état de suspension vers la RAM, bien qu'aucun code ne soit exécuté.

Modules de gestion de l'alimentation

Le système de gestion de l'alimentation se compose des modules suivants :

Nom du module Description
CarPowerManager API Java ou C++.
CarPowerManagementService Coordonne les transitions d'état de l'alimentation et délègue la gestion des règles d'alimentation au CarPowerPolicyDaemon.
CarPowerPolicyDaemon Gère les règles d'alimentation et communique avec les clients natifs des règles d'alimentation.
HAL véhicule Interface avec le VMCU.
Noyau Implémentation de la suspension vers la RAM ou le disque.

La fonctionnalité de veille prolongée/hibernation (suspension d'Android vers la RAM/le disque) est implémentée dans le noyau. Cette fonctionnalité est exposée à l'espace utilisateur sous la forme d'un fichier spécial situé à l'adresse /sys/power/state. AAOS est suspendu en écrivant mem ou disk dans ce fichier.

Le CPMS coordonne l'état de l'alimentation avec d'autres services et HAL. Le CPMS implémente la machine à états décrite ci-dessus et envoie des notifications à chaque observateur lorsqu'une transition d'état d'alimentation se produit. Ce service utilise également la VHAL pour envoyer des messages au matériel.

Le CPPD est la source de vérité pour les règles d'alimentation. Il gère les règles d'alimentation tout au long du cycle de vie de l'appareil et informe le CPMS, le VHAL et les autres écouteurs natifs des modifications apportées aux règles d'alimentation. Le CPMS délègue les demandes de modification des règles relatives à l'alimentation au CPPD.

Le CPMS communique avec le VMCU en lisant et en écrivant les propriétés VHAL liées à l'état de l'alimentation, telles que AP_POWER_STATE_REQ et AP_POWER_STATE_REPORT. Les applications peuvent utiliser l'interface définie dans le CPM pour surveiller les changements d'état de l'alimentation. Cette interface permet également aux applications d'enregistrer des écouteurs de règles d'alimentation. Cette API Java est annotée avec @SystemApi et @hide, ce qui la rend disponible uniquement pour les applications privilégiées. La relation entre ces modules, applications et services est illustrée ci-dessous :

Schéma de référence des composants d'alimentation

Figure 2. Schéma de référence des composants d'alimentation.

Séquence de messages

La section précédente décrivait les modules qui composent le système de gestion de l'alimentation. Cette section utilise les exemples enter deep sleep et exit deep sleep pour expliquer comment les modules et les applications communiquent :

Passer en sommeil profond

Seul le VMCU peut initier le mode veille prolongée. Une fois le mode veille profonde initié, le VMCU envoie une notification au CPMS via le VHAL. Le CPMS passe à l'état SHUTDOWN PREPARE et diffuse cette transition d'état à tous les observateurs (les applications et services qui surveillent le CPMS) en appelant la méthode onStateChanged() avec un nouvel ID d'état fourni par le CPM.

Le CPM sert d'intermédiaire entre les applications/services et le CPMS. La méthode onStateChanged() pour les applications/services est appelée de manière synchrone dans la méthode onStateChanged() du CPM. La plupart des applications et des services doivent terminer leur préparation avant de revenir de cet appel. Les services privilégiés sont autorisés à poursuivre leurs préparatifs de manière asynchrone après le retour pour PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER. Dans ce cas, le service privilégié est censé appeler complete() sur l'objet CompletablePowerStateChangeFuture fourni lorsqu'il a terminé sa préparation. Notez que la préparation asynchrone n'est pas autorisée pour SHUTDOWN_PREPARE. Avant que DEEP_SLEEP_ENTRY ne soit envoyé à la VHAL, le CPMS envoie régulièrement des demandes de report de l'arrêt à la VHAL.

Une fois que tous les objets CPM ont terminé les préparatifs d'arrêt, le CPMS envoie AP_POWER_STATE_REPORT au VHAL, qui informe ensuite le VMCU que l'AP est prêt à être suspendu. Le CPMS appelle également sa méthode de suspension, qui suspend le noyau.

La séquence décrite ci-dessus est illustrée ci-dessous :

Passer en sommeil profond

Figure 3. Passer en mode sommeil profond

Interfaces de programmation fournies par CPM

Cette section décrit l'API Java fournie par le CPM pour les applications et services système. Cette API permet au logiciel système :

  • Surveillez les changements d'état de l'alimentation du point d'accès.
  • Appliquez les règles d'alimentation.

Pour appeler les API fournies par le CPM, procédez comme suit :

  1. Pour obtenir l'instance CPM, appelez l'API Car.
  2. Appelez la méthode appropriée sur l'objet créé à l'étape 1.

Créer un objet CarPowerManager

Pour créer un objet CPM, appelez la méthode getCarManager() de l'objet Car. Cette méthode est une façade utilisée pour créer des objets CPM. Spécifiez android.car.Car.POWER_SERVICE comme argument pour créer un objet CPM.

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

CarPowerStateListener et enregistrement

Les applications et services système peuvent recevoir des notifications de changement d'état de l'alimentation en implémentant CarPowerManager.CarPowerStateListener. Cette interface définit une méthode onStateChanged(), qui est une fonction de rappel appelée lorsque l'état d'alimentation du CPMS est modifié. L'exemple suivant définit une nouvelle classe anonyme qui implémente l'interface :

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

Pour demander à cet objet d'écouteur de surveiller une transition d'état de l'alimentation, créez un thread d'exécution et enregistrez l'écouteur et ce thread dans l'objet CPM :

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

Lorsque l'état de l'alimentation est modifié, la méthode onStateChanged() de l'objet d'écouteur est appelée avec une valeur représentant le nouvel état de l'alimentation. L'association entre la valeur réelle et l'état d'alimentation est définie dans CarPowerManager et est indiquée dans le tableau suivant :

Nom Description
STATE_ON Saisissez l'état "Activé". Le système est entièrement opérationnel.
STATE_SHUTDOWN_CANCELLED L'arrêt est annulé et l'état de l'alimentation revient à la normale.
STATE_SHUTDOWN_ENTER Les applications doivent se nettoyer et être prêtes à être arrêtées.
STATE_POST_SHUTDOWN_ENTER La préparation de l'arrêt est terminée et le VMCU est prêt à être arrêté. Passez à l'état d'arrêt.
STATE_PRE_SHUTDOWN_PREPARE Le processus d'arrêt est demandé, mais CPMS ne le démarre pas encore. L'écran et le son sont toujours activés
STATE_SHUTDOWN_PREPARE Le mode Garage peut s'exécuter pendant cette période.
STATE_SUSPEND_ENTER Les applications doivent être nettoyées et prêtes pour la mise en veille avec mise en RAM.
STATE_POST_SUSPEND_ENTER Les préparatifs pour la suspension sur RAM sont terminés et le VMCU est prêt pour la suspension sur RAM. Passez à l'état de suspension.
STATE_SUSPEND_EXIT Sortir de la suspension ou reprendre après une suspension annulée.
STATE_HIBERNATION_ENTER Les applications sont censées se nettoyer et être prêtes pour l'hibernation.
STATE_POST_HIBERNATION_ENTER Les préparatifs pour la mise en veille prolongée sont terminés et le VMCU est prêt à passer en mode veille prolongée.
STATE_HIBERNATION_EXIT Sortir de l'hibernation ou reprendre une hibernation annulée.
STATE_WAIT_FOR_VHAL Le système démarre, mais attend d'établir une communication avec le VHAL avant de passer à l'état "ON".

Désinscription de CarPowerStateListener

Pour annuler l'enregistrement de tous les objets d'écouteur enregistrés auprès du CPM, appelez la méthode clearListener :

powerManager.clearListener();

Intégration du système à votre implémentation Android

Les intégrateurs sont responsables des éléments suivants :

  • Implémenter l'interface du noyau pour suspendre Android.
  • Implémentez les fonctions VHAL pour :
    • Propagez l'initiation de la suspension ou de l'arrêt de la voiture vers Android.
    • Envoyez le message "Prêt à l'arrêt" d'Android à la voiture.
    • Lancez l'arrêt ou la suspension d'Android via l'interface du noyau Linux.
  • Assurez-vous que toutes les sources de sortie de veille sont désactivées lorsque l'appareil est en veille.
  • Assurez-vous que les applications s'arrêtent assez rapidement pour ne pas reporter indéfiniment le processus d'arrêt.
  • Assurez-vous que le BSP active (ou désactive) les composants de l'appareil conformément à la stratégie d'alimentation afin de ne pas bloquer la suspension ou l'hibernation.

Interface du noyau : /sys/power/state

AAOS place un appareil en mode veille lorsqu'une application ou un service écrit mem pour la mise en veille avec RAM ou disk pour la mise en veille avec disque dans un fichier situé à l'adresse /sys/power/state. L'intégrateur doit fournir une fonction qui surveille ce fichier et met Linux en état de suspension. Cette fonction peut envoyer un GPIO au VMCU pour l'informer que l'appareil est complètement éteint. L'intégrateur est également responsable de la suppression des conditions de concurrence entre le VHAL qui envoie le message final au VMCU et le système qui passe en mode veille ou arrêt.

Responsabilité du VHAL

La VHAL fournit une interface entre le réseau du véhicule et Android. VHAL :

  • Propage l'initiation de la suspension ou de l'arrêt de la voiture à Android.
  • Envoie le message "arrêt prêt" d'Android à la voiture.
  • Lance l'arrêt ou la mise en veille d'Android via l'interface du noyau Linux.

Lorsque le CPMS informe le VHAL qu'il est prêt à s'arrêter, le VHAL envoie le message "shutdown ready" (arrêt prêt) au VMCU. En règle générale, les périphériques sur puce tels que UART, SPI et USB transmettent le message. Une fois le message envoyé, le CPMS appelle la commande du noyau pour suspendre ou arrêter l'appareil. Avant de le faire, le VHAL ou le BSP peuvent activer un GPIO pour indiquer au VMCU qu'il est possible de couper l'alimentation de l'appareil.

Le VHAL doit être compatible avec les propriétés suivantes, qui contrôlent la gestion de l'alimentation via le VHAL :

Nom Description
AP_POWER_STATE_REPORT Android signale les transitions d'état au VMCU avec cette propriété, en utilisant les valeurs d'énumération VehicleApPowerStateReport.
AP_POWER_STATE_REQ Le VMCU utilise cette propriété pour indiquer à Android de passer à différents états d'alimentation, à l'aide des valeurs d'énumération VehicleApPowerStateReq.

AP_POWER_STATE_REPORT

Utilisez cette propriété pour signaler l'état actuel de la gestion de l'alimentation d'Android. Cette propriété contient deux nombres entiers :

  • int32Values[0] : énumération VehicleApPowerStateReport de l'état actuel.
  • int32Values[1] : durée en millisecondes pour mettre en veille, suspendre ou arrêter. La signification de cette valeur dépend de la première valeur.

La première valeur peut prendre l'une des valeurs suivantes. VehicleApPowerStateReport.aidl contient des descriptions plus spécifiques, stockées dans hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle.

Nom de la valeur Description Deuxième valeur
WAIT_FOR_VHAL L'application de conduite autonome démarre et doit établir une communication avec le VHAL.
DEEP_SLEEP_ENTRY Le point d'accès passe en mode veille prolongée. Le VMCU doit réactiver l'AP après le délai spécifié dans la deuxième valeur. Doit être défini
DEEP_SLEEP_EXIT Le point d'accès quitte l'état de veille prolongée.
HIBERNATION_ENTRY Le point d'accès passe en mode veille. Le VMCU doit réactiver l'AP après le délai spécifié dans la deuxième valeur. Doit être défini
HIBERNATION_EXIT Le point d'accès quitte l'état d'hibernation.
SHUTDOWN_POSTPONE Android n'est pas prêt à s'éteindre. Le VMCU doit attendre le délai spécifié dans la deuxième valeur avant d'arrêter l'AP. Android peut demander un report supplémentaire en émettant des rapports SHUTDOWN_POSTPONE supplémentaires. Doit être défini
SHUTDOWN_PREPARE Android se prépare à s'éteindre. Doit être défini
SHUTDOWN_START Le point d'accès est prêt à être éteint. Le VMCU devrait réactiver le PA après le délai spécifié dans la deuxième valeur. (Le VMCU n'est pas tenu de prendre en charge la fonctionnalité d'allumage programmé.) Doit être défini
SHUTDOWN_CANCELLED Android cesse de se préparer à l'arrêt et passe à WAIT_FOR_VHAL.
ACTIVÉ Android fonctionne normalement.

L'état peut être défini de manière autonome ou en réponse à une requête via le VMCU.

AP_POWER_STATE_REQ

Cette propriété est envoyée par le VMCU pour faire passer Android à un autre état d'alimentation. Elle contient deux entiers :

  • int32Values[0] : valeur d'énumération VehicleApPowerStateReq, qui représente le nouvel état vers lequel effectuer la transition.
  • int32Values[1] : valeur d'énumération VehicleApPowerStateShutdownParam. Cette valeur n'est envoyée que pour un message SHUTDOWN_PREPARE et transmet à Android les options qu'il contient.

La première valeur entière représente le nouvel état dans lequel Android doit passer. La sémantique est définie dans VehicleApPowerStateReq.aidl et fournie ci-dessous :

Nom de la valeur Description
ACTIVÉ Le PA devrait commencer à fonctionner pleinement.
SHUTDOWN_PREPARE Le point d'accès doit se préparer à s'éteindre. La deuxième valeur indique si le point d'accès est autorisé à reporter l'arrêt et s'il doit s'attendre à s'éteindre ou à passer en sommeil profond.
CANCEL_SHUTDOWN Le point d'accès doit arrêter de se préparer à s'éteindre et se préparer à s'allumer.
FINISHED Le point d'accès sera alors arrêté ou suspendu.

VehicleApPowerStateShutdownParam est défini dans VehicleApPowerStateShutdownParam.aidl. Cette énumération comporte les éléments suivants :

Nom de la valeur Description
CAN_SLEEP Le point d'accès peut passer en mode sommeil profond au lieu de s'éteindre complètement. Le report est autorisé.
CAN_HIBERNATE Le point d'accès peut se mettre en veille prolongée au lieu de s'éteindre complètement. Le report est autorisé.
SHUTDOWN_ONLY Le point d'accès doit s'éteindre. Le report est autorisé. Le sommeil profond n'est pas autorisé.
SLEEP_IMMEDIATELY Le point d'accès peut passer en sommeil profond, mais doit se mettre en veille ou s'éteindre immédiatement. Le report n'est pas autorisé.
HIBERNATE_IMMEDIATELY L'AP peut passer en mode suspend-to-disk, mais doit immédiatement hiberner ou s'éteindre. Le report n'est pas autorisé.
SHUTDOWN_IMMEDIATELY Le point d'accès doit s'arrêter immédiatement. Le report n'est pas autorisé. Le sommeil profond n'est pas autorisé.

Sources d'activation

L'intégrateur doit désactiver les sources de réveil appropriées lorsque l'appareil est en mode suspendu. Les sources de réveil courantes incluent les battements de cœur, le modem, le Wi-Fi et le Bluetooth. La seule source de sortie de veille valide doit être une interruption du VMCU pour sortir le SoC de veille. Cela suppose que le VMCU peut écouter le modem pour les événements de sortie de veille à distance (comme le démarrage du moteur à distance). Si cette fonctionnalité est transférée au processeur d'applications, une autre source de sortie de veille pour desservir le modem doit être ajoutée.

Applications

Les OEM doivent veiller à écrire des applications qui peuvent être arrêtées rapidement et ne pas reporter le processus indéfiniment.

Annexe

Répertoires dans l'arborescence du code source

Content Annuaire
Code lié à CarPowerManager. packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService, etc. packages/services/Car/service/src/com/android/car/power
Services traitant de la VHAL, tels que VehicleHal et HAlClient. packages/services/Car/service/src/com/android/car/hal
Interface VHAL et définitions des propriétés. hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/
Exemple d'application pour vous donner une idée de CarPowerManager packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink

Diagramme de classes

Ce diagramme de classes affiche les classes et interfaces Java dans le système de gestion de l'alimentation :

Diagramme de classe de puissance

Figure 4. Diagramme de classe Power.

Relation entre les objets

La figure 5 illustre les objets qui contiennent des références à d'autres objets. Une arête signifie que l'objet source contient une référence à l'objet cible. Par exemple, VehicleHAL possède une référence à un objet PropertyHalService.

Diagramme de référence des objets

Figure 5. Diagramme de référence d'objet.