Architecture

La plupart des modifications nécessaires pour prendre en charge VirtIO dans AAOS impliquent des modifications au niveau de l'implémentation HAL et en dessous dans le noyau commun Android. Le framework Android communique avec un HAL générique indépendant du matériel à l'aide des pilotes VirtIO dans le noyau de la VM invitée AAOS, qui communique avec les appareils VirtIO côté hôte à l'aide de protocoles VirtIO. Les appareils VirtIO côté hôte peuvent accéder au matériel physique à l'aide de pilotes d'appareils spécifiques au SoC.

La communication entre le pilote VirtIO et l'appareil VirtIO se fait avec virtqueue, qui sont des tampons en anneau de type DMA de listes de collecte de données. Plusieurs transports, tels que MMIO ou PCI, peuvent être utilisés pour échanger les messages VirtIO entre les VM.

Dans certains cas, vsock a été utilisé pour la communication inter-VM. Les communications HAL du véhicule, le contrôle audio et les communications Dumpstate sont compatibles avec une connexion à un agent pair sur une VM distincte via une interface vsock. GRPC-vsock permet d'accéder à ces sous-systèmes non standardisés. GRPC dans l'arborescence source Android a été modifié pour fonctionner avec vsock avec le format d'adresse vsock:CID:PORT_NUMBER.

Architecture de virtualisation
Figure 1. Architecture de virtualisation

Audio

Dans AAOS virtualisé, la VM invitée Android peut utiliser virtio-snd pour accéder à l'audio. virtio-snd fournit les appareils PCM virtualisés à la VM Android afin que l'implémentation HAL audio puisse interagir avec les appareils audio virtualisés avec la bibliothèque TinyALSA.

L'implémentation HAL audio par défaut se trouve dans AOSP à l'emplacement /device/google/trout/hal/audio/6.0. Les OEM peuvent modifier ro.vendor.trout.audiohal.{in,out}_period_{ms,count} pour leur plate-forme. Les OEM peuvent également implémenter leur propre HAL audio en remplaçant les variables liées à l'audio dans /device/google/trout/aosp_trout_common.mk..

Le HAL de contrôle audio gère la priorité audio dans AAOS. Par exemple, lorsque le système diffuse des sons d'urgence, il peut être nécessaire de couper le son de la musique en arrière-plan. Dans ce cas, le HAL de contrôle audio informe les applications qui diffusent de la musique de couper le son. Dans le système virtualisé, les sons peuvent provenir d'autres VM. Dans l'implémentation de référence, un démon de serveur de contrôle audio s'exécute dans la VM invitée AAOS, qui utilise GRPC-vsock pour recevoir les requêtes de priorité audio d'autres VM. La VM hôte peut utiliser device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller pour envoyer des requêtes de contrôle audio à AAOS. Tant que libandroid_audio_controller détient la sélection audio, il continue d'envoyer des battements de cœur à AAOS jusqu'à ce que la sélection soit libérée.

Architecture audio
Figure 5 : Architecture audio

Bluetooth

L'implémentation Bluetooth est basée sur la conception illustrée ci-dessous.

Architecture Bluetooth
Figure 5 : Architecture Bluetooth

Profil mains libres Bluetooth

Pour activer le profil mains libres Bluetooth (HFP) sur trout, la spécification de l'appareil audio VirtIO a été étendue pour prendre en charge les commandes audio. Avec cette approche, un périphérique audio VirtIO côté hôte/hyperviseur fournit ces trois commandes audio liées au HFP:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Lorsque AAOS s'exécute en tant que VM invitée, il utilise TinyAlsa pour définir ces commandes audio. Pour activer le cas d'utilisation HFP, l'hôte/hyperviseur effectue le routage et le calibrage spécifiques au fournisseur en conséquence.

L'implémentation Bluetooth est basée sur l'illustration de conception ci-dessous.

Architecture Bluetooth
Figure 5 : Architecture Bluetooth

Dumpstate

Lorsque vous générez le rapport de bug pour l'AAOS virtualisé, il est utile d'inclure des informations sur la VM hôte afin que les développeurs aient une vue plus complète du système. Pour ce faire, l'implémentation de référence trout implémente le HAL IDumpstateDevice, qui collecte les informations sur la VM hôte via GRPC-vsock. Les informations de la VM hôte empaquetées avec "tar" sont nommées dumpstate_board.bin dans le rapport de bug, tandis que les journaux de vidage se trouvent dans dumpstate_board.txt.

Pour configurer les commandes à exécuter:

  1. Copiez les détails de configuration du fichier ci-dessous dans un fichier XML, par exemple config.xml.
    <dumpstateHalConfiguration version="1.0">
        <services>
            <service name="coqos-virtio-blk"        command="/bin/journalctl --no-pager -t coqos-virtio-blk"/>
            <service name="coqos-virtio-net"        command="/bin/journalctl --no-pager -t coqos-virtio-net"/>
            <service name="coqos-virtio-video"      command="/bin/journalctl --no-pager -t coqos-virtio-video"/>
            <service name="coqos-virtio-console"    command="/bin/journalctl --no-pager -t coqos-virtio-console"/>
            <service name="coqos-virtio-rng"        command="/bin/journalctl --no-pager -t coqos-virtio-rng"/>
            <service name="coqos-virtio-vsock"      command="/bin/journalctl --no-pager -t coqos-virtio-vsock"/>
            <service name="coqos-virtio-gpu-virgl"  command="/bin/journalctl --no-pager -t coqos-virtio-gpu-virgl"/>
            <service name="coqos-virtio-scmi"       command="/bin/journalctl --no-pager -t coqos-virtio-scmi"/>
            <service name="coqos-virtio-input"      command="/bin/journalctl --no-pager -t coqos-virtio-input"/>
            <service name="coqos-virtio-snd"        command="/bin/journalctl --no-pager -t coqos-virtio-snd"/>
            <service name="dumpstate_grpc_server"   command="/bin/journalctl --no-pager -t dumpstate_grpc_server"/>
            <service name="systemd"                 command="/bin/journalctl --no-pager -t systemd"/>
            <service name="systemctl"               command="/bin/systemctl status"/>
            <service name="vehicle_hal_grpc_server" command="/bin/journalctl --no-pager -t vehicle_hal_grpc_server"/>
        </services>
        <systemLogs>
            <service name="dmesg" command="/bin/dmesg -kuPT"/>
        </systemLogs>
    </dumpstateHalConfiguration>
    
  2. Transmettez le chemin d'accès au nouveau fichier XML au serveur dumpstate au moment du lancement. Exemple :
    --config_file my_config.xml
    

Système de vue étendue (EVS)

Le système de vue étendue (EVS, Extended View System) permet d'afficher la vidéo capturée par les caméras arrière et panoramique. Dans AAOS virtualisé, la pile EVS peut accéder au flux vidéo à partir de l'appareil de streaming V4L2 virtualisé qui utilise le pilote VirtIO-video.

Mode Garage

Pour en savoir plus, consultez la section Mode Garage.

L'activation et la désactivation du mode Garage sont déclenchées par les propriétés AP_POWER_STATE_REQ envoyées par la couche d'abstraction du matériel du véhicule. En mode virtualisation, le mode Garage est déclenché côté hôte. La VM hôte doit rester allumée pour fournir des appareils virtuels à la VM Android jusqu'à ce qu'Android soit éteint. Le serveur VHAL sur la VM hôte envoie le signal d'arrêt à la VM invitée AAOS. À la réception du signal client VHAL, la VM AAOS passe en mode Garage et commence à envoyer des signaux de battement de cœur pour maintenir la VM hôte active.

Système de navigation par satellite global (GNSS)

Dans trout 1.0, la prise en charge de la virtualisation GNSS sur virtio-console a été ajoutée. L'implémentation permet d'échanger des mesures brutes et des corrections de position de l'hôte vers l'invité.

Le format d'échange de données est le CSV utilisé par l'application GnssLogger. Dans l'implémentation de référence, comme le pilote GNSS natif n'est pas disponible, des données fictives sont mises à disposition, mais un pilote natif peut être implémenté sans aucune modification côté invité. Un exemple d'agent hôte fictif est fourni dans le code source trout.

L'implémentation actuelle s'attend à ce que l'environnement de l'OS hôte gère l'initialisation du GNSS et du GNSS assisté (AGNSS).

Architecture GNSS
Figure 2. Architecture GNSS

Graphiques

Lorsque AAOS s'exécute en tant que VM invitée avec d'autres systèmes d'exploitation automobiles, Android n'a peut-être pas accès direct au GPU ni au contrôleur d'affichage. Dans ce cas, Mesa ou goldfish-opengl et un pilote virtio-gpu sur la VM invitée Android et l'appareil virtio-gpu peuvent être utilisés pour accéder au GPU.

Sur la VM invitée Android, Mesa ou goldfish-opengl encode les commandes OpenGLES dans un flux Gallium ou un flux GLES généré automatiquement, respectivement. Le pilote de kernel virtio-gpu est utilisé comme transport. Côté hôte, virglrenderer (pour Mesa) et vulkan-cereal (pour goldfish-opengl) rejouent le flux de commandes décodé au-dessus du pilote GPU existant. La plate-forme de référence trout d'AAOS est compatible avec OpenGL ES uniquement avec la prise en charge de Vulkan, prévue dans une prochaine version.

Architecture graphique
Figure 3. Architecture graphique

Capteurs

Lorsque AAOS s'exécute en tant que VM invitée avec d'autres systèmes d'exploitation automobiles, Android peut ne pas avoir un accès direct aux capteurs. Dans ce cas, le pilote Virtio-SCMI sur la VM invitée Android et l'appareil Virtio-SCMI sur la VM hôte sont utilisés pour accéder aux capteurs. La plate-forme de référence de virtualisation AAOS fournit un HAL de capteur générique et indépendant du matériel qui peut être utilisé par les SoC ARM pour accéder aux capteurs.

Le HAL du capteur communique avec le pilote SCMI IIO dans le sous-système IIO du kernel Linux, qui utilise le protocole de gestion des capteurs SCMI fourni par la spécification ARM SCMI (System Control and Management Interface) pour découvrir et configurer les capteurs, lire les données des capteurs et être informé des modifications de valeur des capteurs.

Le pilote SCMI IIO utilise le pilote SCMI VirtIO, qui utilise le protocole de transport VirtIO comme spécifié dans la spécification virtio-scmi pour échanger des messages SCMI avec l'appareil SCMI VirtIO sur la VM hôte. L'appareil VirtIO SCMI a un accès direct aux capteurs via des pilotes de capteurs spécifiques au SoC.

Architecture des capteurs
Figure 4. Architecture des capteurs

Emplacement du HAL du capteur

L'implémentation de référence du HAL du capteur, qui utilise VirtIO SCMI, se trouve dans device/google/trout/hal/sensors.

Configuration du HAL du capteur

Le HAL du capteur peut être amené à modifier les données du capteur reçues de la VM hôte pour se conformer au système de coordonnées des capteurs de voiture Android. Le schéma de configuration des capteurs se trouve dans device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd.

Les OEM peuvent fournir la configuration des capteurs, comme l'orientation et l'emplacement, dans sensor_hal_configuration.xml et copier le fichier dans /odm/etc/sensors/ ou /vendor/etc/sensors/. Vous trouverez ci-dessous un exemple de configuration de capteur:

<sensorHalConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module halName="android.hardware.sensors@2.0-Google-IIO-Subhal" halVersion="2.0">
            <sensors>
                <sensor name="scmi.iio.accel" type="1">
                    <configuration>
<!-- Attribute rotate denotes if HAL needs to modify the sensor data to comply with //
        the Android car sensor coordinate system -->
                        <orientation rotate="true">
               <!-- Attribute map denotes the indexes of data in sensor data received -->
               <!-- Attribute negate denotes if data needs to be negated -->
                            <x map="0" negate="false"/>
                            <y map="1" negate="true"/>
                            <z map="2" negate="true"/>
                        </orientation>
                        <location>
               <!-- Attribute x, y, z denotes location of the sensor placement -->
                            <x>10</x>
                            <y>15</y>
                            <z>20</z>
                        </location>
                    </configuration>
                </sensor>
         </sensors>
        </module>
    </modules>
</sensorHalConfiguration>

HAL véhicule

L'implémentation du HAL du véhicule se compose de deux composants:

  • Client Fournit les API utilisées par Android dans AAOS virtualisé
  • Serveur Il communique directement avec le matériel, comme les bus du véhicule (ou un émulateur).

En virtualisation, le serveur VHAL s'exécute sur la VM hôte. Le client et le serveur VHAL communiquent via GRPC-vsock (pour en savoir plus, consultez device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto). Les OEM peuvent utiliser un protocole de transport autre que GRPC en remplaçant les API de communication. Pour obtenir des exemples, consultez device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp.

Autres sous-systèmes

VirtIO fournit déjà une interface bien définie pour des composants tels que le stockage en mode bloc, le réseau, la console, l'entrée, le socket et l'entropie. Pour ces sous-systèmes, AAOS utilise le pilote tel quel, par exemple virtio-blk, virtio-input, virtio-console et virtio-net.

Dans la plate-forme de référence AAOS virtualisée, le Wi-Fi est compatible avec mac80211_hwsim pour activer un réseau sans fil VirtWifi, qui utilise ensuite le tunnel virtio-net pour envoyer le trafic réseau à la VM hôte, qui a un accès direct au réseau Wi-Fi réel.