פרוטוקול אביזר פתוח של Android 2.0

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

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

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

איתור תמיכה ב- AOAv2

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

הדוגמה הבאה מספריית קוד המקור של Accessory Development Kit 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 אבזר מספק שתי נקודות קצה בכמות גדולה לתקשורת עם אפליקציית Android.
0x2D01 אביזר + אדב למטרות איתור באגים במהלך פיתוח אביזרים. זמין רק אם המשתמש הפעיל איתור באגים ב- USB בהגדרות מכשיר ה- Android.
AOAv2 0x2D02 שֶׁמַע להזרמת שמע ממכשיר אנדרואיד לאביזר.
0x2D03 שמע + אדב
0x2D04 אביזר + שמע
0x2D05 אביזר + שמע + אדב

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

תמיכה באודיו

AOAv2 כולל תמיכה בפלט שמע ממכשיר אנדרואיד לאביזר דרך ממשק USB מסוג USB רגיל המסוגל לשמע PCM דו ערוצי, 16 סיביות עם קצב סיביות של 44100 Khz (ניתן להוסיף מצבי שמע נוספים בעתיד).

כדי לאפשר תמיכה באודיו, על האביזר לשלוח בקשת בקרת 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) במכשיר אנדרואיד. גישה זו הופכת את כיוון התקשורת עבור התקני USB HID טיפוסיים כגון עכברי USB ומקלדות. בדרך כלל, התקן ה- HID הוא ציוד היקפי המחובר למארח USB (כלומר למחשב אישי), אך ב- AOA מארח ה- USB יכול לשמש התקן קלט אחד או יותר להיקפי USB.

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

AOAv2 מוסיף בקשות בקרת USB חדשות המאפשרות לאביזר לשמש התקן קלט HID אחד או יותר למכשיר אנדרואיד. תמיכת 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 שולח מתאר דוחות למכשיר HID למכשיר 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 ) מספק תמיכה ביישום אנדרואיד לתקשר ישירות עם מארח USB (אביזר) באמצעות USB. AOAv2 ממשיך בתמיכה זו ומוסיף תכונות חדשות המאפשרות לאביזר לתקשר עם מערכת ההפעלה אנדרואיד עצמה (במיוחד מערכות השמע והקלט). העיצוב של AOAv2 מאפשר לבנות אביזר המשתמש בתמיכה החדשה באודיו וב- HID בנוסף לסט התכונות המקורי. כל שעליך לעשות הוא להשתמש בתכונות החדשות יחד עם התכונות המקוריות.

חיבור AOAv2 ללא אפליקציית Android

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

כדי לדכא דיאלוגים כאלה לאחר התחברות אביזר, אביזר יכול לבחור שלא לשלוח את שמות היצרן והדגם למכשיר אנדרואיד. כאשר מחרוזות אלה אינן מסופקות למכשיר Android:

  • המערכת אינה מנסה למצוא יישום לתקשר עם האביזר.
  • ממשק ה- USB האביזר אינו קיים בתצורת ה- USB של מכשיר Android לאחר שהמכשיר עובר למצב אביזר.