⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macinit.c

📁 ~{WwU_J9SC5D~}ucos~{T4Bk#,1`RkA4=S5wJT>y?IRT#,4x~}uart~{2bJT~}
💻 C
📖 第 1 页 / 共 3 页
字号:
		// 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 + -