Arsitektur

Sebagian besar perubahan yang diperlukan untuk mendukung VirtIO di AAOS melibatkan perubahan di HAL tingkat penerapan dan di bawahnya pada Kernel Umum Android. Framework Android berkomunikasi dengan HAL agnostik perangkat keras generik menggunakan driver VirtIO di tamu AAOS {i>Kernel<i} VM, yang berkomunikasi dengan perangkat VirtIO di sisi {i>host<i} menggunakan protokol VirtIO. Perangkat VirtIO di sisi {i>host<i} dapat mengakses HW fisik menggunakan {i>driver<i} perangkat khusus SoC.

Komunikasi antara {i>driver<i} VirtIO dan perangkat VirtIO berlangsung dengan virtqueue, yang merupakan buffer cincin seperti DMA dari daftar pengumpulan sebar. 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, Kontrol Audio, dan Dumpstate Kendaraan didukung menggunakan koneksi ke agen peer di VM terpisah melalui antarmuka vsock. GRPC-vsock digunakan untuk mengakses subsistem yang tidak distandardisasi ini. GRPC di hierarki sumber Android telah dimodifikasi agar berfungsi dengan vsock dengan alamat format 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 HAL audio dapat berinteraksi dengan perangkat suara virtual dengan libraryTinyALSA.

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

HAL kontrol audio mengelola fokus audio di AAOS. Misalnya, saat sistem sedang diputar suara darurat, musik yang diputar di latar belakang mungkin perlu dibisukan. HAL kontrol audio memberi tahu aplikasi tersebut yang sedang memutar musik untuk dibisukan dalam situasi ini. Dalam sistem virtual, suara bisa berasal dari VM lain. Dalam penerapan 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. Sementara libandroid_audio_controller memegang fokus audio, detak jantung 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 Hands-Free Bluetooth

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

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Saat AAOS berjalan sebagai VM tamu, AAOS akan menggunakanTinyAlsa untuk menyetel kontrol audio ini. Untuk mengaktifkan HFP yang sesuai, host/hypervisor melakukan perutean dan kalibrasi khusus vendor yang sesuai.

Implementasi Bluetooth didasarkan pada ilustrasi desain di bawah ini.

Arsitektur Bluetooth
Gambar 5. Arsitektur Bluetooth

Status Dump

Saat membuat laporan bug untuk AAOS tervirtualisasi, sebaiknya sertakan informasi VM host sehingga pengembang memiliki pandangan yang lebih komprehensif tentang sistem. Untuk melakukan hal ini, Implementasi referensi trout menerapkan HAL IDumpstateDevice, yang mengumpulkan informasi VM host melalui GRPC-vsock. VM host yang dipaketkan `tar` informasi ini dinamai dumpstate_board.bin dalam laporan bug, sementara dump log 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. Teruskan jalur file XML baru ke server dumpstate saat diluncurkan. Contoh:
    --config_file my_config.xml
    

Sistem Tampilan yang Diperluas (EVS)

Extended View System (EVS) digunakan untuk menampilkan video yang diambil oleh tampilan belakang dan kamera surround-view. Dalam AAOS virtual, stack EVS dapat mengakses streaming video dari perangkat {i>streaming<i} V4L2 yang tervirtualisasi yang menggunakan {i>driver<i} VirtIO-video.

Mode garasi

Untuk informasi selengkapnya, lihat Mode Garasi.

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

Sistem satelit navigasi global (GNSS)

Di trout 1.0, dukungan untuk virtualisasi GNSS melalui virtio-console telah telah ditambahkan. Implementasi ini mendukung pertukaran pengukuran mentah dan perbaikan lokasi dari {i>host<i} kepada tamu.

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

Implementasi saat ini mengharapkan inisialisasi GNSS dan GNSS Terbantu (AGNSS) dapat ditangani oleh lingkungan OS {i>host<i}.

Arsitektur GNSS
Gambar 2. Arsitektur GNSS

Grafik

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

Pada VM tamu Android, Mesa atau goldfish-opengl mengenkode perintah OpenGLES ke aliran Gallium atau aliran GLES yang dihasilkan secara otomatis. virtio-gpu {i>driver<i} {i>kernel<i} digunakan sebagai transportasi. Di sisi host, virglrenderer (untuk Mesa) dan vulkan-cereal (untuk goldfish-opengl) memutar ulang stream perintah yang didekode di di atas driver GPU yang ada. Platform referensi AAOS trout mendukung OpenGL ES hanya dengan dukungan Vulkan, yang diperkirakan dalam rilis mendatang.

Arsitektur grafis
Gambar 3. Arsitektur grafis

Sensor

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

Sensor HAL berkomunikasi dengan {i>driver<i} IIO SCMI di subsistem Linux Kernel IIO, yang menggunakan SCMI {i> Sensor Management Protocol<i} yang disediakan oleh ARM Antarmuka Pengelolaan dan Kontrol Sistem (SCMI) spesifikasi untuk menemukan dan mengonfigurasi sensor, membaca data sensor, dan mendapatkan notifikasi tentang sensor perubahan nilai.

{i>Driver<i} IIO SCMI menggunakan {i>Driver<i} VirtIO SCMI, yang menggunakan transport VirtIO seperti yang ditentukan dalam virtio-scmi untuk bertukar pesan SCMI dengan perangkat SCMI VirtIO di VM host. VirtIO Perangkat SCMI memiliki akses langsung ke sensor melalui driver sensor khusus SoC.

Arsitektur sensor
Gambar 4. Arsitektur sensor

Lokasi HAL sensor

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

Konfigurasi HAL sensor

Sensor HAL mungkin perlu memodifikasi data sensor yang diterima dari VM Host untuk mematuhi 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 menyediakan konfigurasi sensor, seperti orientasi dan lokasi, di sensor_hal_configuration.xml, lalu salin 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>

HAL Kendaraan

Implementasi HAL Kendaraan terdiri dari dua komponen:

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

Dalam virtualisasi, server VHAL berjalan pada VM {i>host<i}. 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 transport yang berbeda selain GRPC dengan mengganti API komunikasi. Contohnya, 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, Jaringan, Konsol, Input, Soket, dan Entropi. 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 tunnel virtio-net untuk mengirim traffic jaringan ke VM host, yang memiliki akses langsung ke jaringan Wi-Fi aktual.