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.
Detectar 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 docking station 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.
Conecte 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.