安卓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 thedevice 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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓USB开发教程 六 安卓 AOA 2.0

Android Open Accessory Protocol 2.0 目录 Detecting AOAv2 support Audio support HID support Interoperability with AOAv1 Connecting AOAv2 without an Android app This document describes changes in the Android Open Accessory (AOA) protocol since its initial re…

Linux 驱动编译报错:error: macro __DATE__ might prevent reproducible builds [-Werror=date-time]

编译驱动时遇到这个错误提示,表示当前编译环境中将关于 DATE 以及 TIME 的警告也作为错误来进行处理的。有如下几种方法可以参考: 1. 在编译驱动的相应 Makefile 中增加一行:CFLAGS -Wno-errordate-time,然后保存重新 make&…

Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct

Javastruct 是什么 简而言之,Javastruct 是一个第三方库,用于像处理 C 或者 C 结构体那样处理 java 对象。也即利用 Javastruct 可以在 java 上实现类似于结构体的功能和操作。 Javastruct 的用途 在 java 或者 Android 应用程序与一些嵌入式设备通讯…

Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析

使用环境 前一篇在介绍 JavaStruct 类时指定了使用库使用环境为 Java 5 及以上,也即开发我们使用的 JDK 版本为1.5及以上就可以了。以下讲解的用例可以直接将 code 直接粘贴到 java 的 main 函数中执行就可以了,后面会给出测试用例和结果。 使用方法 Jav…

Java 结构体之 JavaStruct 使用教程三 JavaStruct 数组进阶

经过前面两篇博客的介绍,相信对于 JavaStruct 的认识以及编程使用,读者已经有一定的基础了。只要理解和实践结合起来,掌握还是很容易的。下面进行一些数组使用方面的实例说明及演示。 在结构体类中使用数组有几种方式,可以使用静…

Android开发如何使用JNA

1. JNA(Java Native Access)项目已经迁移到 github,最新的项目链接:https://github.com/java-native-access/jna 。首先前往该地址下载使用 JNA 需要的两个 jar 库文件,jna.jar,jna-platform.jar 。 2. 在…

JAVA循环队列

关于自定义循环队列的实现原理和要点可以参见之前的博文系列:循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构,为什么还要单独实现循环队列&#…

VMware 虚拟机占用磁盘空间

使用VMware创建的虚拟机尽管已经设定分配的磁盘大小,但仍然会发现虚拟机占用的磁盘空间会越来越大,而直观体现就是虚拟机系统文件 vmdk 不断增大。因此下面介绍一个简单的方法,使用 VMware 自带的工具对 vmdk 文件进行压缩以节省磁盘空间。拿…

frameworks/av/media/CedarX-Projects/CedarAndroidLib/LIB_KK44_/Android.mk: No such file or directory

在安卓系统编译过程中如果遇到上述或者与之类似的错误,可以采取相同的处理方法进行解决。直接进入到 CedarAndroidLib 目录下,也即此例中的 frameworks/av/media/CedarX-Projects/CedarAndroidLib。看一下当前文件: 注意第9行为包含标题中报错…

《言简意赅之Linux设备驱动编程》 前言

linux 内核与驱动开发是一门很深的学问,主要是由于覆盖知识面较广、内核架构设计层级较深、软硬件知识要兼具。因此自己在学习理解时会经常遇到某一章节需要反复阅读理解多次。所以,我想用一种言简意赅的方式讲述 Linux 内核与设备驱动开发。我认为把一个…

Windows与Linux下tftp服务的使用

tftp 协议是基于 udp 的,轻量小巧,用在局域网和嵌入式上很顺手。大部分帖子把在 linux 上配置的过程描述的过于复杂,其实只是个工具而已。研究协议抓下包对比协议内容也可以满足需求了,下面进入正文。分别讲下在 linux 以及 windo…

Vmware提示:the operation was canceled by the user

一般遇到这种情况是由于当前虚拟机资源中的资源文件被其他进程占用导致的。如果你的系统中有 DAEMON Tools Lite 软件,那么多半是因为这个原因。因此下面针对此情况提出两种解决办法: 1. 检查有无安装 DAEMON Tools Lite 软件,若安装此程序&a…

USB OTG 的进一步理解

一直以来在做安卓系统相关的嵌入式通讯(USB、BLE、网络、串口等),最近在讨论 OTG 问题的时候,对该规范又重新理解了一次,这里仅做一些概要和核心点说明,下方会给出具体 OTG 包含协议的参考链接,…

中标麒麟/NeoKylin U盘安装系统

这里以 NeoKylin6 为例,其他版本与此相类似大同小异。但是下载指定版本的镜像时要注意配合该版本的软件包是否充足,不然就会遇到安装好系统很多软件无法安装或更新的情况。 1. 官方下载地址:http://download.cs2c.com.cn/neokylin/desktop/re…

中标麒麟/NeoKylin 安装QT开发环境

1. 如果你对中标麒麟系统安装有疑问&#xff0c;请阅读上一篇文章&#xff1a;《中标麒麟/NeoKylin U盘安装系统》。 2. 进入系统打开终端&#xff0c;以 root 模式操作。 <1> yum install gstream* libXext-devel libX11-devel<2> ln -s /usr/lib64/libXrender.so…

饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一)&#xff1a;超大便携背包&#xff0c;超大物品栏&#xff0c;永久保鲜 饥荒中的物品没有详细信息&#xff0c;基本上只有一个名字&#xff0c;所以很多物品的功能都不知道&#xff0c;比如浆果吃了也不知道恢复什么&#xff0c; 采集的胡萝卜也不知道什么功…

解决 Windows Update 更新错误/无法创建还原点 代码 0x80246008

这个问题在我的电脑上由来已久&#xff0c;但是大部分的更新工作可以由其他第三方软件来完成&#xff0c;所有有时候得过且过。但同时&#xff0c;有一些棘手的问题&#xff0c;会提示系统进行 Windows Update&#xff0c;只有硬着头皮解决了。如果你遇到了“系统无法创建还原点…

安卓App报错:android.os.FileUriExposedException

安卓7.0开始&#xff0c;不再允许在App中把 file://Uri 暴露给其他App&#xff0c;因此在代码中需要做下版本判断&#xff0c;在7.0版本及以上需要使用 FileProvider 生成 content://Uri 来代替 file://Uri。同时安卓工程需要做以下调整&#xff1a; 1、在 AndroidManifest.xml…

Android/Linux 系统添加对多点触摸屏的支持

含有 HID 多点触摸控制器的触摸屏、触摸板在 Android 和 Linux 内核中都是由 "hid-multitouch" 驱动进行支持的。因此如果你的系统连接触摸屏没有反应&#xff0c;问题基本都出于驱动未加载或者与触摸屏的 VID 与 PID 不适配。以下分情形讨论&#xff1a; 1、系统中已…

安卓获取屏幕最大(绝对)分辨率

安卓开发时&#xff0c;在很多应用场景需要获取手机屏幕的真实分辨率&#xff0c;然而查阅了大部分博客提供的获取方法发现获取方法并不对。下面几种常用的方法&#xff08;错误&#xff09;和最终正确获取的方法均会展示在下面。 实验场景&#xff1a;Activity&#xff08;隐…