📄 k9k2g16.c
字号:
}
Uart_Printf("[block #%d is marked as a bad block]\n",block);
return 1;
}
static int NF16_ReadPage(U32 block,U32 page,U16 *buffer)
{
int i,j;
register U16 * 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 0
/*
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 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)|(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
if(page==0)
{
if(i%16==0)
Uart_Printf("\nR-SECC:");
Uart_Printf("%04x ",se16Buf[i]);
}
}
rNFMECCDATA0=se16Buf[0];
rNFMECCDATA1=se16Buf[1];
rNFMECCDATA2=se16Buf[2];
rNFMECCDATA3=se16Buf[3];
NF_nFCE_H();
if(((rNFESTAT0&0x03)||(rNFESTAT1&0x03))==0x0)
{
//Uart_Printf("[ECC OK!!!]\n");
return 1;
}
else
{
Uart_Printf(" ECC FAIL !!!\n");
return 0;
}
}
static int NF16_WritePage(U32 block,U32 page,U16 *buffer)
{
int i;
U32 blockPage=(block<<6)+page;
U16 *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(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 0
//data write into main data area
for(i=0;i<1024;i++)
{
NF_WRDATA(*bufPt++);
// if(page==0){
// if(i%8==0)
// Uart_Printf("\n%xh:",i);
// Uart_Printf("%04x ",*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)|(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();
#if ECC_CHECK_x16
//ECC generation from main area ECC status.
// Ecc lower
se16Buf[0]=rNFMECC0&0xff;
se16Buf[1]=(rNFMECC0>>8)&0xff;
se16Buf[2]=(rNFMECC0>>16)&0xff;
se16Buf[3]=(rNFMECC0>>24)&0xff;
// Ecc higher
se16Buf[0] |=(((rNFMECC1)&0xff)<<8);
se16Buf[1] |=(((rNFMECC1>>8)&0xff)<<8);
se16Buf[2] |=(((rNFMECC1>>16)&0xff)<<8);
se16Buf[3] |=(((rNFMECC1>>24)&0xff)<<8);
se16Buf[5] =0xffff; // Marking good block
/*
// ECC generation from spare area ECC status.
se16Buf[?]=rNFSECC&0xff;
se16Buf[!]=(rNFSECC>>8)&0xff;
se16Buf[?]|=(((rNFSECC>>16)&0xff)<<8);
se16Buf[!]|=(((rNFSECC>>24)&0xff)<<8);
se16Buf[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<32;i++)
{
NF_WRDATA(se16Buf[i]); // Write spare array(ECC and Mark)
if(page==0)
{
if(i%16==0)
Uart_Printf("\nW-SECC:");
Uart_Printf("%04x ",se16Buf[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);
NF16_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 K9k2g16_AutoLoad()
{
U32 block, page, j;
U16 addr,i,id;
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();
/*
// Initializing Buffer ----------------INIT
stepdata = (U16 *)(steppingstone);
for(i=3;i<1024;i++)
*(stepdata++) = i;
Delay(1000);
*/
NF16_AutoLoad(block, page, addr, size);
rNFCONT|=(3<<0); //software mode
Uart_Printf("[Auto Load OK!!! ]\n");
Delay(10000);
/*
// abort occurred while running this loop!!
steppingstone=0x08000000;
for(j=0;j<size*1024;j++)
{
if(j%16==0)
Uart_Printf("\n%04xh:",j*2);
Uart_Printf("%04x ",*(U16 *)(steppingstone+j));
}
*/
}
void NF16_AutoLoad(U32 block,U32 page, U16 addr, U8 size)
{
unsigned int blockPage;
rNFCONT =rNFCONT & ~(0x3);
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
rNFCONT =rNFCONT&~(3<<0);
}
void K9k2g16_AutoStore()
{
U32 block, page, j;
U16 addr,id;
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(!NF16_EraseBlock(block)) Uart_Printf("Block Erase_Fail!!! \n");
else Uart_Printf("Block Erase_OK!!! \n");
NF16_AutoStore(block, page, addr);
}
void NF16_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<<6)+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
// Ecc lower
se16Buf[0]=rNFMECC0&0xff;
se16Buf[1]=(rNFMECC0>>8)&0xff;
se16Buf[2]=(rNFMECC0>>16)&0xff;
se16Buf[3]=(rNFMECC0>>24)&0xff;
// Ecc higher
se16Buf[0] |=((rNFMECC1<<8)&0xff00);
se16Buf[1] |=((rNFMECC1)&0xff00);
se16Buf[2] |=((rNFMECC1>>8)&0xff00);
se16Buf[3] |=((rNFMECC1>>16)&0xff00);
se16Buf[5] =0xffff; // Marking good block
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();
Uart_Printf("[Auto Store PROGRAM_ERROR:block#=%d]\n",block);
NF16_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 + -