?? flash.c
字號:
#include "math.h"
#define FLASH_BASE 0x00000000
#define BOOTLEN 0x8000
#define FLASH_555 (*(volatile unsigned long *)(0x1554 + FLASH_BASE))
#define FLASH_2AA (*(volatile unsigned long *)(0x0AA8 + FLASH_BASE))
#define FLASH_BASEP (*(volatile unsigned long *)(FLASH_BASE))
#define FLASH_MANU (*(volatile unsigned long *)(0x0000 + FLASH_BASE))
#define FLASH_CODE (*(volatile unsigned long *)(0x0004 + FLASH_BASE))
void erase_sector(unsigned long addr);
int memtest();
int flashtest();
void program_sector(unsigned long *dst, unsigned long *src, unsigned long len);
void InitFlash();
int Data_polling(unsigned long *addr, unsigned long *data);
//extern unsigned long code[];
const unsigned long topSize[] = {
0x0,
0x10000,
0x20000
};
const unsigned long bottomSize[] = {
0x0,
0x4000,
0x6000,
0x8000,
0x10000,
0x20000
};
int CMAIN()
{
int i = 0;
int t = 0;
int mflag,fflag;
init_serial();
mflag=memtest();
fflag=flashtest();
if(mflag||fflag)
{
puts("\n\nTest Error\n");
while(1);
}
puts("\n\nTest Ok\n");
while(1);
}
//function: Memory test
int memtest()
{
unsigned char s[10];
unsigned long counter;
unsigned long getdata;
unsigned long dbuffer1;
unsigned long dbuffer2;
unsigned long testdata=0;
volatile unsigned long *p= (unsigned long *)0xc0000000;
puts("\n\nMemtest Start\n");
puts("Mem Write and Read Data\n");
for(counter=0;counter<=0x3fffff;counter++) //write data to memory
{
*p=testdata;
getdata=*p;
if(getdata!=testdata)
{
puts("\nMemtest Error!\n");
sprintf(s,"x%x",p);
puts("\nVerify Error The Error Address=");
puts(s);
sprintf(s,"x%x",testdata);
puts("\nThe Correct Data =");
puts(s);
sprintf(s,"x%x",getdata);
puts("\nThe Read Data =");
puts(s);
dbuffer1=getdata&0x0000ffff;
dbuffer2=testdata&0x0000ffff;
if(dbuffer1!=dbuffer2)
{
puts("\nThe Error Chip is U3\n");
}
dbuffer1=getdata&0xffff0000;
dbuffer2=testdata&0xffff0000;
if(dbuffer1!=dbuffer2)
{
puts("\nThe Error Chip is U4\n");
}
return(1);
}
p=p+1;
testdata=testdata+0x00010001;
if((fmod(counter,0xfff))==0)
{
uart_putc('.');
}
}
puts("\nMemtest Ok\n"); //data verify correct
return(0);
}
//flash test code
int flashtest()
{
unsigned char s[10]; //printf buffer
unsigned long dbuffer1;
unsigned long dbuffer2;
unsigned long dataq;
unsigned long testdata;
unsigned long getdata;
unsigned int counter;
volatile unsigned long delayi;
volatile unsigned long *P=(unsigned long*)0x00;
*P=0x00f000f0;
puts("\n\nFlash Test Star \n");
puts("Flash Begin Erase\n"); //erase flash
FLASH_555 = 0x00aa00aa;
FLASH_2AA = 0x00550055;
FLASH_555 = 0x00800080;
FLASH_555 = 0x00aa00aa;
FLASH_2AA = 0x00550055;
FLASH_555 = 0x00100010;
for (;;)
{
dataq =*P;
dataq =dataq&0x00800080;
if(dataq) //polling DQ7
{
break; //if DQ7=1 quit
}
}
puts("Flash Erase over\n");
puts("Wait for 15s\n");
P=(unsigned long*)0x00; //Reset flash
for(delayi=0;delayi<=10000000;delayi++)
{;}
//program flash
puts("Flash Program Test\n");
testdata = 0;
for(counter=0;counter<=0xfffff;counter++)
{
FLASH_555 = 0x00aa00aa;
FLASH_2AA = 0x00550055;
FLASH_555 = 0x00a000a0;
*P=testdata;
for(;;) //Wait for data write
{
getdata=*P;
if((getdata&(0x00800080))==(testdata&(0x00800080))) //polling DQ7
break; //write ok
if((getdata&(0x00200020))==0x00200020) //polling DQ5
{
getdata=*P;
if((getdata&(0x00800080))==(testdata&(0x00800080)))
break; //write ok
else
{
puts("\nFlash Write Fail\n");
puts("\nThe Fail Address=");
sprintf(s,"x%x",P);
puts(s);
return(1); //Write fail
}
}
}
getdata=*P;
if(getdata!=testdata)
{
sprintf(s,"x%x",P);
puts("\nVerify Error The Error Address=");
puts(s);
sprintf(s,"x%x",testdata);
puts("\nThe Correct Data =");
puts(s);
sprintf(s,"x%x",getdata);
puts("\nThe Read Data =");
puts(s);
dbuffer1=getdata&0x0000ffff;
dbuffer2=testdata&0x0000ffff;
if(dbuffer1!=dbuffer2)
{
puts("\nThe Error Chip is U5\n");
}
dbuffer1=getdata&0xffff0000;
dbuffer2=testdata&0xffff0000;
if(dbuffer1!=dbuffer2)
{
puts("\nThe Error Chip is U6\n");
}
return(1);
}
testdata=testdata+0x00010001; //Write next data
P=P+1;
if((fmod(counter,0x3ff))==0)
{
uart_putc('.');
}
}
puts("\nFlash Test Ok\n");
return(0);
//flash read test
/*P=(unsigned long *)0x0000000;
testdata= 0;
puts("\nFlash Read Data Test\n");
judge=0;
for(counter=0;counter<=0xfffff;counter++)
{
getdata=*P;
if(getdata!=testdata)
{
judge=1;
break;
}
testdata=testdata+0x00010001;
P=P+1;
if((fmod(counter,0x3ff))==0)
{
uart_putc('.');
}
}
if(judge)
{
puts("Flash Test Error");
sprintf(s,"x%x",P);
puts("\nVerify Error The Error Address=");
puts(s);
sprintf(s,"x%x",testdata);
puts("\nThe Correct Data =");
puts(s);
sprintf(s,"x%x",getdata);
puts("\nThe Read Data =");
puts(s);
return(1);
}
else
{
puts("\nFlash Verify Data Ok\n");
return(0);
}*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -