การเปลี่ยนแปลงส่วนใหญ่ที่จำเป็นเพื่อรองรับ VirtIO ใน AAOS นั้นเกี่ยวข้องกับการเปลี่ยนแปลงในระดับการใช้งาน HAL และต่ำกว่าใน Android Common Kernel เฟรมเวิร์ก Android สื่อสารกับ HAL ที่ไม่เชื่อเรื่องพระเจ้าด้วยฮาร์ดแวร์ทั่วไปโดยใช้ไดรเวอร์ VirtIO ในเคอร์เนล AAOS guest VM ซึ่งสื่อสารกับอุปกรณ์ VirtIO บนฝั่งโฮสต์โดยใช้โปรโตคอล VirtIO อุปกรณ์ VirtIO บนฝั่งโฮสต์สามารถเข้าถึง HW จริงได้โดยใช้ไดรเวอร์อุปกรณ์เฉพาะ SoC
การสื่อสารระหว่างไดรเวอร์ VirtIO และอุปกรณ์ VirtIO เกิดขึ้นกับ virtqueue
ซึ่งเป็นบัฟเฟอร์วงแหวนคล้าย DMA ของรายการรวบรวมกระจาย การขนส่งหลายอย่าง เช่น MMIO หรือ PCI สามารถใช้เพื่อแลกเปลี่ยนข้อความ VirtIO ระหว่าง VM
ในบางกรณี vsock
ได้รับการยกระดับสำหรับการสื่อสารระหว่าง VM รองรับการสื่อสาร Vehicle HAL, การควบคุมเสียง และ Dumpstate โดยใช้การเชื่อมต่อกับเอเจนต์เพียร์บน VM ที่แยกต่างหากผ่านอินเทอร์เฟ vsock
GRPC-vsock
ใช้เพื่อเข้าถึงระบบย่อยที่ไม่ได้มาตรฐานเหล่านี้ GRPC ในแผนผังแหล่งที่มาของ Android ได้รับการแก้ไขให้ทำงานกับ vsock
ด้วยรูปแบบที่อยู่ของ vsock:CID:PORT_NUMBER
เสียง
ใน AAOS เสมือนจริงนั้น Guest 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 จะแจ้งเตือนแอปที่กำลังเล่นเพลงให้ปิดเสียงในสถานการณ์นี้ ในระบบเสมือนจริง เสียงอาจมาจาก VM อื่นๆ ในการใช้งานอ้างอิง AAOS guest VM มี daemon เซิร์ฟเวอร์ควบคุมเสียงทำงานอยู่ ซึ่งใช้ GRPC-vsock
เพื่อรับคำขอโฟกัสเสียงจาก VM อื่นๆ โฮสต์ VM สามารถใช้ device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller
เพื่อส่งคำขอควบคุมเสียงไปยัง AAOS แม้ว่า libandroid_audio_controller
จะเก็บโฟกัสของเสียงไว้ แต่ก็ยังคงส่งฮาร์ตบีตไปยัง AAOS ต่อไปจนกว่าจะปล่อยโฟกัส
บลูทู ธ
การใช้งาน Bluetooth ขึ้นอยู่กับการออกแบบที่แสดงด้านล่าง
โปรไฟล์แฮนด์ฟรี Bluetooth
หากต้องการเปิดใช้งาน Bluetooth Hands-Free Profile (HFP) บน trout
ข้อมูลจำเพาะของอุปกรณ์เสียง VirtIO ได้รับการขยายเพื่อรองรับการควบคุมเสียง เมื่อใช้วิธีการนี้ อุปกรณ์เสียง VirtIO บนฝั่งโฮสต์/ไฮเปอร์ไวเซอร์จะมีการควบคุมเสียงสามแบบที่เกี่ยวข้องกับ HFP:
-
hfp_enable
-
hfp_set_sampling_rate
-
hfp_volume
เมื่อ AAOS ทำงานในฐานะ Guest VM AAOS จะใช้ TinyAlsa เพื่อตั้งค่าการควบคุมเสียงเหล่านี้ หากต้องการเปิดใช้งานกรณีการใช้งาน HFP โฮสต์/ไฮเปอร์ไวเซอร์จะดำเนินการกำหนดเส้นทางและการสอบเทียบเฉพาะผู้จำหน่ายตามลำดับ
การใช้งาน Bluetooth ขึ้นอยู่กับภาพประกอบการออกแบบด้านล่าง
ทิ้งขยะ
เมื่อสร้างรายงานข้อบกพร่องสำหรับ AAOS เสมือนจริง การรวมข้อมูลโฮสต์ VM ไว้ด้วยเพื่อให้นักพัฒนามีมุมมองระบบที่ครอบคลุมมากขึ้น เพื่อให้บรรลุผลนี้ การใช้งานอ้างอิง trout
จะใช้ IDumpstateDevice
HAL ซึ่งจะรวบรวมข้อมูล VM ของโฮสต์ผ่าน 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 ใหม่ไปยังเซิร์ฟเวอร์ dumpstate เมื่อเปิดใช้งาน ตัวอย่างเช่น:
--config_file my_config.xml
ระบบขยายมุมมอง (EVS)
Extended View System (EVS) ใช้เพื่อแสดงวิดีโอที่ถ่ายโดยกล้องมองหลังและกล้องมองภาพรอบทิศทาง ใน AAOS เสมือนจริง EVS Stack สามารถเข้าถึงสตรีมวิดีโอจากอุปกรณ์สตรีมมิ่ง V4L2 เสมือนจริงที่ใช้ไดรเวอร์วิดีโอ VirtIO
โหมดโรงรถ
สำหรับข้อมูลเพิ่มเติม โปรดดู โหมดโรงรถ
การเข้าและออกจากโหมดโรงรถจะถูกกระตุ้นโดยคุณสมบัติ AP_POWER_STATE_REQ
ที่ส่งโดย HAL ของยานพาหนะ ในโหมดการจำลองเสมือน โหมดโรงรถจะถูกทริกเกอร์จากฝั่งโฮสต์ โฮสต์ VM ควรเปิดอยู่เพื่อจัดเตรียมอุปกรณ์เสมือนสำหรับ Android VM จนกว่า Android จะถูกปิด เซิร์ฟเวอร์ VHAL บนโฮสต์ VM จะส่งสัญญาณการปิดระบบไปยัง AAOS guest VM เมื่อได้รับไคลเอ็นต์สัญญาณ VHAL แล้ว AAOS VM จะเข้าสู่โหมดโรงรถและเริ่มส่งสัญญาณฮาร์ทบีทเพื่อให้โฮสต์ VM ทำงานต่อไป
ระบบดาวเทียมนำทางทั่วโลก (GNSS)
ใน trout
1.0 มีการเพิ่มการรองรับการจำลองเสมือน GNSS บน virtio-console
การใช้งานสนับสนุนการแลกเปลี่ยนการวัดแบบดิบและการแก้ไขตำแหน่งจากโฮสต์ไปยังแขก
รูปแบบการแลกเปลี่ยนข้อมูลคือ CSV ที่ใช้โดยแอป GnssLogger ในการใช้งานอ้างอิง เนื่องจากไดรเวอร์ GNSS ดั้งเดิมไม่พร้อมใช้งาน ข้อมูลจำลองจึงพร้อมใช้งาน แต่ไดรเวอร์ดั้งเดิมสามารถนำไปใช้ได้โดยไม่ต้องเปลี่ยนแปลงฝั่งแขก ตัวอย่างตัวแทนโฮสต์จำลองมีให้โดยเป็นส่วนหนึ่งของซอร์สโค้ด trout
การใช้งานปัจจุบันคาดว่าการกำหนดค่าเริ่มต้น GNSS และ Assisted GNSS (AGNSS) จะได้รับการจัดการโดยสภาพแวดล้อมระบบปฏิบัติการโฮสต์
กราฟิก
เมื่อ AAOS ทำงานเป็น Guest VM ควบคู่ไปกับระบบปฏิบัติการยานยนต์อื่นๆ Android อาจไม่สามารถเข้าถึง GPU หรือตัวควบคุมการแสดงผลได้โดยตรง ในกรณีนี้ สามารถใช้ Mesa หรือ goldfish-opengl
และไดรเวอร์ virtio-gpu
บน guest VM ของ Android และอุปกรณ์ virtio-gpu
เพื่อเข้าถึง GPU ได้
บน Guest VM ของ Android, Mesa หรือ goldfish-opengl
จะเข้ารหัสคำสั่ง OpenGLES ลงในสตรีม Gallium หรือสตรีม GLES ที่สร้างขึ้นอัตโนมัติตามลำดับ ไดรเวอร์เคอร์เนล virtio-gpu
ถูกใช้เป็นการขนส่ง ที่ฝั่งโฮสต์ virglrenderer
(สำหรับ Mesa) และ vulkan-cereal
(สำหรับ goldfish-opengl
) เล่นซ้ำสตรีมคำสั่งที่ถอดรหัสแล้วที่ด้านบนของไดรเวอร์ GPU ที่มีอยู่ trout
แพลตฟอร์มอ้างอิง AAOS รองรับ OpenGL ES เท่านั้น พร้อมรองรับ Vulkan ซึ่งคาดว่าจะเปิดตัวในอนาคต
เซนเซอร์
เมื่อ AAOS ทำงานเป็น Guest VM ควบคู่ไปกับระบบปฏิบัติการยานยนต์อื่นๆ Android อาจไม่สามารถเข้าถึงเซ็นเซอร์ได้โดยตรง ในกรณีนี้ ไดรเวอร์ Virtio-SCMI บน Guest VM ของ Android และอุปกรณ์ VirtIO-SCMI บน Host VM จะถูกใช้เพื่อเข้าถึงเซ็นเซอร์ แพลตฟอร์มอ้างอิงการจำลองเสมือน AAOS มี HAL เซ็นเซอร์แบบทั่วไปและ HW-agnostic ที่สามารถใช้สำหรับ SoC ที่ใช้ 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 อาจจำเป็นต้องแก้ไขข้อมูลเซ็นเซอร์ที่ได้รับจาก Host VM เพื่อให้สอดคล้องกับระบบพิกัดเซ็นเซอร์รถยนต์ Android สคีมาสำหรับการกำหนดค่าเซ็นเซอร์สามารถพบได้ใน 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 ที่ใช้โดย Android ใน 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 จริงได้โดยตรง