Phụ kiện mở Android 1.0

Phụ kiện USB của Android phải tuân thủ giao thức Phụ kiện mở Android (AOA), giao thức này xác định cách phụ kiện phát hiện và thiết lập liên lạc với thiết bị chạy Android. Phụ kiện cần thực hiện các bước sau:

  1. Chờ và phát hiện thiết bị được kết nối.
  2. Xác định hỗ trợ chế độ phụ kiện của thiết bị.
  3. Cố gắng khởi động thiết bị ở chế độ phụ kiện (nếu cần).
  4. Nếu thiết bị hỗ trợ AOA, hãy thiết lập liên lạc với thiết bị.

Các phần sau đây giải thích cách thực hiện các bước này.

Chờ và phát hiện các thiết bị được kết nối

Các phụ kiện phải liên tục kiểm tra các thiết bị chạy Android được kết nối. Khi một thiết bị được kết nối, phụ kiện sẽ xác định xem thiết bị đó có hỗ trợ chế độ phụ kiện hay không.

Xác định hỗ trợ chế độ phụ kiện

Lưu ý: Không cần gỡ lỗi USB để kết nối các phụ kiện nhưng ADB có thể cần thiết trong quá trình phát triển. Để biết chi tiết, hãy xem Cân nhắc gỡ lỗi .

Khi một thiết bị chạy Android kết nối, thiết bị đó có thể ở một trong ba trạng thái:

  • Hỗ trợ chế độ phụ kiện Android và đã ở chế độ phụ kiện.
  • Hỗ trợ chế độ phụ kiện Android nhưng không ở chế độ phụ kiện.
  • Không hỗ trợ chế độ phụ kiện Android.

Trong quá trình kết nối ban đầu, phụ kiện phải kiểm tra phiên bản, ID nhà cung cấp và ID sản phẩm của bộ mô tả thiết bị USB của thiết bị được kết nối. ID nhà cung cấp phải khớp với ID của Google ( 0x18D1 ). Nếu thiết bị đã ở chế độ phụ kiện thì ID sản phẩm phải là 0x2D00 hoặc 0x2D01 và phụ kiện có thể thiết lập liên lạc với thiết bị thông qua các điểm cuối truyền hàng loạt bằng giao thức liên lạc của chính nó (không cần khởi động thiết bị ở chế độ phụ kiện).

Lưu ý: 0x2D00 được dành riêng cho các thiết bị chạy Android hỗ trợ chế độ phụ kiện. 0x2D01 được dành riêng cho các thiết bị hỗ trợ chế độ phụ kiện cũng như giao thức Cầu gỡ lỗi Android (ADB), hiển thị giao diện thứ hai với hai điểm cuối hàng loạt cho ADB. Bạn có thể sử dụng các điểm cuối này để gỡ lỗi ứng dụng phụ kiện nếu bạn đang mô phỏng phụ kiện trên máy tính. Nói chung, không sử dụng giao diện này trừ khi phụ kiện thực hiện chuyển tiếp tới ADB trên thiết bị.

Nếu phiên bản, ID nhà cung cấp hoặc ID sản phẩm trong bộ mô tả thiết bị USB không khớp với giá trị mong đợi thì phụ kiện không thể xác định xem thiết bị có hỗ trợ chế độ phụ kiện Android hay không. Phụ kiện phải cố gắng khởi động thiết bị ở chế độ phụ kiện (chi tiết bên dưới) để xác định hỗ trợ thiết bị.

Điểm quan trọng: Phụ kiện USB phải gửi tiêu đề khi bắt tay lần đầu. Tiêu đề chứa nhà sản xuất, kiểu máy và phiên bản. Mặc dù phiên bản là trường tùy chọn nhưng nếu một ứng dụng Android được cài đặt chỉ khớp với phiên bản nhưng phụ kiện không gửi phiên bản thì các thiết bị Android chạy trên Android 10 trở xuống sẽ khởi động lại do có một ngoại lệ được đưa ra trong quá trình hệ thống.

Cố gắng khởi động ở chế độ phụ kiện

Nếu ID phiên bản, nhà cung cấp và sản phẩm không tương ứng với thiết bị chạy Android ở chế độ phụ kiện thì phụ kiện không thể xác định xem thiết bị có hỗ trợ (nhưng không ở) chế độ phụ kiện hay thiết bị không hỗ trợ chế độ phụ kiện. Điều này có thể xảy ra do các thiết bị hỗ trợ chế độ phụ kiện (nhưng không ở chế độ phụ kiện) ban đầu báo cáo mã sản phẩm và nhà cung cấp của nhà sản xuất thiết bị thay vì mã sản phẩm và nhà cung cấp AOA .

Phụ kiện nên thử khởi động thiết bị ở chế độ phụ kiện để xác định xem thiết bị có hỗ trợ chế độ đó hay không:

  1. Gửi yêu cầu kiểm soát 51 ("Nhận giao thức") để xác định xem thiết bị có hỗ trợ giao thức phụ kiện Android hay không. Nếu thiết bị hỗ trợ giao thức, nó sẽ trả về một số khác 0 đại diện cho phiên bản giao thức được hỗ trợ. Yêu cầu điều khiển nằm ở điểm cuối 0 với các đặc điểm sau:
    requestType:    USB_DIR_IN | USB_TYPE_VENDOR
    request:        51
    value:          0
    index:          0
    data:           protocol version number (16 bits little endian sent from the
                    device to the accessory)
    
  2. Nếu thiết bị trả về phiên bản giao thức được hỗ trợ, hãy gửi yêu cầu điều khiển kèm theo thông tin chuỗi nhận dạng tới thiết bị. Thông tin này cho phép thiết bị xác định ứng dụng phù hợp cho phụ kiện (hoặc hiển thị URL cho người dùng nếu ứng dụng phù hợp không tồn tại). Yêu cầu điều khiển nằm ở điểm cuối 0 (đối với mỗi ID chuỗi) với các đặc điểm sau:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        52
    value:          0
    index:          string ID
    data            zero terminated UTF8 string sent from accessory to device
    

    Các ID chuỗi sau được hỗ trợ, với kích thước tối đa là 256 byte cho mỗi chuỗi (phải được kết thúc bằng 0 bằng \0 ).

    manufacturer name:  0
    model name:         1
    description:        2
    version:            3
    URI:                4
    serial number:      5
    
  3. Gửi yêu cầu điều khiển để yêu cầu thiết bị khởi động ở chế độ phụ kiện. Yêu cầu điều khiển nằm ở điểm cuối 0 với các đặc điểm sau:
    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
    request:        53
    value:          0
    index:          0
    data:           none
    

Sau khi hoàn thành các bước này, phụ kiện sẽ đợi thiết bị USB được kết nối tự hiển thị lại trên bus ở chế độ phụ kiện, sau đó liệt kê lại các thiết bị được kết nối. Thuật toán xác định hỗ trợ chế độ phụ kiện bằng cách kiểm tra ID nhà cung cấp và ID sản phẩm. ID này phải chính xác (ví dụ: tương ứng với ID nhà cung cấp và sản phẩm của Google thay vì ID của nhà sản xuất thiết bị) nếu thiết bị chuyển sang chế độ phụ kiện thành công. Nếu ID và phiên bản chính xác, phụ kiện sẽ di chuyển để thiết lập liên lạc với thiết bị .

Lưu ý: AOA hiện không hỗ trợ kết nối AOA và MTP đồng thời. Để chuyển từ AOA sang MTP, trước tiên phụ kiện phải ngắt kết nối thiết bị USB (theo cách tương đương về mặt vật lý hoặc điện) rồi kết nối lại bằng MTP.

Nếu bất kỳ bước nào không thành công, phụ kiện sẽ xác định thiết bị không hỗ trợ chế độ phụ kiện Android và chờ thiết bị tiếp theo kết nối.

Thiết lập liên lạc với thiết bị

Nếu phụ kiện phát hiện thấy một thiết bị chạy Android ở chế độ phụ kiện thì phụ kiện đó có thể truy vấn giao diện thiết bị và bộ mô tả điểm cuối để lấy các điểm cuối hàng loạt nhằm giao tiếp với thiết bị.

Số lượng giao diện và điểm cuối số lượng lớn tùy thuộc vào ID sản phẩm. Một thiết bị chạy Android có ID sản phẩm là:

  • 0x2D00 có một giao diện với hai điểm cuối lớn để liên lạc đầu vào và đầu ra.
  • 0x2D01 có hai giao diện với hai điểm cuối lớn cho mỗi giao tiếp đầu vào và đầu ra. Giao diện đầu tiên xử lý giao tiếp tiêu chuẩn và giao diện thứ hai xử lý giao tiếp ADB. Để sử dụng giao diện, hãy xác định điểm cuối đầu vào và đầu ra hàng loạt đầu tiên, đặt cấu hình thiết bị thành giá trị 1 với yêu cầu thiết bị SET_CONFIGURATION ( 0x09 ), sau đó giao tiếp bằng cách sử dụng điểm cuối.