一、适配背景

  1. PHY芯片型号:RTL8201F-VB-CG

  2. 主控型号:ssd201
  3. 组网形式(存在内置EPHY与外置PHY,需要适配的为外置PHY):
  4. RTL8201F 原理图(红框部分,为适配过程中遇到的硬件问题,下文展开分析):

二、适配步骤&问题

1. 首先根据设备树,对emac1进行适配(可与主控厂商确认相关参数的正确性):

图2-1

2. 适配完成后,再适配相关GPIO管脚(可与主控厂商确认参数的正确性):

以上两步适配完成后,设备启动后,系统应该能检测到phy芯片。即能读到PHY ID等信息。但实际启动过程中却显示未检测到phy,如下图:

2.1 无法连接PHY芯片(不在位)

如上图,MDIO在扫描读取0~31的PHY 地址后无法链接到PHY芯片,即未检测到PHY.

因此,我们需要了解系统是如何获取PHY ID以及如何检测到PHY芯片。

2.1.1 系统如何获取PHY-ID 

     mii_bus初始化:

  (1). mii_bus初始化:初始化mii_bus结构体,并注册mdiobusMDev_EMAC_mii_init:

  拓展:of_midobus_register()针对的是使用设备树的内核

2.1.2  of_mdiobus_register( )中包含了注册mdio与获取PHY_ID,主要做了:

  1. 完成MDIO总线的初始化工作,将phy设备挂载到总线上(mdiobus_register()

     注意:是否扫描phy,是由phy_mask决定,ssd201的SDK内核是不扫描的

  2. 获取PHY_ID:

   of_mdiobus_register_phy()

    --》get_phy_device()

      --》get_phy_id()

        --》mdiobus_read()从寄存器中通过mdiobus的read方法来从phy中获取phy id

 3. 将PHY设备注册到mdio总线

    of_mdiobus_register_phy()

      --》get_phy_device()

        --》phy_device_register()

至此,完成了MDIO总线和PHY设备端的初始化和注册工作。

不在位问题分析

  1. 首先需要确认MDIO时钟是否正常,如果正常,说明MDIO的初始化是OK的。通过测量,可以检测到MDC时钟信号,因此MDIO通信是正常的。

   2. 一般的PHY芯片正常工作前,都需要进行一个复位操作。走读代码未发现复位动作,故需要增加复位动作(复位动作应在检测PHY之前完成):

   2. 增加复位操作后,设备启动后检测到PHY芯片(示波器显示有复位动作)。

2.2 网络不通问题

问题现象:系统检测到PHY芯片后,设备启动后却无法ping通主机。

REF_CLK错误

定位步骤:

   1. ping 主机后,输入ifconfig查看RX,TX数据情况:

Ifconfig 中显示的RX packets,TX packets的数据统计的是MAC端外发的数据

因此,RX,TX都没有数据,可能是MAC本身出现了问题。

  2. 查看PHY的状态寄存器与mstar自带PHY的状态寄存器进行对比:

emac1(phy): zlz ---id:0x1cc816 retval:30829:

emac0(芯片自带):zlz ---id:0x11112222 retval:30957:

比较结果:只有第7位不同。但是那个是保留位,是不会影响实际的功能。从状态寄存器看PHY的自协商已完成。

3. 走读内核MAC相关代码,发现MAC发送计数器始终为0,即未触发发送中断。与厂商确认,不认为MAC驱动存在异常。

4. 回到硬件本身定位,测量RMII0_TXCK(TXC),在ping电脑时,时钟信号检测不到。

翻阅手册,发现TXC的发送时钟信号正常应该要与50MHZ的参考时钟同步

其中TXC信号依赖于REF_CLK参考时钟的模式设置:

查看原理图:

发现当前REF_CLK为1,即为输入模式,输入模式则要求同步的是MAC端的时钟。由于mstar的mac不支持对PHY芯片提供时钟信号,因此PHY的时钟信号只能是由外部提供并同步至MAC端。提供参考的时钟源来自外部晶振(25MHZ),这就要求REF_CLK 需要设置成0,即输出模式:由PHY提供同步时钟志MAC端。

  硬件更改电阻后,TXC时钟信号出现(50MHZ)。

拓展

  1. 实际测量TXC信号发现时钟频率为50MHZ,进一步确认发现: RMII协议要求时钟频率为50MHZ,但外部晶振仅为25MHZ,询问硬件后得知PHY芯片中应该有 锁相环,将时钟信号同步至50MHZ输出。

2. 关于REF_CLK参考时钟:

REF_CLK是一个连续时钟,可以为CRS_DV、RXD[1:O]、TX_EN、TXD[1:O]、RX_DV和RX_ER提供时序参考。 REF_CLKMAC层或外部时钟源源提供。REF_CLK频率应为50 MHz±50×10-6,占空比介于35%和65%之间。在RMII模式下,数据以50 MHz的时钟频率一次传送2。)

更改后原理图:

2.3 CRS_DV管脚置空问题

RMII信号线:

1. 再次尝试PING主机,发现网络依旧不通。再次ifconfig查看tx,rx计数器。发现有发送,但是没有接收。即TX有计数,但RX依旧为0. 说明发送至少是从MAC端出去了。

    2. 从硬件层面再次分析,发现原理图中,对CRS_DV这个脚做了置空处理:

   3. 查阅手册,对CRS_DV管脚的描述为  载波侦听/接收数据有效

   在网上进一步查询该管脚的作用,发现在RMII模式下,它是CRS 与 RXDV 的合并。( CRS:载波侦测信号 RX_DV:接收数据有效信号(ReveiveData Valid) ),结合实际问题现象:RX无数据,TX有数据。怀疑是否为该管脚置空导致。

  4. 与mstar厂商沟通后,确认该管脚需要与主控测的COL(冲突检测)脚相连。

  硬件修改,设备RX,TX计数正常,能够ping通主机。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐