1. 嵌入式网络硬件架构:MAC与PHY的“黄金搭档”
很多刚接触嵌入式网络开发的朋友,可能会觉得网络驱动很神秘,代码一大堆,协议又复杂。其实,剥开这层复杂的外衣,它的硬件核心就是两个部分:MAC和PHY。你可以把它们想象成一对默契的搭档,一个负责“动脑子”,一个负责“动手脚”。
MAC,全称是媒体访问控制器,它通常集成在SoC芯片内部,是网络的大脑。它的主要工作是按照以太网协议,把上层传下来的数据打包成帧,或者把从PHY收上来的数据帧拆包,交给上层处理。它决定了数据包的格式、发送的时机、冲突的检测等逻辑层面的东西。简单说,MAC就是那个定规矩、发号施令的“指挥官”。
PHY,全称是物理层接口收发器,它是一个独立的芯片,负责“动手”。它把MAC发过来的数字信号,转换成能在网线上跑的模拟电信号;反过来,把从网线上收到的微弱模拟信号,还原成清晰的数字信号交给MAC。它处理的是电压、电流、时钟同步、信号整形这些物理层面的脏活累活。你可以把它理解为负责“冲锋陷阵”的“士兵”。
那么,这对搭档是怎么连接的呢?这就引出了我们今天要重点聊的RGMII接口。在早期的嵌入式设备上,百兆网络(10/100M)常用MII或RMII接口。MII接口需要16根信号线,布线复杂;RMII精简到了7根线,是它的“瘦身版”。但随着对网速要求的提高,千兆网络(10/100/1000M)成为主流,对应的接口就是GMII和它的精简版RGMII。
RGMII接口非常巧妙,它在保持125MHz时钟频率不变的前提下,通过在时钟的上升沿和下降沿都采样数据,将数据线从GMII的8根减少到了4根(TXD[3:0]和RXD[3:0]),极大地简化了硬件设计。正点原子的STM32MP157开发板,就是通过RGMII接口连接内部的MAC和外部的PHY芯片(如RTL8211F或YT8511C)。除了这组高速数据通道,SoC还需要一个低速的管理通道来配置和读取PHY的状态,这就是MDIO接口,它只有两根线(MDC时钟和MDIO数据),很像I2C,用于读写PHY内部那几十个寄存器。
所以,一个典型的嵌入式网络硬件链路是这样的:应用数据 -> Linux网络协议栈 -> MAC控制器 -> RGMII接口 -> PHY芯片 -> 网络变压器 -> RJ45网口。理解了这个数据流向,再看驱动代码,就不会觉得是一团乱麻了。
2. 深入PHY芯片:驱动网络的“无名英雄”
PHY芯片虽然看起来不起眼,但它的工作至关重要。前面提到,IEEE 802.3标准规定了PHY芯片前16个寄存器的功能,这保证了不同厂商的PHY在基础功能上是一致的,Linux内核也因此有了通用的PHY驱动。但就像手机除了通话还有拍照、游戏等特色功能一样,现在的PHY芯片也有很多增强特性,这就需要厂商提供特定的驱动。
以正点原子开发板用过的两颗PHY为例。V1.2版本用的RTL8211F-CG,是瑞昱的经典千兆PHY。我们来看看它几个关键的配置点。首先是PHY地址,MAC通过MDIO总线可以管理多个PHY,靠的就是不同的地址。RTL8211F通过PHYAD[2:0]三个引脚来设置地址,范围是0x1到0x7。在原理图上,这三个引脚可能和RGMII的信号线复用,需要仔细查看数据手册和原理图来确定。比如,如果PHYAD2接高电平(1),PHYAD1和PHYAD0接地(0),那么地址就是0b100,也就是0x4。
另一个重点是RGMII接口的电平。RGMII接口通常有1.8V、2.5V、3.3V等不同电平标准,必须和SoC的IO电平匹配。RTL8211F通过CFG_EXT、CFG_LDO0、CFG_LDO1这三个引脚来配置。根据正点原子的原理图,这三个引脚被配置为3.3V电平,所以在驱动中我们不需要做额外的电平转换处理。
而V1.3及以后版本换成了YT8511C,这颗国产PHY芯片性价比很高。它的配置方式略有不同。它的PHY地址由PHYADDR[2:0]设置,对应的是LED_AC、RXD1和RXD0引脚。在正点原子的板上,这三个引脚都被下拉,所以地址是0x0。这里有个坑需要注意:YT8511C默认不输出125MHz的参考时钟!这对于RGMII接口的千兆模式是必须的。因此,我们必须在驱动中,通过写它的一个扩展寄存器(地址0x0C),将bit[2:1]设置为11,来使能125MHz时钟输出。


2345

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



