引言:为什么需要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. 注意事项

  1. ADB功能失效:启用大容量存储模式后,ADB会被禁用,因为USB总线被模拟U盘占用。如需调试,请使用串口或SSH。

  2. 镜像大小:镜像文件占用实际存储空间,请根据开发板剩余空间合理设置count值。RV1126B通常有足够空间,但若内存紧张可减小至800MB(count=800)。

  3. 模块加载顺序:务必按照gadgetfs.ko → libcomposite.ko → usb_f_mass_storage.ko → g_mass_storage.ko的顺序加载,否则可能导致失败。

  4. 卸载U盘功能:如需退出U盘模式,可执行sudo rmmod g_mass_storage,然后卸载挂载点并释放loop设备:

    sudo umount /mnt/udisk
    sudo losetup -d /dev/loop7
  5. 权限问题:命令前加sudo确保有足够权限。

结语

        通过以上步骤,我们成功将RV1126B开发板配置成了一个即插即用的U盘。这种方法不仅简化了开发板与PC之间的文件交换,也为后续开发提供了更多可能性,比如将开发板模拟成USB摄像头、串口设备等。掌握OTG Gadget的配置,意味着你可以让开发板在各种USB角色间自由切换,真正发挥嵌入式设备的灵活性。

如果在操作中遇到问题,欢迎在评论区留言交流!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐