我这里使用 xilinx 的 MAC 为例,其他的 GAMC 也是类似的配置方法。
该寄存器的字段解释:
【15 - 0】:写入的data
【22 - 18】:phy 的寄存器的地址
【27 - 23】:phy 的 ID
【29 - 28】:读或者写操作的选择
按照上面的规则配置好该寄存器,硬件会自动产生 MDIO 时序和 PHY 通讯。
#define MARVELL_PHY_ID_88E1512 0x01410dd1
#define MII_MARVELL_PHY_PAGE 22
#define GMII_PHYID1 2 /* PHY Idendifier Register 1 */
#define GMII_PHYID2 3 /* PHY Idendifier Register 2 */
#define PHY_ID1_SHIFT (16)
UINT uiAddr = 0;
UINT16 usValue;
UINT32 uiID;
// mv88e1512
pfuncPhyWrite(uiAddr, MII_MARVELL_PHY_PAGE, 0);//切换 phy 的 page 0
pfuncPhyRead(uiAddr, GMII_PHYID1, &usValue); // 读 ID
uiID = usValue << PHY_ID1_SHIFT;
pfuncPhyRead(uiAddr, GMII_PHYID2, &usValue);
uiID |= usValue;
uiID &= 0xFFFFFFFF;
#define MV88E6XXX_SMI_DATA 0x01
#define MV88E6XXX_SMI_CMD 0x00
#define MV88E6XXX_SMI_CMD_BUSY 0x8000
#define MV88E6XXX_SMI_CMD_MODE_22 0x1000
#define MV88E6XXX_SMI_CMD_OP_22_WRITE 0x0400
pfuncPhyWrite(phyid, MV88E6XXX_SMI_DATA, data);
pfuncPhyWrite(phyid,
MV88E6XXX_SMI_CMD,
MV88E6XXX_SMI_CMD_BUSY |
MV88E6XXX_SMI_CMD_MODE_22 |
MV88E6XXX_SMI_CMD_OP_22_WRITE |
(dev << 5) | reg);