基于LC6500 模块AOA 通道的建立
1.AOA 介绍
AOA 为Android Open Accessory的缩写,简单点说,就是Android支持的USB 设备形态中的一种。
一个Andorid系统的AOA模式分为两种:
- HOST模式:
Android 设备在HOST模式下,将会提供电源给外部设备并与之建立通信。
- Accessory模式:
Android 设备在Accessory模式下,将与一个可识别Android USB 设备的设备进行连接并进行通信,且将由此设备给予Accessory 模式下的Andorid设备以电源。
2.具体模式解析
\* MERGEFORMAT
2.1 HOST 模式
处于HOST 模式下的Android device,通过检测连接上的USB 设备是否处于Accessory模式,如果处于accessory模式,则直接建立通道;如果不处于Accessory模式,则通过control transfer 要求连接的USB 设备先切换为accessory模式再建立通道。
我们具体分析一下CLIENT端连接HOST端时未处于Accessory模式下时的流程
注: 因为涉及到监听USB device 的状态,我们一下代码都依赖于libusb的库。
2.1.1 监听USB设备的连接/拔出
int main(int argc, char* argv[]) {
struct usb_host_context* context = usb_host_init();
... ...
// this will never return so it is safe to pass thiz directly
usb_host_run(context, usb_device_added, usb_device_removed, NULL, NULL);
return 0;
}
main()的主要作用就是:
- 获取libusbhost 库环境;
- 调用usb_host_run函数注册监听USB device设备的添加或拔出。USB devices添加时,会调用usb_device_added的回调;USB devices拔出时,会调用usb_device_removed的回调。
2.1.2 判断CLIENT端是处于accessory模式
static int usb_device_added(const char *devname, void* client_data) {
... ...
struct usb_device *device = usb_device_open(devname)
... ...
vendorId = usb_device_get_vendor_id(device);
productId = usb_device_get_product_id(device);
if (vendorId == 0x18D1 || vendorId == 0x22B8 || vendorId == 0x04e8) {
//CLIENT端支持accessory模式
if (!sDevice && (productId == 0x2D00 || productId == 0x2D01)){
//CLIENT端处于accessory模式
} else {
//CLIENT端不处于