Cấu trúc

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

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

Trong một số trường hợp, vsock được dùng để giao tiếp giữa các VM. HAL (VHAL) của xe, chế độ Kiểm soát âm thanh và các hoạt động giao tiếp Dumpstate được hỗ trợ bằng cách kết nối với một tác nhân ngang hàng trên một VM riêng biệt thông qua giao diện vsock. gRPC qua vsock được dùng để truy cập vào các hệ thống con không được chuẩn hoá này. gRPC trong cây nguồn Android được sửa đổi để hoạt động với vsock có định dạng địa chỉ là vsock:CID:PORT_NUMBER.

Cấu trúc ảo hoá

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

Âm thanh

Trong AAOS ảo hoá, VM khách Android có thể sử dụng virtio-snd để truy cập vào âm thanh. virtio-snd cung cấp các thiết bị PCM ảo cho VM Android để quá trình triển khai HAL â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 tại /device/google/trout/hal/audio/6.0. Các OEM có thể sửa đổi ro.vendor.trout.audiohal.{in,out}_period_{ms,count} cho nền tảng của họ. OEM cũng có thể 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 đ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 đang phát trong nền có thể cần phải tắt tiếng. HAL điều khiển âm thanh sẽ thông báo cho những ứng dụng đang phát nhạc biết rằng cần tắt tiếng trong trường hợp này. Trong hệ thống ảo hoá, âm thanh có thể đến từ các VM khác. Trong quá trình triển khai tham chiếu, VM khách AAOS có một trình nền máy chủ điều khiển âm thanh đang chạy, sử dụng gRPC qua vsock để nhận các yêu cầu về quyền phát âm thanh từ các VM khác. VM lưu trữ có thể 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, ứng dụng này sẽ tiếp tục gửi tín hiệu nhịp tim đến AAOS cho đến khi quyền phát âm thanh được giải phóng.

Cấu trúc âm thanh

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

Bluetooth

Việc triển khai Bluetooth được minh hoạ trong hình sau:

Cấu trúc Bluetooth

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

Cấu hình Bluetooth rảnh tay

Để bật Cấu hình rảnh tay (HFP) Bluetooth trên trout, thông số kỹ thuật của thiết bị âm thanh VirtIO đã được mở rộng để hỗ trợ các chế độ điều khiển âm thanh. Bằng cách sử dụng phương pháp này, thiết bị âm thanh VirtIO ở phía máy chủ lưu trữ/trình điều khiển ảo hoá sẽ cung cấp 3 chế độ điều khiển âm thanh liên quan đến HFP:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

Khi chạy dưới dạng một VM khách, AAOS sẽ dùng TinyALSA để thiết lập các chế độ điều khiển âm thanh này. Để bật trường hợp sử dụng HFP, máy chủ/hypervisor sẽ thực hiện việc định tuyến và hiệu chỉnh theo 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ế sau:

Cấu trúc Bluetooth

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

Dumpstate

Khi tạo báo cáo lỗi cho AAOS ảo hoá, bạn nên thêm thông tin về máy ảo lưu trữ để nhà phát triển có thể nắm được thông tin toàn diện hơn về hệ thống. Để thực hiện việc này, quá trình triển khai tham chiếu trout sẽ triển khai HAL IDumpstateDevice, thu thập thông tin về máy ảo lưu trữ thông qua gRPC qua vsock. Thông tin về VM máy chủ được đóng gói tar có tên là 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 các lệnh cần thực thi:

  1. Sao chép thông tin cấu hình từ tệp sau 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 tầm nhìn mở rộng

Hệ thống chế độ xem mở rộng (EVS) hiển thị video do camera quan sát phía sau và camera quan sát toàn cảnh ghi lại. Trong AAOS ả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 ảo hoá bằng trình điều khiển VirtIO-video.

Chế độ gara

Việc vào và thoát Chế độ nhà để xe được kích hoạt bằng các thuộc tính AP_POWER_STATE_REQ do VHAL gửi. Ở chế độ ảo hoá, chế độ Garage sẽ được kích hoạt từ phía máy chủ lưu trữ. Máy ảo lưu trữ phải luôn bật để cung cấp các thiết bị ảo cho máy ảo Android cho đến khi Android tắt. Máy chủ VHAL trên máy ảo lưu trữ sẽ gửi tín hiệu tắt đến máy ảo khách AAOS. Khi nhận được tín hiệu VHAL, máy ảo AAOS sẽ chuyển sang Chế độ nhà để xe và bắt đầu gửi tín hiệu nhịp tim để duy trì trạng thái hoạt động của máy ảo lưu trữ. Để biết thêm thông tin, hãy xem phần Chế độ nhà xe.

Hệ thống vệ tinh định vị toàn cầu (GNSS)

Trong trout 1.0, chúng tôi có hỗ trợ ảo hoá GNSS qua virtio-console. Việc triển khai này hỗ trợ trao đổi các phép đo thô và thông tin vị trí chính xác từ máy chủ đến máy khách.

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

Việc triển khai này yêu cầu môi trường hệ điều hành lưu trữ xử lý quá trình khởi động GNSS và GNSS được hỗ trợ (AGNSS).

Cấu trúc GNSS

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

Đồ hoạ

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

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

Cấu trúc đồ hoạ

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

Cảm biến

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

Sensor HAL giao tiếp với trình điều khiển IIO SCMI trong hệ thống con IIO của Nhân Linux. Hệ thống này sử dụng Giao thức quản lý cảm biến SCMI do thông số kỹ thuật Giao diện quản lý và kiểm soát hệ thống (SCMI) của ARM cung cấp để 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ác thay đổi giá trị cảm biến.

Trình điều khiển IIO SCMI sử dụng trình điều khiển VirtIO SCMI, sử dụng giao thức truyền tải VirtIO trong quy cách virtio-scmi để trao đổi thông báo SCMI với thiết bị VirtIO SCMI trên máy ảo lưu trữ. Thiết bị VirtIO 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 7. Cấu trúc cảm biến.

Vị trí HAL cảm biến

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

Cấu hình HAL cảm biến

HAL cảm biến có thể cần sửa đổi dữ liệu cảm biến nhận được từ VM lưu trữ để tuân thủ hệ toạ độ cảm biến ô tô Android. 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.

Các 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 và sao chép tệp tại /odm/etc/sensors/ hoặc /vendor/etc/sensors/. Cấu hình cảm biến được cung cấp trong ví dụ sau:

<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 của phương tiện

Việc triển khai HAL của phương tiện (VHAL) bao gồm 2 thành phần:

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

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

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

VirtIO đã cung cấp một giao diện được xác định rõ cho các thành phần như Bộ nhớ khối, Mạng, Bảng điều khiển, Đầu vào, Ổ cắm 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 hỗ trợ bằng mac80211_hwsim để 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 VM lưu trữ có quyền truy cập trực tiếp vào mạng Wi-Fi thực tế.