📄 mac_lib.c
字号:
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* source\mac_lib.c 1.0 */
/* */
/* DESCRIPTION */
/* */
/* DIAGNOSTIC CODE for S3C4510B0 */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* FUNCTIONS : MAC librarys */
/* */
/* DEPENDENCIES */
/* */
/* */
/* NAME: Nicolas Park */
/* The last Modification date: 18-April-2002 */
/* REMARKS: Created initial version 1.0 */
/* */
/* Copyright (C) 2002 AIJISYSTEM CO.,LTD */
/*************************************************************************/
#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 "i2c.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 ;
#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("\n[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 ;
// 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 ;
if (Size < 46) Size = 46 ;
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 & 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 ;
RxTime = tm0.tm_sec | (tm0.tm_min << 8) ;
if ( userframebuffer > (U32 *)userframelimitpt)
{
userframebuffer = (U32 *)userframebasept ;
#if DEBUG
Print("\n\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 = 100 ;
U32 FrameMisMatch = 0 ;
LoopCnt = Cnt ;
Print("\n\n --> MAC Loopback Test is Running (%d) ... ", Cnt * Cnt ) ;
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("\n\r MAC Loopback Test is Running (%d) ... ",\
LoopCnt * (Cnt-i) ) ;
result = 0 ;
}
else result = 1 ;
}
// PrintMemTestStatus((Cnt*Cnt-LoopCnt)%4) ;
}
Print("\n 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 ;
// Get Receive pointer
framebufferptr = (U32 *)UserFrameBufferPtr ;
// check the receive flag
while( !BdmaRxDoneFlagForLoopBackCheck ) ;
BdmaRxDoneFlagForLoopBackCheck = 0 ;
// preamble
*framebufferptr++ = 0 ; // Preamble Clear
// Sequence and time
*framebufferptr++ = 0 ;
// Status and Length
FrameLength = *framebufferptr & 0xFFFF ;
RxStatus = (*framebufferptr >> 16) & 0xFFFF ;
*framebufferptr++ = 0 ;
// get frame data pointer
pRxFrameData = (U8 *)framebufferptr ;
if (!bcomp(pTxFrameData,pRxFrameData,FrameLength)) {
Print("\n\r gCRxFDPtr:%x, gCTxFDPtr:%d", gCRxFDPtr,gCTxFDPtr) ;
Print("\n\r Status:%x, Length:%d", RxStatus,FrameLength) ;
PrintRxFrame(pTxFrameData, FrameLength) ;
pRxFDptr = (sFrameDescriptor *)LoopCheckRxFD ;
pRxFrameData = (U8 *)pRxFDptr->FrameDataPtr ;
PrintRxFrame(pRxFrameData, FrameLength) ;
while(1) ;
memset(pRxFrameData,0,FrameLength) ; // clear buffer
return 0 ; // compare error
}
else {
memset(pRxFrameData,0,FrameLength) ; // clear buffer
return 1 ; // compare ok !
}
}
/*
* Function : void MacInternalLoopBack(void)
* Description : MAC LoopBack Test
*/
void MacInternalLoopBack(void)
{
Print("\n\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\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("\n\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("\n\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
*/
void ReadErrReport(void)
{
Print("\n\n >>>>> Error Report <<<<< ") ;
Print("\n\n +- MAC Tx Err Count (Good:%d) -+ ",gsMacTxStatus.MacTxGood) ;
Print("\n\r ExColl: %d, Defered: %d, Paused: %d, Under : %d ", \
gsMacTxStatus.ExCollErr, gsMacTxStatus.TxDefferedErr, \
gsMacTxStatus.sPaused, gsMacTxStatus.UnderErr) ;
Print("\n\r Defer : %d, NoCarri: %d, SQE : %d, LatCol: %d ", \
gsMacTxStatus.DeferErr, gsMacTxStatus.NCarrErr, \
gsMacTxStatus.sSQE, gsMacTxStatus.LateCollErr) ;
Print("\n\r TxPar : %d, TxHalt : %d ", \
gsMacTxStatus.TxParErr, gsMacTxStatus.sTxHalted) ;
Print("\n\r +- MAC Rx Err Count -+ ") ;
Print("\n\r CtlRcd: %d, 10Stat : %d, Allign: %d, CRCErr: %d ", \
gsMacRxStatus.sCtlRecd, gsMacRxStatus.sRx10Stat, \
gsMacRxStatus.AllgnErr, gsMacRxStatus.sCRCErr ) ;
Print("\n\r OverFl: %d, LongErr: %d, RxPar : %d, RxHalt: %d ", \
gsMacRxStatus.OverflowErr, gsMacRxStatus.sLongErr, \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -