1. 在BDdrv/*.c文件中编译target/config/mpc8377/vxbEtsecEnd.c
#include "vxbEtsecEnd.c"
STATUS myPhyRead ( VXB_DEVICE_ID pDev, char phyAddr,char regAddr )
{
UINT16 dataVal;
ETSEC_DRV_CTRL * pDrvCtrl;
STATUS rval = ERROR;
FUNCPTR miiRead;
int i;
pDrvCtrl = pDev->pDrvCtrl;
if (CSR_READ_4(pDev, ETSEC_ECNTRL) & ETSEC_ECNTRL_TBIM)
{
if (regAddr == MII_PHY_ID1_REG)
{
dataVal = TBI_ID1;
printf("dataVal is %#x\n", dataVal);
return (OK);
}
if (regAddr == MII_PHY_ID2_REG)
{
dataVal = TBI_ID2;
printf("dataVal is %#x\n", dataVal);
return (OK);
}
}
else
{
/* Avoid tripping over the TBI management port */
if (phyAddr == pDrvCtrl->etsecTbiAddr)
{
dataVal = 0xFFFF;
printf("dataVal is %#x\n", dataVal);
return (ERROR);
}
}
if (phyAddr != pDrvCtrl->etsecMiiPhyAddr && phyAddr < 0x20)
{
dataVal = 0xFFFF;
printf("dataVal is %#x\n", dataVal);
return (ERROR);
}
if (phyAddr > 0x1F)
phyAddr -= 32;
/*
* If we're not the management device (ETSEC0), then
* forward the read request.
*/
if (pDrvCtrl->etsecMiiDev != pDev && pDrvCtrl->etsecMiiPhyRead != NULL)
{
miiRead = pDrvCtrl->etsecMiiPhyRead;
phyAddr += 32;
miiRead (pDrvCtrl->etsecMiiDev, phyAddr, regAddr, &dataVal);
printf("dataVal is %#x\n", dataVal);
printf("hi\n");
return OK;
}
semTake (pDrvCtrl->etsecDevSem, WAIT_FOREVER);
CSR_WRITE_4(pDev, ETSEC_MIIMADD, regAddr | (phyAddr << 8));
CSR_WRITE_4(pDev, ETSEC_MIIMCOM, 0);
CSR_WRITE_4(pDev, ETSEC_MIIMCOM, ETSEC_MIIMCOM_READ);
for (i = 0; i < ETSEC_TIMEOUT; i++)
{
if ((CSR_READ_4(pDev, ETSEC_MIIMIND) &
(ETSEC_MIIMIND_BUSY|ETSEC_MIIMIND_NOT_VALID)) == 0)
break;
}
if (i == ETSEC_TIMEOUT)
dataVal = 0xFFFF;
else
{
dataVal = CSR_READ_4(pDev, ETSEC_MIIMSTAT) & 0xFFFF;
rval = OK;
}
semGive (pDrvCtrl->etsecDevSem);
printf("dataVal is %#x\n", dataVal);
return (rval);
}
2.如何调用
先通过vxBusShow,查看pDev的值
myPhyRead pDev,1,0
3.mac和phy的绑定
const struct hcfResource motEtsecHEnd0Resources[] = {
{ "regBase", HCF_RES_INT, { (void *)(CCSBAR + 0x24000) } },
{ "intr0", HCF_RES_INT, { (void *)INUM_TSEC1_TX} },
{ "intr0Level", HCF_RES_INT, { (void *)INUM_TSEC1_TX } },
{ "intr1", HCF_RES_INT, { (void *)INUM_TSEC1_RX } },
{ "intr1Level", HCF_RES_INT, { (void *)INUM_TSEC1_RX } },
{ "intr2", HCF_RES_INT, { (void *)INUM_TSEC1_ERR } },
{ "intr2Level", HCF_RES_INT, { (void *)INUM_TSEC1_ERR } },
{ "phyAddr", HCF_RES_INT, {(void *)0x7 }},
{ "miiIfName", HCF_RES_STRING, { (void *)"motetsec" } },
{ "miiIfUnit", HCF_RES_INT, { (void *)0 } }
};
#define etsecHEnd0Num NELEMENTS(motEtsecHEnd0Resources)
phyaddr的绑定到对应的phy器件上去
4.fiber和copper的区别
VXB_INST_PARAM_OVERRIDE sysInstParamTable[] =
{
{ "mv88E1x11Phy",1,"mode", VXB_PARAM_INT32, {(void*)MV_HWCFG_RGMII_TO_COPPER}}
}
mv88e1x11phy使用参数
r = vxbInstParamByNameGet (pDev, "mode", VXB_PARAM_INT32, &val);
5.phy调用mac的读写
miiBusRead ->miiRead
即通过子类的pDev转成父类的读写
6.当motetsec通过gpio接一个交换机芯片时,即
此时在vxworks下,我们就不能采用mdio管理交换机芯片了。
只需要通知cpu,交给cpu一个交换机芯片的phy id就可以了