Emulator-USB-Passthrough-Integrationshandbuch

In diesem Artikel wird beschrieben, wie Sie zwei Peripheriegeräte (Bluetooth und WLAN) mit dem AAOS-Emulator verbinden. Dabei sind drei Bereiche der Fahrerunterstützung von zentraler Bedeutung:

  • Gastkernel
  • Gast-Android
  • Linux-Host

Zunächst kompilieren und aktivieren Sie die relevanten USB-Treiber im Guest-Kernel. Als nächstes muss Gast-Android das richtige HAL und die richtigen Dienste auswählen, um die Treiber aufzurufen. Abschließend muss der Linux-Host Zugriff auf den USB-Treiber erhalten und diesen dann an QEMU übertragen.

Dongles getestet

Folgende Dongles wurden getestet:

Andere Dongles funktionieren möglicherweise, es wurden jedoch keine anderen getestet.

Native USB-Unterstützung

QEMU verfügt über Optionen zur Weitergabe von USB an den Emulator. Das AAOS-Systemabbild verwaltet bereits ein angeschlossenes Telefon. Einzelheiten finden Sie unter Android Open Accessoire (AOA) .

Da das Telefon beim Herstellen einer AOA-Verbindung die Werte für vendorID und productID ändert, erkennt die neue USB-Schnittstelle (sowie die ursprüngliche USB-Schnittstelle) das Gerät, wenn sich das Telefon im AOA-Modus befindet.

Um die Werte für vendorID und productID vor und nach dem AOA-Modus zu ermitteln, verwenden Sie 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

Alternativ können Sie den physischen Port an QEMU übergeben:

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

Das AAOS-Systemabbild erkennt das Telefon, versetzt es in den AOA-Modus und erkennt es erneut, wenn der AOA-Modus ausgeführt wird.

Um USB-Passthrough zu unterstützen, bestätigen Sie, dass Sie Emulator 30.5.0 verwenden:

# Check for the emulator version
$ emulator --version

Emulator 30.5.0 enthält ein libusb Upgrade und eine vorübergehende Problemumgehung, um die Geschwindigkeitskompatibilität der ASUS-Dongle-Unterstützung zu gewährleisten:

Bluetooth-Unterstützung

Um Bluetooth-Passthrough zu unterstützen, hat Google den ASUS USB-BT400 USB-Adapter USBBT400 und den USB-WLAN-Bluetooth-Adapter von Auscomer getestet.

Zuerst müssen Sie Kernel-Unterstützung für den Dongle hinzufügen. Informationen zum Bluetooth-Stack von Android finden Sie unter Bluetooth . Für HIDL verwendet der Emulator eine simulierte Implementierung. Tauschen Sie dies daher gegen eine native Linux-Implementierung aus.

Gastkernel

So unterstützen Sie einen USB-Bluetooth-Dongle:

  1. Fügen Sie die fehlende btusb.ko zu Ihrem Kernel hinzu:

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

Gast-Android

  1. Fügen Sie in die Datei vendor.mk die native Linux-HIDL und mehrere Berechtigungen ein:

    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. Erstellen Sie eine unidirektionale Pfadeigenschaft, um die HIDL so auszutauschen, dass sie eine Linux-native HIDL-Implementierung verwendet:

    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. Immer wenn eine Eigenschaft qemu.preferred.bt.service auf passthrough gesetzt ist, schalten Sie die HIDL-Implementierung aus:

    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. Fügen Sie eine Bluetooth-Konfigurationsdatei hinzu, um alle Funktionen zu nutzen, beispielsweise auf einem echten USB-Gerät:

    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. Ändern Sie die Datei BoardConfig.mk , um zu bestimmen, wo die Konfigurationsdatei gespeichert wird:

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

Linux-Host

Auf dem Linux-Host:

  1. Aktualisieren Sie udev Einstellungen, um dem Benutzerprozess (z. B. QEMU) Lese-/Schreibberechtigungen zu ermöglichen:

    $ 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. Um den Emulator auszuführen, legen Sie die folgenden Befehlszeilenparameter fest:

    # 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
    

Wi-Fi-Unterstützung

Zur Validierung von Dual-Bluetooth und Wi-Fi testete Google den USB-Wi-Fi-Bluetooth-Adapter.

Gastkernel

Dieser spezielle USB-Dongle verwendet den RTL8821CU-Chip, den der Mainline-Kernel-Upstream noch nicht unterstützt. Ein neu entwickeltes Kernel-Modul finden Sie unter 8821cu .

Dann wurden in der Änderungsliste 1575108 die externen Kernelmodule in die Goldfish-Kernelquelle integriert, um sie zu kompilieren.

Schließlich wird das Kernelmodul kompiliert, allerdings mit einigen CFI-Abstürzen. Um dieses Problem zu beheben, müssen Sie den Code manuell patchen. Einzelheiten finden Sie unter Kontrollflussintegrität im Android-Kernel .

Es kann hilfreich sein, CONFIG_CFI_PERMISSIVE zu aktivieren und zunächst mit dem Debuggen des Rests des Stapels fortzufahren:

--- a/goldfish_defconfig.fragment
+++ b/goldfish_defconfig.fragment
@@ -1,6 +1,7 @@
 CONFIG_CFI_CLANG=m
+CONFIG_CFI_PERMISSIVE=m

Gehen Sie auf jeden Fall zur Änderungsliste 1575109 , um die richtige Lösung für die CFI-Abstürze zu finden.

Gast-Android

Weitere Informationen zum Wi-Fi-Stack finden Sie unter Wi-Fi-Übersicht . Der Emulator wird mit den Einstellungen geliefert, damit Wi-Fi funktioniert.

Linux-Host

Auf dem Linux-Host müssen Sie die udev Einstellungen aktualisieren, um dem Benutzerprozess (z. B. QEMU) Lese-/Schreibberechtigungen zu ermöglichen.

# /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

So übergeben Sie den Dongle an 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

Port-Änderungslisten

Portieren Sie die folgenden Änderungslisten: