Większość zmian niezbędnych do obsługi VirtIO w AAOS dotyczy zmian w HAL implementacji i niższego poziomu w wspólnym jądrze Androida. Struktura Androida komunikuje się z ogólną, niezależną od sprzętu HAL, korzystając ze sterowników VirtIO w systemie gościa AAOS Jądro maszyny wirtualnej komunikujące się z urządzeniami VirtIO po stronie hosta za pomocą protokołów VirtIO. Urządzenia VirtIO po stronie hosta mają dostęp do fizycznego sprzętu za pomocą sterowników urządzenia specyficznych dla układu SoC.
Komunikacja między sterownikiem VirtIO a urządzeniem VirtIO odbywa się za pomocą
virtqueue
, które są podobnymi do DMA buforami pierścieniowymi list rozproszonych.
Kilka środków transportu, takich jak
MMIO
lub
PCI
może być używany do wymiany komunikatów VirtIO między maszynami wirtualnymi.
W niektórych przypadkach usługa vsock
była używana do komunikacji między maszynami wirtualnymi.
Komunikacja dotycząca HAL, sterowania dźwiękiem i stanu zrzutu w pojeździe jest obsługiwana przez połączenie
z agentem peera na osobnej maszynie wirtualnej za pomocą interfejsu vsock
.
GRPC-vsock
służy do uzyskiwania dostępu do tych niestandaryzowanych podsystemów.
GRPC
w drzewie źródłowym Androida została zmodyfikowana, aby obsługiwała vsock
z adresem
w formacie vsock:CID:PORT_NUMBER
.
Dźwięk
W wirtualizowanym systemie AAOS gościa z Androidem może używać virtio-snd
do uzyskiwania dostępu do dźwięku.
virtio-snd
udostępnia zwirtualizowane urządzenia PCM maszynie wirtualnej z Androidem, dzięki czemu
implementacja HAL audio może wchodzić w interakcje ze zwirtualizowanymi urządzeniami dźwiękowymi za pomocą
Biblioteka TinyALSA.
Domyślna implementacja audio HAL znajduje się w AOSP pod adresem
/device/google/trout/hal/audio/6.0
OEM może modyfikować
ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
ze względu na swoją platformę. OEM może
implementują własne wartości HAL audio, zastępując zmienne związane z dźwiękiem w
/device/google/trout/aosp_trout_common.mk.
HAL zarządza dźwiękiem w systemie AAOS. Na przykład, gdy system odtwarza
dźwięków alarmowych, muzyka odtwarzana w tle może wymagać wyciszenia. HAL do sterowania dźwiękiem
powiadamia aplikacje odtwarzające muzykę o konieczności wyciszenia w tej sytuacji. W systemie zwirtualizowanym
dźwięki mogą pochodzić z innych maszyn wirtualnych. W implementacji referencyjnej hostowana maszyna wirtualna AAOS
ma uruchomiony demon serwera sterowania dźwiękiem, który używa GRPC-vsock
do odbierania sygnału
żądań skupienia dźwięku od innych maszyn wirtualnych.
Główna maszyna wirtualna może używać interfejsu device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
wysyłania żądań sterowania dźwiękiem do AAOS. Z kolei libandroid_audio_controller
utrzymuje
ale nadal wysyła sygnały dźwiękowe do AAOS, dopóki nie zostanie zwolniony.
Bluetooth
Implementacja Bluetooth opiera się na ilustracji poniżej.
.Profil Bluetooth do obsługi zestawu głośnomówiącego
Aby włączyć profil Bluetooth za pomocą zestawu głośnomówiącego (HFP) na urządzeniu trout
, urządzenie dźwiękowe VirtIO
specyfikacja została rozszerzona o obsługę elementów sterujących dźwiękiem. Dzięki temu dźwiękowi VirtIO
po stronie hosta/hipernadzorcy udostępnia 3 elementy sterujące dźwiękiem związane z HFP:
hfp_enable
hfp_set_sampling_rate
hfp_volume
Gdy AAOS działa jako gość, system AAOS używa TinyAlsa do ustawiania tych elementów sterujących dźwiękiem. Aby włączyć HFP: w takim przypadku host/hipernadzorca przeprowadza kierowanie i kalibrację specyficzne dla dostawcy.
Implementacja przez Bluetooth opiera się na ilustracji poniżej.
.Zrzut stanu
Podczas generowania raportu o błędzie dla zwirtualizowanego systemu AAOS warto dołączyć informacje o hostelu maszyny wirtualnej
Dzięki temu deweloperzy mają pełniejszy obraz systemu. W tym celu
Implementacja referencyjna trout
wykorzystuje kod HAL IDumpstateDevice
, który
zbiera informacje o hoście maszyny wirtualnej za pomocą usługi GRPC-vsock
. Maszyna wirtualna hostowana w pakiecie „tar”
dane mają w raporcie o błędzie nazwę dumpstate_board.bin
, podczas gdy dzienniki zrzutu są na miejscu
dumpstate_board.txt
Aby skonfigurować polecenia do wykonania:
- Skopiuj szczegóły konfiguracji z pliku poniżej do pliku XML, na przykład:
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>
- Przy uruchamianiu podaj ścieżkę nowego pliku XML do serwera dumpstate. Na przykład:
--config_file my_config.xml
System rozszerzonego widoku (EVS)
System Extended View System (EVS) służy do wyświetlania filmów zarejestrowanych podczas z kamerami z widokiem przestrzennym. W wirtualizowanym systemie AAOS stos EVS może uzyskać dostęp do strumienia wideo z poziomu zwirtualizowane urządzenie streamingowe V4L2 korzystające ze sterownika VirtIO-video.
Tryb garażu
Więcej informacji: Tryb garażu.
Włączanie i wyłączanie trybu garażowego jest wywoływane przez usługi w AP_POWER_STATE_REQ
wysłane przez zespół HAL pojazdu. W trybie wirtualizacji tryb garażowy uruchamia się po stronie hosta.
Główna maszyna wirtualna powinna być włączona, aby udostępniać urządzenia wirtualne dla maszyny wirtualnej z Androidem do momentu, gdy Android
jest wyłączony. Serwer VHAL w maszynie wirtualnej hosta wysyła sygnał wyłączenia do gościa maszyny wirtualnej AAOS.
Po otrzymaniu sygnału klienta VHAL maszyna wirtualna AAOS przechodzi w tryb garażowy i zaczyna wysyłać pakiet podtrzymujący
aby utrzymać aktywność hosta maszyny wirtualnej.
Globalny system satelitarny (GNSS)
W trout
w wersji 1.0 obsługa wirtualizacji GNSS w promieniu virtio-console
dodano. Implementacja obsługuje wymianę nieprzetworzonych pomiarów i poprawek lokalizacji
z gospodarzem rozmowy gościowi.
Format wymiany danych to plik CSV używany przez aplikację GnssLogger. W implementacji referencyjnej
bo natywny sterownik GNSS jest niedostępny, dostępne są przykładowe dane, ale
można wdrożyć bez zmian po stronie gościa. Przykładowy agent hosta jest udostępniany
w kodzie źródłowym trout
.
Obecna implementacja wymaga obsługi inicjowania GNSS i wspomaganej nawigacji GNSS (AGNSS). przez środowisko systemu operacyjnego hosta.
.Grafika
Gdy AAOS działa jako gość wraz z innymi samochodowymi systemami operacyjnymi, Android może nie działać
i mieć bezpośredni dostęp do GPU lub kontrolera wyświetlacza. W tym przypadku
Mesa lub
goldfish-opengl
oraz sterownik virtio-gpu
w maszynie wirtualnej z Androidem i na urządzeniu virtio-gpu
mogą być wykorzystywane do uzyskania dostępu do GPU.
Na maszynie wirtualnej z Androidem jako gość Mesa lub goldfish-opengl
koduje polecenia OpenGLES
odpowiednio do strumienia galu lub automatycznie wygenerowanego strumienia GLES. virtio-gpu
sterownika jądra służy do transportu. Po stronie gospodarza: virglrenderer
(w przypadku Mesa) i
vulkan-cereal
(dla goldfish-opengl
) ponownie odtwarza zdekodowany strumień poleceń na
z dotychczasowego sterownika GPU. Platforma referencyjna AAOS trout
obsługuje standard OpenGL ES
tylko z obsługą interfejsu Vulkan, co jest spodziewane w przyszłej wersji.
Czujniki
Gdy AAOS działa jako gość jako maszyna wirtualna wraz z innymi samochodowymi systemami operacyjnymi, Android może nie mieć bezpośredniego dostępu do czujników. W tym przypadku sterownik Virtio-SCMI na Gośćska maszyna wirtualna z Androidem i urządzenie VirtIO-SCMI w maszynie wirtualnej hosta są używane do uzyskiwania dostępu do czujników. Platforma referencyjna wirtualizacji AAOS zapewnia ogólny, niezależny od sprzętu HAL czujnik HAL, który może być używany w układach SOC ARM, aby mieć dostęp do czujników.
HAL czujnika komunikuje się ze sterownikiem IIO SCMI w podsystemie IIO jądra systemu Linux który korzysta z protokołu SCMI Sensor Management Protocol udostępnianego przez ARM Interfejs SCMI (System Control and Management Interface) specyfikacja umożliwiająca wykrywanie i konfigurowanie czujników, odczytywanie danych z czujnika oraz otrzymywanie powiadomień o czujnikach zmian wartości.
Sterownik IIO SCMI korzysta ze sterownika VirtIO SCMI, który wykorzystuje transporter VirtIO
zgodnie z opisem w
virtio-scmi
specyfikacji do wymiany wiadomości SCMI z urządzeniem VirtIO SCMI w maszynie wirtualnej hosta. VirtIO
Urządzenie SCMI ma bezpośredni dostęp do czujników za pomocą sterowników specyficznych dla układów SoC.
Lokalizacja HAL czujnika
Referencyjna implementacja czujnika HAL, która korzysta z VirtIO SCMI, znajduje się pod adresem
device/google/trout/hal/sensors
Konfiguracja HAL czujnika
HAL czujnika może wymagać zmodyfikowania danych czujnika otrzymanych z hosta maszyny wirtualnej, aby zapewnić zgodność
Układ współrzędnych czujników w samochodzie z Androidem. Schemat konfiguracji czujnika znajduje się tutaj:
device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd
OEM może zapewnić konfigurację czujnika, na przykład orientację i lokalizację,
sensor_hal_configuration.xml
i skopiuj plik do
/odm/etc/sensors/
lub /vendor/etc/sensors/
.
Przykładowa konfiguracja czujnika:
<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 pojazdu
Implementacja HAL pojazdu składa się z 2 elementów:
- Klient. Udostępnia interfejsy API używane przez Androida w wirtualizowanym systemie AAOS
- Serwer. komunikuje się bezpośrednio ze sprzętem, na przykład autobusem samochodowym; (lub emulatora).
W przypadku wirtualizacji serwer VHAL działa na hoście maszyny wirtualnej. Komunikacja między klientem a serwerem VHAL
do GRPC-vsock
(więcej informacji znajdziesz w artykule
device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto
). OEM może używać
przez zastąpienie interfejsów API komunikacyjnych innego protokołu transportowego niż GRPC. Na przykład:
zobacz device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp
.
Inne podsystemy
VirtIO ma już dobrze zdefiniowany interfejs dla komponentów takich jak Block Storage
Sieć, konsola, wejście, gniazdo i entropia. W tych podsystemach AAOS używa
kierowca w stanie, w jakim jest, np. virtio-blk
, virtio-input
,
virtio-console
i virtio-net
.
Na zwirtualizowanej platformie referencyjnej AAOS sieć Wi-Fi jest obsługiwana przez mac80211_hwsim
aby włączyć sieć bezprzewodową VirtWifi
, która następnie używa tunelu virtio-net
wysyłanie ruchu sieciowego do hosta maszyny wirtualnej, która ma bezpośredni dostęp do rzeczywistej sieci Wi-Fi.