Trang này mô tả cách kết nối hai thiết bị ngoại vi (Bluetooth và Wi-Fi) với trình mô phỏng AAOS. Trong quá trình này, ba lĩnh vực cụ thể để hỗ trợ người lái xe là chính:
- Nhân khách
- Khách Android
- Máy chủ Linux
Trước tiên, bạn biên dịch và kích hoạt các trình điều khiển USB có liên quan trong nhân Khách. Tiếp theo, Guest Android phải chọn HAL và dịch vụ phù hợp để hiển thị trình điều khiển. Cuối cùng, máy chủ Linux phải có quyền truy cập vào trình điều khiển USB rồi chuyển nó sang QEMU .
Dongles đã được thử nghiệm
Các dongle sau đã được thử nghiệm:
- Bộ chuyển đổi USB ASUS USB-BT400 USBBT400
- Bộ chuyển đổi USB Wi-Fi Bluetooth của Auscomer
Tuy nhiên, các dongle khác có thể hoạt động, chưa có dongle nào khác được thử nghiệm.
Hỗ trợ USB gốc
QEMU đi kèm với các tùy chọn để chuyển USB sang trình mô phỏng. Hình ảnh hệ thống AAOS đã xử lý điện thoại được kết nối. Để biết chi tiết, hãy xem Phụ kiện mở Android (AOA) .
Do điện thoại thay đổi giá trị của vendorID
và productID
khi thiết lập kết nối AOA nên giao diện USB mới (cũng như giao diện USB gốc) sẽ nhìn thấy thiết bị khi điện thoại ở chế độ AOA.
Để xác định các giá trị cho vendorID
và productID
trước và sau chế độ AOA, hãy sử dụng lsusb
:
# Note Vendor ID and Product ID of your phone
$ lsusb
Bus 001 Device 079: ID 18d1:4ee1 Google Inc. Nexus/Pixel Device (MTP)
# Start up an emulator!
$ ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x18d1,productid=0x4ee1 -device usb-host,bus=ehci.0,vendorid=0x18d1,productid=0x2d00
Ngoài ra, chuyển cổng vật lý tới QEMU:
# First plug something into the interested USB port and note the Bus and Device number.
$ lsusb
Bus 001 Device 012: ID 0bda:c820 Realtek Semiconductor Corp. 802.11ac NIC
# Now figure out where the Port number is.
$ lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
|__ Port 4: Dev 12, If 1, Class=Wireless, Driver=btusb, 480M
|__ Port 4: Dev 12, If 2, Class=Vendor Specific Class, Driver=, 480M
|__ Port 4: Dev 12, If 0, Class=Wireless, Driver=btusb, 480M
# Launch the emulator
./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=1,hostport=4
# Now, whatever you plug into the emulator, USB passthrough will happen on the fly.
Hình ảnh hệ thống AAOS nhận dạng điện thoại, đặt điện thoại ở chế độ AOA và nhận dạng lại điện thoại khi chế độ AOA đang chạy.
Để hỗ trợ chuyển qua USB, hãy xác nhận bạn đang sử dụng Trình mô phỏng 30.5.0 :
# Check for the emulator version
$ emulator --version
Trình mô phỏng 30.5.0 bao gồm bản nâng cấp libusb
và giải pháp tạm thời để giải quyết vấn đề tương thích tốc độ của hỗ trợ dongle ASUS:
- https://android-review.googlesource.com/c/platform/external/qemu/+/1573247
- https://android-review.googlesource.com/c/platform/external/qemu/+/1580924
- https://android-review.googlesource.com/c/platform/external/libusb/+/1580923
Hỗ trợ Bluetooth
Để hỗ trợ truyền qua Bluetooth, Google đã thử nghiệm Bộ chuyển đổi USB ASUS USB-BT400 USBBT400 và Bộ chuyển đổi USB Wi-Fi Bluetooth của Auscomer.
Đầu tiên, bạn cần thêm hỗ trợ kernel cho dongle. Để hiểu ngăn xếp Bluetooth của Android, hãy xem Bluetooth . Đối với HIDL, trình mô phỏng sử dụng triển khai mô phỏng. Do đó, hãy chuyển đổi điều đó bằng cách triển khai Linux gốc.
Nhân khách
Để hỗ trợ khóa USB Bluetooth:
Thêm
btusb.ko
bị thiếu vào kernel của bạn:--- a/goldfish_defconfig.fragment +++ b/goldfish_defconfig.fragment @@ -1,6 +1,7 @@ # CONFIG_CRYPTO_DEV_VIRTIO is not set CONFIG_BLK_DEV_MD=m +CONFIG_BT_HCIBTUSB=m CONFIG_CPUFREQ_DUMMY=m
Khách Android
Trong tệp
vendor.mk
, bao gồm HIDL gốc của Linux và một số quyền:PRODUCT_PACKAGES += \ android.hardware.bluetooth@1.1-service.btlinux PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml
Tạo thuộc tính đường dẫn một chiều để tắt HIDL sao cho nó sử dụng triển khai HIDL gốc của Linux:
selinux/common/domain.te get_prop(domain, qemu_prop) +get_prop(domain, vendor_build_prop)
selinux/common/property_contexts qemu.cmdline u:object_r:qemu_cmdline:s0 +qemu.preferred.bt.service u:object_r:qemu_prop:s0
Bất cứ khi nào một thuộc tính
qemu.preferred.bt.service
được đặt thànhpassthrough
, bạn sẽ tắt triển khai HIDL:service btlinux-1.1 /vendor/bin/hw/android.hardware.bluetooth@1.1-service.btlinux class hal user bluetooth group bluetooth net_admin net_bt_admin capabilities NET_ADMIN NET_RAW SYS_NICE disabled on property:qemu.preferred.bt.service=passthrough stop vendor.bluetooth-1-1 start btlinux-1.1
Thêm tệp cấu hình Bluetooth để có đầy đủ tính năng, chẳng hạn như trên thiết bị USB thực:
hal/bluetooth/bdroid_buildcfg.h #ifndef _BDROID_BUILDCFG_H #define _BDROID_BUILDCFG_H #define BTM_DEF_LOCAL_NAME "gCar Emulator" #define BTA_AV_SINK_INCLUDED TRUE /* Handsfree device */ #define BTA_DM_COD {0x26, 0x04, 0x08} #endif
Sửa đổi tệp
BoardConfig.mk
để xác định nơi lưu tệp cấu hình:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Máy chủ Linux
Trên máy chủ Linux:
Cập nhật cài đặt
udev
để cho phép quy trình người dùng (ví dụ: QEMU) có quyền đọc/ghi:$ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="17cb", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-mynew.rules >/dev/null $ sudo udevadm control --reload $ sudo udevadm trigger
Để chạy trình mô phỏng, hãy đặt các tham số dòng lệnh sau:
# Start up an emulator! $ ./emulator @AVD_NAME -no-snapshot -prop qemu.preferred.bt.service=passthrough -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0b05,productid=0x17cb # Start Bluetooth Passthrough
Hỗ trợ Wi-Fi
Để xác thực Bluetooth và Wi-Fi kép, Google đã thử nghiệm với Bộ điều hợp Bluetooth Wi-Fi USB.
Nhân khách
USB dongle cụ thể này sử dụng chip RTL8821CU mà kernel dòng chính chưa hỗ trợ. Bạn có thể tìm thấy mô-đun hạt nhân mới được phát triển tại 8821cu .
Sau đó, trong danh sách thay đổi 1575108 , các mô-đun hạt nhân bên ngoài đã được tích hợp vào nguồn hạt nhân cá vàng để biên dịch nó.
Cuối cùng, mô-đun hạt nhân biên dịch nhưng có một số lỗi CFI. Bạn cần phải vá mã theo cách thủ công để khắc phục điều này. Để biết chi tiết, hãy xem Tính toàn vẹn của luồng điều khiển trong nhân Android .
Có thể hữu ích nếu bật CONFIG_CFI_PERMISSIVE
và tiếp tục gỡ lỗi phần còn lại của ngăn xếp trước:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
Trong mọi trường hợp, hãy truy cập danh sách thay đổi 1575109 để xem cách khắc phục thích hợp cho sự cố CFI.
Khách Android
Để tìm hiểu thêm về ngăn xếp Wi-Fi, hãy xem Tổng quan về Wi-Fi . Trình mô phỏng đi kèm với các cài đặt để Wi-Fi hoạt động.
Máy chủ Linux
Trên máy chủ Linux, bạn phải cập nhật cài đặt udev
để cho phép quy trình người dùng (ví dụ: QEMU) có quyền đọc/ghi.
# /lib/udev/rules.d/40-usb_modeswitch.rules
$ ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="usb_modeswitch '/%k'"
$ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="c820", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-mynew2.rules >/dev/null
$ sudo udevadm control --reload
$ sudo udevadm trigger
Để chuyển dongle tới QEMU:
# Start up an emulator!
$ ./emulator @AVD_NAME -no-snapshot -qemu -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0bda,productid=0xc820
Danh sách thay đổi cổng
Chuyển các danh sách thay đổi sau: