精华内容
下载资源
问答
  • 2015-04-11 17:38:59

    一直唠叨说要系统地学习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的状态,之后再反馈到此寄存器?)


    六、寄存器6:自动协商异常信息寄存器

    概述:
    IEEE章节:37.2.5.1.5 只读


    附录

    李迟 2015.4.11
    
    更多相关内容
  • PHY寄存器驱动调试总结

    千次阅读 2021-11-02 20:59:13
    前段时间对PHY芯片进行了调试,在此做个记录总结。

            前段时间对PHY芯片进行了调试,在此做个记录总结。

            网络子系统是linux操作系统里很重要的一部分,这里主要说明一下phy芯片在整个子系统里的位置。从这个结构里可以看到,PHY驱动处于链路层。

     其硬件连接组成如图所示:

    驱动开发适配需要注意以下几点:

    1.检查硬件配置,确定PHY芯片的工作模式和RGMII电平是否正确。

    2.查看原理图,确定与MAC设备的接口,是gmii还是rgmii或者其它,并在MAC侧的设备树中配置正确。

    3. 确定主芯片是否需要PHY芯片提供时钟。

    4.Phy芯片的地址正确配置,可以通过 mdio/mdc正确访问 到 phy芯片的寄存器。

    如下为网上流行的phy.c读取phy寄存器的方法,需要将其交叉编译成可执行文件后使用,可以直接通过标准网络协议栈读写phy芯片的寄存器值,方便于调试PHY芯片。

    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <linux/mii.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <linux/sockios.h>
    #include <linux/types.h>
    #include <netinet/in.h>
    
    #define reteck(ret) \ 
    		if(ret < 0){ \ 
    			printf("%m! \"%s\" : line: %d\n", __func__, __LINE__); \
    			goto lab; \ 
    		} 
    
    #define help() \ 
    	printf("mdio:\n"); \ 
    	printf("read operation: mdio reg_addr\n"); \
    	printf("write operation: mdio reg_addr value\n"); \ 
    	printf("For example:\n"); \
    	printf("mdio eth0 1\n"); \ 
    	printf("mdio eth0 0 0x12\n\n"); \ 
    	exit(0); 
     
    int sockfd; 
    
    int main(int argc, char *argv[]){ 
    	if(argc == 1 || !strcmp(argv[1], "-h"))
    	{ 
    		help(); 
    	} 
    	struct mii_ioctl_data *mii = NULL; 
    	struct ifreq ifr; 
    	int ret; 
    	memset(&ifr, 0, sizeof(ifr));
    	strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
    	sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
    	reteck(sockfd); //get phy address in smi bus 
    	ret = ioctl(sockfd, SIOCGMIIPHY, &ifr); 
    	reteck(ret); 
    	mii = (struct mii_ioctl_data*)&ifr.ifr_data; 
    	if(argc == 3)
    	{ 
    		mii->reg_num = (uint16_t)strtoul(argv[2], NULL, 0);
    		ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
    		reteck(ret);
    		printf("read phy addr: 0x%x reg: 0x%x value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
    	}
    	else if(argc == 4)
    	{ 
    		mii->reg_num = (uint16_t)strtoul(argv[2], NULL, 0); 
    		mii->val_in = (uint16_t)strtoul(argv[3], NULL, 0); 
    		ret = ioctl(sockfd, SIOCSMIIREG, &ifr); 
    		reteck(ret);
    		printf("write phy addr: 0x%x reg: 0x%x value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
    	} 
    lab: close(sockfd);
    	return 0; 
    }

    用法如下:

    (1) Phy 寄存器读

    ./phyreg eth0 0x1e

    (2) Phy 寄存器写

    ./phyreg eth0 0x1e 0xc

    (3) 读 ext 寄存器

    例:读 ext reg 0xc:

    ./phyreg eth0 0x1e 0xc && ./phyreg eth0 0x1f

    (4) 写 ext 寄存器

    例:写 ext reg 0xc 值为 0x80f6:

    ./phyreg eth0 0x1e 0xc && ./phyreg eth0 0x1f 0x80f6

    5.操作mac侧寄存器,调试tx_delay参数,测试丢包率。 

    phy 如果工作在含有RGMII 接口的模式,按照业内惯例,tx clk delay 由MAC 来完成;rx clk delay 由phy 来完成。所以一般PHY芯片的rx clk delay默认是 2ns, tx clk delay默认是750ps。

    但不排除有些mac会对tx delay 不做配置,或对rx delay 也做配置等情况。就需要针对mac 的配置情况,来相应的在PHY芯片上电初始化时做适配。

    展开全文
  • 整理的关于以太网的相关寄存器分析,包括IEEE 802.3规范的标准寄存器以及扩展寄存器,描述了相关寄存器的意义及常规设置。
  • PHY寄存器

    千次阅读 2021-02-26 09:47:49
    在之前的文章,我们讲解了STM32的网络外设部分。 文章有《STM32网络电路设计》《STM32...我熟悉的PHY型号有:RTL8201F,RTL8201E,RTL8201G,DP83848,YT8512C等,原计划讲解RTL8201F的,但是内容太多,先把PHY寄..

    在之前的文章,我们讲解了STM32的网络外设部分。

    图片

    文章有《STM32网络电路设计》《STM32网络之MAC控制器》《STM32网络之DMA控制器》《STM32网络之中断》。

    STM32只有网络外设时不能进行网络通信的,因为STM32只提供了SMI接口,MII和RMII接口。我们还需要与之通信的外部网络芯片,简称PHY芯片。我熟悉的PHY型号有:RTL8201F,RTL8201E,RTL8201G,DP83848,YT8512C等,原计划讲解RTL8201F的,但是内容太多,先把PHY寄存器拿出来讲一下。

    为什么STM32不集成PHY呢?

    PHY(PortPhysical Layer),中文可称之为端口物理层。

    1、PHY芯片是模拟芯片,需要将网线的差分信号转换成数字信号,如果集成,则芯片面积增加,如果要降低功耗,还要高的芯片制造工艺,这会直接将芯片成本拉高。

    2、并不是所有的STM32使用者都需要使用到网络,集成PHY会增加成本。

    所以,STM32不集成PHY不是技术问题,而是各方面考虑的结果。

    难道没有集成PHY的MCU吗?

    有的,TI的LM3S8962。

    图片

    我们说回PHY寄存器,外部PHY芯片寄存器分为3种类型

    Basic:基础寄存器

    Extended:扩展寄存器

    Vendor-spcififc:厂商特殊寄存器

    其中在802.3协议2012版中有如下说明。

    图片

    不同的手册,对基础寄存器有不同的说明,按照802.3-2012上图的说明基础寄存器是控制器寄存器(寄存器0)和状态寄存器(寄存器1),在GMII(千兆网)接口中海油扩展状态寄存器(寄存器15)。

    本文主要根据802.3-2012协议讲解PHY的基础寄存器,并不是根据某个具体芯片讲解的。

    图片

    寄存器0和寄存器1在协议文档的中位置如下图

    图片

    上面提到的802.3-2012协议大家可以到ieee官网下载

    IEEE SA - The IEEE Standards Association - Home

    或者通过百度网盘下载

    链接:百度网盘 请输入提取码

    提取码:xhin

    01、控制寄存器(寄存器0)

    寄存器0是PHY控制寄存器,通过ControlRegister可以对PHY的主要工作状态进行设置

    图片

    bit15 Rset

    bit15为1时表示,PHY复位。Bit15控制的是PHY复位功能,在该位置写入1实现对PHY的复位操作。复位后该端口PHY的其他控制、状态寄存器将恢复到默认值,每次PHY复位应该在0.5s的时间内完成,复位过程中Bit15保持为1,复位完成之后该位应该自动清零。一般要改变端口的工作模式(如速率、双工、流控或协商信息等)时,在设置完相应位置的寄存器之后,需要通过Reset位复位PHY来使配置生效。

    在复位过程完成之前,不需要PHY接受对控制寄存器的写事务,而在复位过程完成之前,对控制寄存器中除bit15以外的位的写操作可能无效。

    bit14 Loopback

    Loopback是一个调试以及故障诊断中常用的功能,Bit14置1之后,PHY和外部MDI的连接在逻辑上将被断开,从MAC经过MII/GMII(也可能是其他的MAC/PHY接口)发送过来的数据将不会被发送到MDI上,而是在PHY内部(一般在PCS)回环到本端口的MII/GMII接收通道上。

    通过Loopback功能可以检查MII/GMII以及PHY接口部分是否工作正常,对于端口不通的情况可用于故障定位。需要注意的是,很多时候PHY设置Loopback后端口可能就Linkdown了,MAC无法向该端口发帧,这时就需要通过设置端口ForceLink up才能使用Loopback功能。

    bit13 Speed SelectionLSB

    Bit13和Bit6两位联合实现对端口的速率控制功能,具体的对应关系详见下图

    图片

    需要注意的是SpeedSelection只有在自动协商关闭的情况下才起作用,如果自动协商设置为Enable状态,则该设置不起作用;

    并且,对SpeedSelection的修改设置,往往需要复位端口才能配置生效。因此在设置该位置的时候需要检查自动协商的设置并通过Bit15复位端口。

    bit12 Auto-Negotiation Enable

    自动协商(AN)开关。设置为1表示打开AN功能,端口的工作模式通过和连接对端进行自动协商来确定。如果设置为0则自动协商功能关闭,端口的工作模式通过ControlRegister相应位置的配置决定。必须注意的是,对于1000BASE-T接口,自动协商必须打开。

    bit11 Power Down

    端口工作开关:设置为1将使端口进入PowerDown(低功耗状态)模式,正常情况下PHY在PowerDown模式其MII和MDI均不会对外发送数据。PowerDown模式一般在软件shutdown端口的时候使用,需要注意的是端口从PowerDown模式恢复,需要复位端口以保证端口可靠的连接。

    bit10 Isolate

    隔离状态开关:改位置1将导致PHY和MII接口之间处于电气隔离状态,除了MDC/MDIO接口的信号外,其他MII引脚处于高阻态。IEEE802.3没有对Isolate时MDI接口的状态进行规范,此时MDI端可能还在正常运行。Isolate在实际应用中并没有用到。并且,值得注意的是,由于目前很多百兆的PHY芯片其MAC接口主流的都是SMII/S3MII,8个端口的接口是相互关联的,一个端口设置Isolate可能会影响其他端口的正常使用,因此在使用中注意不要随意更改bit10的状态。

    bit9 Restart Auto-Negotiation

    重新启动自动协商开关:Bit9置1将重新启动端口的自动协商进程,当然前提是Auto-NegotiationEnable是使能的。一般在修改端口的自动协商能力信息之后通过Bit9置1重新启动自动协商来使端口按照新的配置建立link。

    bit8 Duplex Mode

    双工模式设置:Bit8置1端口设置为全双工,置0则端设置为半双工,和SpeedSelection的设置一样,DuplexMode的设置只有在自动协商关闭的情况下才起作用,如果自动协商设置为Enable状态,则该设置不起作用,端口的双工模式根据AN结果来定。对DuplexMode的修改配置也需要复位端口才能生效。

    bit7 Collision Test

    冲突信号(COL)测试开关:在需要对COL信号进行测试时,可以通过Bit7置1,这时PHY将输出一个COL脉冲以供测试。实际测试操作中也可以将端口配置为半双工状态,通过发帧冲突来测试COL信号,因此该配置实用价值不大。

    bit6 Speed SelectionMSB

    和Bit13两位联合实现对端口的速率控制功能。

    图片

    bit5 Unidirectional enable

    当第12位为1或第8位为0时,该位为忽略了。

    当第12位为0且第8位为1:

    1:从MII接口启用传输,不管PHY是否确定已建立有效链路

    0:仅当PHY确定已建立有效链路时,才启用从MII接口传输

    Bits 4:0 reserved

    保留位,它们应写入为零,读取时应忽略;但是,PHY应返回这些位中的值零。

    02、状态寄存器(寄存器1)

    寄存器1是PHY状态寄存器,主要包含PHY的状态信息。

    图片

    bit15 100BASE-T4

    PHY使用100BASE-T4信令规范执行链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit14 100BASE-X Full Duplex

    PHY使用100BASE-X信令规范执行全双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit13 100BASE-X Half Duplex

    PHY使用100BASE-X信令规范执行半双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit12 10Mb/s Full Duplex

    PHY具有以10Mb/s的速度运行时执行全双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit11 10Mb/s Half Duplex

    PHY具有以10Mb/s的速度运行时执行半双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit10 100BASE-T2 Full Duplex

    PHY具有使用100BASE-T2信令规范执行全双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit9 100BASE-T2 Half Duplex

    PHY具有使用100BASE-T2信令规范执行半双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit8 Externded Status

    1:使能寄存器15

    0:不使能寄存器15

    bit7 Unidirectional ability

    1:PHY有能力编码和传输来自PHY的数据通过MII接口,而不管PHY是否已确定有效链路已被连接已建立。

    0:仅当PHY确定已建立有效链路时,才启用从MII接口传输

    bit6 MF Preamble Suppression

    1:PHY能够接受管理帧,而不管它们前面是否有前导码模式。

    0:PHY不能接受管理帧,除非它们前面有前导码模式。

    前导码模式。

    在官方文档中22.2.4.5.2中有描述的。大家可以自行查看。

    图片

    其实这个前导码我们在之前也是讲解到的,在文章《STM32网络之SMI接口》如下图,建议没有读过这篇文章的同学读一下。

    图片

    bit5 Auto-Negotiation Complete

    AN完成状态指示位:Bit5指示的是端口AN进程是否完成的状态位。在ANEnable的情况下,Bit5=1表示自动协商进程已经成功结束,此时PHY的其他和Link状态相关的寄存器才是正确可靠的。如果AN进程没有完成,则这些状态信息可能是错误的。在调试以及异常故障处理时,可以通过该位寄存器的状态判断AN是否成功,从而进一步的检查AN相关的设置是否正确,或者芯片的AN功能是否正常等。

    bit4 Remote Fault

    远端错误指示位:Bit4=1代表连接对端(LinkPartner)出错,至于出错的具体类型以及错误检测机制在规范中并没有定义,由PHY的制造商自由发挥,一般的厂商都会在其他的寄存器(Register16-31由厂商自行定义)指示比较详细的错误类型。在与端口相关的故障查证中,RemoteFault是一个重要的指示信息,通过互联双方的RemoteFault信息(可能要加上其他的具体错误指示),可以帮助定位故障原因。

    bit3 Auto-Negotiation Ability

    1:PHY使能自动协商

    0:PHY不使能自动协商

    bit2 Link Status

    Link状态指示位:Bit2=1代表端口Linkup,0则代表端口Linkdown。实际应用中一般都是通过Bit2来判断端口的状态。而且,一般的MAC芯片也是通过轮询PHY的这个寄存器值来判断端口的Link状态的(这个过程可能有不同的名称,比如BCM叫做LinkScan,而Marvell叫做PHYPolling。)如前所述,在ANEnable的情况下,LinkStatus的信息只有在Auto-NegotiationComplete指示已经完成的情况下才是正确可靠的,否则有可能出错。

    bit1 Jabber Detect

    1:检测到抖动(戳刺)状态

    0:没有检测到抖动(戳刺)状态

    bit0 Extended Capability

    1:PHY提供了扩展的功能集,可通过扩展的寄存器集进行访问。

    0:没有提供扩展寄存器。

    03、寄存器15

    寄存器15主要模式千兆网模式下,PHY的状态。

    图片

    如上图,寄存器15主要描述,千兆网模式下PHY的状态,具体含义和寄存器1的相关位差不多。

    bit15 1000BASE-X Full Duplex

    PHY使用1000BASE-X信令规范执行全双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit14 1000BASE-X Half Duplex

    PHY使用100B0ASE-X信令规范执行半双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit13 1000BASE-T Full Duplex

    PHY具有使用1000BASE-T信令规范执行全双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    bit12 1000BASE-T Half Duplex

    PHY具有使用1000BASE-T信令规范执行半双工链路传输和接收的能力。1:具有能力;0:不具有能力。

    Bits 11:0 reserved

    保留位,读取的时候忽略。

    04

    其他寄存器

    除去基础寄存器,802.3-2012协议也提到了其他寄存器,这里简单说明下,不做重点讲解。

    寄存器23:芯片ID寄存器

    寄存器2、3分别是PHYID寄存器,从内核代码知道,寄存器2(PHYID1)为高16位,而寄存器3(PHYID2)为低16位。它们作为PHY芯片的标识,一般被认为作用不大,以前有过同一主CPU搭配不同的PHY组合不同的板卡,使用同一份内核,这里就可以用PHYID来做区别。

    寄存器4:自动协商通告寄存器

    该寄存器保存着PHY本身具备的特性、能力。如PHY支持流控、百兆全双工/半双工、十兆全双工/半双工,等。

    当设置为自动协商使能情况下通过FLP在MDI上进行通告。如果不使能,则此寄存器的配置无效。

    寄存器5:自动协商对端能力通告寄存器

    该寄存器和寄存器4类似,它表示对端(交换机或PC)具备的特性、能力。同样要注意是的只有在自动协商使能情况下该寄存器信息才有效。由于此寄存器表示的是对端的状态,所以一般情况下寄存器的值被设计为只读,但有的芯片如dm9000的流控位5.10FCS是可读写的。

    该寄存器主要用来了解对端的情况,在出现问题时,可以了解对方的信息,从而大致定位范围。而不用一味地找自身原因。万一真的是对端的交换机出现故障,此寄存器就是有力的现场证据。

    点击查看本文所在的专辑,STM32F207网络开发

    关注公众号,第一时间收到文章更新

    展开全文
  • 以太网PHY寄存器分析

    2014-07-23 11:49:56
    以太网PHY寄存器分析 比较到位 能解决不少问题
  • RGMII接口调试使用VIO读取PHY寄存器

    千次阅读 2020-12-30 08:35:41
    测试场景测试拓扑图如下试场景连接图测试方法:使用...测试RGMII接口时使用的PHY芯片为MARVELL 公司的88e1512PHY芯片,RGMII顶层接口信号如图1所示。图1 测试代码顶层接口信号采用以往经验发现问题按照以往的...

    测试场景

    测试拓扑图如下

    试场景连接图

    测试方法:使用TestCenter向被测板子上的千兆以太网口打流,在FPGA内部通过自回环从源端口返回给TestCenter,通过看TestCenter控制界面上显示结果判断自回环是否正确。

    测试RGMII接口时使用的PHY芯片为MARVELL 公司的88e1512PHY芯片,RGMII顶层接口信号如图1所示。

    图1 测试代码顶层接口信号采用以往经验发现问题

    按照以往的RGMII接口使用经验,通过约束将接口的输出时钟延迟了2ns,如图2所示。使用TestCenter对以太网口进行测试,以太网口无法正常发送数据。具体表现为,TestCenter接收的数据帧数目,和发送的数据帧数目相等,但是接收的bit数明显比发送的bit数少。抓取测试代码的内部信号发现,FPGA接收到的以太网数据帧均正常,所以推测FPGA给PHY芯片的发送数据的时序不正常。

    图2 发送时钟偏移2ns约束代码

    修改代码,不对发送时钟进行2ns的偏移,如图3所示。使用TestCenter对以太网口进行测试,以太网口正常地工作。

    图3 发送时钟不进行偏移2ns问题原因定位

    推测在不同的PHY芯片的工作模式下,对时钟的要求不一样。

    之前使用的REALTEK的RTL8211E PHY芯片,需要对发送时钟进行2ns的延迟,查找该 PHY芯片手册, PHY芯片对发送时钟有图4所示的要求。表格中明确指出,需要自己添加时钟和数据之间的2ns时延。

    图4 RTL8211E的发送时钟

    查找目前调试板子上所使用MARVELL的88e1512 PHY芯片的芯片手册,发现RGMII接口有4种不同的时钟工作模式。

    图5 88e1512的4种时钟工作模式

    4种时钟工作模式下的信号时序图如图6、图7所示,结合上板现象,推测当前的工作模式为add delay模式,即Register21_2.4=1。

    图6 RGMII发送时序

    图7 RGMII接收时序

    图8 寄存器的时钟模式配置

    由上面图6、图7和图8可以看出,跟前面RTL8211E PHY芯片不同的是,MARVELL的88e1512 PHY芯片可以配置PHY与FPGA的RGMII接口时钟信号和数据信号是否已经相对偏移2ns。也就是说,可以通过读取PHY芯片相应寄存器的方法来看默认的工作模式。

    经验总结:遇到RGMII接口调试时,最关键的是要查看PHY芯片的型号,查阅PHY芯片手册,通过MDIO读取PHY芯片寄存器的值,看RGMII接口上数据和时钟是否偏移2ns,再决定FPGA对应管脚约束是否进行偏移!用VIO方法读取或配置PHY芯片的寄存器

    在没有CPU的情况下,对PHY芯片中寄存器在线读取的最好办法使用VIO通过MDIO接口对PHY芯片中的寄存器进行读取。具体方法可以查看本公众号之前文章:

    上图为测试场景,由FPGA芯片通过24个Mdio接口控制24个88E1512 PHY芯片。

    具体的测试步骤为:通过VIO配置MDIO管理模块PHY地址、寄存器地址,然后选择读操作读取某一PHY芯片的寄存器的值,结合PHY的工作状态,判断该寄存器是否被正确读取。由于执行读操作时是采用先写入地址,在读取数据的方式,因此只测试读操作就可以完整的测试MDIO管理模块的功能。以下是VIO对应的调用代码。//-----------------------------

    mdio_module_VSC8658 U_mdio_module (.mdc(mdc_o),

    .mdio(mdio),

    .reset(reset),

    .mdir (mdir),

    .execute(execute),                   //

    .req(req),                        //读   tb用

    .phy_addr(phy_addr),

    .reg_addr(reg_addr),

    .data_phy(data_phy),

    .data_rd(data_rd),

    .op_done(op_done)

    );

    //-----------------------on board-----------------------------------

    vio_0 u_vio (.clk(clk),                // input wire clk

    .probe_out0(req),  // output wire [0 : 0] probe_out1

    .probe_out1(phy_addr),  // output wire [4 : 0] probe_out2

    .probe_out2(reg_addr),  // output wire [4 : 0] probe_out3

    .probe_out3(data_phy)  // output wire [15 : 0] probe_out4

    );

    //-----------------

    //----------------------mdc generate--------------------------------

    //mdc should be 0~12.5MHz, the module is n*2 Divide

    mdio_clk #(.Divider(25)) U_mdio_clk(

    .reset (reset),

    .clk(clk) ,

    .clk_o(mdc_o)

    );

    //-------------------------------------------------------------------

    通过VIO和MDIO读取相应寄存器的值,如图10所示,读取到的值为1076,换算成2进值为0000_0100_0011_0100,对应的工作模式为图8所示的Transmit clock internally delayed,即 add delay模式,不需要对时钟进行2ns的偏移。

    图9 寄存器的地址

    图10 读取的寄存器数值

    图11 用windows自带的计算器看二进制

    确认完之后,Testcenter打流,一切OK。但有时候,因为PCB设计的问题,比如RGMII接口的时钟未采用专用的时钟管脚,或者是对应的4bit数据信号不在FPGA芯片的同一个BANK,就会导致RGMII接口无论如何调整时钟与数据之间的相位关系,该RGMII接口都无法正常工作。所以,能够正常工作的前提是硬件的连线关系及PCB板是OK的。FPGA使用RGMII接口与PHY芯片连接时经验总结

    事实上,相对于Altera的FPGA,Xilinx的FPGA在使用RGMII接口与PHY芯片相连时会比较讲究。以下归纳几点与大家分享。

    1、rgmii信号中的接收时钟phy_rxclk为单端时钟,如果将此时钟接到FPGA中多功能时钟引脚(MRCC或SRCC)上时,必须从正端(P)输入;

    每个PHY芯片的tx和rx信号接在FPGA的同一个bank中,其中tx_clk和rx_clk需要接入bank中时钟专用管脚的P端,且其N端不能够接其它信号;

    2、rgmii中接收信号(rxd、rxclk、rxctl)必须在FPGA中同一个bank或者相邻bank上,如果是在相邻bank上,rxclk必须接到MRCC中;

    每个PHY芯片有4个rxd、4个txd、2个ctl信号,每个PHY共10个,4个PHY共40个信号;接收发送每个PHY各有两个时钟,总共1个PHY占用12个引脚。理论上1个bank可以接4个PHY芯片;

    3、注意PHY芯片的供电电压与FPGA的供电电压是否相同;

    4、每个PHY芯片采用单独的晶振产生参考时钟;(本公众号之前文章SDN先驱Nick教授以及netFPGA无法完美实现6802时间同步一文中就曾指出netFPGA就疑似存在此问题,由于抖动过大,多个端口无法实现6802同步);RGMII接口与GMII接口

    在MAC核与PHY芯片的通信过程中,存在多种接口形式,如MII、GMII、RGMII、XGMII等,千兆以太网端口中以GMII(GigabitMedia Independent Interface)和RGMII(ReducedMedia Independent Interface)最为常见。GMII能够支持10Mbps、100Mbps、1000Mbps的数据传输,其关键接口信号如图4.1所示。

    相比与GMII,RGMII接口的信号线大幅减少至12根,移除了其中不必要的TXER、RXER、COL、CRS,并将数据线宽度由8位缩减至4位,但同样能够支持10Mbps、100Mbps和1000Mbps传输,其接口信号如下图4.2所示。

    RGMII接口中的双沿数据信号适于传输,但并不适于数据处理,因此在MAC核内处理PHY侧数据时首先需要将双沿数据变换为单沿数据。在Crossbar交换机实现时硬件平台采用的是RGMII接口,故需要实现RGMII接口与GMII接口的相互转换,如图4.3所示。

    RGMII虽然相比于GMII缩减了大量信号线,但仍能实现1000Mbps数据传输,原因在于RGMII采用双沿传输技术,在时钟的上、下沿同时传输数据,那么在一个时钟周期内就能完成8bits数据的传输,与GMII的收发效果相同,如图4.4所示。而在RGMII中单向只有一个指示信号RX_CTL(TX_CTL),在双沿传输时可将GMII中的RXEN与RXER也分别在RX_CTL的上、下沿进行传输即可。

    在上图4.4中,RGMII数据在时钟的上升沿传输GMII中的3~0位,在时钟的下降沿传输GMII中的7~4位,一个时钟完成8bits数据的传输。RX_CTL信号持续拉高,表明当前帧正确无误。

    在上图4.5中,数据传输与图4.4相同,而RX_CTL在时钟的下降沿跳变为0,代表了GMII中的RXER信号为1,表明传输错误。而在RX_CTL持续时间结束时,是在时钟的上升沿拉低,此时在一个完整的时钟周期内RXEN=0,RXER=0,可知RX_CTL与RXEN、RXER的关系为:RXEN xorRXER = RX_CTL,xor代表异或运算。

    为实现RGMII信号与GMII信号的相互转换,本文借助了Xilinx提供的基于FPGA的几类原语,原语指Xilinx针对其器件特征开发的一系列常用模块的名字。下面列出所用原语的名称及介绍。

    (1)IDDR、ODDR

    DDR(Dual Data Rate)即双倍速率,数据在时钟的上升沿、下降沿均发生变化,IDDR用作将一路双沿时钟数据转换为两路普通数据,ODDR用作将两路普通数据帧转换为一路双沿时钟数据,如图4.6所示。

    (2)BUFIO

    一种特殊的时钟buffer,该buffer独立于全局时钟之外,适合用作接收源同步数据,但需要之处的是,该buffer输出的时钟无法直接驱动逻辑资源,适合驱动IDDR等专用组件。

    (3)BUFR

    一种特殊的时钟buffer,独立于全局时钟外,该buffer输出的时钟用作驱动该区域内的逻辑资源。

    (4)IBUFG

    一种全局时钟buffer,在FPGA的时钟输入处都应添加IBUFG进行缓冲,使得缓冲后的时钟线拥有最小的延迟与抖动,且驱动能力大幅增加。

    (5)IODELAY1、IDELAYCTRL

    IODELAY1为一种可编程的绝对延时组件,可对某一线路添加一定的延时,其延时值由IDEALYCTRL决定。IDELAYCTRL的延时精度为参考时钟的1/64,如提供200MHz的参考时钟,延时精度为5ns/64 = 78ps,二者需配合使用。

    在接口转换的硬件实现过程中,分为接收转换与发送转换,二者存在较大区别,下面分别给出接收转换与发送转换的实现过程。

    接收转换即为对RXD、RX_CTL的转换,在千兆模式下RGMII接口接收数据时,随路时钟即RXC为125MHz,且为双沿传输,因此不仅要使用IDDR取出双沿数据,更要对时钟进行额外处理,转换过程如图4.7所示。

    在图4.7中,并未给出RX_CTL的转换,其转换原理与RXD转换类似,在IDDR转换后Q1为GMII下的RXDV,Q1 xor Q2为GMII下的RXER。图中,IBUFG用于将外部输入的性能较差时钟RXC转换为内部可用的高效时钟RXC_BUFG,BUFIO用于将RXC_BUFG转换为适合采集源同步数据的时钟RXC_BUFIO,BUFR用于将RXC_BUFG转换为适合区域内逻辑资源使用的时钟Rx_clk_to_mac,相比于RXC_BUFG更适合驱动Rxd_to_mac。IBUF与IBUFG功能相似,但IBUFG只适用于时钟信号,IBUF为数据线buffer。IODELAY1用作给RXD信号添加一定的延时,抵消时钟线在经过BUFIO时与在硬件布线时引入的延时,其延时值需要视硬件特性决定,在本文中使用Zedboard实现Crossbar交换机时延时值设置为0。IDDR在图中只给出一个,在实现时需要用到5个IDDR分别对应于RXD0~RXD4以及RX_CTL。

    发送转换即为对TXD、TX_CTL的转换,在RGMII的发送过程中,时钟信号由FPGA内部给出,因此不需要对时钟线添加额外的buffer,需要指出的是,RGMII的发送时钟与发送数据并非是沿对齐的,而是如图4.8所示的中心对齐,采用这样的时序好处在于对于对端接收来说,双沿采样更加稳定。

    在实际的发送转换中,首先利用125MHz的时钟驱动ODDR获得TXD以及TX_CTL(TX_CTL的转换中D1为GMII中的TXEN,D2为GMII中的TXEN xorTXER),此时的TXD与TX_CTL与最初的125MHz时钟是沿对齐的。特殊之处在于,TXC同样由ODDR产生,该ODDR的驱动时钟为最初的125MHz时钟相移90度后的另一时钟tx_clk90,如图4.9所示。之所以采用ODDR产生TXC是因为此时的TXC就与TXD、TX_CTL经过了相同的ODDR延时,最终TXC与TXD、TX_CTL就是中心对齐的。

    全文完。

    展开全文
  • PHY以太网寄存器解析

    2020-12-20 14:48:34
    1以太网PHY寄存器分析以太网PHY寄存器分析.................................................................................................................11、以太网PHY标准寄存器分析........................
  • Linux+arm 网卡故障调试:ethtool&phy寄存器读写 两个工具一个是ethtool工具,一个是源码编译的可以读phy寄存器的工具phyreg。两者结合使用,事半功倍。ethtool 可以查看和设置网卡的工作状态,比如查看设置网卡的...
  • 最近做zynq外接88e1512实现光通信,在寄存器配置完后,发现老是调不通程序,怀疑是寄存器配置不正确,请问到底该怎么配置呢</p>
  • 此文件为Marvell的Phy 88E1116R芯片的数据手册,文件中附有Xilinx Zynq 中对88E1116R的寄存器配置过程的详细
  • phy芯片FPGA配置代码,通过项目验证。
  • 1、以太网PHY标准寄存器分析PHY是IEEE802.3中定义的一个标准模块,STA(station management entity,管理实体,一般为MAC或CPU)通过SMI...PHY寄存器的地址空间为5位,从0到31最多可以定义32个寄存器(随着芯片功能...
  • 裕泰 phy芯片参考设计。YT8511_reference_design_v1.1_20191018.pdf
  • 最近项目又使用到一款交换芯片RTL8367N,需要读取PHY寄存器状态,因为前面使用过RTL8305NB,当时是使用了MII接口实现了对PHY寄存器的读取,这次照葫芦画瓢,但是RTL8367N没有任何反应。 查阅DATASHEET发现: SMI_...
  • 在用户空间读写phy寄存器,支持多页以及读取连续任意的寄存器
  • PHY以太网寄存器解析以太网PHY寄存器分析以太网PHY寄存器分析11、以太网PHY标准寄存器分析21.1 Control Register21.2 Status register51.3 PHY Identifier Register81.4 Auto-Negotiation Advertisement Register...
  • 这时,常常需要使用VIO去读取PHY里面对应寄存器的值,看是否工作在正常RGMII接口时序模式。测试场景测试拓扑图如下试场景连接图测试方法:使用TestCenter向被测板子上的千兆以太网口打流,在FPGA内部通过自回环从源...
  • Marvell 88E1145PHY芯片的初始化配置

    千次阅读 2019-06-12 11:14:32
    1    ...PHY芯片的初始化配置有硬件配置和软件配置两种途径,当系统上电之后默认采用硬件配置的模式,如需要更改配置,可以通过软件写寄存器的方式来更改模式。此处主要说明...
  • u-boot下以太网AR8033 PHY寄存器的访问及设置 要求: 对AR8033的RGMII电压进行设置,与处理器端的接口电平匹配。处理器接口电平为1.8V,PHY默认电平为1.5V,通信时,需要将PHY电压设置为相适配的1.8V电压。 PHY...
  • GPIO模拟SMI读取RTL8305NB各个PHY寄存器

    千次阅读 热门讨论 2018-07-27 17:31:39
    有的交换芯片提供了SDC和...通过自己摸索,已经实现通过两个普通GPIO口模拟SDC和SDIO(SMI)访问RTL8305BN的各个PHY寄存器的值。 P0-P4的PHY地址没有按照顺序来排序,PHY0/PHY2/PHY5/PHY6/PHY7对应这5个PORT。 ...
  • 88E15xx寄存器配置

    2021-05-10 20:46:47
    上面这张图告诉你,你要想哪个寄存器设置生效,那么你就需要在对应的复位寄存器中的对应bit写1,写完后PHY会自动重启。重启后你设置的值就会生效。可能有读者会不明白0_0.15、0_0.15、20_18.15是什么意思。下面我...
  • DM9000(A)是一个全集成、功能强大、性价比高的快速以太网MAC控制器,它带有一个通用处理器接口、EEPROM接口、10/100 PHY和16KB的SRAM(13KB作为接收FIFO,3KB作为发送FIFO)。它采用单电源供电,可兼容3.3V、5V的IO...
  • 首先调试检查硬件,再调试软件首先仔细阅读phy和主芯片datesheet ,尤其着重阅读mii寄存器,它是mac和phy交换信息的媒介。硬件注意:关于phy的芯片需要注意的有几点:1、mdio接口和rgmii或者mii接口是否正确。2、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,274
精华内容 2,109
关键字:

phy寄存器配置