Открытый аксессуар Android 2.0

В этом документе описаны изменения в протоколе Android Open Accessory (AOA) с момента его первоначального выпуска и дополняет документацию AOA 1.0 . AOAv2 добавляет следующие функции:

  • Аудиовыход (устарел в Android 8.0).
  • Поддержка аксессуара, действующего как одно или несколько устройств пользовательского интерфейса (HID) для устройства Android.

API-интерфейсы Android SDK, доступные разработчикам приложений Android, не изменились.

Обнаружение поддержки AOAv2

Чтобы определить, поддерживает ли подключенное устройство Android аксессуары и поддерживаемую версию протокола, аксессуар должен отправить команду getProtocol() и проверить результат. Устройства Android, поддерживающие только функции AOAv1, должны возвращать 1 в качестве версии протокола; устройства, поддерживающие дополнительные функции AOAv2, должны возвращать 2 в качестве версии протокола. AOAv2 обратно совместим с AOAv1, поэтому аксессуары, разработанные для исходного протокола аксессуаров, продолжают работать с новыми устройствами Android.

Следующий пример из библиотеки исходного кода Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) демонстрирует эту проверку протокола:

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 включает новые идентификаторы USB-продуктов для каждой комбинации USB-интерфейсов, доступных в режиме аксессуаров:

Версия Код товара Коммуникация Описание
АОАв1 0x2D00 аксессуар Предоставляет две массовые конечные точки для связи с приложением Android.
0x2D01 аксессуар + adb В целях отладки при разработке аксессуаров. Доступно только в том случае, если пользователь включил отладку по USB в настройках устройства Android.
АОАв2 0x2D02 аудио Для потоковой передачи звука с устройства Android на аксессуар.
0x2D03 аудио + adb
0x2D04 аксессуар + аудио
0x2D05 аксессуар + аудио + adb

Идентификаторы продуктов, используемые в AOAv1 ( 0x2D00 и 0x2D01 ), продолжают поддерживаться в AOAv2.

Аудио поддержка

AOAv2 включает поддержку вывода звука с устройства Android на аксессуар через стандартный интерфейс аудиокласса USB, поддерживающий 2-канальный 16-битный звук PCM с битрейтом 44100 кГц (в будущем могут быть добавлены дополнительные аудиорежимы).

Чтобы включить поддержку звука, аксессуар должен отправить новый запрос управления 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

Эту команду необходимо отправить перед отправкой команды ACCESSORY_START для входа в режим аксессуара.

HID-поддержка

AOAv2 позволяет аксессуарам регистрировать одно или несколько USB-устройств с интерфейсом пользователя (HID) на устройстве Android. Этот подход меняет направление связи для типичных USB HID-устройств, таких как USB-мыши и клавиатуры. Обычно HID-устройство представляет собой периферийное устройство, подключенное к USB-хосту (т. е. персональному компьютеру), но в AOA USB-хост может выступать в качестве одного или нескольких устройств ввода для периферийного USB-устройства.

Поддержка HID — это прокси для стандартных событий HID; реализация не делает никаких предположений о содержании или типе событий и просто передает их в систему ввода, позволяя аксессуару AOAv2 действовать как любое HID-устройство (мышь, клавиатура, игровой контроллер и т. д.). Вы можете использовать поддержку HID для предоставления базовых функций, таких как кнопка воспроизведения/паузы на мультимедийной док-станции, или для расширенных функций, таких как док-станция с мышью и полной QWERTY-клавиатурой.

AOAv2 добавляет новые запросы управления USB, которые позволяют аксессуару действовать как одно или несколько устройств ввода HID на устройстве Android. Поддержка HID полностью осуществляется посредством запросов управления на нулевой конечной точке, поэтому новый интерфейс USB не требуется. Четыре новых запроса на управление:

  • ACCESSORY_REGISTER_HID регистрирует новое устройство HID на устройстве Android. Аксессуар предоставляет идентификатор, используемый для идентификации устройства HID для трех других вызовов. Этот идентификатор действителен до тех пор, пока USB не отключится или пока аксессуар не отправит ACCESSORY_UNREGISTER_HID для отмены регистрации устройства HID.
  • ACCESSORY_UNREGISTER_HID отменяет регистрацию устройства HID, ранее зарегистрированного с помощью ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC отправляет дескриптор отчета для устройства HID на устройство Android. Этот запрос используется для описания возможностей устройства HID и должен быть отправлен перед отправкой сообщения о любых событиях HID на устройство Android. Если дескриптор отчета превышает максимальный размер пакета для нулевой конечной точки, отправляется несколько команд ACCESSORY_SET_HID_REPORT_DESC для передачи всего дескриптора.
  • ACCESSORY_SEND_HID_EVENT отправляет события ввода с аксессуара на устройство Android.

Определения кода для новых запросов управления:

/* 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

Совместимость с AOAv1

Исходный протокол ( AOAv1 ) обеспечивает поддержку приложения Android для прямой связи с USB-хостом (аксессуаром) через USB. AOAv2 продолжает эту поддержку и добавляет новые функции, позволяющие аксессуару взаимодействовать с самой операционной системой Android (в частности, с системами аудио и ввода). Конструкция AOAv2 позволяет создать аксессуар, который использует новую поддержку звука и HID в дополнение к исходному набору функций. Просто используйте новые функции вместе с оригинальными функциями.

Подключение AOAv2 без приложения для Android

Вы можете создать аксессуар (например, аудиодок-станцию), который использует поддержку звука и HID, но не взаимодействует с приложением на устройстве Android. Для этих аксессуаров пользователям не нужно получать диалоговые подсказки для поиска и связывания вновь подключенного аксессуара с приложением Android, которое может с ним взаимодействовать.

Чтобы подавить такие диалоговые окна после подключения аксессуара, аксессуар может не отправлять название производителя и модели на устройство Android. Если эти строки не предоставляются устройству Android:

  • Система не пытается найти приложение для связи с аксессуаром.
  • USB-интерфейс аксессуара отсутствует в конфигурации USB устройства Android после того, как устройство перешло в режим аксессуара.