在 RV1126B 上测试 AOA (Android Open Accessory) 功能确实需要一些特定的设置和理解,因为这涉及到 RK1126B 作为 配件设备 (Accessory) 去连接作为 主机 (Host) 的 Android 设备(手机/平板)。RV1126B 本身支持 USB OTG/Device 模式,这是实现 AOA 的基础。
关键在于:AOA 模式需要在 RV1126B 的 Linux 系统(或 Android 系统,但 RV1126B 通常跑 Linux)上实现 USB Gadget 框架的 AOA 协议支持。
以下是测试 AOA 功能的步骤和要点:
? 1. 确认 RV1126B 的系统环境和配置
* **运行的系统:** 你是在 RV1126B 上运行 **Linux** 还是 **Android**?对于 RV1126B 这类嵌入式 AIoT 芯片,跑 Linux 更常见。下面的说明主要针对 **Linux 系统**。
* **内核配置:** AOA 功能需要内核支持 `USB Gadget` 框架,并包含 `Android Accessory` 协议支持。你需要确认 RV1126B 的内核配置:
* 检查内核 `.config` 文件,确保以下选项为 `y` 或 `m`:
```
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_F_ACC=y
CONFIG_USB_F_ACC=y
CONFIG_USB_CONFIGFS_ANDROID=y
# 通常还需要基础 Gadget 和 Function 支持
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_GADGET=y
CONFIG_USB_RNDIS=y # 可选,有时一起编译
CONFIG_USB_CONFIGFS_RNDIS=y # 可选
```
* 如果你使用的 SDK/BSP 没有启用这些选项,需要**重新配置和编译内核**。
* **Device Tree:** 确认 USB 控制器(通常是 `dwc3` 或 `dwc2`) 的节点配置正确,并且 `dr_mode` 设置为 `otg` 或 `peripheral`。
? 2. 配置 USB Gadget 为 AOA 模式
RV1126B 作为配件设备,需要在启动时或在用户空间配置 USB Gadget 使其提供 AOA 功能。这通常通过 `configfs` 接口完成(在 `/sys/kernel/config/usb_gadget/` 下操作)。
**以下是一个创建 AOA Gadget 的基本脚本示例(需要 root 权限):**
#!/bin/bash
# 创建 Gadget 目录
mkdir -p /sys/kernel/config/usb_gadget/g1
cd /sys/kernel/config/usb_gadget/g1
# 设置 Vendor ID 和 Product ID
# 0x18D1 是 Google 的 VID,专门用于 Android 配件。0x2D00 是 AOA 配件的标准 PID。
echo 0x18D1 > idVendor
echo 0x2D00 > idProduct
# 设置设备版本(BCD)
echo 0x0100 > bcdDevice
# 设置语言和字符串描述符 (可选,但推荐)
mkdir strings/0x409
echo "0123456789ABCDEF" > strings/0x409/serialnumber
echo "Your Company" > strings/0x409/manufacturer
echo "Your Awesome AOA Device" > strings/0x409/product
# 创建配置 (Configuration)
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
echo "AOA Config" > configs/c.1/strings/0x409/configuration
# 添加 Android Accessory (AOA) Function
mkdir functions/acc.usb0 # 名称可能因内核版本略有不同,如 f_acc.gs0 或 acc.gs0
# 将 AOA Function 关联到配置
ln -s functions/acc.usb0 configs/c.1/
# 绑定到 UDC (USB Device Controller)
# 你需要知道你的 UDC 名称,通常像 'fe800000.usb' 或 'ff580000.usb'。查看 /sys/class/udc/
UDC_NAME=$(ls /sys/class/udc/)
echo $UDC_NAME > UDC
? 3. 连接硬件和 Android 设备
* 将 RV1126B 的 **USB OTG/Device 接口**(通常是 USB-C 或 Micro USB 口)通过数据线连接到 **Android 设备**的 **USB Host 接口**。
* **非常重要:** 如果 RV1126B 板子只有一个 USB 口且是 OTG 口,需要**确保硬件设计允许该口工作在 Device (Slave) 模式**(有些板子的 OTG 口默认只支持 Host 模式)。查阅你的 RV1126B 开发板原理图。
* 使用**支持数据传输的数据线**(非仅充电线)。
? 4. 在 Android 设备端操作
**连接前准备:**
* **启用 USB 调试:** 在 Android 设备的 **开发者选项** 中启用 **USB 调试**。有时 AOA 通信依赖 ADB 通道。
* **安装或确认 APP:** 测试 AOA 通常需要你在 Android 设备上运行一个自定义的 APP(作为主机端应用),或者使用 Google 官方的 `AOAv2Test` 测试程序(需要自行编译或查找 APK)。
* **授予权限:** 当 Android 设备检测到 AOA 配件时,可能会询问是否允许连接或授予权限(尤其是首次连接)。
**连接后:**
* 在你的 Android App 中实现 AOA 主机端逻辑。
* 使用 `adb devices` 命令查看能否识别到连接的 RV1126B。如果 AOA Gadget 配置成功且 Android 支持,通常能看到一个设备出现。
* 使用 `dmesg` 或 `logcat` 查看 Android 设备的内核日志和应用日志,寻找与 AOA/USB 配件相关的连接信息。
? 5. 在 RV1126B 端验证
* **查看内核日志:** 在 RV1126B 上运行 `dmesg` 或 `tail -f /var/log/kern.log` (路径可能不同),观察 USB Gadget 绑定、枚举过程以及与 Android 设备通信的日志。寻找 `ACC` 或 `Android Accessory` 相关关键词。成功连接后你应该能看到类似 `gadget suspended` 或 `acc_function_set_alt` 这样的消息。
* **检查 Gadget 状态:** 查看 `/sys/kernel/config/usb_gadget/g1/UDC` 文件内容,确认绑定到了正确的 UDC 控制器。
* **查看 USB 设备信息:** 在 Android 主机端可以用 `lsusb` (通过 adb shell) 查看连接的配件设备,应该能看到 VID=0x18D1, PID=0x2D00 的设备。
⚠ 常见问题和注意事项
- 找不到
acc.usb0 或类似函数: 这是内核配置问题。确认 CONFIG_USB_CONFIGFS_F_ACC=y 或 CONFIG_USB_F_ACC=y 已编译进内核(或模块加载了)。在 SDK 中搜索 f_acc.ko 或类似模块名。
- 找不到 UDC: 检查
/sys/class/udc/ 目录是否为空。这意味着:
- 硬件不支持 Device 模式(检查原理图)。
- USB 控制器驱动未正确加载或配置错误(检查 Device Tree)。
- 当前模式被设置为 Host (可能需要修改 DT 的
dr_mode 或通过 GPIO 切换 OTG ID 引脚状态)。
- 连接后立即断开或枚举失败:
- 供电问题: AOA 要求配件能在 Host Mode 下提供 500mA 电流。确保 RV1126B 板子能通过 USB 口为连接的 Android 设备提供足够的电力⚡️(如果 Android 设备此时作为总线供电设备)。这在某些嵌入式板子上可能是瓶颈?。
- 数据线问题: 尝试换一根高质量数据线。
- 权限问题: 在 RV1126B 上操作 gadget 配置需要 root 权限。
- USB 速率不匹配: 尝试在 Gadget 配置中设置
bcdUSB 为 0x0200 (USB 2.0 High-Speed)。
- 描述符问题: 仔细检查脚本中设置的 VID/PID、字符串描述符等。
- Android 设备无反应:
- 确认 Android 设备支持 AOA (大部分现代 Android 都支持)。
- 确认 Android 设备端的 USB 调试已开启。
- 尝试在 Android 设备上安装特定的 AOA Demo APP 来主动监听配件连接。
- 依赖 libusb 或用户空间驱动: 除了内核 Gadget 方案,你也可以尝试在 RV1126B 的用户空间使用
libusb + libaoa 库来实现配件功能。这需要在应用层处理更多 USB 协议细节。搜索 libaoa 库(有时也叫 aoa-lib)。
- 参考文档:
- Linux Kernel Documentation:
Documentation/usb/gadget_configfs.rst 是最权威的文档,特别关注 acc (Accessory) function 部分。
- Rockchip SDK/BSP: 仔细查阅你使用的 SDK 包中关于 USB Gadget、OTG 和
configfs 的文档、示例和配置。
- Android Open Accessory Protocol 文档: 网上搜索 "Android Open Accessory protocol" 或查阅 Android 开发者网站的历史文档,理解协议规范。
? 总结步骤
- 确认内核支持: 检查并确保 RV1126B Linux 内核启用了
USB_CONFIGFS_F_ACC。
- 创建 Gadget 配置脚本: 使用
configfs 配置一个具有 acc.usb0 (或类似) 功能的 Gadget,设置 VID=0x18D1, PID=0x2D00。
- 绑定到 UDC: 执行脚本,将 Gadget 绑定到可用的 USB Device Controller。
- 物理连接: 用数据线连接 RV1126B (Device Mode) 和 Android 设备 (Host Mode)。
- Android 端准备: 开启 USB 调试,运行测试 App 或检查
adb devices。
- 调试: 在两端查看日志 (
dmesg, logcat, adb logcat),排查问题。
这个过程需要对 Linux USB Gadget 子系统有一定了解。如果遇到困难,重点检查内核配置、UDC 可用性、configfs 脚本细节以及物理连接(特别是供电和线缆)。? 祝测试顺利!