1. 项目概述
作为一名嵌入式开发工程师,我经常需要在开发板和PC之间频繁传输文件。传统的TFTP/NFS网络传输方式速度慢且依赖网络环境,使用读卡器又需要频繁插拔TF卡,实在不够优雅。最近在使用EASY EAI Nano-TB RV1126B开发板时,我发现可以利用其OTG功能将开发板直接模拟成U盘,实现高速文件传输。经过一周的实践和调试,我总结出这套完整的配置方案。
2. OTG技术原理
2.1 OTG与传统USB的区别
传统USB通信采用主从架构,主机(Host)负责调度总线上的所有通信,设备(Device)只能被动响应。这种架构下,手机、开发板等设备永远只能作为从设备连接PC。而OTG(USB On-The-Go)技术打破了这一限制,允许设备根据连接对象动态切换角色。
2.2 RV1126B的OTG实现
RV1126B采用Rockchip的USB2.0 DRD(Dual Role Device)控制器,支持以下工作模式:
- Host模式:连接U盘、键盘等USB设备
- Device模式:作为从设备连接PC
- OTG模式:自动检测ID引脚状态切换角色
实际测试发现,当开发板通过Type-C线连接PC时,VBUS电压会触发芯片自动进入Device模式,这正是我们需要的U盘模拟场景。
3. 环境准备
3.1 硬件清单
- EASY EAI Nano-TB RV1126B开发板
- USB Type-C数据线(必须支持数据传输)
- 5V/2A电源适配器
- 已安装串口终端的PC(推荐使用MobaXterm)
3.2 软件要求
- 开发板系统:Ubuntu 20.04(内核版本6.1.141)
- PC系统:Windows/Linux均可
- 开发工具:arm-linux-gnueabihf交叉编译工具链
4. 内核配置与编译
4.1 获取内核源码
从官方仓库获取SDK:
bash复制git clone https://github.com/EASY-EAI/linux-kernel-rv1126b.git
cd linux-kernel-rv1126b
4.2 关键配置项修改
修改arch/arm64/configs/RV1126b_eai.config文件,确保以下选项已启用:
code复制CONFIG_USB_CONFIGFS=y
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_F_MASS_STORAGE=y
CONFIG_USB_GADGETFS=y
4.3 编译与部署
执行编译命令:
bash复制./build.sh kernel
编译完成后,将生成的boot.img和lib_modules.tar.gz通过fastboot刷入开发板:
bash复制fastboot flash boot boot.img
adb push lib_modules.tar.gz /userdata/
adb shell "tar -xvf /userdata/lib_modules.tar.gz -C /usr && sync"
5. U盘模拟实现
5.1 创建虚拟磁盘
在开发板上执行:
bash复制dd if=/dev/zero of=/userdata/udisk.img bs=1M count=1600
mkfs.vfat /userdata/udisk.img
5.2 设置loop设备
bash复制losetup /dev/loop7 /userdata/udisk.img
mkdir -p /mnt/udisk
mount /dev/loop7 /mnt/udisk
5.3 加载内核模块
按顺序加载驱动模块:
bash复制insmod /lib/modules/$(uname -r)/kernel/drivers/usb/gadget/legacy/gadgetfs.ko
insmod /lib/modules/$(uname -r)/kernel/drivers/usb/gadget/libcomposite.ko
insmod /lib/modules/$(uname -r)/kernel/drivers/usb/gadget/function/usb_f_mass_storage.ko
insmod /lib/modules/$(uname -r)/kernel/drivers/usb/gadget/legacy/g_mass_storage.ko file=/dev/loop7
6. 功能验证
6.1 PC端操作
- 将开发板通过Type-C线连接PC
- Windows应自动识别为"大容量存储设备"
- 尝试复制文件到虚拟U盘
6.2 开发板端验证
bash复制ls /mnt/udisk # 查看PC端写入的文件
echo "Test" > /mnt/udisk/test.txt # 创建测试文件
7. 常见问题解决
7.1 设备未被识别
- 检查dmesg输出:
bash复制
dmesg | grep usb - 确保加载了所有必需模块
- 尝试更换USB线缆
7.2 文件同步异常
执行强制同步:
bash复制sync
umount /mnt/udisk
mount /dev/loop7 /mnt/udisk
7.3 性能优化
通过修改g_mass_storage参数提升传输速度:
bash复制rmmod g_mass_storage
insmod /lib/modules/$(uname -r)/kernel/drivers/usb/gadget/legacy/g_mass_storage.ko file=/dev/loop7 stall=0
8. 进阶应用
8.1 多LUN支持
可以创建多个镜像文件实现多分区:
bash复制insmod g_mass_storage.ko file=/dev/loop7,/dev/loop8
8.2 自动挂载脚本
创建/usr/local/bin/usb_gadget.sh:
bash复制#!/bin/bash
losetup /dev/loop7 /userdata/udisk.img
mount /dev/loop7 /mnt/udisk
modprobe gadgetfs
modprobe libcomposite
modprobe usb_f_mass_storage
modprobe g_mass_storage file=/dev/loop7
9. 注意事项
- 存储空间管理:虚拟磁盘会占用实际存储空间,建议根据需求调整大小
- 模块依赖:必须按正确顺序加载模块,否则会导致功能异常
- 调试接口:启用U盘模式后,ADB将不可用,建议保留串口连接
- 电源供应:大文件传输时可能需额外供电,避免因电流不足导致断开
经过实际项目验证,这种方案传输速度可达25MB/s,比TFTP快3倍以上。我在智能摄像头项目中用它传输视频样本,效率提升显著。
