아키텍처

AAOS에서 VirtIO를 지원하는 데 필요한 대부분의 변경사항에는 Android 일반 커널의 HAL 구현 수준 이하의 변경사항이 포함됩니다. Android 프레임워크는 VirtIO 프로토콜을 사용하여 호스트 측에서 VirtIO 기기와 통신하는 AAOS 게스트 VM 커널의 VirtIO 드라이버를 사용하여 하드웨어 제약이 없는 일반 HAL과 통신합니다. 호스트 측의 VirtIO 기기는 SoC 관련 기기 드라이버를 사용하여 실제 HW에 액세스할 수 있습니다.

VirtIO 드라이버와 VirtIO 기기 간의 통신은 분산 수집 목록의 DMA와 유사한 링 버퍼인 virtqueue를 통해 이루어집니다. MMIOPCI와 같은 여러 전송을 사용하여 VM 간에 VirtIO 메시지를 교환할 수 있습니다.

경우에 따라 vsock가 VM 간 통신에 활용되어 왔습니다. 차량 HAL, 오디오 제어, Dumpstate 통신은 vsock 인터페이스를 통해 별도의 VM에서 피어 에이전트 연결을 사용하여 지원됩니다. GRPC-vsock은 이러한 표준화되지 않은 하위 시스템에 액세스하는 데 사용됩니다. Android 소스 트리의 GRPC는 주소 형식이 vsock:CID:PORT_NUMBERvsock과 호환되도록 수정되었습니다.

가상화 아키텍처
그림 1. 가상화 아키텍처

오디오

가상화된 AAOS에서 Android 게스트 VM은 virtio-snd를 사용하여 오디오에 액세스할 수 있습니다. virtio-snd는 오디오 HAL 구현이 TinyALSA 라이브러리를 사용하여 가상화된 사운드 기기와 상호작용할 수 있도록 가상화된 PCM 기기를 Android VM에 제공합니다.

기본 오디오 HAL 구현은 /device/google/trout/hal/audio/6.0의 AOSP에 있습니다. OEM은 플랫폼의 ro.vendor.trout.audiohal.{in,out}_period_{ms,count}를 수정할 수 있고 /device/google/trout/aosp_trout_common.mk.에서 오디오 관련 변수를 재정의하여 자체 오디오 HAL을 구현할 수도 있습니다.

오디오 제어 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. 오디오 아키텍처

블루투스

블루투스 구현은 아래 설계 그림에 기반합니다.

블루투스 아키텍처
그림 5. 블루투스 아키텍처

블루투스 핸즈프리 프로필

trout에서 블루투스 핸즈프리 프로필(HFP)을 사용할 수 있도록 VirtIO 사운드 기기 사양이 오디오 컨트롤을 지원하도록 확장되었습니다. 이 방법을 사용하면 호스트/하이퍼바이저 측의 VirtIO 사운드 기기가 HFP와 관련된 다음 세 가지 오디오 컨트롤을 제공합니다.

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

AAOS가 게스트 VM으로 실행되는 경우 AAOS에서는 TinyAlsa를 사용하여 이러한 오디오 컨트롤을 설정합니다. HFP 사용 사례를 사용 설정하기 위해 호스트/하이퍼바이저는 그에 따라 업체별 라우팅 및 보정을 실행합니다.

블루투스 구현은 아래 설계 그림에 기반합니다.

블루투스 아키텍처
그림 5. 블루투스 아키텍처

Dumpstate

가상화된 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-video 드라이버를 사용하는 가상화된 V4L2 스트리밍 기기의 동영상 스트림에 액세스할 수 있습니다.

차고 모드

자세한 내용은 차고 모드란 무엇인가요?를 참고하세요.

차고 모드 전환 및 종료는 차량 HAL에서 보낸 AP_POWER_STATE_REQ 속성으로 트리거됩니다. 가상화 모드에서 차고 모드는 호스트 측에서 트리거됩니다. 호스트 VM은 Android의 전원이 꺼질 때까지 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나 디스플레이 컨트롤러에 직접 액세스하지 못할 수 있습니다. 이 경우 Android 게스트 VM 및 virtio-gpu 기기의 Mesa 또는 goldfish-openglvirtio-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 전송 프로토콜을 사용하여 호스트 VM의 VirtIO SCMI 기기와 SCMI 메시지를 교환하는 VirtIO 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

차량 HAL 구현은 다음 두 요소로 구성됩니다.

  • 클라이언트. 가상화된 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-blk, virtio-input, virtio-console, virtio-net과 같은 드라이버를 있는 그대로 사용합니다.

가상화된 AAOS 참조 플랫폼에서 Wi-Fi는 mac80211_hwsim으로 지원되어 VirtWifi 무선 네트워크를 사용 설정하고 virtio-net 터널을 사용하여 네트워크 트래픽을 실제 Wi-Fi 네트워크에 직접 액세스할 수 있는 호스트 VM에 전송합니다.