アーキテクチャ

AAOS で VirtIO をサポートするために必要な変更のほとんどには、Android 共通カーネルの HAL 実装レベル以下の変更が含まれます。 Android フレームワークは、AAOS ゲスト VM カーネルの VirtIO ドライバーを使用して、ハードウェアに依存しない汎用 HAL と通信します。このドライバーは、VirtIO プロトコルを使用してホスト側の VirtIO デバイスと通信します。ホスト側の VirtIO デバイスは、SoC 固有のデバイス ドライバーを使用して物理 HW にアクセスできます。

VirtIO ドライバーと VirtIO デバイス間の通信は、分散収集リストの DMA に似たリング バッファーであるvirtqueueを使用して行われます。 MMIOPCIなどのいくつかのトランスポートを使用して、VM 間で VirtIO メッセージを交換できます。

場合によっては、 vsock VM 間通信に利用されています。 Vehicle HAL、Audio Control、および Dumpstate 通信は、 vsockインターフェイスを介した別の VM 上のピア エージェントへの接続を使用してサポートされます。 GRPC-vsockこれらの非標準サブシステムにアクセスするために使用されます。 Android ソース ツリーのGRPC は、 vsock:CID:PORT_NUMBERのアドレス形式でvsockで動作するように変更されました。

仮想化アーキテクチャ
図 1.仮想化アーキテクチャ

オーディオ

仮想化 AAOS では、Android ゲスト VM はvirtio-sndを使用してオーディオにアクセスできます。 virtio-snd 、仮想化された PCM デバイスを Android VM に提供し、オーディオ 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 は、音楽を再生しているアプリにミュートするように通知します。仮想化システムでは、サウンドは他の VM から発生する可能性があります。リファレンス実装では、AAOS ゲスト VM でオーディオ コントロール サーバー デーモンが実行されており、 GRPC-vsockを使用して他の VM からオーディオ フォーカス要求を受信します。ホスト VM はdevice/google/trout/hal/audiocontrol/2.0/libandroid_audio_controllerを使用して、オーディオ コントロール リクエストを AAOS に送信できます。 libandroid_audio_controllerオーディオ フォーカスを保持している間、フォーカスが解放されるまでハートビートを AAOS に送信し続けます。

オーディオアーキテクチャ
図 5.オーディオ アーキテクチャ

ブルートゥース

Bluetooth の実装は、以下に示す設計に基づいています。

Bluetooth アーキテクチャ
図 5. Bluetooth アーキテクチャ

Bluetooth ハンズフリー プロファイル

troutで Bluetooth ハンズフリー プロファイル (HFP) を有効にするために、VirtIO サウンド デバイス仕様が拡張され、オーディオ コントロールをサポートするようになりました。このアプローチを使用すると、ホスト/ハイパーバイザー側の VirtIO サウンド デバイスは、HFP に関連する次の 3 つのオーディオ コントロールを提供します。

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

AAOS がゲスト VM として実行される場合、AAOS は TinyAlsa を使用してこれらのオーディオ コントロールを設定します。 HFP の使用例を有効にするために、ホスト/ハイパーバイザーはベンダー固有のルーティングと調整をそれに応じて実行します。

Bluetooth の実装は、以下の設計図に基づいています。

Bluetooth アーキテクチャ
図 5. Bluetooth アーキテクチャ

ダンプステート

仮想化 AAOS のバグレポートを生成するときは、開発者がシステムをより包括的に把握できるように、ホスト VM 情報を含めることが重要です。これを実現するために、 troutリファレンス実装では、 GRPC-vsockを通じてホスト VM 情報を収集するIDumpstateDevice HAL を実装します。 「tar」でパッケージ化されたホスト VM 情報は、バグレポートでは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 ファイルのパスを dumpstate サーバーに渡します。例:
    --config_file my_config.xml
    

拡張ビュー システム (EVS)

拡張ビュー システム (EVS) は、リアビュー カメラとサラウンド ビュー カメラでキャプチャされたビデオを表示するために使用されます。仮想化 AAOS では、EVS スタックは、VirtIO ビデオ ドライバーを使用する仮想化 V4L2 ストリーミング デバイスからのビデオ ストリームにアクセスできます。

ガレージモード

詳細については、 「ガレージ モード」を参照してください。

ガレージ モードの開始と終了は、車両 HAL によって送信されるAP_POWER_STATE_REQプロパティによってトリガーされます。仮想化モードでは、ガレージ モードはホスト側からトリガーされます。 Android VM に仮想デバイスを提供するために、Android がパワーオフされるまで、ホスト VM はパワーオン状態を維持する必要があります。ホスト VM 上の VHAL サーバーは、AAOS ゲスト VM にシャットダウン信号を送信します。 VHAL クライアントの信号を受信すると、AAOS VM はガレージ モードに入り、ホスト VM をアクティブに保つためにハートビート信号の送信を開始します。

全地球測位衛星システム (GNSS)

trout 1.0 では、 virtio-consoleを介した GNSS 仮想化のサポートが追加されました。この実装では、ホストからゲストへの生の測定値と位置修正の交換がサポートされています。

データ交換形式は、GnssLogger アプリで使用される CSV です。リファレンス実装では、ネイティブ GNSS ドライバーが利用できないため、モック データが利用可能になりますが、ゲスト側を変更することなくネイティブ ドライバーを実装できます。サンプルのモック ホスト エージェントは、 troutソース コードの一部として提供されます。

現在の実装では、GNSS の初期化と支援 GNSS (AGNSS) がホスト OS 環境によって処理されることが想定されています。

GNSSアーキテクチャ
図 2. GNSS アーキテクチャ

グラフィックス

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将来のリリースで予定されている Vulkan サポートでのみOpenGL ES をサポートします。

グラフィックスアーキテクチャ
図 3.グラフィックス アーキテクチャ

センサー

AAOS が他の自動車用オペレーティング システムと一緒にゲスト VM として実行されている場合、Android はセンサーに直接アクセスできない可能性があります。この場合、センサーへのアクセスには、Android ゲスト VM 上の Virtio-SCMI ドライバーとホスト VM 上の VirtIO-SCMI デバイスが使用されます。 AAOS 仮想化リファレンス プラットフォームは、ARM ベースの SoC がセンサーにアクセスするために使用できる、汎用の HW に依存しないセンサー HAL を提供します。

センサー 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 は、Android カー センサー座標系に準拠するために、ホスト VM から受信したセンサー データを変更する必要がある場合があります。センサー構成のスキーマは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 実装は、次の 2 つのコンポーネントで構成されます。

  • クライアント。仮想化された AAOS で Android が使用する 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 リファレンス プラットフォームでは、Wi-Fi がmac80211_hwsimでサポートされ、 VirtWifiワイヤレス ネットワークが有効になります。その後、 virtio-netトンネルを使用してネットワーク トラフィックがホスト VM に送信され、ホスト VM は実際の Wi-Fi ネットワークに直接アクセスできます。