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ÐERNET_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 + -
显示快捷键?