USB Accessory Mode
+ -

AOA协议格式

2025-03-17 2 0

Android Open Accessory (AOA) 协议格式详解

一、协议版本对照

协议版本 Android 版本支持 核心特性
AOA 1.0 Android 2.3.4+ 基础配件模式、音频流支持
AOA 2.0 Android 4.1+ 新增 HID 设备支持、ADB 调试通道

二、核心控制请求(Control Requests)

GET_PROTOCOL)" class="reference-link">1. 协议版本查询 (GET_PROTOCOL)

  • 请求方向:Device → Host
  • bmRequestType: 0xC0 (IN方向,Vendor类型)
  • bRequest: 51 (0x33)
  • wValue: 0
  • wIndex: 0
  • wLength: 2
  • 返回数据:协议版本号(小端格式,如 0x0100 表示 AOA 1.0)

2. 字符串描述符传递 (SEND_STRING)

  • 请求方向:Host → Device
  • bmRequestType: 0x40 (OUT方向,Vendor类型)
  • bRequest: 52 (0x34)
  • wValue: 语言ID(如 0x0409=英语)
  • wIndex: 字符串类型:
    • 0 = 厂商名
    • 1 = 型号名
    • 2 = 描述信息
    • 3 = 版本号
    • 4 = URI
    • 5 = 序列号
  • wLength: 字符串长度(ASCII编码)
  • 数据负载:UTF-8 字符串(不含终止符)

3. 启动配件模式 (START)

  • 请求方向:Host → Device
  • bmRequestType: 0x40 (OUT方向,Vendor类型)
  • bRequest: 53 (0x35)
  • wValue: 0
  • wIndex: 0
  • wLength: 0
  • 触发动作:Android 设备重启并进入配件模式

三、通信流程

  • participant 配件 as USB Host
  • participant 手机 as Android Device
  • 配件->>手机: GET_PROTOCOL 请求
  • 手机—>>配件: 返回协议版本号 (如 0x0200)
  • 配件->>手机: SEND_STRING (厂商/型号等)
  • 配件->>手机: START 请求
  • Note over 手机: 重新枚举为 USB Accessory
  • 手机—>>配件: 发送新设备描述符
  • 配件->>手机: 批量传输通道建立

四、设备枚举描述符

  1. 设备描述符(进入配件模式后)
    struct usb_device_descriptor {
    idVendor:   0x18D1  // Google 的固定 VID
    idProduct:  0x2D00  // 基础配件模式 PID
                        // 0x2D01: ADB 模式
                        // 0x2D02: 音频模式
    bcdDevice:  0x0100  // 设备版本号
    }
    
  2. 端点描述符批量传输
    struct usb_endpoint_descriptor {
    bEndpointAddress: 0x81  // IN 端点 (设备到主机)
    bmAttributes:     0x02   // 批量传输类型
    wMaxPacketSize:   512    // 最大数据包大小
    }
    

五、数据包结构示例

控制传输数据帧(协议查询)

/* Host Request */
80 06 00 01 00 00 12 00

/* Device Response (AOA 2.0) */
12 01 00 02 00 00 00 40 D1 18 00 2D 00 01 01 02 00 01

批量传输数据包

/* Android → 配件 */
55 53 42 43  // "USBC" 头标识
00 00 00 00  // 序列号
00 00 00 80  // 数据长度 (128 bytes)
[实际数据载荷...]

六、实现参考代码

配件端协议检测(C 伪代码)

// 检测 AOA 协议支持
uint16_t protocol_version;
usb_control_transfer(dev_handle, 
  USB_ENDPOINT_IN | USB_TYPE_VENDOR,
  51, 0, 0, (char*)&protocol_version, 2, 1000);

if (protocol_version >= 0x200) {
  // 支持 AOA 2.0
  enable_adb_channel();
}

七、注意事项

  • 电源要求‌
    配件需提供 ‌5V/500mA‌ 以上供电能力,高功耗设备建议配置独立电源

  • 协议超时‌
    控制请求需在 ‌1000ms‌ 内完成响应,否则可能触发设备断开

  • 枚举重试‌
    发送 START 命令后,需等待 2-5 秒让 Android 设备重新枚举

  • 调试技巧‌
    使用 adb logcat | grep Usb 可实时查看 USB 配件模式日志

0 篇笔记 写笔记

AOA协议格式
Android Open Accessory (AOA) 协议格式详解一、协议版本对照协议版本Android 版本支持核心特性AOA 1.0Android 2.3.4+基础配件模式、音频流支持AOA 2.0Android 4.1+新增 HID 设备支持、ADB 调试......
Android 开放配件 (AOA) 介绍
AOA简介Android 开放配件 (AOA) 支持功能可让外部 USB 硬件(Android USB 配件)与处于配件模式下的 Android 设备进行交互。当某台 Android 设备处于配件模式时,所连接的配件会充当 USB 主机(为总线供电并列举设备),而 Android 设备则充当 USB......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!