Protocolo de acessório aberto do Android 2.0,Protocolo de acessório aberto do Android 2.0

Este documento descreve as alterações 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 (obsoleta no Android 8.0).
  • Suporte para o acessório atuando 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 é compatível com acessórios e a 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 do AOAv1 devem retornar 1 como a versão do protocolo; os dispositivos que suportam os 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ório original continuam a funcionar com dispositivos Android mais recentes.

O exemplo a seguir do 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;
}

O 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 de acessórios. Disponível apenas se o usuário tiver ativado a Depuração USB nas configurações do dispositivo Android.
AOAv2 0x2D02 áudio Para streaming de á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 ter suporte no AOAv2.

Suporte de áudio

O 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 2 canais e 16 bits com uma taxa de bits de 44100 Khz (modos de áudio adicionais podem ser adicionados no futuro).

Para habilitar 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

O 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 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 o 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 um dock station com mouse e teclado QWERTY completo.

O 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 é tratado 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 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 qualquer evento HID ao dispositivo Android. Se o descritor de relatório for maior que o tamanho máximo do pacote para o ponto de extremidade 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 que um aplicativo Android se comunique diretamente com um host USB (acessório) via USB. O AOAv2 continua 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 usa 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 o AOAv2 sem um aplicativo Android

Você pode projetar um acessório (como um dock de áudio) que use suporte a áudio e HID, mas não se comunique 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-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 ao 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.
,

Este documento descreve as alterações 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 (obsoleta no Android 8.0).
  • Suporte para o acessório atuando 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 é compatível com acessórios e a 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 do AOAv1 devem retornar 1 como a versão do protocolo; os dispositivos que suportam os 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ório original continuam a funcionar com dispositivos Android mais recentes.

O exemplo a seguir do 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;
}

O 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 de acessórios. Disponível apenas se o usuário tiver ativado a Depuração USB nas configurações do dispositivo Android.
AOAv2 0x2D02 áudio Para streaming de á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 ter suporte no AOAv2.

Suporte de áudio

O 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 2 canais e 16 bits com uma taxa de bits de 44100 Khz (modos de áudio adicionais podem ser adicionados no futuro).

Para habilitar 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

O 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 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 o 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 um dock station com mouse e teclado QWERTY completo.

O 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 é tratado 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 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 qualquer evento HID ao dispositivo Android. Se o descritor de relatório for maior que o tamanho máximo do pacote para o ponto de extremidade 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 que um aplicativo Android se comunique diretamente com um host USB (acessório) via USB. O AOAv2 continua 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 usa 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 o AOAv2 sem um aplicativo Android

Você pode projetar um acessório (como um dock de áudio) que use suporte a áudio e HID, mas não se comunique 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-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 ao 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.