RK3568与YT9215千兆交换机芯片SGMII接口驱动开发与调试全攻略
简介:本资源面向嵌入式Linux驱动开发工程师及RK3568平台硬件集成人员,聚焦RK3568主控与YT9215千兆交换机芯片的底层通信调试实践,解决交换芯片在国产SoC平台上驱动适配、设备树配置与基础功能验证等典型工程问题。压缩包为4KB的RAR格式,共含2个核心源码文件:C语言驱动实现文件(.c)负责YT9215初始化、寄存器读写、端口配置及中断响应逻辑;头文件(.h)定义芯片寄存器映射、数据结构及接口函数声明,便于移植与二次开发。目前已有205人学习下载,内容精炼但具备完整驱动框架雏形,涵盖GPIO/I2C接口抽象、设备树节点示例要点、驱动注册流程及基础测试入口,可直接用于RK3568开发板上YT9215的Bring-up验证与后续协议栈对接。
1. 项目概述:当RK3568遇上YT9215
最近在折腾一个工控网关项目,主控用的是瑞芯微的RK3568,为了扩展网络接口,外挂了一颗裕太微电子的YT9215千兆以太网交换机芯片。这个组合在边缘计算、工业路由、多网口设备里挺常见的,但真上手调试,从硬件设计到驱动适配,再到网络功能验证,每一步都可能藏着“惊喜”。今天我就把这次从零开始搞定RK3568与YT9215联调的完整过程,包括踩过的坑和总结的经验,详细拆解一遍。如果你也在做类似的多网口方案,或者对嵌入式Linux下的网络芯片驱动调试感兴趣,这篇内容应该能帮你省下不少查资料和熬夜的时间。
简单来说,RK3568是一颗性能不错的四核A55工业级处理器,自带两个千兆MAC(媒体访问控制器)。但要做成5网口甚至8网口的设备,MAC数量就不够用了,这时候就需要YT9215这样的交换机芯片来扩展。YT9215是一颗5口千兆以太网交换芯片,它通过一个SGMII(Serial Gigabit Media Independent Interface)接口与RK3568的一个MAC连接,内部再进行数据交换和端口扩展。我们的目标,就是让RK3568的Linux系统能正确识别并管理这5个由YT9215扩展出来的以太网口。
2. 核心需求与方案选型背后的逻辑
为什么是RK3568 + YT9215?这个组合不是拍脑袋定的,背后有几层实际的工程考量。
首先从需求端看,很多现场应用场景,比如智能安防的NVR(网络视频录像机)、工厂里的协议转换网关、或者小型企业路由器,都需要多个独立的网络端口。可能用于连接不同网段的摄像头、PLC设备,或者做WAN/LAN隔离。RK3568自带的双千兆MAC显然不够用,直接换用更多原生MAC的SoC(系统级芯片)成本又可能陡增。因此,外挂一颗交换机芯片就成了最具性价比和灵活性的方案。
在选型上,YT9215这类国产交换机芯片有它的优势。一是供货和成本相对稳定可控,二是在工规级温度范围和长期可靠性上表现不错。更重要的是,它与主流处理器(如RK3568)的接口是标准的SGMII,在硬件连接和驱动适配上有成熟的先例可循。相比一些需要通过复杂RGMII(Reduced Gigabit Media Independent Interface)总线并占用多个MAC的方案,SGMII方案只需一个高速串行接口,节省了SoC的MAC资源,布线也相对简单。
从系统架构上看,最终要实现的效果是:RK3568的Linux系统将YT9215识别为一个标准的网络设备,其内部的5个物理端口被映射为系统内的5个独立的网络接口(例如eth0, eth1...)。数据流向是:外部网络数据包从YT9215的任意物理端口进入,经过其内部的交换矩阵,目的地为RK3568的数据包通过SGMII上行链路送达RK3568的MAC,再由Linux网络栈处理;反之,从RK3568发往外部设备的数据包则通过SGMII下行链路交给YT9215,由它转发到正确的物理端口。这就要求驱动不仅要处理好SGMII物理链路的建立,还要实现YT9215内部VLAN、端口状态、MAC地址表等交换功能的管理。
3. 硬件设计要点与原理图检查
硬件是调试的基础,如果原理图和PCB设计有隐患,软件调试会事倍功半。在动手写代码之前,必须吃透硬件连接。
3.1 核心接口:SGMII连接详解
RK3568与YT9215之间最核心的连接就是SGMII接口。这是一个高速串行接口,包含一对差分发送线(TXP/TXN)和一对差分接收线(RXP/RXN)。在原理图上,你需要确认以下几点:
- 引脚映射正确 :确保RK3568的SGMII_TXP/N引脚连接到了YT9215的SGMII_RXP/N,而RK3568的SGMII_RXP/N连接到了YT9215的SGMII_TXP/N。收发交叉,这是最容易出错的地方之一。
- 参考时钟 :SGMII需要125MHz的参考时钟。这个时钟可以由RK3568提供,也可以由外部晶振提供,或者由YT9215提供并反馈给RK3568。我们的设计里,是由RK3568输出125MHz时钟给YT9215。你需要检查时钟网络,确保时钟线走线尽量短,且做好阻抗控制和隔离,避免时钟抖动过大导致链路不稳定。
- 电源与滤波 :YT9215的模拟电源(AVDDH)和数字电源(DVDD)需要干净、稳定。特别是为SGMIO(SGMII接口电源)供电的电源,纹波要小。每个电源引脚附近都必须放置足够且容值搭配合理的去耦电容(例如0.1uF和10uF并联),并且布局要尽可能靠近芯片引脚。
3.2 管理接口:MDIO/MDC与复位
除了高速数据接口,管理接口同样关键。YT9215通过标准的MDIO(管理数据输入输出)总线被RK3568控制。
- MDIO/MDC :这是两根线,MDC是时钟,MDIO是双向数据线。需要确认它们在RK3568端被正确配置为MDIO功能复用引脚,并且上拉电阻(通常4.7K或10K)已正确放置。MDIO总线可以挂多个设备,每个PHY(物理层芯片)有一个地址,YT9215内部端口的PHY地址需要根据硬件配置(通过引脚上下拉)来设定,这个地址后续在设备树中会用到。
- 复位信号 :YT9215需要一个复位信号(通常低电平有效)。这个信号可以由RK3568的GPIO控制,也可以由电源管理芯片提供。建议使用GPIO控制,这样在驱动中可以在初始化阶段进行复位操作,确保芯片从一个确定的状态开始工作。检查复位信号的时序是否符合YT9215数据手册的要求,特别是复位脉冲的宽度。
- 指示灯 :每个网络端口的连接(Link)和活动(Activity)指示灯通常由YT9215的特定引脚驱动。需要确认这些引脚连接到了正确的LED,并且限流电阻值合适。指示灯虽然不影响功能,但对现场调试和状态判断非常有用。
注意 :在拿到第一版PCB后,不要急于上电烧写软件。先用万用表对照原理图,仔细检查所有电源对地是否短路,核心信号线(如SGMII差分对、MDIO)是否连通。特别是RK3568和YT9215的Ball Map(球栅阵列引脚图)非常密集,焊接或PCB制造容易出错。
4. 软件环境搭建与内核配置
硬件检查无误后,就可以着手准备软件开发环境了。RK3568的SDK通常基于Buildroot或Yocto,内核版本可能是4.19或5.10。我们以常见的 rk3568-linux SDK,内核版本 4.19.232 为例。
4.1 获取与编译SDK
首先,从芯片原厂或方案商获取完整的SDK。解压后,目录结构通常包含 kernel 、 uboot 、 buildroot 等。
# 假设SDK目录为 /home/user/rk3568_linux_sdk
cd /home/user/rk3568_linux_sdk
# 通常有一个脚本来设置编译环境
source build/envsetup.sh
# 选择板级配置,例如
./build.sh lunch # 然后选择你的板型,如 `rk3568-evb` 或类似
# 开始编译内核(驱动主要在这里)
./build.sh kernel
编译过程可能会比较长,取决于你的主机性能。编译成功后,内核镜像 kernel.img 和资源镜像 resource.img 会输出到 rockdev/ 目录下。
4.2 内核驱动配置:开启PHY与交换机支持
YT9215在Linux内核中需要两个部分的支持:一是SGMII接口对应的以太网MAC驱动(RK3568内置的GMAC驱动),二是YT9215作为交换机芯片的PHY驱动和管理驱动。
- 配置内核 :
cd kernel make ARCH=arm64 menuconfig - 关键配置项 :
- 通用PHY支持 :
Device Drivers -> Network device support -> PHY Device support and infrastructure -> Generic PHY support必须选中。这是MDIO总线管理PHY的基础框架。 - Realtek PHY驱动 :YT9215的PHY部分通常兼容Realtek的系列驱动。找到
Device Drivers -> Network device support -> PHY Device support and infrastructure -> Drivers for Realtek PHYs。将其编译进内核(*)或编译为模块(M)。通常需要选中RTL8211F/RTL8211E/RTL8211DN support等选项,具体取决于YT9215数据手册中声明的PHY型号兼容性。 - 交换机子系统和DSA :YT9215是一个交换机芯片,现代Linux内核使用DSA(Distributed Switch Architecture,分布式交换架构)来管理此类设备。确保
Device Drivers -> Network device support -> Distributed Switch Architecture support被选中。同时,在DSA子菜单下,寻找YT9215的驱动。它可能被命名为rtl83xx或类似的系列驱动,因为很多国产交换机芯片与Realtek的RTL83xx系列有相似的寄存器模型。如果内核版本较新,可能已经包含;如果没有,就需要手动移植驱动代码。 - RK3568 GMAC驱动 :确保RK3568自身的GMAC驱动已启用。路径通常是
Device Drivers -> Network device support -> Ethernet driver support -> Rockchip GMAC Ethernet support。
- 通用PHY支持 :
实操心得 :在
menuconfig中,如果不确定某个配置项的作用,可以按?查看帮助。对于DSA驱动,如果默认配置里没有YT9215的直接支持,大概率需要从芯片原厂或社区获取补丁(patch)。这就是为什么网络热词中会出现“交换机芯片sdk适配”、“rk3568 kernel-4.19.232 rt-linux 补丁”的原因。拿到补丁后,使用git am或patch -p1命令将其应用到内核源码树。
5. 设备树(DTS)配置详解
设备树是告诉Linux内核硬件如何连接的关键。对于RK3568+YT9215,我们需要在板级设备树文件(如 rk3568-evb.dts 或 rk3568-xxx.dtsi )中添加和修改节点。
5.1 定义MDIO总线
首先,需要确保RK3568的GMAC控制器节点下,启用了MDIO总线。找到 gmac0 或 gmac1 节点(取决于你使用哪个MAC连接YT9215)。
&gmac0 {
status = "okay";
phy-mode = "sgmii"; // 指定接口模式为SGMII
clock_in_out = "output"; // RK3568输出时钟给PHY/交换机
// 定义MDIO总线
mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <1>;
#size-cells = <0>;
// 此处将声明YT9215的交换机节点和PHY节点
};
};
5.2 配置YT9215交换机节点
在 mdio 节点内部,我们需要添加YT9215作为DSA交换机节点。这是最核心的部分。
switch: switch@0 {
compatible = "realtek,rtl83xx"; // 或 "yt,yt9215",取决于驱动
reg = <0>; // MDIO总线上的地址,与硬件引脚配置相关
reset-gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>; // 复位引脚,根据实际原理图修改
reset-duration = <20>; // 复位脉冲宽度,单位毫秒
ports {
#address-cells = <1>;
#size-cells = <0>;
// 端口0通常连接CPU (SGMII上行口)
port@0 {
reg = <0>;
label = "cpu";
ethernet = <&gmac0>; // 关联到RK3568的MAC
phy-mode = "sgmii";
fixed-link {
speed = <1000>;
full-duplex;
};
};
// 端口1到5对应YT9215的5个物理网口
port@1 {
reg = <1>;
label = "lan1";
phy-handle = <&phy1>;
};
port@2 {
reg = <2>;
label = "lan2";
phy-handle = <&phy2>;
};
// ... 类似地定义 port@3, port@4, port@5
port@5 {
reg = <5>;
label = "wan"; // 例如将端口5定义为WAN口
phy-handle = <&phy5>;
};
};
};
5.3 配置YT9215内部PHY节点
每个物理端口都对应一个内部的PHY,它们也需要在MDIO总线节点下声明。
// 这些节点与switch节点同级,都在mdio节点内
phy1: phy@1 {
reg = <1>; // PHY地址,需与硬件配置及port@1的phy-handle对应
// 可能需要的PHY特定属性,例如中断引脚(如果支持)
// interrupts-extended = <&gpio0 RK_PA7 IRQ_TYPE_LEVEL_LOW>;
};
phy2: phy@2 {
reg = <2>;
};
// ... 定义phy3, phy4, phy5
reg 属性的值(1,2,3,4,5)就是YT9215内部各个PHY在MDIO总线上的地址。这个地址必须与YT9215芯片的硬件引脚(如PHYAD[2:0])的上拉/下拉电阻配置完全一致,否则MDIO通信会失败。
避坑指南 :设备树调试是最大的难点之一。一个标点符号错误、节点路径不对、属性名拼写错误,都可能导致驱动无法探测到设备。强烈建议在修改后,使用内核的
dtc工具编译一下设备树,检查语法:dtc -I dts -O dtb -o test.dtb your_board.dts。另外,在系统启动后,可以通过cat /proc/device-tree来查看内核解析到的设备树信息,或者用dmesg | grep -E \"mdio|dsa|switch|phy\"来过滤相关日志,这是定位问题的第一步。
6. 驱动移植与内核补丁应用
如果内核原生不支持YT9215,你就需要移植驱动。通常芯片原厂会提供一个驱动补丁文件( .patch )或一个完整的驱动源代码目录。
6.1 应用补丁
假设你拿到了一个名为 0001-Add-YT9215-switch-driver.patch 的补丁文件。
cd /home/user/rk3568_linux_sdk/kernel
# 确保代码是干净的,或者已经提交到本地git
git apply --check 0001-Add-YT9215-switch-driver.patch # 先检查补丁是否能应用
git am 0001-Add-YT9215-switch-driver.patch # 应用补丁
如果应用失败,可能需要手动解决冲突。冲突通常发生在驱动文件(如 drivers/net/dsa/rtl83xx/ 下的文件)或相关的Makefile、Kconfig文件中。你需要根据补丁内容和现有代码逻辑,手动合并修改。
6.2 驱动代码关键点解析
即使不深入代码,了解驱动的基本结构也有助于调试。一个典型的DSA交换机驱动包含:
- 探测函数 :在驱动初始化时调用,负责读取设备树信息,配置交换机芯片的全局寄存器,初始化MDIO通信,注册DSA交换机结构体。
- 端口操作集 :定义了一系列函数指针,用于控制每个端口的开启、关闭、速率双工设置、状态读取等。这些函数最终会通过MDIO总线读写YT9215的内部寄存器。
- 芯片特定操作集 :包含更底层的函数,如执行软复位、配置VLAN、管理MAC地址表等。YT9215的驱动需要实现这些接口,以支持Linux网络栈的各类操作。
- 中断处理 :如果YT9215支持连接状态变化中断,驱动还需要注册中断处理函数,以便在网线插拔时快速响应。
在调试时,如果驱动加载失败,可以尝试在驱动代码的关键函数(如探测函数、MDIO读写函数)中添加 printk 日志,重新编译内核,观察 dmesg 输出,看程序执行到哪一步出错。
7. 系统启动与网络接口验证
编译好包含新驱动和设备树的内核后,将其烧录到开发板。上电启动,观察串口日志。
7.1 启动日志分析
成功的日志应该包含类似以下信息:
[ 2.345678] rk_gmac-dwmac fe010000.ethernet: IRQ eth_wake_irq not found
[ 2.345789] rk_gmac-dwmac fe010000.ethernet: IRQ eth_lpi not found
[ 2.356123] rk_gmac-dwmac fe010000.ethernet: PTP uses main clock
[ 2.356456] rk_gmac-dwmac fe010000.ethernet: clock input or output? (output)
[ 2.356789] rk_gmac-dwmac fe010000.ethernet: TX delay(0x30).
[ 2.357123] rk_gmac-dwmac fe010000.ethernet: RX delay(0x10).
[ 2.357456] rk_gmac-dwmac fe010000.ethernet: integrated PHY? (no)
[ 2.367890] rk_gmac-dwmac fe010000.ethernet: clock input from PHY
[ 2.456789] dwmac fe010000.ethernet: MDIO bus registered
[ 2.567890] rtl83xx-dsa switch: probe succeeded # 交换机驱动探测成功!
[ 2.678901] rtl83xx-dsa switch: Found a YT9215 switch (Chip ID: xxxx)
[ 2.789012] libphy: mdio_bus: probed PHY at address 1
[ 2.789123] libphy: mdio_bus: probed PHY at address 2
... # 依次探测到5个PHY
[ 3.012345] rtl83xx-dsa switch lan1: configuring for phy/sgmii link mode
[ 3.012456] rtl83xx-dsa switch lan2: configuring for phy/sgmii link mode
... # 端口初始化
[ 3.456789] IPv6: ADDRCONF(NETDEV_CHANGE): lan1: link becomes ready # 链接就绪
如果看到“probe succeeded”和“link becomes ready”,恭喜你,驱动基本加载成功了。
7.2 系统内查看网络接口
登录系统后,使用网络命令查看:
ifconfig -a
# 或使用 ip 命令
ip link show
你应该能看到除了 lo (本地环回)接口外,还有 lan1 , lan2 , lan3 , lan4 , wan 这样的接口。这些名字就是在设备树 label 属性中定义的。
尝试给其中一个接口配置IP并测试:
ifconfig lan1 192.168.1.100 netmask 255.255.255.0 up
ping 192.168.1.1 # 假设网关是 .1
如果能ping通同一网段的其他设备,说明数据通路基本正常。
7.3 检查DSA拓扑
DSA架构下,交换机端口是“附属”于一个CPU端口(这里是 eth0 ,对应RK3568的GMAC)的。你可以通过以下方式查看:
cat /sys/class/net/eth0/lower_*/ifindex # 查看eth0下的从属接口
# 或者查看更详细的DSA信息
cat /sys/kernel/debug/dsa/switch0/ports/*/state
这些信息有助于理解内核是如何组织这些网络接口的。
8. 高级功能配置与性能测试
基础通信通了,接下来就要验证交换机的核心功能和性能。
8.1 VLAN配置
工业场景中常用VLAN进行网络隔离。YT9215支持802.1Q VLAN。在Linux下,可以使用 bridge 和 vlan 工具配置。
# 安装必要工具(如果Buildroot未包含)
# opkg update && opkg install bridge-utils vlan
# 1. 创建网桥并添加端口
ip link add name br-lan type bridge
ip link set dev lan1 master br-lan
ip link set dev lan2 master br-lan
ip link set dev br-lan up
# 2. 在某个端口(如wan)上创建VLAN子接口
ip link add link wan name wan.100 type vlan id 100
ip addr add 192.168.100.1/24 dev wan.100
ip link set dev wan.100 up
配置后,连接到 lan1 和 lan2 的设备属于同一个广播域(默认VLAN 1),而 wan.100 则属于VLAN 100,实现了隔离。你需要通过YT9215的驱动确保交换芯片内部的VLAN表项被正确编程,这通常由Linux的DSA框架和驱动自动完成。可以通过 cat /sys/class/net/wan/bridge/vlan_filtering 查看VLAN过滤是否开启。
8.2 网络性能测试
使用 iperf3 或 speedtest-cli 进行带宽测试。
- 准备 :在一台性能较好的电脑(Server)上运行
iperf3 -s。将RK3568设备的一个端口(如wan)连接到电脑,另一个端口(如lan1)连接到另一台测试电脑(Client),或者使用环回(将lan1和lan2用网线直连)。 - 测试 :在RK3568板端或Client电脑上运行
iperf3 -c <server_ip>。- 测试TCP带宽:
iperf3 -c 192.168.1.xxx - 测试UDP带宽和丢包:
iperf3 -u -b 1000M -c 192.168.1.xxx
- 测试TCP带宽:
- 分析 :理想情况下,千兆端口应能达到940Mbps左右的TCP吞吐量(受限于TCP/IP协议开销)。如果速度远低于此,可能的原因有:
- SGMII链路协商问题 :检查
ethtool eth0输出,确认Speed为1000Mb/s,Duplex为Full。 - 中断亲和性 :网络中断可能只集中在某一个CPU核心上,成为瓶颈。可以使用
mpstat -P ALL 1命令观察各CPU核心利用率,并用irqbalance服务或手动设置smp_affinity来平衡中断。 - DSA转发路径 :确保数据包是通过交换机硬件转发,而不是通过CPU软件转发。可以通过
cat /sys/class/net/eth0/statistics/tx_packets和/sys/class/net/lan1/statistics/rx_packets在测试前后对比计数,如果eth0的计数增长缓慢,而lan1的计数增长快,说明硬件转发生效。
- SGMII链路协商问题 :检查
8.3 压力与稳定性测试
对于工业设备,稳定性至关重要。
- 长ping测试 :
ping -f <gateway_ip>进行洪水ping测试,持续数小时,观察是否有丢包或延迟激增。 - 端口拔插测试 :在系统运行中,反复拔插各个端口的网线,观察
dmesg日志是否有异常,接口是否能快速重新连接(Link up/down)。 - 内存泄漏检查 :长时间运行后,使用
cat /proc/meminfo观察Slab和SUnreclaim项是否持续增长。DSA驱动如果存在资源未释放,可能会在这里体现。 - 温度测试 :在高负载网络转发时,用手或热像仪检查YT9215芯片的温度。如果过热,需要考虑增加散热片或优化风道。
9. 常见问题排查与解决实录
调试过程不可能一帆风顺。下面是我在实际项目中遇到的一些典型问题及解决方法。
9.1 问题一:驱动加载失败,MDIO通信超时
现象 : dmesg 日志中出现 mdio_bus: probe of switch@0 failed with error -110 或 timeout waiting for MDIO completion 。
排查步骤 :
- 检查硬件连接 :用示波器或逻辑分析仪测量MDC和MDIO线。MDC应该有周期性的时钟脉冲(通常几百KHz到几MHz)。如果MDC没有波形,说明RK3568的MDIO控制器可能没初始化或引脚复用错误。如果MDC有波形但MDIO线一直是高电平或低电平,可能是YT9215没响应,检查复位、电源、PHY地址配置。
- 检查设备树 :确认
mdio节点在正确的gmac节点下。确认switch节点的reg属性值与硬件PHYAD引脚配置匹配。确认reset-gpios指定的GPIO编号正确,且极性(GPIO_ACTIVE_LOW)正确。 - 检查驱动探测顺序 :有时GMAC驱动初始化较晚,导致其下的MDIO总线注册也晚。可以尝试在设备树中为
gmac节点添加assigned-clocks,assigned-clock-rates属性,确保时钟尽早配置。
9.2 问题二:网络接口能识别,但无法连接(Link Down)
现象 : ifconfig 显示接口存在,但 LOWER_UP 标志没有,或者 ethtool <interface> 显示 Link detected: no 。
排查步骤 :
- 检查物理连接 :确保网线是好的,对端设备(如交换机、电脑)已启动且端口正常。
- 检查PHY状态 :使用
mii-tool或ethtool命令。
查看输出中的“Speed”、“Duplex”、“Auto-negotiation”和“Link detected”。如果自协商失败,可以尝试强制设置:ethtool lan1
如果强制设置后Link能起来,可能是自协商过程有问题,需要检查YT9215的PHY寄存器配置,或者对端设备的自协商支持情况。ethtool -s lan1 speed 1000 duplex full autoneg off - 检查SGMII链路 :这是CPU和交换机之间的内部链路。查看
ethtool eth0(CPU端口)的状态。如果eth0也是Link Down,那问题出在RK3568和YT9215之间的SGMII连接上。需要检查设备树中phy-mode = "sgmii";设置,以及RK3568的SGMII相关时钟和IO电压配置。
9.3 问题三:数据包能通,但速度不达标或丢包严重
现象 :ping能通,但iperf测试带宽远低于千兆,或者UDP测试丢包率高。
排查步骤 :
- 确认硬件转发 :如8.2节所述,检查CPU端口
eth0的包计数。如果计数增长很快,说明大量数据包经过了CPU,可能DSA的硬件卸载(offload)功能没开启。检查驱动是否支持并开启了dsa.tag_protocol,以及ethtool -k eth0查看hw-tc-offload等特性是否开启。 - 调整MTU :尝试将MTU(最大传输单元)设置为更大的值(如9000,即巨帧),减少协议开销。
ifconfig lan1 mtu 9000。但需确保网络路径上所有设备都支持巨帧。 - 优化中断和CPU亲和性 :
# 查看网络中断号 cat /proc/interrupts | grep eth # 设置某个中断(例如中断号123)只由CPU0处理 echo 1 > /proc/irq/123/smp_affinity # 或者使用irqbalance服务自动分配 - 检查内存配置 :RK3568的GMAC驱动有接收/发送描述符环(descriptor ring)的大小配置,可以在设备树中调整。增大描述符数量可以缓解突发流量压力,但会增加内存占用。相关属性如
snps,rx-fifo-depth,snps,tx-fifo-depth。
9.4 问题四:系统运行一段时间后网络卡死
现象 :设备运行几小时或几天后,所有网络端口无响应,ping不通,但系统其他部分可能正常。
排查步骤 :
- 查看内核日志 :
dmesg可能记录了死机前的错误,如“DMA timeout”、“descriptor error”等,指向GMAC驱动或DMA内存访问问题。 - 内存压力 :可能是内存泄漏。使用
slabtop命令观察dma-kmalloc-*之类的slab对象是否持续增长。驱动中DMA缓冲区的申请与释放必须成对出现。 - 电源管理干扰 :检查RK3568的GMAC或YT9215是否进入了不期望的节能状态。尝试在设备树中关闭相关电源管理功能,例如在
gmac节点添加snps,force_sf_dma_mode;或调整snps,lpi_*相关属性。 - 硬件问题 :可能是电源纹波在高温或长时间运行后变大,导致芯片工作不稳定。用示波器监控核心电源在负载变化时的波形。
调试是一个需要耐心和逻辑推理的过程。从硬件到软件,从底层驱动到上层应用,逐层隔离问题。善用 dmesg 、 ethtool 、 ip 、 cat /sys/class/net/... 这些工具,它们能提供绝大部分的诊断信息。
更多推荐
所有评论(0)