Accessoire ouvert Android 2.0

Ce document décrit les modifications apportées au protocole Android Open Accessories (AOA) depuis sa version initiale et complète la documentation AOA 1.0 . AOAv2 ajoute les fonctionnalités suivantes :

  • Sortie audio (obsolète dans Android 8.0).
  • Prise en charge de l'accessoire agissant comme un ou plusieurs périphériques d'interface humaine (HID) pour l'appareil Android.

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

Détection de la prise en charge d'AOAv2

Pour déterminer si un appareil Android connecté prend en charge les accessoires et la version du protocole prise en charge, un accessoire doit envoyer une commande getProtocol() et vérifier le résultat. Les appareils Android qui prennent en charge uniquement les fonctionnalités d'AOAv1 doivent renvoyer 1 comme version du protocole ; les appareils qui prennent en charge les fonctionnalités supplémentaires dans AOAv2 doivent renvoyer 2 comme 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 appareils Android les plus récents.

L'exemple suivant de la bibliothèque de code source d'Accessory Development Kit 2011 ( <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 de produits USB pour chaque combinaison d'interfaces USB disponibles en mode accessoire :

Version Identifiant du produit Communication Description
AOAv1 0x2D00 accessoire Fournit deux points de terminaison en masse pour communiquer 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 l'audio Pour diffuser de l'audio depuis un appareil Android vers un accessoire.
0x2D03 audio + bd
0x2D04 accessoire + audio
0x2D05 accessoire + audio + adb

Les ID de produit utilisés dans AOAv1 ( 0x2D00 et 0x2D01 ) continuent d'être pris en charge dans AOAv2.

Prise en charge audio

AOAv2 inclut la prise en charge de la sortie audio d'un appareil Android vers un accessoire via une interface de classe audio USB standard capable de fournir un son PCM 16 bits à 2 canaux avec un débit binaire de 44 100 Khz (des modes audio supplémentaires pourraient être ajoutés à l'avenir).

Pour activer le support audio, l'accessoire doit envoyer une nouvelle demande de contrôle 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 commande ACCESSORY_START pour passer en mode accessoire.

Prise en charge CACHÉE

AOAv2 permet aux accessoires d'enregistrer un ou plusieurs périphériques d'interface humaine USB (HID) avec un appareil Android. Cette approche inverse le sens de communication pour les périphériques USB HID typiques tels que les souris et claviers USB. Normalement, le périphérique HID est un périphérique connecté à un hôte USB (c'est-à-dire un ordinateur personnel), mais en AOA, l'hôte USB peut agir comme un ou plusieurs périphériques d'entrée sur un périphérique USB.

La prise en charge HID est un proxy pour les événements HID standard ; l'implémentation ne fait aucune hypothèse sur le contenu ou le type d'événements et le transmet simplement au système d'entrée, permettant à un accessoire AOAv2 d'agir comme n'importe quel périphérique HID (souris, clavier, contrôleur de jeu, etc.). Vous pouvez utiliser la prise en charge HID pour fournir des fonctionnalités de base, telles qu'un bouton lecture/pause sur une station d'accueil multimédia, ou pour des fonctionnalités avancées telles qu'une station d'accueil avec une souris et un clavier QWERTY complet.

AOAv2 ajoute de nouvelles requêtes de contrôle USB qui permettent à l'accessoire d'agir comme un ou plusieurs périphériques d'entrée HID sur l'appareil Android. La prise en charge HID est entièrement gérée via des requêtes de contrôle sur le point final zéro, aucune nouvelle interface USB n'est donc nécessaire. Les quatre nouvelles demandes de contrôle sont :

  • ACCESSORY_REGISTER_HID enregistre un nouveau périphérique HID avec le périphérique Android. L'accessoire fournit un identifiant utilisé pour identifier le périphérique HID pour les trois autres appels. Cet identifiant est valide jusqu'à ce que l'USB se déconnecte ou jusqu'à ce que l'accessoire envoie ACCESSORY_UNREGISTER_HID pour désenregistrer le périphérique HID.
  • ACCESSORY_UNREGISTER_HID désenregistre un périphérique HID précédemment enregistré avec ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC envoie un descripteur de rapport pour un appareil HID à l'appareil Android. Cette requête est utilisée pour décrire les capacités du périphérique HID et doit être envoyée avant de signaler tout événement HID au périphérique Android. Si le descripteur de rapport est supérieur à la taille maximale du paquet pour le point de terminaison zéro, plusieurs commandes ACCESSORY_SET_HID_REPORT_DESC sont envoyées pour transférer l'intégralité du descripteur.
  • ACCESSORY_SEND_HID_EVENT envoie des événements d'entrée de l'accessoire à l'appareil Android.

Les définitions de code pour les nouvelles demandes de contrôle sont :

/* 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 d'origine ( AOAv1 ) prend en charge une application Android pour communiquer directement avec un hôte USB (accessoire) via USB. AOAv2 poursuit ce support 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 permet de créer un accessoire qui utilise le nouveau support audio et HID en plus de l'ensemble des fonctionnalités d'origine. Utilisez simplement les nouvelles fonctionnalités ainsi que les fonctionnalités d’origine.

Connecter AOAv2 sans application Android

Vous pouvez concevoir un accessoire (tel qu'une station d'accueil audio) qui utilise la prise en charge audio et HID mais ne communique pas avec une application sur l'appareil Android. Pour ces accessoires, les utilisateurs n'ont pas besoin de recevoir des invites de dialogue pour rechercher et associer l'accessoire nouvellement connecté à une application Android pouvant communiquer avec lui.

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

  • Le système ne tente pas de trouver une application pour communiquer avec l'accessoire.
  • L'interface USB accessoire n'est pas présente dans la configuration USB de l'appareil Android une fois que l'appareil est passé en mode accessoire.