Android Open Accessory Protocol 2.0, Android Open Accessory Protocol 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 аудио + адб
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 для входа в вспомогательный режим.

Скрытая поддержка

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 после перехода устройства в режим аксессуара.
,

Этот документ описывает изменения в протоколе 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 аудио + адб
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 для входа в вспомогательный режим.

Скрытая поддержка

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 после перехода устройства в режим аксессуара.