건축물

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

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

어떤 경우에는 vsock VM 간 통신에 활용되었습니다. 차량 HAL, 오디오 제어 및 Dumpsstate 통신은 vsock 인터페이스를 통해 별도의 VM에 있는 피어 에이전트에 대한 연결을 사용하여 지원됩니다. GRPC-vsock 이러한 비표준화 하위 시스템에 액세스하는 데 사용됩니다. Android 소스 트리의 GRPC는 vsock:CID:PORT_NUMBER 주소 형식을 사용하여 vsock 과 작동하도록 수정되었습니다.

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

오디오

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

기본 오디오 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 구현은 아래에 설명된 설계를 기반으로 합니다.

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

Bluetooth 핸즈프리 프로필

trout 에서 Bluetooth 핸즈프리 프로필(HFP)을 활성화하기 위해 VirtIO 사운드 장치 사양이 오디오 제어를 지원하도록 확장되었습니다. 이 접근 방식을 사용하여 호스트/하이퍼바이저 측의 VirtIO 사운드 장치는 HFP와 관련된 다음 세 가지 오디오 컨트롤을 제공합니다.

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

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

Bluetooth 구현은 아래 디자인 그림을 기반으로 합니다.

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

덤프 상태

가상화된 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 속성에 의해 트리거됩니다. 가상화 모드에서는 Garage 모드가 호스트 측에서 트리거됩니다. 호스트 VM은 Android 전원이 꺼질 때까지 Android VM에 가상 장치를 제공하기 위해 전원이 켜져 있어야 합니다. 호스트 VM의 VHAL 서버는 AAOS 게스트 VM에 종료 신호를 보냅니다. VHAL 클라이언트 신호를 수신하면 AAOS VM은 Garage 모드로 전환되고 하트비트 신호를 보내기 시작하여 호스트 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은 ARM 시스템 제어 및 관리 인터페이스(SCMI) 사양에서 제공하는 SCMI 센서 관리 프로토콜을 사용하여 센서를 검색 및 구성하고, 센서 데이터를 읽고, 센서에 대한 알림을 받는 Linux 커널 IIO 하위 시스템의 IIO SCMI 드라이버와 통신합니다. 가치가 변합니다.

IIO SCMI 드라이버는 virtio-scmi 사양에 지정된 대로 VirtIO 전송 프로토콜을 사용하여 SCMI 메시지를 호스트 VM의 VirtIO 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-consolevirtio-net 과 같은 드라이버를 있는 그대로 사용합니다.

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