Android Open Accessory 2.0

En este documento, se describen los cambios en el protocolo de Android Open Accessory (AOA) desde su lanzamiento inicial y complementa Documentación de AOA 1.0. AOAv2 agrega las siguientes funciones:

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

No se modificaron las APIs del SDK de Android disponibles para desarrolladores de apps para Android.

Compatibilidad de detección de AOAv2

Para determinar si un dispositivo Android conectado admite accesorios y el versión de protocolo compatible, un accesorio debe enviar un getProtocol() y verifica el resultado. Dispositivos Android que solo admiten las funciones en AOAv1 debe mostrar 1 como la versión del protocolo. dispositivos que admitir funciones adicionales en AOAv2 debe mostrar 2 como el versión del protocolo. AOAv2 es retrocompatible con AOAv1, así que los accesorios diseñados para el protocolo de accesorios original siguen funcionando con los dispositivos dispositivos.

El siguiente ejemplo del kit de desarrollo de accesorios 2011 código fuente (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp). biblioteca 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 IDs de producto USB para cada combinación de interfaces USB disponibles en el modo de accesorio:

Versión ID del producto Comunicación Descripción
AOAv1 0x2D00 accesorio Proporciona dos extremos masivos para comunicarse con una app para Android.
0x2D01 accesorio + adb Para depurar durante el desarrollo de accesorios Solo está disponible si se Si el usuario habilitó la Depuración por USB en la configuración del dispositivo Android
AOAv2 0x2D02 Audio Para transmitir audio de un dispositivo Android a un accesorio.
0x2D03 audio + adb
0x2D04 accesorio + audio
0x2D05 accesorio + audio + adb

ID de productos usados en AOAv1 (0x2D00 y 0x2D01) seguirán siendo compatibles con AOAv2.

Compatibilidad con audio

AOAv2 admite salida de audio desde un dispositivo Android hacia una mediante una interfaz de clase de audio USB estándar con capacidad de 2 canales, 16 bits Audio PCM con una tasa de bits de 44,100 kHz (se pueden agregar modos de audio adicionales en el futuro).

Para habilitar la compatibilidad con audio, el accesorio debe enviar una nueva solicitud de control por 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 se debe enviar antes de enviar el Comando ACCESSORY_START para ingresar al modo de accesorio.

Compatibilidad con HID

AOAv2 permite que los accesorios registren una o más interfaces humanas USB Dispositivos (HID) con un dispositivo Android. Este enfoque invierte la dirección de para dispositivos USB HID típicos, como mouse y teclados USB. Por lo general, el dispositivo HID es un periférico conectado a un host USB (es decir, un computadora personal), pero, en AOA, el host USB puede actuar como una o más entradas a un periférico USB.

La compatibilidad con HID es un proxy para eventos HID estándar. el implementación no hace suposiciones sobre el contenido o el tipo de eventos y lo pasa al sistema de entrada, lo que permite que un accesorio AOAv2 actuar como cualquier dispositivo HID (mouse, teclado, control de juegos, etc.) Puedes usar HID compatibilidad para proporcionar funcionalidad básica, como un botón de reproducción/pausa en un contenido multimedia, o para funcionalidades avanzadas, como una base de conexión 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. Se maneja la compatibilidad con HID completamente a través de solicitudes de control en el endpoint cero, por lo que no se necesita una nueva interfaz según tus necesidades. Las cuatro solicitudes de control nuevas son las siguientes:

  • ACCESSORY_REGISTER_HID registra un dispositivo HID nuevo con el dispositivo Android. El accesorio proporciona un ID que se utiliza para identificar el dispositivo HID para para las otras tres llamadas. Este ID es válido hasta que se desconecte el USB o hasta que el el accesorio envía ACCESSORY_UNREGISTER_HID para cancelar el registro del HID dispositivo.
  • ACCESSORY_UNREGISTER_HID cancela el registro de un dispositivo HID registrada previamente 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 la capacidades del dispositivo HID y deben enviarse antes de informar cualquier evento HID al dispositivo Android. Si el descriptor de informe es mayor que el máximo tamaño del paquete para el extremo cero, varios se envían 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 las siguientes:

/* 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) admite que una app para Android se comunique directamente con un dispositivo USB host (accesorio) a través de USB. AOAv2 continúa brindando asistencia y agrega funciones nuevas para permitir que el accesorio se comunique con el propio sistema operativo Android (específicamente, los sistemas de audio y entrada). El diseño de AOAv2 hace que sea Se puede crear un accesorio que use la nueva compatibilidad con audio y HID además del conjunto de atributos original. Simplemente usa las nuevas funciones junto con los atributos originales.

Conecta AOAv2 sin un App para Android

Puedes diseñar un accesorio (como una base de audio) que utilice audio y HID. pero no se comunica con una app en el dispositivo Android. Para estos accesorios, los usuarios no necesitan recibir mensajes de diálogo para encontrar y asociar el accesorio recientemente conectado a una app para Android que pueda comunicarte con ella.

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

  • El sistema no intenta encontrar una app para comunicarse con el accesorio.
  • La interfaz USB del accesorio no está presente en el USB del dispositivo Android después de que el dispositivo entre en modo de accesorio.