Android Open Accessory 2.0

Ce document décrit les modifications apportées au protocole Android Open Accessory (AOA) depuis sa version initiale et ses compléments Documentation AOA 1.0 AOAv2 ajoute les fonctionnalités suivantes:

  • Sortie audio (obsolète dans Android 8.0)
  • Prise en charge de l'accessoire faisant office d'un ou de plusieurs dispositifs d'interface humaine (HID) à l'appareil Android.

Les API SDK Android disponibles pour les développeurs d'applications Android restent inchangées.

Détecter la prise en charge d'AOAv2

Pour déterminer si un appareil Android connecté est compatible avec les accessoires et version de protocole compatible, un accessoire doit envoyer un getProtocol() et vérifiez le résultat. Appareils Android uniquement compatibles avec les fonctionnalités dans AOAv1 doit renvoyer 1 comme version de protocole. appareils qui prendre en charge les fonctionnalités supplémentaires dans AOAv2 doit renvoyer 2 en tant que la version du protocole. AOAv2 est rétrocompatible avec AOAv1, de sorte que les accessoires conçus pour le protocole d'accessoire d'origine continuent de fonctionner avec les nouvelles versions d'Android appareils.

L'exemple suivant tiré du kit de développement d'accessoires de 2011 code source (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) illustre cette vérification de protocole:

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 inclut de nouveaux identifiants produit USB pour chaque combinaison d'interfaces USB disponibles en mode accessoire:

Version Identifiant produit Communication Description
AOAv1 0x2D00 accessoires Fournit deux points de terminaison groupés pour la communication avec une application Android.
0x2D01 accessoire + adb À des fins de débogage lors du développement d'accessoires. Disponible uniquement si L'utilisateur a activé le débogage USB dans les paramètres de l'appareil Android.
AOAv2 0x2D02 audio Pour diffuser des contenus audio depuis un appareil Android vers un accessoire
0x2D03 audio + adb
0x2D04 accessoire + audio
0x2D05 accessoire + audio + adb

Identifiants produit utilisés dans AOAv1 (0x2D00 et 0x2D01) restent pris en charge dans AOAv2.

Compatibilité audio

AOAv2 prend en charge la sortie audio d'un appareil Android vers via une interface de classe audio USB standard avec 2 canaux, 16 bits Audio PCM avec un débit de 44 100 kHz (des modes audio supplémentaires peuvent être ajoutés dans à l'avenir).

Pour activer la compatibilité audio, l'accessoire doit envoyer une nouvelle requête de commande 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

Cette commande doit être envoyée avant d'envoyer la ACCESSORY_START pour accéder au mode accessoire.

Compatibilité HID

AOAv2 permet aux accessoires d'enregistrer une ou plusieurs interfaces humaines USB Appareils (HID) avec un appareil Android. Cette approche inverse le sens communication pour les périphériques USB HID standards tels que les souris et les claviers USB. Normalement, le périphérique HID est un périphérique connecté à un hôte USB (par exemple, ordinateur personnel), mais dans l'AOA, l'hôte USB peut servir d'une ou plusieurs entrées des appareils à un périphérique USB.

La prise en charge HID est un proxy pour les événements HID standards. la la mise en œuvre ne fait aucune hypothèse sur le contenu ou le type des événements et le transmet simplement au système d'entrée, ce qui permet à un accessoire AOAv2 agir comme n'importe quel appareil HID (souris, clavier, manette de jeu, etc.) ; Vous pouvez utiliser HID la prise en charge de la fourniture de fonctionnalités de base, telles qu'un bouton lecture/pause sur un contenu multimédia ou pour des fonctionnalités avancées telles qu'une station d'accueil avec une souris et clavier QWERTY complet.

AOAv2 ajoute de nouvelles requêtes de contrôle USB qui permettent à l’accessoire d’agir en tant que un ou plusieurs périphériques d'entrée HID à l'appareil Android. La compatibilité HID est assurée entièrement via des requêtes de contrôle sur le point de terminaison zéro. Ainsi, aucune nouvelle interface USB n'est nécessaires. Les quatre nouvelles demandes de contrôle sont les suivantes:

  • ACCESSORY_REGISTER_HID enregistre un nouvel appareil HID avec le paramètre un appareil Android. L'accessoire fournit un ID permettant d'identifier l'appareil HID pour les trois autres appels. Cet ID est valide jusqu'à ce que la clé USB se déconnecte ou jusqu'à ce que le l'accessoire envoie ACCESSORY_UNREGISTER_HID pour annuler l'enregistrement du HID appareil.
  • ACCESSORY_UNREGISTER_HID annule l'enregistrement d'un appareil HID précédemment enregistré auprès de ACCESSORY_REGISTER_HID.
  • ACCESSORY_SET_HID_REPORT_DESC envoie un descripteur de rapport pour un appareil HID à l'appareil Android. Cette requête sert à décrire de l'appareil HID et doivent être envoyées avant de signaler tout événement HID sur l'appareil Android. Si le descripteur du rapport est plus grand que la taille maximale la taille du paquet pour le point de terminaison zéro, plusieurs Des commandes ACCESSORY_SET_HID_REPORT_DESC sont envoyées pour transférer l'intégralité du descripteur.
  • ACCESSORY_SEND_HID_EVENT envoie les événements d'entrée à partir de à l'appareil Android.

Les définitions de code pour les nouvelles requêtes de contrôle sont les suivantes:

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

Interopérabilité avec AOAv1

Le protocole original (AOAv1) permet à une application Android de communiquer directement avec un câble hôte (accessoire) via USB. AOAv2 poursuit cette prise en charge et ajoute de nouvelles fonctionnalités pour permettre à l'accessoire de communiquer avec le système d'exploitation Android lui-même (en particulier les systèmes audio et d'entrée). La conception d'AOAv2 possible de créer un accessoire compatible avec les technologies audio et HID en plus de l'ensemble de fonctionnalités d'origine. Il vous suffit d'utiliser les nouvelles fonctionnalités les caractéristiques d'origine.

Connecter AOAv2 sans Application Android

Vous pouvez concevoir un accessoire (comme une station d'accueil audio) qui utilise l'audio et le HID. mais ne communique pas avec une application sur l'appareil Android. Pour ces accessoires, les utilisateurs n'ont pas besoin de recevoir d'invites de boîte de dialogue pour trouver et associer le nouvel accessoire à une application Android qui peut communiquer avec elle.

Pour supprimer ces boîtes de dialogue après la connexion d'un accessoire, accessoire peut choisir de ne pas envoyer le nom du fabricant et du modèle au appareil. Lorsque ces chaînes ne sont pas fournies à l'appareil Android:

  • Le système ne cherche pas d'application pour communiquer avec l'accessoire.
  • L'interface USB de l'accessoire n'est pas présente dans le port USB de l'appareil Android configuration après que l'appareil est passé en mode accessoire.