123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613 |
- #include "dp83848.h"
- #define DP83848_MAX_DEV_ADDR ((uint32_t)31U)
- int32_t DP83848_RegisterBusIO(dp83848_Object_t *pObj, dp83848_IOCtx_t *ioctx)
- {
- if(!pObj || !ioctx->ReadReg || !ioctx->WriteReg || !ioctx->GetTick)
- {
- return DP83848_STATUS_ERROR;
- }
- pObj->IO.Init = ioctx->Init;
- pObj->IO.DeInit = ioctx->DeInit;
- pObj->IO.ReadReg = ioctx->ReadReg;
- pObj->IO.WriteReg = ioctx->WriteReg;
- pObj->IO.GetTick = ioctx->GetTick;
- return DP83848_STATUS_OK;
- }
- int32_t DP83848_Init(dp83848_Object_t *pObj)
- {
- uint32_t regvalue = 0, addr = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->Is_Initialized == 0)
- {
- if(pObj->IO.Init != 0)
- {
-
- pObj->IO.Init();
- }
-
- pObj->DevAddr = DP83848_MAX_DEV_ADDR + 1;
-
- for(addr = 0; addr <= DP83848_MAX_DEV_ADDR; addr ++)
- {
- if(pObj->IO.ReadReg(addr, DP83848_SMR, ®value) < 0)
- {
- status = DP83848_STATUS_READ_ERROR;
-
- continue;
- }
- if((regvalue & DP83848_SMR_PHY_ADDR) == addr)
- {
- pObj->DevAddr = addr;
- status = DP83848_STATUS_OK;
- break;
- }
- }
- if(pObj->DevAddr > DP83848_MAX_DEV_ADDR)
- {
- status = DP83848_STATUS_ADDRESS_ERROR;
- }
-
- if(status == DP83848_STATUS_OK)
- {
- pObj->Is_Initialized = 1;
- }
- }
- return status;
- }
- int32_t DP83848_DeInit(dp83848_Object_t *pObj)
- {
- if(pObj->Is_Initialized)
- {
- if(pObj->IO.DeInit != 0)
- {
- if(pObj->IO.DeInit() < 0)
- {
- return DP83848_STATUS_ERROR;
- }
- }
- pObj->Is_Initialized = 0;
- }
- return DP83848_STATUS_OK;
- }
- int32_t DP83848_DisablePowerDownMode(dp83848_Object_t *pObj)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) >= 0)
- {
- readval &= ~DP83848_BCR_POWER_DOWN;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_BCR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_EnablePowerDownMode(dp83848_Object_t *pObj)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) >= 0)
- {
- readval |= DP83848_BCR_POWER_DOWN;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_BCR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_StartAutoNego(dp83848_Object_t *pObj)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) >= 0)
- {
- readval |= DP83848_BCR_AUTONEGO_EN;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_BCR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_GetLinkState(dp83848_Object_t *pObj)
- {
- uint32_t readval = 0;
-
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BSR, &readval) < 0)
- {
- return DP83848_STATUS_READ_ERROR;
- }
-
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BSR, &readval) < 0)
- {
- return DP83848_STATUS_READ_ERROR;
- }
- if((readval & DP83848_BSR_LINK_STATUS) == 0)
- {
-
- return DP83848_STATUS_LINK_DOWN;
- }
-
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) < 0)
- {
- return DP83848_STATUS_READ_ERROR;
- }
- if((readval & DP83848_BCR_AUTONEGO_EN) != DP83848_BCR_AUTONEGO_EN)
- {
- if(((readval & DP83848_BCR_SPEED_SELECT) == DP83848_BCR_SPEED_SELECT) && ((readval & DP83848_BCR_DUPLEX_MODE) == DP83848_BCR_DUPLEX_MODE))
- {
- return DP83848_STATUS_100MBITS_FULLDUPLEX;
- }
- else if ((readval & DP83848_BCR_SPEED_SELECT) == DP83848_BCR_SPEED_SELECT)
- {
- return DP83848_STATUS_100MBITS_HALFDUPLEX;
- }
- else if ((readval & DP83848_BCR_DUPLEX_MODE) == DP83848_BCR_DUPLEX_MODE)
- {
- return DP83848_STATUS_10MBITS_FULLDUPLEX;
- }
- else
- {
- return DP83848_STATUS_10MBITS_HALFDUPLEX;
- }
- }
- else
- {
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_PHYSCSR, &readval) < 0)
- {
- return DP83848_STATUS_READ_ERROR;
- }
-
- if((readval & DP83848_PHYSCSR_AUTONEGO_DONE) == 0)
- {
- return DP83848_STATUS_AUTONEGO_NOTDONE;
- }
- if((readval & DP83848_PHYSCSR_HCDSPEEDMASK) == DP83848_PHYSCSR_100BTX_FD)
- {
- return DP83848_STATUS_100MBITS_FULLDUPLEX;
- }
- else if ((readval & DP83848_PHYSCSR_HCDSPEEDMASK) == DP83848_PHYSCSR_100BTX_HD)
- {
- return DP83848_STATUS_100MBITS_HALFDUPLEX;
- }
- else if ((readval & DP83848_PHYSCSR_HCDSPEEDMASK) == DP83848_PHYSCSR_10BT_FD)
- {
- return DP83848_STATUS_10MBITS_FULLDUPLEX;
- }
- else
- {
- return DP83848_STATUS_10MBITS_HALFDUPLEX;
- }
- }
- }
- int32_t DP83848_SetLinkState(dp83848_Object_t *pObj, uint32_t LinkState)
- {
- uint32_t bcrvalue = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &bcrvalue) >= 0)
- {
-
- bcrvalue &= ~(DP83848_BCR_AUTONEGO_EN | DP83848_BCR_SPEED_SELECT | DP83848_BCR_DUPLEX_MODE);
- if(LinkState == DP83848_STATUS_100MBITS_FULLDUPLEX)
- {
- bcrvalue |= (DP83848_BCR_SPEED_SELECT | DP83848_BCR_DUPLEX_MODE);
- }
- else if (LinkState == DP83848_STATUS_100MBITS_HALFDUPLEX)
- {
- bcrvalue |= DP83848_BCR_SPEED_SELECT;
- }
- else if (LinkState == DP83848_STATUS_10MBITS_FULLDUPLEX)
- {
- bcrvalue |= DP83848_BCR_DUPLEX_MODE;
- }
- else
- {
-
- status = DP83848_STATUS_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- if(status == DP83848_STATUS_OK)
- {
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_BCR, bcrvalue) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- return status;
- }
- int32_t DP83848_EnableLoopbackMode(dp83848_Object_t *pObj)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) >= 0)
- {
- readval |= DP83848_BCR_LOOPBACK;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_BCR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_DisableLoopbackMode(dp83848_Object_t *pObj)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_BCR, &readval) >= 0)
- {
- readval &= ~DP83848_BCR_LOOPBACK;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_BCR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_EnableIT(dp83848_Object_t *pObj, uint32_t Interrupt)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_IMR, &readval) >= 0)
- {
- readval |= Interrupt;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_IMR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_DisableIT(dp83848_Object_t *pObj, uint32_t Interrupt)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_IMR, &readval) >= 0)
- {
- readval &= ~Interrupt;
-
- if(pObj->IO.WriteReg(pObj->DevAddr, DP83848_IMR, readval) < 0)
- {
- status = DP83848_STATUS_WRITE_ERROR;
- }
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_ClearIT(dp83848_Object_t *pObj, uint32_t Interrupt)
- {
- uint32_t readval = 0;
- int32_t status = DP83848_STATUS_OK;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_ISFR, &readval) < 0)
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
- int32_t DP83848_GetITStatus(dp83848_Object_t *pObj, uint32_t Interrupt)
- {
- uint32_t readval = 0;
- int32_t status = 0;
- if(pObj->IO.ReadReg(pObj->DevAddr, DP83848_ISFR, &readval) >= 0)
- {
- status = ((readval & Interrupt) == Interrupt);
- }
- else
- {
- status = DP83848_STATUS_READ_ERROR;
- }
- return status;
- }
|