rk356x gmac 问题分析

文章详细分析了GMAC驱动中DMAInitializationFailed、PHY初始化失败、Link问题、数据不通(包括TX和RX)以及TXqueue0timeout等问题的原因,涉及时钟设置、IOMUX配置、PHY状态检查和MDIO/MDC信号测试等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 DMA Initialization Failed


如果 GMAC 的驱动开机 log 上出现打印:  DMA engine initialization failed ,可以认为是 GMAC
的工作时钟出问题了。先测量时钟引脚是否有时钟,时钟频率以及幅度等指标是否正常,主要确认以下
几个方面:
IOMUX 出错,检查时钟脚寄存器值是否正确
时钟方向以及配置与硬件不匹配,参考本文第四章节的时钟设置
检查 clock tree 和 CRU 寄存器,确认时钟频率大小和时钟是否有使能


2 PHY 初始化失败


如果 GMAC 的驱动开机 log 上出现打印:No PHY found 或者 Cannot attach to PHY,表示找不到 PHY。
驱动会通过 MDIO 先读取 PHY 的 ID,可以测量 MDC 和 MDIO 波形,波形是否正常,该总线类似于
I2C,MDC 频率要求是小于 2.5M。一般来说,找不到 PHY 有以下几个原因:
检查 MDC/MDIO IOMUX 寄存器值是否正确
PHY 供电是否正常
Reset IO 配置不正确
Reset IO 时序不满足 PHY datasheet 要求,不同 PHY 的时序要求不一致,具体配置参考本文 DTS 章

测试 MDIO/MDC 波形是否异常,其中 MDC 时钟频率要求小于 2.5M

3 Link 问题


如果出现了 Link 问题,有个排除法,即将 MDC/MDIO 与主控断开,与电脑直连,查看电脑端是否有同
样的问题,以此排除软件上的干扰,那么需要重点排查下硬件上的影响,先测试 TXN/P 以及 RXN/P 是
否有 Link 波形。
如果不断出现 Link up/Link down,可能原因 PHY 收到了错误的数据,
EEE 模式下,发送的波形在 delayline 配置错误的情况下可能会导致不断 link up/down
供给 PHY 的时钟不对也会导致该问题


4 数据不通


首先排查一下是否是 TX 问题,或者 RX,还是二者都有问题。


4.1 TX


通过 ifconfig -a 查看 eth0 节点的 TX packets 是否在不断增加,如果为0,则有可能网线没有 link 上。通过
查看节点可以看到网线是否是连接上的,carrier 为1表示是 link up,反之 0 为 link down。例如 RK3328:
console:/ # cat /sys/devices/platform/ff550000.ethernet/net/eth0/carrier
1
假设 TX packets 是在不断增加,表示 TX 数据在 GMAC 有发出数据。
将板卡与 PC 连在同一个局域网内,在板卡上 ping PC,同时在 PC 端通过抓包工具(比如 Wireshark)抓
包查看,如果有抓到板卡发过来的数据,表示 TX 数据是通的。如果没有抓到,需要确认 TX 在哪个链
路位置上出现了异常,可以测试 GMAC 的 TX Clock 与 TX Data 的波形,来排除是 MAC 还是 PHY 出现
了问题。MAC 可以检查以下几个方面:
检查 TX Clock/TX Data 的 iomux
TXC 时钟是否正确
RGMII 模式时,Tx Delayline 配置是否正确
PHY 端也可以测试 PHY 的 TXN/P 信号确认 PHY 是否有数据发出;对于不同的 PHY 来说,其配置可能
是不一样,具体需要查看其 Datasheet。


14.2 RX


通过以上排查确定不是 TX 问题,重点排查 RX;连接上网线后通过 ifconfig -a 查看 eth0 节点的 RX
packets 是否在不断增加,如果为0,表示 GMAC RX 没有收到数据
同样可以测试 PHY 的 RXN/P,以及 GMAC 的 RX Clock/RX Data,来排除是 MAC 还是 PHY 出现了问
题。MAC 可以检查以下几个方面:
检查 RX Clock/RX Data 的 iomux
RXC 时钟是否正确
RGMII Tx Delayline 配置是否正确
RGMII 模式时,Rx Delayline 配置是否正确
假设 TX packets 是在不断增加,但以太网还是不正常通讯,则有可能是以下原因:
RMII 模式下 MAC 和 PHY 的参考时钟不是同一个
PHY 模式配置不对,例如硬件上配置成了 MII 模式
eth0 Link encap:Ethernet HWaddr 16:21:8d:d9:67:0b Driver rk_gmac-dwmac
inet6 addr: fe80::c43d:3e5d:533:b7ea/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:2848
Interrupt:45
eth0 Link encap:Ethernet HWaddr 16:21:8d:d9:67:0b Driver rk_gmac-dwmac
inet6 addr: fe80::c43d:3e5d:533:b7ea/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:341 errors:0 dropped:0 overruns:0 frame:0
TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:48928 TX bytes:3741
Interrupt:355


5 TX queue0 timeout


认为是 TX 无法发出,一般是控制器异常了,可能是以下几个原因引起的控制器异常:
时钟问题,检查时钟配置是否正确,参考本文第三章节
PHY 时序问题,PHY 的复位时序不对导致 PHY 给的时钟不对
PHY 硬件问题,导致出现了冲突检测,无法发送数据
逻辑电压太低

<think>嗯,用户想要了解Linux内核中的DW GMAC驱动分析。首先,我需要确认DW GMAC是什么。DW GMAC应该是指DesignWare Gigabit Ethernet MAC控制器,这是Synopsys公司设计的一个以太网控制器IP核,常用于SoC中。 接下来,用户可能需要了解这个驱动在内核中的位置和作用。Linux内核的驱动通常位于drivers/net/ethernet目录下,DW GMAC驱动可能在这个目录下的某个子目录,比如stmicro或synopsys下面。需要确认具体的目录结构。 然后,驱动的主要功能是实现MAC层的控制,包括DMA描述符管理、中断处理、数据包的发送和接收流程。用户可能想知道驱动是如何初始化的,如何与硬件交互,以及如何处理网络数据包。 可能还需要分析驱动的代码结构,比如probe函数、设备树匹配、模块初始化等部分。此外,中断处理函数、NAPI机制的使用、DMA配置和描述符环的设置也是关键点。 用户可能对数据传输流程感兴趣,比如发送数据时如何将SKB写入DMA描述符,接收数据时如何从描述符读取数据到SKB。同时,错误处理、统计信息维护以及性能优化措施也是重要的方面。 需要注意的是,不同版本的内核代码可能会有所变化,所以最好参考特定版本的内核代码进行分析。另外,设备树的配置对于驱动正确工作至关重要,因此设备树节点的解析和资源获取也是分析的一部分。 最后,可能需要提供一些实际调试技巧,比如如何使用ethtool查看驱动状态,如何通过内核日志调试驱动问题。这些实用信息能帮助用户更好地理解和应用驱动分析的结果。</think>以下是对Linux内核中DesignWare GMAC(DW GMAC)以太网驱动分析,主要分为几个关键部分: --- ### 一、驱动概述 DW GMAC是Synopsys公司设计的千兆以太网MAC控制器IP核,集成在许多SoC中(如STM32、Rockchip等)。Linux内核驱动位于: `drivers/net/ethernet/stmicro/stmmac/` 主要功能: - 实现MAC层控制 - DMA引擎管理 - 中断处理 - 与PHY芯片交互 --- ### 二、驱动核心结构 #### 1. 模块初始化 ```c module_platform_driver(stmmac_pltfr_driver); // 驱动注册入口 ``` 通过设备树(Device Tree)匹配硬件: ```c static const struct of_device_id stmmac_dt_ids[] = { { .compatible = "snps,dwmac-4.10a", .data = &dwmac410_data }, // ...其他兼容性字符串 }; ``` #### 2. 核心数据结构 - `struct stmmac_priv`:驱动核心结构体,包含: - DMA描述符指针 - 网络设备`net_device` - PHY设备信息 - 硬件寄存器映射地址 --- ### 三、关键代码流程 #### 1. 初始化流程 ```c stmmac_dvr_probe() // 探测函数 → stmmac_hw_init() // 硬件初始化 → stmmac_dma_ops() // 配置DMA → register_netdev() // 注册网络设备 ``` #### 2. 数据发送 ```c stmmac_xmit() // 发送函数 → 填充DMA描述符 → 触发DMA传输 ``` #### 3. 数据接收 ```c stmmac_interrupt() // 中断处理 → stmmac_rx() // 接收函数 → 从DMA环读取数据 → 构建sk_buff(skb)上传网络栈 ``` --- ### 四、DMA描述符管理 驱动使用环形缓冲区(Ring Buffer)管理DMA描述符: ```c struct dma_desc { __le32 des0; // 状态/控制位 __le32 des1; __le32 des2; // 数据缓冲区地址 __le32 des3; }; ``` - **发送描述符**:由驱动填充,硬件自动读取 - **接收描述符**:硬件填充数据,驱动解析 --- ### 五、中断处理 采用NAPI机制提高吞吐量: ```c static irqreturn_t stmmac_interrupt(int irq, void *dev_id) { // 检查中断状态 if (status & DMA_INT_RI) // 接收中断 napi_schedule(&priv->napi); // 触发NAPI // ... } ``` --- ### 六、设备树配置示例 典型设备树节点: ```dts ethernet@ff0e0000 { compatible = "snps,dwmac-4.10a"; reg = <0xff0e0000 0x4000>; interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; phy-mode = "rgmii"; snps,phy-addr = <0x1>; }; ``` --- ### 七、调试技巧 1. **查看驱动状态**: ```bash ethtool -i eth0 dmesg | grep dwmac ``` 2. **调试寄存器**: ```c // 内核代码中可添加寄存器打印 pr_info("GMAC_REG: 0x%08x\n", readl(priv->ioaddr + GMAC_REG_OFFSET)); ``` --- ### 八、常见问题 1. **PHY连接失败**:检查设备树`phy-mode`和`phy-addr` 2. **DMA描述符错误**:确认内存对齐(通常需要4KB对齐) 3. **性能瓶颈**:调整`tx/rx-fifo-depth`参数 建议结合具体SoC手册(如STM32MP15x或RK3588)分析硬件特性对驱动的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶知秋yyds

分享是一种美德,感谢金主打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值