网卡驱动相关知识及移植
文章目录
- 硬件
- 硬件组成
- PHY 寄存器
- 地址
- 设备树
- 实战(创龙tl3588)
- 引脚分类及详细说明
- 1. 电源引脚
- 2. 管理接口(SMI)
- 3. SerDes 接口(SGMII / 光口模式)
- 4. 以太网差分接口(电口模式)
- 5. MAC 接口(RGMII 模式)
- 6. 配置 / 状态引脚
- 7. 时钟 / 其他引脚
- 8.关键复用功能配置表
- 设备树
- 延迟
- RGMII 时钟引脚配置(RXCLK,TXCLK)
- RGMII 数据 / 控制总线配置()
- 复位
- ADD地址
- Lan8720
- 硬件
- 设备树
- 时钟方向(LED1,XTAL1,XTAL2,nRST)
- 时钟配置(REFCLKO)
- 引脚控制组/RMII接收(RXD0,RXD1,RXER,CSR)
- RMII发送(TXD0,tXD1,TXEN)
- 管理数据输入输出接口(MDC,MDIO)
硬件
- 百兆(4线)
- 千兆(8线)
- 都是RJ45接口,但是接的数量不一样
硬件组成
组成:处理器, MAC 控制器, PHY,网络变压器(RJ45内部集成)
根据上面的有3种组合方式
CPU 内部集成了 MAC 和 PHY
CPU 内部集成 MAC, PHY 采用独立芯片
CPU 不集成 MAC 和 PHY, MAC 和 PHY 采用独立芯片或者集成芯片
PHY 芯片与MAC 控制器相连可以通过MII, RMII, GMII, RGMII和 MIDO 接口(数据读写)
MII 接口全称为 Media Independent Interface, 即“介质独立接口”。 MII 接口的传输速率为10Mbps 或 100Mbps, 在 100Mbps 下时钟为 25M, 在 10Mbps 下钟为 2.5M
RMII 接口全称为 Reduced Media Independent Interface, 即“简化媒体独立接口” , 它是 MII接口的简化版本。 所以相较于 MII 接口, RMII 接口在数据的发送与接收方面减少了一半的信号线
GMII 接口全称为 Gigabit Media Independent Interface, 即“千兆介质无关接口” , 它是为了满足千兆以太网的高速数据传输需求而设计的接口。 在 10M/100M/1000M 下时钟分别是2.5M, 25M 和 125M
RGMII是 GMII 的简化版本。 将引脚数量从 GMII 的 25 个减少至 RGMII 的 14 个。 在
10M/100M/1000M 下时钟分别是 2.5M, 25M 和 125MMDIO 接口全称为 Management Data Input/Output, 即管理数据输入输出接口。 主要功能是实现 MAC 控制器对 PHY 芯片的管理与控制, 例如通过 MDIO 接口对 PHY 寄存器进行设置来配置工作速率; 也能够通过读取 PHY 芯片的状态寄存器从而获取网口的状态。
- MDIO 接口属于同步串行半双工接口, 由两根信号线构成, 分别是:
- MDIO:作为数据线, 用于在 MAC 层和 PHY 层之间传输配置和管理数据。
- MDC: 作为时钟线, 为数据传输提供时钟同步
- MDIO 接口属于同步串行半双工接口, 由两根信号线构成, 分别是:
RTL8211 芯片通过 MDI 接口与 RJ45 接口。 MAC 控制器通过 RGMII 接口和 MDIO 接口与 PHY 芯片连接
PHY 寄存器
在 802.3 规范中, 对 PHY 芯片的前 16 个寄存器进行了规定。
- 寄存器 0 是控制寄存器: 用于配置 PHY 芯片的工作模式和参数。 可以通过控制寄存器设置芯片的传输速率(10Mbps、 100Mbps 或 1000Mbps) 、 双工模式(全双工或半双工)以及自动协商功能的开启或关闭等。
- 寄存器 1 是状态寄存器: 用于表示 PHY 芯片当前的工作状态。 比如, 通过状态寄存器可以查看是否已经成功连接到网络、 是否检测到链路故障、 当前的传输速率和双工模式等信息等。
- 寄存器 16 到 31 是扩展寄存器: 寄存器 0 到 15 是 IEEE 802.3 规定的寄存器, 不论使用哪个厂家的 PHY 芯片,寄存器 0 到 15 是一摸一样的, 所以一般情况下, 使用 Linux 中通用的PHY 驱动即可驱动 PHY 芯片。 但是不同厂家的 PHY 芯片可能有额外特性的功能, 所以扩展寄存器就是给 PHY 厂家自由发挥的寄存器。 也就是说只有用到这些特性功能时, 才会涉及到扩展寄存器
地址
- 物理地址(MAC 地址)
- 物理地址, 也称为 MAC 地址, 是网络设备的唯一标识符。 它由 48 位二进制数组成, 通常用 12 位十六进制数表示, 如 00:11:22:33:44:55
- IP 地址
- IP 地址是网络层的地址, 用于在网络中标识设备的逻辑位置。 它分为 IPv4 和 IPv6 两种版本, IPv4 地址由 32 位二进制数组成, 通常用点分十进制表示, 如 192.168.1.1; IPv6 地址由 128 位二进制数组成。 IP 地址的主要作用是实现不同网络之间的通信, 通过 IP 地址可以将数据包从源网络路由到目标网络。
- PHY 地址
- PHY 地址是用于在一个网络中唯一标识 PHY 芯片的地址。 在一个系统中, 可能会有多个 PHY 芯片同时存在, 通过 PHY 地址可以区分不同的 PHY 芯片, 以便对它们进行单独的配置和管理
设备树
- 在设备树文件 gmac0 节点中, 我们需要关注下面这几个属性。
- phy-mode: 用于设置 MAC 和 PHY 的连接方式, 如是 RMII 还是 RGMII 模式。
- snps,reset-gpio: 设置 PHY 芯片的硬件复位脚。 可以使用 GPIO 作为 PHY 的复位引脚。
- snps,reset-delays-us: PHY 芯片的复位时序, 该属性有三个属性值分别表示 PHY 芯片的不同阶段的复位时序, 如果搭配 snps,reset-active-low 属性, 则表示三个时间分别表示 Reset pin脚拉高, 拉低, 再拉高的时间; 如果搭配 snps,reset-active-high 属性, 则反之
实战(创龙tl3588)
硬件
使用YT8521SH 这个phy芯片(RGMII)
原理图
引脚分类及详细说明
按功能模块分类,对应你提供的引脚图编号:
1. 电源引脚
| 引脚号 | 引脚名称 | 功能描述 | 电气特性 |
|---|---|---|---|
| 31 | DVDD33 | 数字电路 3.3V 电源输入(核心数字逻辑、接口电路) | 3.3V±5%,需接 0.1μF+1μF 去耦电容 |
| 30 | DVDD33_LX | 内置 1.1V 开关电源的电感连接端(需外接电感到 GND) | 仅接电感,不可接其他器件 |
| 12 | AVDD33 | 模拟电路 3.3V 电源输入(PHY 模拟前端、ADC/DAC) | 3.3V±5%,需接 0.1μF+1μF 去耦电容 |
| 22 | DVDDL/AVDDL | 数字 / 模拟低压电源输入(通常为 1.8V/2.5V,匹配 MAC 接口电平) | 1.8V/2.5V±5%,需接 0.1μF 去耦电容 |
| 4/9/47 | AVDDL | 同 DVDDL/AVDDL,多引脚并联以降低电源噪声 | 同 DVDDL/AVDDL |
2. 管理接口(SMI)
| 引脚号 | 引脚名称 | 功能描述 | 电气特性 |
|---|---|---|---|
| 14 | MDC | SMI(串行管理接口)时钟引脚(由 MAC 提供,频率≤2.5MHz) | 输入,无内部上下拉 |
| 15 | MDIO | SMI 数据引脚(双向,用于 MAC 读写 PHY 寄存器) | 开漏输入 / 输出,需上拉 4.7KΩ 到 DVDDL |
| 34 | INT_N/PME_N | 复用引脚:1. 工作时:INT_N(PHY 中断输出,低电平有效)2. 配置时:PME_N(电源管理事件输出) | 开漏输出,需上拉 4.7KΩ 到 DVDDL |
3. SerDes 接口(SGMII / 光口模式)
| 引脚号 | 引脚名称 | 功能描述 | 电气特性 |
|---|---|---|---|
| 38 | HSIP | SerDes 高速差分输入正极(SGMII / 光口模式下,接收数据) | 差分输入,需 50Ω 阻抗匹配 |
| 39 | HSIN | SerDes 高速差分输入负极 | 差分输入,需 50Ω 阻抗匹配 |
| 40 | HSOP | SerDes 高速差分输出正极(SGMII / 光口模式下,发送数据) | 差分输出,需 50Ω 阻抗匹配 |
| 41 | HSON | SerDes 高速差分输出负极 | 差分输出,需 50Ω 阻抗匹配 |
4. 以太网差分接口(电口模式)
| 引脚号 | 引脚名称 | 功能描述 | 电气特性 |
|---|---|---|---|
| 2 | TRXP0 | 电口差分发送正极(1000Base-T/100Base-TX 模式下,连接 RJ45 变压器 TX+) | 差分输出,串联 49.9Ω 终端电阻 |
| 3 | TRXN0 | 电口差分发送负极(连接 RJ45 变压器 TX-) | 差分输出,串联 49.9Ω 终端电阻 |
| 5 | TRXP1 | 电口差分接收正极(连接 RJ45 变压器 RX+) | 差分输入,串联 49.9Ω 终端电阻 |
| 6 | TRXN1 | 电口差分接收负极(连接 RJ45 变压器 RX-) | 差分输入,串联 49.9Ω 终端电阻 |
| 7/8/10/11 | TRXP2/TRXN2/TRXP3/TRXN3 | 1000Base-T 模式下的额外差分对(支持 4 对双绞线传输) | 差分输入 / 输出,需 100Ω 差分阻抗 |
5. MAC 接口(RGMII 模式)
| 引脚号 | 引脚名称 | 功能描述(RGMII 模式) | 电气特性 |
|---|---|---|---|
| 19 | TXD0 | 发送数据位 0 | 输出,匹配 DVDDL 电平 |
| 18 | TXD1 | 发送数据位 1 | 输出,匹配 DVDDL 电平 |
| 17 | TXD2 | 发送数据位 2 | 输出,匹配 DVDDL 电平 |
| 16 | TXD3 | 发送数据位 3 | 输出,匹配 DVDDL 电平 |
| 20 | TX_CTL | 发送控制信号(RGMII 的 TX_EN/TX_ER 复用) | 输出,匹配 DVDDL 电平 |
| 21 | TX_CLK | 发送时钟(125MHz@1000M、25MHz@100M、2.5MHz@10M) | 输出,匹配 DVDDL 电平 |
| 26 | RXD0/RXDLY | 复用:1. 工作时:RXD0(接收数据位 0)2. 配置时:RXDLY(接收时钟延时使能) | 输入,匹配 DVDDL 电平 |
| 25 | RXD1/CFG_MODE0 | 复用:1. 工作时:RXD1(接收数据位 1)2. 配置时:CFG_MODE0(工作模式配置位 0) | 输入,匹配 DVDDL 电平 |
| 24 | RXD2/CFG_MODE1 | 复用:1. 工作时:RXD2(接收数据位 2)2. 配置时:CFG_MODE1(工作模式配置位 1) | 输入,匹配 DVDDL 电平 |
| 23 | RXD3/CFG_MODE2 | 复用:1. 工作时:RXD3(接收数据位 3)2. 配置时:CFG_MODE2(工作模式配置位 2) | 输入,匹配 DVDDL 电平 |
| 27 | RX_CTL/PHYAD2 | 复用:1. 工作时:RX_CTL(接收控制信号)2. 配置时:PHYAD2(PHY 地址位 2) | 输入,匹配 DVDDL 电平 |
| 28 | RX_CLK/PHYAD1 | 复用:1. 工作时:RX_CLK(接收时钟)2. 配置时:PHYAD1(PHY 地址位 1) | 输入,匹配 DVDDL 电平 |
6. 配置 / 状态引脚
| 引脚号 | 引脚名称 | 功能描述 | 电气特性 |
|---|---|---|---|
| 36 | LED0/PHYAD0 | 复用:1. 工作时:LED0(链路状态指示灯)2. 配置时:PHYAD0(PHY 地址位 0) | 输出,需串接限流电阻到 GND |
| 37 | LED1/CFG_LDO0 | 复用:1. 工作时:LED1(速率状态指示灯)2. 配置时:CFG_LDO0(LDO 使能配置) | 输出,需串接限流电阻到 GND |
| (无) | LED2/CFG_LDO1 | 通常为额外 LED 引脚,复用 CFG_LDO1(LDO 电压配置) | 输出,需串接限流电阻到 GND |
| 13 | RESET_N | 硬件复位引脚(低电平有效,复位时间≥10μs) | 输入,需上拉 4.7KΩ 到 DVDDL |
7. 时钟 / 其他引脚
| 引脚号 | 引脚名称 | 功能描述 | 电气特性 |
|---|---|---|---|
| 44 | CLKOUT | 时钟输出(可选 25MHz/125MHz,给 MAC 提供参考时钟) | 输出,匹配 DVDDL 电平 |
| 46 | XTAL_O | 晶振输出端(接 25MHz 晶振一端) | 晶振输出,需接 25MHz 无源晶振 |
| 45 | XTAL_I | 晶振输入端(接 25MHz 晶振另一端) | 晶振输入,需接 25MHz 无源晶振 |
| 32 | LX | 内置 LDO 的电感连接端(同 DVDD33_LX) | 仅接电感,不可接其他器件 |
| 48 | RBIAS | 偏置电阻引脚(必须接 12.1KΩ±1% 电阻到 GND,决定 PHY 电流偏置) | 模拟输入,高精度电阻 |
| 49 | GND | 接地引脚(多引脚并联,需保证接地阻抗低) | 接地 |
| 33/42/43 | Reserved/NC | 保留引脚 / 空引脚(不可连接任何信号) | 悬空 |
8.关键复用功能配置表
部分引脚在复位时锁存电平,决定 PHY 默认工作模式:
| 引脚(配置功能) | 电平(上拉 = 1 / 下拉 = 0) | 功能说明 |
|---|---|---|
| CFG_MODE0(RXD1) | 0 | RGMII 模式 |
| CFG_MODE0(RXD1) | 1 | SGMII 模式 |
| CFG_MODE1(RXD2) | 0 | 电口模式 |
| CFG_MODE1(RXD2) | 1 | 光口模式 |
| PHYAD(2:0) | 000~111 | PHY 地址(0~7,由 PHYAD2/1/0 组合) |
设备树
gmac0 { /omit-if-no-ref/ gmac0_miim: gmac0-miim { rockchip,pins = /* gmac0_mdc */ <4 RK_PC4 1 &pcfg_pull_none>, /* gmac0_mdio */ <4 RK_PC5 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_clkinout: gmac0-clkinout { rockchip,pins = /* gmac0_mclkinout */ <4 RK_PC3 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_rx_bus2: gmac0-rx-bus2 { rockchip,pins = /* gmac0_rxd0 */ <2 RK_PC1 1 &pcfg_pull_none>, /* gmac0_rxd1 */ <2 RK_PC2 1 &pcfg_pull_none>, /* gmac0_rxdv_crs */ <4 RK_PC2 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_tx_bus2: gmac0-tx-bus2 { rockchip,pins = /* gmac0_txd0 */ <2 RK_PB6 1 &pcfg_pull_none>, /* gmac0_txd1 */ <2 RK_PB7 1 &pcfg_pull_none>, /* gmac0_txen */ <2 RK_PC0 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_rgmii_clk: gmac0-rgmii-clk { rockchip,pins = /* gmac0_rxclk */ <2 RK_PB0 1 &pcfg_pull_none>, /* gmac0_txclk */ <2 RK_PB3 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_rgmii_bus: gmac0-rgmii-bus { rockchip,pins = /* gmac0_rxd2 */ <2 RK_PA6 1 &pcfg_pull_none>, /* gmac0_rxd3 */ <2 RK_PA7 1 &pcfg_pull_none>, /* gmac0_txd2 */ <2 RK_PB1 1 &pcfg_pull_none>, /* gmac0_txd3 */ <2 RK_PB2 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_ppsclk: gmac0-ppsclk { rockchip,pins = /* gmac0_ppsclk */ <2 RK_PC4 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_ppstring: gmac0-ppstring { rockchip,pins = /* gmac0_ppstring */ <2 RK_PB5 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_ptp_refclk: gmac0-ptp-refclk { rockchip,pins = /* gmac0_ptp_refclk */ <2 RK_PB4 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_txer: gmac0-txer { rockchip,pins = /* gmac0_txer */ <4 RK_PC6 1 &pcfg_pull_none>; }; }; &gmac0 { phy-mode = "rgmii-rxid"; clock_in_out = "output"; phy-handle = <&rgmii_phy0>; snps,reset-gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>; snps,reset-delays-us = <20000 20000 100000>; snps,reset-active-low; tx_delay = <0x37>; rx_delay = <0x12>; status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&gmac0_miim &gmac0_tx_bus2 &gmac0_rx_bus2 &gmac0_rgmii_clk &gmac0_rgmii_bus &gmac0_phy_reset>; }; gmac0_phy_reset: gmac0-phy-reset { rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; };
延迟
tx_delay = <0x37>; rx_delay = <0x12>;这两个配置是RGMII 接口的信号延时补偿参数,核心解决千兆以太网高频信号的同步问题,是 Rockchip GMAC 针对 RGMII 模式的特有配置:
RGMII 是千兆以太网接口,核心时钟频率达125MHz(对应 1000Mbps 速率),TX/RX 数据信号和时钟信号在 PCB 走线上会因走线长度、阻抗等产生纳秒 / 皮秒级延时,导致数据和时钟 “不同步”(比如数据到了,时钟还没到,或反之),最终引发数据包丢包、CRC 错误。Rockchip GMAC 内置了可编程延时寄存器,通过
tx_delay/rx_delay配置寄存器值,对信号做软件延时补偿,让数据和时钟重新同步。逐参数详解
配置项 十六进制→十进制 单位(Rockchip 通用) 核心作用 取值逻辑 tx_delay = <0x37>0x37 = 55 步长≈20ps(皮秒) 补偿 GMAC→YT8531SH-CA 的发送方向(TX)信号延时:针对 RGMII_TX 总线(TXD0~3、TX_CTL),补偿这些信号线相对于 TX_CLK 的延时,确保 TX 数据和 TX_CLK 同步到达 PHY。 取值和 PCB 走线长度正相关:走线越长,延时值越大;0x37 是调试后适配你硬件的最优值(55×20ps=1100ps=1.1ns)。 rx_delay = <0x12>0x12 = 18 步长≈20ps(皮秒) 补偿 YT8531SH-CA→GMAC 的接收方向(RX)信号延时:针对 RGMII_RX 总线(RXD0~3、RX_CTL),补偿这些信号线相对于 RX_CLK 的延时,确保 RX 数据和 RX_CLK 同步到达 GMAC。 18×20ps=360ps,是接收侧走线的最优补偿值,若取值过小会导致接收数据错误,过大则丢包。 延时步长:不同 Rockchip 芯片(如 RK3568/RK3399)的延时 “步长” 不同(比如 RK3568 是 1 步 = 20ps,RK3288 是 1 步 = 10ps),需以芯片手册为准;
取值不是固定值:需根据实际 PCB 走线调试(比如 ping 网关、iperf 打流测试),逐步调整直到网络稳定;
仅 RGMII 需要:RMII 是百兆接口(25MHz 时钟),延时影响可忽略,无需配置这两个参数。
RGMII 时钟引脚配置(RXCLK,TXCLK)
/omit-if-no-ref/ gmac0_rgmii_clk: gmac0-rgmii-clk { rockchip,pins = /* gmac0_rxclk */ <2 RK_PB0 1 &pcfg_pull_none>, /* gmac0_txclk */ <2 RK_PB3 1 &pcfg_pull_none>; };配置中
clock_in_out = "output",说明TX_CLK 由 GMAC 主动输出给 YT8531SH-CA,所以 TX_CLK 引脚配置为 “复用为 GMAC_TX_CLK 功能 + 无上下拉”;
RGMII 数据 / 控制总线配置()
/omit-if-no-ref/ gmac0_rx_bus2: gmac0-rx-bus2 { rockchip,pins = /* gmac0_rxd0 */ <2 RK_PC1 1 &pcfg_pull_none>, /* gmac0_rxd1 */ <2 RK_PC2 1 &pcfg_pull_none>, /* gmac0_rxdv_crs */ <4 RK_PC2 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac0_tx_bus2: gmac0-tx-bus2 { rockchip,pins = /* gmac0_txd0 */ <2 RK_PB6 1 &pcfg_pull_none>, /* gmac0_txd1 */ <2 RK_PB7 1 &pcfg_pull_none>, /* gmac0_txen */ <2 RK_PC0 1 &pcfg_pull_none>; }; gmac0_rgmii_bus: gmac0-rgmii-bus { rockchip,pins = /* gmac0_rxd2 */ <2 RK_PA6 1 &pcfg_pull_none>, /* gmac0_rxd3 */ <2 RK_PA7 1 &pcfg_pull_none>, /* gmac0_txd2 */ <2 RK_PB1 1 &pcfg_pull_none>, /* gmac0_txd3 */ <2 RK_PB2 1 &pcfg_pull_none>; };核心作用
配置 RGMII 总线的核心数据 / 控制引脚(区别于你之前看到的tx_bus2,rx_bus2 通常是 RGMII 全量总线的汇总配置),包含:
- 发送侧:TXD0~3(4 位数据)、TX_CTL(发送控制gmac0_txen);
- 接收侧:RXD0~3(4 位数据)、RX_CTL(接收控制gmac0_rxdv_crs)。
RGMII 是千兆接口,比 RMII 多了 TXD2/3、RXD2/3(4 位数据),所以这个节点包含10 个引脚
复位
gmac0_phy_reset: gmac0-phy-reset { rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; };
ADD地址
电路图一样,但是实际262电阻是不贴的,所以eth1是1地址
Lan8720
硬件
| 引脚号 | 引脚名称 | 功能描述 | 电气类型 | 关键注意事项 |
|---|---|---|---|---|
| 1 | VDD2A | 电源通道 2,3.3V 供电(内部稳压器电源) | P(电源) | 需接 1μF 去耦电容到 GND,靠近引脚布局 |
| 2 | LED2/nINTSEL | 复用功能:1. 复位时:nINTSEL(配置 nINT/REFCLKO 功能)2. 工作时:LED2(100Mbps 速度指示灯) | IOPD(输入 / 输出) | 下拉→nINT/REFCLKO 为50MHz 时钟输出;上拉→nINT/REFCLKO 为中断输出 |
| 3 | LED1/REGOFF | 复用功能:1. 复位时:REGOFF(配置内部 1.2V 稳压器)2. 工作时:LED1(链路连接指示灯) | IOPD(输入 / 输出) | 下拉→启用内部 1.2V 稳压器;上拉→禁用(需外部给 VDDCR 提供 1.2V) |
| 4 | XTAL2 | 25MHz 晶振输入端 2(与 XTAL1 配合) | ICLK(晶振输入) | 接 25MHz 晶振一端;若用外部 50MHz 时钟(XTAL1 为 CLKIN),此脚悬空 |
| 5 | XTAL1/CLKIN | 复用功能:1. 接 25MHz 晶振输入端 12. 外部 50MHz 时钟输入(替代晶振) | ICLK(晶振 / 时钟输入) | 用晶振时接 25MHz 晶振;用外部时钟时接 50MHz 时钟,XTAL2 悬空 |
| 6 | VDDCR | 1.2V 电源输入(内部稳压器输出 / 外部输入) | P(电源) | 启用内部稳压器时,接 1μF 去耦电容到 GND;禁用时需外部提供 1.2V |
| 7 | RXD1/MODE1 | 复用功能:1. 复位时:MODE1(PHY 工作模式配置位 1)2. 工作时:RXD1(RMII 接收数据 1) | IOPU(输入 / 输出) | 复位时电平锁存为模式配置,内部自带上拉;正常工作为 MAC 的接收数据引脚 |
| 8 | RXD0/MODE0 | 复用功能:1. 复位时:MODE0(PHY 工作模式配置位 0)2. 工作时:RXD0(RMII 接收数据 0) | IOPU(输入 / 输出) | 同 RXD1/MODE1 |
| 9 | VDDIO | IO 电源,1.6~3.6V(与 MAC 侧 IO 电平匹配) | P(电源) | 需接 0.1μF 去耦电容到 GND |
| 10 | RXER/PHYAD0 | 复用功能:1. 复位时:PHYAD0(PHY 地址配置位 0)2. 工作时:RXER(接收错误信号) | IOPD(输入 / 输出) | 下拉→PHY 地址为 0;上拉→地址为 1;RMII 模式下 RXER 功能通常不用 |
| 11 | CRS_DV/MODE2 | 复用功能:1. 复位时:MODE2(PHY 工作模式配置位 2)2. 工作时:CRS_DV(载波侦听 / 数据有效) | IOPU(输入 / 输出) | 复位时电平锁存为模式配置;正常工作为 MAC 的载波侦听引脚 |
| 12 | MDIO | SMI(站管理接口)数据引脚(MAC 与 PHY 的寄存器通信) | IOD(输入 / 开漏输出) | 需上拉电阻(通常 4.7KΩ 到 VDDIO) |
| 13 | MDC | SMI 接口时钟引脚(由 MAC 提供,≤2.5MHz) | I8(输入) | 无内部上拉,直接接 MAC 的 MDC 引脚 |
| 14 | nINT/REFCLKO | 复用功能(由 LED2/nINTSEL 配置):1. 时钟输出:50MHz RMII 参考时钟2. 中断输出:低电平有效中断 | O8(输出) | 时钟输出时需接 MAC 的 RMII 时钟输入;中断输出时接 MAC 的中断引脚 |
| 15 | nRST | 硬件复位引脚(低电平有效) | I8(输入) | 复位时间需≥10μs;通常接 MCU 的 GPIO,复位时序需匹配(如用户 DTS 中的延迟配置) |
| 16 | TXEN | RMII 发送使能(MAC 输出,指示 TXD0/1 有效) | IPD(输入) | 接 MAC 的 TXEN 引脚 |
| 17 | TXD0 | RMII 发送数据 0(MAC 输出到 PHY) | I8(输入) | 接 MAC 的 TXD0 引脚 |
| 18 | TXD1 | RMII 发送数据 1(MAC 输出到 PHY) | I8(输入) | 接 MAC 的 TXD1 引脚 |
| 19 | VDD1A | 电源通道 1,3.3V 供电(模拟 / 数字电路电源) | P(电源) | 需接 1μF 去耦电容到 GND,靠近引脚布局 |
| 20 | TXN | 以太网差分发送负极(接 RJ45 变压器) | AIO(模拟双向) | 需串联 49.9Ω 终端电阻,靠近 PHY 布局 |
| 21 | TXP | 以太网差分发送正极(接 RJ45 变压器) | AIO(模拟双向) | 同 TXN |
| 22 | RXN | 以太网差分接收负极(接 RJ45 变压器) | AIO(模拟双向) | 同 TXN |
| 23 | RXP | 以太网差分接收正极(接 RJ45 变压器) | AIO(模拟双向) | 同 TXN |
| 24 | RBIAS | 偏置电阻引脚 | AI(模拟输入) | 必须接 12.1KΩ(±1%)电阻到 GND,决定 PHY 的电流偏置 |
设备树
/omit-if-no-ref/ gmac1_miim: gmac1-miim { rockchip,pins = /* gmac1_mdc */ <3 RK_PC2 1 &pcfg_pull_none>, /* gmac1_mdio */ <3 RK_PC3 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac1_clkinout: gmac1-clkinout { rockchip,pins = /* gmac1_mclkinout */ <3 RK_PB6 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac1_rx_bus2: gmac1-rx-bus2 { rockchip,pins = /* gmac1_rxd0 */ <3 RK_PA7 1 &pcfg_pull_none>, /* gmac1_rxd1 */ <3 RK_PB0 1 &pcfg_pull_none>, /* gmac1_rxdv_crs */ <3 RK_PB1 1 &pcfg_pull_none>; }; /omit-if-no-ref/ gmac1_tx_bus2: gmac1-tx-bus2 { rockchip,pins = /* gmac1_txd0 */ <3 RK_PB3 1 &pcfg_pull_none>, /* gmac1_txd1 */ <3 RK_PB4 1 &pcfg_pull_none>, /* gmac1_txen */ <3 RK_PB5 1 &pcfg_pull_none>; }; &gmac1 { phy-mode = "rmii"; phy-handle = <&rgmii_phy1>; clock_in_out = "input"; //时钟为,phy—>mac snps,reset-gpio = <&gpio3 RK_PA5 GPIO_ACTIVE_LOW>; snps,reset-delays-us = <100 30000 100000>; snps,reset-active-low; pinctrl-names = "default"; pinctrl-0 = <&gmac1_miim &gmac1_rx_bus2 &gmac1_tx_bus2 &gmac1_clkinout>; status = "okay"; }; &rgmii_phy1 { compatible = "ethernet-phy-ieee802.3-c22"; reg = <1>; };
时钟方向(LED1,XTAL1,XTAL2,nRST)
- clock_in_out = “input”; //时钟为,phy—>mac
- LED1:复位时低电平,就是input
- LAN8720 的
REFCLKO引脚可以配置为时钟输出模式(当LED2引脚接下拉时):此时 LAN8720 会通过内部倍频(25MHz 晶振→50MHz),将时钟从REFCLKO输出给 MAC。
- LAN8720 的
- nRST 复位引脚
时钟配置(REFCLKO)
/omit-if-no-ref/ gmac1_clkinout: gmac1-clkinout { rockchip,pins = /* gmac1_mclkinout */ <3 RK_PB6 1 &pcfg_pull_none>; };为什么是
pull_none(无上下拉):因为 LAN8720 的REFCLKO引脚是主动输出 50MHz 时钟信号的,属于 “推挽输出”,外部上下拉会干扰时钟信号的完整性(比如导致时钟边沿变缓、幅值异常),所以必须配置为无上下拉。和
clock_in_out = "input"的关联:clock_in_out = "input"定义了 GMAC1 对该时钟的 “方向”(接收输入),而gmac1_clkinout定义了 “接收这个时钟的物理引脚”(GPIO3_PB6)及引脚特性,两者是 “功能方向 + 物理载体” 的配套配置。硬件对应关系:硬件上需要将 LAN8720 的
nINT/REFCLKO引脚(引脚 14)直接连接到 GPIO3_PB6,这段配置才能生效。
引脚控制组/RMII接收(RXD0,RXD1,RXER,CSR)
gmac1_rx_bus2: gmac1-rx-bus2 { rockchip,pins = /* gmac1_rxd0 */ <3 RK_PA7 1 &pcfg_pull_none>, /* gmac1_rxd1 */ <3 RK_PB0 1 &pcfg_pull_none>, /* gmac1_rxdv_crs */ <3 RK_PB1 1 &pcfg_pull_none>; };
RMII发送(TXD0,tXD1,TXEN)
gmac1_tx_bus2: gmac1-tx-bus2 { rockchip,pins = /* gmac1_txd0 */ <3 RK_PB3 1 &pcfg_pull_none>, // 发送数据位0 /* gmac1_txd1 */ <3 RK_PB4 1 &pcfg_pull_none>, // 发送数据位1 /* gmac1_txen */ <3 RK_PB5 1 &pcfg_pull_none>; // 发送使能 };这段配置的核心是映射 GMAC1 的 RMII_TX 总线 3 个核心引脚(TXD0/TXD1/TXEN)到物理 GPIO3_PB3/PB4/PB5,并配置为无上下拉的 GMAC 专用功能模式;
管理数据输入输出接口(MDC,MDIO)
gmac1_miim: gmac1-miim { rockchip,pins = /* gmac1_mdc */ <3 RK_PC2 1 &pcfg_pull_none>, /* gmac1_mdio */ <3 RK_PC3 1 &pcfg_pull_none>; };
