Protocolo de accesorios abiertos de Android 2.0,Protocolo de accesorios abiertos de Android 2.0

Este documento describe los cambios en el protocolo Accesorio abierto de Android (AOA) desde su versión inicial y complementa la documentación de AOA 1.0 . AOAv2 agrega las siguientes características:

  • Salida de audio (en desuso en Android 8.0).
  • Compatibilidad con el accesorio que actúa como uno o más dispositivos de interfaz humana (HID) para el dispositivo Android.

Las API del SDK de Android disponibles para los desarrolladores de aplicaciones de Android no han cambiado.

Detección de compatibilidad con AOAv2

Para determinar si un dispositivo Android conectado admite accesorios y la versión de protocolo compatible, un accesorio debe enviar un getProtocol() y verificar el resultado. Los dispositivos Android que admiten solo las funciones de AOAv1 deben devolver 1 como versión del protocolo; los dispositivos que admiten las funciones adicionales en AOAv2 deben devolver 2 como la versión del protocolo. AOAv2 es compatible con versiones anteriores de AOAv1, por lo que los accesorios diseñados para el protocolo de accesorios original continúan funcionando con los dispositivos Android más nuevos.

El siguiente ejemplo de la biblioteca de código fuente del Kit de desarrollo de accesorios 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) demuestra esta verificación de protocolo:

bool AndroidAccessory::switchDevice(byte addr)
{
    int protocol = getProtocol(addr);
    if (protocol >= 1) {
        Serial.print("device supports protocol 1 or higher\n");
    } else {
        Serial.print("could not read device protocol version\n");
        return false;
    }

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL);
    return true;
}

AOAv2 incluye nuevos ID de productos USB para cada combinación de interfaces USB disponibles en modo accesorio:

Versión identificación de producto Comunicación Descripción
AOAv1 0x2D00 accesorio Proporciona dos puntos finales masivos para comunicarse con una aplicación de Android.
0x2D01 accesorio + adb Con fines de depuración durante el desarrollo de accesorios. Disponible solo si el usuario ha habilitado la depuración de USB en la configuración del dispositivo Android.
AOAv2 0x2D02 audio Para transmitir audio desde un dispositivo Android a un accesorio.
0x2D03 audio + anuncio
0x2D04 accesorio + sonido
0x2D05 accesorio + audio + adb

Los ID de productos utilizados en AOAv1 ( 0x2D00 y 0x2D01 ) siguen siendo compatibles con AOAv2.

Soporte de audio

AOAv2 incluye soporte para la salida de audio desde un dispositivo Android a un accesorio a través de una interfaz de clase de audio USB estándar capaz de audio PCM de 16 bits de 2 canales con una tasa de bits de 44100 Khz (se pueden agregar modos de audio adicionales en el futuro).

Para habilitar el soporte de audio, el accesorio debe enviar una nueva solicitud de control USB:

**SET_AUDIO_MODE**
requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        58
value:          0 for no audio (default),
                1 for 2 channel, 16-bit PCM at 44100 KHz
index:          0
data            none

Este comando debe enviarse antes de enviar el comando ACCESSORY_START para ingresar al modo accesorio.

Soporte HID

AOAv2 permite que los accesorios registren uno o más dispositivos de interfaz humana (HID) USB con un dispositivo Android. Este enfoque invierte la dirección de la comunicación para los dispositivos USB HID típicos, como ratones y teclados USB. Normalmente, el dispositivo HID es un periférico conectado a un host USB (es decir, una computadora personal), pero en AOA el host USB puede actuar como uno o más dispositivos de entrada a un periférico USB.

El soporte de HID es un proxy para eventos HID estándar; la implementación no hace suposiciones sobre el contenido o el tipo de eventos y simplemente lo pasa al sistema de entrada, lo que permite que un accesorio AOAv2 actúe como cualquier dispositivo HID (mouse, teclado, controlador de juegos, etc.). Puede utilizar la compatibilidad con HID para proporcionar funciones básicas, como un botón de reproducción/pausa en una base multimedia, o funciones avanzadas, como una estación de conexión con un mouse y un teclado QWERTY completo.

AOAv2 agrega nuevas solicitudes de control USB que permiten que el accesorio actúe como uno o más dispositivos de entrada HID para el dispositivo Android. La compatibilidad con HID se maneja completamente a través de solicitudes de control en el punto final cero, por lo que no se necesita una nueva interfaz USB. Las cuatro nuevas solicitudes de control son:

  • ACCESSORY_REGISTER_HID registra un nuevo dispositivo HID con el dispositivo Android. El accesorio proporciona una identificación utilizada para identificar el dispositivo HID para las otras tres llamadas. Esta identificación es válida hasta que el USB se desconecte o hasta que el accesorio envíe ACCESSORY_UNREGISTER_HID para cancelar el registro del dispositivo HID.
  • ACCESSORY_UNREGISTER_HID cancela el registro de un dispositivo HID previamente registrado con ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC envía un descriptor de informe para un dispositivo HID al dispositivo Android. Esta solicitud se usa para describir las capacidades del dispositivo HID y debe enviarse antes de informar cualquier evento HID al dispositivo Android. Si el descriptor del informe es más grande que el tamaño máximo de paquete para el punto final cero, se envían varios comandos ACCESSORY_SET_HID_REPORT_DESC para transferir el descriptor completo.
  • ACCESSORY_SEND_HID_EVENT envía eventos de entrada desde el accesorio al dispositivo Android.

Las definiciones de código para las nuevas solicitudes de control son:

/* Control request for registering a HID device.
 * Upon registering, a unique ID is sent by the accessory in the
 * value parameter. This ID will be used for future commands for
 * the device
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID_DEVICE
 *  value:          Accessory assigned ID for the HID device
 *  index:          total length of the HID report descriptor
 *  data            none
 */
#define ACCESSORY_REGISTER_HID         54

/* Control request for unregistering a HID device.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            none
 */
#define ACCESSORY_UNREGISTER_HID         55

/* Control request for sending the HID report descriptor.
 * If the HID descriptor is longer than the endpoint zero max packet size,
 * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
 * commands. The data for the descriptor must be sent sequentially
 * if multiple packets are needed.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SET_HID_REPORT_DESC
 *  value:          Accessory assigned ID for the HID device
 *  index:          offset of data in descriptor
 *                      (needed when HID descriptor is too big for one packet)
 *  data            the HID report descriptor
 */
#define ACCESSORY_SET_HID_REPORT_DESC         56

/* Control request for sending HID events.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SEND_HID_EVENT
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            the HID report for the event
 */
#define ACCESSORY_SEND_HID_EVENT         57

Interoperabilidad con AOAv1

El protocolo original ( AOAv1 ) brinda soporte para que una aplicación de Android se comunique directamente con un host USB (accesorio) a través de USB. AOAv2 continúa con este soporte y agrega nuevas funciones para permitir que el accesorio se comunique con el propio sistema operativo Android (en concreto, los sistemas de audio y entrada). El diseño de AOAv2 hace posible crear un accesorio que utiliza el nuevo soporte de audio y HID además del conjunto de funciones original. Simplemente use las nuevas funciones junto con las funciones originales.

Conexión de AOAv2 sin una aplicación de Android

Puede diseñar un accesorio (como una base de audio) que use soporte de audio y HID pero que no se comunique con una aplicación en el dispositivo Android. Para estos accesorios, los usuarios no necesitan recibir indicaciones de diálogo para encontrar y asociar el accesorio recién agregado con una aplicación de Android que pueda comunicarse con él.

Para suprimir dichos cuadros de diálogo después de que se conecta un accesorio, el accesorio puede optar por no enviar los nombres de fabricante y modelo al dispositivo Android. Cuando estas cadenas no se proporcionan al dispositivo Android:

  • El sistema no intenta encontrar una aplicación para comunicarse con el accesorio.
  • La interfaz USB de accesorios no está presente en la configuración USB del dispositivo Android después de que el dispositivo ingresa al modo de accesorios.
,

Este documento describe los cambios en el protocolo Accesorio abierto de Android (AOA) desde su versión inicial y complementa la documentación de AOA 1.0 . AOAv2 agrega las siguientes características:

  • Salida de audio (en desuso en Android 8.0).
  • Compatibilidad con el accesorio que actúa como uno o más dispositivos de interfaz humana (HID) para el dispositivo Android.

Las API del SDK de Android disponibles para los desarrolladores de aplicaciones de Android no han cambiado.

Detección de compatibilidad con AOAv2

Para determinar si un dispositivo Android conectado admite accesorios y la versión de protocolo compatible, un accesorio debe enviar un getProtocol() y verificar el resultado. Los dispositivos Android que admiten solo las funciones de AOAv1 deben devolver 1 como versión del protocolo; los dispositivos que admiten las funciones adicionales en AOAv2 deben devolver 2 como la versión del protocolo. AOAv2 es compatible con versiones anteriores de AOAv1, por lo que los accesorios diseñados para el protocolo de accesorios original continúan funcionando con los dispositivos Android más nuevos.

El siguiente ejemplo de la biblioteca de código fuente del Kit de desarrollo de accesorios 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) demuestra esta verificación de protocolo:

bool AndroidAccessory::switchDevice(byte addr)
{
    int protocol = getProtocol(addr);
    if (protocol >= 1) {
        Serial.print("device supports protocol 1 or higher\n");
    } else {
        Serial.print("could not read device protocol version\n");
        return false;
    }

    sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer);
    sendString(addr, ACCESSORY_STRING_MODEL, model);
    sendString(addr, ACCESSORY_STRING_DESCRIPTION, description);
    sendString(addr, ACCESSORY_STRING_VERSION, version);
    sendString(addr, ACCESSORY_STRING_URI, uri);
    sendString(addr, ACCESSORY_STRING_SERIAL, serial);

    usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR |
                USB_SETUP_RECIPIENT_DEVICE, ACCESSORY_START, 0, 0, 0, 0, NULL);
    return true;
}

AOAv2 incluye nuevos ID de productos USB para cada combinación de interfaces USB disponibles en modo accesorio:

Versión identificación de producto Comunicación Descripción
AOAv1 0x2D00 accesorio Proporciona dos puntos finales masivos para comunicarse con una aplicación de Android.
0x2D01 accesorio + adb Con fines de depuración durante el desarrollo de accesorios. Disponible solo si el usuario ha habilitado la depuración de USB en la configuración del dispositivo Android.
AOAv2 0x2D02 audio Para transmitir audio desde un dispositivo Android a un accesorio.
0x2D03 audio + anuncio
0x2D04 accesorio + sonido
0x2D05 accesorio + audio + adb

Los ID de productos utilizados en AOAv1 ( 0x2D00 y 0x2D01 ) siguen siendo compatibles con AOAv2.

Soporte de audio

AOAv2 incluye soporte para la salida de audio desde un dispositivo Android a un accesorio a través de una interfaz de clase de audio USB estándar capaz de audio PCM de 16 bits de 2 canales con una tasa de bits de 44100 Khz (se pueden agregar modos de audio adicionales en el futuro).

Para habilitar el soporte de audio, el accesorio debe enviar una nueva solicitud de control USB:

**SET_AUDIO_MODE**
requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        58
value:          0 for no audio (default),
                1 for 2 channel, 16-bit PCM at 44100 KHz
index:          0
data            none

Este comando debe enviarse antes de enviar el comando ACCESSORY_START para ingresar al modo accesorio.

Soporte HID

AOAv2 permite que los accesorios registren uno o más dispositivos de interfaz humana (HID) USB con un dispositivo Android. Este enfoque invierte la dirección de la comunicación para los dispositivos USB HID típicos, como ratones y teclados USB. Normalmente, el dispositivo HID es un periférico conectado a un host USB (es decir, una computadora personal), pero en AOA el host USB puede actuar como uno o más dispositivos de entrada a un periférico USB.

El soporte de HID es un proxy para eventos HID estándar; la implementación no hace suposiciones sobre el contenido o el tipo de eventos y simplemente lo pasa al sistema de entrada, lo que permite que un accesorio AOAv2 actúe como cualquier dispositivo HID (mouse, teclado, controlador de juegos, etc.). Puede utilizar la compatibilidad con HID para proporcionar funciones básicas, como un botón de reproducción/pausa en una base multimedia, o funciones avanzadas, como una estación de conexión con un mouse y un teclado QWERTY completo.

AOAv2 agrega nuevas solicitudes de control USB que permiten que el accesorio actúe como uno o más dispositivos de entrada HID para el dispositivo Android. La compatibilidad con HID se maneja completamente a través de solicitudes de control en el punto final cero, por lo que no se necesita una nueva interfaz USB. Las cuatro nuevas solicitudes de control son:

  • ACCESSORY_REGISTER_HID registra un nuevo dispositivo HID con el dispositivo Android. El accesorio proporciona una identificación utilizada para identificar el dispositivo HID para las otras tres llamadas. Esta identificación es válida hasta que el USB se desconecte o hasta que el accesorio envíe ACCESSORY_UNREGISTER_HID para cancelar el registro del dispositivo HID.
  • ACCESSORY_UNREGISTER_HID cancela el registro de un dispositivo HID previamente registrado con ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC envía un descriptor de informe para un dispositivo HID al dispositivo Android. Esta solicitud se usa para describir las capacidades del dispositivo HID y debe enviarse antes de informar cualquier evento HID al dispositivo Android. Si el descriptor del informe es más grande que el tamaño máximo de paquete para el punto final cero, se envían varios comandos ACCESSORY_SET_HID_REPORT_DESC para transferir el descriptor completo.
  • ACCESSORY_SEND_HID_EVENT envía eventos de entrada desde el accesorio al dispositivo Android.

Las definiciones de código para las nuevas solicitudes de control son:

/* Control request for registering a HID device.
 * Upon registering, a unique ID is sent by the accessory in the
 * value parameter. This ID will be used for future commands for
 * the device
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID_DEVICE
 *  value:          Accessory assigned ID for the HID device
 *  index:          total length of the HID report descriptor
 *  data            none
 */
#define ACCESSORY_REGISTER_HID         54

/* Control request for unregistering a HID device.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_REGISTER_HID
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            none
 */
#define ACCESSORY_UNREGISTER_HID         55

/* Control request for sending the HID report descriptor.
 * If the HID descriptor is longer than the endpoint zero max packet size,
 * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC
 * commands. The data for the descriptor must be sent sequentially
 * if multiple packets are needed.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SET_HID_REPORT_DESC
 *  value:          Accessory assigned ID for the HID device
 *  index:          offset of data in descriptor
 *                      (needed when HID descriptor is too big for one packet)
 *  data            the HID report descriptor
 */
#define ACCESSORY_SET_HID_REPORT_DESC         56

/* Control request for sending HID events.
 *
 *  requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
 *  request:        ACCESSORY_SEND_HID_EVENT
 *  value:          Accessory assigned ID for the HID device
 *  index:          0
 *  data            the HID report for the event
 */
#define ACCESSORY_SEND_HID_EVENT         57

Interoperabilidad con AOAv1

El protocolo original ( AOAv1 ) brinda soporte para que una aplicación de Android se comunique directamente con un host USB (accesorio) a través de USB. AOAv2 continúa con este soporte y agrega nuevas funciones para permitir que el accesorio se comunique con el propio sistema operativo Android (en concreto, los sistemas de audio y entrada). El diseño de AOAv2 hace posible crear un accesorio que utiliza el nuevo soporte de audio y HID además del conjunto de funciones original. Simplemente use las nuevas funciones junto con las funciones originales.

Conexión de AOAv2 sin una aplicación de Android

Puede diseñar un accesorio (como una base de audio) que use soporte de audio y HID pero que no se comunique con una aplicación en el dispositivo Android. Para estos accesorios, los usuarios no necesitan recibir indicaciones de diálogo para encontrar y asociar el accesorio recién agregado con una aplicación de Android que pueda comunicarse con él.

Para suprimir dichos cuadros de diálogo después de que se conecta un accesorio, el accesorio puede optar por no enviar los nombres de fabricante y modelo al dispositivo Android. Cuando estas cadenas no se proporcionan al dispositivo Android:

  • El sistema no intenta encontrar una aplicación para comunicarse con el accesorio.
  • La interfaz USB de accesorios no está presente en la configuración USB del dispositivo Android después de que el dispositivo ingresa al modo de accesorios.