بنيان

تتضمن معظم التغييرات المطلوبة لدعم VirtIO في AAOS تغييرات على مستوى تنفيذ HAL وأدناه في Android Common Kernel. يتواصل إطار عمل Android مع HAL عام لا يعرف الأجهزة باستخدام برامج تشغيل VirtIO في نواة الضيف VM AAOS ، والتي تتصل بأجهزة VirtIO على جانب المضيف باستخدام بروتوكولات VirtIO. يمكن لأجهزة VirtIO الموجودة على الجانب المضيف الوصول إلى المخلفات المادية المادية باستخدام برامج تشغيل الأجهزة الخاصة بشركة نفط الجنوب.

يتم الاتصال بين مشغل VirtIO وجهاز Virtio بواسطة virtqueue ، وهي عبارة عن مخازن مؤقتة تشبه الحلقات DMA لقوائم تجميع مبعثر. يمكن استخدام العديد من وسائل النقل ، مثل MMIO أو PCI لتبادل رسائل VirtIO بين الأجهزة الافتراضية.

في بعض الحالات ، تم الاستفادة من vsock للتواصل بين الأجهزة الافتراضية. يتم دعم اتصالات HAL الخاصة بالمركبة والتحكم في الصوت و Dumpstate باستخدام اتصال بوكيل نظير على جهاز افتراضي منفصل عبر واجهة vsock . يتم استخدام GRPC-vsock للوصول إلى هذه الأنظمة الفرعية غير المعيارية. تم تعديل GRPC في شجرة مصدر Android للعمل مع vsock بتنسيق عنوان vsock:CID:PORT_NUMBER .

العمارة الافتراضية
الشكل 1. العمارة الافتراضية

الرسومات

عند تشغيل AAOS كضيف VM جنبًا إلى جنب مع أنظمة تشغيل السيارات الأخرى ، قد لا يكون لدى Android وصول مباشر إلى وحدة معالجة الرسومات أو وحدة التحكم في الشاشة. في هذه الحالة ، يمكن استخدام Mesa وبرنامج تشغيل virtio-gpu على جهاز Android Guest VM وجهاز virtio-gpu للوصول إلى وحدة معالجة الرسومات.

على جهاز Android الضيف VM ، يستخدم Mesa إطار عمل Gallium3D لتجميع تظليل لتمثيل TGSI المتوسط ​​وترجمة واجهة برمجة التطبيقات إلى كائنات حالة. ثم يرسل Gallium3D كائنات الحالة المترجمة واستدعاءات السحب إلى Mesa Virgl ، والتي تستخدم بعد ذلك virtio-gpu كبروتوكول نقل لإرسال الأوامر والتظليل إلى Host VM.

على الجانب المضيف ، يتلقى virglrenderer دفق أوامر virtio-gpu ويحول الدفق إلى أوامر OpenGL ES. كما أنه يترجم التظليل من تنسيق TGSI إلى تنسيق GLSL ثم يعيد تشغيلها أعلى برنامج تشغيل GPU الحالي.

يدعم trout النظام الأساسي المرجعي AAOS حاليًا OpenGL ES بدعم Vulkan ، المتوقع في إصدار مستقبلي.

هندسة الرسومات
الشكل 2. هندسة الرسومات

مجسات

عند تشغيل AAOS كضيف VM جنبًا إلى جنب مع أنظمة تشغيل السيارات الأخرى ، قد لا يكون لدى Android وصول مباشر إلى المستشعرات. في هذه الحالة ، يتم استخدام برنامج تشغيل Virtio-SCMI على جهاز Android guest VM وجهاز VirtIO-SCMI على Host VM للوصول إلى المستشعرات. توفر المنصة المرجعية الافتراضية لـ AAOS مستشعر HAL عام وغير محدد HW يمكن استخدامه في SoCs المستندة إلى ARM للوصول إلى المستشعرات.

يتواصل Sensor HAL مع برنامج تشغيل IIO SCMI في النظام الفرعي Linux Kernel IIO ، والذي يستخدم بروتوكول إدارة مستشعر SCMI المقدم من مواصفات واجهة التحكم والتحكم في نظام ARM (SCMI) لاكتشاف المستشعرات وتكوينها ، وقراءة بيانات المستشعر ، وإخطار المستشعر تتغير القيمة. يستخدم برنامج تشغيل IIO SCMI برنامج VirtIO SCMI Driver ، والذي يستخدم بروتوكول نقل VirtIO كما هو محدد في مواصفات virtio-scmi لتبادل رسائل SCMI مع جهاز VirtIO SCMI على الجهاز الظاهري للمضيف. يتمتع جهاز VirtIO SCMI بوصول مباشر إلى المستشعرات من خلال برامج تشغيل أجهزة الاستشعار الخاصة بشركة نفط الجنوب.

هندسة الاستشعار
الشكل 3. هندسة جهاز الاستشعار

موقع HAL المستشعر

يوجد التطبيق المرجعي لجهاز الاستشعار HAL ، الذي يستخدم VirtIO SCMI ، في device/google/trout/hal/sensors .

تكوين HAL المستشعر

قد يحتاج المستشعر HAL إلى تعديل بيانات المستشعر المستلمة من Host VM لتتوافق مع نظام إحداثيات مستشعر السيارة الذي يعمل بنظام Android. يمكن العثور على مخطط تكوين المستشعر في device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd .

يمكن أن توفر الشركات المصنعة للمعدات الأصلية تكوين المستشعر ، مثل الاتجاه والموقع ، في 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>

صوتي

في AAOS الافتراضي ، يمكن لجهاز Android VM الضيف استخدام virtio-snd للوصول إلى الصوت. يوفر virtio-snd أجهزة PCM الافتراضية لجهاز Android VM بحيث يمكن لتطبيق HAL الصوتي التفاعل مع أجهزة الصوت الافتراضية مع مكتبة TinyALSA.

يقع تطبيق HAL الصوتي الافتراضي في AOSP على /device/google/trout/hal/audio/6.0 . يمكن لمصنعي المعدات الأصلية تعديل ro.vendor.trout.audiohal.{in,out}_period_{ms,count} الأساسي. يمكن لمصنعي المعدات الأصلية أيضًا تنفيذ HAL الصوتي الخاص بهم عن طريق تجاوز المتغيرات المتعلقة بالصوت في /device/google/trout/aosp_trout_common.mk.

يدير التحكم في الصوت HAL تركيز الصوت في AAOS. على سبيل المثال ، عندما يقوم النظام بتشغيل أصوات طوارئ ، فقد يلزم كتم صوت الموسيقى التي يتم تشغيلها في الخلفية. سيُعلم التحكم في الصوت HAL تلك التطبيقات التي تقوم بتشغيل الموسيقى لكتم الصوت في هذه الحالة. في النظام الافتراضي ، قد تأتي الأصوات من أجهزة افتراضية أخرى. في التنفيذ المرجعي ، يحتوي الضيف VM الضيف AAOS على خادم التحكم الصوتي قيد التشغيل ، والذي يستخدم GRPC-vsock لتلقي طلبات التركيز الصوتي من أجهزة افتراضية أخرى. يمكن لجهاز VM المضيف استخدام device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller لإرسال طلبات التحكم في الصوت إلى AAOS. بينما يحتفظ libandroid_audio_controller بتركيز الصوت ، فإنه سيستمر في إرسال دقات القلب إلى AAOS حتى يتم تحرير التركيز.

هندسة الصوت
الشكل 4. هندسة الصوت

بلوتوث

عند تشغيل AAOS كضيف VM جنبًا إلى جنب مع أنظمة تشغيل السيارات الأخرى ، قد لا يكون لدى Android وصول مباشر إلى وحدة تحكم Bluetooth. في هذه الحالة ، يمكن استخدام برنامج تشغيل VirtIO-Console على جهاز Android guest VM وجهاز VirtIO-Console الموجود على الجهاز الظاهري المضيف لفتح منفذ COM افتراضي وإرسال حزم HCI إلى وحدة تحكم Bluetooth واستقبال الأحداث. يسمح هذا التصميم باستخدام تقنية Bluetooth HAL العامة والحيادية حول HW بواسطة مكدس Android Bluetooth. يمكن لجهاز VM المضيف التعامل مع المهام الخاصة بالأجهزة ، مثل التهيئة وتنزيل البرامج الثابتة لوحدة تحكم Bluetooth.

يعتمد تطبيق Bluetooth على الرسم التوضيحي للتصميم أدناه.

هندسة البلوتوث
الشكل 5. هندسة بلوتوث

السيارة HAL

يتكون تطبيق HAL للمركبة من عنصرين:

  • عميل. يوفر واجهات برمجة التطبيقات التي يستخدمها Android في AAOS الافتراضي
  • الخادم. يتصل مباشرة بالأجهزة ، مثل حافلات المركبات (أو المحاكي).

في الظاهرية ، يعمل خادم VHAL على الجهاز الظاهري المضيف. يتواصل عميل وخادم VHAL من خلال GRPC-vsock (لمزيد من المعلومات ، راجع device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). يمكن لمصنعي المعدات الأصلية استخدام بروتوكول نقل مختلف بخلاف GRPC من خلال تجاوز واجهات برمجة تطبيقات الاتصال. للحصول على أمثلة ، راجع device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .

نظام عرض ممتد

يستخدم نظام الرؤية الممتد (EVS) لعرض الفيديو الذي تم التقاطه بواسطة كاميرات الرؤية الخلفية والرؤية المحيطية. في AAOS الافتراضي ، يمكن لمكدس EVS الوصول إلى دفق الفيديو من جهاز دفق V4L2 الافتراضي الذي يستخدم برنامج تشغيل VirtIO-video.

وضع المرآب

لمزيد من المعلومات ، راجع ما هو وضع المرآب؟ .

يتم تشغيل الدخول إلى وضع Garage والخروج منه بواسطة خصائص AP_POWER_STATE_REQ المرسلة بواسطة HAL الخاص بالمركبة. في الوضع الافتراضي ، يتم تشغيل وضع المرآب من جانب المضيف. يجب أن يظل الجهاز المضيف VM قيد التشغيل لتوفير أجهزة افتراضية لنظام Android VM ، حتى يتم إيقاف تشغيل Android. يرسل خادم VHAL على المضيف VM إشارة إيقاف التشغيل إلى ضيف AAOS VM. عند استقبال عميل VHAL للإشارة ، يدخل AAOS VM في وضع Garage ويبدأ في إرسال إشارات دقات القلب للحفاظ على الجهاز الظاهري للمضيف نشطًا.

تفريغ

عند إنشاء تقرير الأخطاء لـ AAOS الافتراضي ، من المهم تضمين معلومات المضيف VM بحيث يكون للمطورين رؤية أكثر شمولاً للنظام. لتحقيق ذلك ، يقوم تنفيذ مرجع 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
    

أنظمة فرعية أخرى

يوفر VirtIO بالفعل واجهة محددة جيدًا لمكونات مثل التخزين الكتلي والشبكة ووحدة التحكم والإدخال والمقبس والإنتروبيا. بالنسبة لهذه الأنظمة الفرعية ، تستخدم AAOS برنامج التشغيل كما هو ، مثل virtio-blk و virtio-input و virtio-console و virtio-net .

في النظام الأساسي المرجعي الافتراضي AAOS ، يتم دعم Wi-Fi مع mac80211_hwsim لتمكين شبكة VirtWifi اللاسلكية ، والتي تستخدم بعد ذلك نفق virtio-net لإرسال حركة مرور الشبكة إلى الجهاز الظاهري المضيف ، والذي لديه وصول مباشر إلى شبكة Wi-Fi الفعلية.