Arsitektur

Sebagian besar perubahan yang diperlukan untuk mendukung VirtIO di AAOS melibatkan perubahan pada tingkat implementasi HAL dan di bawahnya pada Android Common Kernel. Kerangka kerja Android berkomunikasi dengan HAL agnostik perangkat keras generik 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 terjadi dengan virtqueue , yang merupakan buffer cincin seperti DMA dari daftar pengumpulan pencar. Beberapa transport, 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 rekan pada VM terpisah melalui antarmuka vsock . GRPC-vsock digunakan untuk mengakses subsistem non-standar ini. GRPC di pohon sumber Android telah dimodifikasi agar berfungsi dengan vsock dengan format alamat vsock:CID:PORT_NUMBER .

Arsitektur virtualisasi
Gambar 1. Arsitektur virtualisasi

Audio

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

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

Kontrol audio HAL mengelola fokus audio di AAOS. Misalnya, saat sistem memutar suara darurat, musik yang diputar di latar belakang mungkin perlu dibisukan. Kontrol audio HAL memberi tahu aplikasi yang memutar musik agar tidak bersuara dalam situasi ini. Dalam sistem tervirtualisasi, suara dapat berasal dari VM lain. Dalam implementasi referensi, VM tamu AAOS menjalankan daemon server kontrol audio, 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. Meskipun libandroid_audio_controller menahan fokus audio, libandroid_audio_controller terus mengirimkan detak jantung ke AAOS hingga fokus dilepaskan.

Arsitektur audio
Gambar 5. Arsitektur audio

Bluetooth

Implementasi Bluetooth didasarkan pada desain yang diilustrasikan di bawah ini.

Arsitektur Bluetooth
Gambar 5. Arsitektur Bluetooth

Profil Bebas Genggam Bluetooth

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

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Saat AAOS dijalankan sebagai VM tamu, AAOS menggunakan TinyAlsa untuk mengatur kontrol audio ini. Untuk mengaktifkan kasus penggunaan HFP, host/hypervisor melakukan perutean dan kalibrasi khusus vendor.

Implementasi Bluetooth didasarkan pada ilustrasi desain di bawah ini.

Arsitektur Bluetooth
Gambar 5. Arsitektur Bluetooth

Tempat pembuangan sampah

Saat membuat laporan bug untuk AAOS tervirtualisasi, sebaiknya sertakan informasi host VM sehingga pengembang memiliki pandangan sistem yang lebih komprehensif. Untuk mencapai hal ini, implementasi referensi trout mengimplementasikan IDumpstateDevice HAL, yang mengumpulkan informasi host VM melalui GRPC-vsock . Informasi VM host yang dikemas `tar` diberi nama dumpstate_board.bin dalam laporan bug sementara log pembuangan berada di dumpstate_board.txt .

Untuk mengonfigurasi perintah yang akan dijalankan:

  1. Salin detail konfigurasi dari file di bawah ini 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. Lewati jalur file XML baru ke server dumpstate saat diluncurkan. Misalnya:
    --config_file my_config.xml
    

Sistem Tampilan Diperluas (EVS)

Extended View System (EVS) digunakan untuk menampilkan video yang diambil oleh kamera tampak belakang dan kamera sekeliling. Dalam AAOS tervirtualisasi, tumpukan EVS dapat mengakses aliran video dari perangkat streaming V4L2 tervirtualisasi yang menggunakan driver video VirtIO.

Modus garasi

Untuk informasi lebih lanjut, lihat Mode Garasi .

Masuk dan keluar 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 aktif untuk menyediakan perangkat virtual untuk VM Android, hingga Android dimatikan. Server VHAL di VM host mengirimkan sinyal penutupan ke VM tamu AAOS. Setelah menerima sinyal klien VHAL, VM AAOS memasuki mode Garasi dan mulai mengirimkan sinyal detak jantung untuk menjaga VM host tetap aktif.

Sistem Satelit Navigasi Global (GNSS)

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

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

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

arsitektur GNSS
Gambar 2. Arsitektur GNSS

Grafik

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

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

Arsitektur grafis
Gambar 3. Arsitektur grafis

Sensor

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

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

Driver IIO SCMI menggunakan Driver VirtIO SCMI, yang menggunakan protokol transport VirtIO sebagaimana 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 sensor HAL

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

Konfigurasi sensor HAL

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

OEM dapat menyediakan 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 disediakan 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>

Kendaraan HAL

Implementasi HAL Kendaraan terdiri dari dua komponen:

  • Klien. Menyediakan API yang digunakan oleh Android dalam AAOS tervirtualisasi
  • pelayan. Berkomunikasi langsung dengan perangkat keras, seperti bus kendaraan (atau emulator).

Dalam virtualisasi, server VHAL berjalan pada host VM. Klien dan server VHAL berkomunikasi melalui GRPC-vsock (untuk informasi lebih lanjut, lihat device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). OEM dapat menggunakan protokol transport lain selain GRPC dengan mengganti API komunikasi. Misalnya, lihat device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .

Subsistem lainnya

VirtIO sudah menyediakan antarmuka yang terdefinisi dengan baik untuk komponen seperti Block Storage, Network, Console, Input, Socket, dan Entropy. Untuk subsistem ini, AAOS menggunakan driver apa adanya, seperti virtio-blk , virtio-input , virtio-console , dan virtio-net .

Dalam platform referensi AAOS tervirtualisasi, Wi-Fi didukung dengan mac80211_hwsim untuk mengaktifkan jaringan nirkabel VirtWifi , yang kemudian menggunakan terowongan virtio-net untuk mengirimkan lalu lintas jaringan ke host VM, yang memiliki akses langsung ke jaringan Wi-Fi sebenarnya.