Mimari

AAOS'ta VirtIO'yu desteklemek için gereken değişikliklerin çoğu, HAL uygulama düzeyinde ve Android Ortak Çekirdeği'nin altındaki düzeylerde yapılan değişiklikleri içerir. Android çerçevesi, AAOS konuk sanal makine çekirdeğindeki VirtIO sürücülerini kullanarak donanıma duyarlı olmayan genel bir HAL ile iletişim kurar. Bu sürücü, ana makine tarafındaki VirtIO cihazlarıyla VirtIO protokollerini kullanarak iletişim kurar. Ana makine tarafındaki VirtIO cihazlar, SoC'ye ö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ğıtma toplama listelerinin DMA benzeri halka tamponları olan virtqueue ile gerçekleşir. MMIO veya PCI gibi çeşitli aktarım yöntemleri, VirtIO mesajlarını VM'ler arasında aktarmak için kullanılabilir.

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

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

Ses

Sanallaştırılmış AAOS'te Android konuk sanal makinesi, sese erişmek için virtio-snd kullanabilir. virtio-snd, ses HAL uygulamasının TinyALSA kitaplığıyla sanallaştırılmış ses cihazlarıyla etkileşime geçebilmesi için Android sanal makinesine sanallaştırılmış PCM cihazları sağlar.

Varsayılan ses HAL uygulaması, AOSP'de /device/google/trout/hal/audio/6.0 adresinde 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.'teki sesle ilgili değişkenleri geçersiz kılarak kendi ses HAL'lerini de uygulayabilir.

Ses kontrolü HAL'i, AAOS'ta ses odağını yönetir. Örneğin, sistem acil durum sesleri çalarken arka planda çalan müziğin sesinin kapatılması gerekebilir. Ses kontrolü HAL'i, müzik çalan uygulamaları bu durumda sesi kapatmaları konusunda bilgilendirir. Sanallaştırılmış sistemde sesler diğer sanal makinelerden gelebilir. Referans uygulamada, AAOS konuk sanal makinesinde, diğer sanal makinelerden ses odak isteklerini almak için GRPC-vsock kullanan bir ses denetim sunucusu daemon'u çalışır. Ana makine sanal makinesi, AAOS'a ses kontrol istekleri göndermek için device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller'ü kullanabilir. libandroid_audio_controller ses odağını elinde tutarken, odak bırakılana kadar AAOS'a kalp atışı göndermeye devam eder.

İşitsel mimari
Şekil 5. Ses mimarisi

Bluetooth

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

Bluetooth mimarisi
Şekil 5. Bluetooth mimarisi

Bluetooth Eller Serbest Profili

trout'te Bluetooth Eller Serbest Profili'ni (HFP) etkinleştirmek için VirtIO ses cihazı spesifikasyonu, ses denetimlerini destekleyecek şekilde genişletildi. Bu yaklaşımı kullanarak ana makine/sanal makine tarafına yerleştirilmiş 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. Ana makine/sanal makine, HFP kullanım alanını etkinleştirmek için tedarikçiye özel yönlendirme ve kalibrasyon işlemlerini uygun şekilde gerçekleştirir.

Bluetooth uygulaması, aşağıdaki tasarım resmine dayanır.

Bluetooth mimarisi
Şekil 5. Bluetooth mimarisi

Dumpstate

Sanallaştırılmış AAOS için hata raporu oluştururken, geliştiricilerin sisteme dair daha kapsamlı bir görünüme sahip olması için ana makine sanal makine bilgilerini eklemek önemlidir. Bunu yapmak için trout referans uygulaması, GRPC-vsock aracılığıyla ana makine sanal makinesi bilgilerini toplayan IDumpstateDevice HAL'i uygular. "tar" paketli ana makine sanal makinesi bilgileri, hata raporunda dumpstate_board.bin olarak adlandırılır. Günlük dökümü ise dumpstate_board.txt adresindedir.

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

  1. Aşağıdaki dosyadaki yapılandırma ayrıntılarını bir XML dosyasına kopyalayın (ör. 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. Yeni XML dosyasının yolunu başlatırken dumpstate sunucusuna iletin. Örnek:
    --config_file my_config.xml
    

Genişletilmiş Görüntü Sistemi (EVS)

Genişletilmiş Görünüm Sistemi (EVS), arka görüş ve çevre görüş kameraları tarafından çekilen videoları görüntülemek için kullanılır. Sanallaştırılmış 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 bölümüne bakın.

Garaj moduna girme ve bu moddan çıkma, araç HAL'si tarafından gönderilen AP_POWER_STATE_REQ mülkleri 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. AAOS sanal makinesi, VHAL istemcisinin sinyalini aldıktan sonra Garaj moduna girer ve ana makine sanal makinesini etkin tutmak 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, ev sahibinden konuğa ham ölçümlerin ve konum düzeltmelerinin paylaşılmasını destekler.

Veri alışverişi biçimi, GnssLogger uygulaması tarafından kullanılan CSV'dir. Referans uygulamada, yerel GNSS sürücüsü kullanılamadığından örnek veriler sağlanır 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 ilklendirmesinin ve Yardımlı GNSS'nin (AGNSS) ana OS ortamı tarafından ele alınması beklenir.

GNSS mimarisi
Şekil 2. GNSS mimarisi

Grafik

AAOS, diğer otomotiv işletim sistemleriyle birlikte konuk sanal makine olarak çalışırken Android'in GPU'ya veya ekran denetleyiciye doğrudan erişimi olmayabilir. Bu durumda, GPU'ya erişmek için Mesa veya goldfish-opengl ile Android konuk sanal makinesinde ve virtio-gpu cihazında bir 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 veya otomatik olarak oluşturulan bir GLES akışına kodlar. virtio-gpu çekirdek sürücüsü aktarım olarak 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 üstünde kod çözülmüş komut akışını yeniden oynatır. AAOS referans platformu trout, gelecek bir sürümde kullanıma sunulması beklenen Vulkan desteğiyle yalnızca OpenGL ES'yi destekler.

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, Android konuk sanal makinesinde Virtio-SCMI sürücüsü ve ana makine sanal makinesinde VirtIO-SCMI cihazı, sensörlere erişmek için kullanılır. AAOS sanallaştırma referans platformu, ARM tabanlı SoC'lerin sensörlere erişmesi için kullanılabilecek genel ve donanımdan bağımsız bir sensör HAL'i sağlar.

Sensör HAL'i, Linux çekirdek IIO alt sisteminde IIO SCMI sürücüsüyle iletişim kurar. Bu sürücü, sensörleri bulup yapılandırmak, sensör verilerini okumak ve sensör değeri değişikliklerinden haberdar olmak için ARM Sistem Kontrol ve Yönetim Arayüzü (SCMI) spesifikasyonu tarafından sağlanan SCMI Sensör Yönetim Protokolü'nü kullanır.

IIO SCMI sürücüsü, SCMI mesajlarını ana makine sanal makinesinde VirtIO SCMI cihazıyla değiştirmek için virtio-scmi spetsifikasyonunda belirtildiği gibi VirtIO aktarım protokolünü kullanan VirtIO SCMI sürücüsünü kullanır. VirtIO SCMI cihazı, SoC'ye özgü 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 kullanan sensör HAL'inin referans uygulaması device/google/trout/hal/sensors adresinde yer alır.

Sensör HAL yapılandırması

Sensör HAL'in, ana makine sanal makinesinden alınan sensör verilerini Android araç sensör koordinat sistemine uygun olacak şekilde değiştirmesi gerekebilir. Sensör yapılandırması şemasını device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd adresinde bulabilirsiniz.

OEM'ler, sensor_hal_configuration.xml içinde yön ve konum gibi sensör yapılandırmaları sağlayabilir ve dosyayı /odm/etc/sensors/ veya /vendor/etc/sensors/'ye 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'si uygulaması iki bileşenden oluşur:

  • İstemci. Android'in sanallaştırılmış AAOS'ta kullandığı API'leri sağlar
  • Sunucu. Araç otobüsleri (veya bir emülatör) gibi donanımla doğrudan iletişim kurar.

Sanallaştırmada VHAL sunucusu ana makine sanal makinesinde ç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 Entropy 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).

Sanallaştırılmış AAOS referans platformunda, VirtWifi kablosuz ağını etkinleştirmek için mac80211_hwsim ile kablosuz bağlantı desteklenir. Ardından, ağ trafiğini gerçek kablosuz ağa doğrudan erişimi olan ana makine sanal makinesine göndermek için virtio-net tüneli kullanılır.