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 dữ liệu, chẳng hạn như MMIO hoặc PCI để 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 để liên lạc giữa các VM.
Thông tin liên lạc của HAL xe, Audio Control và 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-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.
Â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 để việc 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-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.
Bluetooth
Việc triển khai Bluetooth dựa trên thiết kế minh hoạ bên dưới.
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 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_enablehfp_set_sampling_ratehfp_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ế bên dưới.
Dumpstate
Khi tạo báo cáo lỗi cho AAOS được ảo hoá, bạn nên thêm 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 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 máy ảo lưu trữ thông qua GRPC-vsock. Thông tin về máy ảo lưu trữ được đóng gói bằng "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:
- Sao chép thông tin chi tiết về cấu hình từ tệp bên dưới vào một tệp XML, chẳng hạn như
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> - 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
Extended View System (EVS)
Hệ thống chế độ xem mở rộng (EVS) được dùng để 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ế độ nhà để xe
Để biết thêm thông tin, hãy xem phần Chế độ nhà để xe.
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 HAL của xe 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 từ ứng dụng VHAL, VM 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 VM máy chủ.
Hệ thống vệ tinh định vị toàn cầu (GNSS)
Trong trout 1.0, chúng tôi đã thêm tính năng 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í từ máy chủ lưu trữ sang 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ì trình điều khiển GNSS gốc không có sẵn, nên dữ liệu mô phỏng sẽ được cung cấp nhưng 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 hiện tại dự kiến sẽ xử lý quá trình khởi động GNSS và GNSS hỗ trợ (AGNSS) bằng môi trường hệ điều hành máy chủ.
Đồ 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ể dù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 để truy cập vào GPU.
Trên máy ảo khách Android, Mesa hoặc goldfish-opengl mã hoá các lệnh OpenGLES thành luồng Gallium hoặc 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 và dự kiến sẽ hỗ trợ Vulkan trong một bản phát hành sắp tới.
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, trình điều khiển Virtio-SCMI trên VM khách Android và thiết bị VirtIO-SCMI trên VM lưu trữ đượ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 một Sensor HAL chung và không phụ thuộc vào phần cứng. Bạn có thể dùng nền tảng này cho SoC dựa trên ARM để truy cập vào các cảm biến.
HAL cảm biến 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à được 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 như được chỉ định trong thông số kỹ thuật 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.
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/.
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>
HAL của phương tiện
Việc triển khai HAL của Xe bao gồm hai 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 sẽ chạy trên VM lưu trữ. Máy chủ và ứng dụng VHAL giao tiếp thông qua GRPC-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-console và virtio-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ế.