Android Open Accessory 2.0

Questo documento descrive le modifiche apportate al protocollo Android Open Accessory (AOA) dalla sua prima release e integra la documentazione di AOA 1.0. AOAv2 aggiunge le seguenti funzionalità:

  • Uscita audio (rivendicata in Android 8.0).
  • Supporto dell'accessorio che agisce come uno o più dispositivi di interfaccia umana (HID) sul dispositivo Android.

Le API Android SDK disponibili per gli sviluppatori di app Android rimangono invariate.

Rileva il supporto di AOAv2

Per determinare se un dispositivo Android connesso supporta gli accessori e la versione del protocollo supportata, un accessorio deve inviare un comando getProtocol() e controllare il risultato. I dispositivi Android che supportano solo le funzionalità di AOAv1 devono restituire 1 come versione del protocollo; i dispositivi che supportano le funzionalità aggiuntive di AOAv2 devono restituire 1 come versione del protocollo.2 AOAv2 è compatibile con AOAv1, quindi gli accessori progettati per il protocollo di accessorio originale continuano a funzionare con i dispositivi Android più recenti.

Il seguente esempio della libreria del codice sorgente (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) del kit di sviluppo per accessori 2011 mostra questo controllo del protocollo:

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 include nuovi ID prodotto USB per ogni combinazione di interfacce USB disponibili in modalità accessorio:

Versione ID prodotto Comunicazione Descrizione
AOAv1 0x2D00 accessorio Fornisce due endpoint collettivi per la comunicazione con un'app per Android.
0x2D01 accessorio + adb A scopo di debug durante lo sviluppo dell'accessorio. Disponibile solo se l'utente ha attivato la debug USB nelle impostazioni del dispositivo Android.
AOAv2 0x2D02 audio Per lo streaming audio da un dispositivo Android a un accessorio.
0x2D03 audio + adb
0x2D04 accessorio + audio
0x2D05 accessorio + audio + adb

Gli ID prodotto utilizzati in AOAv1 (0x2D00 e 0x2D01) continueranno a essere supportati in AOAv2.

Supporto audio

AOAv2 include il supporto per l'uscita audio da un dispositivo Android a un accessorio tramite un'interfaccia di classe audio USB standard in grado di gestire audio PCM a 2 canali e 16 bit con una velocità in bit di 44100 Khz (in futuro potrebbero essere aggiunte altre modalità audio).

Per attivare il supporto audio, l'accessorio deve inviare una nuova richiesta di controllo 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

Questo comando deve essere inviato prima di inviare il comando ACCESSORY_START per entrare in modalità accessorio.

Supporto HID

AOAv2 consente agli accessori di registrare uno o più dispositivi USB Human Interface (HID) con un dispositivo Android. Questo approccio inverte la direzione della comunicazione per i tipici dispositivi HID USB come mouse e tastiere USB. In genere, il dispositivo HID è una periferica collegata a un host USB (ad es. un personal computer), ma in AOA l'host USB può fungere da uno o più dispositivi di input per una periferica USB.

Il supporto HID è un proxy per gli eventi HID standard. L'implementazione non fa supposizioni sui contenuti o sul tipo di eventi e li passa semplicemente al sistema di input, consentendo a un accessorio AOAv2 di fungere da qualsiasi dispositivo HID (mouse, tastiera, controller di gioco e così via). Puoi utilizzare il supporto HID per fornire funzionalità di base, come un pulsante di riproduzione/pausa su una base multimediale, o funzionalità avanzate come una base di ricarica con un mouse e una tastiera QWERTY completa.

AOAv2 aggiunge nuove richieste di controllo USB che consentono all'accessorio di fungere da uno o più dispositivi di input HID per il dispositivo Android. Il supporto HID viene gestito interamente tramite richieste di controllo sull'endpoint zero, pertanto non è necessaria una nuova interfaccia USB. Le quattro nuove richieste di controllo sono:

  • ACCESSORY_REGISTER_HID registra un nuovo dispositivo HID con il dispositivo Android. L'accessorio fornisce un ID utilizzato per identificare il dispositivo HID per le altre tre chiamate. Questo ID è valido fino alla disconnessione USB o fino a quando l'accessorio non invia ACCESSORY_UNREGISTER_HID per annullare la registrazione del dispositivo HID.
  • ACCESSORY_UNREGISTER_HID annulla la registrazione di un dispositivo HID precedentemente registrato con ACCESSORY_REGISTER_HID.
  • ACCESSORY_SET_HID_REPORT_DESC invia un descrittore report per un dispositivo HID al dispositivo Android. Questa richiesta viene utilizzata per descrivere le funzionalità del dispositivo HID e deve essere inviata prima di segnalare eventuali eventi HID al dispositivo Android. Se il descrittore del report è più grande della dimensione massima del pacchetto per l'endpoint zero, vengono inviati più comandi ACCESSORY_SET_HID_REPORT_DESC per trasferire l'intero descrittore.
  • ACCESSORY_SEND_HID_EVENT invia eventi di input dall'accessorio al dispositivo Android.

Le definizioni di codice per le nuove richieste di controllo sono:

/* 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

Interoperabilità con AOAv1

Il protocollo originale (AOAv1) supporta la comunicazione diretta di un'app per Android con un host USB (accessorio) tramite USB. AOAv2 continua questo supporto e aggiunge nuove funzionalità per consentire all'accessorio di comunicare con il sistema operativo Android stesso (in particolare i sistemi audio e di input). Il design di AOAv2 consente di creare un accessorio che utilizza il nuovo supporto audio e HID oltre al set di funzionalità originale. Basta utilizzare le nuove funzionalità insieme alle funzionalità originali.

Connettere AOAv2 senza un'app per Android

Puoi progettare un accessorio (ad esempio una base di ricarica audio) che supporti l'audio e HID, ma che non comunichi con un'app sul dispositivo Android. Per questi accessori, gli utenti non devono ricevere richieste di dialogo per trovare e associare l'accessorio appena collegato a un'app per Android che può comunicare con esso.

Per eliminare queste finestre di dialogo dopo la connessione di un accessorio, l'accessorio può scegliere di non inviare i nomi del produttore e del modello al dispositivo Android. Quando queste stringhe non vengono fornite al dispositivo Android:

  • Il sistema non tenta di trovare un'app per comunicare con l'accessorio.
  • L'interfaccia USB dell'accessorio non è presente nella configurazione USB del dispositivo Android dopo che il dispositivo entra in modalità accessorio.