Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Protocolo de accesorios abiertos de Android 2.0

Este documento describe los cambios en el protocolo de Android Open Accessory (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 han cambiado.

Detección de compatibilidad con AOAv2

Para determinar si un dispositivo Android conectado admite accesorios y la versión de protocolo admitida, un accesorio debe enviar un 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 las 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 los 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 nuevos ID de producto 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 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 ) continúan 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 capaz de audio PCM de 2 canales y 16 bits 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 una funcionalidad básica, como un botón de reproducción / pausa en una base de medios, o para una funcionalidad avanzada, como una estación de acoplamiento 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 en el dispositivo Android. El soporte de 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 que se utiliza para identificar el dispositivo HID para las otras tres llamadas. Esta ID es válida hasta que el USB se desconecte o hasta que el accesorio envíe ACCESSORY_UNREGISTER_HID para anular el registro del dispositivo HID.
  • ACCESSORY_UNREGISTER_HID anula el registro de un dispositivo HID registrado 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 utiliza para describir las capacidades del dispositivo HID y debe enviarse antes de informar cualquier evento HID al dispositivo Android. Si el descriptor de 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 ) proporciona 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 sistema operativo Android en sí (específicamente los sistemas de audio y entrada). El diseño de AOAv2 hace posible construir un accesorio que utiliza el nuevo audio y el soporte 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 utilice audio y soporte 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 encontrar y asociar el accesorio recién conectado con una aplicación de Android que pueda comunicarse con él.

Para suprimir estos 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.