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

📄 nand_test.c

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