Panduan integrasi passthrough USB emulator

Halaman ini menjelaskan cara menghubungkan dua periferal (Bluetooth dan Wi-Fi) ke emulator AAOS. Dalam proses ini, tiga area khusus untuk dukungan bagi pengemudi adalah kuncinya:

  • Kernel tamu
  • Android Tamu
  • Host Linux

Pertama, Anda harus mengompilasi dan mengaktifkan {i>driver<i} USB yang relevan dalam {i>kernel<i} Guest. Berikutnya, Android Tamu harus memilih HAL dan layanan yang tepat untuk memunculkan {i>driver<i}. Terakhir, {i>host<i} Linux harus mendapatkan akses ke {i>driver<i} USB dan lalu transfer ke QEMU.

Dongle diuji

Dongle berikut telah diuji:

Dongle lain mungkin berfungsi, tetapi tidak ada dongle lain yang diuji.

Dukungan USB native

QEMU dilengkapi dengan opsi untuk meneruskan USB ke emulator. Image sistem AAOS dapat menangani ponsel yang terhubung. Untuk mengetahui detailnya, lihat Android Open Accessory (AOA).

Karena ponsel mengubah nilai untuk vendorID dan productID setelah membuat koneksi AOA, antarmuka USB baru (serta perangkat lunak USB) akan melihat perangkat saat ponsel dalam mode AOA.

Guna menentukan nilai untuk vendorID dan productID sebelum dan setelah AOA mode, gunakan 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

Atau, teruskan port fisik ke 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.

Gambar sistem AAOS mengenali ponsel, menempatkannya dalam mode AOA, dan mengenali sekali lagi saat mode AOA sedang berjalan.

Untuk mendukung passthrough USB, pastikan Anda menggunakan Emulator 30.5.0:

# Check for the emulator version
$ emulator --version

Emulator 30.5.0 menyertakan upgrade libusb dan solusi sementara untuk kompatibilitas alamat kecepatan dukungan ASUS dongle:

Dukungan Bluetooth

Untuk mendukung Bluetooth passthrough, Google menguji Adaptor USB ASUS USB-BT400 USBBT400 dan USB Wi-Fi Bluetooth Adapter oleh Auscomer.

Pertama, Anda perlu menambahkan dukungan {i>kernel<i} untuk dongle. Untuk memahami Android Stack Bluetooth, lihat Bluetooth. Untuk HIDL, emulator menggunakan simulasi implementasi. Oleh karena itu, ganti dengan implementasi Linux native.

Kernel tamu

Untuk mendukung dongle Bluetooth USB:

  1. Tambahkan btusb.ko yang hilang ke kernel Anda:

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

  1. Dalam file vendor.mk, sertakan HIDL native Linux dan beberapa izin:

    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. Buat properti jalur satu arah untuk mengganti HIDL sehingga menggunakan Implementasi HIDL native 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. Setiap kali properti qemu.preferred.bt.service ditetapkan ke passthrough, Anda akan mengganti implementasi 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. Tambahkan file konfigurasi Bluetooth untuk mendapatkan fitur lengkap, seperti pada perangkat USB sungguhan:

    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. Mengubah file BoardConfig.mk untuk menentukan lokasi file konfigurasi disimpan:

    BoardConfig.mk
    
    # Bluetooth
    BOARD_HAVE_BLUETOOTH := true
    BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
    

Host Linux

Di host Linux:

  1. Perbarui setelan udev agar proses pengguna (misalnya, QEMU) dapat memiliki izin akses baca/tulis:

    $ 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. Untuk menjalankan emulator, tetapkan parameter command line berikut:

    # 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
    

Dukungan Wi-Fi

Untuk memvalidasi Wi-Fi dan Bluetooth ganda, Google mengujinya dengan Wi-Fi USB Adaptor Bluetooth.

Kernel tamu

Dongle USB khusus ini menggunakan {i>chip<i} RTL8821CU, yang merupakan {i>kernel<i} utama upstream belum didukung. Anda dapat menemukan {i> kernel<i} yang baru dikembangkan di 8821cu.

Kemudian, di changelist 1575108, modul {i>kernel<i} eksternal diintegrasikan ke dalam kernel ikan mas sumber untuk mengompilasinya.

Terakhir, modul kernel dikompilasi tetapi dengan beberapa error CFI. Anda harus patch kode secara manual untuk memperbaikinya. Untuk mengetahui detailnya, lihat Mengontrol Integritas Alur di kernel Android.

Sebaiknya aktifkan CONFIG_CFI_PERMISSIVE dan lanjutkan dengan men-debug sisa tumpukan terlebih dahulu:

--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
 CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m

Atau, buka daftar perubahan 1575109 untuk melihat cara memperbaiki kerusakan CFI yang tepat.

Android Tamu

Untuk mempelajari stack Wi-Fi lebih lanjut, lihat Ringkasan Wi-Fi. Emulator dilengkapi dengan setelan untuk membuat Wi-Fi berfungsi.

Host Linux

Pada host Linux, Anda harus memperbarui setelan udev untuk mengaktifkan proses pengguna (misalnya, QEMU) yang memiliki izin baca/tulis.

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

Untuk meneruskan dongle ke 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

Daftar perubahan port

Port daftar perubahan berikut: