Guida all'integrazione passthrough USB dell'emulatore

Questa pagina descrive come connettere due periferiche (Bluetooth e Wi-Fi) all'emulatore AAOS. In questo processo, tre aree specifiche per l'assistenza al conducente sono fondamentali:

  • Kernel guest
  • Android ospite
  • Host Linux

Per prima cosa, compili e abiliti i driver USB pertinenti nel kernel guest. Successivamente, l'Android ospite deve selezionare l'HAL e i servizi corretti per visualizzare autisti. Infine, l'host Linux deve avere accesso al driver USB e quindi trasferiscilo a QEMU.

Chiavette testate

Sono state testate le seguenti chiavette:

Potrebbero funzionare anche altre chiavette, ma non ne sono state testate altre.

Supporto nativo USB

QEMU include delle opzioni per passare la connessione USB all'emulatore. Immagine di sistema AAOS gestisce già un telefono connesso. Per maggiori dettagli, vedi Accessorio Android Open (AOA).

Perché il telefono cambia i valori per vendorID e productID in seguito connessione AOA, la nuova interfaccia USB (nonché quella originale USB) rileva il dispositivo quando lo smartphone è in modalità AOA.

Per determinare i valori per vendorID e productID prima e dopo l'AOA usa 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

In alternativa, passa la porta fisica a 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'immagine di sistema AAOS riconosce lo smartphone, lo mette in modalità AOA e di nuovo quando è attiva la modalità AOA.

Per supportare il passthrough USB, verifica di utilizzare l'emulatore 30.5.0:

# Check for the emulator version
$ emulator --version

L'emulatore 30.5.0 include un upgrade di libusb e una soluzione alternativa temporanea compatibilità velocità di supporto del dongle ASUS:

Supporto Bluetooth

Per supportare il passthrough Bluetooth, Google ha testato Adattatore USB USB-BT400 ASUS USBBT400 e l'adattatore Bluetooth USB Wi-Fi di Auscomer.

Innanzitutto, devi aggiungere il supporto del kernel per la chiavetta. Per comprendere il funzionamento di Android Stack Bluetooth, vedi Bluetooth. Per HIDL, l'emulatore utilizza un'implementazione simulata. Quindi, cambia con un'implementazione Linux nativa.

Kernel guest

Per supportare un dongle Bluetooth USB:

  1. Aggiungi l'oggetto btusb.ko mancante al kernel:

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

  1. Nel file vendor.mk, includi il file HIDL nativo Linux e diversi autorizzazioni:

    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. Crea una proprietà del percorso a senso unico per disattivare l'HIDL in modo che utilizzi una proprietà Implementazione HIDL nativa 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. Ogni volta che una proprietà qemu.preferred.bt.service è impostata su passthrough, disattiverai l'implementazione 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. Aggiungi un file di configurazione Bluetooth per ottenere funzionalità complete, ad esempio un dispositivo USB reale:

    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. Modifica il file BoardConfig.mk per determinare dove si trova il file di configurazione viene salvato:

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

Host Linux

Sull'host Linux:

  1. Aggiorna le impostazioni di udev per consentire al processo utente (ad esempio, QEMU) di avere autorizzazioni di lettura/scrittura:

    $ 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. Per eseguire l'emulatore, imposta i seguenti parametri della riga di comando:

    # 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
    

Supporto Wi-Fi

Per convalidare il doppio Bluetooth e il Wi-Fi, Google ha eseguito un test con il Wi-Fi USB Adattatore Bluetooth.

Kernel guest

Questa chiavetta USB utilizza il chip RTL8821CU, che il kernel upstream non supporta ancora. Puoi trovare un kernel sviluppato all'indirizzo 8821cu.

Poi, nel elenco modifiche 1575108, i moduli del kernel esterni erano integrati nel kernel del pesce rosso per la compilazione.

Infine, il modulo kernel si compila ma con alcuni arresti anomali di CFI. Devi manualmente il codice per risolvere il problema. Per maggiori dettagli, vedi Controlla l'integrità del flusso nel kernel Android.

Potrebbe essere utile attivare CONFIG_CFI_PERMISSIVE e procedere con prima di eseguire il debug del resto dello stack:

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

In ogni caso vai a elenco modifiche 1575109 per trovare la correzione corretta per gli arresti anomali di CFI.

Android ospite

Per scoprire di più sullo stack Wi-Fi, vedi Panoramica del Wi-Fi. L'emulatore include le impostazioni per il Wi-Fi.

Host Linux

Nell'host Linux, devi aggiornare le impostazioni di udev per abilitare il processo utente (ad esempio, QEMU) di avere autorizzazioni di lettura/scrittura.

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

Per passare la chiavetta alla 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

Liste modifiche porte

Trasferisci i seguenti elenchi di modifiche: