原文地址:http://docs.eoeandroid.com/tools/adk/aoa2.html
翻译者:长剑耿介
创建日期:2012年11月01日
Android开放配件协议2.0
本文档介绍了自Android开放配件(AOA)协议最初版本发布后的一些改变,是AOA的第一个版本的补充。
AOA 2.0版新增了两项功能:音频输出(从Android设备输出到配件),并支持Android设备的配件作为一个或多个人机接口设备(HID)。提供给Android应用程序开发人员的Android SDK的API保持不变。
检测支持Android开放配件2.0
为了配件检测一个已连接的Android设备是否支持配件,以及处于何种协议层次,配件必须发送一个getProtocol()命令来检测结果。 支持Android开放配件协议最初版本的Android设备将返回1,即协议版本号。 支持本文档中描述的新功能协议的设备将返回2,亦为版本号。 2.0版本的协议是向上兼容的,所以为最初协议设计的配件仍然可以在较新的Android设备上运行。 如下从Android的开发套件2011 AndroidAccessory库的代码演示了该协议检查:
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;
}
AOA 2.0包括新的USB产品ID,在配件模式下,每个组合的USB都有一个接口与之对应。 可能的USB接口有:
- accessory -提供与一个Android应用程序通信的批量端点接口。
- audio-提供音频流从Android设备输出到配件的一种新的标准USB音频类接口。
- adb -仅用于调试配件而开发的配件接口。 只有用户在Android设备的设置中启用USB调试才能使用。
在AOA 1.0,只有两个USB产品ID:
- 0x2D00 -配件
- 0x2D01 -配件+adb
AOA 2.0增加了一个可选的USB音频接口,因此也包括了USB接口新组合的产品ID:
0x2D02 -音频 0x2D03 -音频+adb 0x2D04 -配件+音频 0x2D05 -配件+音频+adb
音频支持
AOA 2.0可选择支持从Android设备的音频输出到配件。 这个版本的协议支持标准的USB音频类接口,2通道16位PCM音频的比特率44100 kHz的能力。 AOA 2.0目前只限于此输出模式,但在未来可能会增加额外的音频模式。
为了获得音频支持,配件必须发送一个新的USB控制要求:
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
此命令必须在发送ACCESSORY_START命令进入配件模式前发送。
=== HID支持 ===(here) AOA 2.0允许配件在一部Android设备上注册一个或多个HID设备。 这种方法颠倒了如USB鼠标和键盘典型的USB HID设备通信的方向。 通常情况下,HID设备是连接到像个人计算机的USB主机的外围。 但在AOA协议情况下,USB设备就像是一个或多个输入设备的USB外围设备。
HID支持在AOA 2.0中只是标准HID活动的简单代理。 该实现不对内容或事件类型做任何假设,仅把它传递到输入系统,所以一个AOA 2.0配件可以作为任何HID设备(如:鼠标,键盘,游戏手柄等)。 它既可用于类似媒体上的播放/暂停按钮简单设备,也可作为类似带鼠标和QWERTY全键盘的对接站一样复杂的设备。
AOA 2.0协议添加了四个新的USB控制请求,允许该配件作为Android设备的一个或多个HID输入设备。 由于HID支持完全是通过端点0的控制请求完成,所以提供这种支持不需要新的USB接口。 控制要求如下:
ACCESSORY_REGISTER_HID为Android设备注册一个新的HID设备。 配件提供了一个ID号,用于识别其他三个HID设备的调用。在USB断开前,或到配件发送ACCESSORY_UNREGISTER_HID注销HID设备,该ID都是有效地。 ACCESSORY_UNREGISTER_HID注销先前用ACCESSORY_REGISTER_HID注册的HID设备。 ACCESSORY_SET_HID_REPORT_DESC发送一个描述符的HID设备的报告到Android设备。 这个请求用来描述HID设备的作用,必须在任何HID事件钱发送到Android设备。 如果该报告描述符大于端点0的最大数据包大小,则发送多个ACCESSORY_SET_HID_REPORT_DESC命令以转移整个描述符。 ACCESSORY_SEND_HID_EVENT从配件发送输入事件到到Android设备。 这些新的控制请求的代码定义如下:
/* 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
与AOA 1.0功能的互操作性
原AOA协议提供了一个Android应用程序通过USB与USB主机(配件)直接进行通信的支持。 AOA 2.0保留了该支持,但增加了新的功能,让配件与Android操作系统本身通信(特别是音频输入系统)。 AOA 2.0的设计使得它可以构建一个配件,也使得除了原有的功能集外新的音频和/或HID的支持得到使用。 除了原来的AOA协议功能,可以容易地使用本文档中描述的新功能。
不通过应用程序连接AOA 2.0
可以设计一个配件(例如,音频基座(audio dock))使用新的音频和HID支持,但并不需要在Android设备上的应用程序进行通信。 在这种情况下,用户不希望看到提示发现和连接新的可以与应用程序通信的配件的相关对话框。 为了防止这些对话框在设备和配件连接后出现,配件可以不向Android设备发送制造商和型号的名称。 如果这些字符串没有提供给Android设备,在AOA 2.0下,配件可以使用新的音频和HID支持,而不需系统试图找到一个应用程序与配件进行通信。 另外,如果没有提供这些字符串,该设备进入配件模式后,配件的USB接口是不存在在Android设备的USB配置中的。