在 AAOS 中支援 VirtIO 所需的大多數變更,大多涉及 HAL 變更 以及 Android 常見核心的實作等級和更低的級別Android 架構 使用 AAOS 訪客的 VirtIO 驅動程式與無硬體通用 HAL 通訊 VM 核心,可使用 VirtIO 通訊協定在主機端與 VirtIO 裝置通訊。 主機端的 VirtIO 裝置可透過 SoC 專用裝置驅動程式存取實體 HW。
透過使用
virtqueue
是類似 DMA 的散佈緩衝區,也就是散佈清單的環形緩衝區。
數種傳輸方式,例如
MMIO
或
PCI
可用於在 VM 之間交換 VirtIO 訊息。
在某些情況下,vsock
曾用於 VM 之間的通訊。
需要連線才能支援車輛 HAL、音訊控制和 Dumpstate 通訊
透過 vsock
介面將訊息傳送至個別 VM 上的對等互連代理程式。
GRPC-vsock
可用來存取這些非標準化子系統。
GRPC
已修改,可與 vsock
搭配使用
格式為 vsock:CID:PORT_NUMBER
。
音訊
在虛擬化 AAOS 中,Android 訪客 VM 可透過 virtio-snd
存取音訊。
virtio-snd
會將虛擬化的 PCM 裝置提供給 Android VM,讓
音訊 HAL 實作可以與虛擬化音效裝置
TinyALSA 程式庫。
預設的音訊 HAL 實作項目位於 Android 開放原始碼計畫:
/device/google/trout/hal/audio/6.0
。原始設備製造商 (OEM) 可以修改
ro.vendor.trout.audiohal.{in,out}_period_{ms,count}
。原始設備製造商 (OEM) 可以
實作自己的音訊 HAL,方法是覆寫
/device/google/trout/aosp_trout_common.mk.
音訊控制 HAL 會管理 AAOS 中的音訊焦點。例如在系統播放時
緊急警報聲、背景音樂可能必須設為靜音。音訊控制 HAL
在這種情況下,會通知正在播放音樂的應用程式設為靜音。在虛擬化系統中
聲音可能來自其他 VM在參考實作中,AAOS 訪客 VM
音訊控制伺服器 Daemon 正在執行,使用 GRPC-vsock
接收
從其他 VM 發出的音訊焦點要求
主機 VM 可使用 device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
將音訊控制要求傳送至 AAOS。libandroid_audio_controller
會保留
音訊焦點,將持續傳送心跳至 AAOS,直到焦點釋出為止。
藍牙
藍牙實作以如下圖的設計為基礎。
藍牙免持通訊設定檔
如要在「trout
」上啟用藍牙免持聽筒設定檔 (HFP),VirtIO 音效裝置
擴充規格,以便支援音訊控制項。透過這種做法
裝置 (主機/管理程序端) 提供以下三種與 HFP 相關的音訊控制功能:
hfp_enable
hfp_set_sampling_rate
hfp_volume
當 AAOS 以訪客 VM 的形式執行時,AAOS 會使用 TinyAlsa 設定這些音訊控制項。若要啟用 HFP 就本質上來說,主機/管理程序會執行供應商專屬轉送和校正。
藍牙實作結果是以下方設計插圖為基礎。
Dumpstate
產生虛擬化 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 檔案的路徑至轉儲伺服器。例如:
--config_file my_config.xml
延伸觀看系統 (EVS)
延伸觀看系統 (EVS) 用於顯示後視畫面及 。在虛擬化 AAOS 中,EVS 堆疊可從以下位置存取影片串流: 使用 VirtIO-Video 驅動程式的虛擬化 V4L2 串流裝置。
車庫模式
若需更多資訊,請參閲 車庫模式:
AP_POWER_STATE_REQ
屬性會觸發車庫的進入和離開車庫模式
傳送路徑在虛擬化模式中,車庫模式會從主機端觸發。
主機 VM 應保持開機狀態,以便提供 Android VM 虛擬裝置,直到 Android 裝置啟動為止
目前關機了。主機 VM 上的 VHAL 伺服器會將關機訊號傳送至 AAOS 訪客 VM。
收到訊號 VHAL 用戶端的訊號後,AAOS VM 就會進入車庫模式並開始傳送活動訊號
保持啟用主機 VM 的信號。
全球導航衛星系統 (GNSS)
trout
1.0 版支援透過 virtio-console
的 GNSS 虛擬化功能
已加入。這個實作項目支援交換原始測量結果和位置修正
。
資料交換格式是 GnssLogger 應用程式使用的 CSV,在參考實作中
由於無法使用原生 GNSS 驅動程式,取得模擬資料但原生驅動程式
不需要任何訪客端變更即可實作。模擬主機代理程式如
trout
原始碼。
在目前的導入方式中,系統需要處理 GNSS 初始化和輔助 GNSS (AGNSS) 主機 OS 環境
圖形
如果 AAOS 以訪客 VM 和其他汽車作業系統一起執行,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 以訪客 VM 和其他車用作業系統的形式執行時, Android 可能無法直接存取感應器。在這種情況下, 系統會使用主機 VM 上的 Android 訪客 VM 和 VirtIO-SCMI 裝置存取感應器。 AAOS 虛擬化參考平台提供通用和 HW 通用感應器 HAL, 且可用於以 ARM 為基礎的 SoC 來存取感應器
感應器 HAL 會與 Linux 核心 IIO 子系統中的 IIO SCMI 驅動程式進行通訊, 其採用的 SCMI 感應器管理通訊協定 ARM 系統控制與管理介面 (SCMI) 探索及設定感應器、讀取感應器資料,以及接收感應器通知 值的變化。
IIO SCMI 驅動程式使用 VirtIO SCMI 驅動程式,該驅動程式採用 VirtIO 傳輸
通訊協定 (英文)
virtio-scmi
規格來交換 SCMI 訊息,以在主機 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
車輛 HAL 實作包含兩個元件:
- 客戶:提供 Android 在虛擬化 AAOS 中使用的 API
- 伺服器:直接與硬體通訊,例如汽車公車 (或模擬器)。
在虛擬化中,VHAL 伺服器會在主機 VM 上執行。VHAL 用戶端和伺服器通訊
透過 GRPC-vsock
(如需更多資訊,請參閱
device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto
)。原始設備製造商 (OEM) 可使用
與 GRPC 不同的傳輸通訊協定,這必須覆寫通訊 API例如
請參閱 device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp
。
其他子系統
VirtIO 已為 Block Storage 等元件提供明確定義的介面
網路、主控台、Input、Socket 和 Entropy。針對這些子系統,AAOS 會使用
當下的驅動程式,例如 virtio-blk
、virtio-input
virtio-console
和virtio-net
。
在虛擬化 AAOS 參考平台中,mac80211_hwsim
支援 Wi-Fi
啟用 VirtWifi
無線網路,之後會使用 virtio-net
通道
將網路流量傳送至主機 VM,該 VM 可直接存取實際的 Wi-Fi 網路。