O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Android Open Accessory Protocol 2.0

Este documento descreve as mudanças no protocolo Android Open Accessory (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 que atua 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 não foram alteradas.

Detectando suporte AOAv2

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

O exemplo a seguir da biblioteca de código-fonte do Kit de Desenvolvimento de Acessórios 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) demonstra esta 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 endpoints em massa para comunicação com um aplicativo Android.
0x2D01 acessório + adb Para fins de depuração durante o desenvolvimento do acessório. Disponível apenas se o usuário ativou a Depuração de USB nas configurações do dispositivo Android.
AOAv2 0x2D02 audio Para streaming de áudio de um dispositivo Android para um acessório.
0x2D03 audio + adb
0x2D04 acessório + áudio
0x2D05 acessório + áudio + adb

IDs de produto usados ​​em AOAv1 ( 0x2D00 e 0x2D01 ) continuam a ser suportados em 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 2 canais, áudio PCM de 16 bits 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 os 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 HID USB 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 em 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 funcionalidade básica, como um botão reproduzir / pausar em um dock de mídia, ou para funcionalidades avançadas, como uma docking station com um 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 da HID é totalmente gerenciado por meio de solicitações de controle no endpoint zero, portanto, nenhuma nova interface USB é necessária. Os quatro novos pedidos 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 para 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 quaisquer eventos HID para o dispositivo Android. Se o descritor de relatório for maior do que o tamanho máximo do pacote para o nó de extremidade zero, vários comandos ACCESSORY_SET_HID_REPORT_DESC são enviados para transferir o descritor inteiro.
  • 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) por USB. 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 entrada). O design do AOAv2 torna possível construir um acessório que usa o novo áudio e suporte 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 usa áudio e suporte HID, mas não se comunica com um aplicativo no dispositivo Android. Para esses acessórios, os usuários não precisam receber prompts 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 tais diálogos 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 do acessório não está presente na configuração USB do dispositivo Android depois que o dispositivo entra no modo acessório.