Hướng dẫn tích hợp truyền qua USB cho trình mô phỏng

Trang này mô tả cách kết nối 2 thiết bị ngoại vi (Bluetooth và Wi-Fi) đến trình mô phỏng AAOS. Trong quá trình này, ba khía cạnh dành riêng cho việc hỗ trợ người lái xe là chìa khoá:

  • Nhân hệ điều hành khách
  • Android dành cho khách
  • Máy chủ Linux

Trước tiên, bạn biên dịch và bật các trình điều khiển USB có liên quan trong nhân hệ điều hành khách. Tiếp theo, Android dành cho khách phải chọn HAL và các dịch vụ phù hợp để hiển thị trình điều khiển. Cuối cùng, máy chủ lưu trữ Linux phải có quyền truy cập vào trình điều khiển USB và sau đó chuyển sang QEMU.

Kiểm tra Donles

Đã kiểm tra các thiết bị phần cứng sau:

Các thiết bị bảo vệ phần mềm khác có thể hoạt động tốt, tuy nhiên, chưa có thiết bị nào khác được thử nghiệm.

Hỗ trợ USB gốc

QEMU cung cấp các tuỳ chọn để truyền USB vào trình mô phỏng. Hình ảnh hệ thống AAOS xử lý một điện thoại được kết nối. Để biết thông tin chi tiết, hãy xem Phụ kiện mở Android (AOA).

Vì điện thoại thay đổi giá trị của vendorIDproductID dựa trên thiết lập kết nối AOA, giao diện USB mới (cũng như giao diện giao diện USB) thấy thiết bị khi điện thoại ở chế độ AOA.

Để xác định giá trị của vendorIDproductID trước và sau AOA chế độ xem, 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, hãy chuyển cổng thực đến 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 khi chế độ AOA đang chạy.

Để hỗ trợ truyền qua USB, hãy xác nhận rằng 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 để khả năng tương thích tốc độ địa chỉ của tính năng hỗ trợ thiết bị phần cứng ASUS:

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 Bluetooth USB Wi-Fi của Auscomer.

Trước tiên, bạn cần thêm tính năng hỗ trợ nhân cho thiết bị bảo vệ phần mềm. Để tìm hiểu về Android Ngăn xếp Bluetooth, xem phần Bluetooth. Đối với HIDL, trình mô phỏng sử dụng phương thức triển khai mô phỏng. Do đó, hãy chuyển đổi bằng cách triển khai Linux gốc.

Nhân hệ điều hành khách

Cách hỗ trợ thiết bị phần cứng Bluetooth USB:

  1. Thêm btusb.ko bị thiếu vào nhân hệ điều hành 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
    

Android dành cho khách

  1. Trong tệp vendor.mk, hãy thê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
    
  2. Tạo thuộc tính đường dẫn một chiều để tắt HIDL sao cho thuộc tính này 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
    
  3. Mỗi khi một thuộc tính qemu.preferred.bt.service được đặt thành passthrough, bạn sẽ tắt phương thức 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
    
  4. Thêm tệp cấu hình Bluetooth để có đầy đủ các tính năng, chẳng hạn như bật một 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
    
  5. Sửa đổi tệp BoardConfig.mk để xác định vị trí của tệp cấu hình đã được lưu:

    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:

  1. Cập nhật các chế độ cài đặt udev để cho phép quy trình của 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
    
  2. Để 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 Wi-Fi và Bluetooth kép, Google đã thử nghiệm với Wi-Fi USB Bộ điều hợp Bluetooth.

Nhân hệ điều hành khách

Thiết bị phần cứng USB đặc biệt này sử dụng chip RTL8821CU, là nhân chưa hỗ trợ. Bạn có thể tìm thấy một nhân hệ điều hành mới được phát triển mô-đun ở 8821cu.

Sau đó, trong danh sách thay đổi 1575108, các mô-đun nhân bên ngoài được tích hợp vào nhân cá vàng nguồn để biên dịch.

Cuối cùng, mô-đun nhân biên dịch nhưng gặp một số sự cố CFI. Bạn cần hãy vá mã theo cách thủ công để khắc phục sự cố này. Để biết thông tin chi tiết, hãy xem Kiểm soát tính toàn vẹn của luồng trong nhân Android.

Bạn nên bật CONFIG_CFI_PERMISSIVE và tiếp tục sử dụng 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 chuyển đến danh sách thay đổi 1575109 để xem cách khắc phục thích hợp cho các sự cố CFI.

Android dành cho khách

Để 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 chế độ cài đặt giúp Wi-Fi hoạt động.

Máy chủ Linux

Trên máy chủ lưu trữ Linux, bạn phải cập nhật chế độ cài đặt udev để bật 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

Cách chuyển thiết bị bảo vệ phần mềm đến 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: