Acessório aberto Android 2.0

Este documento descreve alterações no protocolo Android Open Acessório (AOA) desde seu lançamento inicial e complementa a documentação do AOA 1.0 . AOAv2 adiciona os seguintes recursos:

  • Saída de áudio (obsoleto no Android 8.0).
  • Suporte para o acessório atuar como um ou mais dispositivos de interface humana (HIDs) para o dispositivo Android.

As APIs do Android SDK disponíveis para desenvolvedores de aplicativos Android permanecem inalteradas.

Detectando suporte AOAv2

Para determinar se um dispositivo Android conectado suporta acessórios e a versão do protocolo compatível, um acessório deve enviar um comando getProtocol() e verificar o resultado. Dispositivos Android que suportam apenas os recursos do AOAv1 devem retornar 1 como a versão do protocolo; dispositivos que suportam recursos adicionais no AOAv2 devem retornar 2 como a versão do protocolo. O AOAv2 é compatível com versões anteriores do AOAv1, portanto, os acessórios projetados para o protocolo de acessórios original continuam a funcionar com dispositivos Android mais recentes.

O exemplo a seguir da biblioteca de código-fonte do Accessory Development Kit 2011 ( <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;
}

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

Versão ID do produto Comunicação Descrição
AOAv1 0x2D00 acessório Fornece dois pontos de extremidade em massa para comunicação com um aplicativo Android.
0x2D01 acessório + adb Para fins de depuração durante o desenvolvimento de acessórios. Disponível apenas se o usuário tiver habilitado a depuração USB nas configurações do dispositivo Android.
AOAv2 0x2D02 áudio Para transmitir áudio de um dispositivo Android para um acessório.
0x2D03 áudio + adb
0x2D04 acessório + áudio
0x2D05 acessório + áudio + adb

Os IDs de produto usados ​​no AOAv1 ( 0x2D00 e 0x2D01 ) continuam a ser suportados no AOAv2.

Suporte de áudio

AOAv2 inclui suporte para saída de áudio de um dispositivo Android para um acessório por meio de uma interface de classe de áudio USB padrão capaz de áudio PCM de 16 bits e 2 canais com uma taxa de bits de 44100 Khz (modos de áudio adicionais podem ser adicionados no futuro).

Para ativar o suporte de áudio, o acessório deve 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

Este comando deve ser enviado antes de enviar o comando ACCESSORY_START para entrar no modo acessório.

Suporte HID

AOAv2 permite que acessórios registrem um ou mais dispositivos de interface humana USB (HID) com um dispositivo Android. Essa abordagem inverte a direção da 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 (ou seja, um computador pessoal), mas no AOA o host USB pode atuar como um ou mais dispositivos de entrada para um periférico USB.

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

AOAv2 adiciona novas solicitações de controle USB que permitem que o acessório atue como um ou mais dispositivos de entrada HID para o dispositivo Android. O suporte HID é gerenciado inteiramente por meio de solicitações de controle no endpoint zero, portanto, nenhuma nova interface USB é necessária. 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 as outras três chamadas. Este ID é válido até que o USB seja desconectado ou até que o acessório envie ACCESSORY_UNREGISTER_HID para cancelar o registro do dispositivo HID.
  • 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 de um dispositivo HID para o dispositivo Android. Essa solicitação é usada para descrever os recursos do dispositivo HID e deve ser enviada antes de relatar qualquer evento HID ao dispositivo Android. Se o descritor de relatório for maior que o tamanho máximo do pacote para o terminal zero, vários comandos ACCESSORY_SET_HID_REPORT_DESC serão enviados para transferir todo o descritor.
  • ACCESSORY_SEND_HID_EVENT envia eventos de entrada do acessório para o 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 ) fornece suporte para um aplicativo Android se comunicar diretamente com um host USB (acessório) via USB. AOAv2 dá continuidade a 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 entrada). O design do AOAv2 possibilita a construção de um acessório que utiliza o novo suporte de áudio e HID além do conjunto de recursos original. Basta usar os novos recursos junto com os recursos originais.

Conectando AOAv2 sem um aplicativo Android

Você pode projetar um acessório (como um dock de áudio) que use áudio e suporte HID, mas não se comunique com um aplicativo no dispositivo Android. Para esses acessórios, os usuários não precisam receber solicitações de diálogo para localizar e associar o acessório recém-conectado a um aplicativo Android que possa 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 Android. Quando essas strings não são fornecidas ao dispositivo Android:

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