📄 flash6303.c
字号:
#if (_FLASH_TYPE == M6303_SST)
#define Manufid 0xbf
#define devid 0xd9
#define BASE 0xbfc00000
#define storeto_flash(addr,data) *(volatile unsigned char *)(BASE+addr)=data;
#define getfrom_flash(addr) *(volatile unsigned char *)(BASE+addr);
void resetflash();
int checkidenti();
int erasector(unsigned int flashaddr,unsigned int size);
int programflash(unsigned int sdramaddr, unsigned int flashaddr, unsigned int size);
static void delay(unsigned short count)
{
int i;
for(i=0;i<count;i++)
{}
;
}
void sendcmd(unsigned int addr, unsigned char val)
{
*(volatile unsigned char *)(0xbfc00000 + addr)=val;
}
int flash(unsigned int sdramaddr, unsigned int flashaddr, unsigned short size)
{
unsigned long temp;
checkidenti();
resetflash();
erasector(flashaddr,size);
programflash(sdramaddr,flashaddr,size);
*(volatile unsigned int *)(0xb800002c)=0x80000860;
temp=*(volatile unsigned int *)(0xb8000028);
*(volatile unsigned int *)(0xb8000028)=(temp&~1);
return 1;
}
int checkidenti()
{
volatile unsigned int temp,tmpval;
*(volatile unsigned int *)(0xb800002c)=0x80000860;
temp=*(volatile unsigned int *)(0xb8000028);
*(volatile unsigned int *)(0xb8000028)=(0x1f0000|1);
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0x90);
tmpval=getfrom_flash(0x0);
if(tmpval!=Manufid)
{
// *(volatile unsigned char *)(0xb8000054)=0x0a;
return -1;
}
tmpval=getfrom_flash(0x0001);
if(tmpval!=devid)
{
// *(volatile unsigned char *)(0xb8000054)=0x07;
return -2;
}
return 1;
}
void resetflash()
{
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0xf0);
}
int erasector(unsigned int flashaddr,unsigned int size)
{
int i,k;
unsigned int offset;
unsigned char check;
offset=flashaddr;//flashaddr&0x3fffff;
for(i=0;i<((size+0xfff)/0x1000);i++)
{
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0x80);
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(offset,0x30);
for (k=0;k<2;k++)
{
check=getfrom_flash(0x0)
if(!(check&0x80))
k=0;
}
offset=offset+0x1000;
}
return 1;
}
int eraseblock(unsigned int flashaddr,unsigned short size)
{
int i,k;
unsigned int offset;
unsigned char check;
offset=flashaddr&0x3fffff;
for(i=0;i<(size/64);i++)
{
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0x80);
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(offset,0x30);
for (k=0;k<2;k++)
{
check=getfrom_flash(0x0)
if(!(check&0x80))
k=0;
}
offset=offset+0x10000;
}
return 1;
}
int erasechip()
{
unsigned char check;
int k;
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0x80);
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0x10);
for (k=0;k<2;k++)
{
check=getfrom_flash(0x0)
if(!(check&0x80))
k=0;
}
return 1;
}
int programflash(unsigned int sdramaddr, unsigned int flashaddr, unsigned int size)
{
int i;
unsigned int offset;
unsigned char trsval;
unsigned char check;
int k;
offset=flashaddr;//flashaddr&0x3fffff;
for(i=0;i<(size);i++)
{
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0xa0);
trsval=*(volatile unsigned char *)(sdramaddr);
storeto_flash(offset,trsval);
for(k=0;k<40;k++)
{
check=getfrom_flash(0x0);
if(!(check&0x80))
k=0;
check=getfrom_flash(0x0);
if(!(check&0x80))
k=0;
}
sdramaddr++;
offset++;
}
return 1;
}
int test_flash()
{
unsigned int sdramaddr, flashaddr;
unsigned int size;
int i;
sdramaddr=0xa0200000;
flashaddr=0xbfc04000;
size=0x1000*25;
for(i=sdramaddr;i<sdramaddr+0xa000;i+=4)
*(volatile unsigned int *)(i)=(0x555aaa+i);
// *(volatile unsigned char *)(0xb8000054)=0x1;
if(flash(sdramaddr, flashaddr, size))
while(1)
*(volatile unsigned char *)(0xb8000054)=0x3;
else
while(1)
*(volatile unsigned char *)(0xb8000054)=0xf;
}
#else//FINISHED SST
#define BASE 0xbfc00000
#define Manufid 0xbf
#define devid 0xd9
//#define sst
#define hynix
#define CARD_FLASHROM_BASE 0xbfc80000
#define CARD_BLOCK_SIZE 128
#define CARD_SIZE CARD_BLOCK_SIZE*1024
#define VIDEORAM_BASE 0xa0500000
#define storeto_flash(addr,data) *(volatile unsigned char *)(BASE+addr)=data;
#define getfrom_flash(addr) *(volatile unsigned char *)(BASE+addr);
unsigned char memCard[CARD_SIZE*2];
extern int updata_flag;
extern unsigned short data1[76801];
static void resetflash();
static int checkidenti();
static int erasector(unsigned long flashaddr,unsigned long size);
static int programflash(unsigned long sdramaddr, unsigned long flashaddr, unsigned long size);
unsigned int writenum = 0;
extern void soc_printf(char *fmt, ...);
static void delay(unsigned short count)
{
int i;
volatile unsigned long temp;
for(i=0;i<count;i++)
{
temp=*(volatile unsigned long *)(0xb8000050);
};
}
#define sendcmd(addr,val) *(volatile unsigned char *)(BASE+addr)=val;
int flash(unsigned long sdramaddr, unsigned long flashaddr, unsigned long size)
{
unsigned long saddr,faddr,t_size;
unsigned long tmp,err;
int k,i,j;
#ifdef hynix
/// soc_printf("sdramaddr=%x,flashaddr=%x,size=%x\n",sdramaddr,flashaddr,size);
tmp=*(volatile unsigned long *)(0xb8000058);
tmp=tmp|0x8000;
tmp=tmp&0xfeff;
*(volatile unsigned long *)(0xb8000058)=tmp;
#endif
*(volatile unsigned long *)(0xb800002c)=0x80000860;
tmp=*(volatile unsigned long *)(0xb8000028);
*(volatile unsigned long *)(0xb800002c)=0x80000860;
*(volatile unsigned long *)(0xb8000028)=(tmp|0x1f0001);
// checkidenti();
// resetflash();
// erasechip();
do
{
*(volatile unsigned long *)(0xb800002c)=0x80000860;
tmp=*(volatile unsigned long *)(0xb8000028);
*(volatile unsigned long *)(0xb800002c)=0x80000860;
*(volatile unsigned long *)(0xb8000028)=(tmp|0x1f0001);
err=0;
t_size=size;
// soc_printf("sdramaddr=%x flashaddr=%x size=%x tcnt=%d\n",sdramaddr,flashaddr,size,tcnt);
if(writenum == 0)
erasector(flashaddr,0x2000);
// erasechip();
saddr=sdramaddr;
faddr=flashaddr+writenum*512;
programflash(sdramaddr,faddr,size);
*(volatile unsigned long *)(0xb800002c)=0x80000860;
tmp=*(volatile unsigned long *)(0xb8000028);
*(volatile unsigned long *)(0xb800002c)=0x80000860;
*(volatile unsigned long *)(0xb8000028)=(tmp&~1);
while(t_size--)
{
if ((*(unsigned char *)faddr)!=(*(unsigned char *)saddr))
{
err=1;
// soc_printf("error!!!! saddr=%x, *=%x faddr=%x *=%x\n",sdramaddr,*(volatile unsigned char *)sdramaddr,flashaddr,*(volatile unsigned char *)flashaddr);
break;
}
faddr++;
saddr++;
}
writenum++;
writenum = writenum%16;
}
while(err);
// soc_printf("flash process is over\n");
return 1;
}
static int checkidenti()
{
volatile unsigned char tmpval;
sendcmd(0x5555,0xaa);
sendcmd(0x2aaa,0x55);
sendcmd(0x5555,0x90);
tmpval=getfrom_flash(0x0);
if(tmpval!=Manufid)
{
*(volatile unsigned char *)(0xb8000054)=0x0a;
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -