88e1512和88e1510是一個系列的phy,采用marvell的通用phy驅(qū)動,驅(qū)動源碼路徑:\u-boot\drivers\net\phy\marvell.c
如上圖所示,ETH2的工作模式為RGMII TO SGMII,SGMII與交換芯片bcm5396相連。設備樹配置為RGMII模式,如下:
&gem0 {
status = "okay";
phy-mode = "rgmii-id";
phy-handle = <ðernet_phy0>;
ethernet_phy0: ethernet-phy@0 {
reg = <0>;
device_type = "ethernet-phy";
};
};
查看芯片手冊Page 18 – Register 20,配置工作模式為RGMII (System mode) to SGMII (Media mode)。
?? 讀寫88e1512寄存器,先將要操作的Page number寫入Register 22,再配置相應的寄存器。文章來源:http://www.zghlxwxcb.cn/news/detail-460436.html
?? 88e1512驅(qū)動配置步驟:文章來源地址http://www.zghlxwxcb.cn/news/detail-460436.html
- 配置工作模式為100,RGMII (System mode) to SGMII (Media mode)。
- 所有寄存器配置完成后,將Page Address配置為1,PHY切換至Fiber Page,否則MAC獲取的是PHY的Copper Page的link狀態(tài),無法獲取到Fiber Page的link狀態(tài)。
- 關閉自協(xié)商,強制link為千兆全雙工
static int m88e1518_config(struct phy_device *phydev) { u16 reg; int temp_addr; /* * As per Marvell Release Notes - Alaska 88E1510/88E1518/88E1512 * /88E1514 Rev A0, Errata Section 3.1 */ /* EEE initialization */ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00ff); phy_write(phydev, MDIO_DEVAD_NONE, 17, 0x214B); phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2144); phy_write(phydev, MDIO_DEVAD_NONE, 17, 0x0C28); phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2146); phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xB233); phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x214D); phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xCC0C); phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2159); phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); /* SGMII-to-Copper mode initialization */ if (phydev->interface == PHY_INTERFACE_MODE_SGMII || phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) { /* Select page 18 */ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 18); /* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */ if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, 0, 3, MIIM_88E151x_MODE_SGMII); } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) { /* In reg 20, write MODE[2:0] = 0x4 (RGMII to SGMII) */ m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, 0, 3, MII_88E151x_MODE_RGMII_TO_SGMII); } /* PHY reset is necessary after changing MODE[2:0] */ m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, MIIM_88E151x_RESET_OFFS, 1, 1); /* Reset page selection */ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0); udelay(100); } if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR); reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK); reg |= MIIM_88E1111_HWCFG_MODE_SGMII_NO_CLK; reg |= MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR, reg); } if (phy_interface_is_rgmii(phydev)) { phy_write(phydev, MDIO_DEVAD_NONE, MII_MARVELL_PHY_PAGE, 2); reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E151x_PHY_MSCR); reg &= ~MIIM_88E151x_RGMII_RXTX_DELAY; if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) reg |= MIIM_88E151x_RGMII_RXTX_DELAY; else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) reg |= MIIM_88E151x_RGMII_RX_DELAY; else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) reg |= MIIM_88E151x_RGMII_TX_DELAY; phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E151x_PHY_MSCR, reg); phy_write(phydev, MDIO_DEVAD_NONE, MII_MARVELL_PHY_PAGE, 0); } phy_write(phydev, MDIO_DEVAD_NONE, MII_MARVELL_PHY_PAGE, MII_MARVELL_FIBER_PAGE); phydev->autoneg = AUTONEG_DISABLE; phydev->speed = SPEED_1000; phydev->duplex = DUPLEX_FULL; puts("phy_interface_is_rgmii out!!!!!!!!\n"); /* soft reset */ phy_reset(phydev); genphy_config_aneg(phydev); //genphy_restart_aneg(phydev); return 0; }
到了這里,關于zynq平臺 Linux系統(tǒng) phy 88e1512驅(qū)動配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!