工具/软件:
您好 TI
我们希望在需要第45条访问方法的项目中使用 bcm8984。
在 EnetApp_waitForPhyAlive 中、我们检测到 CPSW_MDIO_Alive_REG 为0x01、因此我们的 PHY 地址为0。
然后、我们尝试通过第45条函数 EnetExtPhyMdioDflt_readC45读取 phy 寄存器。 但得到了如下所示的故障日志
Mdio_readRegCompleteC45: failed to read PHY 0 C45 MMD 1 register 2: -1 Mdio_normal_ioctl_handler_ENET_MDIO_IOCTL_C45_ASYNC_READ_COMPLETE: failed to read PHY 0 C45 MMD 1 reg 2: -1 EnetMod_ioctl: cpsw3g.mdio: Failed to do IOCTL cmd 0x0100060e: -1 EnetPer_ioctl: cpsw3g: Failed to do IOCTL cmd 0x0100060e: -1 Enet_ioctl: cpsw3g: IOCTL 0x0100060e failed: -1
我们跟踪了日志、发现函数 MDIO_readRegCompleteC45中出现错误。
static int32_t Mdio_readRegCompleteC45(CSL_mdioHandle mdioRegs, uint32_t userCh, uint32_t mmd, uint32_t phyAddr, uint16_t reg, uint16_t *val) { uint32_t c45EnMask; int32_t status = CSL_EFAIL; bool accessRegBusy = true; c45EnMask = CSL_MDIO_getClause45EnableMask(mdioRegs); if (ENET_IS_BIT_SET(c45EnMask, phyAddr)) { /* Wait for register read transaction to complete */ if (CSL_MDIO_isPhyRegAccessComplete(mdioRegs, userCh)) { accessRegBusy = false; } if(accessRegBusy == false) { uint32_t regPhyAddr, regPhyRegNum; regPhyAddr = CSL_FEXT(mdioRegs->USER_GROUP[userCh].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_PHYADR); regPhyRegNum = CSL_FEXT(mdioRegs->USER_GROUP[userCh].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_REGADR); if ((regPhyAddr == phyAddr) && (regPhyRegNum == reg)) { status = CSL_MDIO_phyGetRegReadVal(mdioRegs, userCh, val); } if(status != CSL_PASS) { ENETTRACE_ERR_IF(status == CSL_ETIMEOUT, "C45 register read %u was not acknowledged by PHY %u: %d\n", reg, phyAddr, status); ENETTRACE_ERR_IF(status == CSL_EFAIL, "failed to read PHY %u C45 MMD %u register %u: %d\n", phyAddr, mmd, reg, status); } } } else { ENETTRACE_ERR("PHY %u is not configured for C45 access\n", phyAddr); status = ENET_EPERM; } return status; }
我们感到困惑的是, 此函数中的 regPhyRegNum 应该是 MMD,但为什么它与 reg value 进行比较? 在本例中、PHY 地址为0、MMD 为1 (PMA_PMD)、寄存器地址为0x02。 所以
我们的 SDK 版本为 mcu_plus_sdk_am243x_09_02_01_05。 期待您的答复。 非常感谢。