⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand_test.c

📁 s3c6410基于USB OTG下载内核至NORFLASH的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	
	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 + -