📄 k9d1g08.c
字号:
}
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();
Uart_Printf("[Program error is occurred but ignored]\n");
}
else
{
NF_nFCE_H();
}
Uart_Printf("[block #%d is marked as a bad block]\n",block);
return 1;
}
static int NF_ReadPage(U32 block,U32 page,U8 *buffer)
{
int i;
register U8 * 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)
#if 0
i=512;
while(i--!=0)
{
*bufPt++=NF_RDDATA(); // Read one page
}
#elif 1
//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)|(0<<28)|(1<<27)|(0<<23)|(1<<22)|(0<<20)|(512);
//Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,byte,count=512;
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
__RdPage512(bufPt);
#endif
NF_MECC_Lock();
rNFMECCDATA0=NF_RDDATA();
rNFMECCDATA1=NF_RDDATA();
rNFMECCDATA2=NF_RDDATA();
rNFMECCDATA3=NF_RDDATA();
NF_nFCE_H();
if((rNFESTAT0&0x03)==0x0)
{
//Uart_Printf("[ECC OK!!!]\n");
return 1;
}
else Uart_Printf("[ECC ERROR!!!]\n");
}
static int NF_WritePage(U32 block,U32 page,U8 *buffer)
{
int i;
U32 blockPage=(block<<5)+page;
U8 *bufPt=buffer;
// Port setting for SMC_WP
rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x1<<2);
rGPDAT |=(1<<1);
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); //
#if 0
//data write into main data area
for(i=0;i<512;i++)
{
NF_WRDATA(*bufPt++);
}
#elif 1
//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)|(0<<20)|(512);
//Handshake,AHB,interrupt,(UNIT),whole,S/W,no_autoreload,Byte,count=512;
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
__WrPage512(bufPt);
#endif
NF_MECC_Lock();
#if ECC_CHECK
//ECC generation from main area ECC status.
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
/*
// 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]);
}
#endif
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();
Uart_Printf("[PROGRAM_ERROR:block#=%d]\n",block);
NF_MarkBadBlock(block);
rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
return 0;
}
else
{
NF_nFCE_H();
// Uart_Printf("[PROGRAM_OK:block#=%d]\n",block);
rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
return 1;
}
}
void K9D1G08_AutoLoad()
{
U32 block, page, j;
U16 addr,i;
U16 *stepdata;
U32 size;
Uart_Printf("Input source block number:");
block=Uart_GetIntNum();
Uart_Printf("Input source page number:");
page=Uart_GetIntNum();
Uart_Printf("Input start address of steppingstone to load:");
addr=Uart_GetIntNum();
Uart_Printf("Input page size of loaded:");
size=Uart_GetIntNum();
NF_AutoLoad(block, page, addr, size);
rNFCONT|=(3<<0); //software mode
Uart_Printf("[Auto Load OK!!! ]\n");
Delay(10000);
/*
steppingstone=0x08000000;
for(j=0;j<size*512;j++)
{
if(j%16==0)
Uart_Printf("\n%3xh:",j);
Uart_Printf("%02x ",*(U8 *)(steppingstone+j));
}
*/
}
void NF_AutoLoad(U32 block,U32 page, U16 addr, U8 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
rNFCONT =rNFCONT&~(3<<0); //s/w mode
}
void K9D1G08_AutoStore()
{
U32 block, page, j;
U16 addr;
Uart_Printf("Input target block number:");
block=Uart_GetIntNum();
Uart_Printf("Input target page number:");
page=Uart_GetIntNum();
Uart_Printf("Input start address of steppingstone to store:");
addr=Uart_GetIntNum();
rNFCONT&=~(1<<2); // Lock disable
// You should erase block before Autostore!!!
if(!NF_EraseBlock(block)) Uart_Printf("Block Erase_Fail!!! \n");
else Uart_Printf("Block Erase_OK!!! \n");
NF_AutoStore(block, page, addr);
}
void NF_AutoStore(U32 block,U32 page, U16 addr)
{
unsigned int blockPage,i;
// Port setting for SMC_WP
rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x1<<2);
rGPDAT |=(1<<1);
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&=~(1<<2); // Lock disable
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();
Uart_Printf("[Auto Store PROGRAM_ERROR:block#=%d]\n",block);
NF_MarkBadBlock(block);
}
else
{
Uart_Printf("[Auto Store PROGRAM_OK!!! ]\n");
NF_nFCE_H();
}
rGPCON_L = (rGPCON_L & ~(0x3<<2))|(0x3<<2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -