在 AAOS 中支援 VirtIO 所需的大部分變更涉及 HAL 實作等級及 Android 通用核心以下層級的變更。 Android 框架使用 AAOS 來賓 VM 核心中的 VirtIO 驅動程式與通用硬體無關的 HAL 進行通信,該驅動程式使用 VirtIO 協定與主機端的 VirtIO 裝置進行通訊。主機端的 VirtIO 裝置可以使用 SoC 特定的裝置驅動程式存取實體硬體。
VirtIO 驅動程式和 VirtIO 裝置之間的通訊透過virtqueue
進行,它是分散收集清單的類似 DMA 的環形緩衝區。 MMIO或PCI等多種傳輸方式可用於在虛擬機器之間交換 VirtIO 訊息。
在某些情況下, vsock
已用於虛擬機間通訊。透過vsock
介面連接到單獨虛擬機器上的對等代理,支援車輛 HAL、音訊控制和轉儲狀態通訊。 GRPC-vsock
用於存取這些非標準化子系統。 Android 原始碼樹中的GRPC已修改為與vsock
一起使用,位址格式為vsock:CID:PORT_NUMBER
。
聲音的
在虛擬化 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」打包的主機虛擬機器資訊在錯誤報告中名為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 檔案的路徑傳遞到轉儲狀態伺服器。例如:
--config_file my_config.xml
擴展視圖系統 (EVS)
擴展視圖系統(EVS)用於顯示後視和環視攝影機擷取的影片。在虛擬化 AAOS 中,EVS 堆疊可以從使用 VirtIO-video 驅動程式的虛擬化 V4L2 串流設備存取視訊串流。
車庫模式
有關更多信息,請參閱車庫模式。
進入和退出車庫模式由車輛 HAL 發送的AP_POWER_STATE_REQ
屬性觸發。在虛擬化模式下,Garage模式是從主機端觸發的。主機 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 作為來賓虛擬機器與其他汽車作業系統一起運作時,Android 可能無法直接存取 GPU 或顯示器控制器。在這種情況下,可以使用Mesa或goldfish-opengl
以及 Android 來賓 VM 和virtio-gpu
裝置上的virtio-gpu
驅動程式來存取 GPU。
在 Android 來賓 VM 上,Mesa 或goldfish-opengl
將 OpenGLES 指令分別編碼到 Gallium 流或自動產生的 GLES 流中。 virtio-gpu
核心驅動程式用作傳輸。在主機端, virglrenderer
(對於 Mesa )和vulkan-cereal
(對於goldfish-opengl
)在現有 GPU 驅動程式之上重播解碼的命令流。 AAOS 參考平台trout
僅支援 OpenGL ES,並且支援 Vulkan,預計將在未來版本中提供支援。
感應器
當 AAOS 作為來賓虛擬機器與其他汽車作業系統一起運作時,Android 可能無法直接存取感測器。在這種情況下,Android 來賓虛擬機器上的 Virtio-SCMI 驅動程式和主機虛擬機器上的 VirtIO-SCMI 裝置用於存取感測器。 AAOS 虛擬化參考平台提供通用且與硬體無關的感測器 HAL,可用於基於 ARM 的 SoC 存取感測器。
Sensor HAL 與 Linux 核心 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 配置
感測器 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
隧道將網路流量傳送到主機虛擬機,主機虛擬機可以直接存取實際的 Wi-Fi 網路。