架構

在 AAOS 中支援 VirtIO 所需的大部分變更涉及 HAL 實作等級及 Android 通用核心以下層級的變更。 Android 框架使用 AAOS 來賓 VM 核心中的 VirtIO 驅動程式與通用硬體無關的 HAL 進行通信,該驅動程式使用 VirtIO 協定與主機端的 VirtIO 裝置進行通訊。主機端的 VirtIO 裝置可以使用 SoC 特定的裝置驅動程式存取實體硬體。

VirtIO 驅動程式和 VirtIO 裝置之間的通訊透過virtqueue進行,它是分散收集清單的類似 DMA 的環形緩衝區。 MMIOPCI等多種傳輸方式可用於在虛擬機器之間交換 VirtIO 訊息。

在某些情況下, vsock已用於虛擬機間通訊。透過vsock介面連接到單獨虛擬機器上的對等代理,支援車輛 HAL、音訊控制和轉儲狀態通訊。 GRPC-vsock用於存取這些非標準化子系統。 Android 原始碼樹中的GRPC已修改為與vsock一起使用,位址格式為vsock:CID:PORT_NUMBER

虛擬化架構
圖 1.虛擬化架構

聲音的

在虛擬化 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 發送心跳,直到焦點被釋放。

音訊架構
圖 5.音訊架構

藍牙

藍牙實現基於下圖所示的設計。

藍牙架構
圖 5.藍牙架構

藍牙免持設定檔

為了在trout上啟用藍牙免持設定檔 (HFP),VirtIO 聲音裝置規格已擴展為支援音訊控制。使用此方法,主機/管理程式端的 VirtIO 聲音裝置提供以下三個與 HFP 相關的音訊控制:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

當 AAOS 作為來賓 VM 運行時,AAOS 使用 TinyAlsa 來設定這些音訊控制。為了啟用 HFP 用例,主機/管理程式會相應地執行供應商特定的路由和校準。

藍牙實現基於下面的設計插圖。

藍牙架構
圖 5.藍牙架構

轉儲狀態

在產生虛擬化 AAOS 的錯誤報告時,包含主機 VM 資訊很有價值,這樣開發人員可以更全面地了解系統。為了實現這一點, trout參考實作實現了IDumpstateDevice HAL,它透過GRPC-vsock收集主機 VM 資訊。 「tar」打包的主機虛擬機器資訊在錯誤報告中名為dumpstate_board.bin ,而轉儲日誌位於dumpstate_board.txt

配置要執行的命令:

  1. 將下列檔案中的設定詳細資訊複製到 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>
    
  2. 啟動時將新 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) 由主機作業系統環境處理。

全球導航衛星系統架構
圖 2. GNSS 架構

圖形

當 AAOS 作為來賓虛擬機器與其他汽車作業系統一起運作時,​​Android 可能無法直接存取 GPU 或顯示器控制器。在這種情況下,可以使用Mesagoldfish-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,預計將在未來版本中提供支援。

圖形架構
圖 3.圖形架構

感應器

當 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 特定的感測器驅動程式直接存取感測器。

感測器架構
圖 4.感測器架構

感測器 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-blkvirtio-inputvirtio-consolevirtio-net

在虛擬化 AAOS 參考平台中, mac80211_hwsim支援 Wi-Fi,以啟用VirtWifi無線網絡,然後使用virtio-net隧道將網路流量傳送到主機虛擬機,主機虛擬機可以直接存取實際的 Wi-Fi 網路。