1. 从零开始:理解RK3568的GMAC与以太网驱动
大家好,我是老王,一个在嵌入式网络驱动领域摸爬滚打了十多年的老码农。今天咱们不聊虚的,直接上手,把RK3568这颗热门芯片的以太网驱动开发,从设备树配置到PHY调试,掰开揉碎了讲清楚。如果你正在为RK3568的网口调不通而头疼,或者想彻底搞懂Linux网络驱动的底层逻辑,那这篇文章就是为你准备的。
RK3568集成的GMAC(千兆以太网媒体访问控制器)是连接芯片内部和外部物理层(PHY)芯片的桥梁。简单来说,GMAC负责处理数据链路层的活儿,比如组帧、CRC校验,而PHY芯片则负责把数字信号变成能在网线上跑的模拟信号。在Linux内核里,这套驱动通常被称为 “stmmac” ,这是一个被多家芯片厂商采用的Synopsys DesignWare MAC IP核驱动框架。瑞芯微在它的基础上,增加了自家平台的一些特定配置,形成了 dwmac-rk.c 这个驱动文件。
很多新手一上来就照着别人的设备树改,结果网卡死活起不来,dmesg 里一堆报错,最常见的就是 Could not attach to PHY。这往往是因为没理解清楚硬件连接、时钟配置和复位时序这三者的关系。别急,接下来我会带你一步步走通整个流程,把每个坑都提前标出来。
2. 硬件连接与原理图分析:一切配置的起点
在动手写一行代码之前,我们必须先看懂原理图。这是决定后续所有软件配置是否正确的基石,跳过这一步,调试过程就会像在迷宫里乱撞。
首先,找到你的PHY芯片。 RK3568开发板上常见的PHY有RTL8211F(千兆)、RTL8201F(百兆)等。你需要确认几个关键信息:
- PHY芯片型号:决定了其支持的协议(10/100/1000M)和寄存器配置方式。
- PHY地址:PHY通过MDIO总线与MAC通信,每个PHY在总线上有一个硬件地址。这个地址通常由PHY芯片的几个引脚(如PHYAD0, PHYAD1)的上拉或下拉电阻决定。比如,如果PHYAD0接下拉电阻(低电平),PHYAD1接上拉电阻(高电平),那么PHY地址可能就是
0b01,也就是十进制的1。在设备树里,这个地址对应reg = <0x1>。 - 接口模式:RK3568的GMAC支持RGMII和RMII两种主流模式。
- RGMII:用于千兆以太网,数据线少,但时序要求非常严格,需要配置
tx_delay和rx_delay来进行时序补偿。 - RMII:用于十兆/百兆以太网,时钟线定义与RGMII不同。 模式选择由硬件电路决定,绝对不能配错,否则物理链路永远无法建立。
- RGMII:用于千兆以太网,数据线少,但时序要求非常严格,需要配置
- 时钟方向:这是最容易出错的地方之一。GMAC和PHY之间需要一组同步时钟(RX_CLK, TX_CLK 或 REF_CLK)。这组时钟可以由MAC提供给PHY,也可以由PHY提供给MAC。这取决于PHY芯片的型号和硬件设计。在原理图上,你需要查看时钟线连接方向,或者查看PHY芯片的某个配置引脚(如RTL8211F的RXCTL/PHYAD2)的电平。设备树中的
clock_in_out属性就是为此服务的。 - 复位引脚与电压域:找到PHY的复位引脚(RESETn)连接到了RK3568的哪个GPIO上,并确认它是低电平有效还是高电平有效。同时,确认PHY芯片的IO电压(VCCIO)是1.8V还是3.3V,这需要与RK3568对应Bank的电压域(
vccio-supply)设置匹配,否则信号电平不匹配会导致通信失败。
我建议你拿出一张纸,把上面这些信息从原理图上找出来并记录下来。这步工作做扎实了,后面的设备树配置就是“按图索骥”。
3. 设备树(DTS)配置详解:驱动与硬件的桥梁
设备树是Linux内核用来描述硬件的数据结构。对于GMAC驱动,我们需要配置两个核心节点:以太网控制器节点 和 MDIO总线节点。很多SDK会在 rk3568.dtsi 这类通用文件中定义好节点的基本框架,我们需要在板级DTS文件(如 rk3568-evb.dts 或 rk3568-kickpi-k1b.dtsi)里进行覆盖和细化。
下面我以一个典型的RGMII模式、PHY提供时钟的千兆以太网配置为例,逐行解释每个属性的含义。假设我们的PHY是RTL8211F,地址为0x1,复位引脚接在GPIO3_D1上。
/* 首先,在 pinctrl 节点中定义复位引脚为GPIO功能 */
&pinctrl {
gmac1 {
gmac1_reset: gmac1-reset {
rockchip,pins = <3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_up>; /* GPIO3_D1, 上拉 */
};
};
};
/* 定义外部输入的125MHz时钟(如果时钟来自PHY) */
&gmac1_clkin {
clock-frequency = <125000000>;
status = "okay";
};
/* 核心:GMAC1控制器节点配置 */
&gmac1 {
/

7866

被折叠的 条评论
为什么被折叠?



