Guía de integración de transferencia USB del emulador

En esta página, se describe cómo conectar dos periféricos (Bluetooth y Wi-Fi) al emulador de AAOS. En este proceso, se incluyen tres áreas específicas de la asistencia al conductor son fundamentales:

  • Kernel invitado
  • Android invitado
  • Host de Linux

Primero, compila y habilita los controladores USB relevantes en el kernel de invitado. Luego, Android invitado debe seleccionar la HAL y los servicios correctos para activar la conductores. Por último, el host de Linux debe tener acceso al controlador USB y y, luego, transferirlo a QEMU.

Se probaron las llaves

Se probaron las siguientes llaves:

Es posible que funcionen otras llaves, pero no se probaron otras.

Compatibilidad con USB nativo

QEMU incluye opciones para pasar USB al emulador. La imagen del sistema AAOS ya maneja un teléfono conectado. Para obtener más información, consulta Accesorio abierto de Android (AOA).

Debido a que el teléfono cambia los valores de vendorID y productID en establecer una conexión AOA, la nueva interfaz USB (así como la interfaz USB) detecta el dispositivo cuando el teléfono está en modo AOA.

Determinar los valores de vendorID y productID antes y después de 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

De manera alternativa, pasa el puerto físico 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.

La imagen del sistema AAOS reconoce el teléfono, lo coloca en modo AOA y reconoce cuando se ejecute el modo AOA.

Para admitir la transferencia por USB, confirma que estés usando el emulador 30.5.0:

# Check for the emulator version
$ emulator --version

El emulador 30.5.0 incluye una actualización de libusb y una solución temporal para Compatibilidad de velocidad de dirección compatible con llaves ASUS:

Compatibilidad con Bluetooth

Para admitir la transferencia Bluetooth, Google probó Adaptador USB USB-BT400 de ASUS, USBBT400 y adaptador USB y Wi-Fi Bluetooth de Auscomer.

Primero, debes agregar compatibilidad con el kernel para la llave. Para comprender el comportamiento Pila Bluetooth, consulta Bluetooth. Para el HIDL, el emulador usa una implementación simulada. Por lo tanto, cambia ese con una implementación nativa de Linux.

Kernel invitado

Para admitir una llave USB Bluetooth:

  1. Agrega el btusb.ko faltante a tu 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 invitado

  1. En el archivo vendor.mk, incluye el HIDL nativo de Linux y varias permisos:

    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 propiedad de ruta de acceso unidireccional para cambiar el HIDL de modo que utilice un Implementación de HIDL nativa de 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. Cuando una propiedad qemu.preferred.bt.service se establece en passthrough, cambiarás la implementación de 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. Agrega un archivo de configuración de Bluetooth para obtener todas las funciones, como un dispositivo USB real:

    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 el archivo BoardConfig.mk para determinar dónde está el archivo de configuración se guarda:

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

Host de Linux

En el host de Linux:

  1. Actualiza la configuración de udev para permitir que el proceso del usuario (por ejemplo, QEMU) tenga permisos de lectura/escritura:

    $ 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. Para ejecutar el emulador, configura los siguientes parámetros de la línea de comandos:

    # 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
    

Compatibilidad con Wi-Fi

Para validar el Bluetooth y la conexión Wi-Fi duales, Google realizó la prueba con la conexión Wi-Fi USB. Adaptador Bluetooth.

Kernel invitado

Esta llave USB en particular usa el chip RTL8821CU, que es el kernel de la línea principal ascendente aún no es compatible. Puedes encontrar un kernel recién desarrollado en 8821cu.

Luego, en lista de cambios 1575108, Los módulos de kernel externos se integraron en el kernel de goldfish. para compilarla.

Por último, el módulo de kernel se compila, pero con algunas fallas de CFI. Debes aplicar parches en el código de forma manual para solucionar este problema. Para obtener más información, consulta Controla la integridad del flujo en el kernel de Android.

Puede ser útil habilitar CONFIG_CFI_PERMISSIVE y continuar con depurar primero el resto de la pila:

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

En cualquier caso, ve a lista de cambios 1575109 para ver la solución adecuada de las fallas de CFI.

Android invitado

Para obtener más información sobre la pila de Wi-Fi, consulta Descripción general de Wi-Fi. El emulador incluye la configuración para que funcione el Wi-Fi.

Host de Linux

En el host de Linux, debes actualizar la configuración de udev para habilitar el proceso del usuario (por ejemplo, QEMU) que tenga permisos de lectura/escritura.

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

Para pasar la llave a 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

Listas de cambios de puertos

Porta las siguientes listas de cambios: