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 至此, 希望对此还有疑惑的你有所帮助。

网卡PHY 移植注意事项相关推荐

  1. linux4.1内核配置以及编译及千兆网卡dp83867网卡驱动移植

    一  内核配置编译 1首先解压内核 tar jxvf linux-at91-4.1.tar.bz2: 2下载编译链 在ubuntu命令行中输入sudo apt-get install gcc-arm- ...

  2. AM335x(TQ335x)学习笔记——Nandamp;amp;网卡驱动移植

    移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...

  3. 驱动程序之_3_网络设备_3_网卡驱动移植

    驱动程序之_3_网络设备_3_网卡驱动移植 网卡出厂一般都会有驱动程序模板,网卡接到不同的Cpu上,引脚.参数有所不同,移植过程要做的就是根据硬件修改引脚地址.参数 一般来说,需要修改的是片选引脚.中 ...

  4. S3C2440实现dm9000网卡驱动程序移植

    20150419 S3C2440实现dm9000网卡驱动程序移植 2015-04-19 Lover雪儿 首先附上厂家提供的完整的dm9000程序: 1 /* 2 3 dm9ks.c: Version ...

  5. STM32F1网络编程-W5500网卡驱动移植

    W5500网卡驱动移植 1.W5500介绍 W5500 芯片是硬连线 TCP/IP 嵌入式以太网控制器,可提供与嵌入式系统的更轻松的 Internet 连接. W5500 使用户只需使用嵌入了 TCP ...

  6. STM32F工程移植注意事项

    STM32F工程移植注意事项 文档由来 最近项目用到STM32F429,参考的是正点原子的STM32F4开发板.本文主要说明一下代码移植过程中的注意事项,记录一下其中最基本的几个改动.方便后续再次做类 ...

  7. uboot网卡驱动移植

    uboot网卡驱动移植 定义相应的宏,使能uboot的网卡 添加ping和tftp命令 移植网口初始化代码 注册网卡 定义相应的宏,使能uboot的网卡 官方的uboot默认是不使能网卡相关的代码的, ...

  8. 【rtl8211】网卡 phy 设置笔记

    rtl8211 phy 和其他的 phy 差不多 问题: rtl8211 网卡 phy 强制设置100M全双工后,重新插拔网线才能进行使用 rtl8211 网卡 phy reset 后配置全部丢失,需 ...

  9. 关于国嵌 实验2 5 网卡驱动移植 网卡地址 的问题

    实验2.5 网卡驱动移植 网卡地址等几个宏的数值怎么得到的 实验2.5 网卡驱动移植中有几个宏 #define CONFIG_DM9000_BASE 0x20000300 #define DM9000 ...

最新文章

  1. 【Linux】Linux简单操作之安装、使用tomcat
  2. 安装QCreator2.5+Qt4.8.2+MinGW_gcc_4.4
  3. Notification之 - Android5.0实现原理(二)
  4. 如何处理Docker的错误消息request canceled:Docker代理问题
  5. 巧用PowerShell维护Win2008服务器作业
  6. android下获取无线wif信号、ssid、MAC等操作类
  7. airodump-ng wlan0mon扫描不到网络_MySQL ProxySql 由于漏洞扫描导致的 PROXYSQL CPU 超高...
  8. 谷歌发布AdaNet,快速灵活的AutoML工具,帮助开发者构筑强大集成学习模型
  9. Dubbo(十一)dubbo的超时重试配置以及启动检查
  10. Bzoj 2683: 简单题(CDQ分治)
  11. 吉联新软件工作好累_社交小白:“如何在社交软件和陌生人打招呼”
  12. 选择Eclipse 的列编辑模式
  13. 开源又好用的录屏软件
  14. php 四叉树quadtree,线性四叉树十进制编码原理 四叉树(Quadtrees)一共有多少种?...
  15. glide加载gif图不显示动画_Glide4-入门教程-4-加载gif图片
  16. Lattice Diamond 3.12下载与安装(免费获取license.dat)
  17. prometheus实战(一) 原理介绍
  18. AutoCAD for Mac 性能低下或不佳
  19. 再谈GPU-Driven Rendering Pipelines
  20. python内存泄漏_诊断和修复Python中的内存泄漏

热门文章

  1. HTMl中a标签的用法
  2. Qt视频播放器(支持mp4/mkv/wmv/avi)
  3. capsule 安装_Capsule:开源的 JVM 应用部署工具
  4. 网站建设,网站运营技巧和优化方案
  5. Android实现沉浸式状态栏效果
  6. 查询僵尸进程并杀死僵尸进程
  7. 毕业后4个月,我从待业青年,成功进入国企
  8. java8 stream 的list处理
  9. Android热修复技术选择和原理分析
  10. SpringBoot 2.7.2 分模块整合 activiti 7.1.0.M6