אדריכלות

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

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

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

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

שֶׁמַע

ב-AAOS וירטואלי, ה-VM האורח של Android יכול להשתמש virtio-snd כדי לגשת לאודיו. virtio-snd מספקת את מכשירי ה-PCM הווירטואליים ל-Android VM כך שהטמעת השמע HAL יכולה לקיים אינטראקציה עם מכשירי הסאונד הווירטואליים עם ספריית TinyALSA.

יישום ברירת המחדל של אודיו HAL נמצא ב-AOSP בכתובת /device/google/trout/hal/audio/6.0 . יצרני OEM יכולים לשנות את ro.vendor.trout.audiohal.{in,out}_period_{ms,count} עבור הפלטפורמה שלהם. יצרני OEM יכולים גם ליישם HAL אודיו משלהם על ידי דריסת המשתנים הקשורים לאודיו ב- /device/google/trout/aosp_trout_common.mk.

בקרת השמע HAL מנהלת את מיקוד השמע ב-AAOS. לדוגמה, כאשר המערכת משמיעה צלילי חירום, ייתכן שיהיה צורך להשתיק את המוזיקה המתנגנת ברקע. בקרת האודיו HAL מודיעה לאותם אפליקציות שמנגנות מוזיקה להשתיק במצב זה. במערכת הווירטואלית, הצלילים יכולים להגיע מ-VMs אחרים. ביישום ההתייחסות, ל-VM האורח של AAOS פועל דמון שרת בקרת שמע, המשתמש ב- GRPC-vsock כדי לקבל בקשות מיקוד שמע מ-VMs אחרים. ה-VM המארח יכול להשתמש device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller כדי לשלוח בקשות לשליטה בשמע ל-AAOS. בעוד libandroid_audio_controller מחזיק את מיקוד האודיו, הוא ממשיך לשלוח פעימות לב ל-AAOS עד לשחרור המיקוד.

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

בלוטות

יישום ה-Bluetooth מבוסס על העיצוב המוצג להלן.

ארכיטקטורת בלוטות'
איור 5. ארכיטקטורת בלוטות'

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

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

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

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

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

ארכיטקטורת בלוטות'
איור 5. ארכיטקטורת בלוטות'

מדינת אשפה

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

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

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

מצב מוסך

למידע נוסף, ראה מצב מוסך .

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

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

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

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

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

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

גרָפִיקָה

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

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

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

חיישנים

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

חיישן HAL מתקשר עם מנהל ההתקן של IIO SCMI בתת-מערכת Linux Kernel IIO, המשתמשת בפרוטוקול ניהול חיישנים SCMI המסופק על ידי מפרט 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 המארח כך שיתאימו למערכת הקואורדינטות של חיישני אנדרואיד לרכב. את הסכימה לתצורת חיישנים ניתן למצוא ב- 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

היישום של Vehicle HAL מורכב משני מרכיבים:

  • לָקוּחַ. מספק ממשקי API המשמשים את אנדרואיד ב-AAOS וירטואלי
  • שרת. מתקשר ישירות עם החומרה, כגון אוטובוסים לרכב (או אמולטור).

בווירטואליזציה, שרת VHAL פועל על ה-VM המארח. לקוח ושרת VHAL מתקשרים באמצעות GRPC-vsock (למידע נוסף, ראה device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). יצרני OEM יכולים להשתמש בפרוטוקול תעבורה שונה מלבד GRPC על ידי עקיפה של ממשקי ה-API של התקשורת. לדוגמאות, ראה 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, Wi-Fi נתמך עם mac80211_hwsim כדי לאפשר רשת אלחוטית VirtWifi , אשר לאחר מכן משתמשת במנהרת virtio-net כדי לשלוח את תעבורת הרשת ל-VM המארח, שיש לו גישה ישירה לרשת ה-Wi-Fi בפועל.