
1. 项目缘起当4G模组遇上高速网口与Wi-Fi最近在做一个工业网关项目核心需求是把现场PLC、传感器等设备的以太网数据通过4G网络稳定地回传到云端。硬件选型上我们用了移远的EC20 4G模组作为主通信单元。这个模组大家应该不陌生性能稳定AT指令集也成熟是很多物联网项目的“老朋友”了。但这次的需求有点不一样。现场设备的数据吞吐量不小传统的UART串口哪怕是921600bps带宽已经成了瓶颈数据延迟和丢包问题开始显现。为了解决这个问题我们决定启用EC20模组上一个“高阶”功能SGMIISerial Gigabit Media Independent Interface接口直接把它当成一个高速网卡来用。这样一来EC20在系统里就不再是一个简单的串口设备而是一个拥有千兆物理层能力的网络接口数据吞吐能力直接提升了一个数量级。与此同时项目还有一个分支需求在某些没有4G信号但存在本地Wi-Fi网络的室内环境设备需要能自动切换或备用连接到本地Wi-Fi。于是我们又引入了移远的FC20 Wi-Fi模组作为局域网接入的补充。这就构成了一个典型的“有线SGMII无线4GWi-Fi”多网融合场景。调试过程可以说是一步一个坎。从硬件原理图设计、内核驱动配置到上层网络路由策略每一个环节都有不少细节需要注意。网上关于EC20 SGMII和FC20的零散资料不少但成体系、能从头跑到尾的实战记录却不多。今天我就把这次调试EC20 SGMII网口通讯以及FC20 Wi-Fi模组的完整过程、核心原理和踩过的坑系统地梳理一遍希望能给遇到类似问题的朋友一个清晰的参考。2. 硬件设计基石原理图与引脚连接确认一切软件调试的基础都建立在正确的硬件连接之上。这一步如果错了后面所有的软件努力都是徒劳。对于EC20的SGMII和FC20的调试硬件设计阶段就要格外留心。2.1 EC20 SGMII接口硬件要点EC20模组的SGMII接口本质上是一个高速串行差分信号接口用于与主处理器通常是ARM SoC如NXP i.MX6系列、Rockchip RK系列等的MAC媒体访问控制层直接对接。核心连接信号线TXP/TXNSGMII发送差分对。连接至主处理器MAC的RXP/RXN接收端。RXP/RXNSGMII接收差分对。连接至主处理器MAC的TXP/TXN发送端。REFCLKP/REFCLKN125MHz参考时钟差分输入。这是非常关键且容易出错的一点。这个时钟必须由主处理器或外部时钟发生器提供给EC20用于同步SGMII的串行数据。时钟质量直接影响链路稳定性。SGMII电源与地确保为SGMIOSGMII接口电源提供干净、稳定的1.8V或2.5V电源具体看EC20硬件手册并做好充分的电源去耦。注意SGMII是点对点连接收发是交叉的。即模组的发送TX要接处理器的接收RX模组的接收RX要接处理器的发送TX。在设计PCB时差分走线需遵循阻抗控制通常100Ω差分阻抗等长处理并远离噪声源。硬件调试第一步上电后首先用示波器或频率计测量REFCLK信号。确认125MHz时钟是否存在、幅度是否达标、波形是否干净。如果时钟不对SGMII链路永远无法建立。2.2 FC20 Wi-Fi模组硬件接口FC20是一款SDIO接口的Wi-Fi模组其硬件连接相对标准。核心连接信号线SDIO_D0~D34位数据线。SDIO_CMD命令线。SDIO_CLK时钟线。VDDIOI/O电源通常1.8V或3.3V需与主处理器SDIO控制器电平匹配。WL_REG_ONWi-Fi模块使能引脚高电平有效。需要由主处理器的GPIO控制。32K_CLK可选32.768KHz低速时钟输入用于低功耗模式。硬件确认确保SDIO总线走线完整WL_REG_ON引脚能被正确拉高。上电后可以用万用表测量VDDIO和WL_REG_ON的电压是否正常。3. 内核驱动配置让系统识别新硬件硬件连接无误后下一步就是让Linux内核能够识别并驱动这两个设备。这需要在你的内核配置.config和设备树Device Tree中进行正确设置。3.1 配置EC20 SGMII内核支持EC20的SGMII接口在Linux系统中最终会呈现为一个标准的网络设备如eth1。其驱动依赖两个部分主处理器的SGMII/QSGMII PHY支持你需要确保内核中启用了你所用SoC的SGMII MAC驱动。例如对于i.MX6可能需要配置CONFIG_FEC及相关QSGMII支持对于RK平台则需要配置CONFIG_ROCKCHIP_GMAC等。固定连接Fixed-link模式由于EC20的SGMII接口另一端是一个“硬连接”的MAC在EC20内部而不是一个可自动协商的独立PHY芯片因此我们需要在设备树中将其描述为一个fixed-link。这是一种告诉内核“对端是一个固定的、无需协商的链路伙伴”的方式。设备树节点配置示例以i.MX6平台为例fec { /* 这是你的以太网控制器节点 */ pinctrl-names default; pinctrl-0 pinctrl_enet; // 你的SGMII引脚复用配置 phy-mode sgmii; phy-handle ethphy1; // 指向我们定义的固定PHY status okay; mdio { #address-cells 1; #size-cells 0; ethphy1: ethernet-phy1 { // 这是一个虚拟的“固定PHY” compatible ethernet-phy-ieee802.3-c22; reg 1; // PHY地址需与硬件设计匹配 /* 关键fixed-link属性 */ fixed-link { speed 1000; // 固定为千兆 full-duplex; // 全双工 pause; // 支持流控可选 asym-pause; // 支持非对称流控可选 }; }; }; };配置要点解析phy-mode sgmii;明确指定物理层模式。fixed-link子节点定义了链路的固定参数速度、双工模式。这里我们设定为1000M全双工。reg 1;这里的地址1是一个逻辑地址需要确保不与系统中其他MDIO设备冲突。编译并更新内核与设备树后启动系统使用dmesg | grep -i eth或ifconfig -a查看应该能看到一个新的网络接口如eth1。如果能看到并且dmesg中有类似eth1: Link is Up - 1Gbps/Full的日志那么恭喜你SGMII物理链路层已经通了。3.2 配置FC20 SDIO Wi-Fi驱动FC20通常使用brcmfmacBroadcom FullMAC驱动。配置相对直接。内核配置确保以下配置已启用。CONFIG_MMC(SD/MMC支持)CONFIG_MMC_SDHCI(SDHCI控制器驱动根据你的SoC选择)CONFIG_BRCMFMAC(Broadcom FullMAC无线驱动)CONFIG_BRCMFMAC_SDIO(SDIO接口支持)CONFIG_CFG80211和CONFIG_MAC80211(无线网络协议栈)固件准备brcmfmac驱动需要固件文件。你需要将FC20对应的固件如brcmfmac4339-sdio.bin、brcmfmac4339-sdio.txt等具体文件名需根据FC20的芯片型号确定放置到文件系统的/lib/firmware/brcm/目录下。固件版本必须匹配否则无法正常工作。设备树配置主要配置SDIO控制器节点和WL_REG_ON所用的GPIO。usdhc2 { /* 假设FC20接在USDHC2控制器上 */ pinctrl-names default, state_100mhz, state_200mhz; pinctrl-0 pinctrl_usdhc2; // SDIO引脚复用 cd-gpios gpio2 12 GPIO_ACTIVE_LOW; // 卡检测可选 keep-power-in-suspend; enable-sdio-wakeup; status okay; #address-cells 1; #size-cells 0; brcmf: bcrmf1 { reg 1; compatible brcm,bcm4339-fmac; // 指定Wi-Fi使能引脚 wifi-host-reg-on-gpios gpio4 30 GPIO_ACTIVE_HIGH; // 根据实际连接修改 }; };系统启动后查看dmesg搜索brcmfmac。如果看到驱动成功加载、固件加载成功、并识别到接口如wlan0的日志硬件驱动层就成功了。使用iw dev命令也能看到无线设备。4. 上层网络配置与路由策略驱动起来设备识别了只是万里长征第一步。如何让数据正确地通过这些接口流动才是体现设计价值的地方。4.1 EC20 SGMII接口的IP与拨号EC20通过SGMII接口被识别为eth1后它本身还没有IP地址也无法直接上网。因为EC20内部运行着PPP点对点协议栈我们需要在主机侧通过pppd与它建立PPP连接从而获取运营商分配的IP地址。配置与拨号步骤编写pppd配置文件创建/etc/ppp/peers/ec20-sgmii/dev/eth1 # 使用SGMII呈现的网络设备 115200 # 波特率对于SGMII此参数意义不大但需保留 noauth defaultroute noipdefault usepeerdns persist holdoff 10 maxfail 5 debug # 初期调试建议开启查看pppd日志 connect /usr/sbin/chat -v -f /etc/ppp/chatscript/ec20-sgmii.chat编写chat脚本创建/etc/ppp/chatscript/ec20-sgmii.chat用于发送AT指令拨号。ABORT NO CARRIER ABORT ERROR TIMEOUT 30 AT OK ATCGDCONT1,\IP\,\你的APN\ OK ATD*99# CONNECT 将你的APN替换为你所用运营商的数据APN例如中国移动的cmnet。启动pppd连接pppd call ec20-sgmii 成功连接后你会看到系统新增一个ppp0接口并获得了公网IP。使用ifconfig ppp0和route -n查看。实操心得使用SGMII接口拨号时/dev/eth1作为pppd的终端设备其“波特率”参数在物理上已无意义因为数据是以千兆速率传输的。但pppd程序框架仍需此参数可以保留一个标准值如115200。真正的速度瓶颈在于EC20的4G网络侧和PPP处理能力。4.2 FC20 Wi-Fi的连接与管理FC20驱动加载后生成wlan0接口。我们使用wpa_supplicant这个工具来管理Wi-Fi连接。配置Wi-Fi连接信息创建/etc/wpa_supplicant/wpa_supplicant.confctrl_interface/var/run/wpa_supplicant update_config1 network{ ssid你的Wi-Fi名称 psk你的Wi-Fi密码 key_mgmtWPA-PSK }启动wpa_supplicant连接wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -D nl80211通过DHCP获取IPdhclient wlan0成功后wlan0接口将获得局域网IP。4.3 多网共存与路由策略现在系统有了至少三个网络接口本地有线网eth0假设、4G PPP拨号ppp0、Wi-Fiwlan0。如何管理流量默认情况下系统会有默认路由0.0.0.0/0通常最后起来的接口会覆盖它。这会导致网络混乱。策略基于源地址的策略路由Policy Routing我们的目标让来自特定设备或网段的数据走特定的出口。例如让所有发往云服务器的数据走稳定的ppp04G让本地管理流量走wlan0或eth0。创建自定义路由表在/etc/iproute2/rt_tables中添加。200 4gtable 201 wifitable为每个接口配置路由规则# 为ppp0接口添加默认路由到4gtable并添加策略规则 ip route add default via $(ip -4 addr show ppp0 | grep inet | awk {print $2} | cut -d/ -f1) dev ppp0 table 4gtable ip rule add from $(ip -4 addr show ppp0 | grep inet | awk {print $2} | cut -d/ -f1) table 4gtable priority 1000 # 为wlan0接口添加默认路由到wifitable并添加策略规则 ip route add default via $(ip route | grep wlan0 | grep default | awk {print $3}) dev wlan0 table wifitable ip rule add from $(ip -4 addr show wlan0 | grep inet | awk {print $2} | cut -d/ -f1) table wifitable priority 1100设置主默认路由可以将eth0或其中一个接口设为主默认路由。ip route add default via 局域网网关 dev eth0 metric 100解释ip rule命令根据数据包的源IP地址from来决定查询哪张路由表table。这样从ppp0口自身IP发出的数据包会查询4gtable从而从ppp0口出去从wlan0口IP发出的数据包则查询wifitable。互不干扰。踩坑记录初期没有配置策略路由导致ppp0起来后所有流量包括SSH管理流量都走了4G而4G网络的NAT类型和延迟可能导致SSH连接极其不稳定甚至断开。配置策略路由后管理流量走本地网络业务数据走4G问题得以解决。5. 稳定性调试与性能测试链路通了路由配了接下来就要在真实环境中拷机解决稳定性和性能问题。5.1 SGMII链路稳定性排查现象系统运行一段时间后eth1链路可能down掉或者出现大量CRC错误。排查思路检查内核日志dmesg | grep -E “(eth1|fec|sgmii)”寻找错误、超时、复位等记录。检查时钟质量用示波器长时间监测REFCLK时钟看是否有抖动、毛刺或幅度衰减。不稳定的时钟是SGMII链路的大敌。检查电源完整性测量SGMII接口电源1.8V/2.5V在高速数据传输时的纹波是否在模组要求范围内。调整设备树参数有些SoC的MAC驱动可能需要调整tx-fifo-depth、rx-fifo-depth等FIFO深度参数或者max-speed等属性来匹配对端设备。EC20作为固定链路可能对流量控制有特定要求可以尝试在fixed-link节点中增加或移除pause和asym-pause属性进行测试。热插拔与复位检查硬件上EC20模组是否因为4G网络搜索等原因发生了软件复位或深度睡眠导致SGMII接口逻辑复位。这可能需要检查EC20的AT指令配置确保在某种模式下SGMII接口保持激活。5.2 FC20 Wi-Fi连接与漫游现象Wi-Fi信号弱时频繁断开或在两个AP间移动时切换不顺畅。排查与优化驱动与固件确保使用最新的、经过验证的brcmfmac驱动和固件。旧版本可能存在已知的稳定性问题。wpa_supplicant配置在/etc/wpa_supplicant/wpa_supplicant.conf中可以进行高级配置。network{ ssidOffice pskpassword key_mgmtWPA-PSK scan_ssid1 # 如果SSID被隐藏则需设为1 bgscansimple:30:-45:300 # 后台扫描策略每30秒扫描一次-45dBm触发每300秒一次学习扫描 # 优先连接5GHz频段 freq_list5180 5200 5220 5240 }bgscan参数有助于在信号变弱时主动寻找更好的AP实现平滑漫游。电源管理Wi-Fi的电源管理Power Save有时会导致ping延迟增高或瞬时断流。对于需要低延迟的工业场景可以考虑关闭它。iw dev wlan0 set power_save off5.3 端到端性能测试与优化测试工具带宽测试iperf3。在设备端运行iperf3 -s在局域网内另一台机器或云端服务器运行iperf3 -c 设备IP。分别测试通过ppp0(4G)和wlan0的上下行带宽。注意4G网络受信号和基站负载影响波动较大需长期测试取平均值。延迟与抖动测试ping和mtr。mtr 目标IP可以持续测试并显示每一跳的丢包和延迟是诊断4G网络质量的神器。长时间压力测试编写脚本持续进行ping和小文件scp传输观察24小时内的断线率。优化方向TCP参数调优对于高延迟、有丢包的4G网络调整TCP拥塞控制算法和缓冲区大小可能有益。例如尝试使用bbr或cubic算法。sysctl -w net.ipv4.tcp_congestion_controlbbr sysctl -w net.core.rmem_max134217728 sysctl -w net.core.wmem_max134217728连接保活对于通过4G的长连接如MQTT需要在应用层或传输层设置心跳保活并处理网络切换时的重连机制。双网冗余高级场景下可以配置eth0有线、ppp04G、wlan0Wi-Fi的多路径路由Multipath Routing或故障转移Failover实现网络冗余进一步提升可靠性。6. 总结与延伸思考这次EC20 SGMIIFC20的调试项目让我对嵌入式Linux下的网络子系统有了更深的理解。它不再是简单的“插上网线就能用”而是涉及硬件信号完整性、内核驱动模型、设备树配置、网络协议栈管理、系统路由策略等多个层面的系统工程。几个关键的体会硬件是根基尤其是高速接口如SGMII原理图设计和PCB布局必须严格遵循规范。一个不干净的时钟或电源足以让后续所有软件调试陷入困境。调试的第一步永远是硬件信号测量。设备树是关键现代Linux嵌入式开发中设备树是描述硬件连接的“地图”。fixed-link这种模式对于连接集成MAC的模组非常有用理解了它就掌握了配置此类固定链路PHY的精髓。网络管理是艺术当系统存在多个上联出口时默认路由的粗暴管理会带来很多问题。基于策略的路由ip rule是解决多网共存、流量定向的利器它让每个接口的流量各行其道。稳定性需要多维保障驱动和固件的版本匹配、电源管理策略、TCP协议栈参数、甚至天线的摆放位置对于4G和Wi-Fi都会影响最终产品的稳定性。性能测试和长时间压力测试是不可或缺的环节。这个方案为高数据吞吐量的物联网关提供了可靠的通信基础。在此基础上你可以进一步集成MQTT客户端、边缘计算框架、防火墙规则等构建出功能更强大的工业物联网边缘节点。希望这篇详尽的记录能帮你绕过我踩过的那些坑更顺畅地完成自己的项目。