Arsitektur

Sebagian besar perubahan yang diperlukan untuk mendukung VirtIO di AAOS melibatkan perubahan pada level implementasi HAL dan di bawahnya di Android Common Kernel. Framework Android berkomunikasi dengan HAL generik yang tidak bergantung pada hardware menggunakan driver VirtIO di kernel VM tamu AAOS, yang berkomunikasi dengan perangkat VirtIO di sisi host menggunakan protokol VirtIO. Perangkat VirtIO di sisi host dapat mengakses HW fisik menggunakan driver perangkat khusus SoC.

Komunikasi antara driver VirtIO dan perangkat VirtIO dilakukan dengan virtqueue, yang merupakan buffer ring seperti DMA dari daftar scatter gather. Beberapa transpor, seperti MMIO atau PCI dapat digunakan untuk bertukar pesan VirtIO antar-VM.

Dalam beberapa kasus, vsock telah dimanfaatkan untuk komunikasi antar-VM. Komunikasi HAL Kendaraan, Kontrol Audio, dan Dumpstate didukung menggunakan koneksi ke agen peer di VM terpisah melalui antarmuka vsock. GRPC-vsock digunakan untuk mengakses subsistem non-standar ini. GRPC dalam hierarki sumber Android telah dimodifikasi agar berfungsi dengan vsock dengan format alamat vsock:CID:PORT_NUMBER.

Arsitektur virtualisasi
Gambar 1. Arsitektur virtualisasi

Audio

Dalam AAOS virtual, VM tamu Android dapat menggunakan virtio-snd untuk mengakses audio. virtio-snd menyediakan perangkat PCM virtual ke VM Android sehingga implementasi HAL audio dapat berinteraksi dengan perangkat suara virtual dengan library TinyALSA.

Implementasi HAL audio default terletak di AOSP di /device/google/trout/hal/audio/6.0. OEM dapat mengubah ro.vendor.trout.audiohal.{in,out}_period_{ms,count} untuk platform mereka. OEM juga dapat menerapkan HAL audio mereka sendiri dengan mengganti variabel terkait audio di /device/google/trout/aosp_trout_common.mk.

HAL kontrol audio mengelola fokus audio di AAOS. Misalnya, saat sistem memutar suara darurat, musik yang diputar di latar belakang mungkin perlu dibisukan. HAL kontrol audio memberi tahu aplikasi yang memutar musik untuk membisukan dalam situasi ini. Dalam sistem virtualisasi, bunyi dapat berasal dari VM lain. Dalam implementasi referensi, VM tamu AAOS memiliki daemon server kontrol audio yang berjalan, yang menggunakan GRPC-vsock untuk menerima permintaan fokus audio dari VM lain. VM host dapat menggunakan device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller untuk mengirim permintaan kontrol audio ke AAOS. Saat libandroid_audio_controller memegang fokus audio, libandroid_audio_controller akan terus mengirim heartbeat ke AAOS hingga fokus dilepaskan.

Arsitektur audio
Gambar 5. Arsitektur audio

Bluetooth

Implementasi Bluetooth didasarkan pada desain yang diilustrasikan di bawah.

Arsitektur Bluetooth
Gambar 5. Arsitektur Bluetooth

Profil Handsfree Bluetooth

Untuk mengaktifkan Profil Handsfree Bluetooth (HFP) di trout, spesifikasi perangkat bunyi VirtIO telah diperluas untuk mendukung kontrol audio. Dengan pendekatan ini, perangkat suara VirtIO di sisi host/hypervisor menyediakan tiga kontrol audio berikut yang terkait dengan HFP:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Saat AAOS berjalan sebagai VM tamu, AAOS menggunakan TinyAlsa untuk menyetel kontrol audio ini. Untuk mengaktifkan kasus penggunaan HFP, host/hypervisor akan menjalankan pemilihan rute dan kalibrasi khusus vendor.

Implementasi Bluetooth didasarkan pada ilustrasi desain di bawah.

Arsitektur Bluetooth
Gambar 5. Arsitektur Bluetooth

Dumpstate

Saat membuat bugreport untuk AAOS virtual, sebaiknya sertakan informasi VM host agar developer memiliki gambaran sistem yang lebih komprehensif. Untuk melakukannya, implementasi referensi trout menerapkan HAL IDumpstateDevice, yang mengumpulkan informasi VM host melalui GRPC-vsock. Informasi VM host yang dipaketkan dengan `tar` bernama dumpstate_board.bin dalam bugreport, sedangkan log pembuangan berada di dumpstate_board.txt.

Untuk mengonfigurasi perintah yang akan dieksekusi:

  1. Salin detail konfigurasi dari file di bawah ke dalam file XML, misalnya, 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. Teruskan jalur file XML baru ke server dumpstate saat meluncurkan. Contoh:
    --config_file my_config.xml
    

Extended View System (EVS)

Sistem Tampilan yang Diperluas (EVS) digunakan untuk menampilkan video yang diambil oleh kamera tampilan belakang dan tampilan sekeliling. Dalam AAOS virtual, stack EVS dapat mengakses streaming video dari perangkat streaming V4L2 virtual yang menggunakan driver video VirtIO.

Mode garasi

Untuk mengetahui informasi selengkapnya, lihat Mode Garasi.

Memasukkan dan keluar dari mode Garasi dipicu oleh properti AP_POWER_STATE_REQ yang dikirim oleh HAL Kendaraan. Dalam mode virtualisasi, mode Garasi dipicu dari sisi host. VM host harus tetap diaktifkan untuk menyediakan perangkat virtual bagi VM Android, hingga Android dinonaktifkan. Server VHAL di VM host mengirimkan sinyal penonaktifan ke VM tamu AAOS. Setelah menerima sinyal klien VHAL, VM AAOS akan memasuki mode Garage dan mulai mengirim sinyal detak jantung untuk menjaga VM host tetap aktif.

Sistem navigasi satelit global (GNSS)

Di trout 1.0, dukungan untuk virtualisasi GNSS melalui virtio-console telah ditambahkan. Implementasi ini mendukung pertukaran pengukuran mentah dan perbaikan lokasi dari host ke tamu.

Format pertukaran data adalah CSV yang digunakan oleh aplikasi GnssLogger. Dalam implementasi referensi, karena driver GNSS native tidak tersedia, data tiruan disediakan, tetapi driver native dapat diterapkan tanpa perubahan sisi tamu. Contoh agen host tiruan disediakan sebagai bagian dari kode sumber trout.

Implementasi saat ini mengharapkan inisialisasi GNSS dan GNSS Berbantuan (AGNSS) ditangani oleh lingkungan OS host.

Arsitektur GNSS
Gambar 2. Arsitektur GNSS

Grafik

Saat AAOS berjalan sebagai VM tamu bersama sistem operasi otomotif lainnya, Android mungkin tidak memiliki akses langsung ke GPU atau pengontrol layar. Dalam hal ini, Mesa atau goldfish-opengl dan driver virtio-gpu di VM tamu Android dan perangkat virtio-gpu dapat digunakan untuk mengakses GPU.

Di VM tamu Android, Mesa atau goldfish-opengl mengenkode perintah OpenGLES ke dalam aliran Gallium atau aliran GLES yang dibuat secara otomatis. Driver kernel virtio-gpu digunakan sebagai transpor. Di sisi host, virglrenderer (untuk Mesa) dan vulkan-cereal (untuk goldfish-opengl) memutar ulang aliran perintah yang didekode di atas driver GPU yang ada. Platform referensi AAOS trout hanya mendukung OpenGL ES dengan dukungan Vulkan, yang diperkirakan akan dirilis pada masa mendatang.

Arsitektur grafis
Gambar 3. Arsitektur grafis

Sensor

Saat AAOS berjalan sebagai VM tamu bersama sistem operasi otomotif lainnya, Android mungkin tidak memiliki akses langsung ke sensor. Dalam hal ini, driver Virtio-SCMI di VM tamu Android dan perangkat VirtIO-SCMI di VM Host digunakan untuk mengakses sensor. Platform referensi virtualisasi AAOS menyediakan HAL Sensor generik dan tidak bergantung pada HW yang dapat digunakan untuk SoC berbasis ARM guna mengakses sensor.

HAL sensor berkomunikasi dengan driver IIO SCMI di subsistem IIO Kernel Linux, yang menggunakan SCMI Sensor Management Protocol yang disediakan oleh spesifikasi ARM System Control and Management Interface (SCMI) untuk menemukan dan mengonfigurasi sensor, membaca data sensor, dan mendapatkan notifikasi tentang perubahan nilai sensor.

Driver IIO SCMI menggunakan Driver VirtIO SCMI, yang menggunakan protokol transpor VirtIO seperti yang ditentukan dalam spesifikasi virtio-scmi untuk bertukar pesan SCMI dengan perangkat VirtIO SCMI di VM host. Perangkat VirtIO SCMI memiliki akses langsung ke sensor melalui driver sensor khusus SoC.

Arsitektur sensor
Gambar 4. Arsitektur sensor

Lokasi HAL sensor

Implementasi referensi HAL sensor, yang menggunakan VirtIO SCMI, terletak di device/google/trout/hal/sensors.

Konfigurasi HAL sensor

HAL sensor mungkin perlu mengubah data sensor yang diterima dari VM Host agar sesuai dengan sistem koordinat sensor mobil Android. Skema untuk konfigurasi sensor dapat ditemukan di device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd.

OEM dapat memberikan konfigurasi sensor, seperti orientasi dan lokasi, di sensor_hal_configuration.xml dan menyalin file di /odm/etc/sensors/ atau /vendor/etc/sensors/. Contoh konfigurasi sensor diberikan di bawah ini:

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

Implementasi HAL Kendaraan terdiri dari dua komponen:

  • Klien. Menyediakan API yang digunakan oleh Android di AAOS virtual
  • Server. Berkomunikasi langsung dengan hardware, seperti bus kendaraan (atau emulator).

Dalam virtualisasi, server VHAL berjalan di VM host. Klien dan server VHAL berkomunikasi melalui GRPC-vsock (untuk informasi selengkapnya, lihat device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto). OEM dapat menggunakan protokol transpor yang berbeda selain GRPC dengan mengganti API komunikasi. Untuk mengetahui contohnya, lihat device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp.

Subsistem lainnya

VirtIO sudah menyediakan antarmuka yang ditentukan dengan baik untuk komponen seperti Block Storage, Jaringan, Konsol, Input, Soket, dan Entropi. Untuk subsistem ini, AAOS menggunakan driver apa adanya, seperti virtio-blk, virtio-input, virtio-console, dan virtio-net.

Di platform referensi AAOS virtual, Wi-Fi didukung dengan mac80211_hwsim untuk mengaktifkan jaringan nirkabel VirtWifi, yang kemudian menggunakan tunnel virtio-net untuk mengirim traffic jaringan ke VM host, yang memiliki akses langsung ke jaringan Wi-Fi yang sebenarnya.