简介:本资源面向嵌入式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)。在原理图上,你需要确认以下几点:

  1. 引脚映射正确 :确保RK3568的SGMII_TXP/N引脚连接到了YT9215的SGMII_RXP/N,而RK3568的SGMII_RXP/N连接到了YT9215的SGMII_TXP/N。收发交叉,这是最容易出错的地方之一。
  2. 参考时钟 :SGMII需要125MHz的参考时钟。这个时钟可以由RK3568提供,也可以由外部晶振提供,或者由YT9215提供并反馈给RK3568。我们的设计里,是由RK3568输出125MHz时钟给YT9215。你需要检查时钟网络,确保时钟线走线尽量短,且做好阻抗控制和隔离,避免时钟抖动过大导致链路不稳定。
  3. 电源与滤波 :YT9215的模拟电源(AVDDH)和数字电源(DVDD)需要干净、稳定。特别是为SGMIO(SGMII接口电源)供电的电源,纹波要小。每个电源引脚附近都必须放置足够且容值搭配合理的去耦电容(例如0.1uF和10uF并联),并且布局要尽可能靠近芯片引脚。

3.2 管理接口:MDIO/MDC与复位

除了高速数据接口,管理接口同样关键。YT9215通过标准的MDIO(管理数据输入输出)总线被RK3568控制。

  1. MDIO/MDC :这是两根线,MDC是时钟,MDIO是双向数据线。需要确认它们在RK3568端被正确配置为MDIO功能复用引脚,并且上拉电阻(通常4.7K或10K)已正确放置。MDIO总线可以挂多个设备,每个PHY(物理层芯片)有一个地址,YT9215内部端口的PHY地址需要根据硬件配置(通过引脚上下拉)来设定,这个地址后续在设备树中会用到。
  2. 复位信号 :YT9215需要一个复位信号(通常低电平有效)。这个信号可以由RK3568的GPIO控制,也可以由电源管理芯片提供。建议使用GPIO控制,这样在驱动中可以在初始化阶段进行复位操作,确保芯片从一个确定的状态开始工作。检查复位信号的时序是否符合YT9215数据手册的要求,特别是复位脉冲的宽度。
  3. 指示灯 :每个网络端口的连接(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驱动和管理驱动。

  1. 配置内核 :
    cd kernel
    make ARCH=arm64 menuconfig
    
  2. 关键配置项 :
    • 通用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 。

实操心得 :在 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交换机驱动包含:

  1. 探测函数 :在驱动初始化时调用,负责读取设备树信息,配置交换机芯片的全局寄存器,初始化MDIO通信,注册DSA交换机结构体。
  2. 端口操作集 :定义了一系列函数指针,用于控制每个端口的开启、关闭、速率双工设置、状态读取等。这些函数最终会通过MDIO总线读写YT9215的内部寄存器。
  3. 芯片特定操作集 :包含更底层的函数,如执行软复位、配置VLAN、管理MAC地址表等。YT9215的驱动需要实现这些接口,以支持Linux网络栈的各类操作。
  4. 中断处理 :如果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 进行带宽测试。

  1. 准备 :在一台性能较好的电脑(Server)上运行 iperf3 -s 。将RK3568设备的一个端口(如 wan )连接到电脑,另一个端口(如 lan1 )连接到另一台测试电脑(Client),或者使用环回(将 lan1 和 lan2 用网线直连)。
  2. 测试 :在RK3568板端或Client电脑上运行 iperf3 -c <server_ip> 。
    • 测试TCP带宽: iperf3 -c 192.168.1.xxx
    • 测试UDP带宽和丢包: iperf3 -u -b 1000M -c 192.168.1.xxx
  3. 分析 :理想情况下,千兆端口应能达到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 的计数增长快,说明硬件转发生效。

8.3 压力与稳定性测试

对于工业设备,稳定性至关重要。

  1. 长ping测试 : ping -f <gateway_ip> 进行洪水ping测试,持续数小时,观察是否有丢包或延迟激增。
  2. 端口拔插测试 :在系统运行中,反复拔插各个端口的网线,观察 dmesg 日志是否有异常,接口是否能快速重新连接(Link up/down)。
  3. 内存泄漏检查 :长时间运行后,使用 cat /proc/meminfo 观察 Slab 和 SUnreclaim 项是否持续增长。DSA驱动如果存在资源未释放,可能会在这里体现。
  4. 温度测试 :在高负载网络转发时,用手或热像仪检查YT9215芯片的温度。如果过热,需要考虑增加散热片或优化风道。

9. 常见问题排查与解决实录

调试过程不可能一帆风顺。下面是我在实际项目中遇到的一些典型问题及解决方法。

9.1 问题一:驱动加载失败,MDIO通信超时

现象 : dmesg 日志中出现 mdio_bus: probe of switch@0 failed with error -110 或 timeout waiting for MDIO completion 。

排查步骤 :

  1. 检查硬件连接 :用示波器或逻辑分析仪测量MDC和MDIO线。MDC应该有周期性的时钟脉冲(通常几百KHz到几MHz)。如果MDC没有波形,说明RK3568的MDIO控制器可能没初始化或引脚复用错误。如果MDC有波形但MDIO线一直是高电平或低电平,可能是YT9215没响应,检查复位、电源、PHY地址配置。
  2. 检查设备树 :确认 mdio 节点在正确的 gmac 节点下。确认 switch 节点的 reg 属性值与硬件PHYAD引脚配置匹配。确认 reset-gpios 指定的GPIO编号正确,且极性( GPIO_ACTIVE_LOW )正确。
  3. 检查驱动探测顺序 :有时GMAC驱动初始化较晚,导致其下的MDIO总线注册也晚。可以尝试在设备树中为 gmac 节点添加 assigned-clocks , assigned-clock-rates 属性,确保时钟尽早配置。

9.2 问题二:网络接口能识别,但无法连接(Link Down)

现象 : ifconfig 显示接口存在,但 LOWER_UP 标志没有,或者 ethtool <interface> 显示 Link detected: no 。

排查步骤 :

  1. 检查物理连接 :确保网线是好的,对端设备(如交换机、电脑)已启动且端口正常。
  2. 检查PHY状态 :使用 mii-tool 或 ethtool 命令。
    ethtool lan1
    
    查看输出中的“Speed”、“Duplex”、“Auto-negotiation”和“Link detected”。如果自协商失败,可以尝试强制设置:
    ethtool -s lan1 speed 1000 duplex full autoneg off
    
    如果强制设置后Link能起来,可能是自协商过程有问题,需要检查YT9215的PHY寄存器配置,或者对端设备的自协商支持情况。
  3. 检查SGMII链路 :这是CPU和交换机之间的内部链路。查看 ethtool eth0 (CPU端口)的状态。如果 eth0 也是Link Down,那问题出在RK3568和YT9215之间的SGMII连接上。需要检查设备树中 phy-mode = "sgmii"; 设置,以及RK3568的SGMII相关时钟和IO电压配置。

9.3 问题三:数据包能通,但速度不达标或丢包严重

现象 :ping能通,但iperf测试带宽远低于千兆,或者UDP测试丢包率高。

排查步骤 :

  1. 确认硬件转发 :如8.2节所述,检查CPU端口 eth0 的包计数。如果计数增长很快,说明大量数据包经过了CPU,可能DSA的硬件卸载(offload)功能没开启。检查驱动是否支持并开启了 dsa.tag_protocol ,以及 ethtool -k eth0 查看 hw-tc-offload 等特性是否开启。
  2. 调整MTU :尝试将MTU(最大传输单元)设置为更大的值(如9000,即巨帧),减少协议开销。 ifconfig lan1 mtu 9000 。但需确保网络路径上所有设备都支持巨帧。
  3. 优化中断和CPU亲和性 :
    # 查看网络中断号
    cat /proc/interrupts | grep eth
    # 设置某个中断(例如中断号123)只由CPU0处理
    echo 1 > /proc/irq/123/smp_affinity
    # 或者使用irqbalance服务自动分配
    
  4. 检查内存配置 :RK3568的GMAC驱动有接收/发送描述符环(descriptor ring)的大小配置,可以在设备树中调整。增大描述符数量可以缓解突发流量压力,但会增加内存占用。相关属性如 snps,rx-fifo-depth , snps,tx-fifo-depth 。

9.4 问题四:系统运行一段时间后网络卡死

现象 :设备运行几小时或几天后,所有网络端口无响应,ping不通,但系统其他部分可能正常。

排查步骤 :

  1. 查看内核日志 : dmesg 可能记录了死机前的错误,如“DMA timeout”、“descriptor error”等,指向GMAC驱动或DMA内存访问问题。
  2. 内存压力 :可能是内存泄漏。使用 slabtop 命令观察 dma-kmalloc-* 之类的slab对象是否持续增长。驱动中DMA缓冲区的申请与释放必须成对出现。
  3. 电源管理干扰 :检查RK3568的GMAC或YT9215是否进入了不期望的节能状态。尝试在设备树中关闭相关电源管理功能,例如在 gmac 节点添加 snps,force_sf_dma_mode; 或调整 snps,lpi_* 相关属性。
  4. 硬件问题 :可能是电源纹波在高温或长时间运行后变大,导致芯片工作不稳定。用示波器监控核心电源在负载变化时的波形。

调试是一个需要耐心和逻辑推理的过程。从硬件到软件,从底层驱动到上层应用,逐层隔离问题。善用 dmesg 、 ethtool 、 ip 、 cat /sys/class/net/... 这些工具,它们能提供绝大部分的诊断信息。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐