RK3568开发板USBNET配置:内核驱动、RNDIS协议与Windows网络共享实战
1. 项目概述与核心思路最近在折腾一块飞凌嵌入式的OK3568-C开发板想让它通过一根USB线就能和我的电脑组成一个私有的局域网也就是常说的USBNET功能。这个需求在很多嵌入式开发场景里其实挺常见的比如你的开发板没有网口或者现场调试环境网络复杂一根USB线直连电脑就能传文件、开SSH、甚至做网络调试会方便很多。我手头这块板子用的是瑞芯微的RK3568芯片性能不错但官方资料里关于USB Gadget模式的配置讲得比较零散自己摸索着实现了一遍把完整的流程和踩过的坑都记录下来。简单来说USBNET就是让开发板扮演一个“USB网络设备”的角色。当它通过USB线连接到电脑我们称之为“主机”时在电脑的网络适配器列表里它会显示为一个新的网卡比如“远程NDIS兼容设备”同时在开发板的Linux系统里也会生成一个对应的网络接口通常是usb0。给两边的这个虚拟网卡配上同一个网段的IP地址它们之间就能像在同一个局域网里一样互相通信了。这背后的核心技术是Linux内核的USB Gadget框架和RNDIS协议。Gadget框架让设备能扮演各种USB从设备角色如U盘、串口、网卡而RNDIS是微软主导的一套在USB上传输网络数据的协议在Windows系统上有原生支持兼容性最好。整个实现过程可以拆解为三个核心环节首先是配置和编译Linux内核确保RNDIS相关的驱动和Gadget支持被正确启用其次是更新开发板的系统镜像把新内核烧录进去最后是在开发板和电脑两端进行网络配置和测试。听起来步骤不少但跟着流程一步步走其实并不复杂。下面我就结合OK3568-C开发板把每个环节的细节、原理和实操中需要注意的地方都捋清楚。2. 内核配置启用RNDIS与USB Gadget支持实现USBNET功能最基础也最关键的一步是确保你的Linux内核包含了必要的驱动。对于RK3568这类ARM架构的处理器内核配置需要针对性地进行而不是使用默认的x86配置。2.1 进入正确的内核配置界面首先你需要进入你的RK3568 SDK或BSP源码目录。通常内核源码位于一个名为kernel的文件夹中。使用终端进入该目录cd /path/to/your/sdk/kernel接下来使用make menuconfig命令调用内核的图形化配置界面。这里有一个非常重要的前置步骤必须指定正确的架构和交叉编译工具链。直接运行make menuconfig会使用宿主机的默认配置很可能是x86这会导致后面找不到ARM平台特有的选项。对于RK3568ARM架构通常需要这样设置环境变量或使用SDK提供的编译脚本。一个可靠的方法是查看SDK根目录下是否存在一个build.sh或类似的环境设置脚本。你可以先执行它来配置环境source /path/to/your/sdk/build/envsetup.sh # 假设脚本名为此 # 或者直接使用SDK定义的编译命令如 ./build.sh menuconfig如果SDK提供了封装好的命令例如飞凌的OK3568-C开发板资料里可能有一个build.sh通常可以用./build.sh menuconfig来直接调出针对该板卡的配置界面。这是最稳妥的方式能确保你看到的是正确的配置项。注意如果你看到配置界面顶部显示类似“Linux/arm64 5.10.66 Kernel Configuration”的字样说明架构是正确的arm64。如果显示的是“x86_64”或其他那接下来的操作将是徒劳的必须检查环境配置。2.2 定位并启用RNDIS驱动进入menuconfig界面后由于选项成千上万直接寻找犹如大海捞针。我们可以使用内置的搜索功能。按下键盘上的/键会弹出一个搜索框。在搜索框中输入rndis然后回车。搜索结果会显示所有包含“RNDIS”字样的配置项及其位置。我们需要关注的是属于USB Gadget子系统下的RNDIS驱动。从搜索结果中你会看到类似这样的路径Symbol: USB_ETH_RNDIS [n] Location: - Device Drivers - USB support (USB_SUPPORT [y]) - USB Gadget Support (USB_GADGET [y]) - USB Gadget precomposed configurations (USB_CONFIGFS [y])这告诉我们RNDIS驱动的配置项USB_ETH_RNDIS位于Device Drivers-USB support-USB Gadget Support-USB Gadget precomposed configurations这个路径下。我们按照这个路径逐级进入。在主界面使用方向键选择Device Drivers回车进入。找到USB support回车进入。找到USB Gadget Support回车进入。确保它前面是*编译进内核或M编译为模块。为了省事建议直接选*。在USB Gadget Support子菜单下找到USB Gadget precomposed configurations回车进入。在这个菜单里你将看到一系列预定义的USB Gadget功能组合。我们需要找到并启用RNDIS选项。使用方向键滚动找到RNDIS这一行按下空格键直到它前面显示为*星号表示编译进内核。2.3 启用相关的网络协议支持仅仅启用RNDIS Gadget还不够它依赖一些基础的网络协议。我们需要确保这些协议也被启用。通常它们在内核的“网络支持”部分。连续按ESC键或者选择 Exit 直到退回主菜单。进入Networking support-Networking options。在这个菜单中确保以下选项被启用标记为*或MPacket socket数据包套接字许多网络工具的基础。Unix domain socketsUnix域套接字系统内部通信常用。TCP/IP networking这毫无疑问必须开启。IP: kernel level autoconfiguration内核级IP自动配置对于USBNET获取IP有用。其子选项IP: DHCP support和IP: BOOTP support也建议开启这样开发板可以通过DHCP从电脑如果电脑开了共享自动获取IP方便调试。2.4 保存配置并生效配置完成后选择 Exit 一路退出直到系统询问Do you wish to save your new configuration?选择 Yes 保存。此时会在内核源码目录下生成或更新一个名为.config的隐藏文件它包含了所有的配置选择。这里有一个关键步骤如何让这个新配置在后续编译中生效很多SDK的编译脚本如build.sh在编译内核前会先通过make xxx_defconfig命令用一个预定义的板级配置文件覆盖掉你的.config文件。这样你刚才的menuconfig修改就白费了。你需要查看SDK的编译脚本例如build.sh找到生成.config文件的那条命令通常是make rockchip_linux_defconfig或类似并将其注释掉。以飞凌的脚本为例你可能需要编辑build.sh找到类似下面的部分# 在 build.sh 中可能存在的片段 function build_kernel(){ cd kernel # 注释掉下面这行防止它覆盖你的 .config # make rockchip_linux_defconfig make menuconfig # 或者这行可能不存在但defconfig那行是关键 make -j$(nproc) Image dtbs }注释掉make xxx_defconfig这一行后保存脚本。这样下次编译时就会直接使用你刚才保存的.config文件。3. 内核编译与系统镜像更新配置保存好后接下来就是编译新内核并将其更新到开发板上。3.1 执行内核编译在SDK根目录或者按照脚本要求的位置执行内核编译命令。如果使用build.sh通常是./build.sh kernel这个命令会启动交叉编译。编译时间取决于你的电脑性能RK3568的内核第一次编译可能需要10-20分钟。请耐心等待并注意观察终端输出是否有error字样。如果编译成功你会在kernel目录下的输出路径如arch/arm64/boot/找到生成的内核镜像Image以及更重要的打包好的boot.img文件。boot.img是Rockchip平台使用的标准启动镜像格式包含了内核和设备树。实操心得编译过程中如果报错大概率是某个依赖的选项没打开。可以尝试再次进入menuconfig根据错误信息的关键字进行搜索并启用相关选项。另一个常见问题是工具链路径不对确保你已正确执行了SDK的环境设置脚本。3.2 使用RKDevTool烧录镜像RK3568开发板通常使用瑞芯微官方提供的RKDevTool或升级版的RKDevTool_Release进行烧录。这是一个Windows下的图形化工具。连接开发板使用USB-Type-C数据线连接开发板的OTG口通常是标注为USB OTG或Download的口和电脑。开发板先不要上电。进入Loader模式这是瑞芯微芯片的烧录模式。操作方法是按住开发板上的Recovery键或Maskrom键不放然后轻按一下Reset键最后松开Reset键等待1-2秒后再松开Recovery键。此时RKDevTool工具的“设备”窗口应该显示“发现一个LOADER设备”。如果没出现检查线缆、USB口并重复上述按键操作。加载镜像文件在工具界面你会看到一个名为boot的分区。点击其右侧的路径选择框找到并选择你刚刚编译生成的boot.img文件。执行烧录点击工具下方的“执行”按钮。工具会开始擦除旧的boot分区并写入新的镜像。右侧会有进度条显示。烧录完成后设备会自动重启。重要注意事项备份烧录前如果你对原有的系统有任何自定义文件请先备份。烧录boot.img一般不会影响rootfs系统文件分区但为防万一重要数据还是要备份。驱动如果是第一次使用RKDevToolWindows可能需要安装Rockchip USB驱动。这个驱动通常包含在RKDevTool的安装包或SDK的工具目录里。选择正确的分区只烧录boot分区即可不要动rootfs除非你确定也要更新整个根文件系统。4. 硬件连接与系统端配置开发板用新内核启动后我们还需要进行正确的硬件连接和在开发板系统内进行配置才能激活USBNET功能。4.1 硬件准备与连接飞凌OK3568-C开发板上有多个USB接口。要实现USB Gadget设备模式必须使用支持OTG功能的接口。这块板子的Type-C口CON9通常就是OTG口。确认接口查看原理图或用户手册确认用于Device模式的USB口。对于OK3568-C就是那个Type-C口。硬件改动重要根据飞凌提供的资料为了在Type-C口上稳定实现USB2.0 Device功能有时需要进行一个简单的硬件跳线。例如可能需要将一个特定的测试点如原理图中的P40的pin1用跳线帽连接到Type-A口的C23正极。这一步请务必参考你手中开发板对应的《用户手册》或《硬件手册》中的“USB Device功能使用说明”章节不同批次或型号的板子可能有差异。错误的跳线可能导致接口无法工作甚至损坏。连接线缆使用一根USB-A to USB-C的数据线注意是数据线不是仅充电线将开发板的Type-C口连接到电脑的任意一个USB口USB2.0或3.0均可。4.2 开发板系统内配置开发板启动并通过串口或SSH登录后需要执行几个命令来配置USB控制器的工作模式。切换USB模式RK3568的USB控制器默认可能工作在Host主机模式。我们需要将其强制切换到Device设备模式。这通过向内核的一个sysfs接口写入特定值来实现。# 将USB2.0 PHY控制器切换到外设(peripheral)模式即设备模式 echo peripheral /sys/devices/platform/fe8a0000.usb2-phy/otg_mode路径说明fe8a0000.usb2-phy这个路径是内核根据RK3568芯片手册注册的设备节点代表了USB2.0的物理层控制器。不同的内核版本或设备树配置这个路径前缀fe8a0000可能不同。如果上述命令报错“No such file or directory”你需要查看/sys/devices/platform/目录下有哪些类似*usb*phy*或*otg*的目录并尝试向其中的otg_mode或mode文件写入peripheral。也可以使用find /sys -name otg_mode 2/dev/null命令来查找。检查网络接口执行模式切换命令后稍等几秒钟然后检查是否出现了新的网络接口。ifconfig -a # 或者使用 ip 命令 ip link show你应该能看到一个名为usb0的网络接口。如果看不到可以尝试重新插拔USB线或者检查内核日志获取线索dmesg | tail -30在日志中搜索rndis、gadget、usb0等关键词看看是否有错误信息。为usb0配置IP地址给这个新出现的网卡分配一个静态IP。sudo ifconfig usb0 192.168.7.2 netmask 255.255.255.0 up # 或者使用 ip 命令 sudo ip addr add 192.168.7.2/24 dev usb0 sudo ip link set usb0 up这里我们给开发板端的usb0配置了192.168.7.2。5. Windows主机端配置与连通性测试当开发板配置好并连接到电脑后Windows通常会自动识别并安装“远程NDIS兼容设备”的驱动。你可以在“设备管理器” - “网络适配器”下看到一个新设备。5.1 配置主机IP地址打开“控制面板” - “网络和共享中心” - “更改适配器设置”。找到那个新出现的网络连接名称可能是“以太网 2”、“远程NDIS兼容设备 #2”等右键选择“属性”。双击“Internet协议版本4 (TCP/IPv4)”。选择“使用下面的IP地址”并填写一个与开发板usb0同网段的IP例如IP地址192.168.7.1子网掩码255.255.255.0默认网关可以留空因为我们只是点对点直连。点击“确定”保存。5.2 测试网络连通性现在双方都有一个位于192.168.7.0/24网段的IP地址了。从开发板ping电脑在开发板的终端里执行ping 192.168.7.1如果看到连续的回复64 bytes from 192.168.7.1: icmp_seq1 ttl128 time0.8ms恭喜你USBNET通道已经打通了从电脑ping开发板打开Windows的命令提示符CMD或PowerShell执行ping 192.168.7.2同样应该能收到回复。5.3 进阶使用与问题排查实现网络共享上网现在开发板和电脑可以互相访问了。如果你希望开发板能通过电脑的网络上网可以在Windows的网络连接设置中将你电脑连接互联网的那个网络适配器比如WIFI或物理网卡的“共享”功能打开并允许共享给这个“远程NDIS”连接。这样开发板就能通过USB线共享电脑的网络了。在开发板上可以将默认网关设置为192.168.7.1即电脑的USBNET IP并配置DNS。常见问题排查速查表问题现象可能原因排查步骤开发板执行ifconfig -a看不到usb01. 内核未正确配置/编译RNDIS。2. USB未切换到Device模式。3. 硬件跳线或线缆问题。1. 检查内核.config中USB_ETH_RNDISy。2. 检查otg_mode设置命令是否执行成功路径是否正确。3. 查看dmesg内核日志搜索错误信息。4. 确认硬件跳线更换USB数据线。Windows无法识别新设备1. 驱动未自动安装。2. USB连接不稳定。1. 检查设备管理器是否有带感叹号的未知设备尝试手动更新驱动选择“网络适配器”-“Microsoft”-“远程NDIS兼容设备”。2. 重新插拔USB线换一个USB口。可以ping通自己但ping不通对端1. 防火墙拦截。2. IP地址不在同一网段。1. 暂时关闭Windows防火墙进行测试。2. 仔细核对开发板usb0和Windows适配器的IP地址与子网掩码。传输速度很慢1. USB线或接口是USB2.0规格。2. 系统负载或干扰。1. 确认使用USB3.0及以上规格的线缆和接口。2. 尝试使用iperf3工具进行带宽测试排除应用层问题。一个实用技巧为了避免每次启动都手动执行echo peripheral /sys/.../otg_mode命令你可以将这个命令添加到开发板的开机启动脚本中例如/etc/rc.local文件在exit 0之前添加或者创建一个systemd服务单元。这样开发板一启动USBNET功能就准备好了。整个流程走下来从内核配置到最终ping通虽然环节不少但每一步都有其明确的目的。最关键的是理解USB Gadget框架的运作原理以及RNDIS作为协议桥梁的作用。一旦配置成功这根小小的USB线就能变身成为一条稳定的数据通道无论是用于文件传输配合SFTP/SCP、远程登录SSH还是作为临时的调试网络都能极大提升嵌入式开发的便利性。