La plupart des modifications nécessaires à la compatibilité de VirtIO dans AAOS concernent le HAL. niveau d'implémentation et niveaux inférieurs dans le noyau commun d'Android. Le framework Android communique avec un HAL générique indépendant du matériel à l'aide des pilotes VirtIO dans l'invité AAOS Le noyau de VM, qui communique avec les périphériques 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 spécifiques au SoC.
La communication entre le pilote VirtIO et l'appareil VirtIO a lieu
virtqueue
, qui sont des tampons circulaires de type DMA pour les listes de diffusion de données.
Plusieurs transports, tels que
MMIO
ou
PCI
permet d'échanger les messages VirtIO entre les VM.
Dans certains cas, vsock
a été utilisé pour la communication entre VM.
Les communications HAL du véhicule, Audio Control et 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
de l'arborescence source Android a été modifié pour fonctionner avec vsock
avec l'adresse
le format vsock:CID:PORT_NUMBER
.
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 le
l'implémentation HAL audio peut interagir avec les appareils audio virtualisés à l'aide de
bibliothèque TinyALSA.
L'implémentation HAL audio par défaut se trouve dans AOSP, à l'adresse
/device/google/trout/hal/audio/6.0
Les OEM peuvent modifier
ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
pour sa plate-forme. Les OEM peuvent
ou implémenter sa propre HAL audio en remplaçant les variables audio dans
/device/google/trout/aosp_trout_common.mk.
La commande audio HAL gère la priorité audio dans AAOS. Par exemple, lorsque le système lit
des alertes d'urgence, vous devrez peut-être couper le son de la musique diffusée en arrière-plan. La commande audio HAL
demande aux applications qui diffusent de la musique de couper le son. Dans le système virtualisé,
les sons peuvent provenir d'autres VM. Dans la mise en œuvre de référence, la VM invitée AAOS
dispose d'un daemon de serveur de contrôle audio en cours d'exécution, 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. Alors que libandroid_audio_controller
contient
le focus audio continue d'envoyer des pulsations à AAOS jusqu'à ce que le focus soit libéré.
Bluetooth
L'implémentation Bluetooth est basée sur la conception illustrée ci-dessous.
Profil Bluetooth mains libres
Pour activer le profil mains libres Bluetooth (HFP) sur trout
, l'appareil audio VirtIO
a été étendue pour prendre en charge les commandes audio. Avec cette approche, un son VirtIO
du côté de l'hôte/hyperviseur fournit les trois commandes audio suivantes liées à HFP:
hfp_enable
hfp_set_sampling_rate
hfp_volume
Lorsqu'AAOS s'exécute en tant que VM invitée, AAOS utilise TinyAlsa pour définir ces commandes audio. Pour activer HFP, procédez comme suit : cas d'utilisation, l'hôte/l'hyperviseur effectue le routage spécifique au fournisseur et le calibrage en conséquence.
L'implémentation du Bluetooth est basée sur l'illustration ci-dessous.
État de vidage
Lors de la génération du rapport de bug pour l'AAOS virtualisé, il est utile d'inclure les informations de 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 l'HAL IDumpstateDevice
, qui
collecte les informations de la VM hôte via GRPC-vsock
. La VM hôte empaquetée "tar"
les informations sont nommées dumpstate_board.bin
dans le rapport de bug alors que le vidage des journaux se trouve
dumpstate_board.txt
Pour configurer les commandes à exécuter:
- 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>
- Transmettez le chemin d'accès du nouveau fichier XML au serveur dumpstate lors du lancement. Par exemple:
--config_file my_config.xml
EVS (Extended View System)
Le système EVS (Extended View System) est utilisé pour afficher la vidéo capturée par la vue arrière et caméras avec vue surround. Dans l'AAOS virtualisé, la pile EVS peut accéder au flux vidéo l'appareil de streaming V4L2 virtualisé qui utilise le pilote vidéo VirtIO.
Mode garage
Pour en savoir plus, consultez Mode parking :
L'accès au mode Garage et sa sortie sont déclenchés par les propriétés AP_POWER_STATE_REQ
.
envoyé par le HAL du véhicule. En mode virtualisation, le mode garage est déclenché côté hôte.
La VM hôte doit rester allumée afin de fournir des appareils virtuels pour la VM Android, jusqu'à ce qu'Android soit
éteint. Le serveur VHAL de la VM hôte envoie le signal d'arrêt à la VM invitée AAOS.
Après avoir reçu le signal du client VHAL, la VM AAOS passe en mode Garage et commence à envoyer une pulsation.
pour que la VM hôte reste active.
Système mondial de navigation satellite (GNSS)
Dans trout
1.0, la prise en charge de la virtualisation GNSS sur virtio-console
ont été ajoutées. L'implémentation prend en charge l'échange de mesures brutes et de correctifs d'emplacement à partir des
l'hôte à 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 disponibles, mais un pilote natif
peuvent être implémentés sans aucune modification côté invité. Un exemple d'agent hôte fictif est fourni dans le cadre
le code source trout
.
La mise en œuvre actuelle nécessite que l'initialisation GNSS et le GNSS assisté (AGNSS) soient gérés. par l'environnement de l'OS hôte.
Graphiques
Lorsqu'AAOS est exécuté en tant que VM invitée avec d'autres systèmes d'exploitation automobiles, Android peut ne pas
ont un accès direct au GPU
ou 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
pour accéder au GPU.
Sur la VM invitée Android, Mesa ou goldfish-opengl
encode les commandes OpenGLES :
en flux Gallium ou en flux GLES généré automatiquement, respectivement. virtio-gpu
le pilote du noyau est utilisé
comme transport. Côté hôte, virglrenderer
(pour Mesa) et
vulkan-cereal
(pour goldfish-opengl
) répète le flux de commande décodé sur
au-dessus du pilote de GPU existant. La plate-forme de référence AAOS trout
est compatible avec OpenGL ES
uniquement avec la prise en charge de Vulkan, prévue dans une prochaine version.
Capteurs
Quand AAOS s'exécute en tant que VM invitée avec d'autres systèmes d'exploitation automobiles, Android ne dispose peut-être pas d'un accès direct aux capteurs. Dans cet exemple, le pilote Virtio-SCMI La VM invitée Android et l'appareil VirtIO-SCMI de la VM hôte permettent d'accéder aux capteurs. La plate-forme de référence de virtualisation AAOS fournit une couche HAL de capteurs générique et indépendante du matériel permet aux SoC basés sur l'architecture ARM d'accéder aux capteurs.
Le HAL du capteur communique avec le pilote SCMI IIO dans le sous-système IIO du noyau Linux. qui utilise le protocole de gestion des capteurs SCMI fourni par le ACTIVER Interface SCMI (System Control and Management Interface) pour détecter et configurer les capteurs, lire leurs données et être averti des changements de valeur.
Le pilote SCMI IIO utilise le pilote SCMI VirtIO, qui utilise le transport VirtIO.
tel que spécifié dans le
virtio-scmi
pour échanger des messages SCMI avec l'appareil SCMI VirtIO sur la VM hôte. VirtIO
L'appareil SCMI dispose d'un accès direct aux capteurs via des pilotes de capteur spécifiques au SoC.
Emplacement du capteur HAL
L'implémentation de référence du capteur HAL, qui utilise VirtIO SCMI, se trouve à l'adresse
device/google/trout/hal/sensors
Configuration HAL du capteur
Le HAL du capteur peut avoir besoin de modifier les données des capteurs reçues de la VM hôte pour qu'elles respectent
Système de coordonnées du capteur de voiture Android. Le schéma de configuration des capteurs est disponible 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 la position,
sensor_hal_configuration.xml
, puis copiez le fichier à l'emplacement
/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 du véhicule
L'implémentation de la couche d'abstraction du matériel pour les véhicules comprend deux composants:
- Client : Fournit les API utilisées par Android dans AAOS virtualisé
- Serveur. Il communique directement avec le matériel, tel que le bus d'un 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. Par exemple,
voir 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 de blocs,
Réseau, Console, Entrée, Socket et Entropie. Pour ces sous-systèmes, AAOS utilise
le pilote tel quel, par exemple virtio-blk
, virtio-input
,
virtio-console
et virtio-net
.
Sur la plate-forme de référence virtualisée AAOS, 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 vers la VM hôte, qui dispose d'un accès direct au réseau Wi-Fi réel.