📄 macinit.c
字号:
// CAM #18 : Pause Count Value
VPint(CAM_BaseAddr + 0x6c) = 0x88080001 ;
// Step 4. set to zero preceed CAM #18
// CAM #19 - #20 : Filled with Zero
VPint(CAM_BaseAddr + 0x70) = 0x12340000 ;
VPint(CAM_BaseAddr + 0x74) = 0x00000000 ;
VPint(CAM_BaseAddr + 0x78) = 0x00000000 ;
VPint(CAM_BaseAddr + 0x7c) = 0x00000000 ;
// Step 5. Enable CAM location
// CAM Enable
CAMEN = 0x1c0003 ;
// Step 6. Enable transmit control frame by
// set SendPause bit in MACTXCON
MACTXCON |= SdPause | TxEn ;
// Step 7. Wait control frame finished
while ( (BDMASTAT & S_BTxCCP) ) ;
}
} while ( (TransferPacket != 'Q') && (TransferPacket != 'q') ) ;
}
/*
* Function : MacDebugStatus
* Description : View MAC status, and other
*/
void MacDebugStatus(void)
{
sFrameDescriptor *pRxFDptr, *pTxFDptr ;
U32 *pFDPtr ;
pRxFDptr = (sFrameDescriptor *) gCRxFDPtr ;
pFDPtr = (U32 *)pRxFDptr ;
Print("\n\n\r $$ MAC Rx Frame : Good ( %d ), Error ( %d ) ",\
gsBdmaRxStatus.BdmaRxGood, gErrorPacketCnt);
Print("\r --------------------------------------") ;
Print("\r - Current Frame Descriptor Pointer : %08x", pFDPtr ) ;
Print("\r Frame Data Ptr : %08x", *pFDPtr++ ) ;
Print("\r Reserved Field : %08x", *pFDPtr++ ) ;
Print("\r Status and Frame Length : %08x", *pFDPtr++ ) ;
Print("\r Next Frame Descriptor : %08x", *pFDPtr ) ;
Print("\r --------------------------------------") ;
Print("\r - BDMARXPTR : %08x", BDMARXPTR ) ;
Print(" - BDMASTAT : %08x", BDMASTAT ) ;
Print("\r - BDMARXCON : %08x", BDMARXCON ) ;
Print(" - BDMARXLSZ : %08x", BDMARXLSZ ) ;
Print("\r - CAM Base : %08x", CAM_BASE ) ;
Print(" - BDMARXBUF : %08x", BDMARXBUF ) ;
Print("\r - MACCON : %08x", MACCON ) ;
Print(" - CAMCON : %08x", CAMCON ) ;
Print("\r - MACRXCON : %08x", MACRXCON ) ;
Print(" - MACRXSTAT : %08x", MACRXSTAT ) ;
Print("\r --------------------------------------") ;
pTxFDptr = (sFrameDescriptor *) gCTxFDPtr ;
pFDPtr = (U32 *)pTxFDptr ;
Print("\n\r $$ MAC Tx Frame : Good ( %d )",gsMacTxStatus.MacTxGood) ;
Print("\r --------------------------------------") ;
Print("\r - Current Frame Descriptor Pointer : %08x", pFDPtr ) ;
Print("\r Frame Data Ptr : %08x", *pFDPtr++ ) ;
Print("\r Reserved Field : %08x", *pFDPtr++ ) ;
Print("\r Status and Frame Length : %08x", *pFDPtr++ ) ;
Print("\r Next Frame Descriptor : %08x", *pFDPtr ) ;
Print("\r --------------------------------------") ;
Print("\r - BDMATXPTR : %08x", BDMATXPTR ) ;
Print(" - BDMATXCON : %08x", BDMATXCON ) ;
Print("\r - BDMATXBUF : %08x", BDMATXBUF ) ;
Print(" - MACTXCON : %08x", MACTXCON ) ;
Print("\r - MACTXSTAT : %08x", MACTXSTAT ) ;
Print("\r --------------------------------------") ;
Print("\r - EMISSCNT : %08x", EMISSCNT ) ;
Print(" - EPZCNT : %08x\n\r", EPZCNT ) ;
}
/*
* Function : BdmaRxForSingleIsr
* Description : BDMA Rx Interrupt Service Routine for Single Receive
*/
void BdmaRxForSingleIsr(void)
{
sFrameDescriptor *pRxFDptr ;
U32 RxStatus, FrameLength ;
U32 CRxPtr;
U32 sBdmaStat ;
U8 *pFrameData ;
#if KS32C5000_BUG_FETCH
U32 FstData,FstDataSave,*FstFrameData ;
#endif
// Step 1. Get current frame descriptor and status
CRxPtr = BDMARXPTR ;
sBdmaStat = BDMASTAT ;
// Step 2. Clear BDMA status register bit by write 1
BDMASTAT |= S_BRxRDF ;
gsBdmaRxStatus.BdmaRxCnt++ ;
do {
// Step 3. Check Null List Interrupt
if ( BDMASTAT & S_BRxNL ) {
BDMASTAT |= S_BRxNL ;
gsBdmaRxStatus.BRxNLErr++ ;
MacInitialize() ;
break ;
}
// Step 4. Get Rx Frame Descriptor
pRxFDptr = (sFrameDescriptor *)gCRxFDPtr ;
RxStatus = (pRxFDptr->StatusAndFrameLength >> 16) & 0xffff;
// Step 5. If Rx frame is good, then process received frame
if(RxStatus & RxGood) {
FrameLength = pRxFDptr->StatusAndFrameLength & 0xffff ;
pFrameData = (U8 *)pRxFDptr->FrameDataPtr ;
gsBdmaRxStatus.BdmaRxGood++ ;
if ( !(gsBdmaRxStatus.BdmaRxGood%10000) )
Print("<R%d>", gsBdmaRxStatus.BdmaRxGood) ;
#if KS32C5000_BUG_FETCH
FstFrameData = (U32 *)pRxFDptr->FrameDataPtr ;
FstDataSave = *FstFrameData ;
FstData = ( (FstDataSave<<24) & 0xFF000000 ) |\
( (FstDataSave<<8) & 0x00FF0000 ) |\
( (FstDataSave>>24) & 0x000000FF ) |\
( (FstDataSave>>8) & 0x0000FF00 ) ;
if (gPreviousStatusField == FstData)
pFrameData = pFrameData + 4 ;
#endif
// Step 6. Get received frame to memory buffer
Print("\n ->> %d'th Received Frame ",gsBdmaRxStatus.BdmaRxGood) ;
// PrintRxFrame(pFrameData,FrameLength) ;
} else {
// Step 7. If Rx frame has error, then process error frame
gErrorPacketCnt++ ;
// Save Error status
// Check each status, because, error can duplicated
if (RxStatus & OvMax) gsMacRxStatus.OvMaxSize++ ;
if (RxStatus & CtlRecd) gsMacRxStatus.sCtlRecd++ ;
if (RxStatus & Rx10Stat) gsMacRxStatus.sRx10Stat++ ;
if (RxStatus & AlignErr) gsMacRxStatus.AllgnErr++ ;
if (RxStatus & CRCErr) gsMacRxStatus.sCRCErr++ ;
if (RxStatus & Overflow) gsMacRxStatus.OverflowErr++ ;
if (RxStatus & LongErr) gsMacRxStatus.sLongErr++ ;
if (RxStatus & RxPar) gsMacRxStatus.RxParErr++ ;
if (RxStatus & RxHalted) gsMacRxStatus.sRxHalted++ ;
}
// Step 8. Change ownership to BDMA for next use
(pRxFDptr->FrameDataPtr) |= fOwnership_BDMA;
// Save Current Status and Frame Length field, and clear
#if KS32C5000_BUG_FETCH
gPreviousStatusField = pRxFDptr->StatusAndFrameLength ;
#endif
pRxFDptr->StatusAndFrameLength = (U32)0x0;
// Step 9. Get Next Frame Descriptor pointer to process
gCRxFDPtr = (U32)(pRxFDptr->NextFrameDescriptor) ;
} while (CRxPtr != gCRxFDPtr);
// Step 10. Check Notowner status
if ( sBdmaStat & S_BRxNO ) {
BDMASTAT |= S_BRxNO ;
gsBdmaRxStatus.BRxNOErr++ ;
ReadyMacRx() ;
}
}
#include "../lwip071/src/includes.h"
#include "../ucosii/source/includes.h"
extern OS_EVENT *g_MacMbox;
void BDMA_Rx_isr(void)
{
sFrameDescriptor *pRxFDptr ;
U32 RxStatus, FrameLength ;
U32 CRxPtr;
U32 sBdmaStat ;
U8 *pFrameData ;
#if KS32C5000_BUG_FETCH
U32 FstData,FstDataSave,*FstFrameData ;
#endif
struct pbuf *p, *q;
INT8S err;
// Step 1. Get current frame descriptor and status
CRxPtr = BDMARXPTR ;
gCRxFDPtr = CRxPtr;
sBdmaStat = BDMASTAT ;
// Step 2. Clear BDMA status register bit by write 1
BDMASTAT |= S_BRxRDF ;
gsBdmaRxStatus.BdmaRxCnt++ ;
do {
// Step 3. Check Null List Interrupt
if ( BDMASTAT & S_BRxNL ) {
BDMASTAT |= S_BRxNL ;
gsBdmaRxStatus.BRxNLErr++ ;
MacInitialize() ;
break ;
}else
// Step 4. Get Rx Frame Descriptor
pRxFDptr = (sFrameDescriptor *)gCRxFDPtr ;
RxStatus = (pRxFDptr->StatusAndFrameLength >> 16) & 0xffff;
// Step 5. If Rx frame is good, then process received frame
if((RxStatus & RxGood)&&!(RxStatus & OvMax)) {
FrameLength = pRxFDptr->StatusAndFrameLength & 0xffff ;
pFrameData = (U8 *)pRxFDptr->FrameDataPtr ;
gsBdmaRxStatus.BdmaRxGood++ ;
//if ( !(gsBdmaRxStatus.BdmaRxGood%10000) )
//Print("<R%d:%d>", tm0.tm_sec,gsBdmaRxStatus.BdmaRxGood) ;
//Print("<FrameLength %d :%d>\r", FrameLength, gsBdmaRxStatus.BdmaRxGood) ;
/*if((FrameLength==77)|(FrameLength==78)|(FrameLength==79)| \
(FrameLength==141)|(FrameLength==142)|(FrameLength==143)| \
(FrameLength==205)|(FrameLength==206)|(FrameLength==207)| \
(FrameLength==269)|(FrameLength==270)|(FrameLength==271))*/
//Print("<FrameLength %d :%d RxStat %x>\r", FrameLength, gsBdmaRxStatus.BdmaRxGood, RxStatus) ;
#if KS32C5000_BUG_FETCH
FstFrameData = (U32 *)pRxFDptr->FrameDataPtr ;
FstDataSave = *FstFrameData ;
FstData = ( (FstDataSave<<24) & 0xFF000000 ) |\
( (FstDataSave<<8) & 0x00FF0000 ) |\
( (FstDataSave>>24) & 0x000000FF ) |\
( (FstDataSave>>8) & 0x0000FF00 ) ;
if (gPreviousStatusField == FstData)
pFrameData = pFrameData + 4 ;
#endif
// Step 6. Get received frame to memory buffer
// GetRxFrameData(pFrameData, FrameLength, RxStatus) ;
p = pbuf_alloc(PBUF_RAW, FrameLength, PBUF_POOL);
if (p != NULL) {
for(q = p; q != NULL; q = q->next) {
memcpy(q->payload, pFrameData, q->len);
pFrameData += q->len;
}
err = OSQPost(g_MacMbox, p);
if(err != OS_NO_ERR)
pbuf_free(p);
}
} else {
//put_byte('q');
// Step 7. If Rx frame has error, then process error frame
gErrorPacketCnt++ ;
// Save Error status
// Check each status, because, error can duplicated
if (RxStatus & OvMax) {
gsMacRxStatus.OvMaxSize++ ;
//put_byte('M');
Print("\r\r OverSize error\r");
}
if (RxStatus & CtlRecd) gsMacRxStatus.sCtlRecd++ ;
if (RxStatus & Rx10Stat) gsMacRxStatus.sRx10Stat++ ;
if (RxStatus & AlignErr) gsMacRxStatus.AllgnErr++ ;
if (RxStatus & CRCErr) gsMacRxStatus.sCRCErr++ ;
if (RxStatus & Overflow) gsMacRxStatus.OverflowErr++ ;
if (RxStatus & LongErr) gsMacRxStatus.sLongErr++ ;
if (RxStatus & RxPar) gsMacRxStatus.RxParErr++ ;
if (RxStatus & RxHalted) gsMacRxStatus.sRxHalted++ ;
}
// Step 8. Change ownership to BDMA for next use
(pRxFDptr->FrameDataPtr) |= fOwnership_BDMA;
// Save Current Status and Frame Length field, and clear
#if KS32C5000_BUG_FETCH
gPreviousStatusField = pRxFDptr->StatusAndFrameLength ;
#endif
pRxFDptr->StatusAndFrameLength = (U32)0x0;
// Step 9. Get Next Frame Descriptor pointer to process
gCRxFDPtr = (U32)(pRxFDptr->NextFrameDescriptor) ;
} while (CRxPtr != gCRxFDPtr);
// Step 10. Check Notowner status
if ( sBdmaStat & S_BRxNO ) {
BDMASTAT |= S_BRxNO ;
gsBdmaRxStatus.BRxNOErr++ ;
ReadyMacRx() ;
}
}
int SendPacket(struct pbuf *p)
{
sFrameDescriptor *psTxFD;
U32 *pFrameDataPtr ;
U8 *pFrameData ;
// int FrameLength ;
struct pbuf *q;
// 1. Get Tx frame descriptor & data pointer
psTxFD = (sFrameDescriptor *)gWTxFDPtr ;
pFrameData = (U8 *)psTxFD->FrameDataPtr ;
pFrameDataPtr = (U32 *)&psTxFD->FrameDataPtr;
// FrameLength = Size + sizeof(etheader) ;
// 2. Check BDMA ownership
// if ( (*pFrameDataPtr & fOwnership_BDMA) ) return 0 ;
// 3. Prepare Tx Frame data to Frame buffer
for(q = p; q != NULL; q = q->next) {
// Send the data from the pbuf to the interface, one pbuf at a
// time. The size of the data in each pbuf is kept in the ->len
// variable.
memcpy ((U8 *)pFrameData,(U8 *)q->payload, q->len);
pFrameData += q->len;
}
// 4. Set TX Frame flag & Length Field
#ifdef LITTLE
psTxFD->Reserved = (PaddingMode | CRCMode | SourceAddrIncrement | \
LittleEndian | WidgetAlign00 | MACTxIntEn);
#else
psTxFD->Reserved = (PaddingMode | CRCMode | SourceAddrIncrement | \
BigEndian | WidgetAlign00 | MACTxIntEn);
#endif
psTxFD->StatusAndFrameLength = (U32)(p->tot_len/*FrameLength*/ & 0xffff);
// 5. Cheange ownership to BDMA
psTxFD->FrameDataPtr |= fOwnership_BDMA;
// 6. Enable MAC and BDMA Tx control register
MacTxGo();
// 7. Change the Tx frame descriptor for next use
gWTxFDPtr = (U32)(psTxFD->NextFrameDescriptor);
return 1 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -