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

📄 ge_selftest.c

📁 程序是一个vxworks下对PMC公司3386千兆MAC芯片的驱动和配置
💻 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 + -