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