Accesorio abierto de Android 2.0

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

  • Salida de audio (obsoleta en Android 8.0).
  • Soporte para 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 se modifican.

Detectando soporte AOAv2

Para determinar si un dispositivo Android conectado admite accesorios y la versión del protocolo compatible, un accesorio debe enviar un comando getProtocol() y verificar el resultado. Los dispositivos Android que solo admiten las funciones de AOAv1 deben devolver 1 como versión del protocolo; Los dispositivos que admiten funciones adicionales en AOAv2 deben devolver 2 como 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 dispositivos Android más nuevos.

El siguiente ejemplo del 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 nuevas ID de productos USB para cada combinación de interfaces USB disponibles en el modo accesorio:

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

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

Soporte de audio

AOAv2 incluye soporte para salida de audio desde un dispositivo Android a un accesorio a través de una interfaz de clase de audio USB estándar con capacidad de audio PCM de 16 bits y 2 canales con una velocidad de bits de 44100 Khz (es posible que se agreguen modos de audio adicionales en el futuro).

Para habilitar la compatibilidad con 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 oculto

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 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 los pasa al sistema de entrada, lo que permite que un accesorio AOAv2 actúe como cualquier dispositivo HID (ratón, teclado, controlador de juego, 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 para funciones avanzadas, como una estación de acoplamiento con mouse y 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 al dispositivo Android. La compatibilidad con HID se gestiona 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 que se utiliza 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 utiliza 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 mayor 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 características para permitir que el accesorio se comunique con el propio sistema operativo Android (específicamente los sistemas de entrada y audio). El diseño de AOAv2 permite crear un accesorio que utiliza el nuevo audio y compatibilidad con HID además del conjunto de funciones originales. Simplemente utilice 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 utilice audio y compatibilidad con HID pero que no se comunique con una aplicación en el dispositivo Android. Para estos accesorios, los usuarios no necesitan recibir mensajes de diálogo para buscar y asociar el accesorio recién conectado 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 del fabricante y del 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 accesoria no está presente en la configuración USB del dispositivo Android después de que el dispositivo ingresa al modo accesorio.