W tym artykule opisano, jak podłączyć dwa urządzenia peryferyjne (Bluetooth i Wi-Fi) do emulatora AAOS. W tym procesie kluczowe są trzy obszary specyficzne dla obsługi kierowcy:
- Jądro gościa
- Gość Android
- Host Linux
Najpierw skompiluj i włącz odpowiednie sterowniki USB w jądrze gościa. Następnie gość Android musi wybrać odpowiednią warstwę HAL i usługi, aby wywołać sterowniki. Wreszcie host Linux musi uzyskać dostęp do sterownika USB, a następnie przesłać go do QEMU .
Testowane klucze sprzętowe
Przetestowano następujące klucze sprzętowe:
- ASUS USB-BT400 Adapter USB USBBT400
- Adapter USB Wi-Fi Bluetooth firmy Auscomer
Inne klucze mogą działać, jednak żadne inne nie zostały przetestowane.
Natywna obsługa USB
QEMU jest wyposażony w opcje przekazywania USB do emulatora. Obraz systemu AAOS obsługuje już podłączony telefon. Aby uzyskać szczegółowe informacje, zobacz Android Open Accessory (AOA) .
Ponieważ telefon zmienia wartości vendorID
i productID
po ustanowieniu połączenia AOA, nowy interfejs USB (a także oryginalny interfejs USB) widzi urządzenie, gdy telefon jest w trybie AOA.
Aby określić wartości vendorID
i productID
przed i po trybie AOA, użyj 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
Alternatywnie przekaż fizyczny port do 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.
Obraz systemu AAOS rozpoznaje telefon, przełącza go w tryb AOA i rozpoznaje ponownie, gdy tryb AOA jest uruchomiony.
Aby obsługiwać przekazywanie USB, potwierdź, że używasz emulatora 30.5.0 :
# Check for the emulator version
$ emulator --version
Emulator 30.5.0 zawiera aktualizację libusb
i tymczasowe obejście w celu rozwiązania kompatybilności prędkości z obsługą klucza sprzętowego 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
Obsługa Bluetooth
Aby obsługiwać Bluetooth passthrough, Google przetestował adapter USB ASUS USB-BT400 USBBT400 i adapter USB Wi-Fi Bluetooth firmy Auscomer.
Najpierw musisz dodać obsługę jądra dla klucza sprzętowego. Aby zrozumieć stos Bluetooth Androida, zobacz Bluetooth . W przypadku HIDL emulator używa symulowanej implementacji. Dlatego zmień to na natywną implementację systemu Linux.
Jądro gościa
Aby obsługiwać klucz sprzętowy USB Bluetooth:
Dodaj brakujący
btusb.ko
do swojego jądra:--- 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
Gość Android
W pliku
vendor.mk
uwzględnij natywny kod HIDL systemu Linux i kilka uprawnień: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
Utwórz jednokierunkową właściwość ścieżki, aby przełączyć HIDL tak, aby używał natywnej implementacji HIDL systemu 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
Ilekroć nieruchomość
qemu.preferred.bt.service
jest ustawiony napassthrough
, można przełączać się realizację 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
Dodaj plik konfiguracyjny Bluetooth, aby uzyskać pełne funkcje, takie jak na prawdziwym urządzeniu USB:
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
Zmodyfikuj plik
BoardConfig.mk
, aby określić, gdzieBoardConfig.mk
plik konfiguracyjny:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Host Linux
Na hoście z systemem Linux:
Zaktualizuj ustawienia
udev
, aby umożliwić procesowi użytkownika (np. QEMU) uzyskanie uprawnień do odczytu / zapisu:$ 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
Aby uruchomić emulator, ustaw następujące parametry wiersza polecenia:
# 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
Obsługa Wi-Fi
Aby zweryfikować podwójny Bluetooth i Wi-Fi, firma Google przetestowała adapter USB Wi-Fi Bluetooth.
Jądro gościa
Ten konkretny klucz USB wykorzystuje układ RTL8821CU, którego główne jądro nie obsługuje jeszcze. Nowo opracowany moduł jądra można znaleźć pod adresem 8821cu .
Następnie, na liście zmian 1575108 , zewnętrzne moduły jądra zostały zintegrowane ze źródłem jądra złotej rybki, aby je skompilować.
Wreszcie, moduł jądra kompiluje się, ale z pewnymi awariami CFI. Aby to naprawić, musisz ręcznie poprawić kod. Aby uzyskać szczegółowe informacje, zobacz temat Kontrola integralności przepływu w jądrze systemu Android .
Pomocne może być włączenie CONFIG_CFI_PERMISSIVE
i przejście do przodu, debugując najpierw resztę stosu:
--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m
W każdym razie przejdź do listy zmian 1575109, aby zobaczyć poprawną naprawę awarii CFI.
Gość Android
Aby dowiedzieć się więcej o stosie Wi-Fi, zobacz Omówienie Wi-Fi . Emulator zawiera ustawienia umożliwiające działanie Wi-Fi.
Host Linux
Na hoście z systemem Linux należy zaktualizować ustawienia udev
, aby umożliwić procesowi użytkownika (na przykład QEMU) posiadanie uprawnień do odczytu / zapisu.
# /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
Aby przekazać klucz do 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
Listy zmian portów
Przenieś następujące listy zmian:
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575107
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575108
- https://android-review.googlesource.com/c/kernel/common-modules/virtual-device/+/1575109