/*
you can acess three part of ez5 triplecards card.
1.256M falsh 
2.128M PSRAM
3.4M SRAM

address range:
0M--255M   		256M flash
246M-384M 		empty
384M-512M 		128M PSRAM 
falsh rom page size is 1Mbits
sram rom page size is 64K bits.
sample.txt is sample  code of acess falsh,PSRAM and sram:

SetShake set up vibration.
parameter data bit7=0 allow acess GBA
						 bit7=1 vibration allow
						 bit3=0 open vibration
						 bit3=1 close vibration;
						 bit0-bit2
						 =0x00 vibration level 1(low)
						 =0x01 vibration level 2(middle)
						 =0x02 vibration level 3(hight);
sample code 
		Enable_Arm7DS();
		switch(gl_bShake)
		{
			case 1:
				SetShake(0xF0);
				break;
			case 2:
				SetShake(0xF1);
				break;
			case 3:
				SetShake(0xF2);
				break;
		}
		*(vu16 *)0x8000000 = 0x00;//witre any value for vibration.
		*(vu16 *)0x8000000 = 0x02;		
						 

*/


  if(loadkeys & KEY_SELECT){ cwl();
  /*
    loadkeys&=~KEY_SELECT;
    u32 LastBR=NDSLite_Brightness;
    if(loadkeys & KEY_L){
      loadkeys&=~KEY_L;
      if(0<LastBR) LastBR--;
    }
    if(loadkeys & KEY_R){
      loadkeys&=~KEY_R;
      if(LastBR<3) LastBR++;
    }
    if(NDSLite_Brightness!=LastBR){
      NDSLite_Brightness=LastBR;
      NDSLite_SetBrightness(LastBR);
    }
   */
   // first check sarm
   videoSetModeSub_SetShowLog(true);
	 	 u8 *pSrc = NULL;
		u8 *pDes= NULL;
		u32 loop;
		u16 Value[]= {0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
				  0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
				  0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
				  0x40,0x41,0x42,0x43,0x45,0x46,0x47,0x48,
				 };
		u16 Value2[]={0x99,0x89,0x97,0x96,0x95,0x94,0x93,0x92,
				  0x89,0x79,0x69,0x59,0x49,0x39,0x29,0x19,
				  0x43,0x35,0x84,0x99,0x22,0x23,0x77,0x88,
				  0x87,0x81,0x86,0x76,0x65,0x54,0x43,0x21	
				 };
		int i;
		FAT_FILE *h=NULL;  
		_consolePrintf("\n\n\n");
		Enable_Arm7DS();
		OpenNorWrite();
		uint32 id = ReadNorFlashID();
		CloseNorWrite();
		_consolePrintf("Nor Flash  id=0x%x.\n",id);
		if(id!=0x227E2218)
		{
				_consolePrintf("Nor Flash  err\n",id);
				while(1);
		}
		
		pSrc = (u8*)safemalloc(LEN);
		if(pSrc==NULL)
		{
			_consolePrintf("can not alloc pSrc mem\n");
		}
		pDes= (u8*)safemalloc(LEN);
		if(pDes==NULL)
		{
			_consolePrintf("can not alloc pDes mem\n");
		}
		  _consolePrintf("********begin check..********\n\n");
		//flash test
		_consolePrintf("--1--begin falsh check..\n\n");	
		Enable_Arm7DS();
		OpenNorWrite();
		SetSerialMode();
		for(u32 kk=0;kk<0x40000;kk+=0x40000)
		{
			_consolePrintf("Erasing %x(%x)\n",kk,0x2000000);
			Block_Erase(kk);

		}
		//read check
		chip_reset();
		ReadNorFlash(pSrc,0,0x8000);
		for(loop=0;loop<0x8000;loop++)
		{
			if(pSrc[loop] !=0xFF)
			{
				_consolePrintf("2--Erase Err add=%x,Data]=%x",loop,pSrc[loop]);
				while(1);
			}
		}
		CloseNorWrite();
		SetARM9_REG_WaitCR();
  		FAT_InitFiles();
		FAT_CWD("/");
  		
		h=FAT_fopen("/0001.gba","r");
		if(h==NULL)
		  	_consolePrintf("can not open 0001.gba file\n");
  		else
  		{
		  	_consolePrintf("open file 0001.gba OK\n");
			for(u32 kk=0;kk<0x40000;kk+=LEN)
			{
		  		FAT_fread(pSrc,LEN,1,h);
				Enable_Arm7DS();
				OpenNorWrite();
				SetSerialMode();
				WriteNorFlash(kk,pSrc,LEN);
				ReadNorFlash(pDes,kk,0x8000);
				for(loop=0;loop<LEN;loop++)
				{
					if(pSrc[loop]!=pDes[loop])
					{
						_consolePrintf("write Err:Add=%x,S=%x,D=%x",loop,pSrc[loop],pDes[loop]);
						while(1);
					}
				}
				_consolePrintf("2--Des---%x %x %x %x\n",pDes[0],pDes[1],pDes[2],pDes[3]);
				CloseNorWrite();
				Enable_Arm9DS();
			}
		  	FAT_fclose(h);
  		}
		FAT_FreeFiles();
		_consolePrintf("--1--end  falsh check..\n\n");		
		  
		   _consolePrintf("2----begin sram check..\n");
		SetARM9_REG_WaitCR();
  		FAT_InitFiles();
		FAT_CWD("/");
		h=FAT_fopen("/0001.gba","r");		
		if(h==NULL)
		  	_consolePrintf("can not open 0001.gba file\n");
  		else
  		{
		  	//_consolePrintf("open file 0001.gba OK\n");
			for(u32 kk=0;kk<0x80000;kk+=LEN)
			{
	  			FAT_fread(pSrc,LEN,1,h);
				//_consolePrintf("---%x %x %x %x\n",pSrc[0],pSrc[1],pSrc[2],pSrc[3]);
				//write nor falsh
				Enable_Arm7DS();
				OpenNorWrite();
				SetRampage(kk/0x1000);
				WriteSram(0xA000000,pSrc,LEN);
				ReadSram(0xA000000,pDes,LEN);
				for(loop=0;loop<LEN;loop++)
				{
					if(pSrc[loop]!=pDes[loop])
					{
						_consolePrintf("write Err:Add=%x,S=%x,D=%x",loop,pSrc[loop],pDes[loop]);
						while(1);
					}
					CloseNorWrite();
					Enable_Arm9DS();
				}
				Enable_Arm9DS();
				//_consolePrintf("progress %x(%x)\n",kk,0x80000);
			}	
			FAT_fclose(h);
			  		}
		FAT_FreeFiles();
	     _consolePrintf("--2--end sram check..\n\n");	
	//2--begin psram check
	u16* pPSram=(u16*)_Ez5PsRAM;
	_consolePrintf("--3--begin psram check.\n");
	Enable_Arm7DS();
	CloseNorWrite();
	SetRompage(384);
	OpenNorWrite();
	for(loop=0;loop<0x10000;loop++)
	{
		pPSram[loop] = loop ;
	}
	for(loop=0;loop<0x10000;loop++)
	{
		if( pPSram[loop] !=loop)
		{
			_consolePrintf("--2 PSRAM data line check fail\n");	
			_consolePrintf("--2 add=%x,Src=%x,Des=%x\n",loop,loop,pPSram[loop]);			
			while(1);
		}
	}
	pPSram[0] = 0x5A;
	for(i=0;i<22;i++)
	{
		pPSram[1<<i] = Value[i];		
	}
	for(i=0;i<22;i++)
	{
		if(pPSram[1<<i] != Value[i])
		{

			_consolePrintf("--2 add=%x,Src=%x,Des=%x\n",1<<i,Value[i],pPSram[1<<i]);
			while(1);
		}
	}
	u32 off;
	for(i=0;i<22;i++)
	{
		pPSram[ (~(1<<i))&0x7FFFFF] = Value2[i];		
	}
	for(i=0;i<22;i++)
	{

		if(pPSram[ (~(1<<i))&0x7FFFFF] != Value2[i])
		{

			_consolePrintf("--2 i=%d,add=%x,Src=%x,Des=%x\n",i,~(1<<i)&0x7FFFFF,Value2[i],pPSram[(~(1<<i))&0x7FFFFF]);
			while(1);
		}
	}
	_consolePrintf("--3--end psram check..\n\n");	
	CloseNorWrite();
	if(pSrc)
	{
		free(pSrc);
		pSrc=NULL;
	}
	if(pDes)
	{
		free(pDes);
		pDes=NULL;

	}
	  _consolePrintf("********end check.,check OK********\n");
  }
  