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
.
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.
Bluetooth
Implementasi Bluetooth didasarkan pada desain yang diilustrasikan di bawah ini.
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.
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:
- 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>
- 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}.
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.
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.
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.