Android Açık Aksesuar 2.0

Bu belge, ilk sürümünden bu yana Android Açık Aksesuar (AOA) protokolünde yapılan değişiklikleri açıklar ve AOA 1.0 belgelerini tamamlar. AOAv2 aşağıdaki özellikleri ekler:

  • Ses çıkışı (Android 8.0'da kullanımdan kaldırılmıştır).
  • Android cihaza bir veya daha fazla insan arayüz cihazı (HID) görevi gören aksesuar desteği.

Android uygulama geliştiricilerinin kullanımına sunulan Android SDK API'leri değişmedi.

AOAv2 desteğini algılama

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

Aksesuar Geliştirme Kiti 2011 kaynak kodu ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) kitaplığından alınan aşağıdaki örnek, bu protokol denetimini gösterir:

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 arabirimi kombinasyonu için yeni USB ürün kimliklerini içerir:

Sürüm ürün kimliği İletişim Tanım
AOAv1 0x2D00 aksesuar Bir 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ıklamayı etkinleştirmişse kullanılabilir.
AOAv2 0x2D02 ses Bir Android cihazından bir aksesuara ses akışı sağlamak 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 etmektedir.

Ses desteği

AOAv2, 44100 Khz bit hızına sahip 2 kanallı, 16 bit PCM ses kapasitesine sahip standart bir USB ses sınıfı arayüzü aracılığıyla bir Android cihazdan bir 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

Aksesuar moduna girmek için ACCESSORY_START komutunu göndermeden önce bu komutun gönderilmesi gerekir.

HID desteği

AOAv2, aksesuarların bir veya daha fazla USB İnsan Arayüz Cihazını (HID) bir Android cihaza kaydetmesine olanak tanır. Bu yaklaşım, USB fareler ve klavyeler gibi tipik USB HID cihazları için iletişimin yönünü tersine çevirir. Normalde HID cihazı, bir USB ana bilgisayarına (yani kişisel bir bilgisayara) bağlı bir çevre birimidir, ancak AOA'da USB ana bilgisayarı, bir USB çevre birimine bir veya daha fazla giriş aygıtı olarak görev yapabilir.

HID desteği, standart HID olayları için bir proxy'dir; uygulama, olayların içeriği veya türü hakkında hiçbir varsayımda bulunmaz ve bunu yalnızca giriş sistemine aktararak bir AOAv2 aksesuarının herhangi bir HID cihazı (fare, klavye, oyun kumandası vb.) gibi davranmasını sağlar. Medya bağlantı istasyonundaki oynat/duraklatma düğmesi gibi temel işlevleri sağlamak veya fare ve tam QWERTY klavyeli bağlantı istasyonu gibi gelişmiş işlevler sağlamak için HID desteğini kullanabilirsiniz.

AOAv2, aksesuarın Android cihaza bir veya daha fazla HID giriş cihazı olarak işlev görmesine olanak tanıyan yeni USB kontrol istekleri ekler. HID desteği tamamen sıfır uç noktasındaki kontrol istekleri aracılığıyla gerçekleştirilir, dolayısıyla yeni bir USB arayüzüne gerek kalmaz. Dört yeni kontrol isteği şunlardır:

  • ACCESSORY_REGISTER_HID, Android cihaza yeni bir HID cihazı kaydeder. Aksesuar, diğer üç arama için HID cihazını tanımlamak için kullanılan bir kimlik sağlar. Bu kimlik, USB bağlantısı kesilene kadar 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 kayıtlı bir HID cihazının kaydını siler.
  • ACCESSORY_SET_HID_REPORT_DESC, Android cihaza bir HID cihazı için bir rapor tanımlayıcı gönderir. Bu istek, HID cihazının yeteneklerini açıklamak için kullanılır ve herhangi bir HID olayını Android cihaza bildirmeden ö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 için birden fazla ACCESSORY_SET_HID_REPORT_DESC komutu gönderilir.
  • ACCESSORY_SEND_HID_EVENT, giriş olaylarını aksesuardan Android cihazına gönderir.

Yeni kontrol isteklerine ilişkin 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 bir USB ana bilgisayarı (aksesuar) ile doğrudan iletişim kurması için destek sağlar. AOAv2 bu desteği sürdürüyor ve aksesuarın Android işletim sistemiyle (özellikle ses ve giriş sistemleriyle) iletişim kurmasına olanak tanıyan yeni özellikler ekliyor. AOAv2'nin tasarımı, orijinal özelliklere ek olarak yeni ses ve HID desteğini kullanan bir aksesuar oluşturulmasını mümkün kılar. Orijinal özelliklerin yanı sıra yeni özellikleri de kullanmanız yeterlidir.

AOAv2'yi Android uygulaması olmadan bağlama

Ses ve HID desteğini kullanan ancak Android cihazdaki bir uygulamayla iletişim kurmayan bir aksesuar (audio dock gibi) tasarlayabilirsiniz. Bu aksesuarlar için kullanıcıların, yeni eklenen aksesuarı bulmak ve onunla iletişim kurabilen bir Android uygulamasıyla ilişkilendirmek için iletişim istemleri almasına gerek yoktur.

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

  • Sistem aksesuarla iletişim kurmak için bir uygulama bulmaya çalışmaz.
  • Cihaz aksesuar moduna girdikten sonra Android cihazın USB yapılandırmasında aksesuar USB arayüzü mevcut değil.