Guide d'intégration du passthrough USB de l'émulateur

Cette page explique comment connecter deux périphériques (Bluetooth et Wi-Fi) à l'émulateur AAOS. Dans ce processus, trois domaines spécifiques à l'assistance aux conducteurs sont essentielles:

  • Noyau invité
  • Android invité
  • Hôte Linux

Tout d'abord, compilez et activez les pilotes USB appropriés dans le noyau invité. Ensuite, Android invité doit sélectionner le HAL et les services appropriés pour afficher des pilotes. Enfin, l'hôte Linux doit accéder au pilote USB et puis transférez-le vers QEMU.

Dongles testés

Les dongles suivants ont été testés:

D'autres dongles peuvent fonctionner, mais aucun autre n'a été testé.

Compatibilité USB native

QEMU propose des options permettant de transmettre des clés USB à l'émulateur. L'image système AAOS gère déjà un téléphone connecté. Pour en savoir plus, consultez Android Open Accessory (AOA)

Parce que le téléphone change les valeurs pour vendorID et productID lorsque établissant une connexion AOA, la nouvelle interface USB (ainsi que l'originale interface USB) détecte l'appareil lorsque le téléphone est en mode AOA.

Déterminer les valeurs de vendorID et productID avant et après la date d'enchère utilisez 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

Vous pouvez également transmettre le port physique à 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.

L'image système AAOS reconnaît le téléphone, le met en mode AOA lorsque le mode AOA est en cours d'exécution.

Pour prendre en charge le passthrough USB, vérifiez que vous utilisez l'émulateur 30.5.0:

# Check for the emulator version
$ emulator --version

L'émulateur 30.5.0 inclut une mise à niveau de libusb et une solution temporaire Compatibilité avec les dongles ASUS:

Compatibilité Bluetooth

Pour assurer la compatibilité du passthrough Bluetooth, Google a testé Adaptateur USB ASUS USB-BT400 USBBT400 et l'adaptateur USB Wi-Fi Bluetooth d'Auscomer.

Tout d’abord, vous devez ajouter la prise en charge du noyau pour le dongle. Pour comprendre le fonctionnement pile Bluetooth, consultez Bluetooth. Pour HIDL, l'émulateur utilise une implémentation simulée. Par conséquent, remplacez avec une implémentation Linux native.

Noyau invité

Pour utiliser un dongle Bluetooth USB:

  1. Ajoutez le btusb.ko manquant à votre noyau:

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

  1. Dans le fichier vendor.mk, incluez le HIDL natif Linux et plusieurs autorisations:

    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. Créez une propriété de chemin à sens unique pour remplacer le protocole HIDL de sorte qu'il utilise un Implémentation 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
    
  3. Chaque fois qu'une propriété qemu.preferred.bt.service est définie sur passthrough, vous remplacerez l'implémentation 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. Ajoutez un fichier de configuration Bluetooth pour bénéficier de toutes les fonctionnalités, un vrai périphérique 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. Modifiez le fichier BoardConfig.mk pour déterminer l'emplacement du fichier de configuration. est enregistré:

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

Hôte Linux

Sur l'hôte Linux:

  1. Mettez à jour les paramètres udev pour autoriser le processus utilisateur (par exemple, QEMU) les autorisations de lecture/écriture:

    $ 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. Pour exécuter l'émulateur, définissez les paramètres de ligne de commande suivants:

    # 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
    

Compatibilité Wi-Fi

Pour valider la double connectivité Bluetooth et Wi-Fi, Google a testé la connexion Wi-Fi USB Adaptateur Bluetooth.

Noyau invité

Ce dongle USB utilise la puce RTL8821CU, que le noyau principal en amont n'est pas encore compatible. Vous pouvez trouver un noyau récemment développé à l'adresse 8821cu.

Puis, dans changelist 1575108, les modules externes du noyau étaient intégrés dans le noyau source pour la compiler.

Enfin, le module du noyau se compile, mais avec quelques plantages CFI. Vous devez corriger le code manuellement pour résoudre ce problème. Pour en savoir plus, consultez Contrôlez l'intégrité du flux dans le noyau Android.

Il peut être utile d'activer CONFIG_CFI_PERMISSIVE et de poursuivre à déboguer le reste de la pile:

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

Dans tous les cas, accédez à liste de modifications 1575109 pour voir la solution appropriée pour les plantages de CFI.

Android invité

Pour en savoir plus sur la pile Wi-Fi, consultez Présentation du Wi-Fi L'émulateur est fourni avec les paramètres permettant de faire fonctionner le Wi-Fi.

Hôte Linux

Sur l'hôte Linux, vous devez mettre à jour les paramètres udev pour activer le processus utilisateur (par exemple, QEMU) disposent d'autorisations de lecture/écriture.

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

Pour transmettre le dongle à 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

Listes de modifications des ports

Transférez les listes de modifications suivantes: