Архитектура

Most of the changes needed to support VirtIO in AAOS involve changes at the HAL implementation level and below in the Android Common Kernel. The Android framework communicates with a generic hardware-agnostic HAL using the VirtIO drivers in the AAOS guest VM kernel, which communicates with VirtIO devices on the host side using VirtIO protocols. VirtIO devices on the host side can access the physical HW using SoC-specific device drivers.

Обмен данными между драйвером VirtIO и устройством VirtIO осуществляется с помощью virtqueue , представляющих собой кольцевые буферы, подобные DMA, содержащие списки разбросанных данных. Для обмена сообщениями VirtIO между виртуальными машинами можно использовать несколько транспортных протоколов, таких как MMIO или PCI .

In some cases, vsock has been leveraged for inter-VM communication. Vehicle HAL, Audio Control, and Dumpstate communications are supported using a connection to a peer agent on a separate VM over a vsock interface. GRPC-vsock is used to access these non-standardized subsystems. GRPC in the Android source tree has been modified to work with vsock with the address format of vsock:CID:PORT_NUMBER .

Архитектура виртуализации
Рисунок 1. Архитектура виртуализации

Аудио

В виртуализированной AAOS гостевая виртуальная машина Android может использовать virtio-snd для доступа к аудио. virtio-snd предоставляет виртуальной машине Android виртуализированные PCM-устройства, чтобы реализация аудио HAL могла взаимодействовать с виртуализированными звуковыми устройствами с помощью библиотеки TinyALSA.

Реализация HAL для аудио по умолчанию находится в AOSP по адресу /device/google/trout/hal/audio/6.0 . Производители оборудования могут изменить ro.vendor.trout.audiohal.{in,out}_period_{ms,count} для своей платформы. Производители оборудования также могут реализовать свой собственный HAL для аудио, переопределив переменные, связанные с аудио, в файле /device/google/trout/aosp_trout_common.mk.

The audio control HAL manages the audio focus in AAOS. For example, when the system is playing emergency sounds, music playing in the background might need to be muted. The audio control HAL notifies those apps playing music to mute in this situation. In the virtualized system, the sounds can come from other VMs. In the reference implementation, the AAOS guest VM has an audio control server daemon running, which uses GRPC-vsock to receive audio focus requests from other VMs. The host VM can use device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller to send audio control requests to AAOS. While libandroid_audio_controller holds the audio focus, it continues to send heartbeats to AAOS until focus is released.

Аудиоархитектура
Рисунок 5. Аудиоархитектура

Bluetooth

Реализация Bluetooth основана на схеме, показанной ниже.

архитектура Bluetooth
Рисунок 5. Архитектура Bluetooth.

Профиль громкой связи Bluetooth

Для включения профиля Bluetooth Hands-Free Profile (HFP) в trout , спецификация звукового устройства VirtIO была расширена для поддержки управления звуком. Используя этот подход, звуковое устройство VirtIO на стороне хоста/гипервизора предоставляет три элемента управления звуком, связанные с HFP:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Когда AAOS работает в качестве гостевой виртуальной машины, AAOS использует TinyAlsa для настройки параметров звука. Для обеспечения возможности использования HFP хост/гипервизор выполняет маршрутизацию и калибровку в соответствии со спецификациями производителя.

Реализация Bluetooth основана на представленном ниже примере конструкции.

архитектура Bluetooth
Рисунок 5. Архитектура Bluetooth.

Дампстейт

When generating the bugreport for virtualized AAOS, it's valuable to include host VM information so that the developers have a more comprehensive view of the system. To accomplish this, the trout reference implementation implements IDumpstateDevice HAL, which collects the host VM information through GRPC-vsock . The `tar`-packaged host VM information is named dumpstate_board.bin in the bugreport while dumping logs are at 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. При запуске передайте серверу dumpstate путь к новому XML-файлу. Например:
    --config_file my_config.xml
    

Система расширенного обзора (EVS)

Система расширенного обзора (EVS) используется для отображения видео, захваченного камерами заднего и кругового обзора. В виртуализированной AAOS стек EVS может получать доступ к видеопотоку с виртуализированного потокового устройства V4L2, использующего драйвер VirtIO-video.

Режим гаража

Для получения более подробной информации см. раздел «Режим гаража» .

Entering and exiting Garage mode is triggered by AP_POWER_STATE_REQ properties sent by the Vehicle HAL. In virtualization mode, Garage mode is triggered from the host side. The host VM should remain powered on to provide virtual devices for Android VM, until Android is powered off. The VHAL server on the host VM sends the shutdown signal to the AAOS guest VM. Upon receiving the signal VHAL client, the AAOS VM enters Garage mode and starts to send heartbeat signals to keep the host VM active.

Глобальная навигационная спутниковая система (GNSS)

В trout 1.0 добавлена ​​поддержка виртуализации GNSS через virtio-console . Реализация поддерживает обмен необработанными измерениями и данными о местоположении между хостом и гостевой системой.

Формат обмена данными — CSV, используемый приложением GnssLogger. В эталонной реализации, поскольку собственный драйвер GNSS недоступен, используются фиктивные данные, но собственный драйвер может быть реализован без каких-либо изменений на стороне гостевой системы. Пример фиктивного агента хоста предоставляется в составе исходного кода trout .

В текущей реализации предполагается, что инициализация GNSS и вспомогательная GNSS (AGNSS) будут обрабатываться операционной системой хоста.

Архитектура GNSS
Рисунок 2. Архитектура GNSS.

Графика

Когда AAOS работает в качестве гостевой виртуальной машины вместе с другими автомобильными операционными системами, Android может не иметь прямого доступа к графическому процессору или контроллеру дисплея. В этом случае для доступа к графическому процессору можно использовать Mesa или goldfish-opengl и драйвер virtio-gpu на гостевой виртуальной машине Android и устройстве virtio-gpu .

On the Android guest VM, Mesa or goldfish-opengl encodes OpenGLES commands either into a Gallium stream or an auto-generated GLES stream, respectively. The virtio-gpu kernel driver is used as a transport. On the host side, virglrenderer (for Mesa) and vulkan-cereal (for goldfish-opengl ) replay the decoded command stream on top of the existing GPU driver. The AAOS reference platform trout supports OpenGL ES only with Vulkan support, anticipated in a future release.

Графическая архитектура
Рисунок 3. Графическая архитектура

Датчики

When AAOS is running as a guest VM alongside other automotive operating systems, Android might not have direct access to the sensors. In this case, the Virtio-SCMI driver on the Android guest VM and the VirtIO-SCMI device on the Host VM are used to access the sensors. The AAOS virtualization reference platform provides a generic and HW-agnostic Sensor HAL that can be used for ARM-based SoCs to access the sensors.

Sensor HAL взаимодействует с драйвером IIO SCMI в подсистеме IIO ядра Linux, который использует протокол управления датчиками SCMI, предоставляемый спецификацией интерфейса управления и контроля системы ARM (SCMI), для обнаружения и настройки датчиков, чтения данных с датчиков и получения уведомлений об изменении значений датчиков.

Драйвер IIO SCMI использует драйвер VirtIO SCMI, который применяет транспортный протокол VirtIO, как указано в спецификации virtio-scmi для обмена сообщениями SCMI с устройством VirtIO SCMI на хост-машине. Устройство VirtIO SCMI имеет прямой доступ к датчикам через драйверы датчиков, специфичные для SoC.

Архитектура сенсора
Рисунок 4. Архитектура датчика.

Местоположение датчика HAL

Эталонная реализация сенсорного HAL, использующая VirtIO SCMI, находится по адресу device/google/trout/hal/sensors .

Конфигурация сенсора HAL

Возможно, Sensor HAL потребуется изменить данные датчиков, полученные от виртуальной машины хоста, чтобы они соответствовали системе координат автомобильных датчиков Android. Схему конфигурации датчиков можно найти в device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd .

Производители оборудования могут указать конфигурацию датчиков, например, ориентацию и местоположение, в файле 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 для транспортных средств состоит из двух компонентов:

  • Клиент. Предоставляет API, используемые Android в виртуализированной AAOS.
  • Сервер. Осуществляет прямую связь с оборудованием, например, с автомобильными шинами (или эмулятором).

In virtualization, the VHAL server runs on the host VM. The VHAL client and server communicate through GRPC-vsock (for more information, see device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). OEMs can use a different transport protocol other than GRPC by overriding the communication APIs. For examples, see device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .

Другие подсистемы

VirtIO уже предоставляет четко определенный интерфейс для таких компонентов, как блочное хранилище, сеть, консоль, ввод, сокет и энтропия. Для этих подсистем AAOS использует драйвер в неизменном виде, например, virtio-blk , virtio-input , virtio-console и virtio-net .

В виртуализированной эталонной платформе AAOS поддержка Wi-Fi осуществляется с помощью mac80211_hwsim , что позволяет создать беспроводную сеть VirtWifi , которая затем использует туннель virtio-net для отправки сетевого трафика на виртуальную машину хоста, имеющую прямой доступ к реальной сети Wi-Fi.