Acessório do Android Open 2.0

Este documento descreve as mudanças no protocolo do Android Open Accessory (AOA) desde o lançamento inicial e complementa Documentação do AOA 1.0. AOAv2 adiciona os seguintes recursos:

  • Saída de áudio (descontinuada no Android 8.0).
  • Suporte para o acessório atuar como um ou mais dispositivos de interface humana (HIDs, na sigla em inglês) ao dispositivo Android.

As APIs do SDK do Android disponíveis para os desenvolvedores de apps Android não foram alteradas.

Detectar suporte a AOAv2

Para determinar se um dispositivo Android conectado é compatível com acessórios e os versão do protocolo compatível, um acessório precisa enviar uma solicitação getProtocol() e verifique o resultado. Dispositivos Android compatíveis apenas com os recursos em AOAv1 precisa retornar 1 como a versão do protocolo. dispositivos que oferecer suporte aos recursos adicionais na AOAv2 precisa retornar 2, pois o e a versão do protocolo. O AOAv2 é compatível com versões anteriores do AOAv1, então os acessórios projetados para o protocolo de acessório original continuam a funcionar com dispositivos Android dispositivos.

O exemplo a seguir do Kit de Desenvolvimento de Acessórios 2011 código-fonte (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) demonstra essa verificação de protocolo:

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;
}

A AOAv2 inclui novos IDs de produtos USB para cada combinação de interfaces USB. disponíveis no modo de acessório:

Versão ID do produto Comunicação Descrição
AOAv1 0x2D00 acessórios Oferece dois endpoints em massa para comunicação com um app Android.
0x2D01 acessório + adb Para fins de depuração durante o desenvolvimento do acessório. Disponível apenas se o o usuário ativou a Depuração USB nas configurações do dispositivo Android.
AOAv2 0x2D02 vários idiomas Para fazer streaming de áudio de um dispositivo Android para um acessório.
0x2D03 áudio + adb
0x2D04 acessório + áudio
0x2D05 acessório + áudio + adb

IDs do produto usados no AOAv1 (0x2D00 e 0x2D01) continuam sendo compatíveis com AOAv2.

Compatibilidade de áudio

A AOAv2 inclui suporte para saída de áudio de um dispositivo Android para um por uma interface de classe de áudio USB padrão com capacidade de 2 canais, 16 bits Áudio PCM com taxa de bits de 44.100 Khz (outros modos de áudio podem ser adicionados ao no futuro).

Para ativar o suporte a áudio, o acessório precisa enviar uma nova solicitação de controle 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

Esse comando deve ser enviado antes de enviar a Comando ACCESSORY_START para entrar no modo de acessório.

Compatibilidade com HID

A AOAv2 permite que os acessórios registrem uma ou mais interfaces humanas USB. Dispositivos (HID) com um dispositivo Android. Essa abordagem inverte a direção de comunicação para dispositivos USB HID típicos, como mouses e teclados USB. Normalmente, o dispositivo HID é um periférico conectado a um host USB (por exemplo, um computador pessoal), mas, na AOA, o host USB pode atuar como uma ou mais dispositivos a um periférico USB.

O suporte a HID é um proxy para eventos HID padrão. as implementação não faz suposições sobre o conteúdo ou tipo de eventos e simplesmente o passa para o sistema de entrada, permitindo que um acessório AOAv2 atuam como qualquer dispositivo HID (mouse, teclado, controle de jogo etc.). Você pode usar um HID para oferecer funcionalidades básicas, como um botão para reproduzir/pausar em uma mídia ou para funcionalidades avançadas, como uma dock station com mouse e teclado QWERTY completo.

A AOAv2 adiciona novas solicitações de controle USB que permitem que o acessório atue como um ou mais dispositivos de entrada HID ao dispositivo Android. Suporte a HID disponível inteiramente através de solicitações de controle no endpoint zero, de modo que nenhuma nova interface USB é necessários. As quatro novas solicitações de controle são:

  • ACCESSORY_REGISTER_HID registra um novo dispositivo HID com o dispositivo Android. O acessório fornece um ID usado para identificar o dispositivo HID para das outras três chamadas. Esse ID é válido até o USB se desconectar ou até que o o acessório envia ACCESSORY_UNREGISTER_HID para cancelar o registro do HID; dispositivo.
  • ACCESSORY_UNREGISTER_HID cancela o registro de um dispositivo HID registrado anteriormente com ACCESSORY_REGISTER_HID.
  • ACCESSORY_SET_HID_REPORT_DESC envia um descritor de relatório para um dispositivo HID ao dispositivo Android. Essa solicitação é usada para descrever do dispositivo HID e deve ser enviada antes de relatar qualquer evento HID ao dispositivo Android. Se o descritor do relatório for maior que o máximo tamanho do pacote para o endpoint zero, vários Os comandos ACCESSORY_SET_HID_REPORT_DESC são enviados para transferir descritor completo.
  • ACCESSORY_SEND_HID_EVENT envia eventos de entrada do ao dispositivo Android.

As definições de código para as novas solicitações de controle são:

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

Interoperabilidade com AOAv1

O protocolo original (AOAv1). oferece suporte para que um app Android se comunique diretamente com uma porta USB (acessório) por USB. A AOAv2 continua com esse suporte e adiciona novos recursos para permitir que o acessório se comunique com o próprio sistema operacional Android. (especificamente os sistemas de áudio e de entrada). O design do AOAv2 facilita possível criar um acessório que use o novo suporte a áudio e HID além do conjunto de atributos original. Basta usar os novos recursos os recursos originais.

Conectar AOAv2 sem uma App Android

Você pode projetar um acessório (como uma base de áudio) que use áudio e HID é compatível, mas não se comunica com um app no dispositivo Android. Para esses acessórios, os usuários não precisam receber solicitações de caixa de diálogo para localizar e associar o acessório recém-anexado a um aplicativo Android que pode se comunicar com ele.

Para suprimir essas caixas de diálogo após a conexão de um acessório, o acessório pode optar por não enviar os nomes do fabricante e do modelo para o dispositivo. Quando essas strings não são fornecidas ao dispositivo Android:

  • O sistema não tenta encontrar um app para se comunicar com o acessório.
  • A interface USB do acessório não está presente no USB do dispositivo Android. configuração depois que o dispositivo entra no modo de acessório.