Architektur

Die meisten Änderungen, die zur Unterstützung von VirtIO in AAOS erforderlich sind, betreffen Änderungen auf der HAL-Implementierungsebene und darunter im Android Common Kernel. Das Android-Framework kommuniziert mithilfe der VirtIO-Treiber im AAOS-Gast-VM-Kernel mit einer generischen hardwareunabhängigen HAL, die über VirtIO-Protokolle mit VirtIO-Geräten auf der Hostseite kommuniziert. VirtIO-Geräte auf der Hostseite können mithilfe von SoC-spezifischen Gerätetreibern auf die physische HW zugreifen.

Die Kommunikation zwischen dem VirtIO-Treiber und dem VirtIO-Gerät findet mit virtqueue statt, bei denen es sich um DMA-ähnliche Ringpuffer von Scatter-Gather-Listen handelt. Mehrere Transporte wie MMIO oder PCI können verwendet werden, um die VirtIO-Nachrichten zwischen VMs auszutauschen.

In einigen Fällen wurde vsock für die Kommunikation zwischen VMs genutzt. Die Fahrzeug-HAL-, Audiosteuerungs- und Dumpstate-Kommunikation wird unterstützt, indem eine Verbindung zu einem Peer-Agent auf einer separaten VM über eine vsock Schnittstelle verwendet wird. GRPC-vsock wird verwendet, um auf diese nicht standardisierten Subsysteme zuzugreifen. GRPC im Android-Quellbaum wurde geändert, um mit vsock mit dem Adressformat vsock:CID:PORT_NUMBER zu arbeiten.

Virtualisierungsarchitektur
Abbildung 1. Virtualisierungsarchitektur

Audio

In virtualisiertem AAOS kann die Android-Gast-VM virtio-snd verwenden, um auf Audio zuzugreifen. virtio-snd stellt die virtualisierten PCM-Geräte der Android-VM bereit, sodass die Audio-HAL-Implementierung mit den virtualisierten Soundgeräten mit der TinyALSA-Bibliothek interagieren kann.

Die standardmäßige Audio-HAL-Implementierung befindet sich in AOSP unter /device/google/trout/hal/audio/6.0 . OEMs können ro.vendor.trout.audiohal.{in,out}_period_{ms,count} für ihre Plattform ändern. OEMs können auch ihre eigene Audio-HAL implementieren, indem sie die audiobezogenen Variablen in /device/google/trout/aosp_trout_common.mk.

Die Audiosteuerung HAL verwaltet den Audiofokus in AAOS. Wenn das System beispielsweise Notfalltöne abspielt, muss die Hintergrundmusik möglicherweise stumm geschaltet werden. Die Audiosteuerung HAL benachrichtigt die Apps, die Musik spielen, in dieser Situation stumm zu schalten. Im virtualisierten System können die Töne von anderen VMs stammen. In der Referenzimplementierung läuft auf der AAOS-Gast-VM ein Audiosteuerungsserver-Daemon, der GRPC-vsock verwendet, um Audiofokusanforderungen von anderen VMs zu empfangen. Die Host-VM kann device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller , um Audiosteuerungsanfragen an AAOS zu senden. Während libandroid_audio_controller den Audiofokus hält, sendet es weiterhin Heartbeats an AAOS, bis der Fokus freigegeben wird.

Audioarchitektur
Abbildung 5. Audioarchitektur

Bluetooth

Die Bluetooth-Implementierung basiert auf dem unten dargestellten Design.

Bluetooth-Architektur
Abbildung 5. Bluetooth-Architektur

Bluetooth-Freisprechprofil

Um das Bluetooth Hands-Free Profile (HFP) auf trout zu aktivieren, wurde die VirtIO-Soundgerätespezifikation erweitert, um Audiosteuerungen zu unterstützen. Bei diesem Ansatz stellt ein VirtIO-Soundgerät auf der Host-/Hypervisor-Seite diese drei Audiosteuerungen in Bezug auf das HFP bereit:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Wenn AAOS als Gast-VM ausgeführt wird, verwendet AAOS TinyAlsa, um diese Audiosteuerelemente festzulegen. Um den HFP-Anwendungsfall zu aktivieren, führt der Host/Hypervisor das herstellerspezifische Routing und die entsprechende Kalibrierung durch.

Die Bluetooth-Implementierung basiert auf der folgenden Designabbildung.

Bluetooth-Architektur
Abbildung 5. Bluetooth-Architektur

Dumpstate

Beim Generieren des Fehlerberichts für virtualisiertes AAOS ist es sinnvoll, Host-VM-Informationen einzubeziehen, damit die Entwickler einen umfassenderen Überblick über das System haben. Um dies zu erreichen, implementiert die trout -Referenzimplementierung IDumpstateDevice HAL, das die Host-VM-Informationen über GRPC-vsock . Die `tar`-gepackten Host-VM-Informationen heißen im Fehlerbericht dumpstate_board.bin , während Dumping-Protokolle unter dumpstate_board.txt sind.

So konfigurieren Sie die auszuführenden Befehle:

  1. Kopieren Sie die Konfigurationsdetails aus der folgenden Datei in eine XML-Datei, z. B. 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. Übergeben Sie den Pfad der neuen XML-Datei beim Start an den Dumpstate-Server. Zum Beispiel:
    --config_file my_config.xml
    

Extended-View-System (EVS)

Das Extended View System (EVS) wird verwendet, um Videos anzuzeigen, die von den Rückfahr- und Surround-View-Kameras aufgenommen wurden. In virtualisiertem AAOS kann der EVS-Stack auf den Videostream vom virtualisierten V4L2-Streaminggerät zugreifen, das den VirtIO-Videotreiber verwendet.

Garagenmodus

Weitere Informationen finden Sie unter Was ist der Garagenmodus? .

Das Betreten und Verlassen des Garagenmodus wird durch AP_POWER_STATE_REQ Eigenschaften ausgelöst, die von der Fahrzeug-HAL gesendet werden. Im Virtualisierungsmodus wird der Garagenmodus von der Hostseite ausgelöst. Die Host-VM sollte eingeschaltet bleiben, um virtuelle Geräte für die Android-VM bereitzustellen, bis Android ausgeschaltet wird. Der VHAL-Server auf der Host-VM sendet das Signal zum Herunterfahren an die AAOS-Gast-VM. Beim Empfang des Signals VHAL-Client wechselt die AAOS-VM in den Garagenmodus und beginnt mit dem Senden von Heartbeat-Signalen, um die Host-VM aktiv zu halten.

Globales Satellitennavigationssystem (GNSS)

In trout 1.0 wurde die Unterstützung für die GNSS-Virtualisierung über die virtio-console hinzugefügt. Die Implementierung unterstützt den Austausch von Rohmessungen und Ortsfestlegungen vom Host zum Gast.

Das Datenaustauschformat ist das von der GnssLogger-App verwendete CSV. In der Referenzimplementierung werden Scheindaten bereitgestellt, da der native GNSS-Treiber nicht verfügbar ist, aber ein nativer Treiber kann ohne gastseitige Änderungen implementiert werden. Ein Beispiel-Mock-Host-Agent wird als Teil des trout -Quellcodes bereitgestellt.

Die aktuelle Implementierung erwartet, dass die GNSS-Initialisierung und Assisted GNSS (AGNSS) von der Host-Betriebssystemumgebung gehandhabt werden.

GNSS-Architektur
Abbildung 2. GNSS-Architektur

Grafik

Wenn AAOS neben anderen Automobilbetriebssystemen als Gast-VM ausgeführt wird, hat Android möglicherweise keinen direkten Zugriff auf die GPU oder den Display-Controller. In diesem Fall können Mesa oder goldfish-opengl und ein virtio-gpu Treiber auf der Android-Gast-VM und virtio-gpu Gerät für den Zugriff auf die GPU verwendet werden.

Auf der Android-Gast-VM codiert Mesa oder goldfish-opengl OpenGLES-Befehle entweder in einen Gallium-Stream bzw. einen automatisch generierten GLES-Stream. Als Transport wird der virtio-gpu verwendet. Auf der virglrenderer (für Mesa) und vulkan vulkan-cereal (für goldfish-opengl ) den decodierten Befehlsstrom zusätzlich zum vorhandenen GPU-Treiber wieder. Die AAOS-Referenzplattform trout unterstützt OpenGL ES nur mit Vulkan-Unterstützung, die in einer zukünftigen Version erwartet wird.

Grafikarchitektur
Abbildung 3. Grafikarchitektur

Sensoren

Wenn AAOS neben anderen Automobilbetriebssystemen als Gast-VM ausgeführt wird, hat Android möglicherweise keinen direkten Zugriff auf die Sensoren. In diesem Fall werden der Virtio-SCMI-Treiber auf der Android-Gast-VM und das VirtIO-SCMI-Gerät auf der Host-VM verwendet, um auf die Sensoren zuzugreifen. Die AAOS-Virtualisierungsreferenzplattform bietet eine generische und HW-agnostische Sensor-HAL, die für ARM-basierte SoCs verwendet werden kann, um auf die Sensoren zuzugreifen.

Sensor-HAL kommuniziert mit dem IIO-SCMI-Treiber im Linux-Kernel-IIO-Subsystem, das das SCMI-Sensorverwaltungsprotokoll verwendet, das von der Spezifikation ARM System Control and Management Interface (SCMI) bereitgestellt wird, um Sensoren zu erkennen und zu konfigurieren, Sensordaten zu lesen und über Sensoren benachrichtigt zu werden Wert ändert.

Der IIO-SCMI-Treiber verwendet den VirtIO-SCMI-Treiber, der das VirtIO-Transportprotokoll gemäß der virtio-scmi Spezifikation verwendet, um SCMI-Nachrichten mit dem VirtIO-SCMI-Gerät auf der Host-VM auszutauschen. Das VirtIO-SCMI-Gerät hat über SoC-spezifische Sensortreiber direkten Zugriff auf die Sensoren.

Sensorarchitektur
Abbildung 4. Sensorarchitektur

Sensor-HAL-Position

Die Referenzimplementierung der Sensor-HAL, die VirtIO SCMI verwendet, befindet sich unter device/google/trout/hal/sensors .

Sensor-HAL-Konfiguration

Die Sensor-HAL muss möglicherweise die von der Host-VM empfangenen Sensordaten ändern, damit sie mit dem Android-Autosensorkoordinatensystem übereinstimmen. Das Schema für die Sensorkonfiguration finden Sie in device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd .

OEMs können Sensorkonfigurationen wie Ausrichtung und Position in sensor_hal_configuration.xml und die Datei entweder /odm/etc/sensors/ oder /vendor/etc/sensors/ kopieren. Nachfolgend finden Sie eine beispielhafte Sensorkonfiguration:

<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>

Fahrzeug HAL

Die Fahrzeug-HAL-Implementierung besteht aus zwei Komponenten:

  • Klient. Stellt APIs bereit, die von Android in virtualisiertem AAOS verwendet werden
  • Server. Kommuniziert direkt mit der Hardware, wie z. B. Fahrzeugbussen (oder einem Emulator).

Bei der Virtualisierung wird der VHAL-Server auf der Host-VM ausgeführt. Der VHAL-Client und -Server kommunizieren über GRPC-vsock (weitere Informationen finden Sie unter device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). OEMs können ein anderes Transportprotokoll als GRPC verwenden, indem sie die Kommunikations-APIs überschreiben. Beispiele finden Sie unter device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .

Andere Subsysteme

VirtIO bietet bereits eine klar definierte Schnittstelle für Komponenten wie Block Storage, Network, Console, Input, Socket und Entropy. Für diese Subsysteme verwendet AAOS den Treiber wie er ist, wie virtio-blk , virtio-input , virtio-console und virtio-net .

In der virtualisierten AAOS-Referenzplattform wird Wi-Fi mit mac80211_hwsim unterstützt, um ein drahtloses VirtWifi -Netzwerk zu ermöglichen, das dann den virtio-net Tunnel verwendet, um den Netzwerkverkehr an die Host-VM zu senden, die direkten Zugriff auf das eigentliche Wi-Fi-Netzwerk hat.