Ce document décrit les modifications apportées au 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 en tant qu'un ou plusieurs périphériques d'interface humaine (HID) sur l'appareil Android.
Les API du SDK Android disponibles pour les développeurs d'applications Android ne changent pas.
Détecter la prise en charge d'AOAv2
Pour déterminer si un appareil Android connecté est compatible avec les accessoires et la version du protocole compatible, 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 appareils qui prennent en charge les fonctionnalités supplémentaires d'AOAv2 doivent renvoyer 2
comme version de protocole. AOAv2 est rétrocompatible avec AOAv1. Les accessoires conçus pour le protocole d'accessoire d'origine continuent donc de fonctionner avec les appareils Android plus récents.
L'exemple suivant de la bibliothèque de code source (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
) du kit de développement d'accessoires 2011 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 | Identifiant produit | Communication | Description |
---|---|---|---|
AOAv1 | 0x2D00 |
accessoires | Fournit deux points de terminaison groupés pour communiquer avec une application Android. |
0x2D01 |
accessoire et adb | À des fins de débogage lors du développement de l'accessoire. Disponible uniquement si l'utilisateur a activé le débogage USB dans les paramètres de l'appareil Android. | |
AOAv2 | 0x2D02 |
audio | Pour le streaming audio depuis un appareil Android vers un accessoire. |
0x2D03 |
audio + adb | ||
0x2D04 |
accessoire et audio | ||
0x2D05 |
accessoire + audio + adb |
Les ID produit utilisés dans AOAv1 (0x2D00
et 0x2D01
) restent compatibles avec AOAv2.
Compatibilité audio
AOAv2 prend en charge la sortie audio d'un appareil Android vers un accessoire via une interface de classe audio USB standard compatible avec l'audio PCM 16 bits à deux canaux avec un débit de données de 44 100 kHz (des modes audio supplémentaires peuvent être ajoutés à l'avenir).
Pour activer la compatibilité 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.
Compatibilité HID
AOAv2 permet aux accessoires d'enregistrer un ou plusieurs appareils HID (Human Interface Device) USB sur un appareil Android. Cette approche inverse le sens de la communication pour les périphériques HID USB typiques tels que les souris et les claviers USB. Normalement, l'appareil HID est un périphérique connecté à un hôte USB (par exemple, un ordinateur personnel), mais dans l'AOA, l'hôte USB peut servir de périphérique d'entrée à un périphérique USB.
La prise en charge HID est un proxy pour les événements HID standards. L'implémentation ne fait aucune hypothèse sur le contenu ou le type d'événements, et les transmet simplement au système d'entrée, ce qui permet à un accessoire AOAv2 de fonctionner comme n'importe quel appareil HID (souris, clavier, manette 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 requêtes de contrôle USB qui permettent à l'accessoire de servir de périphérique d'entrée HID à un ou plusieurs appareils Android. La prise en charge HID est entièrement gérée via des requêtes de contrôle sur le point de terminaison 0. Aucune nouvelle interface USB n'est donc nécessaire. Les quatre nouvelles requêtes de contrôle sont les suivantes:
- ACCESSORY_REGISTER_HID enregistre un nouvel appareil HID sur l'appareil Android. L'accessoire fournit un ID permettant d'identifier l'appareil HID pour les trois autres appels. Cet ID est valide jusqu'à la déconnexion USB ou jusqu'à ce que l'accessoire envoie
ACCESSORY_UNREGISTER_HID
pour désenregistrer l'appareil HID. - ACCESSORY_UNREGISTER_HID désinscrit un appareil 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 permet de décrire les fonctionnalités de l'appareil HID et doit être envoyée avant de signaler des événements HID à l'appareil Android. Si le descripteur de rapport est plus volumineux que la taille maximale de paquet pour le point de terminaison 0, 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 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 d'origine (AOAv1) permet à une application Android de communiquer directement avec un hôte USB (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 permet de créer un accessoire qui utilise la nouvelle prise en charge de l'audio et de l'HID en plus de l'ensemble de fonctionnalités d'origine. Il vous suffit d'utiliser 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 compatibilité audio et HID, mais qui ne communique pas avec une application sur l'appareil Android. Pour ces accessoires, les utilisateurs n'ont pas besoin de recevoir de boîtes de dialogue pour rechercher et associer le nouvel accessoire à une application Android pouvant communiquer avec lui.
Pour supprimer ces boîtes de dialogue une fois qu'un accessoire est connecté, l'accessoire peut choisir de ne pas envoyer le nom 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 de l'accessoire n'est pas présente dans la configuration USB de l'appareil Android une fois que l'appareil est en mode accessoire.