selfcheck.c

来自「大名鼎鼎的mpc8260的bsp源代码」· C语言 代码 · 共 593 行

C
593
字号


#include "SelfCheck.h"
#include "logLib.h"

/*#define DEBUG*/

#define FLASH_WRITE1(dev, addr, value) \
	(*((unsigned char*)(dev+addr)) = (value))

#define FLASH_READ1(dev, addr) \
	( *((unsigned char*)(dev+addr)))

pCheck_self_struct CheckSelfCreat(int parament)
{
	pCheck_self_struct cs = (pCheck_self_struct)malloc(sizeof(Check_self_struct));
	cs->delay = 0;
	cs->cs_flag = 0x0;
	cs->Sram_flag = 0x0;
	cs->U_flag = 0x0;
	cs->Flash_flag = 0;
	cs->FLASHDevID = 0;
	cs->FLASHVenID = 0;
	cs->Smc1Id = 0;
	cs->Smc2Id = 0;
	cs->wd = wdCreate();
	cs->Smc1Id = open(SMC_COMM,2,0);
	cs->SDRAMTestAdr = (unsigned int*)0x00000000;
	cs->SRAMTestAdr = (unsigned int*)0x40000000;
	cs->FpgaTestAdr = (unsigned char*)0x5100FFFF;
	cs->FlashTestAdr = (unsigned char*)0x30000000;
	cs->QSPANTestAdr = (unsigned int*)0x70000000;
	if(SDRAM_flag==0)
		cs->cs_flag |= SDRAM_CHECK_FLAG;
	if(SRAM_flag==0)
		cs->cs_flag |= SRAM_CHECK_FLAG;
	cs->Sram_flag |= SRAM_flag;
	return cs;

}


STATUS CheckSelfInfo(pCheck_self_struct cs,unsigned int *Buf,unsigned int Mode)
{
	if(Mode==DELAY_SET)
	{
		cs->delay = *Buf;
		if(wdStart(cs->wd,cs->delay,(FUNCPTR)led_light_Nms,0)==OK)
			return(OK);
		else
			return(ERROR);
	}
	else
	if(Mode==DELAY_GET)

		*Buf = cs->delay;

}

STATUS CheckSelfDistory(pCheck_self_struct cs)
{
	int	immrVal = vxImmrGet();
	*PADAT(immrVal) ^= 0x0100;
/*	wdDelete(cs->wd);*/
	close(cs->Smc1Id);
	/*close(cs->Smc2Id);*/
	free(cs);
	return OK;
}

void CheckSelfProcess(pCheck_self_struct cs)
{
	unsigned int i;
#ifdef DEBUG
	write(cs->Smc1Id,"CheckSelf......Start\n",24);
#endif


    if(Check_MPC860(cs)==OK)
	{
	/*检测板上的器件和主按键、触摸屏*/
		cs->cs_flag |= PPC860_CHECK_FLAG;
		
		if(Check_Fpga(cs)==OK)
		{
			cs->cs_flag |= FPGA_CHECK_FLAG;
			if(Check_Flash(cs)==OK)
				cs->cs_flag |= FLASH_CHECK_FLAG;

			if(Check_UInterFace(cs)==OK)
				cs->cs_flag |= U_CHECK_FLAG;
			#if 0
			if(Check_Codec(cs)==OK)
				cs->cs_flag |= CODEC_CHECK_FLAG;
                    #endif
		}
	
		cs->cs_flag |= COM1_CHECK_FLAG;
		
		if(Check_Qspan(cs)==OK)
		{
			cs->cs_flag |= QSPAN_CHECK_FLAG;
			if(Check_CT69K(cs)==OK)
				cs->cs_flag |= CT69K_CHECK_FLAG;
		}

		if(Check_ethernet(cs)==OK)
			cs->cs_flag |= ETHERNET_CHECK_FLAG;
		if(Check_KeyBoard(cs)==OK)
			cs->cs_flag |= KEYBOARD_CHECK_FLAG;

/*
		if(Check_Touch(cs) == OK)
			cs->cs_flag |= TOUCH_CHECK_FLAG;
*/
    	}
}

void CheckSelfDisplay(pCheck_self_struct cs)
		/*显示信息*/
{
	unsigned int Temp = 0;
	char buf[32];
	if((cs->cs_flag&PPC860_CHECK_FLAG)==PPC860_CHECK_FLAG)
	{
			write(cs->Smc1Id,"PPC860 Bootrom......OK\n",24);

		if((cs->cs_flag&SDRAM_CHECK_FLAG)==SDRAM_CHECK_FLAG)
			write(cs->Smc1Id,"SDRAM Test......OK\n",20);
		else
			write(cs->Smc1Id,"SDRAM Test......ERROR\n",23);
		
		if((cs->cs_flag&FPGA_CHECK_FLAG)==FPGA_CHECK_FLAG)
		{
			write(cs->Smc1Id,"FPGA Test......OK\n",19);
			write(cs->Smc1Id,"FPGA Version:",13);
			/*get the  FPGA version*/
			Temp = *(cs->FpgaTestAdr+0x00200000);
			memset(buf,0,32);
			sprintf(buf,"0x%x",Temp);
			write(cs->Smc1Id,buf,10);
			write(cs->Smc1Id,"\n",1);
		}
		else
			write(cs->Smc1Id,"FPGA Test......ERROR,Don't test the FLASH,U Interface\n",55);

		if((cs->cs_flag&FLASH_CHECK_FLAG)==
			FLASH_CHECK_FLAG)
		{
			write(cs->Smc1Id,"FLASH ID:",9);
			Temp = cs->FLASHVenID;
			memset(buf,0,32);
			sprintf(buf,"0x%x",Temp);
			write(cs->Smc1Id,buf,10);
			write(cs->Smc1Id,"\n",1);
			write(cs->Smc1Id,"FLASH1 Memory Test......OK, 8MB\n",33);
			write(cs->Smc1Id,"FLASH2 Memory Test......OK, 8MB\n",33);
		}
		else
		{
			if((cs->Flash_flag&FLASH1_CHECK_FLAG)==FLASH1_CHECK_FLAG)
				write(cs->Smc1Id,"FLASH1 Memory Test......ERROR\n",31);

			if((cs->Flash_flag&FLASH2_CHECK_FLAG)==FLASH2_CHECK_FLAG)
				write(cs->Smc1Id,"FLASH2 Memory Test......ERROR\n",31);
		}

		if((cs->cs_flag&SRAM_CHECK_FLAG)==SRAM_CHECK_FLAG)
		{
			write(cs->Smc1Id,"SRAM1 Memory Test......OK, 512KB\n",34);
			write(cs->Smc1Id,"SRAM2 Memory Test......OK, 512KB\n",34);
			write(cs->Smc1Id,"SRAM3 Memory Test......OK, 512KB\n",34);
			write(cs->Smc1Id,"SRAM4 Memory Test......OK, 512KB\n",34);
		}
		else
		{
			if((cs->Sram_flag&SRAM1_CHECK_FLAG)==SRAM1_CHECK_FLAG)
				write(cs->Smc1Id,"SRAM1 Memory Test......ERROR, 4MB\n",35);
			if((cs->Sram_flag&SRAM2_CHECK_FLAG)==SRAM2_CHECK_FLAG)
				write(cs->Smc1Id,"SRAM2 Memory Test......ERROR, 4MB\n",35);
			if((cs->Sram_flag&SRAM3_CHECK_FLAG)==SRAM3_CHECK_FLAG)
				write(cs->Smc1Id,"SRAM3 Memory Test......ERROR, 4MB\n",35);
			if((cs->Sram_flag&SRAM4_CHECK_FLAG)==SRAM4_CHECK_FLAG)
				write(cs->Smc1Id,"SRAM4 Memory Test......ERROR, 4MB\n",35);
		}
#if 0
		if((cs->cs_flag&ETHERNET_CHECK_FLAG)==ETHERNET_CHECK_FLAG)
		{
			write(cs->Smc1Id,"LAN: 10BaseT\n",14);
			write(cs->Smc1Id,"STATE: CONNECT\n",16);
		}
		else
		{
			write(cs->Smc1Id,"LAN: 10BaseT\n",14);
			write(cs->Smc1Id,"STATE: DISCONN\n",16);
		}
#endif
		if((cs->cs_flag&COM1_CHECK_FLAG)==COM1_CHECK_FLAG)
			write(cs->Smc1Id,"COM1 initialized......9600,N,8,1\n",34);

		if((cs->cs_flag&QSPAN_CHECK_FLAG)==QSPAN_CHECK_FLAG)
		{
			write(cs->Smc1Id,"PCI Test......OK\n",18);
			if((cs->cs_flag&CT69K_CHECK_FLAG)==CT69K_CHECK_FLAG)
				write(cs->Smc1Id,"CT69K Test......OK\n",20);
			else
				write(cs->Smc1Id,"CT69K Test......ERROR\n",23);
		}
		else
			write(cs->Smc1Id,"PCI Test......ERROR,Don't test CT69K\n",38);

		if((cs->cs_flag&FLASH_CHECK_FLAG)==FLASH_CHECK_FLAG)
		{
			if((cs->cs_flag&U_CHECK_FLAG)==U_CHECK_FLAG)
			{
				if((cs->U_flag&U1_STATUS_ACTIVE)==U1_STATUS_ACTIVE)
					write(cs->Smc1Id,"U1: Init OK, Test......OK, Active\n",35);
				else
					write(cs->Smc1Id,"U1: Init OK, Test......OK, Inactive\n",37);

				if((cs->U_flag&U2_STATUS_ACTIVE)==U2_STATUS_ACTIVE)
					write(cs->Smc1Id,"U2: Init OK, Test......OK, Active\n",35);
				else
					write(cs->Smc1Id,"U2: Init OK, Test......OK, Inactive\n",37);
			}
			else
			{
				if((cs->U_flag&U1_CHECK_FLAG)==U1_CHECK_FLAG)
					write(cs->Smc1Id,"U1: Init Test......ERROR\n",26);

				if((cs->U_flag&U2_CHECK_FLAG)==U2_CHECK_FLAG)
					write(cs->Smc1Id,"U2: Init Test......ERROR\n",26);
			}
                    #if 0
			if((cs->cs_flag&CODEC_CHECK_FLAG)==CODEC_CHECK_FLAG)
			{
				write(cs->Smc1Id,"Codec1: Test......OK\n",22);
				write(cs->Smc1Id,"Codec2: Test......OK\n",22);

			}
			else
			{
				if((cs->Codec_flag&CODEC1_CHECK_FLAG)==CODEC1_CHECK_FLAG)
					write(cs->Smc1Id,"Codec1: Test......ERROR\n",25);				
				if((cs->Codec_flag&CODEC2_CHECK_FLAG)==CODEC2_CHECK_FLAG)
					write(cs->Smc1Id,"Codec2: Test......ERROR\n",25);				
			}
                    #endif
		}

		if((cs->cs_flag&KEYBOARD_CHECK_FLAG)==KEYBOARD_CHECK_FLAG)
			write(cs->Smc1Id,"Main Key-Board: Test......OK\n",30);
		else
			write(cs->Smc1Id,"Main Key-Board: Test......ERROR\n",33);
#if 0
		if((cs->cs_flag&TOUCH_CHECK_FLAG)==TOUCH_CHECK_FLAG)
			write(cs->Smc1Id,"Touch: Test......OK\n",21);
		else
			write(cs->Smc1Id,"Touch: Test......ERROR\n",24);
#endif	
	}
}


STATUS Check_MPC860(pCheck_self_struct cs)
{
	unsigned int Delay_time;
#ifdef DEBUG
	write(cs->Smc1Id,"Check_MPC860......\n",21);
#endif
	/*判断灯闪烁的时间 = cs->delay / 60 s */
	if((cs->cs_flag&SDRAM_CHECK_FLAG) == SDRAM_CHECK_FLAG)
		cs->delay = 60;
	else
		cs->delay = 15;
	
	Delay_time = cs->delay;
#ifdef DEBUG
	write(cs->Smc1Id,"The delay is ",14);
	write(cs->Smc1Id,&Delay_time,2);
#endif	
	/*设定*/
	if (CheckSelfInfo(cs,&Delay_time,DELAY_SET)== OK)
		return OK;
	
	return ERROR;
}

void led_light_Nms()
{
   	static unsigned char cnt = 0;
   	unsigned char param;
    int	immrVal = vxImmrGet();
  	int  PData = *PADAT(immrVal); /**((unsigned int *)(immrVal + 0x0956));*/
	

   	
   	pCheck_self_struct cs = (pCheck_self_struct)pCheckSelf;
	Led_light();
	cnt ++;
	param = cs->delay==60 ?10 : 40;
#ifdef DEBUG
	logMsg("led_light_Nms: cnt=%d\n",cnt,2,3,4,5,6);
#endif
	if (cnt >= param)
	{
		cnt = 0;
		PData &= ~0x0100;
		*PADAT(immrVal) = PData;
		wdDelete(pCheckSelf->wd);
		return;
	}

	if(wdStart(cs->wd,cs->delay,( FUNCPTR )led_light_Nms,0)!= OK)
		wdDelete(cs->wd);


}

STATUS Check_Smc1(pCheck_self_struct cs)
{
/*	cs->cs_flag |= SMC1_CHECK_FLAG;*/
	return OK;
}
STATUS Check_ethernet(pCheck_self_struct cs)
{
      return ping("host",1,0);
      }	


STATUS Check_Fpga(pCheck_self_struct cs)
{
	int temp;
	unsigned char *Addr= (unsigned char *)0x5100FFFF;

	*(cs->FpgaTestAdr) = 0x85;
	if(*(cs->FpgaTestAdr)!= 0x85)
		return ERROR;

	*(cs->FpgaTestAdr) = 0x7a;
	if(*(cs->FpgaTestAdr)!= 0x7a)
		return ERROR;

	return OK;
}


STATUS Check_Flash(pCheck_self_struct cs)
{
	flash_dev_t *pdev1 = &flashDev[0];
	flash_dev_t *pdev2 = &flashDev[4];
	unsigned char VenID,DevID;
	
	/*读取厂商ID和设备ID*/
    FLASH_WRITE1(pdev1->base, 0, 0xf0);

	FLASH_WRITE1(pdev1->base, 0xaaa, 0xaa);
	FLASH_WRITE1(pdev1->base, 0x555, 0x55);
	FLASH_WRITE1(pdev1->base, 0xaaa, 0x90);

/*	taskDelay(5);*/

	VenID = FLASH_READ1(pdev1->base, 0);
	DevID = FLASH_READ1(pdev1->base, 0x2);
	if((VenID!=pdev1->vendorID)||(DevID!=pdev1->deviceID))
		cs->Flash_flag |= FLASH1_CHECK_FLAG;

	/*读取厂商ID和设备ID*/
        FLASH_WRITE1(pdev2->base, 0, 0xf0);

	FLASH_WRITE1(pdev2->base, 0xaaa, 0xaa);
	FLASH_WRITE1(pdev2->base, 0x555, 0x55);
	FLASH_WRITE1(pdev2->base, 0xaaa, 0x90);

	/*taskDelay(5);*/

	VenID = FLASH_READ1(pdev2->base, 0);
	DevID = FLASH_READ1(pdev2->base, 0x2);
	if((VenID!=pdev2->vendorID)||(DevID!=pdev2->deviceID))
		cs->Flash_flag |= FLASH2_CHECK_FLAG;


	if(cs->Flash_flag==0)
	{
		cs->FLASHDevID = FLASH_DEVICE_ID;
		cs->FLASHVenID = FLASH_VENDOR_ID;
		return OK;
	}
	return ERROR;
}

STATUS Check_Qspan(pCheck_self_struct cs)
{
	unsigned int adr = 0x40C;
	unsigned int Temp;
	if(((*(cs->QSPANTestAdr))!=0x086210E3)&&((*(cs->QSPANTestAdr))!=0))
		return ERROR;
/*
	*(cs->QSPANTestAdr+adr)= 0x63639c9c;
	
	Temp = *(cs->QSPANTestAdr+adr);
	if(*(cs->QSPANTestAdr+adr)!=0x63639c9c)
		return ERROR;
*/
	return OK;
}

STATUS Check_CT69K(pCheck_self_struct cs)
{
	unsigned int RegValue = 
		qspanPciConfigurationRead(cs->QSPANTestAdr,0,0,0,0,0);

	if(RegValue != 0xc0102c)
		return ERROR;

	return OK;
}

STATUS Check_KeyBoard(pCheck_self_struct cs)
{
#if 1
	unsigned char tp[2]={0x0,0x0};
	if (I2CKBRead(0x6e,tp,2)!=-1)
		return OK;
	else		
	    return ERROR;
#endif
}

STATUS Check_Touch(pCheck_self_struct cs)
{
	cs->Smc2Id = open ("/tyCo/1",2,0);
	intConnect(IV_SMC2_PIP,(VOIDFUNCPTR)mySMC2InitRountine,(int)cs);
	write(cs->Smc2Id,"5",1);
}

void mySMC2InitRountine(int cs)
{
	unsigned int temp = 0;
	pCheck_self_struct pCs = (pCheck_self_struct)cs;

	if(read(pCs->Smc2Id,temp,1)!=0x51)
		pCs->cs_flag |= TOUCH_CHECK_FLAG;

	close(pCs->Smc2Id);
}

STATUS Check_UInterFace(pCheck_self_struct cs)
{
    HW_NT_Initial(0);
    HW_NT_Initial(1);

#if 1
    if(0x77 != scp_read_br(0,0x70))
        cs->U_flag |= U1_CHECK_FLAG;
    if(0x77 != scp_read_br(1,0x70))
        cs->U_flag |= U2_CHECK_FLAG;

    if(cs->U_flag==0)
        return OK;
    else
        return ERROR;
		
#endif		
}

#if 0
STATUS Check_Codec(pCheck_self_struct cs)
{

#if 1
    int ix = 3;
   int iy =0;
   int iz = 0;
   #if 1
    reset_chips();
    I2CInit();
   for(iy =0;iy<500;iy++)
   iz = iy*iy*iy+iy*iy+iy+1;
   for(iy =0;iy<500;iy++)
   iz = iy*iy*iy+iy*iy+iy+1;
   HW_Audio_Initial();
   for(iy =0;iy<500;iy++)
   iz = iy*iy*iy+iy*iy+iy+1;
   for(iy =0;iy<500;iy++)
   iz = iy*iy*iy+iy*iy+iy+1;
   #endif

	while(0x69 != readreg(0,1,1))
	{
		for(iy =0;iy<500;iy++)
 		  iz = iy*iy*iy+iy*iy+iy+1;
		ix --;
		if (ix == 0)
			break;
		
      }
	if(ix == 0)
	{
	    cs->Codec_flag |= CODEC1_CHECK_FLAG;
		return ERROR;
	}


	ix =3;
	while(0x69 != readreg(2,1,1))
	{
		for(iy =0;iy<500;iy++)
 		  iz = iy*iy*iy+iy*iy+iy+1;
		ix --;
		if (ix == 0)
			break;
		
      }

	if(ix == 0)
	{
	    cs->Codec_flag |= CODEC2_CHECK_FLAG;
		return ERROR;
	}
	
	return OK;
#endif	
}
#endif
void dispalyHarrisLogo(pCheck_self_struct cs)
{
 #if 0
unsigned char i;
unsigned char harris[12][82]={

{"          HH       HH   AAA           RRRRRR        RRRRRR        II   SSSSS \n"},
{"         HH       HH   AAAA          RR    RR      RR    RR      II  SS    SS\n"},
{"        HH       HH   AA AA         RR     RR     RR     RR     II  SS       \n"},
{"       HH       HH   AA  AA        RR     RR     RR     RR     II   SS       \n"},
{"      HH       HH   AA   AA       RR    RRR     RR    RRR     II    SSS      \n"},
{"     HHHHHHHHHHH   AAAAAAAA      RR   RR       RR   RR       II       SS     \n"},
{"    HH       HH   AA     AA     RR  RR        RR  RR        II         SS    \n"},
{"   HH       HH   AA      AA    RR   RR       RR   RR       II           SS   \n"},
{"  HH       HH   AA       AA   RR     RR     RR     RR     II            SS   \n"},
{" HH       HH   AA        AA  RR       RR   RR       RR   II     SS     SS    \n"},
{"HH       HH   AA         AA RR         RR RR         RR II       SSSSSS      \n"},
{"H   a   r   r   i   s 													   \n"}
 };
	write(cs->Smc1Id,"\n",1);
for(i=0;i<12;i++)
	write(cs->Smc1Id,&harris[i][0],82);
	write(cs->Smc1Id,"\n",1);
 #endif
}


void Led_light()
{
  	int	immrVal = vxImmrGet();
  	int  PData = *PADAT(immrVal); /**((unsigned int *)(immrVal + 0x0956));*/
	unsigned int  PDir = *PADIR(immrVal);
	PDir |= 0x0100;
	*PADIR(immrVal) = PDir;
	
  	if((PData&0x0100)==0)
		PData |= 0x0100;
	else
		PData ^= 0x0100;
	*PADAT(immrVal) = PData;
}


























⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?