AAOS में VirtIO को सपोर्ट करने के लिए, ज़्यादातर बदलाव HAL के लागू करने के लेवल पर और Android Common Kernel में इससे नीचे किए जाते हैं. Android फ़्रेमवर्क, हार्डवेयर से जुड़ी जानकारी के बिना काम करने वाले सामान्य एचएएल से कम्यूनिकेट करता है. इसके लिए, AAOS गेस्ट वीएम कर्नल में VirtIO ड्राइवर का इस्तेमाल किया जाता है. यह VirtIO प्रोटोकॉल का इस्तेमाल करके, होस्ट साइड पर मौजूद VirtIO डिवाइसों से कम्यूनिकेट करता है. होस्ट साइड पर मौजूद VirtIO डिवाइस, SoC के हिसाब से डिवाइस ड्राइवर का इस्तेमाल करके फ़िज़िकल एचडब्ल्यू को ऐक्सेस कर सकते हैं.
VirtIO ड्राइवर और VirtIO डिवाइस के बीच कम्यूनिकेशन, virtqueue की मदद से होता है. ये स्कैटर गैदर लिस्ट के डीएमए जैसे रिंग बफ़र होते हैं.
वर्चुअल मशीनों के बीच VirtIO मैसेज का लेन-देन करने के लिए, कई ट्रांसपोर्ट का इस्तेमाल किया जा सकता है. जैसे, MMIO या PCI.
कुछ मामलों में, vsock का इस्तेमाल अलग-अलग वीएम के बीच कम्यूनिकेशन के लिए किया गया है.
वाहन के एचएएल, ऑडियो कंट्रोल, और डंपस्टेट कम्यूनिकेशन के लिए, vsock इंटरफ़ेस के ज़रिए किसी अन्य वीएम पर मौजूद पीयर एजेंट से कनेक्शन का इस्तेमाल किया जाता है.
GRPC-vsock का इस्तेमाल, इन नॉन-स्टैंडर्ड सबसिस्टम को ऐक्सेस करने के लिए किया जाता है.
Android सोर्स ट्री में GRPC को vsock के साथ काम करने के लिए बदला गया है. इसमें vsock:CID:PORT_NUMBER के पते का फ़ॉर्मैट इस्तेमाल किया गया है.
ऑडियो
वर्चुअलाइज़ किए गए AAOS में, Android गेस्ट वीएम, ऑडियो को ऐक्सेस करने के लिए virtio-snd का इस्तेमाल कर सकता है.
virtio-snd, Android VM को वर्चुअलाइज़ किए गए पीसीएम डिवाइस उपलब्ध कराता है, ताकि ऑडियो एचएएल लागू करने वाला सॉफ़्टवेयर, वर्चुअलाइज़ किए गए साउंड डिवाइसों के साथ इंटरैक्ट कर सके. इसके लिए, TinyALSA लाइब्रेरी का इस्तेमाल किया जाता है.
डिफ़ॉल्ट ऑडियो HAL को AOSP में /device/google/trout/hal/audio/6.0 पर लागू किया जाता है. ओईएम, अपने प्लैटफ़ॉर्म के लिए ro.vendor.trout.audiohal.{in,out}_period_{ms,count} में बदलाव कर सकते हैं. ओईएम, /device/google/trout/aosp_trout_common.mk. में ऑडियो से जुड़े वैरिएबल को बदलकर, अपना ऑडियो एचएएल भी लागू कर सकते हैं
ऑडियो कंट्रोल HAL, AAOS में ऑडियो फ़ोकस को मैनेज करता है. उदाहरण के लिए, जब सिस्टम आपातकालीन आवाज़ें चला रहा हो, तो बैकग्राउंड में चल रहे संगीत को म्यूट करना पड़ सकता है. ऑडियो कंट्रोल HAL, संगीत चलाने वाले ऐप्लिकेशन को इस स्थिति में म्यूट करने के लिए सूचना देता है. वर्चुअलाइज़ किए गए सिस्टम में, आवाज़ें अन्य वीएम से आ सकती हैं. रेफ़रंस के तौर पर दिए गए उदाहरण में, AAOS के मेहमान वीएम में ऑडियो कंट्रोल सर्वर डेमॉन चल रहा है. यह GRPC-vsock का इस्तेमाल करके, अन्य वीएम से ऑडियो फ़ोकस के अनुरोध पाता है.
होस्ट वीएम, AAOS को ऑडियो कंट्रोल करने के अनुरोध भेजने के लिए device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller का इस्तेमाल कर सकता है. libandroid_audio_controller के पास ऑडियो फ़ोकस होने पर, यह AAOS को हार्टबीट भेजता रहता है. ऐसा तब तक होता है, जब तक फ़ोकस रिलीज़ नहीं हो जाता.
ब्लूटूथ
ब्लूटूथ की सुविधा को नीचे दिए गए डिज़ाइन के आधार पर लागू किया गया है.
ब्लूटूथ हैंड्स-फ़्री प्रोफ़ाइल
trout पर ब्लूटूथ हैंड्स-फ़्री प्रोफ़ाइल (एचएफ़पी) चालू करने के लिए, VirtIO साउंड डिवाइस के स्पेसिफ़िकेशन को ऑडियो कंट्रोल के साथ काम करने के लिए बढ़ाया गया है. इस तरीके का इस्तेमाल करके, होस्ट/हाइपरवाइज़र साइड पर मौजूद VirtIO साउंड डिवाइस, एचएफ़पी से जुड़े ये तीन ऑडियो कंट्रोल उपलब्ध कराता है:
hfp_enablehfp_set_sampling_ratehfp_volume
जब AAOS, गेस्ट वीएम के तौर पर काम करता है, तब AAOS इन ऑडियो कंट्रोल को सेट करने के लिए TinyAlsa का इस्तेमाल करता है. एचएफ़पी के इस्तेमाल के उदाहरण को चालू करने के लिए, होस्ट/हाइपरवाइज़र, वेंडर के हिसाब से रूटिंग और कैलिब्रेशन करता है.
ब्लूटूथ को लागू करने का तरीका, यहां दिए गए डिज़ाइन इलस्ट्रेशन पर आधारित है.
Dumpstate
वर्चुअलाइज़ किए गए AAOS के लिए बग रिपोर्ट जनरेट करते समय, होस्ट वीएम की जानकारी शामिल करना ज़रूरी है. इससे डेवलपर को सिस्टम के बारे में ज़्यादा जानकारी मिलती है. इसके लिए, trout रेफ़रंस इंप्लीमेंटेशन, IDumpstateDevice HAL को लागू करता है. यह GRPC-vsock के ज़रिए होस्ट वीएम की जानकारी इकट्ठा करता है. `tar`-पैकेज किए गए होस्ट वीएम की जानकारी को गड़बड़ी की रिपोर्ट में dumpstate_board.bin नाम दिया गया है. वहीं, लॉग डंप करने की जानकारी dumpstate_board.txt पर मौजूद है.
कमांड को लागू करने के लिए, उन्हें कॉन्फ़िगर करने का तरीका:
- नीचे दी गई फ़ाइल से कॉन्फ़िगरेशन की जानकारी कॉपी करके, उसे किसी एक्सएमएल फ़ाइल में चिपकाएं. उदाहरण के लिए,
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> - लॉन्च करते समय, नई एक्सएमएल फ़ाइल का पाथ, dumpstate सर्वर को पास करें. उदाहरण के लिए:
--config_file my_config.xml
एक्सटेंडेड व्यू सिस्टम (ईवीएस)
एक्सटेंडेड व्यू सिस्टम (ईवीएस) का इस्तेमाल, रियर-व्यू और सराउंड-व्यू कैमरों से कैप्चर किया गया वीडियो दिखाने के लिए किया जाता है. वर्चुअलाइज़ किए गए AAOS में, ईवीएस स्टैक, VirtIO-video ड्राइवर का इस्तेमाल करने वाले वर्चुअलाइज़ किए गए V4L2 स्ट्रीमिंग डिवाइस से वीडियो स्ट्रीम को ऐक्सेस कर सकता है.
गैराज मोड
ज़्यादा जानकारी के लिए, गैराज मोड देखें.
गैराज मोड में जाने और इससे बाहर निकलने की सुविधा, AP_POWER_STATE_REQ प्रॉपर्टी से ट्रिगर होती है. ये प्रॉपर्टी, व्हीकल एचएएल भेजता है. वर्चुअलाइज़ेशन मोड में, गैराज मोड को होस्ट साइड से ट्रिगर किया जाता है.
Android VM के लिए वर्चुअल डिवाइस उपलब्ध कराने के लिए, होस्ट वीएम को तब तक चालू रहना चाहिए, जब तक Android बंद न हो जाए. होस्ट वीएम पर मौजूद VHAL सर्वर, AAOS गेस्ट वीएम को बंद करने का सिग्नल भेजता है.
वीएचएएल क्लाइंट से सिग्नल मिलने पर, AAOS वीएम गैराज मोड में चला जाता है. साथ ही, होस्ट वीएम को चालू रखने के लिए, हार्टबीट सिग्नल भेजने लगता है.
ग्लोबल नेविगेशन सैटलाइट सिस्टम (जीएनएसएस)
trout 1.0 में, virtio-console पर जीएनएसएस वर्चुअलाइज़ेशन की सुविधा जोड़ी गई है. इस सुविधा को लागू करने पर, होस्ट से मेहमान को मेज़रमेंट और लोकेशन की जानकारी मिलती है.
डेटा एक्सचेंज फ़ॉर्मैट, GnssLogger ऐप्लिकेशन इस्तेमाल करने वाला CSV फ़ॉर्मैट है. रेफ़रंस के तौर पर लागू किए गए इस फ़ॉर्मैट में, नेटिव GNSS ड्राइवर उपलब्ध नहीं है. इसलिए, मॉक डेटा उपलब्ध कराया जाता है. हालांकि, गेस्ट-साइड में कोई बदलाव किए बिना, नेटिव ड्राइवर को लागू किया जा सकता है. trout सोर्स कोड में, मॉक होस्ट एजेंट का एक सैंपल दिया गया है.
मौजूदा सिस्टम में, जीएनएसएस को शुरू करने और असिस्टेड जीएनएसएस (एजीएनएसएस) को मैनेज करने का काम, होस्ट ओएस एनवायरमेंट को करना होता है.
ग्राफ़िक
जब AAOS, अन्य ऑटोमोटिव ऑपरेटिंग सिस्टम के साथ गेस्ट वीएम के तौर पर चल रहा होता है, तो Android के पास GPU या डिसप्ले कंट्रोलर का सीधा ऐक्सेस नहीं हो सकता. इस मामले में, जीपीयू को ऐक्सेस करने के लिए, Android गेस्ट वीएम और virtio-gpu डिवाइस पर Mesa या goldfish-opengl और virtio-gpu ड्राइवर का इस्तेमाल किया जा सकता है.
Android के गेस्ट वीएम पर, Mesa या goldfish-opengl, OpenGLES कमांड को Gallium स्ट्रीम या अपने-आप जनरेट होने वाली GLES स्ट्रीम में बदलता है. virtio-gpu
कर्नेल ड्राइवर का इस्तेमाल ट्रांसपोर्ट के तौर पर किया जाता है. होस्ट साइड पर, virglrenderer (Mesa के लिए) और vulkan-cereal (goldfish-opengl के लिए), डिकोड की गई कमांड स्ट्रीम को मौजूदा जीपीयू ड्राइवर के ऊपर फिर से चलाता है. AAOS का रेफ़रंस प्लैटफ़ॉर्म trout, Vulkan के साथ सिर्फ़ OpenGL ES के साथ काम करता है. Vulkan के साथ काम करने की सुविधा, आने वाले समय में उपलब्ध होगी.
सेंसर
जब AAOS, अन्य ऑटोमोटिव ऑपरेटिंग सिस्टम के साथ गेस्ट वीएम के तौर पर चल रहा हो, तो हो सकता है कि Android के पास सेंसर का सीधा ऐक्सेस न हो. इस मामले में, सेंसर को ऐक्सेस करने के लिए, Android गेस्ट वीएम पर Virtio-SCMI ड्राइवर और होस्ट वीएम पर VirtIO-SCMI डिवाइस का इस्तेमाल किया जाता है. AAOS वर्चुअलाइज़ेशन रेफ़रंस प्लैटफ़ॉर्म, सामान्य और एचडब्ल्यू-अग्नोस्टिक सेंसर एचएएल उपलब्ध कराता है. इसका इस्तेमाल, सेंसर को ऐक्सेस करने के लिए एआरएम पर आधारित एसओसी के लिए किया जा सकता है.
सेंसर HAL, Linux Kernel IIO सबसिस्टम में मौजूद IIO SCMI ड्राइवर से कम्यूनिकेट करता है. यह ड्राइवर, ARM System Control and Management Interface (SCMI) स्पेसिफ़िकेशन के ज़रिए उपलब्ध कराए गए SCMI Sensor Management Protocol का इस्तेमाल करता है. इससे सेंसर का पता लगाया जा सकता है और उन्हें कॉन्फ़िगर किया जा सकता है. साथ ही, सेंसर का डेटा पढ़ा जा सकता है और सेंसर की वैल्यू में होने वाले बदलावों के बारे में सूचनाएं पाई जा सकती हैं.
IIO SCMI ड्राइवर, VirtIO SCMI ड्राइवर का इस्तेमाल करता है. यह VirtIO ट्रांसपोर्ट प्रोटोकॉल का इस्तेमाल करता है. इस प्रोटोकॉल के बारे में virtio-scmi स्पेसिफ़िकेशन में बताया गया है. इसका इस्तेमाल, होस्ट वीएम पर VirtIO SCMI डिवाइस के साथ SCMI मैसेज शेयर करने के लिए किया जाता है. VirtIO SCMI डिवाइस के पास, एसओसी के हिसाब से सेंसर ड्राइवर के ज़रिए सेंसर को सीधे तौर पर ऐक्सेस करने की सुविधा होती है.
सेंसर एचएएल की जगह
VirtIO SCMI का इस्तेमाल करने वाले सेंसर एचएएल का रेफ़रंस इंप्लीमेंटेशन, device/google/trout/hal/sensors पर मौजूद है.
सेंसर एचएएल कॉन्फ़िगरेशन
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 के इस्तेमाल किए गए एपीआई उपलब्ध कराता है
- सर्वर. यह सीधे तौर पर हार्डवेयर से कम्यूनिकेट करता है. जैसे, वाहन की बसें (या कोई एम्युलेटर).
वर्चुअलाइज़ेशन में, वीएचएएल सर्वर, होस्ट वीएम पर चलता है. वीएचएएल क्लाइंट और सर्वर, 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 रेफ़रंस प्लैटफ़ॉर्म में, वाई-फ़ाई की सुविधा mac80211_hwsim के साथ काम करती है. इससे VirtWifi वायरलेस नेटवर्क चालू किया जा सकता है. इसके बाद, यह नेटवर्क virtio-net टनल का इस्तेमाल करके, नेटवर्क ट्रैफ़िक को होस्ट वीएम पर भेजता है. होस्ट वीएम के पास, असल वाई-फ़ाई नेटवर्क का सीधा ऐक्सेस होता है.