📄 macdebug.c
字号:
//**********************************************************************
//
// Filename: macdebug.c
//
// Description:
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Use of this source code is subject to the terms of the Cirrus end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to
// use this source code. For a copy of the EULA, please see the
// EULA.RTF on your install media.
//
// Copyright(c) Cirrus Logic Corporation 2005, All Rights Reserved
//
//**********************************************************************
#define MAC_SUCCESSFUL 0
#define MAC_FAILED 1
#define ReadByte( bOffset ) (*(volatile PBYTE const)(OpReg_BASE+bOffset))
#define WriteByte( bOffset, Value ) (*(volatile PBYTE const)(OpReg_BASE+bOffset) = Value)
#define ReadWord( wOffset ) (*(volatile PWORD const)(OpReg_BASE+wOffset))
#define WriteWord( wOffset, Value ) (*(volatile PWORD const)(OpReg_BASE+wOffset) = Value)
#define ReadDWord( dwOffset ) (*(volatile PDWORD const)(OpReg_BASE+dwOffset))
#define WriteDWord( dwOffset, Value ) (*(volatile PDWORD const)(OpReg_BASE+dwOffset) = Value)
static WORD CreateTxData(BYTE *pTxBuffStart, WORD FrameLen);
static DWORD Global_TxTotal=0;
static DWORD Global_TxOkCnt = 0;
static DWORD Global_TxNotOkCnt = 0;
static DWORD Global_RxTotalCnt = 0;
static DWORD Global_RxNotOkCnt = 0;
static BYTE UserTxBuff[1520];
static BYTE UserRxBuff[1520];
static DWORD Global_LoopCount = 0;
/***************************************************************************
* MacTest(int test_type, unsigned int loop_cnt, int Tx_frame_length )
* test_type:
* 1: Tx only, Half duplex, 10Mbps
* 2: Rx Only, Half duplex, 10Mbps
*
* loop_cnt: how many frames to be sent or/and received.
* 0: infinite;
*
* Tx_frame_length: the length of the Tx frame
* 0: random
*
****************************************************************************/
WORD MacTest( PCHIP pChip ,int test_type, unsigned int loop_cnt, int Tx_frame_length) {
WORD status;
BYTE *pTxBuffStart;
BYTE *pRxBuffStart;
WORD GotFrameLen;
int IsTxLenRand;
// DbgPrint("\nCS8950.dll MacTest() Begin\n");
pTxBuffStart=&UserTxBuff[0];
pRxBuffStart=&UserRxBuff[0];
IsTxLenRand = (Tx_frame_length == 0);
status=CreateTxData(pTxBuffStart, 1514);
while ( 1 )
{
Global_LoopCount++;
if (test_type == 1 ) //Tx
{
if (!IsTxLenRand) {
status=CS8950SendFrame(pChip, pTxBuffStart, (DWORD)Tx_frame_length);
} else {
Tx_frame_length = 60 + (rand() % 1455);
status=CS8950SendFrame(pTxBuffStart, (DWORD)Tx_frame_length);
}
if (status != MAC_SUCCESSFUL ) {
return MAC_FAILED;
}
}
/* if (test_type == 2) //Rx
{
status=CS8950GetFrame( pChip , pRxBuffStart, &GotFrameLen);
}
*/
if ((loop_cnt != 0 ) && (Global_LoopCount >= loop_cnt) ){
break;
}
} //end while
//DbgPrint("\nCS8950.dll Global_TxTotal=%d Global_TxOkCnt=%d \n",Global_TxTotal,Global_TxOkCnt) ;
return MAC_SUCCESSFUL;
}
/******************************************************************************
*
* CS8950SendFrame()
*
***********************************************************************/
BOOL CS8950SendFrame
( PCHIP pChip ,
BYTE *pbData,
DWORD dwLength
)
{
int status;
FRAG Frags[1];
Frags[0].pBuffer = pbData;
Frags[0].BuffLength = (USHORT)dwLength;
// __emit(0xEEEEEEEE);
status = VchipSend( pChip,
(DWORD)pbData,
(WORD)dwLength,
(WORD)1,
&Frags[0] );
Global_TxTotal++;
// status=ProcessTxStatusQueue( pChip );
return status;
}
/***************************************************************************
* CreateTxData(): Create a Tx data
***************************************************************************/
static WORD CreateTxData(BYTE *pTxBuffStart, WORD FrameLen) {
BYTE *pRoller;
WORD i; //prf
WORD loopCnt;
WORD *pVal;
WORD CS8950_MAC_ADDRESS_WordSwap[3]={0x2400, 0x1020, 0x3412};
WORD CS8950_BROADCAST_ADDRESS[3]={0xFFFF, 0xFFFF, 0xFFFF};
pRoller=pTxBuffStart;
/* copy the destination address to the frame */
memcpy(pRoller, (BYTE *)CS8950_BROADCAST_ADDRESS, 6);
pRoller +=6;
/* copy the source address to the frame */
memcpy(pRoller, (BYTE *)CS8950_MAC_ADDRESS_WordSwap, 6);
pRoller +=6;
loopCnt=(FrameLen-12)/2;
pVal=(WORD *)pRoller;
for (i=1; i<=loopCnt; i++) {
*pVal=rand();
pVal++;
}
return MAC_SUCCESSFUL;
}
/***************************************************************************
*
* DumpRegisters():
*
***************************************************************************/
void MacDebugDumpRegisters( PCHIP pChip ) {
volatile DWORD b32, b32b, *pb32;
volatile WORD b16;
volatile BYTE b8;
int i;
PCD pCD;
pCD = pChip->pData;
b32=ReadDWord( OpReg_RxCTL);
DbgPrint("RxCTL (0x0000): %08X \n", b32);
b8=ReadByte( OpReg_TxCTL);
DbgPrint("TxCTL (0x0004): %02X \n", b8);
b8=ReadByte( OpReg_TestCTL);
DbgPrint("TestCTL (0x0008): %02X \n", b8);
b16=ReadWord( OpReg_MIICmd);
DbgPrint("MIICmd (0x0010): %04X \n", b16);
b16=ReadWord( OpReg_MIIData);
DbgPrint("MIIData (0x0014): %04X \n", b16);
b8=ReadByte( OpReg_MIISts);
DbgPrint("MIISts (0x0018): %02X \n\n", b8);
b8=ReadByte( OpReg_SelfCTL);
DbgPrint("SelfCTL (0x0020): %02X \n", b8);
b32=ReadDWord( OpReg_IntEn);
DbgPrint("IntEn (0x0024): %08X \n", b32);
b32=ReadDWord( OpReg_IntStsP);
DbgPrint("IntStsPreserve (0x0028): %08X \n", b32);
b32=ReadDWord( OpReg_IntStsC);
DbgPrint("IntStsClear (0x002C): %08X \n\n", b32);
b32=ReadDWord( OpReg_GT);
DbgPrint("GeneralTimer (0x0040): %08X \n\n", b32);
b32=ReadDWord( OpReg_FCT);
DbgPrint("FlowCtlTimer (0x0044): %08X \n", b32);
b32=ReadDWord( OpReg_FCF);
DbgPrint("FlowCtlFormat (0x0048): %08X \n\n", b32);
b32=ReadDWord( OpReg_FERMask);
DbgPrint("FlowCtlFormat (0x0064): %08X \n", b32);
b16=ReadWord( OpReg_TxCollCnt);
DbgPrint("TxCollCnt (0x0070): %04X \n", b16);
b16=ReadWord( OpReg_RxMissCnt);
DbgPrint("RxMissCnt (0x0074): %04X \n", b16);
b16=ReadWord( OpReg_RxRuntCnt);
DbgPrint("RxRuntCnt (0x0078): %04X \n\n", b16);
b16=ReadWord( OpReg_BMCTL);
DbgPrint("BMCTL (0x0080): %04X \n", b16);
b8=ReadByte( OpReg_BMSts);
DbgPrint("BusMasterSts (0x0084): %02X \n\n", b8);
b32=ReadDWord( OpReg_RxBCA);
DbgPrint("RxBuffCurrAddr (0x0088): %08X \n", b32);
b32=ReadDWord( OpReg_TxBCA);
DbgPrint("TxBuffCurrAddr (0x008c): %08X \n\n", b32);
b32=ReadDWord( OpReg_RxDBA);
DbgPrint("RxDescQBaseAddr (0x0090): %08X \n", b32);
b16=ReadWord( OpReg_RxDBL);
DbgPrint("RxDescQBaseLen (0x0094): %04X \n", b16);
b16=ReadWord( OpReg_RxDCL);
DbgPrint("RxDescQCurrLen (0x0096): %04X \n", b16);
b32=ReadDWord( OpReg_RxDCA);
i= (b32 -(unsigned long)pCD->pRxDesc)/8;
DbgPrint("RxDescCurrAddr (0x0098): %08X index=%d\n", b32, i);
b32=ReadDWord( OpReg_RxDEQ);
DbgPrint("RxDescEnQ (0x009c): %08X \n\n", b32);
b32=ReadDWord( OpReg_RxSBA);
DbgPrint("RxStsBaseAddr (0x00a0): %08X \n",b32);
b16=ReadWord( OpReg_RxSBL);
DbgPrint("RxStsBaseLen (0x00a4): %04X \n", b16);
b16=ReadWord( OpReg_RxSCL);
DbgPrint("RxStsCurrLen (0x00a6): %04X \n", b16);
b32=ReadDWord( OpReg_RxSCA);
i= (b32 -(unsigned long)pCD->pRxStat)/8;
DbgPrint("RxStsCurrAddr (0x00a8): %08X index=%d\n", b32, i);
b32=ReadDWord( OpReg_RxSEQ);
DbgPrint("RxStsEnQ (0x00ac): %08X \n\n", b32);
b32=ReadDWord( OpReg_TxDBA);
DbgPrint("TxDescQBaseAddr (0x00b0): %08X \n", b32);
b16=ReadWord( OpReg_TxDBL);
DbgPrint("TxDescBaseLen (0x00b4): %04X \n", b16);
b16=ReadWord( OpReg_TxDCL);
DbgPrint("TxDescQCurrLen (0x00b6): %04X \n", b16);
b32=ReadDWord( OpReg_TxDCA);
i= (b32 -(unsigned long)pCD->pTxDesc)/8;
DbgPrint("TxDescCurrAddr (0x00b8): %08X index=%d\n", b32, i);
b32=ReadDWord( OpReg_TxDEQ);
DbgPrint("TxDescEnQ (0x00bc): %08X \n\n", b32);
b32=ReadDWord( OpReg_TxSBA);
DbgPrint("TxStsQBaseAddr (0x00c0): %08X \n", b32);
b16=ReadWord( OpReg_TxSBL);
DbgPrint("TxStsQBaseLen (0x00c4): %04X \n", b16);
b16=ReadWord( OpReg_TxSCL);
DbgPrint("TxStsQCurrLen (0x00c6): %04X \n", b16);
b32=ReadDWord( OpReg_TxSCA);
i= (b32 -(unsigned long)pCD->pTxStat)/4;
DbgPrint("TxStsCurrAddr (0x00c8): %08X index=%d \n\n", b32, i);
b32=ReadDWord( OpReg_RxBTH);
DbgPrint("RxBuffTH (0x00d0): %08X \n", b32);
b32=ReadDWord( OpReg_TxBTH);
DbgPrint("TxBuffTH (0x00d4): %08X \n", b32);
b32=ReadDWord( OpReg_RxSTH);
DbgPrint("RxStsTH (0x00d8): %08X \n", b32);
b32=ReadDWord( OpReg_TxSTH);
DbgPrint("TxStsTH (0x00dc): %08X \n", b32);
b32=ReadDWord( OpReg_RxDTH);
DbgPrint("RxDescTH (0x00e0): %08X \n", b32);
b32=ReadDWord( OpReg_TxDTH);
DbgPrint("TxDescTH (0x00e4): %08X \n\n", b32);
b32=ReadDWord( OpReg_MaxFL);
DbgPrint("MaxFrameLen (0x00e8): %08X \n", b32);
b32=ReadDWord( OpReg_RxHLen);
DbgPrint("RxHeaderLen (0x00ec): %08X \n", b32);
pb32=(unsigned long *)pCD->pRxDesc;
DbgPrint("\n\n******** Rx Descript Q address = %08X ***********\n", (unsigned long)pCD->pRxDesc);
for ( i=0; i<RXDESCCOUNT ;i++) {
b32=*pb32;
pb32++;
b32b=*pb32;
pb32++;
DbgPrint(" Index %d: DW1=%08X DW2=%08X\n", i, b32, b32b);
}
pb32=(unsigned long *)pCD->pRxStat;
DbgPrint("\n\n******** Rx Status Q address = %08X ***********\n", (unsigned long)pCD->pRxStat);
for ( i=0; i<RXSTATCOUNT ;i++) {
b32=*pb32;
pb32++;
b32b=*pb32;
pb32++;
DbgPrint(" Index %d: DW1=%08X DW2=%08X\n", i, b32, b32b);
}
pb32=(unsigned long *)pCD->pTxDesc;
DbgPrint("\n\n******** Tx Descript Q address = %08X ***********\n", (unsigned long)pCD->pTxDesc);
for ( i=0; i<TXDESCCOUNT ;i++) {
b32=*pb32;
pb32++;
b32b=*pb32;
pb32++;
DbgPrint(" Index %d: DW1=%08X DW2=%08X\n", i, b32, b32b);
}
pb32=(unsigned long *)pCD->pTxStat;
DbgPrint("\n\n******** Tx Status Q address = %08X ***********\n", (unsigned long)pCD->pTxStat);
for ( i=0; i<TXSTATCOUNT ;i++) {
b32=*pb32;
pb32++;
DbgPrint(" Index %d: %08X \n", i, b32);
}
#if 0
DbgPrint("\n\n************* FIFO Rx Data ****************\n");
for ( pb32=(unsigned long *)0x80011000L; pb32<(unsigned long *)0xb00113ffL;pb32++) {
b32=*pb32;
DbgPrint(" addr %08X: %08X \n", (unsigned long)pb32, b32);
}
DbgPrint("\n\n************* FIFO Tx Data ****************\n");
for ( pb32=(unsigned long *)0x80011400L; pb32<(unsigned long *)0xb00117ffL;pb32++) {
b32=*pb32;
DbgPrint(" addr %08X: %08X \n", (unsigned long)pb32, b32);
}
DbgPrint("\n\n************* FIFO Rx Status ****************\n");
for ( pb32=(unsigned long *)0x80011800L; pb32<(unsigned long *)0xb001183fL;pb32++) {
b32=*pb32;
DbgPrint(" addr %08X: %08X \n", (unsigned long)pb32, b32);
}
DbgPrint("\n\n************* FIFO Tx Status ****************\n");
for ( pb32=(unsigned long *)0x80011840L; pb32<(unsigned long *)0xb001187fL;pb32++) {
b32=*pb32;
DbgPrint(" addr %08X: %08X \n", (unsigned long)pb32, b32);
}
DbgPrint("\n\n************* FIFO Rx Descript ****************\n");
for ( pb32=(unsigned long *)0x80011880L; pb32<(unsigned long *)0xb00118bfL;pb32++) {
b32=*pb32;
DbgPrint(" addr %08X: %08X \n", (unsigned long)pb32, b32);
}
DbgPrint("\n\n************* FIFO Tx Descript ****************\n");
for ( pb32=(unsigned long *)0x800118c0L; pb32<(unsigned long *)0xb00118ffL;pb32++) {
b32=*pb32;
DbgPrint(" addr %08X: %08X \n", (unsigned long)pb32, b32);
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -