Cấu trúc

Hầu hết những thay đổi cần thiết để hỗ trợ VirtIO trong AAOS đều liên quan đến những thay đổi ở HAL cấp triển khai trở xuống trong Hạt nhân chung của Android. Khung Android giao tiếp với HAL (Lớp trừu tượng phần cứng) chung không phụ thuộc vào phần cứng bằng trình điều khiển VirtIO trong máy khách AAOS Nhân máy ảo, giao tiếp với các thiết bị VirtIO ở phía máy chủ bằng các giao thức VirtIO. Các thiết bị VirtIO ở phía máy chủ có thể truy cập vào phần cứng thực tế bằng cách sử dụng trình điều khiển thiết bị dành riêng cho SoC.

Hoạt động giao tiếp giữa trình điều khiển VirtIO và thiết bị VirtIO diễn ra thông qua virtqueue là vùng đệm vòng giống như DMA của các danh sách thu thập tán xạ. Một số phương thức vận chuyển, chẳng hạn như MMIO hoặc PCI có thể được dùng để trao đổi thông báo VirtIO giữa các máy ảo.

Trong một số trường hợp, vsock đã được tận dụng để giao tiếp liên máy ảo. Các giao tiếp HAL (Lớp trừu tượng phần cứng) cho xe, Điều khiển âm thanh và Dumpstate được hỗ trợ thông qua một kết nối với một tác nhân ngang hàng trên một máy ảo riêng biệt qua giao diện vsock. GRPC-vsock được dùng để truy cập vào các hệ thống con chưa được chuẩn hoá này. GRPC trong cây nguồn Android đã được sửa đổi để hoạt động với vsock kèm theo địa chỉ vsock:CID:PORT_NUMBER.

Cấu trúc ảo hoá
Hình 1. Kiến trúc ảo hoá

Âm thanh

Trong AAOS được ảo hoá, máy ảo khách Android có thể dùng virtio-snd để truy cập vào âm thanh. virtio-snd cung cấp các thiết bị PCM được ảo hoá cho máy ảo Android để Việc triển khai lớp trừu tượng phần cứng (HAL) cho âm thanh có thể tương tác với các thiết bị âm thanh ảo bằng Thư viện TinyALSA.

Phương thức triển khai HAL âm thanh mặc định nằm trong AOSP (Dự án nguồn mở Android) tại /device/google/trout/hal/audio/6.0. OEM có thể sửa đổi ro.vendor.trout.audiohal.{in,out}_period_{ms,count} cho nền tảng của họ. OEM (Nhà sản xuất thiết bị gốc) có thể cũng triển khai HAL âm thanh của riêng mình bằng cách ghi đè các biến liên quan đến âm thanh trong /device/google/trout/aosp_trout_common.mk.

HAL (Lớp trừu tượng phần cứng) điều khiển âm thanh quản lý quyền phát âm thanh trong AAOS. Ví dụ: khi hệ thống đang phát âm thanh khẩn cấp, nhạc phát trong nền có thể cần phải tắt tiếng. HAL (Lớp trừu tượng phần cứng) cho chế độ điều khiển âm thanh thông báo cho các ứng dụng đang phát nhạc để tắt tiếng trong trường hợp này. Trong hệ thống ảo, âm thanh có thể phát ra từ các máy ảo khác. Trong quá trình triển khai tham chiếu, máy ảo khách AAOS có trình nền máy chủ điều khiển âm thanh đang chạy. Trình nền này sử dụng GRPC-vsock để nhận yêu cầu quyền phát âm thanh từ các máy ảo khác. Máy ảo lưu trữ có thể sử dụng device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller để gửi yêu cầu điều khiển âm thanh đến AAOS. Trong khi libandroid_audio_controller giữ quyền phát âm thanh sẽ tiếp tục gửi nhịp tim đến AAOS cho đến khi tiêu điểm được nhả ra.

Cấu trúc âm thanh
Hình 5. Cấu trúc âm thanh

Bluetooth

Việc triển khai Bluetooth dựa trên thiết kế minh hoạ dưới đây.

Cấu trúc Bluetooth
Hình 5. Cấu trúc Bluetooth

Cấu hình rảnh tay Bluetooth

Để bật Cấu hình rảnh tay Bluetooth (HFP) trên trout, thiết bị âm thanh VirtIO đã được mở rộng quy cách để hỗ trợ kiểm soát âm thanh. Sử dụng phương pháp này, âm thanh VirtIO thiết bị ở phía máy chủ/trình điều khiển ảo hoá cung cấp ba tính năng điều khiển âm thanh sau đây liên quan đến HFP:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Khi AAOS chạy với tư cách máy ảo khách, AAOS sẽ sử dụng TinyAlsa để thiết lập các chế độ điều khiển âm thanh này. Để bật HFP trường hợp sử dụng của mình, máy chủ lưu trữ/trình điều khiển ảo hoá sẽ thực hiện việc định tuyến và hiệu chỉnh theo từng nhà cung cấp cho phù hợp.

Việc triển khai Bluetooth dựa trên hình minh hoạ thiết kế bên dưới.

Cấu trúc Bluetooth
Hình 5. Cấu trúc Bluetooth

Kết xuất

Khi tạo báo cáo lỗi cho AAOS được ảo hoá, bạn nên cung cấp thông tin về máy ảo lưu trữ để nhà phát triển có cái nhìn toàn diện hơn về hệ thống. Để thực hiện điều này, Phương thức triển khai tham chiếu trout triển khai HAL IDumpstateDevice thu thập thông tin máy ảo lưu trữ thông qua GRPC-vsock. Máy ảo lưu trữ đóng gói "tar" có tên dumpstate_board.bin trong báo cáo lỗi trong khi nhật ký kết xuất nằm ở dumpstate_board.txt

Cách định cấu hình lệnh để thực thi:

  1. Sao chép thông tin cấu hình từ tệp bên dưới vào một tệp XML, ví dụ: 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. Truyền đường dẫn của tệp XML mới đến máy chủ dumpstate khi khởi chạy. Ví dụ:
    --config_file my_config.xml
    

Hệ thống Xem mở rộng (EVS)

Hệ thống Quan sát mở rộng (EVS) dùng để hiển thị video được quay bằng kính chiếu hậu và camera có góc nhìn bao quanh. Trong AAOS được ảo hoá, ngăn xếp EVS có thể truy cập vào luồng video từ thiết bị phát trực tuyến V4L2 được ảo hoá sử dụng trình điều khiển video VirtIO.

Chế độ nhà để xe

Để biết thêm thông tin, hãy xem Chế độ nhà xe.

Các tài sản AP_POWER_STATE_REQ kích hoạt việc vào và thoát khỏi Chế độ nhà xe do HAL của xe gửi. Trong chế độ ảo hoá, chế độ Nhà để xe được kích hoạt từ phía máy chủ. Máy ảo lưu trữ phải luôn bật để cung cấp thiết bị ảo cho máy ảo Android cho đến khi Android đã tắt nguồn. Máy chủ VHAL trên máy chủ ảo gửi tín hiệu tắt đến máy ảo khách AAOS. Khi nhận được ứng dụng VHAL tín hiệu, máy ảo AAOS sẽ chuyển sang chế độ Garage và bắt đầu gửi nhịp tim để duy trì hoạt động của máy ảo lưu trữ.

Hệ thống vệ tinh dẫn đường toàn cầu (GNSS)

Trong trout 1.0, việc hỗ trợ ảo hoá GNSS qua virtio-console đã đã được thêm. Việc triển khai hỗ trợ việc trao đổi dữ liệu đo lường thô và bản sửa lỗi vị trí từ từ máy chủ đến khách.

Định dạng trao đổi dữ liệu là CSV mà ứng dụng GnssLogger sử dụng. Trong quá trình triển khai tham chiếu, vì không có trình điều khiển GNSS gốc, nên dữ liệu mô phỏng được cung cấp nhưng phải là trình điều khiển gốc có thể được triển khai mà không cần bất kỳ thay đổi phía máy khách nào. Một tác nhân lưu trữ mô phỏng được cung cấp như một phần của mã nguồn trout.

Quy trình triển khai hiện tại dự kiến sẽ xử lý quy trình khởi chạy GNSS và GNSS được hỗ trợ (AGNSS) theo môi trường hệ điều hành máy chủ.

Kiến trúc GNSS
Hình 2. Kiến trúc GNSS

Đồ hoạ

Khi AAOS chạy dưới dạng máy ảo khách cùng với các hệ điều hành ô tô khác, Android có thể không có quyền truy cập trực tiếp vào GPU hoặc bộ điều khiển hiển thị. Trong trường hợp này, Mesa hoặc goldfish-opengl và một trình điều khiển virtio-gpu trên máy ảo khách Android và thiết bị virtio-gpu có thể dùng để truy cập vào GPU.

Trên máy ảo dành cho khách của Android, Mesa hoặc goldfish-opengl sẽ mã hoá các lệnh OpenGLES theo một trong hai cách sau: tương ứng với luồng Gali hoặc luồng GLES được tạo tự động. virtio-gpu trình điều khiển nhân được dùng làm công cụ truyền tải. Ở phía máy chủ, virglrenderer (dành cho Mesa) và vulkan-cereal (cho goldfish-opengl) phát lại luồng lệnh đã giải mã trên phía trên cùng của trình điều khiển GPU hiện có. Nền tảng tham chiếu AAOS trout hỗ trợ OpenGL ES chỉ có hỗ trợ Vulkan, dự kiến có trong bản phát hành sau này.

Cấu trúc đồ hoạ
Hình 3. Cấu trúc đồ hoạ

Cảm biến

Khi AAOS chạy dưới dạng máy ảo khách cùng với các hệ điều hành ô tô khác, Android có thể không có quyền truy cập trực tiếp vào cảm biến. Trong trường hợp này, trình điều khiển Virtio-SCMI trên Máy ảo Android khách và thiết bị VirtIO-SCMI trên Máy chủ ảo được dùng để truy cập vào các cảm biến. Nền tảng tham chiếu ảo hoá AAOS cung cấp HAL Cảm biến chung và không phụ thuộc vào HW có thể được sử dụng cho các SoC dựa trên ARM truy cập cảm biến.

HAL cảm biến giao tiếp với trình điều khiển SCMI IIO trong hệ thống phụ Linux Kernel IIO, sử dụng Giao thức quản lý cảm biến SCMI do Hàm ARM Giao diện quản lý và điều khiển hệ thống (SCMI) thông số kỹ thuật để khám phá và định cấu hình cảm biến, đọc dữ liệu cảm biến và nhận thông báo về cảm biến các thay đổi về giá trị.

Trình điều khiển IIO SCMI sử dụng Trình điều khiển VirtIO SCMI, trình điều khiển này sử dụng công cụ truyền tải VirtIO như được chỉ định trong virtio-scmi để trao đổi thông báo SCMI với thiết bị VirtIO SCMI trên máy ảo chủ. VirtIO Thiết bị SCMI có quyền truy cập trực tiếp vào các cảm biến thông qua trình điều khiển cảm biến dành riêng cho SoC.

Cấu trúc cảm biến
Hình 4. Cấu trúc cảm biến

Vị trí HAL của cảm biến

Việc triển khai tham chiếu của cảm biến HAL, sử dụng VirtIO SCMI, được đặt tại device/google/trout/hal/sensors.

Cấu hình lớp trừu tượng phần cứng (HAL) của cảm biến

HAL của cảm biến có thể cần phải sửa đổi dữ liệu cảm biến nhận được từ máy chủ ảo để tuân thủ Hệ thống toạ độ cảm biến Android trên ô tô. Bạn có thể tìm thấy giản đồ cho cấu hình cảm biến trong device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd.

OEM có thể cung cấp cấu hình cảm biến, chẳng hạn như hướng và vị trí, trong sensor_hal_configuration.xml rồi sao chép tệp tại một trong hai /odm/etc/sensors/ hoặc /vendor/etc/sensors/. Dưới đây là cấu hình cảm biến mẫu:

<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>

Lớp trừu tượng phần cứng (HAL) cho xe

Quy trình triển khai lớp trừu tượng phần cứng (HAL) cho xe bao gồm hai phần:

  • Khách hàng. Cung cấp các API mà Android sử dụng trong AAOS được ảo hoá
  • Máy chủ. Giao tiếp trực tiếp với thiết bị phần cứng, chẳng hạn như xe buýt (hoặc trình mô phỏng).

Trong quá trình ảo hoá, máy chủ VHAL chạy trên máy ảo lưu trữ. Máy khách và máy chủ VHAL đến hết GRPC-vsock (để biết thêm thông tin, hãy xem device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto). OEM có thể sử dụng giao thức truyền tải khác với GRPC bằng cách ghi đè các API giao tiếp. Ví dụ: xem device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp.

Các hệ thống con khác

VirtIO đã cung cấp giao diện được xác định rõ ràng cho các thành phần như Bộ nhớ khối, Network (Mạng), Console (Bảng điều khiển), Input (Đầu vào), Socket và Entropy. Đối với các hệ thống con này, AAOS sử dụng trình điều khiển nguyên trạng, chẳng hạn như virtio-blk, virtio-input, virtio-consolevirtio-net.

Trong nền tảng tham chiếu AAOS được ảo hoá, Wi-Fi được mac80211_hwsim hỗ trợ để bật mạng không dây VirtWifi, sau đó sử dụng đường hầm virtio-net để gửi lưu lượng truy cập mạng đến máy chủ ảo (VM) này có quyền truy cập trực tiếp vào mạng Wi-Fi thực tế.