RK3568 USB Gadget实战:从零配置RNDIS与UMS

张开发
2026/4/20 7:16:06 15 分钟阅读

分享文章

RK3568 USB Gadget实战:从零配置RNDIS与UMS
1. 初识RK3568 USB Gadget为什么需要RNDIS和UMS刚拿到RK3568开发板时我发现这个火柴盒大小的板子居然能通过USB接口变身成网卡和U盘。USB Gadget框架就像乐高积木让我们能自由组合USB设备功能。RNDIS协议让开发板通过USB线变身网卡调试时再也不用找网线UMS功能则能把开发板的存储空间虚拟成U盘传文件比SCP命令直观多了。记得第一次调试摄像头项目时我需要在Windows和开发板之间频繁传输测试视频。当时不知道UMS功能每次都用scp命令来回倒文件速度慢还容易断连。后来发现只要配置好USB Mass Storage开发板插上电脑直接拖拽文件就行效率提升十倍不止。而RNDIS更是救急神器——有次客户现场没有路由器我用手机热点调试结果信号不稳定。改用USB RNDIS后开发板通过USB线获得稳定网络顺利完成演示。2. 环境准备搭建开发板的USB Gadget舞台2.1 硬件连接要点我的飞凌OK3568-C开发板有个Micro USB OTG接口就是靠近Type-C电源口的那个。刚开始我犯了个低级错误——把电源线当成数据线插结果怎么都识别不到设备。后来发现要用双头都是Type-A的USB线一端接电脑一端接开发板的HOST口不是电源口。如果开发板没有自动切换OTG模式还需要手动设置# 查看当前USB模式 cat /sys/devices/platform/fe8a0000.usb2-phy/otg_mode # 切换为设备模式 echo peripheral /sys/devices/platform/fe8a0000.usb2-phy/otg_mode2.2 软件配置基础原厂SDK已经包含了必要的驱动模块但需要确认内核配置。我建议先检查这几个关键点zcat /proc/config.gz | grep -E CONFIG_USB_CONFIGFS|CONFIG_USB_LIBCOMPOSITE如果返回结果中没有y就需要重新编译内核。在menuconfig中要确保以下选项打开Device Drivers → USB support → USB Gadget Support → [*] USB functions configurable through configfs [*] RNDIS support [*] Mass Storage support3. 实战RNDIS配置让USB线变身网线3.1 内核配置的隐藏细节原厂配置通常已经打开RNDIS支持但有个坑我踩过——CDC ECM和RNDIS容易混淆。CDC ECM是Linux首选协议但Windows默认只支持RNDIS。在make menuconfig时建议同时勾选[*] Ethernet Control Model (CDC ECM) [*] RNDIS support [*] CDC ECM subset (for Windows compatibility)编译后记得用lsmod | grep g_ether确认驱动加载。如果没自动加载需要modprobe g_ether host_addr12:34:56:78:9a:bc dev_addr12:34:56:78:9a:bd3.2 网络配置的避坑指南激活RNDIS后Windows端可能会显示未识别的网络。这是因为没有自动分配IP需要手动设置# 开发板端设置IP ifconfig usb0 192.168.100.100 netmask 255.255.255.0 up # 添加默认路由如果需访问外网 route add default gw 192.168.100.1Windows端网络适配器设置控制面板 → 网络和共享中心 → 更改适配器设置右键USB RNDIS Adapter → 属性 → IPv4设置IP为192.168.100.1子网掩码255.255.255.0测试连通性时建议先禁用防火墙# 开发板ping测试 ping 192.168.100.1 # Windows端测试 ping 192.168.100.1004. UMS功能实现开发板变身智能U盘4.1 镜像文件准备的玄机UMS功能需要指定存储镜像文件我推荐使用dd命令创建稀疏文件节省空间# 创建1GB大小的虚拟磁盘实际不占用物理空间 dd if/dev/zero of/rk3568.img bs1M count0 seek1024 # 格式化为FAT32Windows兼容性最好 mkfs.vfat -F 32 /rk3568.img配置文件/etc/init.d/.usb_config的每个参数都有讲究ums_block/rk3568.img # 镜像路径 ums_block_size8 # 块大小(KB)建议8或16 ums_block_typefat # 文件系统类型 ums_block_auto_mounton # 自动挂载4.2 双系统挂载的注意事项Windows和Linux对UMS设备的处理方式不同Windows会自动挂载为可移动磁盘Linux可能需要手动挂载mkdir -p /mnt/ums mount -o loop /rk3568.img /mnt/ums关键安全操作顺序Windows端先安全弹出设备开发板端执行sync确保数据写入再操作镜像文件有次我直接拔线导致镜像损坏后来养成了好习惯——修改文件后先在开发板执行sync eject /dev/sda5. 功能切换与高级技巧5.1 动态切换的脚本优化原厂的usbdevice restart方案会重置所有USB配置。我改进了一个状态保持脚本#!/bin/bash case $1 in rndis) echo usb_rndis_en /etc/init.d/.usb_config ;; ums) echo usb_ums_en /etc/init.d/.usb_config echo ums_block/rk3568.img /etc/init.d/.usb_config ;; *) echo Usage: $0 {rndis|ums} exit 1 esac /usr/bin/usbdevice restart5.2 同时启用多功能的配置RK3568其实支持多功能同时运行需要修改configfs配置mkdir /sys/kernel/config/usb_gadget/g1 cd /sys/kernel/config/usb_gadget/g1 echo 0x18d1 idVendor echo 0x4e26 idProduct # 配置RNDIS mkdir functions/rndis.usb0 # 配置UMS mkdir functions/mass_storage.usb0 echo /rk3568.img functions/mass_storage.usb0/lun.0/file # 创建配置 mkdir configs/c.1 ln -s functions/rndis.usb0 configs/c.1/ ln -s functions/mass_storage.usb0 configs/c.1/ # 绑定UDC ls /sys/class/udc UDC6. 真实项目中的问题排查上周调试时遇到个诡异问题UMS在Windows能识别但无法写入文件。最后发现是镜像文件权限问题chmod 666 /rk3568.img chown root:root /rk3568.img另一个常见问题是RNDIS连接不稳定可以尝试更换USB线劣质线缆会导致降速调整MTU值ifconfig usb0 mtu 1488检查dmesg日志dmesg | grep -i rndis有次客户现场演示前RNDIS突然无法连接。紧急情况下我用备用方案# 重置整个USB控制器 echo 0 /sys/devices/platform/fe8a0000.usb2-phy/soft_connect sleep 1 echo 1 /sys/devices/platform/fe8a0000.usb2-phy/soft_connect

更多文章