📄 nand_test.c
字号:
printf("[NANDT_SLCECC]\n");
if(NAND_Inform[g_NandContNum].uNandType == NAND_MLC8bit)
{
printf("The current Nand Memory is MLC type.....!!\n\n");
return;
}
printf("Input the Block Number to test[0~%d]", NAND_Inform[g_NandContNum].uBlockNum-1);
uBlock = GetIntNum();
printf("Input the Page Number to test[0~%d]", NAND_Inform[g_NandContNum].uPageNum-1);
uPage = GetIntNum();
printf("Input the ECC Error Type\n");
printf("1: 1bit error(D), 2: multiple error\n");
uError = GetIntNum();
switch(uError)
{
case 1 : uErrorType = NAND_ECCERR_1BIT;
break;
case 2 : uErrorType = NAND_ECCERR_MULTI;
break;
default : uErrorType = NAND_ECCERR_1BIT;
break;
}
srand(0);
for(i=0 ; i<NAND_Inform[g_NandContNum].uPageSize ; i++)
{
aBuffer[i] = rand()%0xFF;
}
for(i=0 ; i<NAND_Inform[g_NandContNum].uSpareSize ; i++)
aSpareBuffer[i] = 0xFF;
NAND_EccError.uEccErrByte1 = 100;
NAND_EccError.uEccErrBit1 = 0;
NAND_EccError.uEccErrByte2 = 200;
NAND_EccError.uEccErrBit2 = 0;
printf("\n");
printf("The specific bit ecc check : [%dByte : %dBit]\n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1);
if(uErrorType == NAND_ECCERR_MULTI)
printf("The specific bit ecc check : [%dByte : %dBit]\n", NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2);
printf("\n");
// Erase Block for test
printf("Erase the block ( %d[block] )\n", uBlock);
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
return;
}
NAND_Inform[g_NandContNum].uECCtest = 1;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
// Write the valid data to page 0 ( uBlock[block] 0[page] ) ...for ECC generation
printf("Write the valid data to page ( %d[block] %d[page] )\n", uBlock, uPage);
eError = NAND_WritePage(g_NandContNum, uBlock, uPage, aBuffer, aSpareBuffer);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
return;
}
// Erase Block for test
printf("Erase the block ( %d[block] )\n", uBlock);
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
return;
}
//uPage++;
// Write the invalid data to page( uBlock[block] 1[page] )....with Invalid Main Data0
printf("Write the invalid data to page ( %d[block] %d[page] )\n", uBlock, uPage);
eError = NAND_WritePageWithInvalidData(g_NandContNum, uBlock, uPage, aBuffer, uErrorType);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
return;
}
// Read the invalid data to detect the ECC error
printf("Read the invalid data to page ( %d[block] %d[page] )\n", uBlock, uPage);
eError = NAND_ReadPage(g_NandContNum, uBlock, uPage, aBuffer, aSpareBuffer);
printf("\n");
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
}
NAND_Inform[g_NandContNum].uECCtest = 0;
printf("SLC Nand ECC test complete\n");
printf("\n");
}
//////////
// Function Name : NANDT_SLCSpareECC
// Function Description : SLC Spare ECC function test
// Input : None
// Output : None
void NANDT_SLCSpareECC(void)
{
u32 i, uBlock, uPage, uError, uErrorType;
u8 aBuffer[NAND_PAGE_MAX];
u8 aSpareBuffer[NAND_SPARE_MAX];
NAND_eERROR eError;
printf("[NANDT_SLCSpareECC]\n");
if(NAND_Inform[g_NandContNum].uNandType == NAND_MLC8bit)
{
printf("The current Nand Memory is MLC type.....!!\n\n");
return;
}
printf("Input the Block Number to test[0~%d]", NAND_Inform[g_NandContNum].uBlockNum-1);
uBlock = GetIntNum();
printf("Input the Page Number to test[0~%d]", NAND_Inform[g_NandContNum].uPageNum-1);
uPage = GetIntNum();
printf("Input the ECC Error Type\n");
printf("1: 1bit error(D), 2: multiple error\n");
uError = GetIntNum();
switch(uError)
{
case 1 : uErrorType = NAND_ECCERR_1BIT;
break;
case 2 : uErrorType = NAND_ECCERR_MULTI;
break;
default : uErrorType = NAND_ECCERR_1BIT;
break;
}
srand(0);
for(i=0 ; i<NAND_Inform[g_NandContNum].uPageSize ; i++)
{
aBuffer[i] = rand()%0xFF;
}
for(i=0 ; i<NAND_Inform[g_NandContNum].uSpareSize ; i++)
aSpareBuffer[i] = 0xFF;
if(NAND_Inform[g_NandContNum].uNandType == NAND_Normal8bit)
{
// Spare Area 0~3 byte : Main ECC Value
// Spare Area 8~9 byte : Spare ECC Value
NAND_EccError.uEccErrByte1 = 0;
NAND_EccError.uEccErrBit1 = 0;
NAND_EccError.uEccErrByte2 = (NAND_EccError.uEccErrByte1+1)%4;
NAND_EccError.uEccErrBit2 = 0;
}
else if(NAND_Inform[g_NandContNum].uNandType == NAND_Advanced8bit)
{
// Spare Area 1~4 byte : Main ECC Value
// Spare Area 8~9 byte : Spare ECC Value
NAND_EccError.uEccErrByte1 = 1;
NAND_EccError.uEccErrBit1 = 0;
NAND_EccError.uEccErrByte2 = (NAND_EccError.uEccErrByte1%4) + 1;
NAND_EccError.uEccErrBit2 = 0;
}
printf("\n");
printf("The specific bit ecc check : [%dByte : %dBit]\n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1);
if(uErrorType == NAND_ECCERR_MULTI)
printf("The specific bit ecc check : [%dByte : %dBit]\n", NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2);
printf("\n");
// Erase Block for test
printf("Erase the block ( %d[block] )\n", uBlock);
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
return;
}
NAND_Inform[g_NandContNum].uECCtest = 1;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 1;
// Write the valid data to page 0 ( uBlock[block] 0[page] )
printf("Write the valid data to page ( %d[block] %d[page] )\n", uBlock, uPage);
eError = NAND_WritePage(g_NandContNum, uBlock, uPage, aBuffer, aSpareBuffer);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
printf("Erase the block ( %d[block] )\n", uBlock);
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
// Write the invalid data to page( uBlock[block] 1[page] )
printf("Write the invalid data to page ( %d[block] %d[page] )\n", uBlock, uPage);
eError = NAND_WritePageWithInvalidSpareData(g_NandContNum, uBlock, uPage, aBuffer, uErrorType);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
// Read the invalid data to detect the ECC error
printf("Read the invalid data to page ( %d[block] %d[page] )\n", uBlock, uPage);
eError = NAND_ReadPage(g_NandContNum, uBlock, uPage, aBuffer, aSpareBuffer);
printf("\n");
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
}
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
printf("SLC Nand ECC test complete\n");
printf("\n");
}
//////////
// Function Name : NANDT_MLCECC
// Function Description : MLC ECC function test
// Input : None
// Output : None
void NANDT_MLCECC(void)
{
u32 i, m, n, uBlock, uPage, uError, uErrorType;
u8 aBuffer[NAND_PAGE_MAX];
u8 aSpareBuffer[NAND_SPARE_MAX];
u8 aReadBuffer[NAND_PAGE_MAX];
NAND_eERROR eError;
printf("[NANDT_MLCECC_All]\n");
if(NAND_Inform[g_NandContNum].uNandType != NAND_MLC8bit)
{
printf("The current Nand Memory is not MLC type.....!!\n\n");
return;
}
printf("Input the Block Number to test[0~%d]", NAND_Inform[g_NandContNum].uBlockNum-1);
uBlock = GetIntNum();
printf("Input the Page Number to test[0~%d]", NAND_Inform[g_NandContNum].uPageNum-1);
uPage = GetIntNum();
printf("Input the ECC Error Type\n");
printf("1: 1bit error(D), 2: 2bit error, 3: 3bit error, 4: 4bit error, 5: Uncorrectable\n");
uError = GetIntNum();
switch(uError)
{
case 1 : uErrorType = NAND_ECCERR_1BIT;
printf("Input the First Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte1 = GetIntNum()%2076;
printf("Input the First Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit1 = GetIntNum()%8;
NAND_Inform[g_NandContNum].uMLCECCPageWriteSector =
NAND_EccError.uEccErrByte1/(NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE);
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = NAND_EccError.uEccErrByte1 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
break;
case 2 : uErrorType = NAND_ECCERR_2BIT;
printf("Input the First Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte1 = GetIntNum()%2076;
printf("Input the First Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit1 = GetIntNum()%8;
printf("Input the Second Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte2 = GetIntNum()%2076;
printf("Input the Second Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit2 = GetIntNum()%8;
NAND_Inform[g_NandContNum].uMLCECCPageWriteSector =
NAND_EccError.uEccErrByte1/(NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE);
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = NAND_EccError.uEccErrByte1 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_EccError.uEccErrByte2 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
break;
case 3 : uErrorType = NAND_ECCERR_3BIT;
printf("Input the First Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte1 = GetIntNum()%2076;
printf("Input the First Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit1 = GetIntNum()%8;
printf("Input the Second Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte2 = GetIntNum()%2076;
printf("Input the SecondBit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit2 = GetIntNum()%8;
printf("Input the Third Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte3 = GetIntNum()%2076;
printf("Input the Third Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit3 = GetIntNum()%8;
NAND_Inform[g_NandContNum].uMLCECCPageWriteSector =
NAND_EccError.uEccErrByte1/(NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE);
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = NAND_EccError.uEccErrByte1 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_EccError.uEccErrByte2 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] = NAND_EccError.uEccErrByte3 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
break;
case 4 : uErrorType = NAND_ECCERR_4BIT;
printf("Input the First Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte1 = GetIntNum()%2076;
printf("Input the First Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit1 = GetIntNum()%8;
printf("Input the Second Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte2 = GetIntNum()%2076;
printf("Input the SecondBit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit2 = GetIntNum()%8;
printf("Input the Third Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte3 = GetIntNum()%2076;
printf("Input the Third Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit3 = GetIntNum()%8;
printf("Input the Fourth Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte4 = GetIntNum()%2076;
printf("Input the Fourth Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit4 = GetIntNum()%8;
NAND_Inform[g_NandContNum].uMLCECCPageWriteSector =
NAND_EccError.uEccErrByte1/(NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE);
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = NAND_EccError.uEccErrByte1 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_EccError.uEccErrByte2 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] = NAND_EccError.uEccErrByte3 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[3] = NAND_EccError.uEccErrByte4 -
(NAND_Inform[g_NandContNum].uMLCECCPageWriteSector * (NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE));
break;
case 5 : uErrorType = NAND_ECCERR_UNCORRECT;
printf("Input the First Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte1 = GetIntNum()%2076;
printf("Input the First Bit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit1 = GetIntNum()%8;
printf("Input the Second Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte2 = GetIntNum()%2076;
printf("Input the SecondBit Postion[0 ~ 7]");
NAND_EccError.uEccErrBit2 = GetIntNum()%8;
printf("Input the Third Byte Postion[0 ~ 2075]");
NAND_EccError.uEccErrByte3 = GetIntNum()%2076;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -