📄 nand_test.c
字号:
void NANDT_SLCSpareECC_All(void)
{
u32 i, j, uBlock, uPage, uError, uErrorType, uFirstEccPos=0;
u8 aBuffer[NAND_PAGE_MAX];
u8 aSpareBuffer[NAND_SPARE_MAX];
NAND_eERROR eError;
u8 aReadBuffer[NAND_PAGE_MAX];
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;
printf("\n");
printf("The all bit ecc check of [%d Block:%dPage] Spare Area\n", uBlock, uPage);
printf("\n");
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;
// The first ECC data byte position
uFirstEccPos = 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;
// The first ECC data byte position
uFirstEccPos = 1;
}
NAND_Inform[g_NandContNum].uECCtest = 1;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 1;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
// uBlock+1[Block] Erase & Write to generate the accurate ECC code(aNand_Spare_Data_Temp[i])
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
eError = NAND_WritePage(g_NandContNum, uBlock, 0, aBuffer, aSpareBuffer); // write to 0th page, ECC generation
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
NAND_Inform[g_NandContNum].uSpareECCtest = 1;
// Test Start......!!
for(j=0 ; j<4 ; j++) // Main ECC Data : 4 Bytes
{
for(i=0 ; i<8 ; i++) // 8bit
{
if(uErrorType == NAND_ECCERR_1BIT)
{
printf("Spare [%d byte : %d bit] Test\n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1);
}
else if(uErrorType == NAND_ECCERR_MULTI)
{
printf("Spare[%d byte : %d bit] & [%d byte : %d bit] Test\n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1,
NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2);
}
// Erase Block for test
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
// Write the invalid data to page( uBlock[block] 1[page] )
eError = NAND_WritePageWithInvalidSpareData(g_NandContNum, uBlock, uPage, aBuffer, uErrorType);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
// Read the invalid data to detect the ECC error
eError = NAND_ReadPage(g_NandContNum, uBlock, uPage, aReadBuffer, aSpareBuffer);
NANDT_PrintErrorType(eError);
if(uErrorType == NAND_ECCERR_1BIT)
{
if( (NAND_EccError.uEccErrByte1 != (aNANDT_EccError[0][0]+uFirstEccPos)) || (NAND_EccError.uEccErrBit1 != aNANDT_EccError[0][1]) )
{
printf("Ecc Error Check Error[%d byte:%d bit] != [%d byte:%d bit] \n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1,
aNANDT_EccError[0][0], aNANDT_EccError[0][1]);
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
}
else if(uErrorType == NAND_ECCERR_MULTI)
{
if( aNANDT_EccError[0][0] != NAND_ECC_MULTI_ERROR)
{
printf("Multi Ecc Error Check Error\n");
aNANDT_EccError[0][0] = 0;
getchar();
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
return;
}
aNANDT_EccError[0][0] = 0;
}
NAND_EccError.uEccErrBit1++;
NAND_EccError.uEccErrBit2++;
}
NAND_EccError.uEccErrBit1 = 0;
NAND_EccError.uEccErrBit2 = 0;
NAND_EccError.uEccErrByte1++;
if(NAND_Inform[g_NandContNum].uNandType == NAND_Normal8bit)
{
NAND_EccError.uEccErrByte2 = (NAND_EccError.uEccErrByte1+1)%4;
}
else if(NAND_Inform[g_NandContNum].uNandType == NAND_Advanced8bit)
{
NAND_EccError.uEccErrByte2 = (NAND_EccError.uEccErrByte1%4) + 1;
}
}
NAND_EccError.uEccErrByte1 = 0;
NAND_EccError.uEccErrByte2 = 0;
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
NAND_Inform[g_NandContNum].uSpareECCtest = 0;
printf("SLC Nand ECC test complete\n");
printf("\n");
}
//////////
// Function Name : NANDT_MLCECC_All
// Function Description : This function checks the ECC operation (all bit of MLC Nand Device 1page)
// Input : None
// Output : None
void NANDT_MLCECC_All(void)
{
u32 i, j, k, l, m, uExceptCnt, 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;
uExceptCnt = 0;
break;
case 2 : uErrorType = NAND_ECCERR_2BIT;
uExceptCnt = 1;
break;
case 3 : uErrorType = NAND_ECCERR_3BIT;
uExceptCnt = 2;
break;
case 4 : uErrorType = NAND_ECCERR_4BIT;
uExceptCnt = 3;
break;
case 5 : uErrorType = NAND_ECCERR_UNCORRECT;
uExceptCnt = 4;
break;
default : uErrorType = NAND_ECCERR_1BIT;
uExceptCnt = 0;
break;
}
uPage = 0;
srand(1);
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;
printf("\n");
printf("The all bit ecc check of %dBlock:%dPage\n", uBlock, uPage);
printf("\n");
NAND_EccError.uEccErrByte1 = 0;
NAND_EccError.uEccErrBit1 =0; // Bit Pattern not Bit Position
NAND_EccError.uEccErrByte2 = (NAND_EccError.uEccErrByte1+1);//%NAND_MLC_TRANS_SIZE;//NAND_Inform[g_NandContNum].uPageSize;
NAND_EccError.uEccErrBit2 = 0;
NAND_EccError.uEccErrByte3 = (NAND_EccError.uEccErrByte2+1);//%NAND_MLC_TRANS_SIZE;//NAND_Inform[g_NandContNum].uPageSize;
NAND_EccError.uEccErrBit3 = 0;
NAND_EccError.uEccErrByte4 = (NAND_EccError.uEccErrByte3+1);//%NAND_MLC_TRANS_SIZE;//NAND_Inform[g_NandContNum].uPageSize;
NAND_EccError.uEccErrBit4 = 0;
NAND_EccError.uEccErrByte5 = (NAND_EccError.uEccErrByte4+1);//%NAND_MLC_TRANS_SIZE;//NAND_Inform[g_NandContNum].uPageSize;
NAND_EccError.uEccErrBit5 = 0;
NAND_Inform[g_NandContNum].uECCtest = 1;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 1;
// Erase Block for test
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
return;
}
// Write the valid data to page 0 ( uBlock[block] 0[page] )
printf("Write the valid data to page 0 ( %d[block] %d[page] )\n", uBlock, uPage);
NAND_Inform[g_NandContNum].uECCtest = 1;
eError = NAND_WritePage(g_NandContNum, uBlock, uPage, aBuffer, aSpareBuffer);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
return;
}
// Test Start......!!
for(k=0 ; k<4 ; k++)
{
NAND_Inform[g_NandContNum].uMLCECCPageWriteSector = k;
for(j=0 ; j<(NAND_MLC_TRANS_SIZE+NAND_MLC_ECC_SIZE-uExceptCnt) ; j++)
{
for(i=0 ; i<8 ; i++)
{
if(uErrorType == NAND_ECCERR_1BIT)
{
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = j; // for generate the ECC Error in the MLC Spare Area
printf("[%d byte : %d bit]\n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1);
}
else if(uErrorType == NAND_ECCERR_2BIT)
{
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = j;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] + 1;
printf("[%d byte : %d bit] & [%d byte : %d bit] \n", NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1,
NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2);
}
else if(uErrorType == NAND_ECCERR_3BIT)
{
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = j;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] + 1;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] + 1;
printf("[%d byte : %d bit] & [%d byte : %d bit] & [%d byte : %d bit]\n",
NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1,
NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2,
NAND_EccError.uEccErrByte3, NAND_EccError.uEccErrBit3);
}
else if(uErrorType == NAND_ECCERR_4BIT)
{
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = j;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] + 1;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] + 1;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[3] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] + 1;
printf("[%d byte : %d bit] & [%d byte : %d bit] & [%d byte : %d bit] & [%d byte : %d bit]\n",
NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1,
NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2,
NAND_EccError.uEccErrByte3, NAND_EccError.uEccErrBit3,
NAND_EccError.uEccErrByte4, NAND_EccError.uEccErrBit4);
}
else if(uErrorType == NAND_ECCERR_UNCORRECT)
{
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] = j;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[0] + 1;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[1] + 1;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[3] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[2] + 1;
NAND_Inform[g_NandContNum].uMLCECCErrBytePos[4] = NAND_Inform[g_NandContNum].uMLCECCErrBytePos[3] + 1;
printf("[%d byte : %d bit] & [%d byte : %d bit] & [%d byte : %d bit] & [%d byte : %d bit] & [%d byte : %d bit]\n",
NAND_EccError.uEccErrByte1, NAND_EccError.uEccErrBit1,
NAND_EccError.uEccErrByte2, NAND_EccError.uEccErrBit2,
NAND_EccError.uEccErrByte3, NAND_EccError.uEccErrBit3,
NAND_EccError.uEccErrByte4, NAND_EccError.uEccErrBit4,
NAND_EccError.uEccErrByte5, NAND_EccError.uEccErrBit5);
}
// Erase Block for test
eError = NAND_EraseSingleBlock(g_NandContNum, uBlock);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
return;
}
// Write the invalid data to page( uBlock[block] 1[page] )
eError = NAND_WritePageWithInvalidData(g_NandContNum, uBlock, uPage, aBuffer, uErrorType);
if(eError != eNAND_NoError)
{
NANDT_PrintErrorType(eError);
NAND_Inform[g_NandContNum].uECCtest = 0;
NAND_Inform[g_NandContNum].uAllBitEccCheck = 0;
return;
}
// Read the invalid data to detect the ECC error
eError = NAND_ReadPage(g_NandContNum, uBlock, uPage, aReadBuffer, aSpareBuffer);
NANDT_PrintErrorType(eError);
if(uErrorType == NAND_ECCERR_1BIT)
{
if( (NAND_EccError.uEccErrByte1 != aNANDT_EccError[0][0]) || (NAND_EccError.u
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -