אדריכלות

רוב השינויים הנדרשים כדי לתמוך ב-VirtIO ב-AAOS כוללים שינויים ב-HAL ברמת ההטמעה וברמות שמתחתיה ב-Android Common Kernel. מסגרת Android מתקשר עם HAL גנרי שלא תלוי בחומרה באמצעות מנהלי התקנים של VirtIO באורח AAOS ליבת VM, שמתקשרת עם מכשירי VirtIO בצד המארח באמצעות פרוטוקולים של VirtIO. מכשירי VirtIO בצד המארח יכולים לגשת ל-HW הפיזי באמצעות מנהלי התקנים של מכשירים ספציפיים ל-SoC.

התקשורת בין מנהל התקן VirtIO לבין מכשיר VirtIO מתקיימת באמצעות virtqueue, שהם מאגרי טבעות של פיזור טבעות דמויי אזור שוק ייעודי (DMA) אוספים רשימות. כמה אמצעי תחבורה, כמו MMIO או PCI יכול לשמש להעברת הודעות VirtIO בין מכונות וירטואליות.

במקרים מסוימים נעשה שימוש ב-vsock לתקשורת בין מכונות וירטואליות. תמיכה בתקשורת HAL, בקרת אודיו ומצב Dump של הרכב היא באמצעות חיבור לסוכן עמית ב-VM נפרדת דרך ממשק vsock. GRPC-vsock משמש לגישה למערכות המשנה הלא סטנדרטיות האלה. GRPC בעץ המקור של Android השתנה כך שיעבוד עם vsock עם הכתובת בפורמט vsock:CID:PORT_NUMBER.

ארכיטקטורת וירטואליזציה
איור 1. ארכיטקטורת וירטואליזציה

אודיו

ב-AAOS הווירטואלי, למכונה הווירטואלית כאורח ב-Android יש אפשרות להשתמש ב-virtio-snd כדי לגשת לאודיו. virtio-snd מספק את מכשירי ה-PCM הווירטואליים ל-VM של Android כדי הטמעת אודיו 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 כולל דימון (daemon) של שרת בקרת אודיו, שמשתמש ב-GRPC-vsock כדי לקבל בקשות למיקוד אודיו ממכונות וירטואליות אחרות. המכונה הווירטואלית של המארח יכולה להשתמש ב-device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller כדי לשלוח בקשות לבקרת אודיו אל AAOS. בזמן ש-libandroid_audio_controller מחזיק/ה ב- המיקוד באודיו ימשיך לשלוח פעימות לב ל-AAOS עד שהמיקוד ישוחרר.

ארכיטקטורת אודיו
איור 5. ארכיטקטורת אודיו

‫Bluetooth

הטמעת Bluetooth מבוססת על העיצוב שמתואר בהמשך.

ארכיטקטורת Bluetooth
איור 5. ארכיטקטורת Bluetooth

פרופיל Bluetooth בדיבורית

כדי להפעיל את פרופיל Bluetooth Hands-Free (HFP) ב-trout, מכשיר הצליל VirtIO הרחבנו את המפרט כדי לתמוך בפקדי אודיו. בגישה הזאת, יישמע צליל VirtIO במכשיר בצד המארח או hypervisor מספקים את שלושת פקדי האודיו הבאים שקשורים ל-HFP:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

כש-AAOS פועל כמכונה וירטואלית כאורח, AAOS משתמש ב-TinyAlsa כדי להגדיר את פקדי האודיו האלה. כדי להפעיל את HFP תרחיש לדוגמה, המארח/ה-hypervisor מבצעים את הניתוב והכיול הספציפיים לספק בהתאם.

ההטמעה של Bluetooth מבוססת על האיור העיצוב שבהמשך.

ארכיטקטורת Bluetooth
איור 5. ארכיטקטורת Bluetooth

מצב ריקון

כשיוצרים את דוח איתור הבאגים עבור AAOS וירטואלי, חשוב לכלול את פרטי ה-VM של המארח כדי שלמפתחים תהיה תמונה מקיפה יותר של המערכת. כדי לעשות זאת, בהטמעה של קובצי העזר של trout מוטמע HAL של IDumpstateDevice, אוסף את פרטי המכונה הווירטואלית של המארח באמצעות GRPC-vsock. ה-VM של המארח הארוז '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 החדש לשרת תמונת המצב במהלך ההפעלה. מוצרים לדוגמה:
    --config_file my_config.xml
    

מערכת תצוגה מורחבת (EVS)

המערכת לתצוגה מורחבת (EVS) משמשת להצגת סרטונים שצולם במצלמה האחורית מצלמות סראונד. ב-AAOS הווירטואלי, סטאק ה-EVS יכול לגשת לשידור הווידאו מ- סטרימר V4L2 וירטואלי שמשתמש במנהל התקן VirtIO-video.

מצב חנייה

מידע נוסף זמין במאמר הבא: מצב חניה.

הכניסה למצב החניה והיציאה ממנה מופעלת על ידי AP_POWER_STATE_REQ נכסים נשלח על ידי צוות האישורים של הרכב. במצב וירטואלי, מצב החניה מופעל בצד המארח. ה-VM של המארח צריכה להישאר מופעלת כדי לספק מכשירים וירטואליים ל-Android VM, עד ש-Android מושבת. שרת VHAL ב-VM של המארח שולח את אות הכיבוי ל-VM של האורח ב-AAOS. אחרי קבלת האות VHAL הלקוח, המכונה הווירטואלית AAOS עוברת למצב 'מוסך' ומתחילה לשלוח פעימות לב כדי שהמכונה הווירטואלית של המארח תמשיך להיות פעילה.

מערכת ניווט לוויינית גלובלית (GNSS)

בגרסה 1.0 של trout, התמיכה בווירטואליזציה של GNSS במסגרת virtio-console נוסף. ההטמעה תומכת בחילופי מדידות גולמיות ותיקוני מיקום מ: עם המארח.

הפורמט של חילופי הנתונים הוא קובץ ה-CSV שמשמש את אפליקציית GnssLogger. בהטמעה של קובצי העזר, מכיוון שמנהל התקן GNSS המקורי לא זמין, יש נתוני הדמיה זמינים, אבל נהג/ת נייטיב לא זמין. ניתן להטמיע ללא שינויים בצד האורח. דוגמת סוכן מארח לדוגמה מסופק כחלק מ את קוד המקור trout.

במסגרת ההטמעה הנוכחית, נדרש טיפול באתחול GNSS וב-Assist GNSS (AGNSS) על ידי סביבת מערכת ההפעלה המארחת.

ארכיטקטורת GNSS
איור 2. ארכיטקטורת GNSS

גרפיקה

כש-AAOS פועלת כמכונה וירטואלית לאורח לצד מערכות הפעלה אחרות לכלי רכב, יכול להיות ש-Android לא לקבל גישה ישירה ל-GPU או לבקר המסך. במקרה הזה, Mesa או goldfish-opengl ונהג/ת virtio-gpu במכונה וירטואלית לאורח של Android ובמכשיר virtio-gpu יכול לשמש כדי לגשת ל-GPU.

במכונה וירטואלית לאורח של Android, אפליקציית Mesa או goldfish-opengl מקודדת פקודות OpenGLES לזרם Gallium או לזרם GLES שנוצר באופן אוטומטי, בהתאמה. virtio-gpu מנהל ליבה (kernel) משמש כהעברה. בצד המארח, virglrenderer (בשביל מסה) וגם vulkan-cereal (עבור goldfish-opengl) הפעלה מחדש של זרם הפקודה המפוענח במכשיר בחלק העליון של מנהל ההתקן הקיים של יחידת ה-GPU. פלטפורמת העזר של AAOS trout תומכת ב-OpenGL ES רק עם תמיכה של Vulkan, שצפויה להיות זמינה בגרסה עתידית.

ארכיטקטורה גרפית
איור 3. ארכיטקטורה גרפית

חיישנים

כש-AAOS פועל כ-VM כאורח לצד מערכות הפעלה אחרות לכלי רכב, יכול להיות שאין ל-Android גישה ישירה לחיישנים. במקרה הזה, מנהל התקן Virtio-SCMI נעשה שימוש במכונה הווירטואלית לאורח של Android ובמכשיר VirtIO-SCMI במכונה הווירטואלית של המארח כדי לגשת לחיישנים. פלטפורמת העזר לווירטואליזציה של AAOS מספקת חיישן גנרי ומבוסס-HW HAL אפשר להשתמש ב-SoCs מבוססי ARM כדי לגשת לחיישנים.

החיישן HAL מתקשר עם מנהל התקן IIO SCMI במערכת המשנה Linux Kernel IIO שמשתמש ב-SCMI Sensor Management Protocol שמספק ARM System Control and Management Interface (SCMI) לזיהוי ולהגדרה של חיישנים, קריאת נתוני חיישנים וקבלת התראות על חיישן שינויים בערך.

מנהל התקן IIO SCMI משתמש במנהל התקן VirtIO SCMI, שמשתמש בהעברת VirtIO פרוטוקול כפי שמצוין virtio-scmi להחלפה של הודעות SCMI עם מכשיר VirtIO SCMI ב-VM של המארח. ה-VirtIO למכשיר SCMI יש גישה ישירה לחיישנים דרך מנהלי התקנים של חיישנים ספציפיים ל-SoC.

ארכיטקטורת חיישנים
איור 4. ארכיטקטורת חיישנים

מיקום החיישן עם HAL

יישום הייחוס של חיישן HAL, המשתמש ב-VirtIO SCMI, נמצא בכתובת device/google/trout/hal/sensors

הגדרת חיישן HAL

יכול להיות שחיישן HAL יצטרך לשנות את נתוני החיישן שהתקבלו מה-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>

עוצמת קול לרכב

הטמעת תקן HAL לרכב מורכבת משני רכיבים:

  • לקוח/ה. מספקת ממשקי API שמשמשים את Android ב-AAOS וירטואלי
  • שרת. תקשורת ישירה עם החומרה, למשל אוטובוסים (או אמולטור).

בווירטואליזציה, שרת VHAL פועל במכונה הווירטואלית של המארח. הלקוח והשרת של VHAL מתקשרים עד GRPC-vsock (למידע נוסף, ראו device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto). יצרני ציוד מקורי יכולים להשתמש שונה מ-GRPC על ידי שינוי של ממשקי ה-API לתקשורת. לדוגמה, פרטים נוספים זמינים בdevice/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp.

מערכות משנה אחרות

VirtIO כבר מספקת ממשק מוגדר היטב לרכיבים כמו Block Storage, רשת, מסוף, קלט, שקע ואנטרופיה. במערכות המשנה האלה, AAOS משתמש הנהג כפי שהוא, למשל virtio-blk, virtio-input, virtio-console ו-virtio-net.

בפלטפורמת העזר הווירטואלית של AAOS, יש תמיכה ב-Wi-Fi באמצעות mac80211_hwsim כדי להפעיל רשת אלחוטית של VirtWifi, שמשתמשת במנהרת virtio-net כדי לשלוח את התנועה ברשת למכונה הווירטואלית של המארח, שיש לה גישה ישירה לרשת ה-Wi-Fi עצמה.