Los accesorios USB de Android deben cumplir con el protocolo de accesorios abiertos de Android (AOA), que define cómo un accesorio detecta y establece la comunicación con un dispositivo con Android. Los accesorios deben realizar los siguientes pasos:
- Espere y detecte un dispositivo conectado.
- Determine la compatibilidad con el modo accesorio del dispositivo.
- Intente iniciar el dispositivo en modo accesorio (si es necesario).
- Si el dispositivo es compatible con AOA, establezca comunicación con el dispositivo.
Las siguientes secciones explican cómo implementar estos pasos.
Esperar y detectar dispositivos conectados
Los accesorios deben comprobar continuamente si hay dispositivos con Android conectados. Cuando se conecta un dispositivo, el accesorio debe determinar si el dispositivo es compatible con el modo accesorio.
Determinar la compatibilidad con el modo accesorio
Cuando se conecta un dispositivo con Android, puede estar en uno de estos tres estados:
- Admite el modo de accesorios de Android y ya está en modo de accesorios.
- Admite el modo de accesorios de Android, pero no está en modo de accesorios.
- No es compatible con el modo de accesorios de Android.
Durante la conexión inicial, el accesorio debe verificar la versión, la identificación del proveedor y la identificación del producto del descriptor de dispositivo USB del dispositivo conectado. El ID del proveedor debe coincidir con el ID de Google ( 0x18D1
). Si el dispositivo ya está en modo accesorio, el ID del producto debe ser 0x2D00
o 0x2D01
y el accesorio puede establecer comunicación con el dispositivo a través de puntos finales de transferencia masiva utilizando su propio protocolo de comunicación (no es necesario iniciar el dispositivo en modo accesorio).
Nota: 0x2D00
está reservado para dispositivos con Android que admiten el modo accesorio. 0x2D01
está reservado para dispositivos que admiten el modo de accesorios, así como el protocolo Android Debug Bridge (ADB), que expone una segunda interfaz con dos puntos finales masivos para ADB. Puede usar estos extremos para depurar la aplicación del accesorio si está simulando el accesorio en una computadora. En general, no use esta interfaz a menos que el accesorio implemente un acceso directo a ADB en el dispositivo.
Si la versión, el ID del proveedor o el ID del producto en el descriptor del dispositivo USB no coinciden con los valores esperados, el accesorio no puede determinar si el dispositivo es compatible con el modo de accesorio de Android. El accesorio debe intentar iniciar el dispositivo en modo accesorio (detallado a continuación) para determinar la compatibilidad del dispositivo.
Punto clave: un accesorio USB debe enviar un encabezado en el apretón de manos inicial. El encabezado contiene el fabricante, el modelo y la versión. Aunque la versión es un campo opcional, si se instala una aplicación de Android que solo coincide con la versión, pero el accesorio no envía una versión, los dispositivos Android que se ejecutan en Android 10 e inferior se reiniciarán debido a una excepción que se genera en el proceso del sistema.
Intento de iniciar en modo accesorio
Si los ID de versión, proveedor y producto no corresponden a un dispositivo con Android en modo accesorio, el accesorio no puede determinar si el dispositivo admite (pero no está en) el modo accesorio o si el dispositivo no admite el modo accesorio. Esto puede ocurrir porque los dispositivos que admiten el modo de accesorios (pero no están en modo de accesorios) informan inicialmente los ID de producto y proveedor del fabricante del dispositivo en lugar de los ID de producto y proveedor de AOA .
El accesorio debe intentar iniciar el dispositivo en modo accesorio para determinar si el dispositivo es compatible con ese modo:
- Envíe una solicitud de control 51 ("Obtener protocolo") para determinar si el dispositivo es compatible con el protocolo de accesorios de Android. Si el dispositivo es compatible con el protocolo, devuelve un número distinto de cero que representa la versión del protocolo compatible. La solicitud de control está en el extremo 0 con las siguientes características:
requestType: USB_DIR_IN | USB_TYPE_VENDOR request: 51 value: 0 index: 0 data: protocol version number (16 bits little endian sent from the device to the accessory)
- Si el dispositivo devuelve una versión de protocolo compatible, envíe una solicitud de control con información de cadena de identificación al dispositivo. Esta información permite que el dispositivo determine una aplicación adecuada para el accesorio (o presente una URL al usuario si no existe una aplicación adecuada). La solicitud de control está en el extremo 0 (para cada ID de cadena) con las siguientes características:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 52 value: 0 index: string ID data zero terminated UTF8 string sent from accessory to device
Se admiten los siguientes ID de cadena, con un tamaño máximo de 256 bytes para cada cadena (debe terminar en cero con
\0
).manufacturer name: 0 model name: 1 description: 2 version: 3 URI: 4 serial number: 5
- Envíe una solicitud de control para pedirle al dispositivo que se inicie en modo accesorio. La solicitud de control está en el extremo 0 con las siguientes características:
requestType: USB_DIR_OUT | USB_TYPE_VENDOR request: 53 value: 0 index: 0 data: none
Después de completar estos pasos, el accesorio debe esperar a que el dispositivo USB conectado se vuelva a introducir en el bus en modo accesorio y luego vuelva a enumerar los dispositivos conectados. El algoritmo determina la compatibilidad con el modo accesorio al verificar las ID del proveedor y del producto, que deben ser correctas (por ejemplo, corresponder a las ID del proveedor y del producto de Google en lugar de las ID del fabricante del dispositivo) si el dispositivo cambió correctamente al modo accesorio. Si los ID y la versión son correctos, el accesorio se mueve para establecer comunicación con el dispositivo .
Nota: AOA actualmente no admite conexiones AOA y MTP simultáneas. Para cambiar de AOA a MTP, el accesorio primero debe desconectar el dispositivo USB (ya sea físicamente o de forma eléctricamente equivalente) y luego volver a conectar mediante MTP.
Si falla algún paso, el accesorio determina que el dispositivo no es compatible con el modo de accesorio de Android y espera a que se conecte el siguiente dispositivo.
Establecer comunicación con el dispositivo.
Si el accesorio detecta un dispositivo con Android en modo de accesorio, el accesorio puede consultar la interfaz del dispositivo y los descriptores de punto final para obtener los puntos finales masivos para comunicarse con el dispositivo.
La cantidad de interfaces y puntos finales masivos depende de la identificación del producto. Un dispositivo con Android con un ID de producto de:
-
0x2D00
tiene una interfaz con dos puntos finales masivos para la comunicación de entrada y salida. -
0x2D01
tiene dos interfaces con dos puntos finales masivos cada uno para la comunicación de entrada y salida. La primera interfaz maneja la comunicación estándar y la segunda interfaz maneja la comunicación ADB. Para usar una interfaz, ubique los primeros puntos finales de entrada y salida masiva, establezca la configuración del dispositivo en un valor de 1 con una solicitud de dispositivoSET_CONFIGURATION
(0x09
) y luego comuníquese usando los puntos finales.