⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash6303.c

📁 M3355的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -