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 phát hành đầu tiên và bổ sung cho tài liệu AOA 1.0 . AOAv2 bổ sung các tính năng sau:

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

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

Phát hiện hỗ trợ AOAv2

Để xác định xem thiết bị Android được 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 gốc 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 Bộ công cụ phát triển phụ kiện 2011 ( <adk-src>/adk1/board/AndroidAccessory/AndroidAccessory.cpp ) minh họa 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 ID 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 ID sản phẩm Giao tiếp Sự miêu tả
AOAv1 0x2D00 phụ kiện Cung cấp hai điểm cuối hàng loạt để liên lạc 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ỉ khả dụng nếu người dùng đã bật Gỡ lỗi USB trong cài đặt thiết bị Android.
AOAv2 0x2D02 âm thanh Để truyền âm thanh từ thiết bị Android sang phụ kiện.
0x2D03 âm thanh + adb
0x2D04 phụ kiện + âm thanh
0x2D05 phụ kiện + âm thanh + adb

ID 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 bao gồm hỗ trợ đầu ra âm thanh từ thiết bị Android đến phụ kiện thông qua giao diện lớp âm thanh USB tiêu chuẩn có khả năng âm thanh PCM 2 kênh, 16 bit với tốc độ bit 44100 Khz (các chế độ âm thanh bổ sung có thể được thêm vào trong tương lai).

Để bật hỗ trợ âm thanh, phụ kiện phải gửi 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

Lệnh này phải được gửi trước khi gửi lệnh ACCESSORY_START để vào 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 con người USB (HID) với thiết bị Android. Cách tiếp cận này đảo ngược hướ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à 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ể hoạt động như một hoặc nhiều thiết bị đầu vào cho thiết bị ngoại vi USB.

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

AOAv2 bổ sung các yêu cầu điều khiển USB mới cho phép phụ kiện hoạt động như 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 số 0, do đó không cần giao diện USB mới. Bốn yêu cầu kiểm soát mới là:

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

Các định nghĩa mã cho các yêu cầu điều khiển 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 ) cung cấp hỗ trợ cho ứ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 thêm 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à đầu vào). Thiết kế của AOAv2 cho phép tạo ra một phụ kiện sử dụng hỗ trợ âm thanh và HID mới bên cạnh bộ tính năng ban đầu. Đơn giả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 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 những phụ kiện này, người dùng không cần nhận lời nhắc trong hộp thoại để tìm và liên kết phụ kiện mới được gắn với ứng dụng Android có thể giao tiếp với phụ kiện đó.

Để chặn những hộp thoại như vậy sau khi 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à kiểu máy tới 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 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 cấu hình USB của thiết bị Android sau khi thiết bị chuyển sang chế độ phụ kiện.