一直唠叨说要系统地学习Linux网络驱动,一直没去做。今天终于下决定写篇关于PHY寄存器的文章了,写了这个,再写篇关于PHY驱动的文章,就算给自己交差了。后面的事再议。这篇文章讲述PHY寄存,大部分属于资料收集,但也夹杂着个人的经验、见解。文中结合IEEE802.3标准、网络的分析及对驱动的理解进行描述。一般来说,像SPI、I2C、USB、PCI等总线类型的资料,都会包括电气接口和编程接口,对于以太网也类似,像硬件接口如MII、GMII,本来也想写一篇文章的,但无奈自己对接口没研究,就不写了。
0、概述
PHY是 IEEE802.3 中定义的一个标准模块。PHY 寄存器的地址空间为 5 位,因此寄存器范围是0 到31 ,最多有 32 个寄存器。IEEE802.3 定义了地址为0-15 这16个寄存器的功能,地址16-31的寄存器留给芯片制造商自由定义。但现在芯片功能很强大,32个寄存器远远不到,于是有的厂家就想出办法,使用page的方式来扩展。在看手册过程中发现,即使是0-15这类的寄存器,不同厂家在实现还是有点差异,所以,IEEE标准定义的寄存器只是在大的方面上说是“标准”的,细节方面如同一寄存器不同的位,功能也不一样,所以最好以厂商的datasheet为准。
像十兆/百兆自适应芯片DM9000,千兆的寄存器就没有,而RTL8211是千兆芯片,功能强大一些,寄存器肯定也多一些;而Intel的I211芯片,寄存器多得要使用page来解决。
IEEE802.3标准文档,下载地址:http://standards.ieee.org/about/get/。它分为很多个section,section按字面翻译为“节”,但该标准的一“节”就有好几百页,这里还是称为“部分”比较好,第一部分是概述,第二部分是百兆以太网,第三部分是千兆以太网。PHY寄存器22.2.4节有介绍,但不涉及所有的寄存器,个别寄存器需要到其它章节中看,当然,文档里面也提到该在哪里找到哪个寄存器。
Linux内核抽象出读写的函数phy_read和phy_write。在驱动中直接调用是没有问题的,当然,这需要MDIO等一切就绪后。
HY寄存器为获取网卡信息的原始途径,如网络是否连接,对端(交换机或PC)的能力,等等。然后再给内核的网络子系统(通过netif_carrier_on这类的函数)。
先从802.3标准中看PHY寄存器描述,如下:
说明:MII表示,只有0和1寄存器是基本的,其它的是扩展的
注:
1、寄存器2、3是PHY ID,一般不用研究。
2、某寄存器的比特(bit)用X.y表示,如0.15表示第0寄存器的第15位,标准文档和芯片手册使用这种形式。
一、寄存器0:控制寄存器
概述:
讲解:
IEEE章节:22.2.4.2 可读写
二、寄存器1:状态寄存器
概述:
IEEE章节:22.2.4.2 只读
三、寄存器2、3:芯片ID寄存器
概述:
寄存器2、3分别是PHY ID寄存器,从内核代码知道,寄存器2(PHY ID1)为高16位,而寄存器3(PHY ID2)为低16位。它们作为PHY芯片的标识,一般被认为作用不大,以前有过同一主CPU搭配不同的PHY组合不同的板卡,使用同一份内核,这里就可以用PHY ID来做区别。
四、寄存器4:自动协商通告寄存器
概述:
IEEE章节:37.2.5.1.3 可读写
该寄存器保存着PHY本身具备的特性、能力。如PHY支持流控、百兆全双工/半双工、十兆全双工/半双工,等。
当设置为自动协商使能情况下通过FLP在MDI上进行通告。如果不使能,则此寄存器的配置无效。
五、寄存器5:自动协商对端能力通告寄存器
概述:
IEEE章节:37.2.5.1.4 只读
该寄存器和寄存器4类似,它表示对端(交换机或PC)具备的特性、能力。同样要注意是的只有在自动协商使能情况下该寄存器信息才有效。由于此寄存器表示的是对端的状态,所以一般情况下寄存器的值被设计为只读,但有的芯片如dm9000的流控位5.10 FCS是可读写的。
该寄存器主要用来了解对端的情况,在出现问题时,可以了解对方的信息,从而大致定位范围。而不用一味地找自身原因。万一真的是对端的交换机出现故障,此寄存器就是有力的现场证据。
(存疑:交换机会不会通过寄存器4来获取PHY的状态,之后再反馈到此寄存器?)
原文链接:https://blog.csdn.net/subfate/article/details/44958597免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:以太网的phy寄存器分析 https://www.yhzz.com.cn/a/15201.html