在 AAOS 中支持 VirtIO 所需的大多數更改都涉及 Android 通用內核中 HAL 實現級別及以下的更改。 Android 框架使用 AAOS 來賓 VM 內核中的 VirtIO 驅動程序與通用的硬件無關 HAL 進行通信,該驅動程序使用 VirtIO 協議與主機端的 VirtIO 設備進行通信。主機端的 VirtIO 設備可以使用 SoC 特定的設備驅動程序訪問物理硬件。
VirtIO 驅動程序和 VirtIO 設備之間的通信是通過virtqueue
進行的,它是分散聚集列表的類似 DMA 的環形緩衝區。多種傳輸方式,例如MMIO或PCI ,可用於在 VM 之間交換 VirtIO 消息。
在某些情況下, vsock
已被用於 VM 間通信。使用通過vsock
接口連接到單獨 VM 上的對等代理來支持車輛 HAL、音頻控制和 Dumpstate 通信。 GRPC-vsock
用於訪問這些非標準化子系統。 Android 源代碼樹中的GRPC已修改為與地址格式為vsock
vsock:CID:PORT_NUMBER
的 vsock 一起使用。
聲音的
在虛擬化 AAOS 中,Android 來賓 VM 可以使用virtio-snd
訪問音頻。 virtio-snd
向 Android VM 提供虛擬化 PCM 設備,以便音頻 HAL 實現可以通過 TinyALSA 庫與虛擬化聲音設備交互。
默認音頻 HAL 實現位於 AOSP 中的/device/google/trout/hal/audio/6.0
。 OEM 可以針對他們的平台修改ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
。 OEM 還可以通過覆蓋/device/google/trout/aosp_trout_common.mk.
音頻控制 HAL 管理 AAOS 中的音頻焦點。例如,當系統正在播放緊急聲音時,後台播放的音樂可能需要靜音。在這種情況下,音頻控制 HAL 會通知那些播放音樂的應用靜音。在虛擬化系統中,聲音可能來自其他虛擬機。在參考實現中,AAOS 來賓 VM 運行了一個音頻控制服務器守護進程,它使用GRPC-vsock
接收來自其他 VM 的音頻焦點請求。宿主 VM 可以使用device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
向 AAOS 發送音頻控制請求。當libandroid_audio_controller
持有音頻焦點時,它會繼續向 AAOS 發送心跳,直到焦點被釋放。
藍牙
藍牙實現基於下圖所示的設計。
藍牙免提配置文件
為了在trout
上啟用藍牙免提配置文件 (HFP),VirtIO 聲音設備規範已擴展為支持音頻控制。使用這種方法,主機/管理程序端的 VirtIO 聲音設備提供與 HFP 相關的三個音頻控制:
-
hfp_enable
-
hfp_set_sampling_rate
-
hfp_volume
當 AAOS 作為來賓 VM 運行時,AAOS 使用 TinyAlsa 來設置這些音頻控件。為了啟用 HFP 用例,主機/管理程序相應地執行供應商特定的路由和校準。
藍牙實現基於下面的設計插圖。
轉儲狀態
在為虛擬化 AAOS 生成錯誤報告時,包含主機 VM 信息是很有價值的,這樣開發人員可以更全面地了解系統。為此, trout
參考實現實現IDumpstateDevice
HAL,它通過GRPC-vsock
收集主機 VM 信息。 `tar` 打包的主機 VM 信息在錯誤報告中命名為dumpstate_board.bin
,而轉儲日誌位於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)
擴展視圖系統 (EVS) 用於顯示由後視和環視攝像頭捕獲的視頻。在虛擬化 AAOS 中,EVS 堆棧可以訪問來自使用 VirtIO-video 驅動程序的虛擬化 V4L2 流設備的視頻流。
車庫模式
有關詳細信息,請參閱什麼是車庫模式? .
進入和退出車庫模式由 Vehicle HAL 發送的AP_POWER_STATE_REQ
屬性觸發。在虛擬化模式下,車庫模式是從主機端觸發的。主機 VM 應保持開機狀態,以便為 Android VM 提供虛擬設備,直到 Android 關機。主機 VM 上的 VHAL 服務器向 AAOS 來賓 VM 發送關閉信號。收到信號 VHAL 客戶端后,AAOS VM 進入 Garage 模式並開始發送心跳信號以保持主機 VM 處於活動狀態。
全球導航衛星系統 (GNSS)
在trout
1.0 中,添加了對virtio-console
上的 GNSS 虛擬化的支持。該實現支持從主機到訪客的原始測量和位置修復的交換。
數據交換格式是 GnssLogger 應用程序使用的 CSV。在參考實現中,由於本機 GNSS 驅動程序不可用,因此可以使用模擬數據,但無需任何客戶端更改即可實現本機驅動程序。示例模擬主機代理作為trout
源代碼的一部分提供。
當前的實現期望 GNSS 初始化和輔助 GNSS (AGNSS) 由主機操作系統環境處理。
圖形
當 AAOS 作為客戶 VM 與其他汽車操作系統一起運行時,Android 可能無法直接訪問 GPU 或顯示控制器。在這種情況下,可以使用Mesa或goldfish-opengl
以及 Android 客戶 VM 和virtio-gpu
設備上的virtio-gpu
驅動程序來訪問 GPU。
在 Android 客戶 VM 上,Mesa 或goldfish-opengl
將 OpenGLES 命令分別編碼為鎵流或自動生成的 GLES 流。 virtio-gpu
內核驅動程序用作傳輸。在主機端, virglrenderer
(用於 Mesa)和vulkan-cereal
(用於goldfish-opengl
)在現有 GPU 驅動程序之上重放解碼的命令流。 AAOS 參考平台trout
僅支持具有 Vulkan 支持的 OpenGL ES,預計在未來的版本中。
傳感器
當 AAOS 作為訪客 VM 與其他汽車操作系統一起運行時,Android 可能無法直接訪問傳感器。在這種情況下,Android 客戶 VM 上的 Virtio-SCMI 驅動程序和主機 VM 上的 VirtIO-SCMI 設備用於訪問傳感器。 AAOS 虛擬化參考平台提供通用且與硬件無關的傳感器 HAL,可用於基於 ARM 的 SoC 訪問傳感器。
Sensor HAL 與 Linux Kernel IIO 子系統中的 IIO SCMI 驅動程序進行通信,該驅動程序使用ARM 系統控制和管理接口 (SCMI)規範提供的 SCMI 傳感器管理協議來發現和配置傳感器、讀取傳感器數據以及收到傳感器通知值變化。
IIO SCMI 驅動程序使用 VirtIO SCMI 驅動程序,它使用virtio-scmi
規範中指定的 VirtIO 傳輸協議與主機 VM 上的 VirtIO SCMI 設備交換 SCMI 消息。 VirtIO SCMI 設備可以通過 SoC 特定的傳感器驅動程序直接訪問傳感器。
傳感器 HAL 位置
使用 VirtIO SCMI 的傳感器 HAL 的參考實現位於device/google/trout/hal/sensors
。
傳感器 HAL 配置
Sensor HAL 可能需要修改從主機 VM 接收到的傳感器數據,以符合 Android 汽車傳感器坐標系。傳感器配置的架構可以在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
Vehicle HAL 實現由兩個組件組成:
- 客戶。提供 Android 在虛擬化 AAOS 中使用的 API
- 服務器。直接與硬件通信,例如車輛總線(或仿真器)。
在虛擬化中,VHAL 服務器在宿主 VM 上運行。 VHAL 客戶端和服務器通過GRPC-vsock
進行通信(有關更多信息,請參閱device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto
)。 OEM 可以通過覆蓋通信 API 來使用 GRPC 以外的不同傳輸協議。例如,請參閱device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp
。
其他子系統
VirtIO 已經為塊存儲、網絡、控制台、輸入、套接字和熵等組件提供了定義良好的接口。對於這些子系統,AAOS 按原樣使用驅動程序,例如virtio-blk
、 virtio-input
、 virtio-console
和virtio-net
。
在虛擬化 AAOS 參考平台中,通過mac80211_hwsim
支持 Wi-Fi 以啟用VirtWifi
無線網絡,然後使用virtio-net
隧道將網絡流量發送到主機 VM,主機 VM 可以直接訪問實際的 Wi-Fi 網絡。