以太網(wǎng)的PHY和MAC的接口可以使用RGMII,SGMII等類似下圖:由于大部分驅(qū)動都是RGMII,使用SGMII的時候需要對驅(qū)動做對應(yīng)的修改。芯片可以使用外部引腳進行配置。但是有的時候外部配置的不對,需要通過驅(qū)動修正。以YT8521為例看下驅(qū)動的修改。通過修改擴展寄存器(0xA001)可以修改相關(guān)配置。
以下是不帶操作系統(tǒng)的驅(qū)動相關(guān)部分:
/* utp=>rgmii */
? ? reg=XXXphy_read_ext(pGmac,PAGE0,?0xa001); ? ?/*?NOTE:?this function should not be called more than one for each chip. */
? ? reg &=(~7);;
? ??XXXphy_write_ext(pGmac,PAGE0,?0xa001, reg);
一般的可以直接用的驅(qū)動都是將其2:0位配置為0,配置為SGMII需要修改這部分。以下是Linux操作系統(tǒng)下的驅(qū)動相關(guān)部分:
of_property_read_string(of_node,?"phy-connection-type", &ctype);
? ??if(ctype && (strcmp(ctype,?"rgmii-id") ==?0))
? ? {
? ? ? ? val = ytphy_read_ext(phydev,?0xa001);
? ? ? ? netdev_info(phydev->attached_dev,?"%s , phy addr: %d, read reg 0xa001 = 0x%xn",
? ? ? ? ? ? __func__, phydev->mdio.addr,val);
? ? ? ? val &= (~7);
? ? ? ? ytphy_write_ext(phydev,?0xa001, val);
? ? }
? ??else
? ? {
#if (KERNEL_VERSION(4, 5, 0) > LINUX_VERSION_CODE)
? ? ? ? netdev_info(phydev->attached_dev,?"%s , phy addr: %d, phy-connection-type is invalidn",
? ? ? ? ? ? __func__, phydev->addr);
#else
? ? ? ? netdev_info(phydev->attached_dev,?"%s , phy addr: %d, phy-connection-type is invalidn",
? ? ? ? ? ? __func__, phydev->mdio.addr);
#endif
? ? }
它是找名字匹配rgmii-id的,不匹配則不修改。如果要自己修改,需要修改這部分。不使用其他特殊功能的話,修改上述部分,PHY就可以正常運行了。
閱讀全文