สถาปัตยกรรม

การเปลี่ยนแปลงส่วนใหญ่ที่จำเป็นในการสนับสนุน VirtIO ใน AAOS เกี่ยวข้องกับการเปลี่ยนแปลงที่ระดับการใช้งาน HAL และด้านล่างในเคอร์เนล Android Common เฟรมเวิร์ก Android จะสื่อสารกับ HAL ทั่วไปที่ไม่เจาะจงฮาร์ดแวร์โดยใช้ไดรเวอร์ VirtIO ในเคอร์เนล VM ของผู้ใช้ AAOS ซึ่งจะสื่อสารกับอุปกรณ์ VirtIO ฝั่งโฮสต์โดยใช้โปรโตคอล VirtIO อุปกรณ์ VirtIO ฝั่งโฮสต์จะเข้าถึงฮาร์ดแวร์จริงได้โดยใช้ไดรเวอร์อุปกรณ์เฉพาะ SoC

การสื่อสารระหว่างไดรเวอร์ VirtIO กับอุปกรณ์ VirtIO เกิดขึ้นด้วย virtqueue ซึ่งเป็นบัฟเฟอร์แบบวงแหวนที่คล้ายกับ DMA ของรายการรวบรวมข้อมูลแบบกระจาย คุณสามารถใช้การขนส่งหลายประเภท เช่น MMIO หรือ PCI เพื่อแลกเปลี่ยนข้อความ VirtIO ระหว่าง VM ได้

ในบางกรณี vsock ได้รับการใช้ประโยชน์เพื่อการสื่อสารระหว่าง VM ระบบรองรับการสื่อสาร HAL ของยานพาหนะ การควบคุมเสียง และการสื่อสารสถานะการถ่ายโอนข้อมูลโดยใช้การเชื่อมต่อกับตัวแทนระดับเพียร์ใน VM แยกต่างหากผ่านอินเทอร์เฟซ vsock GRPC-vsock ใช้เพื่อเข้าถึงระบบย่อยที่ไม่เป็นไปตามมาตรฐานเหล่านี้ GRPC ในซอร์สโค้ด Android ได้รับการแก้ไขให้ทำงานร่วมกับ vsock ที่มีรูปแบบที่อยู่เป็น vsock:CID:PORT_NUMBER

สถาปัตยกรรมระบบเสมือนจริง
รูปที่ 1 สถาปัตยกรรมระบบเสมือนจริง

เสียง

ใน AAOS แบบเสมือนจริง VM ผู้ใช้ชั่วคราวของ Android สามารถใช้ virtio-snd เพื่อเข้าถึงเสียงได้ virtio-snd ให้บริการอุปกรณ์ PCM เสมือนจริงแก่ VM ของ Android เพื่อให้การติดตั้งใช้งาน 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 อื่นๆ ในการใช้งานอ้างอิง VM ผู้ใช้ชั่วคราว AAOS จะมีเดรัมเซิร์ฟเวอร์การควบคุมเสียงทำงานอยู่ ซึ่งใช้ GRPC-vsock เพื่อรับคําขอโฟกัสเสียงจาก VM อื่นๆ VM โฮสต์สามารถใช้ device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller เพื่อส่งคําขอการควบคุมเสียงไปยัง AAOS ขณะที่ libandroid_audio_controller โฟกัสเสียงอยู่ ระบบจะส่งการแจ้งเตือนไปยัง AAOS ต่อไปจนกว่าจะยกเลิกโฟกัส

สถาปัตยกรรมเสียง
รูปที่ 5 สถาปัตยกรรมเสียง

บลูทูธ

การติดตั้งใช้งานบลูทูธจะอิงตามการออกแบบที่แสดงด้านล่าง

สถาปัตยกรรมบลูทูธ
รูปที่ 5 สถาปัตยกรรมบลูทูธ

โปรไฟล์บลูทูธแฮนด์ฟรี

หากต้องการเปิดใช้โปรไฟล์แฮนด์ฟรี (HFP) ของบลูทูธใน trout เราได้ขยายข้อกำหนดของอุปกรณ์เสียง VirtIO เพื่อรองรับการควบคุมเสียง เมื่อใช้แนวทางนี้ อุปกรณ์เสียง VirtIO ฝั่งโฮสต์/ไฮเปอร์วิซอร์จะมีการควบคุมเสียง 3 รายการต่อไปนี้ที่เกี่ยวข้องกับ HFP

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

เมื่อ AAOS ทำงานเป็น VM ของผู้ใช้ AAOS จะใช้ TinyAlsa เพื่อตั้งค่าการควบคุมเสียงเหล่านี้ หากต้องการเปิดใช้ Use Case ของ HFP โฮสต์/ไฮเปอร์วิซอร์จะทำการกําหนดเส้นทางและการสอบเทียบที่เจาะจงผู้ให้บริการตามนั้น

การติดตั้งใช้งานบลูทูธจะอิงตามภาพการออกแบบด้านล่าง

สถาปัตยกรรมบลูทูธ
รูปที่ 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

โหมดโรงรถ

ดูข้อมูลเพิ่มเติมได้ที่โหมดโรงรถ

พร็อพเพอร์ตี้ AP_POWER_STATE_REQ ที่ส่งโดย HAL ของยานพาหนะจะทริกเกอร์โหมดโรงรถเข้าและออก ในโหมดการจำลองเสมือน โหมดโรงรถจะทริกเกอร์จากฝั่งโฮสต์ VM โฮสต์ควรเปิดอยู่เสมอเพื่อให้อุปกรณ์เสมือนสำหรับ VM ของ Android จนกว่า Android จะปิดลง เซิร์ฟเวอร์ VHAL ใน VM โฮสต์จะส่งสัญญาณปิดเครื่องไปยัง VM ของผู้เข้าร่วม AAOS เมื่อได้รับสัญญาณจากไคลเอ็นต์ VHAL แล้ว VM AAOS จะเข้าสู่โหมดโรงรถและเริ่มส่งสัญญาณชีพจรเพื่อให้ VM โฮสต์ทำงานอยู่เสมอ

ระบบดาวเทียมนำร่องทั่วโลก (GNSS)

ใน trout 1.0 มีการรองรับการจำลองเสมือน GNSS ผ่าน virtio-console การติดตั้งใช้งานรองรับการแลกเปลี่ยนการวัดผลดิบและการแก้ไขตำแหน่งจากโฮสต์ไปยังผู้มาเยือน

รูปแบบการแลกเปลี่ยนข้อมูลคือ CSV ที่แอป GnssLogger ใช้ ในการใช้งานอ้างอิง ระบบจะสร้างข้อมูลจำลองให้ใช้งานเนื่องจากไม่มีไดรเวอร์ GNSS เดิม แต่สามารถติดตั้งใช้งานไดรเวอร์เดิมได้โดยไม่ต้องทำการเปลี่ยนแปลงฝั่งผู้มาเยือน ตัวอย่างตัวแทนโฮสต์จำลองมีให้เป็นส่วนหนึ่งของซอร์สโค้ด trout

การใช้งานในปัจจุบันจะคาดหวังว่าสภาพแวดล้อมระบบปฏิบัติการโฮสต์จะจัดการการเริ่มต้น GNSS และ GNSS แบบเสริม (AGNSS)

สถาปัตยกรรม GNSS
รูปที่ 2 สถาปัตยกรรม GNSS

กราฟิก

เมื่อ AAOS ทำงานเป็น VM ผู้ใช้ร่วมกับระบบปฏิบัติการอื่นๆ ของยานยนต์ Android อาจไม่มีสิทธิ์เข้าถึง GPU หรือตัวควบคุมจอแสดงผลโดยตรง ในกรณีนี้ คุณสามารถใช้ Mesa หรือ goldfish-opengl และไดรเวอร์ virtio-gpu ใน VM ผู้ใช้ชั่วคราวของ Android และอุปกรณ์ virtio-gpu เพื่อเข้าถึง GPU

ใน VM ผู้ใช้ชั่วคราวของ Android นั้น Mesa หรือ goldfish-opengl จะเข้ารหัสคำสั่ง OpenGLES เป็นสตรีม Gallium หรือสตรีม GLES ที่สร้างขึ้นโดยอัตโนมัติตามลำดับ ระบบจะใช้virtio-gpu ไดรเวอร์เคอร์เนลเป็นสื่อกลาง ฝั่งโฮสต์ virglrenderer (สำหรับ Mesa) และ vulkan-cereal (สำหรับ goldfish-opengl) จะเล่นสตรีมคำสั่งที่ถอดรหัสแล้วซ้ำบนไดรเวอร์ GPU ที่มีอยู่ แพลตฟอร์มอ้างอิง AAOS trout รองรับ OpenGL ESเท่านั้นที่รองรับ Vulkan ซึ่งคาดว่าจะพร้อมใช้งานในรุ่นที่จะเปิดตัวในอนาคต

สถาปัตยกรรมกราฟิก
รูปที่ 3 สถาปัตยกรรมกราฟิก

เซ็นเซอร์

เมื่อ AAOS ทำงานเป็น VM ผู้ใช้ร่วมกับระบบปฏิบัติการอื่นๆ ของยานยนต์ Android อาจไม่มีสิทธิ์เข้าถึงเซ็นเซอร์โดยตรง ในกรณีนี้ ระบบจะใช้ไดรเวอร์ Virtio-SCMI ใน VM ผู้ใช้ Android และอุปกรณ์ VirtIO-SCMI ใน VM โฮสต์เพื่อเข้าถึงเซ็นเซอร์ แพลตฟอร์มการอ้างอิงการจำลองเสมือน AAOS มี HAL เซ็นเซอร์ทั่วไปที่ไม่ขึ้นอยู่กับฮาร์ดแวร์ ซึ่งสามารถใช้กับ SoC ที่ใช้ ARM เพื่อเข้าถึงเซ็นเซอร์ได้

HAL ของเซ็นเซอร์สื่อสารกับไดรเวอร์ IIO SCMI ในระบบย่อย IIO ของ Linux ซึ่งใช้โปรโตคอลการจัดการเซ็นเซอร์ SCMI ที่ได้จากข้อกำหนดของ ARM System Control and Management Interface (SCMI) เพื่อค้นหาและกำหนดค่าเซ็นเซอร์ อ่านข้อมูลเซ็นเซอร์ และรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงค่าเซ็นเซอร์

โปรแกรมควบคุม SCMI ของ IIO ใช้โปรแกรมควบคุม VirtIO SCMI ซึ่งใช้โปรโตคอลการรับส่ง VirtIO ตามที่ระบุไว้ในข้อกำหนด virtio-scmi เพื่อแลกเปลี่ยนข้อความ SCMI กับอุปกรณ์ VirtIO SCMI ใน VM โฮสต์ อุปกรณ์ VirtIO SCMI มีสิทธิ์เข้าถึงเซ็นเซอร์โดยตรงผ่านไดรเวอร์เซ็นเซอร์เฉพาะ SoC

สถาปัตยกรรมเซ็นเซอร์
รูปที่ 4 สถาปัตยกรรมเซ็นเซอร์

ตำแหน่ง Sensor HAL

การใช้งานอ้างอิงของ HAL เซ็นเซอร์ที่ใช้ VirtIO SCMI อยู่ที่ device/google/trout/hal/sensors

การกําหนดค่า Sensor HAL

Sensor HAL อาจต้องแก้ไขข้อมูลเซ็นเซอร์ที่ได้รับจาก 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 ยานพาหนะ

การติดตั้งใช้งาน HAL ยานพาหนะประกอบด้วย 2 ส่วน ได้แก่

  • ไคลเอ็นต์ ให้ 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 มีอินเทอร์เฟซที่ชัดเจนสำหรับคอมโพเนนต์ต่างๆ เช่น พื้นที่เก็บข้อมูลแบบบล็อก เครือข่าย คอนโซล อินพุต ซ็อกเก็ต และ Entropy อยู่แล้ว สำหรับระบบย่อยเหล่านี้ AAOS จะใช้ไดรเวอร์ตามที่เป็นอยู่ เช่น virtio-blk, virtio-input, virtio-console และ virtio-net

ในแพลตฟอร์มอ้างอิง AAOS แบบเสมือนจริง ระบบรองรับ Wi-Fi ด้วย mac80211_hwsim เพื่อเปิดใช้เครือข่ายไร้สาย VirtWifi ซึ่งจะใช้อุโมงค์ virtio-net เพื่อส่งการรับส่งข้อมูลเครือข่ายไปยัง VM โฮสต์ซึ่งมีสิทธิ์เข้าถึงเครือข่าย Wi-Fi จริงโดยตรง