ZYNQ学习笔记(三·):88ee1518自协商不通过


一、问题记录

现象:使用zynq核心板时单网口(网口0)通过不了网络自协商,其使用的phy芯片为88ee1518,vivado2020.2版本,串口打印如下:
Start PHY autonegotiation
Waiting for PHY to complete autonegotiation.
Auto negotiation error
Phy setup error
Phy setup failure init_emacps next
在这里插入图片描述
即使关闭自协商也没解决问题,后面通过一步步查看才解决问题,问题主要出在phy_addr为0,现将解决过程记录下:
参考博客ZYNQ的PS外挂88E1111千兆网PHY电路及驱动程序详解续篇

二、vitis工程部分

因为问题出到自协商部分,所以需要找到执行自协商的函数:
通过进入mian函数中网络接口初始化的xemac_add函数
在这里插入图片描述
进入xemac_add函数,最终执行的如下图,netif_add指定的初始化函数是xemacpsif_init(注意名字,别进错函数了,switch下有好几个类似的判断)。
在这里插入图片描述
进入xemacpsif_init函数,再进入底层初始化函数low_level_init。
在这里插入图片描述
进入low_level_init函数,找到mac初始化函数init_emacps。
在这里插入图片描述
进入init_emacps函数,往下翻阅,可以看到有两个函数,一个是detect_phy函数,这个是检测phy地址的,还有一个是PHY初始化函数phy_setup_emacps,这个初始化后能为phy建立连接
在这里插入图片描述
先进入phy_setup_emacps,可以看到,它的第二个输入参数其实是phy_addr,也就是phy地址。对于有效的phy地址它便会进入到这个函数,进行如自协商等操作。
在这里插入图片描述
通过debug调试,发现进入phy_setup_emacps的时候,它的第二个参数是1(phy_addr),但是网口0的phy_addr为0,网口1的phy_addr才为1,但是网口1在下面的BD文件中都没有勾选,不应该会识别到的呀?

然后,通过原理图,发现,这两个网口其实都是PS端的网口,数据通讯都是MIO接口,而MDC和MDIO都共用同一个接口,复位也公用同一个PL引脚,时钟通过外部晶振生成并给出,那这phy1会给回应也是正常的了emmmm

因为它识别到了网口1的地址,所以它会为这个地址的phy去尝试建立连接,也就是自协商,但是我这边都没有使能这个网口1,那肯定是自协商不了一点的,所以才会出现开头那一堆报错。对于网口1毕竟数据接口都没开启,只是寄存器能正常读写。

那为什么网口0的地址没有被检测到呢?我们可以进入到detect_phy这个函数:
在这里插入图片描述
可以看到,phy_addr的有效地址检测,其实是从大到小一个一个试出来的,对这30多个可能的地址,每个地址它都通过MDIO去发读取指令,看哪个地址下,回复的值不是0xffff并且值为PHY_DETECT_MASK,便会把这个作为有效地址记录下来。

回到之前的问题,那为什么网口0的地址没有被检测到呢?你可以看到,Vitis中的驱动库里的这函数中,这个for循环并不会遍历到0,其有效范围是31到1。同理,detect_phy函数外面,执行phy_setup_emacps前,对phy_addr也有一次遍历,其for循环有效范围也是31到1。

那为什么Vitis中的LWIP驱动的有效phy地址取不到地址0呢?我从其他的phy芯片数据手册中得到了答案(正点原子的YT8521SC-CA的phy芯片数据手册),它上面有提到:

对于phy地址0,一般会视作广播地址,也就是,就算你现在的phy_addr地址虽然取的是7或者4这种不为0的phy地址,但是你的phy芯片仍然会对地址0的指令做出回应,也就是你向地址0的phy地址通讯,甚至可能是向全部的phy芯片都发了个遍,当然这个总是回应地址0的功能应该是可以关闭的,就像YT8521SC-CA。
在这里插入图片描述
总之,地址0普遍会视为广播地址,所以驱动默认的避开了地址0。但我现在必须用到这个phy物理地址为0的网口0,我目前想到的解决办法那只能是修改这个驱动代码,把对地址31到1的遍历去除,只建立地址0的通讯。

或者把网口1在VIVADO中的BD设计中勾选使能,并把从31到1的遍历修改为31到0。 (感觉这些解决办法有点蠢˃̣̣̥᷄⌓˂̣̣̥᷅ )

在这里插入图片描述
在这里插入图片描述
这样子直接修改驱动库的代码,一旦你动了Board Support Package的设置,需要重新编译驱动库的时候,这些修改的代码会被覆写,也即是会还原成之前的样子,需要注意。当然,直接在源那边修改就不会还原了,但是不推荐,毕竟这个地址0还是比较特殊的存在,这样修改的代码并不通用到各种设计。
在这里插入图片描述

三、修改后测试

这样修改后,地址0的单网口0能通过自协商了,打印信息正常:
在这里插入图片描述
ping也能ping通,丑陋的解决了问题 ( ๑╹ ꇴ╹) グッ!
在这里插入图片描述

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值