معماری

بیشتر تغییرات مورد نیاز برای پشتیبانی از VirtIO در AAOS شامل تغییراتی در سطح پیاده‌سازی HAL و پایین‌تر در هسته مشترک اندروید است. چارچوب اندروید با استفاده از درایورهای VirtIO در هسته ماشین مجازی مهمان AAOS با یک HAL عمومی و مستقل از سخت‌افزار ارتباط برقرار می‌کند که با استفاده از پروتکل‌های VirtIO با دستگاه‌های VirtIO در سمت میزبان ارتباط برقرار می‌کند. دستگاه‌های VirtIO در سمت میزبان می‌توانند با استفاده از درایورهای دستگاه مخصوص SoC به سخت‌افزار فیزیکی دسترسی داشته باشند.

ارتباط بین درایور VirtIO و دستگاه VirtIO با virtqueue انجام می‌شود که بافرهای حلقه‌ای شبیه DMA از لیست‌های جمع‌آوری پراکنده هستند. چندین انتقال، مانند MMIO یا PCI، می‌توانند برای تبادل پیام‌های VirtIO بین ماشین‌های مجازی استفاده شوند.

در برخی موارد، vsock برای ارتباط بین ماشین‌های مجازی استفاده شده است. ارتباطات HAL خودرو، کنترل صدا و Dumpstate با استفاده از اتصال به یک عامل همتا در یک ماشین مجازی جداگانه از طریق رابط vsock پشتیبانی می‌شوند. GRPC-vsock برای دسترسی به این زیرسیستم‌های غیر استاندارد استفاده می‌شود. GRPC در درخت منبع اندروید برای کار با vsock با فرمت آدرس vsock:CID:PORT_NUMBER اصلاح شده است.

معماری مجازی‌سازی
شکل ۱. معماری مجازی‌سازی

صوتی

در AAOS مجازی، ماشین مجازی مهمان اندروید می‌تواند virtio-snd برای دسترسی به صدا استفاده کند. virtio-snd دستگاه‌های PCM مجازی را در اختیار ماشین مجازی اندروید قرار می‌دهد تا پیاده‌سازی HAL صوتی بتواند با دستگاه‌های صوتی مجازی با کتابخانه TinyALSA تعامل داشته باشد.

پیاده‌سازی پیش‌فرض HAL صوتی در AOSP در آدرس /device/google/trout/hal/audio/6.0 قرار دارد. تولیدکنندگان اصلی تجهیزات (OEM) می‌توانند ro.vendor.trout.audiohal.{in,out}_period_{ms,count} را برای پلتفرم خود تغییر دهند. تولیدکنندگان اصلی تجهیزات همچنین می‌توانند HAL صوتی خود را با لغو متغیرهای مرتبط با صدا در /device/google/trout/aosp_trout_common.mk.

کنترل صوتی HAL، فوکوس صوتی را در AAOS مدیریت می‌کند. برای مثال، وقتی سیستم صداهای اضطراری پخش می‌کند، ممکن است لازم باشد موسیقی در حال پخش در پس‌زمینه بی‌صدا شود. کنترل صوتی HAL به برنامه‌هایی که موسیقی پخش می‌کنند اطلاع می‌دهد که در این شرایط بی‌صدا شوند. در سیستم مجازی، صداها می‌توانند از سایر ماشین‌های مجازی بیایند. در پیاده‌سازی مرجع، ماشین مجازی مهمان AAOS دارای یک سرویس سرور کنترل صوتی است که در حال اجرا است و از GRPC-vsock برای دریافت درخواست‌های فوکوس صوتی از سایر ماشین‌های مجازی استفاده می‌کند. ماشین مجازی میزبان می‌تواند device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller برای ارسال درخواست‌های کنترل صوتی به AAOS استفاده کند. در حالی که libandroid_audio_controller فوکوس صوتی را نگه می‌دارد، تا زمانی که فوکوس آزاد شود، به ارسال ضربان قلب به AAOS ادامه می‌دهد.

معماری صوتی
شکل ۵. معماری صوتی

بلوتوث

پیاده‌سازی بلوتوث بر اساس طرحی است که در زیر نشان داده شده است.

معماری بلوتوث
شکل ۵. معماری بلوتوث

پروفایل هندزفری بلوتوث

برای فعال کردن پروفایل هندزفری بلوتوث (HFP) در trout ، مشخصات دستگاه صوتی VirtIO برای پشتیبانی از کنترل‌های صوتی گسترش یافته است. با استفاده از این رویکرد، یک دستگاه صوتی VirtIO در سمت میزبان/هایپروایزر این سه کنترل صوتی مربوط به HFP را ارائه می‌دهد:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

وقتی AAOS به عنوان یک ماشین مجازی مهمان اجرا می‌شود، AAOS از TinyAlsa برای تنظیم این کنترل‌های صوتی استفاده می‌کند. برای فعال کردن مورد استفاده HFP، میزبان/هایپروایزر مسیریابی و کالیبراسیون مختص فروشنده را بر اساس آن انجام می‌دهد.

پیاده‌سازی بلوتوث بر اساس تصویر طراحی زیر است.

معماری بلوتوث
شکل ۵. معماری بلوتوث

زباله‌دان

هنگام تولید گزارش اشکال (bugreport) برای AAOS مجازی، گنجاندن اطلاعات ماشین مجازی میزبان بسیار ارزشمند است تا توسعه‌دهندگان دید جامع‌تری از سیستم داشته باشند. برای دستیابی به این هدف، پیاده‌سازی مرجع trout ، IDumpstateDevice HAL را پیاده‌سازی می‌کند که اطلاعات ماشین مجازی میزبان را از طریق GRPC-vsock جمع‌آوری می‌کند. اطلاعات ماشین مجازی میزبان بسته‌بندی شده با `tar` در گزارش اشکال 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 می‌تواند به جریان ویدئو از دستگاه پخش مجازی V4L2 که از درایور VirtIO-video استفاده می‌کند، دسترسی داشته باشد.

حالت گاراژ

برای اطلاعات بیشتر، به حالت گاراژ مراجعه کنید.

ورود و خروج از حالت گاراژ توسط ویژگی‌های AP_POWER_STATE_REQ ارسال شده توسط Vehicle HAL فعال می‌شود. در حالت مجازی‌سازی، حالت گاراژ از سمت میزبان فعال می‌شود. ماشین مجازی میزبان باید روشن بماند تا دستگاه‌های مجازی را برای ماشین مجازی اندروید فراهم کند، تا زمانی که اندروید خاموش شود. سرور VHAL در ماشین مجازی میزبان، سیگنال خاموش شدن را به ماشین مجازی مهمان AAOS ارسال می‌کند. پس از دریافت سیگنال VHAL client، ماشین مجازی AAOS وارد حالت گاراژ می‌شود و شروع به ارسال سیگنال‌های ضربان قلب برای فعال نگه داشتن ماشین مجازی میزبان می‌کند.

سامانه ماهواره‌ای ناوبری جهانی (GNSS)

در trout 1.0، پشتیبانی از مجازی‌سازی GNSS از طریق virtio-console اضافه شده است. این پیاده‌سازی از تبادل اندازه‌گیری‌های خام و اصلاح موقعیت مکانی از میزبان به مهمان پشتیبانی می‌کند.

فرمت تبادل داده‌ها CSV است که توسط برنامه GnssLogger استفاده می‌شود. در پیاده‌سازی مرجع، از آنجا که درایور GNSS بومی در دسترس نیست، داده‌های شبیه‌سازی شده در دسترس قرار می‌گیرند، اما یک درایور بومی می‌تواند بدون هیچ گونه تغییر سمت مهمان پیاده‌سازی شود. یک عامل میزبان شبیه‌سازی شده نمونه به عنوان بخشی از کد منبع trout ارائه شده است.

پیاده‌سازی فعلی انتظار دارد که مقداردهی اولیه GNSS و GNSS کمکی (AGNSS) توسط محیط سیستم عامل میزبان انجام شود.

معماری GNSS
شکل ۲. معماری GNSS

گرافیک

وقتی AAOS به عنوان یک ماشین مجازی مهمان در کنار سایر سیستم عامل‌های خودرو اجرا می‌شود، ممکن است اندروید دسترسی مستقیم به GPU یا کنترل‌کننده نمایشگر نداشته باشد. در این حالت، Mesa یا goldfish-opengl و یک درایور virtio-gpu در ماشین مجازی مهمان اندروید و دستگاه virtio-gpu می‌توانند برای دسترسی به GPU استفاده شوند.

در ماشین مجازی مهمان اندروید، Mesa یا goldfish-opengl دستورات OpenGLES را به ترتیب در یک جریان Gallium یا یک جریان GLES تولید شده خودکار کدگذاری می‌کنند. درایور هسته virtio-gpu به عنوان یک انتقال دهنده استفاده می‌شود. در سمت میزبان، virglrenderer (برای Mesa) و vulkan-cereal (برای goldfish-opengl ) جریان دستورات رمزگشایی شده را روی درایور GPU موجود بازپخش می‌کنند. پلتفرم مرجع AAOS trout از OpenGL ES فقط با پشتیبانی Vulkan پشتیبانی می‌کند، که پیش‌بینی می‌شود در نسخه‌های آینده منتشر شود.

معماری گرافیک
شکل ۳. معماری گرافیک

حسگرها

وقتی AAOS به عنوان یک ماشین مجازی مهمان در کنار سایر سیستم عامل‌های خودرو اجرا می‌شود، ممکن است اندروید دسترسی مستقیم به حسگرها نداشته باشد. در این حالت، از درایور Virtio-SCMI در ماشین مجازی مهمان اندروید و دستگاه VirtIO-SCMI در ماشین مجازی میزبان برای دسترسی به حسگرها استفاده می‌شود. پلتفرم مرجع مجازی‌سازی AAOS یک HAL حسگر عمومی و مستقل از سخت‌افزار ارائه می‌دهد که می‌تواند برای SoCهای مبتنی بر ARM جهت دسترسی به حسگرها مورد استفاده قرار گیرد.

حسگر HAL با درایور IIO SCMI در زیرسیستم IIO هسته لینوکس ارتباط برقرار می‌کند، که از پروتکل مدیریت حسگر SCMI ارائه شده توسط مشخصات رابط کنترل و مدیریت سیستم ARM (SCMI) برای کشف و پیکربندی حسگرها، خواندن داده‌های حسگر و اطلاع‌رسانی از تغییرات مقدار حسگر استفاده می‌کند.

درایور IIO SCMI از درایور VirtIO SCMI استفاده می‌کند که از پروتکل انتقال VirtIO مطابق با مشخصات virtio-scmi برای تبادل پیام‌های SCMI با دستگاه VirtIO SCMI روی ماشین مجازی میزبان استفاده می‌کند. دستگاه VirtIO SCMI از طریق درایورهای حسگر مخصوص SoC به حسگرها دسترسی مستقیم دارد.

معماری حسگر
شکل ۴. معماری حسگر

محل سنسور HAL

پیاده‌سازی مرجع حسگر HAL که از VirtIO SCMI استفاده می‌کند، در device/google/trout/hal/sensors قرار دارد.

پیکربندی سنسور HAL

ممکن است HAL حسگر نیاز داشته باشد داده‌های حسگر دریافتی از ماشین مجازی میزبان را برای مطابقت با سیستم مختصات حسگر خودروی اندروید تغییر دهد. طرحواره پیکربندی حسگر را می‌توان در 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 خودرو از دو جزء تشکیل شده است:

  • کلاینت. APIهای مورد استفاده اندروید در AAOS مجازی را فراهم می‌کند.
  • سرور. مستقیماً با سخت‌افزار، مانند گذرگاه‌های وسایل نقلیه (یا یک شبیه‌ساز) ارتباط برقرار می‌کند.

در مجازی‌سازی، سرور VHAL روی ماشین مجازی میزبان اجرا می‌شود. کلاینت و سرور 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 از قبل یک رابط کاربری خوش‌تعریف برای اجزایی مانند Block Storage، Network، Console، Input، Socket و Entropy ارائه می‌دهد. برای این زیرسیستم‌ها، AAOS از درایور به همان شکلی که هست، مانند virtio-blk ، virtio-input ، virtio-console و virtio-net استفاده می‌کند.

در پلتفرم مرجع مجازی AAOS، وای‌فای با mac80211_hwsim پشتیبانی می‌شود تا یک شبکه بی‌سیم VirtWifi را فعال کند، که سپس از تونل virtio-net برای ارسال ترافیک شبکه به ماشین مجازی میزبان استفاده می‌کند، که دسترسی مستقیم به شبکه وای‌فای واقعی دارد.