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

📄 maclib.c

📁 这是三星评估板ws310(CPU为S3c4510B)用的Bootloader.开发环境是SDT。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************/
/*                                                                       */
/* FILE NAME                                      VERSION                */
/*                                                                       */
/*      maclib.c                   		 KS32C50100   : version 1.0 */
/*                                                                       */
/* COMPONENT                                                             */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*                                                                       */
/* AUTHOR                                                                */
/*                                                                       */
/*                                                                       */
/* DATA STRUCTURES                                                       */
/*                                                                       */
/*                                                                       */
/* FUNCTIONS                                                             */
/*                                                                       */
/*          Library For MAC Test Program                                 */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*                                                                       */
/*************************************************************************/
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "uart.h"
#include "pollio.h"
#include "timer.h"
#include "isr.h"
#include "iic.h"
#include "memory.h"
#include "mac.h"

// Global variables  used for MAC driver
extern volatile U32 gMacCon,gMacTxCon,gBdmaTxCon ;
extern volatile U32 gMacRxCon,gBdmaRxCon,gCamCon ;

extern volatile U32 gCTxFDPtr, gWTxFDPtr ;
extern volatile U32 gCRxFDPtr, gPreviousFdp ;
extern volatile U32 gCam0_Addr0, gCam0_Addr1 ;
extern volatile U8 MyMacSrcAddr[6] ;
extern volatile int WatchDogTime, gErrorPacketCnt ;
extern volatile int BdmaRxDoneFlagForLoopBackCheck ;
extern volatile int MacTxDoneFlagForLoopBackCheck ;

U32 LoopCheckRxFD ;

// Global variable structure for store status
extern pMACTxStatus gsMacTxStatus ;
extern pMACRxStatus gsMacRxStatus ;
extern pBDMATxStatus gsBdmaTxStatus ;
extern pBDMARxStatus gsBdmaRxStatus ;

extern TIME tm0 ;

// variable for capture frame
extern volatile U32 gCapture_Addr0 , gCapture_Addr1 ;


/* --------------------------------------------------------------------*/
/* Frame buffer definition for restore received buffer                 */
/* In this diagonostic code, use unused area for received frame buffer */
/* --------------------------------------------------------------------*/
#define RxFrameDataPreamble	0xCCCCCCCC	// Rx Frame Data Preamble 
#define userframebasept 	0x5100000
#define userframelimitpt 	0x52FF000
volatile U32 *userframebuffer = (U32 *)userframebasept ;


/*
 * Function : Eth_Multi_Transmit
 * Description : Transmit Multiple packet
 */
void Eth_Multi_Transmit(void)
{
	sMACFrame 	PktBuff ;
	int 		i ;
	//int		Size = 46 ; // Min size
	int		Size = 1500 ; // Max size

	// Set destination address
	for (i=0;i<6;i++) PktBuff.Header.DestinationAddr[i] = MyMacSrcAddr[i] ;
	// Set source address
	for (i=0;i<6;i++) PktBuff.Header.SourceAddr[i] = MyMacSrcAddr[i] ;
	// Set length or type fields
	PktBuff.Header.LengthOrType[1] = (U8)( Size & 0xFF ) ;
	PktBuff.Header.LengthOrType[0] = (U8)( (Size >> 8) & 0xFF ) ;
	// LLC data setup
	for (i=0;i<Size;i++) PktBuff.LLCData[i]  = (U8)(i & 0xFF) ;

	while(1) {
		if ( SendPacket((U8 *)&PktBuff,Size) ) {
			if ( !(gsMacTxStatus.MacTxGood%10000) ) 
				Print("[T%d:%d]", tm0.tm_sec, gsMacTxStatus.MacTxGood ) ;
		} 
	}
}

/*
 * Function : Random_Pkt_Transmit
 * Description : Transmit single ramdom packet size
 * Input : seed
 * Output : 1=> ok, 0=> fail
 */
int Random_Pkt_Transmit(int seed)
{
	sMACFrame 	PktBuff ;
	int 		i ;
	int		Size, Q ;
	static int lenval;

	// Set destination address
	for (i=0;i<6;i++) PktBuff.Header.DestinationAddr[i] = MyMacSrcAddr[i] ;
	// Set source address
	for (i=0;i<6;i++) PktBuff.Header.SourceAddr[i] = MyMacSrcAddr[i] ;

	// Set length or type fields
	Size = PatternGen(seed) & 0x7FF ;
	if (Size > 1500) Size = 1500 ;
	//Size = Size%1501 ;
	if (Size < 46) Size = 46 ;
	//Q = ((Size)/2);
	//Size = 2*Q +2 ; 

	//Size = lenval+46+0 ;  
	//lenval = lenval + 1 ;
	//if(lenval == 1450)lenval = 0;

	//Print("Size : %d ", Size+14);

	PktBuff.Header.LengthOrType[1] = (U8)( (Size+18) & 0xFF ) ;
	PktBuff.Header.LengthOrType[0] = (U8)( ((Size+18) >> 8) & 0xFF ) ;

	// LLC data setup
	for (i=0;i<Size;i++) PktBuff.LLCData[i]  = (U8)(i+1 & 0xFF) ;

	if ( SendPacket((U8 *)&PktBuff,Size) )  return 1 ;
	else return 0 ;
}


/*
 * Function : GetRxFrameData
 * Description : Move MAC Received Frame Data
 */
void GetRxFrameData(U8 *pFrameData, U32 FrameLength, U32 RxStatus)
{
	U32 RxTime ;

	/* Receoved Frame Data Store Format */
	/* +------------------+             */
	/* | Preamble         |             */
	/* | Sequence| Time   |             */
	/* | Status  | Length |             */
	/* | Rx Data          |             */
	/* +------------------+             */

	RxTime = tm0.tm_sec | (tm0.tm_min << 8) ;

	if ( userframebuffer > (U32 *)userframelimitpt) 
	{
		userframebuffer = (U32 *)userframebasept ;
#if DEBUG
		Print("\r*- Buffer Full -*\r") ;
#endif
	}

	*userframebuffer++ = RxFrameDataPreamble ; 
	*userframebuffer++ = (gsBdmaRxStatus.BdmaRxGood << 16) | RxTime ;
	*userframebuffer++ = (RxStatus << 16) | FrameLength  ; 

	// Move Rx Frame to User Area
	memcpy ((U8 *)userframebuffer,(U8 *)pFrameData,FrameLength);
	userframebuffer += (U32)(FrameLength/4 + 1) ;
}


/*
 * Function : InterruptLoopBackTest
 * Description : MAC Loopback Test main function, in Interrupt mode
 */
int InterruptLoopBackTest(void)
{	
	sFrameDescriptor	*psTxFD ;
	U8 			*pTxFrameData ;
	U32 			UserFrameBufferPtr ;
	U32 			result ;
	U32 			i, LoopCnt, Cnt = 60 ;
	U32 			FrameMisMatch = 0 ;

	LoopCnt = Cnt/10 ;
	Print("\n --> MAC Loopback Test is Running cjwcjw(%d) ...  ", Cnt*Cnt/10 ) ;
	while(LoopCnt--) {
		for (i=0; i<Cnt ;i++)
		{
			psTxFD = (sFrameDescriptor *)gWTxFDPtr ;
			pTxFrameData = (U8 *)psTxFD->FrameDataPtr ;

			LoopCheckRxFD = gCRxFDPtr ;
			UserFrameBufferPtr = (U32)userframebuffer ;
			if ( UserFrameBufferPtr > (U32)userframelimitpt) 
				UserFrameBufferPtr = (U32)userframebasept ;

			Random_Pkt_Transmit(i) ;

			// wait until Tx done
			while( !MacTxDoneFlagForLoopBackCheck ) ;

			MacTxDoneFlagForLoopBackCheck = 0 ;

			if (!CompareLoopBackData(pTxFrameData,UserFrameBufferPtr)) {
				FrameMisMatch++ ;
				Print("\r >>> MAC Loopback Test is Running cjwcjw (%d) ...  ",\
					LoopCnt * (Cnt-i) ) ;
				result = 0 ;
				//result = 1 ;
			}
			else 	 result = 1 ;
		}
		PrintMemTestStatus((Cnt*Cnt-LoopCnt)%4) ;
	}
	Print(" Ok !!! \r  ** Total Mismatch Frame is %d ",FrameMisMatch) ;

	return result ;
}


/*
 * Function : CompareLoopBackData
 * Description : Compare Tx Frame Data and Rx Frame Data
 * Input : pTxFrameData => Transmit frame buffer address
 *         UserFrameBufferPtr => Receive frame Descriptor address
 */
int CompareLoopBackData(U8 *pTxFrameData, U32 UserFrameBufferPtr)
{
	sFrameDescriptor *pRxFDptr ;
	U32 			RxStatus, FrameLength ;
	U32 			*framebufferptr ;
	U8 			*pRxFrameData ;
	U32			*tmptx, *tmprx ;

	// Get Receive pointer
	framebufferptr  = (U32 *)UserFrameBufferPtr ;

	// check the receive flag 
	 while( !BdmaRxDoneFlagForLoopBackCheck ) ;
//put_byte('r');
	BdmaRxDoneFlagForLoopBackCheck = 0 ;

	// preamble
	*framebufferptr++ = 0 ; // Preamble Clear

	// Sequence and time
	*framebufferptr++ = 0 ;

	// Status and Length
	FrameLength = *framebufferptr & 0xFFFF ;
	RxStatus = (*framebufferptr >> 16) & 0xFFFF ;
	*framebufferptr++ = 0 ;
	if (FrameLength > 1520)  {
		tmptx = (U32 *)gCTxFDPtr ; 
		tmprx = (U32 *)gCRxFDPtr ;
		Print("TxPtr %x, RxPtr %x", gCTxFDPtr, gCRxFDPtr);
     	MemDump(tmptx-48, tmptx+48);
     	MemDump(tmprx-48, tmprx+48);
	}


	// get frame data pointer
	pRxFrameData = (U8 *)framebufferptr ;
	

	if (!bcomp(pTxFrameData,pRxFrameData,FrameLength)) {
		
		Print("\r gCRxFDPtr:%x, gCTxFDPtr:%d, BTxPtr", gCRxFDPtr,gCTxFDPtr, BDMATXPTR) ;
		Print("\r Status:%x, Length:%d", RxStatus,FrameLength) ;
		if (FrameLength > 2000) FrameLength = 2000 ;

		pRxFDptr = (sFrameDescriptor *)LoopCheckRxFD ;
		pRxFrameData = (U8 *)pRxFDptr->FrameDataPtr ;
		PrintRxFrame(pRxFrameData, FrameLength) ;

		PrintRxFrame(pTxFrameData, FrameLength) ;
		//while(1) ;
		while((!get_byte())=='q');

     	MemDump((U32 *)(pRxFrameData-FrameLength), (U32 *)(pRxFrameData+FrameLength));

		memset(pRxFrameData,0,FrameLength) ; // clear buffer
		return 0 ; // compare error
	}
	else {
		/*Print("\r gCRxFDPtr:%x, gCTxFDPtr:%d", gCRxFDPtr,gCTxFDPtr) ;
		Print("\r Status:%x, Length:%d", RxStatus,FrameLength) ;
		PrintRxFrame(pTxFrameData, FrameLength) ;
		pRxFDptr = (sFrameDescriptor *)LoopCheckRxFD ;
		pRxFrameData = (U8 *)pRxFDptr->FrameDataPtr ;
		PrintRxFrame(pRxFrameData, FrameLength) ;*/
		memset(pRxFrameData,0,FrameLength) ; // clear buffer
		//Print("COMPARE OK");
		return 1 ; // compare ok !
	}
}


/*
 * Function : void MacInternalLoopBack(void)
 * Description : MAC LoopBack Test
 */
void MacInternalLoopBack(void)
{
	Print("\n >>> MAC Internal Loopback Test <<<") ;
	MACCON |= MACLoop ;  // set Loopback bit(4)
	InterruptLoopBackTest() ;
	MACCON &= ~MACLoop ; // Disable Loopback bit(4)
}


/*
 * Function : PollingLoopBackTest
 * Description : Send and Check Frame for Loopback Diagnostics (Polling)
 */
int PollingLoopBackTest(void)
{	
	sFrameDescriptor	*psTxFD ;
	U8 			*pTxFrameData ;
	U32 			UserFrameBufferPtr ;
	U32 			status, result ;

	Print("\n >>> MAC Internal Loopback Test by Polling mode <<<") ;

	Disable_Int(nMAC_TX_INT);
	Disable_Int(nBDMA_RX_INT);
	MACCON |= MACLoop ;  // set Loopback bit(4)

	psTxFD = (sFrameDescriptor *)gWTxFDPtr ;
	pTxFrameData = (U8 *)psTxFD->FrameDataPtr ;

	UserFrameBufferPtr = (U32)userframebuffer ;
	if ( UserFrameBufferPtr > (U32)userframelimitpt) 
		UserFrameBufferPtr = (U32)userframebasept ;

	// --- Transmit Frame Data ---
	Random_Pkt_Transmit(10) ;

	// Wait until MAC Tx Done, by check MAC Tx Status Register
	// Polling Transmit finished
	while(1) {
		status = MACTXSTAT;
		if (status & Comp) break; 
	}

	MAC_Tx_isr() ;
	Print("\r MAC Tx done") ;

	// --- Receive Frame Data ---
	// Wait until BDMA Rx Done, by check BDMA Status Register
	// Polling Received
	while(1) {
		status = BDMASTAT;
		BDMASTAT = status ; 		// Clear Status Register
		if(status & S_BRxRDF) break; 	// Check BDMA Rx Done
	}

	BDMA_Rx_isr() ;
	Print("\r MAC Rx done") ;

	if (!CompareLoopBackData(pTxFrameData,UserFrameBufferPtr)) {
		result = 0 ;
	}
	else 	 result = 1 ;

	MACCON &= ~MACLoop ; // Disable Loopback bit(4)
	Enable_Int(nMAC_TX_INT);
	Enable_Int(nBDMA_RX_INT);

	return result;
}

/*
 * Function : ReadErrReport
 * Description : Read Error Status and Time
 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -