www.pudn.com > hf44b0_TEST.rar > CACHE.C


#include  
#include "..\inc\44b.h" 
#include "..\inc\44blib.h" 
 
void MarchCMinus32(int address,int unit,unsigned int pattern); 
void MarchCMinusM_10(int address,int unit,unsigned int pattern,unsigned int mask); 
void _MarchSub1(unsigned int *pt,int unit,unsigned int pattern,int incdec); 
void _MarchSub1_10(unsigned int *pt,int unit,unsigned int pattern,int incdec,unsigned int mask); 
int marchError; 
 
void FlushCache(void)			    
{					    
    int i,saveSyscfg; 
     
    saveSyscfg=rSYSCFG; 
 
    rSYSCFG=SYSCFG_0KB; 		       
    for(i=0x10002000;i<0x10004800;i+=16)     
    {					    
		*((int *)i)=0x0;		    
    } 
				   
    rSYSCFG=saveSyscfg; 			     
}					    
 
int Test_Cache(void) 
{ 
    int saveSyscfg; 
    Uart_Printf("Cache(Internal RAM) Cell Test by March C-\n"); 
	 
    saveSyscfg=rSYSCFG; 
    marchError=0; 
 
    //00->01->11<->10 
 
    rSYSCFG=SYSCFG_0KB;  //WB_off,Cache_off,I_RAM 8KB,stall disable 
    //set0=0x10000000~0x100007ff	       
    //set1=0x10000800~0x10000fff	       
    //set2=0x10001000~0x100017ff	       
    //set3=0x10001800~0x10001fff	       
     
    MarchCMinus32(0x10000000,511,0x00000000);  
    MarchCMinus32(0x10000000,511,0x0f0f0f0f); 
    MarchCMinus32(0x10000000,511,0x33333333); 
    MarchCMinus32(0x10000000,511,0x55555555); 
    MarchCMinus32(0x10000000,511,0xaaaaaaaa); 
    Uart_Printf("Set0 is tested!\n"); 
 
    MarchCMinus32(0x10000800,511,0x00000000); 
    MarchCMinus32(0x10000800,511,0x0f0f0f0f); 
    MarchCMinus32(0x10000800,511,0x33333333); 
    MarchCMinus32(0x10000800,511,0x55555555); 
    MarchCMinus32(0x10000800,511,0xaaaaaaaa); 
    Uart_Printf("Set1 is tested!\n"); 
	 
    MarchCMinus32(0x10001000,511,0x00000000); 
    MarchCMinus32(0x10001000,511,0x0f0f0f0f); 
    MarchCMinus32(0x10001000,511,0x33333333); 
    MarchCMinus32(0x10001000,511,0x55555555); 
    MarchCMinus32(0x10001000,511,0xaaaaaaaa); 
    Uart_Printf("Set2 is tested!\n"); 
 
    MarchCMinus32(0x10001800,511,0x00000000); 
    MarchCMinus32(0x10001800,511,0x0f0f0f0f); 
    MarchCMinus32(0x10001800,511,0x33333333); 
    MarchCMinus32(0x10001800,511,0x55555555); 
    MarchCMinus32(0x10001800,511,0xaaaaaaaa); 
    Uart_Printf("Set3 is tested!\n"); 
	 
    MarchCMinusM_10(0x10002000,127,0x00000000,0x1ffff); 
    MarchCMinusM_10(0x10002000,127,0x0000ffff,0x1ffff); 
    MarchCMinusM_10(0x10002000,127,0x00ff00ff,0x1ffff); 
    MarchCMinusM_10(0x10002000,127,0x0f0f0f0f,0x1ffff); 
    MarchCMinusM_10(0x10002000,127,0x33333333,0x1ffff); 
    MarchCMinusM_10(0x10002000,127,0x55555555,0x1ffff); 
    Uart_Printf("TagRAM0 is tested!\n"); 
 
    MarchCMinusM_10(0x10002800,127,0x00000000,0x1ffff); 
    MarchCMinusM_10(0x10002800,127,0x0000ffff,0x1ffff); 
    MarchCMinusM_10(0x10002800,127,0x00ff00ff,0x1ffff); 
    MarchCMinusM_10(0x10002800,127,0x0f0f0f0f,0x1ffff); 
    MarchCMinusM_10(0x10002800,127,0x33333333,0x1ffff); 
    MarchCMinusM_10(0x10002800,127,0x55555555,0x1ffff); 
    Uart_Printf("TagRAM1 is tested!\n"); 
 
    MarchCMinusM_10(0x10003000,127,0x00000000,0x1ffff); 
    MarchCMinusM_10(0x10003000,127,0x0000ffff,0x1ffff); 
    MarchCMinusM_10(0x10003000,127,0x00ff00ff,0x1ffff); 
    MarchCMinusM_10(0x10003000,127,0x0f0f0f0f,0x1ffff); 
    MarchCMinusM_10(0x10003000,127,0x33333333,0x1ffff); 
    MarchCMinusM_10(0x10003000,127,0x55555555,0x1ffff); 
    Uart_Printf("TagRAM2 is tested!\n"); 
 
    MarchCMinusM_10(0x10003800,127,0x00000000,0x1ffff); 
    MarchCMinusM_10(0x10003800,127,0x0000ffff,0x1ffff); 
    MarchCMinusM_10(0x10003800,127,0x00ff00ff,0x1ffff); 
    MarchCMinusM_10(0x10003800,127,0x0f0f0f0f,0x1ffff); 
    MarchCMinusM_10(0x10003800,127,0x33333333,0x1ffff); 
    MarchCMinusM_10(0x10003800,127,0x55555555,0x1ffff); 
    Uart_Printf("TagRAM3 is tested!\n"); 
 
    MarchCMinusM_10(0x10004000,127,0x00000000,0xf);	    
    MarchCMinusM_10(0x10004000,127,0x0000ffff,0xf); 
    MarchCMinusM_10(0x10004000,127,0x00ff00ff,0xf); 
    MarchCMinusM_10(0x10004000,127,0x0f0f0f0f,0xf); 
    MarchCMinusM_10(0x10004000,127,0x33333333,0xf); 
    MarchCMinusM_10(0x10004000,127,0x55555555,0xf); 
    Uart_Printf("LRU is tested!\n");	     
 
    Uart_Printf("4KB internal SRAM test.\n"); 
 
    rSYSCFG=SYSCFG_4KB; 
    MarchCMinus32(0x10001000,511,0x00000000); 
    MarchCMinus32(0x10001000,511,0x0f0f0f0f); 
    MarchCMinus32(0x10001000,511,0x33333333); 
    MarchCMinus32(0x10001000,511,0x55555555); 
    MarchCMinus32(0x10001000,511,0xaaaaaaaa); 
    Uart_Printf("Set2 is tested at 4KB!\n"); 
 
    MarchCMinus32(0x10001800,511,0x00000000); 
    MarchCMinus32(0x10001800,511,0x0f0f0f0f); 
    MarchCMinus32(0x10001800,511,0x33333333); 
    MarchCMinus32(0x10001800,511,0x55555555); 
    MarchCMinus32(0x10001800,511,0xaaaaaaaa); 
    Uart_Printf("Set3 is tested at 4KB!\n"); 
 
    rSYSCFG=saveSyscfg;     //wr_on,Cache 8KB+I_RAM 0KB,stall disable. 
 
    //cache flush is needed.... 
 
    if(marchError==0) 
		return 1;  
	else  
		return 0; 
} 
 
void MarchCMinus32(int address,int unit,unsigned int pattern) 
{ 
    int i; 
    unsigned int *tempPt; 
     
    tempPt=(unsigned int *)address; 
     
    for(i=0;i<=unit;i++) 
    { 
	//Uart_Printf("P=%x",pattern); 
		*tempPt++=pattern; 
	//Uart_Printf("A=%x,P=%x\n",tempPt,*tempPt); 
    } 
     
    _MarchSub1((unsigned int *)address,unit,~pattern,1); 
    _MarchSub1((unsigned int *)address,unit,pattern,1); 
    _MarchSub1((unsigned int *)address+unit,unit,~pattern,-1); 
    _MarchSub1((unsigned int *)address+unit,unit,pattern,-1);  
     
    tempPt=(unsigned int *)address; 
    for(i=0;i<=unit;i++) 
    { 
	if(*tempPt!=pattern) 
	{ 
	    marchError=1; 
	    Uart_Printf("ERROR0:%x\n",tempPt); 
	} 
	tempPt++; 
    } 
    //Uart_Printf("RP=%x,RA=%x\n",*tempPt,tempPt); 
} 
 
void MarchCMinusM_10(int address,int unit,unsigned int pattern,unsigned int mask) 
{ 
    int i; 
    unsigned int *tempPt; 
     
    tempPt=(unsigned int *)address; 
     
    for(i=0;i<=unit;i++) 
    { 
	//Uart_Printf("P=%x",pattern); 
	//    *tempPt++=pattern; 
	//Uart_Printf("A=%x,P=%x\n",tempPt,*tempPt); 
	*tempPt=pattern; 
	tempPt+=0x4; 
    } 
     
    _MarchSub1_10((unsigned int *)address,unit,~pattern,4,mask); 
    _MarchSub1_10((unsigned int *)address,unit,pattern,4,mask); 
    _MarchSub1_10((unsigned int *)address+(unit*4),unit,~pattern,-4,mask); 
    _MarchSub1_10((unsigned int *)address+(unit*4),unit,pattern,-4,mask);  
     
    tempPt=(unsigned int *)address; 
    for(i=0;i<=unit;i++) 
    { 
     
	if( *tempPt!=(pattern&mask) ) 
	{ 
	    marchError=1; 
	    Uart_Printf("ERROR0:%x\n",tempPt); 
	} 
	tempPt+=0x4; 
    } 
    //Uart_Printf("RP=%x,RA=%x\n",*tempPt,tempPt); 
} 
 
void _MarchSub1(unsigned int *pt,int unit,unsigned int pattern,int incdec) 
{ 
    unsigned int i,rp; 
 
    for(i=0;i<=unit;i++) 
    { 
	rp=*pt; 
	//Uart_Printf("RP=%x",*pt); 
	*pt=pattern; 
	//Uart_Printf("j=%x,p=%x,pt=%x\n",rp,(~pattern),pt); 
	if(rp!=(~pattern)) 
	{ 
	    marchError=1; 
	    Uart_Printf("ERROR1:A=%x,RP=%x,WP=%x \n",pt,rp,(~pattern)); 
	} 
	pt+=incdec; 
    } 
} 
 
void _MarchSub1_10(unsigned int *pt,int unit,unsigned int pattern,int incdec,unsigned int mask) 
{ 
    unsigned int i,rp; 
    unsigned int *pt2=pt; 
     
    for(i=0;i<=unit;i++) 
    { 
	rp=*pt; 
	//Uart_Printf("RP=%x",*pt); 
	*pt=pattern; 
	//Uart_Printf("j=%x,p=%x,pt=%x\n",rp,(~pattern),pt); 
	 
	if( rp!=(mask&(~pattern)) ) 
	{ 
	    marchError=1; 
	    Uart_Printf("ERROR1:A=%x,RP=%x,WP=%x pt2=%x \n",pt,rp,(~pattern),pt2); 
	} 
	pt+=incdec; 
    } 
}