📄 ge_selftest.c
字号:
/**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-
* GE_SelfTest.c - Ethernet 1000M code. .
*
* Copyright 2001-12 by GDT, Inc
*
* modification history
* --------------------
* 2001-12-14,yang xinyan created.
*
*/
#include <vxWorks.h>
#include <stdio.h>
#include <stdlib.h>
#include <lstlib.h>
#include <netbuflib.h>
#include <msgQlib.h>
#include <errno.h>
#include <errnolib.h>
#include <assert.h>
#include <string.h>
#include <sysLib.h>
#include "GE_SelfTest.h"
#include "GE_Init.h"
#include "GE_Utility.h"
#include "GE_Global.h"
#include "GE_GlobalP.h"
unsigned int GE_SELFTEST_DEBUG = 1;
static ULONG testPacket[20]={ 0x66666666,0x66661234,0x56789abc,0x08060001,
0x08000604,0x0001aabb,0x88886666,0x66666666,
0xFF123456,0x78CC1234,0x56780000,0x00000000,
0xFF123456,0x78CC1234,0x56780000,0x00000000,
0xFF123456,0x78CC1234,0x56780000,0x78CC1234};
static unsigned char testLength=80;
static ULONG testPacketBefore[100];
static ULONG testPacketAfter[100];
static ULONG testPacketBeforeLength;
static ULONG testPacketAfterLength;
/******************************************************************************************/
char GE_SelfTest(char selftestMode)
{
char selftestResult;
bcopy(((char*)testPacket+14),(char*)testPacketBefore,(testLength-16));
testPacketBeforeLength = testLength-16;
testPacketAfterLength = 0;
switch (selftestMode)
{
case SYS_LOOP:
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_SelfTest:Selftest mode --- SYS_LOOP\n");
if ( GE_TestSysLoop() == OK)
selftestResult = 0;
else
selftestResult = 1;
break;
case NO_LOOP:
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_SelfTest:Selftest mode --- NO_LOOP\n");
if ( GE_TestNoLoop() == OK)
selftestResult = 0;
else
selftestResult = 1;
break;
default:
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_SelfTest:Selftest mode invalid!\n");
selftestResult = 1;
break;
}
if (selftestResult == 0)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_SelfTest:selftest SUCCEED!\n");
}
else
{
if (selftestResult == 1)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_SelfTest:selftest FAILURE!\n");
}
}
return (selftestResult);
}
STATUS GE_TestNoLoop()
{
GE_FpgaInit();
if (GE_PM3386_NO_LOOP(0) != OK)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:config PM3386 to noLoop mode failed!\n");
return ERROR;
}
/*Write a test packet to FPGA_OUT */
if ( GE_TestWritePkt(0) == ERROR)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:writing packet to FPGA_OUT failed!\n");
return ERROR;
}
/*waiting for test packet going through hardware*/
taskDelay(1);
/*Read tested packet from FPGA_IN*/
if ( GE_TestReadPkt() == ERROR)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:reading packet from FPGA_IN failed!\n");
return ERROR;
}
if (GE_ComparePacket() == ERROR )
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:packets are difGErent\n");
return ERROR;
} /*not pass selftest*/
return OK; /*pass selftest*/
}
/*************************************************************************/
STATUS GE_TestSysLoop()
{
GE_FpgaInit();
if (GE_PM3386_SYS_LOOP(0) != OK)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:config PM3386 to sysLoop mode failed!\n");
return ERROR;
}
/*Write a test packet to FPGA_OUT */
if ( GE_TestWritePkt(0) == ERROR)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:writing packet to FPGA_OUT failed!\n");
return ERROR;
}
/*waiting for test packet going through hardware*/
taskDelay(1);
/*Read tested packet from FPGA_IN*/
if ( GE_TestReadPkt() == ERROR)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:reading packet from FPGA_IN failed!\n");
return ERROR;
}
if (GE_ComparePacket() == ERROR )
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_TestSysLoop:packets are difGErent\n");
return ERROR;
} /*not pass selftest*/
return OK; /*pass selftest*/
}
STATUS GE_PM3386_SYS_LOOP(char temp)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_PM3386_SYS_LOOP:config PM3386 SYS_LOOP!\n");
if(temp==0) /*L10b*/
{
PM3386Write(0x708,0xd055);
taskDelay(10);
PM3386Write(0x708,0x5055);
PM3386Write(0x718,0xd055);
taskDelay(10);
PM3386Write(0x718,0x5055);
PM3386Write(0x300,0x0200);
PM3386Write(0x400,0x0200);
PM3386Write(0x303,0x5000);
PM3386Write(0x403,0x5000);
PM3386Write(0x302,0x0133);
PM3386Write(0x402,0x0133);
PM3386Write(0x301,0x8000);
PM3386Write(0x401,0x8000);
PM3386Write(0x301,0x000);
PM3386Write(0x401,0x000);
PM3386Write(0x122,0x0008);
PM3386Write(0x142,0x0008);
PM3386Write(0x103,0x0003);
}
if(temp==1) /*L32b*/
{
PM3386Write(0x708,0xd055);
taskDelay(10);
PM3386Write(0x708,0x5055);
PM3386Write(0x718,0xd055);
taskDelay(10);
PM3386Write(0x718,0x5055);
PM3386Write(0x300,0x0100);
PM3386Write(0x400,0x0100);
PM3386Write(0x303,0x5000);
PM3386Write(0x403,0x5000);
PM3386Write(0x302,0x0133);
PM3386Write(0x402,0x0133);
PM3386Write(0x301,0x8000);
PM3386Write(0x401,0x8000);
PM3386Write(0x301,0x000);
PM3386Write(0x401,0x000);
PM3386Write(0x122,0x0008);
PM3386Write(0x142,0x0008);
PM3386Write(0x103,0x0003);
}
return OK;
}
STATUS GE_PM3386_NO_LOOP()
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_PM3386_SYS_LOOP:config PM3386 NO_LOOP!\n");
taskDelay(6);
PM3386Write(0x122,0x0008);
PM3386Write(0x142,0x0008);
PM3386Write(0x103,0x0003);
PM3386Write(0x310,0x05F6);
PM3386Write(0x410,0x05F6);
PM3386Write(0x336,0x05F6);
PM3386Write(0x436,0x05F6);
PM3386Write(0x302,0x1733);
PM3386Write(0x402,0x1733);
PM3386Write(0x301,0x8000);
PM3386Write(0x301,0x0000);
PM3386Write(0x401,0x8000);
PM3386Write(0x401,0x0000);
/*station address*/
PM3386Write(0x308,0x3412);
PM3386Write(0x309,0x7856);
PM3386Write(0x30A,0xbc9a);
PM3386Write(0x408,0x6666);
PM3386Write(0x409,0x6666);
PM3386Write(0x40A,0x6666);
/*DA */
PM3386Write(0x339,0x9abc);
PM3386Write(0x33A,0x5678);
PM3386Write(0x33B,0x1234);
PM3386Write(0x439,0x6666);
PM3386Write(0x43A,0x6666);
PM3386Write(0x43B,0x6666);
/*SA*/
PM3386Write(0x33C,0x9abc);
PM3386Write(0x33D,0x5678);
PM3386Write(0x33E,0x1234);
PM3386Write(0x43C,0x6666);
PM3386Write(0x43D,0x6666);
PM3386Write(0x43E,0x6666);
PM3386Write(0x359,0xFFFF);
PM3386Write(0x35A,0xFFFF);
PM3386Write(0x35B,0xFFFF);
PM3386Write(0x35C,0xFFFF);
PM3386Write(0x459,0xFFFF);
PM3386Write(0x45A,0xFFFF);
PM3386Write(0x45B,0xFFFF);
PM3386Write(0x45C,0xFFFF);
PM3386Write(0x35D,0x39);
PM3386Write(0x35F,0x01);
PM3386Write(0x360,0x01);
PM3386Write(0x45D,0x39);
PM3386Write(0x45F,0x01);
PM3386Write(0x460,0x01);
PM3386Write(0x303,0x5000);
PM3386Write(0x403,0x5000);
return OK;
}
STATUS GE_TestWritePkt(unsigned int unit)
{
int i;
ULONG errorTimes=0;
ULONG flag;
ULONG exPort;
ULONG padNum;
ULONG cData;
padNum = 2-testLength%4;
exPort=(ULONG)GE_swiport<<16;
cData=unit|exPort|(padNum<<8);
for(i=0;i<3;i++)
{
flag=outfpgaRead(0x2A);
if ((flag&0x80000000)!=0x80000000)
{
outfpgaWrite(0x10,0x0);
continue;
}
if((flag&0x80000000)==0x80000000)
{
break;
}
}
if(i==3)
{
return ERROR;
}
outfpgaWrite(0x18,0xE25C4B89);
outfpgaWrite(0x18,cData);
for(i = 0; i<( (testLength % 4 == 0)? testLength / 4 : (testLength / 4 + 1) ); i++)
{
outfpgaWrite(0x18,testPacket[i]);
}
outfpgaWrite(0x18,0x1DA3B476);
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_TestWritePkt:Write packet to FPGA_OUT successfully...\n");
return OK;
}
/*******************************************************************************************
* readPacketFromFpgain:receive test packet from FPGA_IN's FIFO
*/
STATUS GE_TestReadPkt()
{
ULONG InBuf[500];
ULONG flag;
unsigned short i,j;
unsigned char unit;
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_TestReadPkt:Read packet from FPGA_IN...\n");
for(i=0;i<3;i++)
{
taskLock();
flag=*(ULONG*)(0x13020014);
taskUnlock();
if ((flag&0x00000010)!=0x00000010)
{
continue;
}
if((flag&0x00000010)==0x00000010)
{
break;
}
}
if(i==3)
{
return ERROR;
}
for(j=0;j<500;j++)
{
taskLock();
InBuf[j]= *(ULONG*)0x1302000C;
taskUnlock();
if (InBuf[j]==0xE25C4B89)
{
break;
}
}
if(InBuf[j]==0xE25C4B89)
{
InBuf[0]=0xE25C4B89;
for(i=1;i<512;i++)
{
taskLock();
InBuf[i]= *(ULONG*)0x1302000C;
taskUnlock();
if( (InBuf[i-1]==0x1DA3B476)&&(InBuf[i]==0x1DA3B476) )
{
break;
}
}
if(i>500)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_ReadProtoFifo:Receive too long pkt!\n");
}
}
else
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_ReadProtoFifo:NO receive pkt head!\n");
}
unit=(unsigned char)((InBuf[1]&0x00FF0000)>>16);
testPacketAfterLength=(i-4)*4;
bcopy((char*)&InBuf[2],(char*) &testPacketAfter[0],testPacketAfterLength);
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_TestReadPkt:Read packet from FPGA_IN successfully...\n");
return (OK);
}
/*******************************************************************************************
* comparePacket:compare two packets,
* if equal then return OK.else return ERROR
*/
STATUS GE_ComparePacket()
{
char i;
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_ComparePacket:Compare packet...\n");
if (testPacketBeforeLength != testPacketAfterLength)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_ComparePacket:selftest--length failed!\n");
return (ERROR);
}
if ((memcmp(testPacketBefore,testPacketAfter,testPacketBeforeLength))!=0)
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_ALARM,"GE_ComparePacket:Selftest failed!\n");
return (ERROR);
}
else
{
if(GE_SELFTEST_DEBUG)
GE_printf(GE_EVENT,"GE_ComparePacket:Selftest success!\n");
return (OK);
}
return OK;
}
/* end of GE_SelfTest.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -