This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

仿BeagleBone开发,Mdio Phy 寄存器值错误



客户的板卡,基于BeagleBone设计的。同样的uImage,及文件系统,在Beagleboned的demo板上,网络部分成功运行,网口正常工作。
但是,在我们的开发板上却无法正常工作。
   
       通过软件调试信息跟踪,发现,drivers/net/ethernet/ti/davinci_mdio.c 文件源码里
      
       函数 static int davinci_mdio_reset(struct mii_bus *bus)中,
        /* get phy mask from the alive register */
        phy_mask = __raw_readl(&data->regs->alive);
         
       phy_mask 得到的值不一样。
      
       (1)Beagleboned的demo板,读到的值是1, 取反是0xfffffffe, MDIO扫描时,在phy[0]上找到设备
       (2)Agama板子读到的值是4, 取反是0xfffffffb,MDIO扫描时,在phy[2]上找到设备

       就是这样的差别,导致Agama板子网卡无法工作。

      硬件电路,也查了好多遍了。有什么建议吗?

  • drivers/net/ethernet/ti/davinci_mdio.c 这个文件是哪里拿的?你是用的am335x么,感觉你拿的代码像是拿的omap3的,不一样的

  • 请问一下,您这个问题现在解决了吗?

    我们也碰到这方面的问题,可否给个建议,非常感谢

  • 你好,我也碰到了类似的问题,请问你是怎么解决的,谢谢

  • 晕啊!我们现在也是遇到这个问题了,和你们一模一样!也是自己做的板子,在demo板上信息如下:

    davinci_mdio davinci_mdio.0: phy[0]: device 0:00, driver SMSC LA0

    在我们的板子上是这样的:

    davinci_mdio davinci_mdio.0: phy[2]: device 0:02, driver SMSC LAN8710/LAN8720

    这个问题你们解决了吗?

  • 这个号是PHY_ADDR,这个值要看一下PHY的手册,有可能是通过芯片管脚配置的。

    MDIO驱动工作过程如下

    /davinci_mdio.c davinci_mdio_probe()
    1)注册phy_bus设备
    2)关联read,write等操作函数
    3)mdiobus_register
    4)/mdio_bus.c mdiobus_register注册设备
    5)复位mdio_bus
    6)mdiobus_scan
    7)mdiobus_scan 调用get_phy_device ---->调用get_phy_id 获取ID号(参数bus,addr)-->调用davinci_mdio_read
    davinci_mdio_read通过&data->regs->user[0].access寄存器来操作。regs寄存器是在xxx_probe函数中通过platform_get_resource,
    platform_get_resource和devm_ioremap_nocache后得到的,其中资源通过调用驱动时通过pdev指针传进来。resource在/mach-omap2/devices.c
    am33xx_cpsw_mdiodevice 平台结构体中定义,实际的物理地址是AM33XX_CPSW_MDIO_BASE(0x4A101000),通过访问MDIO_USER Access 访问PHY
    其中PHY_ADDR是通过DM9161A的RXD[3..0]采集,硬件上RXD[0]上拉了,所以PHY_ADDR为1
    扫描到phy以后,通过phy_device_create创建phy_device,完成后返回创建的phy_device指针
    8)mdiobus_scan完成后,通过phy_device_register将扫描的phy_device注册到mdio_bus上即增加一个phy_map数组值

  • 另外TI的驱动中,有一个小BUG。在\arch\arm\mach-omap2\devices.c 中定义am33xx_cpsw_slaves时没有定义phy_id的类型,DM9161PHY在初始化时是需要这个值得,不定义会导致PHY初始化失败。

  • 同样的问题,自己做的3359的板子,PHYAD读出来是02,偶尔的情况下能读出来00,但是几率很小。PHYAD【2:0】全部10K下拉到地上,始终读出位02,只有将PHYAD1引脚直接接地才能读出来00,但是PHY初始化不成功。将PHYAD2和PHYAD1都上拉,读出来还是02,感觉外围的上下拉电阻对PHYAD的配置不起作用。对比了beaglebone开发板,没发现有什么差别,就是读不出正确的00.

  • 这么多年了,大家应该都去做别的平台了吧。。。 这个问题我来答。

    在beaglebone里面,准确说在TI的cpsw芯片里面,有一个bug。

    就是会在phy上电的时候,上电顺序不规范,网卡和CPU一起上电,这时候CPU管腿输出一些东西干扰到phy的地址识别。

    观察这个现象很简单:对beaglebone进行100次上电(包括最新的BBB),你就会发现有至少一次网卡是不会亮的。看内核log能够看到PHY的地址不是默认的0,而是2。如果改变了电源上升时间(增减解耦电容,更换DC-DC),那么可能PHY的地址就是永远的2了。

    这个问题可以通过强行读写网卡寄存器,配置网卡地址,最后重新注册网卡来修正。

    不过在重新注册的过程中(包含一次反注册和正注册),TI的驱动有个BUG,会导致kernel panic输出。

    幸好即便出现kernel panic,也不影响最终使用。

    最好的办法是上电后,在uboot里面强行配置一遍phy-addr。

  • 专业的工程师出现了。

  • 您反映的这个问题,在errata里没有描述么?

  • 您好,请问你们的问题后来是怎么解决的,我们遇到了一模一样的问题,望给予帮助。

  • 你好!请问如何在uboot里面强制配置phy-addr啊?我查遍了phy的寄存器也没有找到配置phy地址的地方啊?感觉好像是通过PHYAD0~2这三个引脚来确定的phy-addr吧?望赐教!

  • phy-addr是由PHY芯片的PHYAD0~2通过外部上下拉确定的,如果置空的话,请查一下spec有没有默认值。

  • 我们的板子是完全参考beagleboneblack设计的电路,可是现在出现偶尔上电没有网的情况,经过修改uboot把phy-addr为2的设备加进去,现在可以在uboot中查看phy的id已经能够正确返回了,可是 总返回0.调试许久也没有好转。

    所以,想从phy-addr的值着手解决这个问题。很诧异,为什么phy-addr会变成2!不改硬件的情况下:如何让它固定为0???