Android Otwarte akcesorium 2.0

Ten dokument opisuje zmiany w protokole Android Open Accessory (AOA) od czasu jego pierwszej wersji i uzupełnia dokumentację AOA 1.0 . AOAv2 dodaje następujące funkcje:

  • Wyjście audio (przestarzałe w systemie Android 8.0).
  • Obsługa akcesorium działającego jako jedno lub więcej urządzeń interfejsu ludzkiego (HID) na urządzeniu z systemem Android.

Interfejsy API zestawu SDK systemu Android dostępne dla twórców aplikacji na system Android pozostają niezmienione.

Wykrywanie obsługi AOAv2

Aby ustalić, czy podłączone urządzenie z systemem Android obsługuje akcesoria i obsługiwaną wersję protokołu, akcesorium musi wysłać polecenie getProtocol() i sprawdzić wynik. Urządzenia z Androidem obsługujące tylko funkcje AOAv1 muszą zwracać 1 jako wersję protokołu; urządzenia obsługujące dodatkowe funkcje w AOAv2 muszą zwracać 2 jako wersję protokołu. AOAv2 jest wstecznie kompatybilny z AOAv1, więc akcesoria zaprojektowane dla oryginalnego protokołu akcesoriów nadal działają z nowszymi urządzeniami z Androidem.

Poniższy przykład z biblioteki kodu źródłowego Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) ilustruje tę kontrolę protokołu:

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 zawiera nowe identyfikatory produktów USB dla każdej kombinacji interfejsów USB dostępnych w trybie akcesoriów:

Wersja ID produktu Komunikacja Opis
AOAv1 0x2D00 akcesorium Zapewnia dwa zbiorcze punkty końcowe do komunikacji z aplikacją dla systemu Android.
0x2D01 dodatek + przysł Do celów debugowania podczas opracowywania akcesoriów. Dostępne tylko wtedy, gdy użytkownik włączył debugowanie USB w ustawieniach urządzenia z systemem Android.
AOAv2 0x2D02 audio Do strumieniowego przesyłania dźwięku z urządzenia z systemem Android do akcesorium.
0x2D03 dźwięk + przym
0x2D04 akcesoria + dźwięk
0x2D05 akcesoria + audio + przym

Identyfikatory produktów używane w AOAv1 ( 0x2D00 i 0x2D01 ) są nadal obsługiwane w AOAv2.

Obsługa dźwięku

AOAv2 obsługuje wyjście audio z urządzenia z systemem Android do akcesorium za pośrednictwem standardowego interfejsu klasy audio USB obsługującego 2-kanałowy, 16-bitowy dźwięk PCM z szybkością transmisji 44100 kHz (dodatkowe tryby audio mogą zostać dodane w przyszłości).

Aby włączyć obsługę dźwięku, akcesorium musi wysłać nowe żądanie sterowania 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

Polecenie to musi zostać wysłane przed wysłaniem polecenia ACCESSORY_START w celu wejścia w tryb akcesoriów.

Wsparcie HID

AOAv2 umożliwia akcesoriom zarejestrowanie jednego lub większej liczby urządzeń USB Human Interface Device (HID) na urządzeniu z systemem Android. Takie podejście odwraca kierunek komunikacji w przypadku typowych urządzeń USB HID, takich jak myszy i klawiatury USB. Zwykle urządzenie HID to urządzenie peryferyjne podłączone do hosta USB (tj. komputera osobistego), ale w AOA host USB może działać jako jedno lub więcej urządzeń wejściowych dla urządzenia peryferyjnego USB.

Obsługa HID jest proxy dla standardowych zdarzeń HID; implementacja nie przyjmuje żadnych założeń co do treści ani rodzaju zdarzeń i po prostu przekazuje je do systemu wejściowego, umożliwiając akcesorium AOAv2 działanie jako dowolne urządzenie HID (mysz, klawiatura, kontroler gier itp.). Obsługi HID można używać w celu zapewnienia podstawowych funkcji, takich jak przycisk odtwarzania/pauzy w stacji dokującej, lub w celu uzyskania zaawansowanych funkcji, takich jak stacja dokująca z myszą i pełną klawiaturą QWERTY.

AOAv2 dodaje nowe żądania sterowania USB, które pozwalają akcesorium działać jako jedno lub więcej urządzeń wejściowych HID na urządzeniu z systemem Android. Obsługa HID jest obsługiwana wyłącznie poprzez żądania sterujące w punkcie końcowym zero, więc nie jest potrzebny żaden nowy interfejs USB. Cztery nowe żądania kontroli to:

  • ACCESSORY_REGISTER_HID rejestruje nowe urządzenie HID na urządzeniu z systemem Android. Akcesorium zapewnia identyfikator używany do identyfikacji urządzenia HID dla pozostałych trzech połączeń. Ten identyfikator jest ważny do momentu rozłączenia USB lub do momentu wysłania przez akcesorium ACCESSORY_UNREGISTER_HID w celu wyrejestrowania urządzenia HID.
  • ACCESSORY_UNREGISTER_HID wyrejestrowuje urządzenie HID zarejestrowane wcześniej w ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC wysyła deskryptor raportu dla urządzenia HID do urządzenia z systemem Android. To żądanie służy do opisu możliwości urządzenia HID i musi zostać wysłane przed zgłoszeniem jakichkolwiek zdarzeń HID do urządzenia z systemem Android. Jeśli deskryptor raportu jest większy niż maksymalny rozmiar pakietu dla punktu końcowego zero, wysyłanych jest wiele poleceń ACCESSORY_SET_HID_REPORT_DESC w celu przesłania całego deskryptora.
  • ACCESSORY_SEND_HID_EVENT wysyła zdarzenia wejściowe z akcesorium do urządzenia z systemem Android.

Definicje kodu dla nowych żądań kontroli są następujące:

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

Współpraca z AOAv1

Oryginalny protokół ( AOAv1 ) zapewnia obsługę aplikacji dla systemu Android w celu bezpośredniej komunikacji z hostem USB (akcesorium) przez USB. AOAv2 kontynuuje tę obsługę i dodaje nowe funkcje, aby umożliwić akcesorium komunikację z samym systemem operacyjnym Android (w szczególności z systemami audio i wejściowymi). Konstrukcja AOAv2 umożliwia zbudowanie akcesorium, które oprócz oryginalnego zestawu funkcji wykorzystuje nową obsługę audio i HID. Po prostu użyj nowych funkcji wraz z oryginalnymi funkcjami.

Podłączanie AOAv2 bez aplikacji na Androida

Możesz zaprojektować akcesorium (takie jak stacja dokująca audio), które obsługuje dźwięk i HID, ale nie komunikuje się z aplikacją na urządzeniu z systemem Android. W przypadku tych akcesoriów użytkownicy nie muszą wyświetlać monitów o znalezienie i powiązanie nowo podłączonego akcesorium z aplikacją na Androida, która może się z nim komunikować.

Aby ukryć takie okna dialogowe po podłączeniu akcesorium, może ono zdecydować o nie wysyłaniu nazwy producenta i modelu do urządzenia z systemem Android. Jeśli te ciągi nie są dostarczane do urządzenia z systemem Android:

  • System nie próbuje znaleźć aplikacji umożliwiającej komunikację z akcesorium.
  • Interfejs USB akcesoriów nie jest obecny w konfiguracji USB urządzenia z systemem Android po przejściu urządzenia w tryb akcesoriów.