Este documento descreve as mudanças no protocolo Android Open Accessory (AOA) desde o lançamento inicial e complementa a documentação do AOA 1.0. O AOAv2 adiciona os seguintes recursos:
- Saída de áudio (descontinuada no Android 8.0).
- Suporte para o acessório que atua como um ou mais dispositivos de interface humana (HIDs, na sigla em inglês) para o dispositivo Android.
As APIs do SDK do Android disponíveis para desenvolvedores de apps Android não foram alteradas.
Detectar suporte ao AOAv2
Para determinar se um dispositivo Android conectado oferece suporte a acessórios e à
versão do protocolo, um acessório precisa enviar um comando getProtocol()
e verificar o resultado. Os dispositivos Android que oferecem suporte apenas aos recursos
do AOAv1 precisam retornar 1
como a versão do protocolo. Os dispositivos que
oferecem suporte aos recursos adicionais do AOAv2 precisam retornar 2
como a
versão do protocolo. O AOAv2 é compatível com o AOAv1, então os acessórios
projetados para o protocolo de acessório original continuam funcionando com dispositivos
Android mais recentes.
O exemplo a seguir do código-fonte
(<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp
)
do Accessory Development Kit 2011
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órios | Fornece dois endpoints em massa para se comunicar com um app 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 fazer 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 produtos usados no AOAv1 (0x2D00
e 0x2D01
)
continuam sendo compatíveis com o AOAv2.
Compatibilidade de áudio
O AOAv2 inclui suporte à saída de áudio de um dispositivo Android para um acessório por uma interface de classe de áudio USB padrão com capacidade de áudio PCM de 2 canais e 16 bits com uma taxa de bits de 44100 Khz. Outros modos de áudio podem ser adicionados 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 precisa ser enviado antes do comando
ACCESSORY_START
para entrar no modo acessório.
Suporte a HID
O AOAv2 permite que os acessórios registrem um ou mais dispositivos de interface humana USB (HID, na sigla em inglês) 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, na AOA, o host USB pode atuar como um ou mais dispositivos de entrada para um periférico USB.
O suporte a HID é um proxy para eventos HID padrão. A implementação não faz suposições sobre o conteúdo ou o tipo de eventos e simplesmente os transmite para o sistema de entrada, permitindo que um acessório AOAv2 atue como qualquer dispositivo HID (mouse, teclado, controle de jogos etc.). É possível usar o suporte HID para oferecer funcionalidades básicas, como um botão de reprodução/pausa em um dock de mídia, ou para funcionalidades avançadas, como uma estação de acoplamento com um mouse e um teclado QWERTY completo.
O AOAv2 adiciona novas solicitações de controle USB que permitem que o acessório funcione como um ou mais dispositivos de entrada HID para o dispositivo Android. O suporte a HID é processado inteiramente por solicitações de controle no endpoint zero. Portanto, não é necessária uma nova interface USB. 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. Esse 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 precisa ser enviada antes de informar qualquer evento HID
ao dispositivo Android. Se o descritor de relatório for maior que o tamanho máximo
do pacote para o endpoint zero, vários
comandos
ACCESSORY_SET_HID_REPORT_DESC
serã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 o AOAv1
O protocolo original (AOAv1) oferece suporte para um app Android se comunicar diretamente com um host USB (acessório) por USB. O 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 permite criar um acessório que usa o novo suporte a áudio e HID em adição ao conjunto de recursos original. Basta usar os novos recursos com os originais.
Conectar o AOAv2 sem um app Android
É possível projetar um acessório (como uma base de áudio) que use suporte a áudio e HID, mas não se comunique com um app no dispositivo Android. Para esses acessórios, os usuários não precisam receber prompts de caixa de diálogo para encontrar e associar o acessório recém-conectado a um app Android que possa se comunicar com ele.
Para suprimir essas caixas de diálogo depois que um acessório se conectar, ele 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 app 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 de acessório.