Panduan Integrasi Emulator USB Passthrough

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

  • Kernel tamu
  • Tamu Android
  • Tuan rumah Linux

Pertama, Anda mengkompilasi dan mengaktifkan driver USB yang relevan di kernel Guest. Selanjutnya, Guest Android harus memilih HAL dan layanan yang tepat untuk memunculkan driver. Terakhir, host Linux harus mendapatkan akses ke driver USB dan kemudian mentransfernya ke QEMU .

Dongle diuji

Dongle berikut telah diuji:

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

Dukungan USB asli

QEMU hadir dengan opsi untuk meneruskan USB ke emulator. Gambar sistem AAOS sudah menangani telepon yang terhubung. Untuk detailnya, lihat Android Open Accessory (AOA) .

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

Untuk menentukan nilai vendorID dan productID sebelum dan sesudah mode AOA, 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, berikan 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.

Citra sistem AAOS mengenali telepon, memasukkannya ke mode AOA, dan mengenalinya lagi saat mode AOA berjalan.

Untuk mendukung passthrough USB, konfirmasikan bahwa Anda menggunakan Emulator 30.5.0 :

# Check for the emulator version
$ emulator --version

Emulator 30.5.0 mencakup peningkatan libusb dan solusi sementara untuk mengatasi kompatibilitas kecepatan dukungan dongle ASUS:

Dukungan Bluetooth

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

Pertama, Anda perlu menambahkan dukungan kernel untuk dongle. Untuk memahami susunan Bluetooth Android, lihat Bluetooth . Untuk HIDL, emulator menggunakan implementasi simulasi. Oleh karena itu, alihkan itu dengan implementasi Linux asli.

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
    

Tamu Android

  1. Dalam file vendor.mk , sertakan HIDL asli 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 asli 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 diatur 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 nyata:

    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. Ubah file BoardConfig.mk untuk menentukan di mana file konfigurasi disimpan:

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

Tuan rumah Linux

Di host Linux:

  1. Perbarui pengaturan udev agar proses pengguna (misalnya QEMU) memiliki izin 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, setel parameter baris perintah 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 dual Bluetooth dan Wi-Fi, Google menguji dengan USB Wi-Fi Bluetooth Adapter.

Kernel tamu

Dongle USB khusus ini menggunakan chip RTL8821CU, yang belum didukung oleh hulu kernel arus utama. Anda dapat menemukan modul kernel yang baru dikembangkan di 8821cu .

Kemudian, di daftar perubahan 1575108 , modul kernel eksternal diintegrasikan ke dalam sumber kernel ikan mas untuk dikompilasi.

Akhirnya, modul kernel dikompilasi tetapi dengan beberapa CFI crash. Anda perlu menambal kode secara manual untuk memperbaikinya. Untuk detailnya, lihat Mengontrol Integritas Alur di kernel Android .

Mungkin berguna untuk mengaktifkan CONFIG_CFI_PERMISSIVE dan melanjutkan 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

Bagaimanapun, pergi ke daftar perubahan 1575109 untuk melihat perbaikan yang tepat untuk CFI crash.

Tamu Android

Untuk mempelajari lebih lanjut tentang tumpukan Wi-Fi, lihat Ikhtisar Wi-Fi . Emulator dilengkapi dengan pengaturan untuk membuat Wi-Fi berfungsi.

Tuan rumah Linux

Di host Linux, Anda harus memperbarui pengaturan udev untuk mengaktifkan proses pengguna (misalnya, QEMU) agar 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: