Android Open Accessory 2.0

במסמך הזה מתוארים השינויים בפרוטוקול Open Accessory (AOA) של Android מאז שהושק לראשונה ומאז התוספות מסמכי תיעוד של AOA 1.0 AOAv2 מוסיף את הפיצ'רים הבאים:

  • פלט אודיו (הוצא משימוש ב-Android 8.0).
  • תמיכה באביזר שמשמש כמכשיר אחד או יותר בממשק אנושי (מכשירי ממשק אנושי) למכשיר Android.

ממשקי API של Android SDK שזמינים למפתחי אפליקציות ל-Android לא משתנים.

זיהוי תמיכה ב-AOAv2

כדי לקבוע אם מכשיר Android מחובר תומך באביזרים בגרסת פרוטוקול נתמכת, האביזר חייב לשלוח getProtocol() ולבדוק את התוצאה. מכשירי Android שתומכים רק בתכונות האלה ב-AOAv1 חייב להחזיר את הערך 1 כגרסת הפרוטוקול. במכשירים תומך בתכונות הנוספות ב-AOAv2 חייב להחזיר 2 גרסת הפרוטוקול. AOAv2 תואם לאחור ל-AOAv1, לכן אביזרים שמיועד לפרוטוקול האביזר המקורי, ימשיך לפעול עם גרסאות Android חדשות יותר מכשירים.

הדוגמה הבאה מתוך ערכת פיתוח האביזרים משנת 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 זמין במצב 'אביזר':

גרסה מזהה מוצר תקשורת תיאור
AOAv1 0x2D00 אביזר מספקת שתי נקודות קצה (endpoint) בכמות גדולה לתקשורת עם אפליקציה ל-Android.
0x2D01 אביזר + adb למטרות ניפוי באגים במהלך פיתוח האביזר. זמין רק אם המשתמש הפעיל ניפוי באגים ב-USB בהגדרות של מכשיר Android.
AOAv2 0x2D02 אודיו לסטרימינג של אודיו ממכשיר Android לאביזר.
0x2D03 אודיו + adb
0x2D04 אביזר + אודיו
0x2D05 אביזר + אודיו + adb

מזהי המוצרים שנעשה בהם שימוש ב-AOAv1 (0x2D00 ו-0x2D01) תמשיך להיות תמיכה ב-AOAv2.

תמיכה באודיו

AOAv2 כולל תמיכה בפלט אודיו ממכשיר Android אביזר באמצעות ממשק USB ברמה גבוהה עם תמיכה ב-2 ערוצים, 16 סיביות אודיו PCM בקצב סיביות של 44,100Kz (ניתן להוסיף מצבי אודיו נוספים בעוד העתיד).

כדי להפעיל את התמיכה באודיו, האביזר צריך לשלוח בקשה חדשה לבקרת 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 למעבר למצב אביזרים.

תמיכה ב-HID

AOAv2 מאפשר לאביזרים לרשום ממשק USB אנושי אחד או יותר מכשירים (HID) עם מכשיר Android. הגישה הזו הופכת את הכיוון של תקשורת למכשירי USB HID טיפוסיים, כמו עכברי USB ומקלדות. בדרך כלל, מכשיר ממשק אנושי (HID) הוא ציוד היקפי שמחובר למארח USB (כלומר מחשב אישי), אבל ב-AOA, מארח ה-USB יכול לשמש כקלט אחד או יותר לציוד היקפי בחיבור USB.

תמיכה ב-HID היא שרת proxy לאירועי ממשק אנושי (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 שולח תיאור של דוח עבור מכשיר ממשק אנושי למכשיר 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 להגדרת התצורה אחרי שהמכשיר עובר למצב 'אביזר'.