Android AOA 通道 FW 层建立

本文详细介绍了Android系统中AOA(Android Open Accessory)通道的建立过程,包括HOST模式和Accessory模式的转换。在HOST模式下,Android设备检测USB设备是否处于Accessory模式,如果不是,则通过control transfer请求设备切换。在Accessory模式下,设备启动特定应用并与HOST端进行通信。内容涵盖了kernel、framework层以及应用层的交互细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

                  基于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端不处于accessory模式

   }

 }

... ...

}

usb_device_added函数的主要作用是:

  1. 获取连接设备的Vid 和Pid 数值;
  2. 先判断Vid是否为0x18D1 或者0x11B8 或者 0x04e8,如果为以上Vid 中的一种,表示此设备支持accessory模式;如果不为上述Vid中的一种,则表示不支持accessory模式;
  3. 判断Pid是否为0x2D00 或0x2D01中的一种,如果是,则表示设备当前处于accessory模式;如果不是,则表示设备当前不处于accessory模式;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值