Android AOA 通道 FW 层建立

  

                  基于LC6500 模块AOA 通道的建立

 

 

1.AOA 介绍

AOA 为Android Open Accessory的缩写,简单点说,就是Android支持的USB 设备形态中的一种。

一个Andorid系统的AOA模式分为两种:

 

  1. HOST模式:

   

Android 设备在HOST模式下,将会提供电源给外部设备并与之建立通信。

 

  1. 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()的主要作用就是:

  1. 获取libusbhost 库环境;
  2. 调用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端不处于

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值