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:
- Adaptor USB ASUS USB-BT400 USBBT400
- USB Wi-Fi Bluetooth Adapter dari Auscomer
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:
- 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
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:
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
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
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
Setiap kali properti
qemu.preferred.bt.service
ditetapkan kepassthrough
, 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
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
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:
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
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: