La maggior parte delle modifiche necessarie per supportare VirtIO in AAOS riguardano l'HAL livello di implementazione e inferiore nel kernel comune di Android. Framework Android comunica con un HAL generico indipendente dall'hardware utilizzando i driver VirtIO nell'ambiente guest AAOS Kernel della VM, che comunica con i dispositivi VirtIO sul lato host utilizzando i protocolli VirtIO. I dispositivi VirtIO sul lato host possono accedere all'hardware fisico utilizzando driver di dispositivo specifici per SoC.
La comunicazione tra il driver VirtIO e il dispositivo VirtIO avviene con
virtqueue
, che sono buffer ad anello simili a DMA degli elenchi di raccolta a dispersione.
Vari trasporti, come
MMIO
o
PCI
può essere usato per scambiare i messaggi VirtIO tra le VM.
In alcuni casi, vsock
è stato sfruttato per le comunicazioni tra VM.
Le comunicazioni HAL, Controllo audio e Dumpstate dei veicoli sono supportate tramite una connessione
a un agente peer su una VM separata tramite un'interfaccia vsock
.
GRPC-vsock
viene utilizzato per accedere a questi sottosistemi non standardizzati.
GRPC
nella struttura di origine Android è stata modificata in modo da funzionare con vsock
con l'indirizzo
formato vsock:CID:PORT_NUMBER
.
Audio
Nell'AAOS virtualizzato, la VM ospite Android può usare virtio-snd
per accedere all'audio.
virtio-snd
fornisce i dispositivi PCM virtualizzati alla VM Android in modo che
l'implementazione audio HAL può interagire con i dispositivi audio virtualizzati con
libreria TinyALSA.
L'implementazione predefinita dell'HAL per l'audio si trova in AOSP all'indirizzo
/device/google/trout/hal/audio/6.0
. Gli OEM possono modificare
ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
per la sua piattaforma. Gli OEM possono
anche implementare il proprio HAL audio, eseguendo l'override delle variabili relative all'audio in
/device/google/trout/aosp_trout_common.mk.
Il controllo audio HAL gestisce il focus audio in AAOS. Ad esempio, quando il sistema sta riproducendo
suoni di emergenza, potrebbe essere necessario disattivare l'audio della musica in sottofondo. Il controllo audio HAL
avvisa le app che riproducono musica di disattivare l'audio in questa situazione. Nel sistema virtualizzato,
i suoni possono provenire da altre VM. Nell'implementazione di riferimento, la VM ospite di AAOS
è in esecuzione un daemon del server di controllo audio, che utilizza GRPC-vsock
per ricevere
da altre VM.
La VM host può utilizzare device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
per inviare richieste di controllo audio
ad AAOS. Mentre libandroid_audio_controller
contiene il
con il focus audio, continua a inviare heartbeat ad AAOS fino al rilascio dello stato attivo.
Bluetooth
L'implementazione del Bluetooth si basa sul design illustrato di seguito.
.Profilo vivavoce Bluetooth
Per attivare il profilo vivavoce Bluetooth (HFP) su trout
, il dispositivo audio VirtIO
è stata estesa per supportare i controlli audio. Con questo approccio, un suono VirtIO
sul lato host/hypervisor fornisce i seguenti tre controlli audio correlati all'HFP:
hfp_enable
hfp_set_sampling_rate
hfp_volume
Quando AAOS viene eseguito come VM ospite, AAOS utilizza TinyAlsa per impostare questi controlli audio. Per attivare l'HFP caso d'uso, l'host/hypervisor esegue di conseguenza il routing e la calibrazione specifici del fornitore.
L'implementazione del Bluetooth si basa sull'illustrazione del design che segue.
.Stato di dump
Quando generi la segnalazione di bug per AAOS virtualizzato, è importante includere informazioni sulla VM host
per avere una visione più completa del sistema. A questo scopo,
L'implementazione dei riferimenti trout
implementa IDumpstateDevice
HAL, che
raccoglie le informazioni sulla VM host tramite GRPC-vsock
. La VM host in pacchetto "tar"
l'informazione viene rinominata dumpstate_board.bin
nella segnalazione di bug, mentre i log del dump si trovano
dumpstate_board.txt
.
Per configurare i comandi da eseguire:
- Copia i dettagli di configurazione dal file seguente in un file XML, ad esempio:
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>
- Passa il percorso del nuovo file XML al server dumpstate all'avvio. Ad esempio:
--config_file my_config.xml
Sistema di visualizzazione estesa (EVS)
Il sistema di visione estesa (EVS) è utilizzato per visualizzare i video acquisiti dalla vista posteriore e fotocamere con vista surround. Nell'AAOS virtualizzato, lo stack EVS può accedere allo stream video il dispositivo di streaming virtualizzato V4L2 che utilizza il driver video VirtIO.
Modalità garage
Per ulteriori informazioni, vedi Modalità garage.
L'attivazione e la disattivazione della modalità Garage vengono attivate dalle proprietà di AP_POWER_STATE_REQ
inviato dall'HAL per il veicolo. In modalità virtualizzazione, la modalità Garage viene attivata dal lato host.
La VM host deve rimanere accesa per fornire i dispositivi virtuali per la VM Android, finché Android non viene
spento. Il server VHAL sulla VM host invia il segnale di arresto alla VM ospite di AAOS.
Dopo aver ricevuto il segnale del client VHAL, la VM AAOS entra in modalità Garage e inizia a inviare heartbeat
per mantenere attiva la VM host.
Sistema di navigazione satellitare globale (GNSS)
In trout
1.0, il supporto per la virtualizzazione GNSS su virtio-console
è stato
è stato aggiunto. L'implementazione supporta lo scambio di misurazioni non elaborate e di correzioni di località da
l'organizzatore all'ospite.
Il formato di scambio di dati è il CSV utilizzato dall'app GnssLogger. Nell'implementazione dei riferimenti,
poiché il driver GNSS nativo non è disponibile, vengono resi disponibili dati fittizi, ma viene utilizzato un driver nativo
possono essere implementate senza alcuna modifica lato guest. Viene fornito un esempio di agente host come parte
il codice sorgente di trout
.
L'implementazione attuale prevede che vengano gestiti l'inizializzazione GNSS e il servizio GNSS assistito (AGNSS). dall'ambiente del sistema operativo host.
.Grafica
Quando AAOS è in esecuzione come VM guest insieme ad altri sistemi operativi per auto e motori, Android potrebbe non
hanno accesso diretto alla GPU o al controller del display. In questo caso,
Mesa o
goldfish-opengl
e un driver virtio-gpu
sulla VM guest Android e sul dispositivo virtio-gpu
per accedere alla GPU.
Sulla VM guest Android, Mesa o goldfish-opengl
codifica i comandi OpenGLES
rispettivamente in uno stream Gallium o in uno stream GLES generato automaticamente. virtio-gpu
il driver kernel è usato come trasporto. Sul lato host, virglrenderer
(per Mesa) e
vulkan-cereal
(per goldfish-opengl
) riproduci di nuovo lo stream del comando decodificato su
superiore al driver GPU esistente. La piattaforma di riferimento AAOS trout
supporta OpenGL ES
solo con il supporto Vulkan, previsto in una release futura.
Sensori
Quando AAOS è in esecuzione come VM guest insieme ad altri sistemi operativi del settore auto e motori, Android potrebbe non avere accesso diretto ai sensori. In questo caso, il driver Virtio-SCMI sulla Per accedere ai sensori vengono utilizzati la VM ospite Android e il dispositivo VirtIO-SCMI sulla VM host. La piattaforma di riferimento per la virtualizzazione AAOS fornisce un HAL per sensori generico e indipendente dall'HW che può essere utilizzata per consentire ai SoC basati su ARM di accedere ai sensori.
Il sensore HAL comunica con il driver SCMI IIO nel sottosistema IIO del kernel Linux, che utilizza il protocollo SCMI Sensor Management Protocol fornito dal ARM SCMI (System Control and Management Interface) per rilevare e configurare i sensori, leggerne i dati e ricevere notifiche modifiche ai valori.
Il driver SCMI IIO utilizza il driver VirtIO SCMI, che impiega il trasporto VirtIO
come specificato nel
virtio-scmi
specifica per lo scambio di messaggi SCMI con il dispositivo VirtIO SCMI sulla VM host. La VirtIO
Il dispositivo SCMI ha accesso diretto ai sensori tramite driver dei sensori specifici del SoC.
Posizione dell'HAL del sensore
L'implementazione di riferimento del sensore HAL, che utilizza VirtIO SCMI, si trova all'indirizzo
device/google/trout/hal/sensors
.
Configurazione HAL del sensore
L'HAL del sensore potrebbe dover modificare i dati dei sensori ricevuti dalla VM host per rispettare le
Sistema di coordinate dei sensori per auto Android. Lo schema per la configurazione dei sensori è disponibile nella sezione
device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd
.
Gli OEM possono fornire la configurazione del sensore, come l'orientamento e la posizione, in
sensor_hal_configuration.xml
e copia il file in uno dei seguenti modi:
/odm/etc/sensors/
o /vendor/etc/sensors/
.
Di seguito è riportata una configurazione di esempio del sensore:
<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 per veicoli
L'implementazione dell'HAL per il veicolo è costituita da due componenti:
- Cliente. Fornisce le API utilizzate da Android in AAOS virtualizzato
- Server. Comunica direttamente con l'hardware, ad esempio gli autobus del veicolo (o un emulatore).
Nella virtualizzazione, il server VHAL viene eseguito sulla VM host. Il client e il server VHAL comunicano
tramite GRPC-vsock
(per ulteriori informazioni, vedi
device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto
). Gli OEM possono utilizzare
un protocollo di trasporto diverso da GRPC mediante l'override delle API di comunicazione. Ad esempio:
vedi device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp
.
Altri sottosistemi
VirtIO fornisce già un'interfaccia ben definita per componenti come Archiviazione a blocchi,
rete, console, input, socket ed entropia. Per questi sottosistemi, AAOS utilizza
il conducente così com'è, ad esempio virtio-blk
, virtio-input
virtio-console
e virtio-net
.
Nella piattaforma di riferimento AAOS virtualizzata, il Wi-Fi è supportato con mac80211_hwsim
per attivare una rete wireless VirtWifi
, che utilizza poi il tunnel virtio-net
per inviare il traffico di rete alla VM host, che ha accesso diretto alla rete Wi-Fi effettiva.