📄 k9s1208.c
字号:
while(NFConDone==0);
rNFCONT&=~(1<<12); // Disable Illegal Access & RnB Interrupt
rNFCONT&=~(1<<15); // Disable Illegal Access & RnB Interrupt
if(rNFSTAT&(1<<16)){
rNFSTAT|=(1<<16);
return FALSE; // Illigal accessed is detected!!
}
NF_CMD(0x70); // Read status command
if (NF_RDDATA()&0x1) // Erase error
{
NF_nFCE_H();
printf("[ERASE_ERROR:block#=%d]\n",block);
// NF_MarkBadBlock(block);
return 0;
}
else
{
NF_nFCE_H();
return 1;
}
}
void __irq NFCon_Int(void)
{
NFConDone=1;
rINTMSK|=BIT_NFLASH;
ClearPending(BIT_NFLASH);
if(rNFSTAT&(0x1<<16)) printf("Illegal Access is detected!!!\n");
// else if(rNFSTAT&(0x1<<13)) printf("RnB is Detected!!!\n");
}
static int NF_MarkBadBlock(unsigned int block)
{
int i;
unsigned int blockPage;
blockPage=(block<<5);
seBuf[0]=0xff;
seBuf[1]=0xff;
seBuf[2]=0xff;
//seBuf[3]=0xff;
seBuf[5]=0x44; // Bad blcok mark=0
// NF_CLRRnB();
NF_nFCE_L();
NF_CMD(0x50);
NF_CMD(0x80); // Write 1st command
NF_ADDR(0x0); // The mark of bad block is
NF_ADDR((blockPage)&0xff); // marked 5th spare array
NF_ADDR((blockPage>>8)&0xff); // in the 1st page.
NF_ADDR((blockPage>>16)&0xff); //
for(i=0;i<16;i++)
{
//NF_WRDATA(0,seBuf[i]); // Write spare array
NF_WRDATA(seBuf[i]); // Write spare array
}
NF_CMD(0x10); // Write 2nd command
for(i=0;i<10;i++); //tWB = 100ns. ///???????
NF_TRANSRnB(); // Wait tPROG(200~500us)
NF_CMD(0x70);
for(i=0;i<3;i++); //twhr=60ns////??????
if (NF_RDDATA()&0x1) // Spare arrray write error
{
NF_nFCE_H();
printf("[Program error is occurred but ignored]\n");
}
else
{
NF_nFCE_H();
}
printf("[block #%d is marked as a bad block]\n",block);
return 1;
}
static int NF_ReadPage(unsigned int block,unsigned int page,unsigned char *buffer)
{
int i;
register unsigned char * bufPt=buffer;
unsigned int blockPage;
blockPage=(block<<5)+page;
NF_RSTECC(); // Reset ECC
NF_MECC_UnLock();
NF_CLRRnB();
NF_nFCE_L(); // nCE enable
NF_CMD(0x00); // Read command
// Address 4 cycles
NF_ADDR(0); // Column address
NF_ADDR(blockPage&0xff); // page address
NF_ADDR((blockPage>>8)&0xff); //
NF_ADDR((blockPage>>16)&0xff); //
// for(i=0;i<5;i++); //wait tWB(100ns)
NF_TRANSRnB(); // Wait tRnB(max 12us)
i=512;
while(i--!=0)
{
*bufPt++=NF_RDDATA(); // Read one page
}
NF_MECC_Lock();
/*
for(i=0; i<16; i++) spare[i]=NF_RDDATA();
rNFMECCDATA0=spare[0];
rNFMECCDATA1=spare[1];
rNFMECCDATA2=spare[2];
rNFMECCDATA3=spare[3];
*/
rNFMECCDATA0=NF_RDDATA();
rNFMECCDATA1=NF_RDDATA();
rNFMECCDATA2=NF_RDDATA();
rNFMECCDATA3=NF_RDDATA();
NF_nFCE_H();
if((rNFESTAT0&0x03)==0x0)
{
printf("[ECC OK!!!]\n");
return 1;
}
else printf("[ECC ERROR!!!]\n");
}
static int NF_WritePage(unsigned int block,unsigned int page,unsigned char *buffer)
{
int i;
unsigned int Mecc;
unsigned int blockPage=(block<<5)+page;
unsigned char *bufPt=buffer;
NFConDone=0;
rNFCONT|=(1<<12); // RnB interrupt enable
rNFCONT|=(1<<15); // Illegal interrupt enable
pISR_NFLASH= (unsigned)NFCon_Int;
rSRCPND=BIT_NFLASH;
rINTMSK=~(BIT_NFLASH);
NF_RSTECC(); // Initialize ECC
NF_MECC_UnLock();
NF_CLRRnB();
NF_nFCE_L();
NF_CMD(0x0);// for programming 'A' area
NF_CMD(0x80); // Write 1st command
NF_ADDR(0); // Column 0
NF_ADDR(blockPage&0xff); //
NF_ADDR((blockPage>>8)&0xff); // Block & page num.
NF_ADDR((blockPage>>16)&0xff); //
//data write into main data area
for(i=0;i<512;i++)
{
NF_WRDATA(*bufPt++);
}
NF_MECC_Lock();
//#if ECC_CHECK
//ECC generation from main area ECC status.
Mecc=rNFMECC0;
seBuf[0]=Mecc&0xff;
seBuf[1]=(Mecc>>8)&0xff;
seBuf[2]=(Mecc>>16)&0xff;
seBuf[3]=(Mecc>>24)&0xff;
seBuf[5]=0xff; // Marking good block
/*
// ECC generation from spare area ECC status.
seBuf[?]=rNFSECC&0xff;
seBuf[?]=(rNFSECC>>8)&0xff;
seBuf[5]=0xff; // Marking good block
//write spare ECC into another spare area
*/
//write ECC into spare area
//write spare ECC into another spare area
for(i=0;i<16;i++)
{
NF_WRDATA(seBuf[i]);
spare[i]=seBuf[i];
}
//#endif
NF_CMD(0x10); // Write 2nd command
for(i=0;i<10;i++);
// NF_TRANSRnB(); //wait tPROG 200~500us;
while(NFConDone==0);
rNFCONT&=~(1<<12); // Disable Illegal Access & RnB Interrupt
rNFCONT&=~(1<<15); // Disable Illegal Access & RnB Interrupt
if(rNFSTAT&(1<<16)) return FALSE; // Illigal accessed is detected!!
NF_CMD(0x70); // Read status command
for(i=0;i<3;i++);
if (NF_RDDATA()&0x1) // Page write error
{
NF_nFCE_H();
printf("[PROGRAM_ERROR:block#=%d]\n",block);
// NF_MarkBadBlock(block);
return 0;
}
else
{
NF_nFCE_H();
// printf("[PROGRAM_OK:block#=%d]\n",block);
return 1;
}
}
void K9S1208_AutoLoad()
{
unsigned int block, page, j;
unsigned short addr,i;
unsigned short *stepdata;
unsigned int size;
printf("Input source block number:");
block=GetIntNum();
printf("Input source page number:");
page=GetIntNum();
printf("Input start address of steppingstone to load\n");
#if 1
printf("Stepping stone address: 0x0 ~ 0x1000\n");
#else
printf("Stepping stone address: 0x8000000 ~ 0x8001000\n");
#endif
addr=GetIntNum();
printf("Input page size of loaded:");
size=GetIntNum();
NF_AutoLoad(block, page, addr, size);
rNFCONT =rNFCONT&~(3<<0) |(3<<0); //Software mode
printf("[Auto Load OK!!! ]\n");
// Delay(10000);
#if 1
steppingstone=0x00000000;
#else
steppingstone=0x08000000;
#endif
for(j=0;j<size*512;j++)
{
if(j%16==0)
printf("\n%3xh:",j);
printf("%02x ",*(unsigned char *)(steppingstone+j));
}
printf("\n\n");
}
void NF_AutoLoad(unsigned int block,unsigned int page, unsigned short addr, unsigned char size)
{
unsigned int blockPage;
//rNFCONT=rNFCONT&0xff8f; ///???
//rNFCONT =rNFCONT & ~(0x3);
blockPage=(block<<5)+page;
rNFCONT |=((addr<<16)|((size-1)<<4)); // Load page Size: Max 8pages (512Bytes X 8 = 4KBytes)
NF_CMD(0x00);
//Address 4 cycles
rNFADDR=(blockPage<<8);
rNFCONT =rNFCONT&~(3<<0)|(1<<0); // Autoload Start
// Autoload Done Check!!!
while(! (rNFSTAT&(1<<15)));
rNFSTAT|=(1<<15); // Clear
}
void K9S1208_AutoStore()
{
unsigned int block, page, j;
unsigned short addr;
printf("Input target block number:");
block=GetIntNum();
printf("Input target page number:");
page=GetIntNum();
printf("Input start address of steppingstone to store:");
addr=GetIntNum();
// You should erase block before Autostore!!!
if(!NF_EraseBlock(block)) printf("Block Erase_Fail!!! \n");
else printf("Block Erase_OK!!! \n");
NF_AutoStore(block, page, addr);
}
void NF_AutoStore(unsigned int block,unsigned int page, unsigned short addr)
{
unsigned int blockPage,i;
blockPage=(block<<5)+page;
rNFCONT=rNFCONT&~(3<<0); //disable all mode
rNFCONF&=~(1<<3); //Disable H/W Flash_nCE(manual set)
rNFCONT =rNFCONT&~(1<<7); //Enable Reg Flash_nCE
NF_CLRRnB();
rNFCONT |=(addr<<16); // AutoStore page size is only 1 page
rNFADDR=0;
rNFADDR=(blockPage<<8);
NF_CMD(0x80);// 1st command
rNFCONT =rNFCONT&~(3<<0) |(2<<0); // AutoStore Start
// AutoStore Done Check!!!
while(! (rNFSTAT&(1<<14)));
rNFSTAT|=(1<<14); // AutoStore Done Clear
NF_nFCE_L();
rNFCONT =rNFCONT&~(3<<0) |(3<<0); //Software mode
seBuf[0]=rNFMECC0&0xff;
seBuf[1]=(rNFMECC0>>8)&0xff;
seBuf[2]=(rNFMECC0>>16)&0xff;
seBuf[3]=(rNFMECC0>>24)&0xff;
seBuf[5]=0xff; // Marking good block
for(i=0;i<16;i++)
{
NF_WRDATA(seBuf[i]);
}
NF_CMD(0x10); // 2nd command
// for(i=0;i<10;i++);
NF_TRANSRnB(); //wait tPROG 200~500us;
// NF_CLRRnB();
NF_CMD(0x70); // Read status command
// for(i=0;i<3;i++);
if (NF_RDDATA()&0x1) // Page write error
{
NF_nFCE_H();
printf("[Auto Store PROGRAM_ERROR:block#=%d]\n",block);
// NF_MarkBadBlock(block);
}
else
{
printf("[Auto Store PROGRAM_OK!!! ]\n");
NF_nFCE_H();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -