إنّ معظم التغييرات اللازمة لتفعيل VirtIO في AAOS تتضمن تغييرات على مستوى تنفيذ HAL وما دونه في نواة Android Common Kernel. يتواصل إطار عمل Android مع HAL عام لا يعتمد على الأجهزة باستخدام برامج تشغيل VirtIO في AAOS الضيف لنظام التشغيل VM، والذي يتواصل مع أجهزة VirtIO على جانب المضيف باستخدام بروتوكولات VirtIO. يمكن لأجهزة VirtIO على جانب المضيف الوصول إلى الأجهزة الحقيقية باستخدام برامج تشغيل الأجهزة الخاصة بالمنظومة على الرقاقة.
يتم التواصل بين برنامج تشغيل VirtIO وجهاز VirtIO باستخدام
virtqueue
، وهي مصفوفات حلقة تشبه DMA لقوائم التجميع والنشر.
يمكن استخدام العديد من وسائل النقل، مثل
MMIO
أو
PCI
لتبادل رسائل VirtIO بين الأجهزة الافتراضية.
في بعض الحالات، تم استخدام vsock
للتواصل بين الأجهزة الافتراضية.
يمكن إجراء اتصالات Vehicle HAL وAudio Control وDumpstate باستخدام اتصال
بوكيل نظير على جهاز افتراضي منفصل عبر واجهة vsock
.
يتم استخدام GRPC-vsock
للوصول إلى هذه الأنظمة الفرعية غير المُعَدَّلة.
تم تعديل GRPC
في شجرة مصدر Android للعمل مع vsock
بتنسيق العنوان
vsock:CID:PORT_NUMBER
.

الصوت
في نظام التشغيل AAOS الظاهري، يمكن للجهاز الظاهري الضيف الذي يعمل بنظام التشغيل Android استخدام 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 للتحكّم في الصوت
إشعارًا إلى التطبيقات التي تشغّل الموسيقى لإيقاف الصوت في هذه الحالة. في النظام المستند إلى الأجهزة الافتراضية، يمكن أن تأتي
الأصوات من أجهزة افتراضية أخرى. في عملية التنفيذ المرجعية، يشتمل جهاز افتراضي الضيف الذي يعمل بنظام التشغيل 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 ، ينفِّذ المضيف/نظام التشغيل الافتراضي عملية التوجيه والمعايرة الخاصة بالمورّد وفقًا لذلك.
يستند تنفيذ البلوتوث إلى الرسم التوضيحي للتصميم أدناه.

Dumpstate
عند إنشاء تقرير الأخطاء لنظام التشغيل AAOS المستند إلى الأجهزة الافتراضية، من المهم تضمين معلومات عن الجهاز الافتراضي المضيف
لكي يحصل المطوّرون على نظرة أكثر شمولية على النظام. لتحقيق ذلك، ينفِّذ الرمز المرجعي لتطبيق trout
واجهة برمجة التطبيقات IDumpstateDevice
HAL، التي تجمع معلومات جهاز افتراضي المضيف من خلال GRPC-vsock
. تم تسمية معلومات الجهاز الافتراضي المضيف المُحزمة بتنسيق tar
بـ dumpstate_board.bin
في تقرير الأخطاء، بينما يمكن العثور على سجلات تفريغ البيانات في
dumpstate_board.txt
.
لضبط الأوامر المطلوب تنفيذها:
- انسخ تفاصيل الضبط من الملف أدناه إلى ملف 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>
- نقْل مسار ملف XML الجديد إلى خادم dumpstate عند الإطلاق. مثلاً:
--config_file my_config.xml
نظام العرض الموسّع (EVS)
يُستخدَم نظام "العرض الموسَّع" (EVS) لعرض الفيديو الذي تم التقاطه بواسطة كاميرا الرؤية الخلفية وكاميرا الرؤية المحيطة. في نظام التشغيل AAOS الافتراضي، يمكن لحزمة EVS الوصول إلى بث الفيديو من جهاز البث V4L2 الافتراضي الذي يستخدم برنامج تشغيل الفيديو VirtIO.
وضع المرآب
لمزيد من المعلومات، يُرجى الاطّلاع على وضع المرآب.
يتم تفعيل وضع "المرآب" والخروج منه من خلال AP_POWER_STATE_REQ
properties
المُرسَلة من Vehicle HAL. في وضع المحاكاة الافتراضية، يتم تفعيل وضع Garage من جانب المضيف.
يجب أن يظل الجهاز الافتراضي المضيف مفعَّلاً لتوفير الأجهزة الافتراضية لجهاز Android الافتراضي، إلى أن يتم
إيقاف تشغيل Android. ويُرسِل خادم VHAL على الجهاز الافتراضي المضيف إشارة الإيقاف إلى الجهاز الافتراضي للضيف AAOS.
عند تلقّي إشارة العميل VHAL، يدخل جهاز افتراضي AAOS في وضع "المرآب" ويبدأ في إرسال إشارات نبضات القلب
للحفاظ على نشاط الجهاز الافتراضي المضيف.
نظام تحديد المواقع العالمي عبر الأقمار الصناعية (GNSS)
في الإصدار 1.0 من trout
، تمت تمت إضافة إمكانية استخدام تقنية المحاكاة الافتراضية لنظام تحديد المواقع العالمي (GNSS) على virtio-console
. يتيح التنفيذ تبادل القياسات الأولية وإصلاحات الموقع الجغرافي من العميل
إلى المضيف.
تنسيق تبادل البيانات هو تنسيق CSV الذي يستخدمه تطبيق GnssLogger. في عملية التنفيذ المرجعية،
نظرًا لعدم توفّر برنامج تشغيل GNSS الأصلي، يتم توفير بيانات وهمية، ولكن يمكن تنفيذ برنامج تشغيل أصلي
بدون أي تغييرات من جهة الضيف. يتم تقديم نموذج لمحاكي وكيل المضيف كجزء من
رمز المصدر trout
.
يتوقع التنفيذ الحالي أن تتعامل بيئة نظام التشغيل المضيف مع عملية إعداد نظام تحديد المواقع العالمي (GNSS) ونظام تحديد المواقع العالمي (AGNSS) المساعد.

الرسومات
عند تشغيل AAOS كجهاز افتراضي ضيف إلى جانب أنظمة التشغيل الأخرى للسيارات، قد لا يتمكن Android
من الوصول مباشرةً إلى وحدة معالجة الرسومات أو وحدة التحكّم في الشاشة. في هذه الحالة، يمكن استخدام
Mesa أو
goldfish-opengl
وبرنامج تشغيل virtio-gpu
على جهاز Android الضيف والجهاز virtio-gpu
للوصول إلى وحدة معالجة الرسومات.
في جهاز Android الضيف الظاهري، يُشفِّر Mesa أو goldfish-opengl
أوامر OpenGLES إما
إلى بث Gallium أو بث GLES تم إنشاؤه تلقائيًا، على التوالي. يُستخدَم برنامج تشغيل virtio-gpu
النواة لنقل البيانات. من جهة المضيف، يعيد virglrenderer
(لنظام Mesa) وvulkan-cereal
(لنظام goldfish-opengl
) تشغيل بث الأوامر التي تم فك ترميزها على سطح مكتب برنامج تشغيل وحدة معالجة الرسومات الحالي. لا تتوافق المنصة المرجعية لنظام التشغيل AAOS trout
مع OpenGL ES سوى
مع دعم Vulkan، الذي من المتوقّع أن يتوفّر في إصدار مستقبلي.

أجهزة الاستشعار
عند تشغيل AAOS كجهاز افتراضي ضيف إلى جانب أنظمة التشغيل الأخرى للسيارات، قد لا يتمكن Android من الوصول مباشرةً إلى أجهزة الاستشعار. في هذه الحالة، يتم استخدام برنامج تشغيل Virtio-SCMI على الجهاز الضيف Android على الجهاز الظاهري وجهاز VirtIO-SCMI على الجهاز المضيف للوصول إلى أدوات الاستشعار. توفّر المنصة المرجعية لتكنولوجيا المحاكاة في نظام التشغيل AAOS واجهة HAL عامة لا تعتمد على الأجهزة، ويمكن استخدامها مع وحدات المعالجة المركزية (SoC) المستندة إلى ARM للوصول إلى أجهزة الاستشعار.
يتواصل Sensor HAL مع برنامج تشغيل IIO SCMI في النظام الفرعي IIO لنظام التشغيل Linux، الذي يستخدم بروتوكول إدارة أدوات استشعار SCMI المقدَّم من مواصفات ARM System Control and Management Interface (SCMI) لاكتشاف أدوات الاستشعار وضبطها وقراءة بياناتها والحصول على إشعارات بشأن التغيُّرات في قيمها.
يستخدم برنامج تشغيل IIO SCMI برنامج تشغيل VirtIO SCMI الذي يستخدم بروتوكول نقل VirtIO كما هو محدّد في مواصفة
virtio-scmi
لتبادل رسائل SCMI مع جهاز VirtIO SCMI على الجهاز الظاهري المضيف. يمكن لجهاز VirtIO
SCMI الوصول مباشرةً إلى أدوات الاستشعار من خلال برامج تشغيل أدوات الاستشعار الخاصة بوحدة المعالجة المركزية (SoC).

موقع حِزم HAL الخاصة بأجهزة الاستشعار
يمكن العثور على التنفيذ المرجعي لواجهة HAL الخاصة بجهاز الاستشعار، والتي تستخدم واجهة VirtIO SCMI، على الرابط
device/google/trout/hal/sensors
.
إعدادات Sensor HAL
قد تحتاج واجهة HAL الخاصة بأجهزة الاستشعار إلى تعديل بيانات أجهزة الاستشعار التي يتم تلقّيها من جهاز افتراضي المضيف للامتثال لنظام إحداثيات أجهزة استشعار السيارات في 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>
Vehicle HAL
يتألّف تنفيذ Vehicle 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
.
الأنظمة الفرعية الأخرى
توفّر VirtIO حاليًا واجهة محدّدة جيدًا للمكونات، مثل "تخزين الكتل"،
و"الشبكة"، و"وحدة التحكّم"، و"الإدخال"، و"المقبس"، و"الترميز العشوائي". بالنسبة إلى هذه الأنظمة الفرعية، يستخدم نظام التشغيل AAOS
برنامج التشغيل كما هو، مثل virtio-blk
وvirtio-input
وvirtio-console
وvirtio-net
.
في المنصة المرجعية لنظام التشغيل AAOS المستند إلى الأجهزة الافتراضية، تتوفّر شبكة Wi-Fi مع mac80211_hwsim
لتفعيل شبكة VirtWifi
لاسلكية، والتي تستخدِم بعد ذلك النفق virtio-net
لإرسال حركة المرور في الشبكة إلى الجهاز الظاهري المضيف الذي يمكنه الوصول مباشرةً إلى شبكة Wi-Fi الفعلية.