工具/软件:
您好 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。 期待您的答复。 非常感谢。

