Mimari

AAOS'te VirtIO'nun desteklenmesi için gereken değişikliklerin çoğu, Android Common Kernel'de HAL uygulama düzeyinde ve altında yapılan değişikliklerdir. Android çerçevesi, AAOS konuk VM çekirdeğindeki VirtIO sürücülerini kullanarak donanımdan bağımsız genel bir HAL ile iletişim kurar. Bu sürücüler de VirtIO protokollerini kullanarak ana makine tarafındaki VirtIO cihazlarıyla iletişim kurar. Ana taraftaki VirtIO cihazları, çip üzerinde sisteme özel cihaz sürücülerini kullanarak fiziksel donanıma erişebilir.

VirtIO sürücüsü ile VirtIO cihazı arasındaki iletişim, dağıtılmış toplama listelerinin DMA benzeri halka arabellekleri olan virtqueue ile gerçekleşir. Sanal makineler arasında VirtIO iletilerini değiştirmek için MMIO veya PCI gibi çeşitli aktarımlar kullanılabilir.

Bazı durumlarda, VM'ler arası iletişim için vsock kullanılmıştır. Araç HAL, Ses Kontrolü ve Dumpstate iletişimleri, vsock arayüzü üzerinden ayrı bir sanal makinedeki eş aracısına bağlantı kullanılarak desteklenir. Bu standartlaştırılmamış alt sistemlere erişmek için GRPC-vsock kullanılır. Android kaynak ağacındaki GRPC, vsock ile çalışacak şekilde değiştirildi. vsock, vsock:CID:PORT_NUMBER adres biçimini kullanır.

Sanallaştırma mimarisi
Şekil 1. Sanallaştırma mimarisi

Ses

Sanal AAOS'te Android konuk VM'si, sese erişmek için virtio-snd kullanabilir. virtio-snd, Android VM'ye sanallaştırılmış PCM cihazları sağlar. Böylece ses HAL uygulaması, TinyALSA kitaplığıyla sanallaştırılmış ses cihazlarıyla etkileşimde bulunabilir.

Varsayılan ses HAL uygulaması, AOSP'de /device/google/trout/hal/audio/6.0 konumunda bulunur. OEM'ler, platformları için ro.vendor.trout.audiohal.{in,out}_period_{ms,count} öğesini değiştirebilir. OEM'ler, /device/google/trout/aosp_trout_common.mk. içindeki sesle ilgili değişkenleri geçersiz kılarak kendi ses HAL'lerini de uygulayabilir.

Ses kontrolü HAL'si, AAOS'teki ses odağını yönetir. Örneğin, sistem acil durum sesleri çalarken arka planda çalan müziğin sesi kapatılabilir. Ses kontrolü HAL'si, bu durumda müzik çalan uygulamaları sesi kapatmaya yönlendirir. Sanal sistemde sesler diğer sanal makinelerden gelebilir. Referans uygulamada, AAOS konuk sanal makinesinde ses kontrolü sunucusu daemon'u çalışır. Bu daemon, diğer sanal makinelerden gelen ses odağı isteklerini almak için GRPC-vsock kullanır. Ana makine VM'si, AAOS'ye ses kontrolü istekleri göndermek için device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller kullanabilir. libandroid_audio_controller, ses odağını tutarken odak serbest bırakılana kadar AAOS'a kalp atışı göndermeye devam eder.

Ses mimarisi
Şekil 5. Ses mimarisi

Bluetooth

Bluetooth uygulaması, aşağıda gösterilen tasarıma dayanmaktadır.

Bluetooth mimarisi
Şekil 5. Bluetooth mimarisi

Bluetooth Eller Serbest Profili

trout üzerinde Bluetooth Eller Serbest Profili'ni (HFP) etkinleştirmek için VirtIO ses cihazı özellikleri, ses kontrollerini destekleyecek şekilde genişletildi. Bu yaklaşımı kullanarak, ana makine/hipervizör tarafındaki bir VirtIO ses cihazı, HFP ile ilgili şu üç ses kontrolünü sağlar:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

AAOS, konuk sanal makine olarak çalışırken bu ses kontrollerini ayarlamak için TinyAlsa'yı kullanır. HFP kullanım alanını etkinleştirmek için ana makine/hipervizör, tedarikçiye özel yönlendirme ve kalibrasyonu buna göre gerçekleştirir.

Bluetooth uygulaması, aşağıdaki tasarım görseline dayanmaktadır.

Bluetooth mimarisi
Şekil 5. Bluetooth mimarisi

Dumpstate

Sanal AAOS için hata raporu oluştururken geliştiricilerin sisteme daha kapsamlı bir bakış açısı kazanması için ana makine VM bilgilerini eklemek faydalıdır. Bunu yapmak için trout referans uygulaması, IDumpstateDevice HAL'yi uygular. Bu HAL, GRPC-vsock aracılığıyla ana makine VM bilgilerini toplar. "tar" ile paketlenmiş ana makine sanal makinesi bilgileri, hata raporunda dumpstate_board.bin olarak adlandırılırken günlük dökümleri dumpstate_board.txt konumunda bulunur.

Yürütülecek komutları yapılandırmak için:

  1. Aşağıdaki dosyadan yapılandırma ayrıntılarını kopyalayıp bir XML dosyasına (ör. config.xml) yapıştırın.
    <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. Başlatırken yeni XML dosyasının yolunu dumpstate sunucusuna iletin. Örneğin:
    --config_file my_config.xml
    

Genişletilmiş Görünüm Sistemi (EVS)

Genişletilmiş Görüş Sistemi (EVS), arka ve çevre görüş kameralarıyla çekilen videoları göstermek için kullanılır. Sanal AAOS'te EVS yığını, VirtIO-video sürücüsünü kullanan sanallaştırılmış V4L2 akış cihazından video akışına erişebilir.

Garaj modu

Daha fazla bilgi için �Garaj Modu başlıklı makaleyi inceleyin.

Garaj moduna girme ve bu moddan çıkma, Araç HAL'si tarafından gönderilen AP_POWER_STATE_REQ özellikleri tarafından tetiklenir. Sanallaştırma modunda, Garaj Modu ana makine tarafından tetiklenir. Android kapatılana kadar Android sanal makinesi için sanal cihazlar sağlamak üzere ana makine sanal makinesi açık kalmalıdır. Ana makine sanal makinesindeki VHAL sunucusu, kapatma sinyalini AAOS konuk sanal makinesine gönderir. VHAL istemci sinyalini aldıktan sonra AAOS VM, Garaj Modu'na girer ve ana makine VM'sinin etkin kalması için kalp atışı sinyalleri göndermeye başlar.

Küresel navigasyon uydu sistemi (GNSS)

trout 1.0'da, virtio-console üzerinden GNSS sanallaştırma desteği eklendi. Uygulama, ana makineden konuğa ham ölçümlerin ve konum düzeltmelerinin aktarılmasını destekler.

Veri değişim biçimi, GnssLogger uygulaması tarafından kullanılan CSV'dir. Referans uygulamada, yerel GNSS sürücüsü kullanılamadığından sahte veriler sunulur ancak yerel sürücü, konuk tarafında herhangi bir değişiklik yapılmadan uygulanabilir. trout kaynak kodunun bir parçası olarak örnek bir sahte ana makine aracısı sağlanır.

Mevcut uygulamada GNSS başlatma ve Destekli GNSS'nin (AGNSS) ana makine işletim sistemi ortamı tarafından işlenmesi beklenir.

GNSS mimarisi
Şekil 2. GNSS mimarisi

Grafik

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk sanal makine olarak çalışırken Android, GPU'ya veya ekran denetleyicisine doğrudan erişemeyebilir. Bu durumda, GPU'ya erişmek için Android konuk sanal makinesinde ve virtio-gpu cihazında Mesa veya goldfish-opengl ve virtio-gpu sürücüsü kullanılabilir.

Android konuk sanal makinesinde Mesa veya goldfish-opengl, OpenGLES komutlarını sırasıyla bir Gallium akışına ya da otomatik olarak oluşturulan bir GLES akışına kodlar. Aktarım için virtio-gpu çekirdek sürücüsü kullanılır. Ana makine tarafında, virglrenderer (Mesa için) ve vulkan-cereal (goldfish-opengl için) mevcut GPU sürücüsünün üzerinde kod çözme işlemi yapılmış komut akışını yeniden oynatır. AAOS referans platformu trout, gelecekteki bir sürümde Vulkan desteğiyle yalnızca OpenGL ES'yi destekleyecektir.

Grafik mimarisi
Şekil 3. Grafik mimarisi

Sensörler

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk sanal makine olarak çalışırken Android'in sensörlere doğrudan erişimi olmayabilir. Bu durumda, sensörlere erişmek için Android konuk sanal makinesindeki Virtio-SCMI sürücüsü ve ana makine sanal makinesindeki VirtIO-SCMI cihazı kullanılır. AAOS sanallaştırma referans platformu, ARM tabanlı SoC'lerin sensörlere erişmek için kullanabileceği genel ve donanımdan bağımsız bir sensör HAL'ı sağlar.

Sensor HAL, Linux çekirdeği IIO alt sistemindeki IIO SCMI sürücüsüyle iletişim kurar. Bu sürücü, sensörleri keşfetmek ve yapılandırmak, sensör verilerini okumak ve sensör değeri değişikliklerinden haberdar olmak için ARM System Control and Management Interface (SCMI) spesifikasyonu tarafından sağlanan SCMI Sensor Management Protocol'ü kullanır.

IIO SCMI sürücüsü, VirtIO SCMI sürücüsünü kullanır. Bu sürücü, ana makine VM'sindeki VirtIO SCMI cihazıyla SCMI mesajlarını değiştirmek için virtio-scmi spesifikasyonunda belirtildiği gibi VirtIO aktarım protokolünü kullanır. VirtIO SCMI cihazı, SoC'ye özel sensör sürücüleri aracılığıyla sensörlere doğrudan erişebilir.

Sensör mimarisi
Şekil 4. Sensör mimarisi

Sensör HAL konumu

VirtIO SCMI'yi kullanan sensör HAL'nin referans uygulaması device/google/trout/hal/sensors konumunda bulunur.

Sensör HAL yapılandırması

Sensor HAL, Android araba sensörü koordinat sistemine uymak için ana makine VM'sinden alınan sensör verilerini değiştirmesi gerekebilir. Sensör yapılandırması şeması device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd adresinde bulunabilir.

OEM'ler, yön ve konum gibi sensör yapılandırmasını sensor_hal_configuration.xml içinde sağlayabilir ve dosyayı /odm/etc/sensors/ veya /vendor/etc/sensors/ konumuna kopyalayabilir. Aşağıda örnek bir sensör yapılandırması verilmiştir:

<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>

Araç HAL'si

Araç HAL uygulaması iki bileşenden oluşur:

  • Müşteri. Android'in sanallaştırılmış AAOS'te kullandığı API'leri sağlar.
  • Sunucu. Doğrudan donanımla (ör. araç veri yolları) veya bir emülatörle iletişim kurar.

Sanallaştırmada VHAL sunucusu, ana makine VM'sinde çalışır. VHAL istemcisi ve sunucusu GRPC-vsock üzerinden iletişim kurar (daha fazla bilgi için device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto bölümüne bakın). OEM'ler, iletişim API'lerini geçersiz kılarak GRPC dışında farklı bir aktarım protokolü kullanabilir. Örnekler için device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp başlıklı makaleyi inceleyin.

Diğer alt sistemler

VirtIO, Blok Depolama, Ağ, Konsol, Giriş, Soket ve Entropi gibi bileşenler için iyi tanımlanmış bir arayüz sağlar. AAOS, bu alt sistemler için sürücüyü olduğu gibi kullanır (ör. virtio-blk, virtio-input, virtio-console ve virtio-net).

Sanal AAOS referans platformunda, mac80211_hwsim kablosuz ağını etkinleştirmek için Wi-Fi desteklenir. Bu ağ, ağ trafiğini gerçek Wi-Fi ağına doğrudan erişimi olan ana makine sanal makinesine göndermek için virtio-net tünelini kullanır.VirtWifi