Most of the changes needed to support VirtIO in AAOS involve changes at the HAL implementation level and below in the Android Common Kernel. The Android framework communicates with a generic hardware-agnostic HAL using the VirtIO drivers in the AAOS guest VM kernel, which communicates with VirtIO devices on the host side using VirtIO protocols. VirtIO devices on the host side can access the physical HW using SoC-specific device drivers.
ارتباط بین درایور VirtIO و دستگاه VirtIO با virtqueue انجام میشود که بافرهای حلقهای شبیه DMA از لیستهای جمعآوری پراکنده هستند. چندین انتقال، مانند MMIO یا PCI، میتوانند برای تبادل پیامهای VirtIO بین ماشینهای مجازی استفاده شوند.
In some cases, vsock is used for inter-VM communication. Vehicle HAL (VHAL), Audio Control, and Dumpstate communications are supported using a connection to a peer agent on a separate VM over a vsock interface. gRPC over vsock is used to access these non-standardized subsystems. gRPC in the Android source tree is modified to work with vsock with the address format of vsock:CID:PORT_NUMBER .

شکل ۱. معماری مجازیسازی.
صوتی
در AAOS مجازی، ماشین مجازی مهمان اندروید میتواند virtio-snd برای دسترسی به صدا استفاده کند. virtio-snd دستگاههای PCM مجازی را در اختیار ماشین مجازی اندروید قرار میدهد تا پیادهسازی HAL صوتی بتواند با دستگاههای صوتی مجازی با کتابخانه TinyALSA تعامل داشته باشد.
پیادهسازی پیشفرض HAL صوتی در AOSP در آدرس /device/google/trout/hal/audio/6.0 قرار دارد. تولیدکنندگان اصلی تجهیزات (OEM) میتوانند ro.vendor.trout.audiohal.{in,out}_period_{ms,count} را برای پلتفرم خود تغییر دهند. تولیدکنندگان اصلی تجهیزات همچنین میتوانند HAL صوتی خود را با لغو متغیرهای مرتبط با صدا در /device/google/trout/aosp_trout_common.mk.
The audio control HAL manages the audio focus in AAOS. For example, when the system is playing emergency sounds, music playing in the background might need to be muted. The audio control HAL notifies those apps playing music to mute in this situation. In the virtualized system, the sounds can come from other VMs. In the reference implementation, the AAOS guest VM has an audio control server daemon running, which uses gRPC over vsock to receive audio focus requests from other VMs. The host VM can use device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller to send audio control requests to AAOS. While libandroid_audio_controller holds the audio focus, it continues to send heartbeats to AAOS until focus is released.

شکل ۲. معماری صوتی.
بلوتوث
پیادهسازی بلوتوث در شکل زیر نشان داده شده است:

شکل ۳. معماری بلوتوث.
پروفایل هندزفری بلوتوث
برای فعال کردن پروفایل هندزفری بلوتوث (HFP) در trout ، مشخصات دستگاه صوتی VirtIO برای پشتیبانی از کنترلهای صوتی گسترش یافته است. با استفاده از این رویکرد، یک دستگاه صوتی VirtIO در سمت میزبان/هایپروایزر این سه کنترل صوتی مربوط به HFP را ارائه میدهد:
-
hfp_enable -
hfp_set_sampling_rate -
hfp_volume
وقتی AAOS به عنوان یک ماشین مجازی مهمان اجرا میشود، AAOS از TinyALSA برای تنظیم این کنترلهای صوتی استفاده میکند. برای فعال کردن مورد استفاده HFP، میزبان/هایپروایزر مسیریابی و کالیبراسیون مختص فروشنده را بر اساس آن انجام میدهد.
پیادهسازی بلوتوث بر اساس تصویر طراحی زیر است:

شکل ۴. معماری بلوتوث.
زبالهدان
When generating the bug report for virtualized AAOS, it's valuable to include host VM information so that the developers have a more comprehensive view of the system. To accomplish this, the trout reference implementation implements IDumpstateDevice HAL, which collects the host VM information through gRPC over vsock . The tar packaged host VM information is named dumpstate_board.bin in the bug report while dumping logs are at dumpstate_board.txt .
برای پیکربندی دستوراتی که باید اجرا شوند:
- جزئیات پیکربندی را از فایل زیر در یک فایل XML، مثلاً
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> - هنگام اجرا، مسیر فایل XML جدید را به سرور dumpstate ارسال کنید، برای مثال:
--config_file my_config.xml
سیستم نمای توسعهیافته
سیستم نمای گسترده (EVS) ویدئوهای ضبط شده توسط دوربینهای دید عقب و اطراف را نمایش میدهد. در AAOS مجازی، پشته EVS میتواند به جریان ویدئو از دستگاه مجازی V4L2 که از درایور VirtIO-video استفاده میکند، دسترسی داشته باشد.
حالت گاراژ
Entering and exiting Garage mode is triggered by AP_POWER_STATE_REQ properties sent by the VHAL. In virtualization mode, Garage mode is triggered from the host side. The host VM should remain powered on to provide virtual devices for Android VM, until Android is powered off. The VHAL server on the host VM sends the shutdown signal to the AAOS guest VM. Upon receiving the signal VHAL client, the AAOS VM enters Garage mode and starts to send heartbeat signals to keep the host VM active. For more information, see Garage Mode .
سامانه ماهوارهای ناوبری جهانی (GNSS)
در trout 1.0، پشتیبانی از مجازیسازی GNSS از طریق virtio-console گنجانده شده است. این پیادهسازی از تبادل اندازهگیریهای خام و تنظیمات مکانی از میزبان به مهمان پشتیبانی میکند.
فرمت تبادل داده، CSV است که توسط برنامه GNSSLogger استفاده میشود. در پیادهسازی مرجع، درایور GNSS بومی در دسترس نیست، بنابراین دادههای شبیهسازی شده در دسترس هستند. میتوانید یک درایور بومی را بدون هیچ گونه تغییر سمت مهمان پیادهسازی کنید. یک عامل میزبان شبیهسازی شده نمونه به عنوان بخشی از کد منبع trout ارائه شده است.
این پیادهسازی انتظار دارد که مقداردهی اولیه GNSS و GNSS کمکی (AGNSS) توسط محیط سیستم عامل میزبان انجام شود.

شکل ۵. معماری GNSS.
گرافیک
وقتی AAOS به عنوان یک ماشین مجازی مهمان در کنار سایر سیستم عاملهای خودرو اجرا میشود، ممکن است اندروید دسترسی مستقیم به GPU یا کنترلکننده نمایشگر نداشته باشد. در این حالت، میتوانید با استفاده از Mesa یا goldfish-opengl و یک درایور virtio-gpu در ماشین مجازی مهمان اندروید و دستگاه virtio-gpu به GPU دسترسی پیدا کنید.
On the Android guest VM, Mesa, or goldfish-opengl encodes OpenGLES commands either into a Gallium stream or an auto-generated GLES stream, respectively. The virtio-gpu kernel driver is used as a transport. On the host side, virglrenderer (for Mesa) and vulkan-cereal (for goldfish-opengl ) replay the decoded command stream on top of the existing GPU driver. The AAOS reference platform trout supports OpenGL ES only with Vulkan support, anticipated in a future release.

شکل ۶. معماری گرافیک.
حسگرها
When AAOS is running as a guest VM along with other automotive operating systems, Android might not have direct access to the sensors. In this case, you can access the sensors using the Virtio-SCMI driver on the Android guest VM and the VirtIO-SCMI device on the host VM. The AAOS virtualization reference platform provides a generic and HW-agnostic Sensor HAL that you can use for ARM-based SoCs to access the sensors.
حسگر HAL با درایور IIO SCMI در زیرسیستم IIO هسته لینوکس ارتباط برقرار میکند، که از پروتکل مدیریت حسگر SCMI ارائه شده توسط مشخصات رابط کنترل و مدیریت سیستم ARM (SCMI) برای کشف و پیکربندی حسگرها، خواندن دادههای حسگر و اطلاعرسانی از تغییرات مقدار حسگر استفاده میکند.
درایور IIO SCMI از درایور VirtIO SCMI استفاده میکند که از پروتکل انتقال VirtIO در مشخصات virtio-scmi برای تبادل پیامهای SCMI با دستگاه VirtIO SCMI در ماشین مجازی میزبان استفاده میکند. دستگاه VirtIO SCMI از طریق درایورهای حسگر مخصوص SoC به حسگرها دسترسی مستقیم دارد.

شکل ۷. معماری حسگر.
محل سنسور HAL
پیادهسازی مرجع حسگر HAL که از VirtIO SCMI استفاده میکند، در device/google/trout/hal/sensors قرار دارد.
پیکربندی سنسور HAL
ممکن است HAL حسگر نیاز داشته باشد دادههای حسگر دریافتی از ماشین مجازی میزبان را برای مطابقت با سیستم مختصات حسگر خودروی اندروید تغییر دهد. طرحواره پیکربندی حسگر را میتوان در device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd یافت.
تولیدکنندگان اصلی تجهیزات (OEM) میتوانند پیکربندی حسگر، مانند جهت و مکان، را در sensor_hal_configuration.xml ارائه دهند و فایل را در /odm/etc/sensors/ یا /vendor/etc/sensors/ کپی کنند. پیکربندی حسگر در مثال زیر ارائه شده است:
<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
پیادهسازی HAL خودرو (VHAL) از دو جزء تشکیل شده است:
- کلاینت. APIهای مورد استفاده اندروید در AAOS مجازی را فراهم میکند.
- سرور. مستقیماً با سختافزار، مانند گذرگاههای وسایل نقلیه (یا یک شبیهساز) ارتباط برقرار میکند.
In virtualization, the VHAL server runs on the host VM. The VHAL client and server communicate through gRPC over vsock . For more information, see device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto . OEMs can use a different transport protocol other than gRPC by overriding the communication APIs. For examples, see device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .
سایر زیرسیستمها
VirtIO از قبل یک رابط کاربری خوشتعریف برای اجزایی مانند Block Storage، Network، Console، Input، Socket و Entropy ارائه میدهد. برای این زیرسیستمها، AAOS از درایور به همان شکلی که هست، مانند virtio-blk ، virtio-input ، virtio-console و virtio-net استفاده میکند.
در پلتفرم مرجع مجازی AAOS، وایفای با mac80211_hwsim پشتیبانی میشود تا یک شبکه بیسیم VirtWifi را فعال کند، که سپس از تونل virtio-net برای ارسال ترافیک شبکه به ماشین مجازی میزبان استفاده میکند، که دسترسی مستقیم به شبکه وایفای واقعی دارد.