Phụ kiện mở Android 2.0

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

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

Các API SDK Android 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ợ phụ kiện và phiên bản giao thức được hỗ trợ hay không, phụ kiện phải gửi lệnh getProtocol() và kiểm tra kết quả. Các 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 làm 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.

Ví dụ sau đây từ thư viện mã nguồn (<adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp) của Bộ phát triển phụ kiện 2011 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 bao gồm mã sản phẩm USB mới cho mỗi tổ hợp giao diện USB có sẵn ở 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 hai điểm cuối hàng loạt để giao tiếp với một ứng dụng Android.
0x2D01 phụ kiện + adb Để 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 tuỳ chọn 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 sang 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 được sử dụng trong AOAv1 (0x2D000x2D01) tiếp tục được hỗ trợ trong AOAv2.

Hỗ trợ âm thanh

AOAv2 hỗ trợ đầu ra âm thanh từ thiết bị Android đến một phụ kiện thông qua giao diện lớp âm thanh USB tiêu chuẩn có thể phát âm thanh PCM 2 kênh, 16 bit với tốc độ bit là 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 Thiết bị giao diện người dùng (HID) USB với thiết bị Android. Phương pháp này đảo ngược hướng giao tiếp cho 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à một thiết bị ngoại vi được kết nối với máy chủ USB (tức là 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 thiết bị đầu vào cho thiết bị ngoại vi USB.

Tính năng hỗ trợ HID là một proxy cho các sự kiện HID tiêu chuẩn; quá trình triển khai không đưa ra giả định về nội dung hoặc loại sự kiện mà chỉ chuyển sự kiện đó đế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ể sử dụng tính năng hỗ trợ HID để 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 một đế sạc đa phương tiện hoặc cho chức năng nâng cao như một đế sạc có chuột và bàn phím QWERTY đầy đủ.

AOAv2 thêm các yêu cầu điều khiển USB mới cho phép phụ kiện đóng vai trò là một hoặc nhiều thiết bị đầu vào HID cho thiết bị Android. Hỗ trợ HID được xử lý hoàn toàn thông qua các yêu cầu điều khiển trên điểm cuối 0, vì vậy, không cần giao diện USB mới. Có 4 yêu cầu kiểm soát mới như sau:

  • ACCESSORY_REGISTER_HID đăng ký một thiết bị HID mới với thiết bị Android. Phụ kiện cung cấp một mã nhận dạng dùng để xác định thiết bị HID cho ba lệnh gọi còn lại. Mã nhận dạng này có hiệu lực cho đến khi USB ngắt kết nối hoặc cho đến khi phụ kiện gửi ACCESSORY_UNREGISTER_HID để huỷ đăng ký thiết bị HID.
  • ACCESSORY_UNREGISTER_HID huỷ đăng ký một thiết bị HID đã đăng ký trước đó bằng ACCESSORY_REGISTER_HID.
  • ACCESSORY_SET_HID_REPORT_DESC gửi một chỉ số mô tả báo cáo cho thiết bị HID đến thiết bị Android. Yêu cầu này 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 cho thiết bị Android. Nếu chỉ số mô tả báo cáo lớn hơn kích thước gói tối đa cho điểm cuối 0, thì nhiều lệnh ACCESSORY_SET_HID_REPORT_DESC sẽ được gửi để chuyển toàn bộ chỉ số mô tả.
  • ACCESSORY_SEND_HID_EVENT gửi các sự kiện đầu vào từ phụ kiện đến thiết bị Android.

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

/* 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) hỗ trợ ứng dụng Android giao tiếp trực tiếp với máy chủ USB (phụ kiện) qua USB. AOAv2 tiếp tục hỗ trợ này và bổ sung các tính năng mới để cho phép phụ kiện giao tiếp với chính hệ điều hành Android (cụ thể là hệ thống âm thanh và hệ thống đầu vào). Thiết kế của AOAv2 cho phép bạn tạo một phụ kiện sử dụng tính năng hỗ trợ âm thanh và HID mới ngoài 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ần ứng dụng Android

Bạn có thể thiết kế một phụ kiện (chẳng hạn như đế âm thanh) sử dụng tính năng hỗ trợ âm thanh và HID nhưng không giao tiếp với ứng dụng trên thiết bị Android. Đối với các phụ kiện này, người dùng không cần nhận lời nhắc 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 phụ kiện đó.

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

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