安卓USB开发教程 <五> 安卓 AOA 1.0

Android Open Accessory Protocol 1.0(AOA 协议 1.0)

Android USB 配件必须遵从 Android Open Accessory(AOA)协议,该协议定义了配件如何检测和建立与 Android 设备的通信。配件应执行以下步骤:

1. 等待并检测连接的设备

2. 确定设备的配件模式支持

3. 尝试以配件模式下启动设备(如果需要)

4. 如果设备支持 AOA,与设备建立通信

以下部分介绍如何实现这些步骤。

Note:在开发通过 USB 连接到 Android 设备的新配件时,请使用 AOAv2

等待并检测连接的设备

配件应该连续检查连接的 Android 设备。连接设备时,配件应确定设备是否支持配件模式。

确定配件模式支持

当连接 Android 设备时,它可以是以下三种状态之一:

1. 支持 Android 配件模式,并已经处于配件模式。

2. 支持 Android 配件模式,但不处于配件模式。

3. 不支持 Android 配件模式。

在初始连接期间,附件应检查连接设备的 USB 设备描述符的厂商 ID 和产品 ID。厂商 ID 应该匹配 Google 的 ID(0x18D1)。如果设备已经处于配件模式,产品 ID 应为0x2D000x2D01,配件可以使用自己的通信协议通过批量传输端点 establish communication with the device(设备不需要在附件模式下启动)。

Note:0x2D00 保留给支持配件模式的 Android 设备。0x2D01 保留用于支持配件模式的设备以及 Android Debug Bridge(ADB)协议,该协议显示了用于 ADB 协议的有两个批量端点的第二个接口。如果你正在计算机上模拟配件,可以使用这些端点来调试配件应用程序。通常,不要使用此接口,除非配件在设备上实现到 ADB 的传输。

如果 USB 设备描述符中发现的厂商 ID 或产品 ID 与预期值不匹配,则配件无法确定设备是否支持 Android 配件模式。配件应尝试以配件模式(详细说明如下)启动设备,以确定设备支持情况。

尝试从配件模式启动

如果厂商和产品 ID 与配件模式下的 Android 设备不相符,则配件无法辨别设备是否支持(支持但不处于)配件模式,或者设备是否不支持配件模式。这可能是因为支持配件模式(但不处于配件模式)的设备最初报告设备制造商厂商和产品 ID 而不是 AOA 厂商和产品 ID。

配件应尝试以配件模式启动设备,以确定设备是否支持该模式:

1. 发送 51 控制请求(“Get Protocol”)以确定设备是否支持 Android 配件协议。如果设备支持协议,则返回非零数字,表示支持的协议版本。控制请求在端点0上具有以下特征:

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. 如果设备返回支持的协议版本,则向设备发送带有标识字符串信息的控制请求。该信息允许设备确定适合配件的应用(或者向用户呈现 URL 若不存在适合的应用)。控制请求位于端点0(对于每个字符串 ID),具有以下特征:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        52
value:          0
index:          string ID
data            zero terminated UTF8 string sent from accessory to device

支持以下字符串ID,每个字符串的最大为256字节(必须以 \ 0 为零终止)。

manufacturer name:  0
model name:         1
description:        2
version:            3
URI:                4
serial number:      5

3. 发送控制请求,要求设备以配件模式启动。控制请求在端点0上具有以下特征:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR
request:        53
value:          0
index:          0
data:           none

完成这些步骤后,配件应等待连接的 USB 设备在配件模式下将其自身重新引入总线,然后重新枚举所连接的设备。如果设备成功切换到配件模式,则通过检查厂商和产品 ID 的算法determines accessory mode support 应该是正确的(例如,对应于Google的供应商和产品ID而不是设备制造商的ID)。如果 ID 正确,则配件移动至 establish communication with the device

Note:AOA 当前不支持同时进行 AOA 和 MTP 连接。 要从 AOA 切换到 MTP,配件必须首先断开 USB 设备(物理上或电气上等效的方式),然后使用 MTP 重新连接。

如果任何步骤失败,配件确定设备不支持 Android 配件模式,并等待下一个设备连接。

建立与设备的通信

如果配件检测到处于配件模式的 Android 设备,则配件可以查询设备接口和端点描述符,以获取与设备通信的批量端点。
接口和批量端点的数量取决于产品 ID。 Android 设备有产品 ID:

1. 0x2D00 具有一个有两个批量端点的接口,用于输入和输出通信。

2. 0x2D01 具有两个接口,每个接口具有两个批量端点,用于输入和输出通信。 第一个接口处理标准通信,第二个接口处理 ADB 通信。 要使用接口,请找到第一个批量输入和输出端点,使用 SET_CONFIGURATION(0x09)设备请求将设备配置设置为 1,然后使用端点进行通信。


原文链接:https://source.android.com/devices/accessories/aoa



猜你喜欢

转载自blog.csdn.net/jazzsoldier/article/details/74908963