Протокол открытых аксессуаров 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-интерфейсов, доступных в дополнительном режиме:

Версия идантификационный номер продукта Коммуникация Описание
AOAv1 0x2D00 аксессуар Предоставляет две массовые конечные точки для связи с приложением Android.
0x2D01 аксессуар + adb Для отладки во время разработки аксессуаров. Доступно только в том случае, если пользователь включил отладку по USB в настройках устройства Android.
AOAv2 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 после того, как устройство переходит в дополнительный режим.