📄 nand.cpp
字号:
s2450NAND->NFSTAT|=(1<<7);
// Read out the ECC value generated by HW
t8MECC[nSectorLoop].n8MECC0 = NF_8MECC0();
t8MECC[nSectorLoop].n8MECC1 = NF_8MECC1();
t8MECC[nSectorLoop].n8MECC2 = NF_8MECC2();
t8MECC[nSectorLoop].n8MECC3 = (NF_8MECC3() & 0xff);
/* //Debug Code :: Print Write Data
RETAILMSG(1, (TEXT("\r\n===================WRITE DATA=====================")));
for(i=0;i<512;i++)
{
if(i%16 == 0)
RETAILMSG(1, (TEXT("\r\n")));
RETAILMSG(1, (TEXT(" 0x%x "),*(pSectorBuff+(nSectorLoop*SECTOR_SIZE) + i)));
}
RETAILMSG(1, (TEXT("\r\n===================================================\r\n")));
RETAILMSG(1, (TEXT("FMD_LB_WriteSector_Steploader() : Sdata : 0x%x, 0x%x, 0x%x, 0x%x\r\n")
, t8MECC[nSectorLoop].n8MECC0
, t8MECC[nSectorLoop].n8MECC1
, t8MECC[nSectorLoop].n8MECC2
, t8MECC[nSectorLoop].n8MECC3));
*/
}
for(nSectorLoop = 0; nSectorLoop < 4; nSectorLoop++)
{
NF_WRDATA_WORD(t8MECC[nSectorLoop].n8MECC0); // 4 byte n8MECC0
NF_WRDATA_WORD(t8MECC[nSectorLoop].n8MECC1); // 4 byte n8MECC1
NF_WRDATA_WORD(t8MECC[nSectorLoop].n8MECC2); // 4 byte n8MECC2
NF_WRDATA_BYTE((t8MECC[nSectorLoop].n8MECC3) & 0xff); // 1 byte n8MECC3
}
s2450NAND->NFSTAT |= (1<<4); //NF_CLEAR_RB
// Finish up the write operation
NF_CMD(CMD_WRITE2); // 0x10
// Wait for RB. 促 结龙 锭 鳖瘤 扁促赴促.
NF_DETECT_RB(); // Wait tR(max 12us)
NF_CMD(CMD_STATUS); // Read status command
for(i=0;i<3;i++); //twhr=60ns
if(NF_RDDATA_BYTE() & STATUS_ERROR)
{
RETAILMSG(1, (TEXT("FMD_WriteSector() ######## Error Programming page %d!\n"), startSectorAddr));
// Disable the chip
NF_nFCE_H();
s2450NAND->NFCONF = (0<<23) | NF_TACLS(DEFAULT_TACLS) | NF_TWRPH0(DEFAULT_TWRPH0) | NF_TWRPH1(DEFAULT_TWRPH1);
SetKMode(bLastMode); // Dummy function.
return FALSE;
}
else
{
NF_nFCE_H();
s2450NAND->NFCONF = (0<<23) | NF_TACLS(DEFAULT_TACLS) | NF_TWRPH0(DEFAULT_TWRPH0) | NF_TWRPH1(DEFAULT_TWRPH1);
SetKMode(bLastMode); // Dummy function.
return TRUE;
}
/*
//============ Start of READ TEST CODE ============//
DWORD SpareDataDummy0;
DWORD SpareDataDummy1;
DWORD SpareDataDummy2;
DWORD SpareDataDummy3;
DWORD dwOffset;
DWORD dwCnt;
DWORD dwSpareAddress = 2048; //include Bad block
UINT8 tempdata[2048];
unsigned char uSctCnt = 4;
BOOL bRet = TRUE;
s2450NAND->NFCONF = ( s2450NAND->NFCONF&~(0x3<<23) ) |(2<<30)|(1<<23)|(0x7<<12)|(0x7<<8)|(0x7<<4);
s2450NAND->NFCONT = ( s2450NAND->NFCONT&~(0x1<<18) ) |(0<<18)|(0<<11)|(0<<10)|(0<<9)|(1<<6)|(1<<0); // Init NFCONT
s2450NAND->NFSTAT|= ((1<<6)|(1<<5)|(1<<4));
// NAND RESET
NF_nFCE_L();
NF_CMD(0xff);
NF_nFCE_H();
NF_MECC_Lock(); // Main ECC Lock
NF_nFCE_L();
s2450NAND->NFSTAT |= (1<<4); // RnB Clear
NF_CMD(CMD_READ);
NF_ADDR((NewDataAddr)&0xff); // 2bytes for column address
NF_ADDR((NewDataAddr>>8)&0xff);
NF_ADDR((NewSectorAddr)&0xff); // 3bytes for row address
NF_ADDR((NewSectorAddr>>8)&0xff);
NF_ADDR((NewSectorAddr>>16)&0xff);
NF_CMD(CMD_READ3);
NF_DETECT_RB();
s2450NAND->NFSTAT |= (1<<4); // RnB Clear
//READ Spare ECC Data
for(dwCnt = 0; dwCnt < uSctCnt; dwCnt++)
{
NF_MECC_Lock(); // Main ECC Lock
s2450NAND->NFSTAT |= (1<<4); // RnB Clear
if(!dwCnt)
{
NF_CMD(CMD_READ);
NF_ADDR((NewDataAddr)&0xff); // 2bytes for column address
NF_ADDR((NewDataAddr>>8)&0xff);
NF_ADDR((NewSectorAddr)&0xff); // 3bytes for row address
NF_ADDR((NewSectorAddr>>8)&0xff);
NF_ADDR((NewSectorAddr>>16)&0xff);
NF_CMD(CMD_READ3);
NF_DETECT_RB();
s2450NAND->NFSTAT |= (1<<4); // RnB Clear
}
else
{
dwOffset = dwCnt * 512;
NF_CMD(0x05);
NF_ADDR(dwOffset&0xFF);
NF_ADDR((dwOffset>>8)&0xFF);
NF_CMD(0xE0);
}
NF_MECC_UnLock(); // Main ECC Unlock
NF_RSTECC(); // Initialize ECC
//read 512byte
RdPage512(tempdata + 512*dwCnt);
dwOffset = 2048 + (dwCnt * 13);
NF_CMD(0x05);
NF_ADDR(dwOffset&0xFF);
NF_ADDR((dwOffset>>8)&0xFF);
NF_CMD(0xE0);
//read Spare ECC Data
SpareDataDummy0 = NF_RDDATA_WORD();
SpareDataDummy1 = NF_RDDATA_WORD();
SpareDataDummy2 = NF_RDDATA_WORD();
SpareDataDummy3 = NF_RDDATA_BYTE();
NF_MECC_Lock(); // Main ECC Lock
while(!(s2450NAND->NFSTAT&(1<<6))); // Check decoding done
s2450NAND->NFSTAT = s2450NAND->NFSTAT | (1<<6); // Decoding done Clear
while( s2450NAND->NF8ECCERR0 & (unsigned int)(1<<31) ) ; // 8bit ECC Decoding Busy Check.
if(CorrectECC8Data((tempdata + 512*dwCnt)))
{
return FALSE;
}
// Debug Code : Print Read Data
RETAILMSG(1, (TEXT("\r\n===================READ DATA=====================")));
for(i=0;i<512;i++)
{
if(i%16 == 0)
RETAILMSG(1, (TEXT("\r\n")));
RETAILMSG(1, (TEXT(" 0x%x "),*(tempdata+(dwCnt*SECTOR_SIZE) + i)));
}
RETAILMSG(1, (TEXT("\r\n===================================================\r\n")));
RETAILMSG(1, (TEXT("FMD_LB_WriteSector_Steploader() : Sdata : 0x%x, 0x%x, 0x%x, 0x%x\r\n")
, SpareDataDummy0
, SpareDataDummy1
, SpareDataDummy2
, SpareDataDummy3));
}
NF_nFCE_H();
s2450NAND->NFCONF = (0<<23) | NF_TACLS(DEFAULT_TACLS) | NF_TWRPH0(DEFAULT_TWRPH0) | NF_TWRPH1(DEFAULT_TWRPH1);
SetKMode(bLastMode); // Dummy function.
return TRUE;
//============ End of READ TEST CODE ============//
*/
}
BOOL FMD_SB_WriteSector_Steploader(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors, int mode)
{
DWORD i;
volatile DWORD wrdata;
int NewSpareAddr = 0x0;
int NewDataAddr = 0;
int NewSectorAddr = startSectorAddr;
MECC8 t8MECC;
//Check Parameters.
if (!pSectorBuff && !pSectorInfoBuff)
{
return(FALSE);
}
if ( dwNumSectors > 1 )
{
RETAILMSG(1, (TEXT("######## FATAL ERROR => FMD::FMD_WriteSector->dwNumsectors is bigger than 1. \r\n")));
return FALSE;
}
BOOL bLastMode = SetKMode(TRUE); // dummy function.
s2450NAND->NFCONF = (s2450NAND->NFCONF & ~(1<<30)) | (1<<23) | NF_TACLS(DEFAULT_TACLS) | NF_TWRPH0(DEFAULT_TWRPH0) | NF_TWRPH1(DEFAULT_TWRPH1);
s2450NAND->NFCONT |= (1<<18)|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9);
s2450NAND->NFSTAT |= ((1<<6)|(1<<5)|(1<<4));
// Enable Chip
NF_nFCE_L(); // NFCONT狼 [1]甫 0栏肺 努府绢 ... Force nFCE to low
// Issue command
NF_CMD(CMD_WRITE); //0x80
// Setup address to write Main data
NF_ADDR(0x0); // 1bytes for column address
NF_ADDR((NewSectorAddr)&0xff); // 3bytes for row address
NF_ADDR((NewSectorAddr>>8)&0xff);
NF_ADDR((NewSectorAddr>>16)&0xff);
// initialize variable.
t8MECC.n8MECC0 = 0x0;
t8MECC.n8MECC1 = 0x0;
t8MECC.n8MECC2 = 0x0;
t8MECC.n8MECC3 = 0x0;
// Write each Sector in the Page.
// Initialize ECC register
NF_MECC_UnLock();
NF_RSTECC();
// Special case to handle un-aligned buffer pointer.
if( ((DWORD) pSectorBuff) & 0x3)
{
// Write the data
for(i=0; i<SECTOR_SIZE/sizeof(DWORD); i++)
{
wrdata = (pSectorBuff)[i*4+0];
wrdata |= (pSectorBuff)[i*4+1]<<8;
wrdata |= (pSectorBuff)[i*4+2]<<16;
wrdata |= (pSectorBuff)[i*4+3]<<24;
NF_WRDATA_WORD(wrdata);
}
}
else
{
WrPage512(pSectorBuff);
}
NF_MECC_Lock();
while(!(s2450NAND->NFSTAT&(1<<7))) ;
s2450NAND->NFSTAT|=(1<<7);
// Read out the ECC value generated by HW
t8MECC.n8MECC0 = NF_8MECC0();
t8MECC.n8MECC1 = NF_8MECC1();
t8MECC.n8MECC2 = NF_8MECC2();
t8MECC.n8MECC3 = (NF_8MECC3() & 0xff);
/* //Debug Code :: Print Write Data
RETAILMSG(1, (TEXT("\r\n===================WRITE DATA=====================")));
for(i=0;i<512;i++)
{
if(i%16 == 0)
RETAILMSG(1, (TEXT("\r\n")));
RETAILMSG(1, (TEXT(" 0x%x "),*(pSectorBuff+i)));
}
RETAILMSG(1, (TEXT("\r\n===================================================\r\n")));
RETAILMSG(1, (TEXT("FMD_SB_WriteSector_Steploader() : Sdata : 0x%x, 0x%x, 0x%x, 0x%x\r\n")
, t8MECC.n8MECC0
, t8MECC.n8MECC1
, t8MECC.n8MECC2
, t8MECC.n8MECC3));
*/
NF_WRDATA_WORD(t8MECC.n8MECC0); // 4 byte n8MECC0
NF_WRDATA_WORD(t8MECC.n8MECC1); // 4 byte n8MECC1
NF_WRDATA_WORD(t8MECC.n8MECC2); // 4 byte n8MECC2
NF_WRDATA_BYTE((t8MECC.n8MECC3) & 0xff); // 1 byte n8MECC3
s2450NAND->NFSTAT |= (1<<4); //NF_CLEAR_RB
// Finish up the write operation
NF_CMD(CMD_WRITE2); // 0x10
// Wait for RB. 促 结龙 锭 鳖瘤 扁促赴促.
NF_DETECT_RB(); // Wait tR(max 12us)
NF_CMD(CMD_STATUS); // Read status command
for(i=0;i<3;i++); //twhr=60ns
if(NF_RDDATA_BYTE() & STATUS_ERROR)
{
RETAILMSG(1, (TEXT("FMD_WriteSector() ######## Error Programming page %d!\n"), startSectorAddr));
// Disable the chip
NF_nFCE_H();
s2450NAND->NFCONF = (0<<23) | NF_TACLS(DEFAULT_TACLS) | NF_TWRPH0(DEFAULT_TWRPH0) | NF_TWRPH1(DEFAULT_TWRPH1);
SetKMode(bLastMode); // Dummy function.
return FALSE;
}
else
{
NF_nFCE_H();
s2450NAND->NFCONF = (0<<23) | NF_TACLS(DEFAULT_TACLS) | NF_TWRPH0(DEFAULT_TWRPH0) | NF_TWRPH1(DEFAULT_TWRPH1);
SetKMode(bLastMode); // Dummy function.
return TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -