Android Open Accessory 2.0

Bu belgede, Android Açık Aksesuar (AOA) protokolünde ilk sürümden bu yana yapılan değişiklikler açıklanmakta ve AOA 1.0 dokümanları desteklenmektedir. AOAv2 aşağıdaki özellikleri ekler:

  • Ses çıkışı (Android 8.0'da desteği sonlandırıldı).
  • Android cihazda bir veya daha fazla insan arabirim cihazı (HID) olarak işlev gören aksesuar desteği.

Android uygulama geliştiricilerinin kullanabileceği Android SDK API'lerinde değişiklik yapılmamıştır.

AOAv2 desteğini algılama

Bağlı bir Android cihazın aksesuarları ve desteklenen protokol sürümünü destekleyip desteklemediğini belirlemek için aksesuarın bir getProtocol()komut göndermesi ve sonucu kontrol etmesi gerekir. Yalnızca AOAv1'deki özellikleri destekleyen Android cihazlar, protokol sürümü olarak 1 döndürmelidir; AOAv2'deki ek özellikleri destekleyen cihazlar, protokol sürümü olarak 2 döndürmelidir. AOAv2, AOAv1 ile geriye dönük uyumludur. Bu nedenle, orijinal aksesuar protokolü için tasarlanmış aksesuarlar daha yeni Android cihazlarla çalışmaya devam eder.

Aksesuar Geliştirme Kiti 2011 kaynak kodu (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) kitaplığındaki aşağıdaki örnekte bu protokol kontrolü gösterilmektedir:

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, aksesuar modunda kullanılabilen her USB arayüzü kombinasyonu için yeni USB ürün kimlikleri içerir:

Sürüm Ürün Kimliği İletişim Açıklama
AOAv1 0x2D00 aksesuar Android uygulamasıyla iletişim kurmak için iki toplu uç nokta sağlar.
0x2D01 aksesuar + adb Aksesuar geliştirme sırasında hata ayıklama amacıyla. Yalnızca kullanıcı Android cihaz ayarlarında USB Hata Ayıklama'yı etkinleştirdiyse kullanılabilir.
AOAv2 0x2D02 Ses Android cihazdan aksesuara ses aktarmak için.
0x2D03 ses + adb
0x2D04 aksesuar + ses
0x2D05 aksesuar + ses + adb

AOAv1'de kullanılan ürün kimlikleri (0x2D00 ve 0x2D01), AOAv2'de desteklenmeye devam eder.

Ses desteği

AOAv2, 44.100 Khz bit hızında 2 kanallı, 16 bit PCM ses sunabilen standart bir USB ses sınıfı arayüzü aracılığıyla Android cihazdan aksesuara ses çıkışı desteği içerir (gelecekte ek ses modları eklenebilir).

Ses desteğini etkinleştirmek için aksesuarın yeni bir USB kontrol isteği göndermesi gerekir:

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

Bu komut, aksesuar moduna girmek için ACCESSORY_START komutu gönderilmeden önce gönderilmelidir.

HID desteği

AOAv2, aksesuarların bir veya daha fazla USB insan arabirim cihazını (HID) Android cihaza kaydetmesine olanak tanır. Bu yaklaşım, USB fareler ve klavyeler gibi tipik USB HID cihazlarının iletişim yönünü tersine çevirir. Normalde HID cihaz, bir USB ana makinesine (ör. kişisel bilgisayar) bağlı bir çevre birimidir ancak AOA'da USB ana makinesi, bir USB çevre birimine bir veya daha fazla giriş cihazı olarak davranabilir.

HID desteği, standart HID etkinlikleri için bir proxy'dir; uygulama, etkinliklerin içeriği veya türü hakkında hiçbir varsayımda bulunmaz ve yalnızca giriş sistemine iletir. Böylece bir AOAv2 aksesuarı, herhangi bir HID cihazı (fare, klavye, oyun kumandası vb.) gibi davranabilir. Medya yuvası üzerindeki oynatma/duraklatma düğmesi gibi temel işlevler veya fare ve tam QWERTY klavyesi bulunan bağlantı istasyonu gibi gelişmiş işlevler sağlamak için HID desteğini kullanabilirsiniz.

AOAv2, aksesuarın Android cihazda bir veya daha fazla HID giriş cihazı gibi davranmasına olanak tanıyan yeni USB kontrol istekleri ekler. HID desteği tamamen sıfır uç noktadaki kontrol istekleri aracılığıyla yönetildiğinden yeni bir USB arayüzüne gerek yoktur. Dört yeni kontrol isteği şunlardır:

  • ACCESSORY_REGISTER_HID, Android cihaza yeni bir HID cihazı kaydeder. Aksesuar, diğer üç çağrı için HID cihazını tanımlamak üzere kullanılan bir kimlik sağlar. Bu kimlik, USB bağlantısı kesilene veya aksesuar HID cihazının kaydını silmek için ACCESSORY_UNREGISTER_HID gönderene kadar geçerlidir.
  • ACCESSORY_UNREGISTER_HID, daha önce ACCESSORY_REGISTER_HID'ye kayıtlı bir HID cihazın kaydını siler.
  • ACCESSORY_SET_HID_REPORT_DESC, Android cihaza bir HID cihazı için rapor tanımlayıcı gönderir. Bu istek, HID cihazının özelliklerini açıklamak için kullanılır ve Android cihaza HID etkinlikleri bildirilmeden önce gönderilmelidir. Rapor tanımlayıcı sıfır uç noktası için maksimum paket boyutundan büyükse tanımlayıcının tamamını aktarmak üzere birden fazla ACCESSORY_SET_HID_REPORT_DESC komutu gönderilir.
  • ACCESSORY_SEND_HID_EVENT, aksesuardan Android cihaza giriş etkinlikleri gönderir.

Yeni kontrol isteklerinin kod tanımları şunlardır:

/* 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 ile birlikte çalışabilirlik

Orijinal protokol (AOAv1), bir Android uygulamasının USB üzerinden doğrudan bir USB ana makineyle (aksesuar) iletişim kurması için destek sağlar. AOAv2 bu desteği sürdürür ve aksesuarın Android işletim sistemiyle (özellikle ses ve giriş sistemleriyle) iletişim kurmasına olanak tanıyan yeni özellikler ekler. AOAv2'nin tasarımı, orijinal özellik grubuna ek olarak yeni ses ve HID desteğini kullanan bir aksesuar oluşturmayı mümkün kılar. Orijinal özelliklerle birlikte yeni özellikleri kullanmanız yeterlidir.

Android uygulaması olmadan AOAv2'ye bağlanma

Ses ve HID desteği kullanan ancak Android cihazdaki bir uygulamayla iletişim kurmayan bir aksesuar (ör. ses istasyonu) tasarlayabilirsiniz. Bu aksesuarlarda, kullanıcıların yeni takılan aksesuarı bulup onunla iletişim kurabilen bir Android uygulamasıyla ilişkilendirmek için iletişim istemleri almaları gerekmez.

Bir aksesuar bağlandıktan sonra bu tür iletişim kutularını engellemek için aksesuar, üretici ve model adlarını Android cihaza göndermemeyi seçebilir. Bu dizeler Android cihaza sağlanmadığında:

  • Sistem, aksesuarla iletişim kuracak bir uygulama bulmaya çalışmaz.
  • Cihaz aksesuar moduna girdikten sonra Android cihazın USB yapılandırmasında aksesuar USB arayüzü bulunmuyor.