Phụ kiện mở Android 2.0

Tài liệu này mô tả những thay đổi trong giao thức Phụ kiện mở Android (AOA) kể từ lần đầu phát hành và dùng thực phẩm bổ sung Tài liệu về AOA 1.0. AOAv2 sẽ thêm các tính năng sau:

  • Đầu ra âm thanh (không dùng nữa trong Android 8.0).
  • Hỗ trợ phụ kiện hoạt động như một hoặc nhiều thiết bị có giao diện dành cho con người (HID) sang thiết bị Android.

API Android SDK dành cho nhà phát triển ứng dụng Android không thay đổi.

Phát hiện tính năng hỗ trợ AOAv2

Để xác định xem một thiết bị Android đã kết nối có hỗ trợ các phụ kiện và phiên bản giao thức được hỗ trợ, phụ kiện phải gửi một getProtocol() và kiểm tra kết quả. Thiết bị Android chỉ hỗ trợ các tính năng trong AOAv1 phải trả về 1 làm phiên bản giao thức; các thiết bị hỗ trợ các tính năng bổ sung trong AOAv2 phải trả về 2 dưới dạng phiên bản giao thức. AOAv2 tương thích ngược với AOAv1, vì vậy, các phụ kiện được thiết kế cho giao thức phụ kiện ban đầu sẽ tiếp tục hoạt động với các thiết bị Android mới hơn thiết bị.

Ví dụ sau trong Bộ phát triển phụ kiện năm 2011 mã nguồn (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) thư viện minh hoạ việc kiểm tra giao thức này:

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 cung cấp mã sản phẩm USB mới cho từng tổ hợp giao diện USB có ở chế độ phụ kiện:

Phiên bản Mã sản phẩm Liên lạc Mô tả
AOAv1 0x2D00 phụ kiện Cung cấp 2 điểm cuối hàng loạt để giao tiếp với ứng dụng Android.
0x2D01 phụ kiện + adb Dành cho mục đích gỡ lỗi trong quá trình phát triển phụ kiện. Chỉ có sẵn nếu người dùng đã bật tính năng Gỡ lỗi qua USB trong phần cài đặt thiết bị Android.
AOAv2 0x2D02 âm thanh Để truyền trực tuyến âm thanh từ thiết bị Android đến một phụ kiện.
0x2D03 âm thanh + adb
0x2D04 phụ kiện + âm thanh
0x2D05 phụ kiện + âm thanh + adb

Mã sản phẩm dùng trong AOAv1 (0x2D000x2D01) tiếp tục được hỗ trợ trong AOAv2.

Hỗ trợ âm thanh

AOAv2 bao gồm tính năng hỗ trợ đầu ra âm thanh từ thiết bị Android đến phụ kiện qua giao diện lớp âm thanh USB tiêu chuẩn có khả năng 2 kênh, 16 bit Âm thanh PCM với tốc độ bit 44100 Khz (có thể thêm các chế độ âm thanh khác trong tương lai).

Để bật tính năng hỗ trợ âm thanh, phụ kiện phải gửi một yêu cầu điều khiển USB mới:

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

Bạn phải gửi lệnh này trước khi gửi Lệnh ACCESSORY_START để chuyển sang chế độ phụ kiện.

Hỗ trợ HID

AOAv2 cho phép các phụ kiện đăng ký một hoặc nhiều Giao diện người dùng USB Thiết bị (HID) có thiết bị Android. Phương pháp này đảo ngược xu hướng của hoạt động giao tiếp của các thiết bị USB HID thông thường như chuột và bàn phím USB. Thông thường, thiết bị HID là thiết bị ngoại vi được kết nối với máy chủ USB (ví dụ: máy tính cá nhân), nhưng trong AOA, máy chủ USB có thể đóng vai trò là một hoặc nhiều đầu vào thiết bị sang thiết bị ngoại vi USB.

Hỗ trợ HID là một proxy cho các sự kiện HID tiêu chuẩn; thời gian không đưa ra giả định nào về nội dung hoặc loại sự kiện và chỉ cần truyền dữ liệu đó đến hệ thống đầu vào, cho phép phụ kiện AOAv2 hoạt động như bất kỳ thiết bị HID nào (chuột, bàn phím, tay điều khiển trò chơi, v.v.). Bạn có thể dùng HID hỗ trợ để cung cấp chức năng cơ bản, chẳng hạn như nút phát/tạm dừng trên nội dung nghe nhìn đế sạc hoặc cho chức năng nâng cao như đế sạc có chuột và bàn phím QWERTY đầy đủ.

AOAv2 bổ sung các yêu cầu mới về việc điều khiển USB để cho phép phụ kiện hoạt động như một hoặc nhiều thiết bị đầu vào HID sang thiết bị Android. Đã xử lý chế độ hỗ trợ HID hoàn toàn thông qua các yêu cầu điều khiển trên điểm cuối số 0, vì vậy sẽ không có giao diện USB mới nào cần thiết. Bốn yêu cầu kiểm soát mới là:

  • ACCESSORY_REGISTER_HID đăng ký một thiết bị HID mới bằng Thiết bị Android. Phụ kiện này cung cấp mã nhận dạng dùng để nhận dạng thiết bị HID cho 3 cuộc gọi còn lại. Mã này có hiệu lực cho đến khi USB ngắt kết nối hoặc phụ kiện gửi ACCESSORY_UNREGISTER_HID để huỷ đăng ký HID thiết bị.
  • ACCESSORY_UNREGISTER_HID huỷ đăng ký một thiết bị HID đã đăng ký trước đó với ACCESSORY_REGISTER_HID.
  • ACCESSORY_SET_HID_REPORT_DESC gửi mã mô tả báo cáo cho một thiết bị HID sang thiết bị Android. Yêu cầu này được dùng để mô tả các chức năng của thiết bị HID và phải được gửi trước khi báo cáo bất kỳ sự kiện HID nào thiết bị Android. Nếu phần mô tả báo cáo lớn hơn giá trị tối đa kích thước gói cho điểm cuối bằng 0, bội số ACCESSORY_SET_HID_REPORT_DESC lệnh được gửi để chuyển toàn bộ phần mô tả.
  • ACCESSORY_SEND_HID_EVENT gửi sự kiện đầu vào từ phụ kiện cho thiết bị Android.

Dưới đây là các định nghĩa mã cho các yêu cầu kiểm soát mới:

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

Khả năng tương tác với AOAv1

Giao thức ban đầu (AOAv1) cung cấp tính năng hỗ trợ để ứng dụng Android giao tiếp trực tiếp qua USB máy chủ lưu trữ (phụ kiện) qua USB. AOAv2 tiếp tục hỗ trợ và bổ sung các tính năng mới để cho phép phụ kiện tự giao tiếp với hệ điều hành Android (cụ thể là hệ thống âm thanh và đầu vào). Thiết kế của AOAv2 khiến nó có thể xây dựng một phụ kiện sử dụng tính năng hỗ trợ HID và âm thanh mới bên cạnh bộ tính năng ban đầu. Bạn chỉ cần sử dụng các tính năng mới cùng với các tính năng ban đầu.

Kết nối AOAv2 mà không có Ứng dụng cho Android

Bạn có thể thiết kế một phụ kiện (chẳng hạn như đế âm thanh) sử dụng âm thanh và HID nhưng không giao tiếp được với một ứng dụng trên thiết bị Android. Cho các phụ kiện này, người dùng không cần nhận lời nhắc qua hộp thoại để tìm và liên kết phụ kiện mới gắn với một ứng dụng Android có thể giao tiếp với thiết bị đó.

Để loại bỏ những hộp thoại như vậy sau khi một phụ kiện được kết nối, phụ kiện có thể chọn không gửi tên nhà sản xuất và kiểu máy cho thiết bị Android thiết bị. Khi bạn không cung cấp những chuỗi này cho thiết bị Android:

  • Hệ thống không cố gắng tìm ứng dụng để giao tiếp với phụ kiện.
  • Giao diện USB của phụ kiện không có trong USB của thiết bị Android cấu hình sau khi thiết bị chuyển sang chế độ phụ kiện.