📄 k9k2g16.c
字号:
}
static int NF16_MarkBadBlock(unsigned int block)
{
int i;
unsigned int blockPage;
blockPage=(block<<6);
se16Buf[0]=0xffff;
se16Buf[1]=0xffff;
se16Buf[2]=0xffff;
se16Buf[3]=0xffff;
se16Buf[5]=0x4444; // Bad blcok mark=0x4444
// NF_CLRRnB();
NF_nFCE_L();
NF_CMD(0x80); // Write 1st command
NF_ADDR((0)&0xff); // 2048= 0x0800
NF_ADDR(((0)>>8)&0xff); // A[10:8]
NF_ADDR((blockPage)&0xff); // A[11;18]
NF_ADDR((blockPage>>8)&0xff); // A[26:19]
NF_ADDR((blockPage>>16)&0xff); // A[27]
for(i=0;i<1024;i++)
{
NF_WRDATA(0xffff);
}
for(i=0;i<32;i++)
{
NF_WRDATA(se16Buf[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 NF16_ReadPage(unsigned int block,unsigned int page,unsigned short *buffer)
{
int i,j;
register unsigned short * bufPt=buffer;
unsigned int blockPage;
blockPage=(block<<6)+page;
NF_RSTECC(); // Reset ECC
NF_MECC_UnLock();
NF_CLRRnB();
NF_nFCE_L(); // nCE enable
NF_CMD(0x00); // 1st Read command
NF_ADDR(0); // Column (A[7:0]) = 0
NF_ADDR(0); // A[10:8]
NF_ADDR((blockPage)&0xff); // A[18:11]
NF_ADDR((blockPage>>8)&0xff); // A[26:19]
NF_ADDR((blockPage>>16)&0xff); // A27
NF_CMD(0x30); // 2nd Read command
// for(i=0;i<5;i++); //wait tWB(100ns)
NF_TRANSRnB(); // Wait tRnB(max 12us)
#if 1
/*
i=1024;
while(i--!=0)
{
*bufPt++=NF_RDDATA(); // Read one page
}
*/
for(i=0;i<1024;i++) // 1 page
{
*bufPt++=NF_RDDATA(); // Read one page
}
#elif 0
//DMA
// rINTMSK=~(BIT_DMA);
// rINTSUBMSK=~(BIT_SUB_DMA0);
rSUBSRCPND=BIT_SUB_DMA0;
rDISRC0=0x40c00010; //NF_RDDATA()
rDISRCC0=(0<<1)|(1<<0); //arc=AHB,src_addr=fix
rDIDST0=(unsigned)bufPt;
rDIDSTC0=(0<<1)|(0<<0); //dst=AHB,dst_addr=inc;
rDCON0=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(0<<23)|(1<<22)|(1<<20)|(2048/8);
//Handshake,AHB,interrupt,(BURST),whole,S/W,no_autoreload,16bit,count=2048/8;
rDMASKTRIG0=(1<<1)|(1<<0);
// while(dmaDone==0);
// rINTSUBMSK=BIT_ALLMSK;
// rINTMSK=BIT_ALLMSK;
while(!(rSUBSRCPND & BIT_SUB_DMA0));
rSUBSRCPND=BIT_SUB_DMA0;
// while(!(rNF_STAT&(1<<10)));
#elif 0
__RdPage1024(bufPt);
#endif
NF_MECC_Lock();
for(i=0;i<32;i++) // 1 page
{
se16Buf[i]=NF_RDDATA(); // Read one page
}
rNFMECCDATA0=(((se16Buf[3]&0xff)<<8)|(se16Buf[1]&0xff));
rNFMECCDATA1=((se16Buf[3]&0xff00)|((se16Buf[1]&0xff00)>>8));
rNFMECCDATA2=(((se16Buf[4]&0xff)<<8)|(se16Buf[2]&0xff));
rNFMECCDATA3=((se16Buf[4]&0xff00)|((se16Buf[2]&0xff00)>>8));
NF_nFCE_H();
if(((rNFESTAT0&0x03)||(rNFESTAT1&0x03))==0x0)
{
//printf("[ECC OK!!!]\n");
return 1;
}
else
{
printf(" ECC FAIL !!!\n");
return 0;
}
}
static int NF16_WritePage(unsigned int block,unsigned int page,unsigned short *buffer)
{
int i;
unsigned int blockPage=(block<<6)+page;
unsigned short *bufPt=buffer;
NF_RSTECC(); // Initialize ECC
NF_MECC_UnLock();
NF_CLRRnB();
NF_nFCE_L();
NF_CMD(0x80); // Write 1st command
for(i=0;i<10;i++);
NF_ADDR(0); // Column (A[7:0]) = 0
NF_ADDR(0); // A[10:8]
NF_ADDR((blockPage)&0xff); // A[18:11]
NF_ADDR((blockPage>>8)&0xff); // A[26:19]
NF_ADDR((blockPage>>16)&0xff); // A7
#if 1
//data write into main data area
for(i=0;i<1024;i++)
{
NF_WRDATA(*bufPt++);
// if(page==0){
// if(i%8==0)
// printf("\n%xh:",i);
// printf("%04x ",*bufPt++);
// }
}
#elif 0
//DMA
// rINTMSK=~(BIT_DMA);
// rINTSUBMSK=~(BIT_SUB_DMA0);
rSUBSRCPND=BIT_SUB_DMA0;
rDISRC0=(unsigned)bufPt;
rDISRCC0=(0<<1)|(0<<0); //arc=AHB,src_addr=inc
rDIDST0=0x40c00010; //NF_WRDATA()
rDIDSTC0=(0<<1)|(1<<0); //dst=AHB,dst_addr=fix;
rDCON0=(1<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(1<<20)|(2048/2);
//Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,16bit,count=2048/2;
rDMASKTRIG0=(1<<1)|(1<<0);
// while(dmaDone==0);
// rINTSUBMSK=BIT_ALLMSK;
// rINTMSK=BIT_ALLMSK;
while(!(rSUBSRCPND & BIT_SUB_DMA0));
rSUBSRCPND=BIT_SUB_DMA0;
// while(!(rNF_STAT&(1<<10)));
#elif 0
__WrPage1024(bufPt);
#endif
NF_MECC_Lock();
se16Buf[0] =0xffff; // Marking good block
//ECC generation from main area ECC status.
// Ecc lower
se16Buf[1]=rNFMECC0&0xffff;
se16Buf[2]=(rNFMECC0>>16)&0xffff;
se16Buf[3]=rNFMECC1 &0xffff;
se16Buf[4]=(rNFMECC1>>16)&0xffff;
//write ECC into spare area
//write spare ECC into another spare area
for(i=0;i<32;i++)
{
NF_WRDATA(se16Buf[i]); // Write spare array(ECC and Mark)
Spare16[i]=se16Buf[i];
}
NF_CMD(0x10); // Write 2nd command
// for(i=0;i<10;i++);
NF_TRANSRnB(); //wait tPROG 200~500us;
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);
NF16_MarkBadBlock(block);
return 0;
}
else
{
NF_nFCE_H();
//printf("[PROGRAM_OK:block#=%d]\n",block);
return 1;
}
}
void K9k2g16_AutoLoad()
{
unsigned int block, page, j;
unsigned short addr,i,id;
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 :");
addr=GetIntNum();
printf("Input page size of loaded:");
size=GetIntNum();
NF16_AutoLoad(block, page, addr, size);
rNFCONT =rNFCONT&~(3<<0) |(3<<0); //Software mode
printf("[Auto Load OK!!! ]\n");
}
void NF16_AutoLoad(unsigned int block,unsigned int page, unsigned short addr, unsigned char size)
{
unsigned int blockPage;
blockPage=(block<<6)+page;
rNFCONT |=((addr<<16)|((size-1)<<4)); // Load page Size: Max 2pages (2048Bytes X 2 = 4KBytes)
NF_ADV_CMD(0x30,0x00);
rNFADDR=(blockPage<<8);
rNFCONT =rNFCONT&~(3<<0)|(1<<0); // Autoload Start
// Autoload Done Check!!!
while(! (rNFSTAT&(1<<15)));
rNFSTAT|=(1<<15); // Clear
}
void K9k2g16_AutoStore()
{
unsigned int block, page, j;
unsigned short addr,id;
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(!NF16_EraseBlock(block)) printf("Block Erase_Fail!!! \n");
else printf("Block Erase_OK!!! \n");
NF16_AutoStore(block, page, addr);
}
void NF16_AutoStore(unsigned int block,unsigned int page, unsigned short addr)
{
unsigned int blockPage,i;
blockPage=(block<<6)+page;
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
se16Buf[0] =0xffff; // Marking good block
se16Buf[1]=rNFMECC0&0xffff;
se16Buf[2]=(rNFMECC0>>16)&0xffff;
se16Buf[3]=rNFMECC1 &0xffff;
se16Buf[4]=(rNFMECC1>>16)&0xffff;
for(i=0;i<32;i++)
{
NF_WRDATA(se16Buf[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);
NF16_MarkBadBlock(block);
}
else
{
printf("[Auto Store PROGRAM_OK!!! ]\n");
NF_nFCE_H();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -