Accesorio abierto de Android 1.0

Los accesorios USB de Android deben cumplir con el protocolo Android Open Accesorio (AOA), que define cómo un accesorio detecta y configura la comunicación con un dispositivo con Android. Los accesorios deben realizar los siguientes pasos:

  1. Espere y detecte un dispositivo conectado.
  2. Determine la compatibilidad con el modo accesorio del dispositivo.
  3. Intente iniciar el dispositivo en modo accesorio (si es necesario).
  4. Si el dispositivo admite AOA, establezca comunicación con el dispositivo.

Las siguientes secciones explican cómo implementar estos pasos.

Esperar y detectar dispositivos conectados

Los accesorios deben verificar continuamente si hay dispositivos con Android conectados. Cuando se conecta un dispositivo, el accesorio debe determinar si el dispositivo admite el modo accesorio.

Determinar la compatibilidad con el modo accesorio

Nota: No se requiere la depuración USB para conectar accesorios, pero es posible que se necesite ADB durante el desarrollo. Para obtener más información, consulte Consideraciones de depuración .

Cuando se conecta un dispositivo con Android, puede estar en uno de tres estados:

  • Admite el modo accesorio de Android y ya está en modo accesorio.
  • Admite el modo accesorio de Android pero no está en modo accesorio.
  • No es compatible con el modo accesorio 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 accesorio, así como el protocolo Android Debug Bridge (ADB), que expone una segunda interfaz con dos puntos finales masivos para ADB. Puede utilizar estos puntos finales para depurar la aplicación del accesorio si está simulando el accesorio en una computadora. En general, no utilice esta interfaz a menos que el accesorio implemente un paso 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 admite el modo de accesorio 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 tras el protocolo de enlace inicial. El encabezado contiene el fabricante, modelo y 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 y versiones anteriores se reiniciarán debido a que se genera una excepción en el proceso del sistema.

Intenta iniciar en modo accesorio

Si la versión, el proveedor y los ID del 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 accesorio (pero que no están en modo accesorio) inicialmente informan el proveedor del fabricante del dispositivo y los ID del producto en lugar del proveedor AOA y los ID del producto.

El accesorio debe intentar iniciar el dispositivo en modo accesorio para determinar si el dispositivo admite ese modo:

  1. Envíe una solicitud de control 51 ("Obtener protocolo") para determinar si el dispositivo admite el protocolo accesorio de Android. Si el dispositivo admite el protocolo, devuelve un número distinto de cero que representa la versión del protocolo admitido. La solicitud de control está en el punto final 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)
    
  2. 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 al dispositivo determinar una aplicación adecuada para el accesorio (o presentar una URL al usuario si no existe una aplicación adecuada). La solicitud de control está en el punto final 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
    
  3. Envíe una solicitud de control para solicitar que el dispositivo se inicie en modo accesorio. La solicitud de control está en el punto final 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 volver a enumerar los dispositivos conectados. El algoritmo determina la compatibilidad con el modo accesorio comprobando los ID del proveedor y del producto, que deben ser correctos (por ejemplo, corresponder a los ID del proveedor y del producto de Google en lugar de los 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 conectarlo mediante MTP.

Si algún paso falla, el accesorio determina que el dispositivo no es compatible con el modo de accesorio 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 accesorio, el accesorio puede consultar la interfaz del dispositivo y los descriptores de los puntos finales para obtener los puntos finales masivos para comunicarse con el dispositivo.

La cantidad de interfaces y puntos finales masivos depende del ID del producto. Un dispositivo con Android con un ID de producto de:

  • 0x2D00 tiene una interfaz con dos puntos finales masivos para comunicación de entrada y salida.
  • 0x2D01 tiene dos interfaces con dos puntos finales masivos cada uno para 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 dispositivo SET_CONFIGURATION ( 0x09 ) y luego comuníquese usando los puntos finales.