Android Open Accessory Protocol 1.0

Les accessoires USB Android doivent adhérer au protocole Android Open Accessory (AOA), qui définit la manière dont un accessoire détecte et configure la communication avec un appareil Android. Les accessoires doivent suivre les étapes suivantes:

  1. Attendez et détectez un appareil connecté.
  2. Déterminez la prise en charge du mode accessoire de l'appareil.
  3. Essayez de démarrer l'appareil en mode accessoire (si nécessaire).
  4. Si l'appareil prend en charge AOA, établissez la communication avec l'appareil.

Les sections suivantes expliquent comment implémenter ces étapes.

Attendez et détectez les appareils connectés

Les accessoires doivent vérifier en permanence les appareils Android connectés. Lorsqu'un appareil est connecté, l'accessoire doit déterminer si l'appareil prend en charge le mode accessoire.

Déterminer la prise en charge du mode accessoire

Lorsqu'un appareil Android se connecte, il peut être dans l'un des trois états suivants:

  • Prend en charge le mode accessoire Android et est déjà en mode accessoire.
  • Prend en charge le mode accessoire Android mais il n'est pas en mode accessoire.
  • Ne prend pas en charge le mode accessoire Android.

Lors de la connexion initiale, l'accessoire doit vérifier la version, l'ID du fournisseur et l'ID de produit du descripteur de périphérique USB de l'appareil connecté. L'ID du fournisseur doit correspondre à l'ID de Google ( 0x18D1 ). Si l'appareil est déjà en mode accessoire, l'ID du produit doit être 0x2D00 ou 0x2D01 et l'accessoire peut établir la communication avec l'appareil via des points de terminaison de transfert en bloc en utilisant son propre protocole de communication (l'appareil n'a pas besoin d'être démarré en mode accessoire).

Remarque: 0x2D00 est réservé aux appareils Android 0x2D00 charge le mode accessoire. 0x2D01 est réservé aux appareils 0x2D01 charge le mode accessoire ainsi que le protocole Android Debug Bridge (ADB), qui expose une deuxième interface avec deux points de terminaison en bloc pour ADB. Vous pouvez utiliser ces points de terminaison pour déboguer l'application accessoire si vous simulez l'accessoire sur un ordinateur. En général, n'utilisez pas cette interface à moins que l'accessoire n'implémente un passthrough vers ADB sur l'appareil.

Si la version, l'ID fournisseur ou l'ID produit dans le descripteur de périphérique USB ne correspondent pas aux valeurs attendues, l'accessoire ne peut pas déterminer si l'appareil prend en charge le mode accessoire Android. L'accessoire doit tenter de démarrer l'appareil en mode accessoire (détaillé ci-dessous) pour déterminer la prise en charge de l'appareil.

Point clé: un accessoire USB doit envoyer un en-tête lors de la prise de contact initiale. L'en-tête contient le fabricant, le modèle et la version. Bien que la version soit un champ facultatif, si une application Android installée ne correspond qu'à la version, mais que l'accessoire n'envoie pas de version, les appareils Android fonctionnant sous Android 10 et inférieurs redémarreront en raison d'une exception lancée dans le processus système.

Tentative de démarrage en mode accessoire

Si la version, le fournisseur et les ID de produit ne correspondent pas à un appareil Android en mode accessoire, l'accessoire ne peut pas déterminer si l'appareil prend en charge (mais n'est pas en) mode accessoire ou si l'appareil ne prend pas en charge le mode accessoire. Cela peut se produire car les périphériques qui prennent en charge le mode accessoire (mais ne sont pas en mode accessoire) signalent initialement le fabricant du périphérique et les ID de produit au lieu du fournisseur AOA et des ID de produit.

L'accessoire doit essayer de démarrer l'appareil en mode accessoire pour déterminer si l'appareil prend en charge ce mode:

  1. Envoyez une demande de contrôle 51 («Get Protocol») pour déterminer si l'appareil prend en charge le protocole accessoire Android. Si le périphérique prend en charge le protocole, il renvoie un nombre différent de zéro qui représente la version de protocole prise en charge. La demande de contrôle est sur le point final 0 avec les caractéristiques suivantes:
    requestType:    USB_DIR_IN | USB_TYPE_VENDOR
    request:        51
    value:          0
    index:          0
    data:           protocol version number (16 bits little endian sent from the
                    device to the accessory)
    
  2. Si l'appareil renvoie une version de protocole prise en charge, envoyez une demande de contrôle avec des informations de chaîne d'identification à l'appareil. Ces informations permettent à l'appareil de déterminer une application appropriée pour l'accessoire (ou de présenter une URL à l'utilisateur si une application appropriée n'existe pas). La demande de contrôle est sur le point final 0 (pour chaque ID de chaîne) avec les caractéristiques suivantes:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    Les ID de chaîne suivants sont pris en charge, avec une taille maximale de 256 octets pour chaque chaîne (doit se terminer par un zéro par \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Envoyez une demande de contrôle pour demander à l'appareil de démarrer en mode accessoire. La demande de contrôle est sur le point final 0 avec les caractéristiques suivantes:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Une fois ces étapes terminées, l'accessoire doit attendre que le périphérique USB connecté se réintroduise sur le bus en mode accessoire, puis réénumérer les périphériques connectés. L'algorithme détermine la prise en charge du mode accessoire en vérifiant les ID de fournisseur et de produit, qui doivent être corrects (par exemple, correspondre aux ID de fournisseur et de produit de Google au lieu des ID du fabricant de l'appareil) si l'appareil est passé avec succès en mode accessoire. Si les identifiants et la version sont corrects, l'accessoire se déplace pour établir la communication avec l'appareil .

Remarque: AOA ne prend actuellement pas en charge les connexions AOA et MTP simultanées. Pour passer d'AOA à MTP, l'accessoire doit d'abord déconnecter le périphérique USB (physiquement ou d'une manière électriquement équivalente), puis se reconnecter à l'aide du MTP.

Si une étape échoue, l'accessoire détermine que l'appareil ne prend pas en charge le mode accessoire Android et attend que l'appareil suivant se connecte.

Établir la communication avec l'appareil

Si l'accessoire détecte un appareil Android en mode accessoire, l'accessoire peut interroger l'interface de l'appareil et les descripteurs de point de terminaison pour obtenir les points de terminaison en bloc pour communiquer avec l'appareil.

Le nombre d'interfaces et de points de terminaison en bloc dépend de l'ID du produit. Un appareil Android avec un ID produit de:

  • 0x2D00 a une interface avec deux points de terminaison en bloc pour la communication d'entrée et de sortie.
  • 0x2D01 a deux interfaces avec deux points de terminaison en bloc chacun pour la communication d'entrée et de sortie. La première interface gère la communication standard et la seconde interface gère la communication ADB. Pour utiliser une interface, recherchez les premiers points de terminaison d'entrée et de sortie en bloc, définissez la configuration de périphérique sur la valeur 1 avec une demande de périphérique SET_CONFIGURATION ( 0x09 ), puis communiquez à l'aide des points de terminaison.