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:
- Adaptador USB USB-BT400 de ASUS, USBBT400
- Adaptador USB y Bluetooth de Auscomer
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:
- https://android-review.googlesource.com/c/platform/external/qemu/+/1573247.
- https://android-review.googlesource.com/c/platform/external/qemu/+/1580924.
- https://android-review.googlesource.com/c/platform/external/libusb/+/1580923
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:
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
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
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
Cuando una propiedad
qemu.preferred.bt.service
se establece enpassthrough
, 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
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
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:
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
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: