Google is committed to advancing racial equity for Black communities. See how.
Cette page a été traduite par l'API Cloud Translation.
Switch to English

Android Open Accessory Protocol 2.0

Ce document décrit les changements dans le protocole Android Open Accessory (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) avec l'appareil Android.

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

Détection du support AOAv2

Pour déterminer si un appareil Android connecté prend en charge les accessoires et la version de protocole prise en charge, un accessoire doit envoyer une commande getProtocol() et vérifier le résultat. Les appareils Android qui ne prennent en charge que les fonctionnalités d'AOAv1 doivent renvoyer 1 comme version de protocole; les périphériques qui prennent en charge les fonctions supplémentaires dans AOAv2 doivent renvoyer 2 comme version de protocole. AOAv2 est rétrocompatible avec AOAv1, de sorte que les accessoires conçus pour le protocole d'origine des accessoires continuent de fonctionner avec les nouveaux appareils Android.

L'exemple suivant du code source du kit de développement d'accessoires 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 produit USB pour chaque combinaison d'interfaces USB disponibles en mode accessoire:

Version ID produit la communication La description
AOAv1 0x2D00 accessoire Fournit deux points de terminaison en bloc 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 + adb
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 2 canaux, audio PCM 16 bits avec un débit binaire de 44100 Khz (des modes audio supplémentaires peuvent être ajoutés à l'avenir).

Pour activer la prise en charge 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 HID

AOAv2 permet aux accessoires d'enregistrer un ou plusieurs périphériques d'interface utilisateur 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 les 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 vers 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 de 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 demandes 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 de HID est entièrement gérée par le biais de demandes de contrôle sur le point de terminaison zéro, donc aucune nouvelle interface USB n'est nécessaire. Les quatre nouvelles demandes de contrôle sont:

  • ACCESSORY_REGISTER_HID enregistre un nouvel appareil HID avec l'appareil Android. L'accessoire fournit un identifiant utilisé pour identifier le périphérique HID pour les trois autres appels. Cet ID 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 annule l' enregistrement d'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 demande est utilisée pour décrire les capacités de l'appareil HID et doit être envoyée avant de signaler tout événement HID à l'appareil Android. Si le descripteur de rapport est plus grand que la taille de paquet maximale pour le point final zéro, plusieurs commandes ACCESSORY_SET_HID_REPORT_DESC sont envoyées pour transférer le descripteur entier.
  • ACCESSORY_SEND_HID_EVENT envoie les événements d'entrée de l'accessoire vers 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 ) permet à une application Android de communiquer directement avec un hôte USB (accessoire) via USB. AOAv2 continue 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 permet de créer un accessoire qui utilise le nouveau support audio et HID en plus de l'ensemble de fonctionnalités d'origine. Utilisez simplement les nouvelles fonctionnalités avec 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 le nouvel accessoire connecté à une application Android qui peut communiquer avec lui.

Pour supprimer ces boîtes de dialogue après la connexion d'un accessoire, l'accessoire peut choisir de ne pas envoyer les noms de fabricant et de 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 passe en mode accessoire.