安卓开放性配件协议1.0

译自:https://source.android.com/accessories/aoa.html

AndroidOpen Accessory Protocol 1.0(AOAP 1.0)

安卓开放性配件协议1.0

 

            一个安卓USB配件必须遵循安卓开放性配件协议,这个协议定义了USB配件的查找以及同安卓设备的通信。总之,一个USB配件必须执行以下几个步骤:

  等待以及探测已连接的设备。

  决定设备配件的支持模式。

  如有需要,在从属模式下启动设备。

  如果支持AOA协议,则与其建立通信连接。

下面具体解释这几步是如何实现的。

 

等待以及探测已连接的设备

为了连接到安卓设备,你的USB配件必须可以连续不断地检查接入点设备。当一个设备连接上来,你的USB配件要判断其是否支持USB从属模式。

 

决定设备配件的支持模式

当一个安卓设备连接之后,有以下三种可能的状态:

a.硬件支持安卓USB从属模式,并且它已经处在从属模式中了。

b.硬件支持安卓USB从属模式,但并不在从属模式中。

c.硬件不支持安卓USB从属模式。

在初始连接时,USB配件要检查设备的Verdor ID (VID)和product ID (PID),通过设备的USB硬件描述符。VID要与谷歌的ID(0x18D1)相符,如果设备已经处在从属模式(状态a),PID应该是0x2D00或0x2D01。由此,USB配件就能够以自己的通信协议(AOA)通过批量数据传输端口建立与设备之间的通信了。不需要在从属模式下启动设备。

注意:0x2D00是为支持USB从属模式的安卓设备保留的;0x2D01是为USB从属模式和ADB (Android DebugBridge)协议均支持的安卓设备保留的,对于ADB的两个批量端口,这公开的第二个接口。如果你是在一台电脑上模拟,那么你就可以使用这一端口来调试配套的应用。总之,除非你的USB配件是通过ADB向设备传输,那么就不要使用这个端口。

如果VID和PID不匹配,就没有办法辨别出状态b和状态c,因此就需要尝试在从属模式下启动设备,以判断设备是否支持。

 

如有需要,在从属模式下启动设备

如果VID和PID不符合从属模式下的安卓设备的标志,USB配件就不确定设备是不是支持USB从属模式而只是不在从属状态,又或者设备压根就不支持USB从属模式。这是因为设备可能并没有对AOA协议提供专门的支持,它可以支持USB从属模式,但设备制造商的VID和PID不在初始报告中(?)。在这两种情况里,USB配件就要尝试让硬件进入USB从属模式,以弄清楚硬件是否支持它。下面将分几步介绍来如何做:

  发送控制请求来弄清楚硬件是否支持AOA协议。如果硬件支持这个协议,就会返回一个非零的数字,代表它所支持的协议版本。这个位于端口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)

 

 

 

 

 

 

 

 

 


  如果设备返回了一个合适的版本号,就给设备发送身份字符信息。设备会根据这些信息为USB配件选择一个合适的应用程序(app),如果没有合适的应用程序,也会给用户提供一个URL。这些位于端口0的控制请求具有以下特点:

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

 

 

 

 

 

 

 

 

 


  当识别字符串被发送,就请求硬件进入USB从属模式。这些位于端口0的控制请求具有以下特点:

requestType:    USB_DIR_OUT | USB_TYPE_VENDOR

request:        53

value:          0

index:          0

data:           none

 

 

 

 

 

 

 

 

 


发送了最终的控制请求后,连接了的USB设备要以USB从属模式的形式重新引入总线,并且USB配件可以重新枚举已连接的设备。算法流程跳回到“决定设备配件的支持模式”这一环节,再来检查VID和PID。如果硬件成功地转换到了从属模式,这时的VID和PID将和原先不同:会以谷歌的VID和PID取代原先的制造商ID。现在,USB配件就可以同设备建立通信连接了。

 

 

同设备建立通信连接

如果一个处在USB从属模式下的安卓设备被侦测到,USB配件就可以查询硬件接口和端口描述符来获取批量端点,从而与设备达成通信。PID为0x2D00的安卓设备有一个带有两个批量端点的接口,用以进行输入输出通信;PID为0x2D01的安卓设备有两个带有两个批量端点的接口,第一个接口是用于标准通信的,而第二个是用于ADB通信。为了在一个接口进行通信,你需要做的就是找出第一个批量输入输出的端点,通过设备请求“SET_CONFIGURATION(0x09)”将设备配置设置为1,然后再使用端点进行通信。

 

 

 

 

 

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值