RV1126B OTG切换U盘模式实战指南:让开发板变身便携U盘
引言:为什么需要OTG切换U盘模式?
在日常嵌入式开发中,我们经常需要在开发板与PC之间传输数据。传统方式依赖网络(TFTP/NFS)、串口或读卡器,这些方法要么速度慢,要么操作繁琐。而借助OTG(USB On-The-Go)技术,我们可以让开发板灵活切换角色——既可作为主机连接键盘、鼠标,也可作为设备(Device)模拟成U盘,直接与PC进行高速数据交互。
本文将基于EASY EAI Nano-TB RV1126B开发板,手把手教你如何通过OTG将开发板切换成U盘模式,实现开发板与PC之间的文件直传,整个过程无需额外硬件,只需简单配置。
1. OTG基本概念
OTG是USB On-The-Go的缩写,它打破了传统USB“主从固定”的限制。传统USB通信中,主机(Host)负责调度,设备(Device)只能被动响应;而OTG设备则可以在两种角色间动态切换。
OTG原理图
当RV1126B开发板的OTG接口连接到PC时,它会作为USB设备(Device)出现;而如果连接U盘或键盘,它则自动切换为主机(Host)。这种灵活性使得开发板能适应多种应用场景。

2. 准备工作:硬件与软件环境
2.1 硬件准备
-
EASY EAI Nano-TB RV1126B 开发板一块
-
USB Type-C 数据线(用于连接PC)
-
PC一台(Windows/Linux均可)
-
电源适配器(给开发板供电)
2.2 软件准备
开发板需要运行Ubuntu系统(或支持内核编译的Linux环境)。本文基于官方提供的Ubuntu SDK进行操作。
3. 升级到最新固件
在开始之前,建议将开发板的固件升级到最新版本,以确保内核功能和驱动兼容性。固件烧录步骤请参考官方文档《固件烧录与更新》,这里不再赘述。
提示:升级后请确认开发板能正常启动,并且网络/串口连接正常。
4. 获取Ubuntu系统SDK
我们需要内核源代码来配置OTG相关驱动。下载Ubuntu SDK的方法详见官方文档《嵌入式底层开发/ubuntu系统SDK/源码获取》。下载后解压,得到kernel源代码目录。
5. 内核驱动配置与编译
5.1 修改内核配置
进入kernel源码目录,执行make menuconfig(需要先配置好交叉编译环境),或者直接修改配置文件arch/arm64/configs/RV1126b_eai.config。
需要开启的关键选项如下:
Device Drivers --->
[ ] USB support --->
<*> DesignWare USB2 DRD Core Support (RV1126B默认支持)
DWC2 Mode Selection (Dual Role mode) ---> (选择双角色模式)
<*> USB Gadget Support --->
<M> USB functions configurable through configfs
[*] Mass storage (开启大容量存储)
<m> Gadget Filesystem
<M> Mass Storage Gadget
5.2 保存配置并编译内核

提示:RV1126b_eai.config在kernel_dev/arch/arm64/configs目录中
将上述选项添加到RV1126b_eai.config后,执行编译命令:
./build.sh kernel
编译完成后,会生成新的内核镜像和内核模块。特别注意:需要将生成的lib_modules.tar.gz拉取到开发板并解压,以更新内核模块。
# 在PC端(假设已通过ADB或网络连接开发板)
adb push lib_modules.tar.gz /userdata/
# 在开发板端
cd /
tar -xvf /userdata/lib_modules.tar.gz -C /usr && sync
5.3 验证模块生成
更新后,检查开发板的/lib/modules/6.1.141/kernel/drivers/usb/目录,应出现以下关键模块:
-
gadget/libcomposite.ko -
gadget/legacy/gadgetfs.ko -
gadget/legacy/g_mass_storage.ko -
gadget/function/usb_f_mass_storage.ko
所在目录:/lib/modules/6.1.141/kernel/drivers/usb/...
更新前目录可能为空或只有少量文件,更新后应能看到这些模块。
注意:更新内核后,ADB功能会被禁用,后续调试请使用串口或SSH。
【编译更新前】

【编译更新后】

6. 创建U盘镜像文件与挂载点
开发板模拟U盘需要提供一个存储镜像文件,该文件将作为U盘的“虚拟磁盘”。我们可以创建一个1.6GB的镜像(根据开发板内存大小调整)。
6.1 创建镜像
# 创建空镜像文件(count=1600表示1.6GB,可酌情减小)
dd if=/dev/zero of=/userdata/mydisk/udisk.img bs=1M count=1600
6.2 格式化镜像为FAT格式
PC通常只能识别FAT/NTFS等文件系统,这里格式化为vfat:
# 安装dosfstools(如果未安装)
sudo apt-get update && sudo apt-get install dosfstools -y
# 格式化镜像
mkfs.vfat /userdata/mydisk/udisk.img
6.3 绑定loop设备
将镜像文件与loop设备关联,以便后续挂载和模拟:
sudo losetup /dev/loop7 /userdata/mydisk/udisk.img
6.4 创建挂载点并挂载
sudo mkdir -p /mnt/udisk
sudo mount /dev/loop7 /mnt/udisk
至此,镜像已经挂载到/mnt/udisk,开发板可以像普通目录一样读写该挂载点。所有放入此目录的文件,最终会同步到镜像文件中。
7. 加载内核模块并启动U盘模拟
按照特定顺序加载编译好的内核模块(顺序不能错):
sudo insmod /lib/modules/6.1.141/kernel/drivers/usb/gadget/legacy/gadgetfs.ko
sudo insmod /lib/modules/6.1.141/kernel/drivers/usb/gadget/libcomposite.ko
sudo insmod /lib/modules/6.1.141/kernel/drivers/usb/gadget/function/usb_f_mass_storage.ko
注意:每条指令执行后无提示是正常的。
最后,加载大容量存储gadget模块,指定使用之前绑定的loop设备:
sudo insmod /lib/modules/6.1.141/kernel/drivers/usb/gadget/legacy/g_mass_storage.ko file=/dev/loop7 removable=1
此时,如果开发板OTG口已连接到PC,PC端应该会立即发现一个新U盘设备,并显示可移动磁盘。
现象示意

(图片说明:Windows系统弹出发现新硬件并显示可移动磁盘)
8. 功能测试
8.1 PC端读写测试
-
在PC上打开新出现的U盘盘符,尝试复制文件进去。
-
文件复制完成后,在开发板终端进入
/mnt/udisk目录,执行ls查看,应能看到刚刚拷贝的文件。
8.2 开发板端写入测试
-
在开发板
/mnt/udisk目录下创建新文件,例如echo "Hello from RV1126B" > test.txt。 -
然后在PC上重新插拔USB线(或刷新设备),即可在U盘根目录看到
test.txt文件。
8.3 数据同步问题处理
-
PC写入后开发板看不到:执行以下命令重新挂载即可。
sudo umount /mnt/udisk && sudo mount /dev/loop7 /mnt/udisk -
开发板写入后PC看不到:只需重新插拔USB线,PC会自动刷新。
9. 注意事项
-
ADB功能失效:启用大容量存储模式后,ADB会被禁用,因为USB总线被模拟U盘占用。如需调试,请使用串口或SSH。
-
镜像大小:镜像文件占用实际存储空间,请根据开发板剩余空间合理设置
count值。RV1126B通常有足够空间,但若内存紧张可减小至800MB(count=800)。 -
模块加载顺序:务必按照
gadgetfs.ko→libcomposite.ko→usb_f_mass_storage.ko→g_mass_storage.ko的顺序加载,否则可能导致失败。 -
卸载U盘功能:如需退出U盘模式,可执行
sudo rmmod g_mass_storage,然后卸载挂载点并释放loop设备:sudo umount /mnt/udisk sudo losetup -d /dev/loop7 -
权限问题:命令前加
sudo确保有足够权限。
结语
通过以上步骤,我们成功将RV1126B开发板配置成了一个即插即用的U盘。这种方法不仅简化了开发板与PC之间的文件交换,也为后续开发提供了更多可能性,比如将开发板模拟成USB摄像头、串口设备等。掌握OTG Gadget的配置,意味着你可以让开发板在各种USB角色间自由切换,真正发挥嵌入式设备的灵活性。
如果在操作中遇到问题,欢迎在评论区留言交流!
更多推荐


所有评论(0)