网卡PHY 移植注意事项

45 篇文章 13 订阅
17 篇文章 0 订阅

1. MAC 和PHY 的关系

MAC 就是以太网控制器,属于OSI的数字链路层。 phy 属于OSI的物理层(Physical layer),所以叫phy. MAC主要处理的数字信号,PHY负责把MAC的数字信号进行编码,串行化等操作后,转化为模拟信号进行发送。PHY在数据接受时, 进行如上所述的逆操作,将模拟信号转化为数字信号,解码,并行化后,传给MAC。

PHY 有一个重要的功能就是 自协商。 什么是自协商? 就是PHY一旦连入网络,PHY 会和它相连接的端口的PHY进行协商,当前通信使用的速率是 1000M, 100M 还是10M? 他们相互沟通后,会确定一个 两个端口都支持的最大网络速率。

PHY还有个重要的功能就是实现CSMA/CD的部分功能.它可以检测到网络上是否有数据在传送,如果有数据在传送中就等待,一旦检测到网络空闲,再等待一个随机时间后将送数据出去。

PHY 还提供了自动控制LED 等的功能。根据当前网络的传输速率,是否有数据传输,来自动控制LED 灯的行为。至于如何控制LED,可以根据PHY的datasheet 进行相关配置。

下图是一个MAC 和PHY 的关系:
在这里插入图片描述
RGMII/RMII/GMII/MII 均是用于网络数据的传输;
MAC 和PHY 之间需要一个同步时钟。
MDC& MDIO 用于控制PHY的管理总线mdio。

2. 识别PHY的address

想IIC 一样, MAC 通过MDIO 总线要找到指定的PHY, 每一个PHY 都需要有一个PHY address。这个PHY address 一般都是由HW pull up/down 对应的地址pin 脚, PHY 在上电后,读到的这个初始状态的输入值, 就是PHY 的地址。

例如ADDR0 = pullup
ADDR1 = pullup
ADDR2 = pulldown
此时地址就为011 =3.

在移植时, 较新的kernel 中, 一般不需要指定PHY 的地址, 由kernel 自动探测到。 但在uboot 中, 一般需要配置对应的PHY address 才能工作。

3. PHY LED 灯的客制化

在网卡正常工作后,有时候需要客制化PHY LED灯的情况, 今天我们就以一个PHY(rtl8211e) 和一个集成网卡(rtl8111g)为例进行说明。

3.1 rtl8211e phy led 灯的定制

首先看需求, 1G 时, LED 绿色灯亮, 100M 时褐色灯亮, 10 M 为黑, 当网络有数据时, 有一个另外的LED 等进行闪烁。(总共三个灯)。
上datasheet:
讲的很清楚,这三个LED PIN 脚,被register 26 和register 28 控制着。 每一个LED 均可配置成10M, 100M , 1000M 时,常亮。 也可以配置对应的active, 表示传输数据时,闪烁。具体怎么配, 看下图:
Active 为1 时,对应的LED 在数据传输时闪烁。
10M/100M/1000M 对应的bit 置1 时, 其在对应的速率下,会亮起来。
先别着急, PHY 接的LED 灯在硬件设计上是拉高为亮, 还是拉低为亮。这个需要注意。也就是所说的LOW active 还是high active。
这个还需要切一张datasheet 来说明:
在这里插入图片描述讲的很清楚,Led 是high active 还是low active, 依赖于LED pin 的上拉还是下拉, 如果是上拉,就是low active, 如果下拉, 就是 high active。你看这多智能。硬件自动控制high/low active。

下面直接看下arm linux 中如何修改:

/* drivers/net/phy/phy_device.c*/
+static int rtl8211e_phy_fixup(struct phy_device *dev)
+{
+       int len=0;
+       u32 value1,value2;
+
+       value1 = 0x0240;
+       value2 = 0x10;
+      
+       /*PHY LED OK*/
+       phy_write(dev, 0x1f, 0x0007);
+       phy_write(dev, 0x1e, 0x002c);
+       phy_write(dev, 0x1c, value1);
+       phy_write(dev, 0x1a, value2);
+       phy_write(dev, 0x1f, 0x0000);
+ 
+       return 0;
+}
+
 static int __init phy_init(void)
 {
        int rc;
@@ -1482,6 +1513,8 @@ static int __init phy_init(void)
        if (rc)
                mdio_bus_exit();
 
+       phy_register_fixup_for_uid(0x001cc915, 0xffffffff,
+                               rtl8211e_phy_fixup);
        return rc;
 }

phy_register_fixup_for_uid 是一个linux中通用的修正指定的PHY的函数。当linux系统启动PHY后,会探测这个PHY是否注册了一个fixup函数,如果有,就调用这个函数进行PHY的一些额外设定。PHY LED 当然可以放在里面进行设定。

3.2 rtl8111g led 灯的定制

需求和3.1 一样。, 1G 时, LED 绿色灯亮, 100M 时褐色灯亮, 10 M 为黑, 当网络有数据时, 有一个另外的LED 等进行闪烁。(总共三个灯)。
这个更简单,直接上datasheet:
在这里插入图片描述和3.1 相似, 不过他这个LED Pin 是通过配置位进行极性翻转的(high/low active)。详细参考datasheet。

直接上代码:

--- a/drivers/net/ethernet/realtek/r8168/r8168_n.c
+++ b/drivers/net/ethernet/realtek/r8168/r8168_n.c
@@ -24364,6 +24364,7 @@ rtl8168_init_software_variable(struct net_device *dev)
                 tp->NotWrMcuPatchCode = TRUE;
         }
 
+        RTL_W16(tp, CustomLED, 0x284);
         tp->NicCustLedValue = RTL_R16(tp, CustomLED);
 
         rtl8168_get_hw_wol(dev);

0x284 的含义:
2: LED2 在100M 时常亮;
8: LED1 在仍何速率下, 只有有数据传输,就blanking。
4: LED0 在1000M 时常亮;

LED 灯的定制,就demo 至此, 希望对此还有疑惑的你有所帮助。

4. 关于RX Delay 和TX Delay 的理解

一般地,RX/TX Delay 都是发生在1000M带宽的情况下的,在描述之前,我们看一幅RGMII的连接图:
在这里插入图片描述
RX 和TX 各有四条数据线,同时有各自的Clock,对于不同的带宽,就有不同是时钟,其表如下:

带宽时钟描述
10Mbps2.5MHZ仅在CLK上升沿采集数据,4 条数据线,故是10Mbps
100Mbps25MHZ仅在CLK上升沿采集数据,4 条数据线,故是100Mbps
1000Mbps125MHZCLK的上升/下降沿都采集数据,所以 125x4x2=1000Mbps

由于数据采集是发生在RX/TX Clock 的上升沿/下降沿,为了保证数据的稳定, 理想的状况下, 时钟的上升沿或者下降沿 应该对准 数据电平正中间
在这里插入图片描述
但是因为各种原因, 信号线与时钟线之间会存在Delay, 原因主要来源有三种:

  • 发送端的TXD和TXC之间的Delay
  • PCB走线引起的TXD和TXC的Delay
  • 接收端的TXD和TXC之间的Delay

如果上升/下降沿不在数据的中间,很容易导致采集的bit 不准确,如果一个bit 出错,一个byte就出错了。
如果这种现象是轻微的(即有时采集的是准的,有时不准),则可能影响1000M以太网的性能
如果这种现象较为严重(即采集都不准),则以太网无法正常通信,如无法通过dhcp 获取IP等。

如何解决这个问题带来的影响呢?
答案很简单,就是将RX/TX CLK & DATA 的相位进行一定的调整,让其CLK的上升/下降沿最好处于DATA的中间,这就是RX Delay 和TX Delay
RX Delay 是在RX 端调节CLK 和 DATA的 Delay值。
TX Delay 是在RX 端调节CLK 和 DATA的 Delay值。

值的注意的是,对于RGMII1.3协议,部分PHY芯片不支持芯片配置时钟延时,只能依靠PCB走线延时或支持配置延时的芯片配置。
对于RGMII2.0协议的PHY芯片大都支持芯片寄存器配置时钟延时,在依靠PCB走线延时的同时,在芯片内部也能调整TX/RX Delay ,这就使得PCB走线的容错性大大提高。
100Mbps 下RX/TX Delay 问题一般较少,1000Mbps 较为常见,是因为在125M的时钟速率下,每个时钟所占有的时间长度会很短,稍微一点延时误差就会导致采样出错,而25M时钟下,每个时钟所占时间长度稍长,对延时误差的容错性更高

4.1 RX Delay 异常的一般现象

在这里插入图片描述
一些现象归纳如下:

  • 无法通过DHCP 获取到IP
  • ifconfig显示 RX error 中有大量的错误数据
  • TX error 正常

如果TX error 中有大量的错误数据 可能就需要调整TX Delay的值了。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值