Przewodnik po integracji przekazywania emulatora przez USB

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:

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:

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:

  1. 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

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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
    
  5. 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:

  1. 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
    
  2. 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: