Na tej stronie dowiesz się, jak podłączyć 2 urządzenia peryferyjne (Bluetooth i Wi-Fi) do emulatora AAOS. W ramach tego procesu 3 obszary wspierające kierowcę są kluczowe.
- Jądro gościa
- Android gościa
- Host z systemem Linux
Najpierw skompilujesz i włączysz odpowiednie sterowniki USB w jądrze gościa. Następnie Android-goście musi wybrać odpowiednie HAL i usługi, które kierowcy. Na koniec host Linux musi mieć dostęp do sterownika USB i i przenieś do QEMU.
Przetestowane klucze sprzętowe
Do testowania zostały przetestowane te klucze sprzętowe:
- Adapter USB-BT400 ASUS USBBT400
- Adapter USB Wi-Fi Bluetooth od Auscomer
Inne wtyczki mogą działać, ale nie przetestowano żadnych innych.
Natywna obsługa USB
QEMU ma opcje przekazywania USB do emulatora. Obraz systemu AAOS obsługuje już połączony telefon. Więcej informacji: Akcesorium Android Open AOA.
Ponieważ telefon zmienia wartości parametrów vendorID
i productID
po
nawiązanie połączenia AOA, nowy interfejs USB (jak również
interfejsu USB) widzi urządzenie, gdy telefon jest w trybie AOA.
Aby określić wartości vendorID
i productID
przed AOA i po nim
użyj trybu 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
Możesz też przekazać port fizyczny 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 go ponownie po uruchomieniu trybu AOA.
Aby obsługiwać przekazywanie przez USB, upewnij się, że używasz emulatora 30.5.0:
# Check for the emulator version
$ emulator --version
Emulator 30.5.0 zawiera uaktualnienie libusb
i tymczasowe obejście tego problemu
Zgodność adresu 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 Bluetootha
Przetestowaliśmy Google, Adapter USB-BT400 ASUS USBBT400 i adapter Bluetooth Wi-Fi na USB firmy Auscomer.
Najpierw musisz dodać obsługę klucza sprzętowego przez jądra systemu operacyjnego. Aby zrozumieć Androida Stos Bluetooth: patrz Bluetooth. W przypadku HIDL emulator korzysta z symulowanej implementacji. Dlatego z natywną implementacją systemu Linux.
Jądro gościa
Aby obsługiwać klucz USB Bluetooth:
Dodaj brakujący
btusb.ko
do 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
Android gościa
W pliku
vendor.mk
uwzględnij natywny HIDL dla systemu Linux oraz kilka uprawnienia: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 właściwość jednokierunkową ścieżki, aby wyłączyć HIDL tak, aby wykorzystywała Natywna implementacja HIDL w systemie 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
Gdy właściwość
qemu.preferred.bt.service
ma wartośćpassthrough
, wdrożenie 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 konfiguracji Bluetooth, aby korzystać ze wszystkich funkcji, takich jak włączenie prawdziwego urządzenia 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ć, gdzie znajduje się plik konfiguracji – zapisano:BoardConfig.mk # Bluetooth BOARD_HAVE_BLUETOOTH := true BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := vendor/auto/embedded/hal/bluetooth
Host z systemem Linux
Na hoście z Linuksem:
Zaktualizuj ustawienia
udev
, aby umożliwić procesowi użytkownika (np. QEMU) uprawnienia 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 te parametry wiersza poleceń:
# 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 sprawdzić podwójne połączenie Bluetooth i Wi-Fi, przetestowaliśmy Google przy użyciu USB Wi-Fi Adapter Bluetooth.
Jądro gościa
Ten konkretny klucz USB korzysta z układu RTL8821CU, który jest nie obsługuje jeszcze danych nadrzędnych. Możesz znaleźć nowo opracowane jądro znajdziesz na stronie 8821cu.
Następnie w changelist 1575108, zewnętrzne moduły jądra zostały zintegrowane z jądrem złotych rybek. .
Dodatkowo moduł jądra systemu kompiluje się, ale występują pewne awarie CFI. Czynności, które musisz wykonać popraw go ręcznie, aby to naprawić. Więcej informacji: Sterowanie integralnością przepływu w jądrze Androida
Warto włączyć usługę CONFIG_CFI_PERMISSIVE
i przejść dalej:
najpierw debuguj 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 przypadku wejdź na lista zmian 1575109 znajdziesz właściwy sposób rozwiązania problemu awarii CFI.
Android gościa
Więcej informacji o stosie Wi-Fi znajdziesz w artykule Informacje o sieci Wi-Fi Emulator ma wbudowane ustawienia, dzięki którym Wi-Fi będzie działać.
Host z systemem Linux
Musisz zaktualizować ustawienia udev
na hoście z Linuksem, aby włączyć proces użytkownika
(na przykład QEMU), aby mieć uprawnienia 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 sprzętowy 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ś te 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