📄 maclib.c
字号:
/*************************************************************************/
/* */
/* 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 + -