Android Open Accessory Protocol 2.0, Android Open Accessory Protocol 2.0

Dokumen ini menjelaskan perubahan dalam protokol Android Open Accessory (AOA) sejak rilis awal dan melengkapi dokumentasi AOA 1.0 . AOAv2 menambahkan fitur berikut:

  • Output audio (tidak digunakan lagi di Android 8.0).
  • Dukungan untuk aksesori yang bertindak sebagai satu atau lebih perangkat antarmuka manusia (HID) ke perangkat Android.

Android SDK API yang tersedia untuk pengembang aplikasi Android tidak berubah.

Mendeteksi dukungan AOAv2

Untuk menentukan apakah perangkat Android yang terhubung mendukung aksesori dan versi protokol yang didukung, aksesori harus mengirim perintah getProtocol() dan memeriksa hasilnya. Perangkat Android yang hanya mendukung fitur di AOAv1 harus mengembalikan 1 sebagai versi protokol; perangkat yang mendukung fitur tambahan di AOAv2 harus mengembalikan 2 sebagai versi protokol. AOAv2 kompatibel dengan AOAv1, jadi aksesori yang dirancang untuk protokol aksesori asli terus berfungsi dengan perangkat Android yang lebih baru.

Contoh berikut dari kode sumber Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) mendemonstrasikan pemeriksaan protokol ini:

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 menyertakan ID produk USB baru untuk setiap kombinasi antarmuka USB yang tersedia dalam mode aksesori:

Versi: kapan ID Produk Komunikasi Keterangan
AOAv1 0x2D00 tambahan Menyediakan dua titik akhir massal untuk berkomunikasi dengan aplikasi Android.
0x2D01 aksesori + adb Untuk keperluan debugging selama pengembangan aksesori. Hanya tersedia jika pengguna telah mengaktifkan USB Debugging di pengaturan perangkat Android.
AOAv2 0x2D02 audio Untuk streaming audio dari perangkat Android ke aksesori.
0x2D03 audio + adb
0x2D04 aksesori + audio
0x2D05 aksesori + audio + adb

ID produk yang digunakan di AOAv1 ( 0x2D00 dan 0x2D01 ) terus didukung di AOAv2.

Dukungan audio

AOAv2 mencakup dukungan untuk output audio dari perangkat Android ke aksesori melalui antarmuka kelas audio USB standar yang mampu 2 saluran, audio PCM 16-bit dengan bit rate 44100 Khz (mode audio tambahan dapat ditambahkan di masa mendatang).

Untuk mengaktifkan dukungan audio, aksesori harus mengirim permintaan kontrol USB baru:

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

Perintah ini harus dikirim sebelum mengirim perintah ACCESSORY_START untuk memasuki mode aksesori.

dukungan HID

AOAv2 memungkinkan aksesori untuk mendaftarkan satu atau lebih Perangkat Antarmuka Manusia USB (HID) dengan perangkat Android. Pendekatan ini membalikkan arah komunikasi untuk perangkat USB HID biasa seperti mouse dan keyboard USB. Biasanya, perangkat HID adalah periferal yang terhubung ke host USB (yaitu komputer pribadi), tetapi di AOA host USB dapat bertindak sebagai satu atau lebih perangkat input ke periferal USB.

Dukungan HID adalah proxy untuk acara HID standar; implementasi tidak membuat asumsi tentang konten atau jenis peristiwa dan hanya meneruskannya ke sistem input, memungkinkan aksesori AOAv2 untuk bertindak sebagai perangkat HID (mouse, keyboard, pengontrol game, dll.). Anda dapat menggunakan dukungan HID untuk menyediakan fungsionalitas dasar, seperti tombol putar/jeda pada dok media, atau untuk fungsionalitas lanjutan seperti stasiun dok dengan mouse dan keyboard QWERTY lengkap.

AOAv2 menambahkan permintaan kontrol USB baru yang memungkinkan aksesori bertindak sebagai satu atau lebih perangkat input HID ke perangkat Android. Dukungan HID ditangani sepenuhnya melalui permintaan kontrol pada titik akhir nol, jadi tidak diperlukan antarmuka USB baru. Empat permintaan kontrol baru adalah:

  • ACCESSORY_REGISTER_HID mendaftarkan perangkat HID baru dengan perangkat Android. Aksesori menyediakan ID yang digunakan untuk mengidentifikasi perangkat HID untuk tiga panggilan lainnya. ID ini berlaku hingga USB terputus atau hingga aksesori mengirim ACCESSORY_UNREGISTER_HID untuk membatalkan pendaftaran perangkat HID.
  • ACCESSORY_UNREGISTER_HID membatalkan pendaftaran perangkat HID yang sebelumnya terdaftar dengan ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC mengirimkan deskriptor laporan untuk perangkat HID ke perangkat Android. Permintaan ini digunakan untuk menjelaskan kemampuan perangkat HID dan harus dikirim sebelum melaporkan peristiwa HID apa pun ke perangkat Android. Jika deskriptor laporan lebih besar dari ukuran paket maksimum untuk titik akhir nol, beberapa perintah ACCESSORY_SET_HID_REPORT_DESC dikirim untuk mentransfer seluruh deskriptor.
  • ACCESSORY_SEND_HID_EVENT mengirimkan peristiwa masukan dari aksesori ke perangkat Android.

Definisi kode untuk permintaan kontrol baru adalah:

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

Interoperabilitas dengan AOAv1

Protokol asli ( AOAv1 ) menyediakan dukungan untuk aplikasi Android untuk berkomunikasi langsung dengan host USB (aksesori) melalui USB. AOAv2 melanjutkan dukungan ini dan menambahkan fitur baru untuk memungkinkan aksesori berkomunikasi dengan sistem operasi Android itu sendiri (khususnya sistem audio dan input). Desain AOAv2 memungkinkan untuk membangun aksesori yang menggunakan dukungan audio dan HID baru selain set fitur asli. Cukup gunakan fitur baru bersama dengan fitur asli.

Menghubungkan AOAv2 tanpa aplikasi Android

Anda dapat mendesain aksesori (seperti dok audio) yang menggunakan dukungan audio dan HID tetapi tidak berkomunikasi dengan aplikasi di perangkat Android. Untuk aksesori ini, pengguna tidak perlu menerima permintaan dialog untuk menemukan dan mengaitkan aksesori yang baru dipasang dengan aplikasi Android yang dapat berkomunikasi dengannya.

Untuk menekan dialog tersebut setelah aksesori tersambung, aksesori dapat memilih untuk tidak mengirim nama pabrikan dan model ke perangkat Android. Saat string ini tidak diberikan ke perangkat Android:

  • Sistem tidak berusaha menemukan aplikasi untuk berkomunikasi dengan aksesori.
  • Antarmuka USB aksesori tidak ada dalam konfigurasi USB perangkat Android setelah perangkat memasuki mode aksesori.
,

Dokumen ini menjelaskan perubahan dalam protokol Android Open Accessory (AOA) sejak rilis awal dan melengkapi dokumentasi AOA 1.0 . AOAv2 menambahkan fitur berikut:

  • Output audio (tidak digunakan lagi di Android 8.0).
  • Dukungan untuk aksesori yang bertindak sebagai satu atau lebih perangkat antarmuka manusia (HID) ke perangkat Android.

Android SDK API yang tersedia untuk pengembang aplikasi Android tidak berubah.

Mendeteksi dukungan AOAv2

Untuk menentukan apakah perangkat Android yang terhubung mendukung aksesori dan versi protokol yang didukung, aksesori harus mengirim perintah getProtocol() dan memeriksa hasilnya. Perangkat Android yang hanya mendukung fitur di AOAv1 harus mengembalikan 1 sebagai versi protokol; perangkat yang mendukung fitur tambahan di AOAv2 harus mengembalikan 2 sebagai versi protokol. AOAv2 kompatibel dengan AOAv1, jadi aksesori yang dirancang untuk protokol aksesori asli terus berfungsi dengan perangkat Android yang lebih baru.

Contoh berikut dari kode sumber Accessory Development Kit 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) mendemonstrasikan pemeriksaan protokol ini:

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 menyertakan ID produk USB baru untuk setiap kombinasi antarmuka USB yang tersedia dalam mode aksesori:

Versi: kapan ID Produk Komunikasi Keterangan
AOAv1 0x2D00 tambahan Menyediakan dua titik akhir massal untuk berkomunikasi dengan aplikasi Android.
0x2D01 aksesori + adb Untuk keperluan debugging selama pengembangan aksesori. Hanya tersedia jika pengguna telah mengaktifkan USB Debugging di pengaturan perangkat Android.
AOAv2 0x2D02 audio Untuk streaming audio dari perangkat Android ke aksesori.
0x2D03 audio + adb
0x2D04 aksesori + audio
0x2D05 aksesori + audio + adb

ID produk yang digunakan di AOAv1 ( 0x2D00 dan 0x2D01 ) terus didukung di AOAv2.

Dukungan audio

AOAv2 mencakup dukungan untuk output audio dari perangkat Android ke aksesori melalui antarmuka kelas audio USB standar yang mampu 2 saluran, audio PCM 16-bit dengan bit rate 44100 Khz (mode audio tambahan dapat ditambahkan di masa mendatang).

Untuk mengaktifkan dukungan audio, aksesori harus mengirim permintaan kontrol USB baru:

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

Perintah ini harus dikirim sebelum mengirim perintah ACCESSORY_START untuk memasuki mode aksesori.

dukungan HID

AOAv2 memungkinkan aksesori untuk mendaftarkan satu atau lebih Perangkat Antarmuka Manusia USB (HID) dengan perangkat Android. Pendekatan ini membalikkan arah komunikasi untuk perangkat USB HID biasa seperti mouse dan keyboard USB. Biasanya, perangkat HID adalah periferal yang terhubung ke host USB (yaitu komputer pribadi), tetapi di AOA host USB dapat bertindak sebagai satu atau lebih perangkat input ke periferal USB.

Dukungan HID adalah proxy untuk acara HID standar; implementasi tidak membuat asumsi tentang konten atau jenis peristiwa dan hanya meneruskannya ke sistem input, memungkinkan aksesori AOAv2 untuk bertindak sebagai perangkat HID (mouse, keyboard, pengontrol game, dll.). Anda dapat menggunakan dukungan HID untuk menyediakan fungsionalitas dasar, seperti tombol putar/jeda pada dok media, atau untuk fungsionalitas lanjutan seperti stasiun dok dengan mouse dan keyboard QWERTY lengkap.

AOAv2 menambahkan permintaan kontrol USB baru yang memungkinkan aksesori bertindak sebagai satu atau lebih perangkat input HID ke perangkat Android. Dukungan HID ditangani sepenuhnya melalui permintaan kontrol pada titik akhir nol, jadi tidak diperlukan antarmuka USB baru. Empat permintaan kontrol baru adalah:

  • ACCESSORY_REGISTER_HID mendaftarkan perangkat HID baru dengan perangkat Android. Aksesori menyediakan ID yang digunakan untuk mengidentifikasi perangkat HID untuk tiga panggilan lainnya. ID ini berlaku hingga USB terputus atau hingga aksesori mengirim ACCESSORY_UNREGISTER_HID untuk membatalkan pendaftaran perangkat HID.
  • ACCESSORY_UNREGISTER_HID membatalkan pendaftaran perangkat HID yang sebelumnya terdaftar dengan ACCESSORY_REGISTER_HID .
  • ACCESSORY_SET_HID_REPORT_DESC mengirimkan deskriptor laporan untuk perangkat HID ke perangkat Android. Permintaan ini digunakan untuk menjelaskan kemampuan perangkat HID dan harus dikirim sebelum melaporkan peristiwa HID apa pun ke perangkat Android. Jika deskriptor laporan lebih besar dari ukuran paket maksimum untuk titik akhir nol, beberapa perintah ACCESSORY_SET_HID_REPORT_DESC dikirim untuk mentransfer seluruh deskriptor.
  • ACCESSORY_SEND_HID_EVENT mengirimkan peristiwa masukan dari aksesori ke perangkat Android.

Definisi kode untuk permintaan kontrol baru adalah:

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

Interoperabilitas dengan AOAv1

Protokol asli ( AOAv1 ) menyediakan dukungan untuk aplikasi Android untuk berkomunikasi langsung dengan host USB (aksesori) melalui USB. AOAv2 melanjutkan dukungan ini dan menambahkan fitur baru untuk memungkinkan aksesori berkomunikasi dengan sistem operasi Android itu sendiri (khususnya sistem audio dan input). Desain AOAv2 memungkinkan untuk membangun aksesori yang menggunakan dukungan audio dan HID baru selain set fitur asli. Cukup gunakan fitur baru bersama dengan fitur asli.

Menghubungkan AOAv2 tanpa aplikasi Android

Anda dapat mendesain aksesori (seperti dok audio) yang menggunakan dukungan audio dan HID tetapi tidak berkomunikasi dengan aplikasi di perangkat Android. Untuk aksesori ini, pengguna tidak perlu menerima permintaan dialog untuk menemukan dan mengaitkan aksesori yang baru dipasang dengan aplikasi Android yang dapat berkomunikasi dengannya.

Untuk menekan dialog tersebut setelah aksesori tersambung, aksesori dapat memilih untuk tidak mengirim nama pabrikan dan model ke perangkat Android. Saat string ini tidak diberikan ke perangkat Android:

  • Sistem tidak berusaha menemukan aplikasi untuk berkomunikasi dengan aksesori.
  • Antarmuka USB aksesori tidak ada dalam konfigurasi USB perangkat Android setelah perangkat memasuki mode aksesori.