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

📄 nand_test.c

📁 s3c6410基于USB OTG下载内核至NORFLASH的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6410 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6410.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : nand_test.c
*  
*	File Description : This file implements the functons for Nand controller test.
*
*	Author : Heemyung.noh
*	Dept. : AP Development Team
*	Created Date : 2006/12/05
*	Version : 0.1 
* 
*	History
*	- Created(Heemyung.noh 2006/12/05)
*  
**************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "def.h"
#include "option.h"
#include "library.h"
#include "sfr6410.h"
#include "system.h"
#include "sysc.h"
#include "nand.h"
#include "timer.h"

//The all bit ecc check of 1page
#define NAND_SLCECC_ALLBIT_CHECK	(TRUE)
#define NAND_ECC_MULTI_ERROR			(0xFFFFFFFF)
#define NAND_ECC_UNCORRECT_ERROR		(0xFFFFFFFF)

extern NAND_oInform	NAND_Inform[NAND_CONNUM];
extern NAND_oEccError NAND_EccError;
u32 g_NandContNum;

static u32 aNANDT_EccError[4][2];		// 4bit error, byte pos & bit pos

//////////
// Function Name : NANDT_PrintErrorType
// Function Description : Print NAND Error Type
// Input : 	eError - Nand Error enumeration variable
// Output :    	None
void NANDT_PrintErrorType(NAND_eERROR eError)
{
	u32 uEccErr0, uEccErr1, uEccErr2;
	
	if(eError & eNAND_1bitEccError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 0)
			printf("NAND Error : Main 1 bit ECC Error\n");
		
		NAND_SeekECCErrorPosition(g_NandContNum, &uEccErr0, &uEccErr1, &uEccErr2);

		if(NAND_Inform[g_NandContNum].uNandType == NAND_MLC8bit)
		{
			if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			{
				aNANDT_EccError[0][0] = (uEccErr0&0x3FF)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[0][1] = GetBitPosition(uEccErr2&0xFF);
			}
			else
			{
				printf("1st Byte Position : %d\n", (uEccErr0&0x3FF));
				printf("1st Bit Pattern : 0x%02x\n", (uEccErr2&0xFF));
			}
		}
		else
		{
			if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			{
				aNANDT_EccError[0][0] = (uEccErr0&(0x7FF<<7))>>7;
				aNANDT_EccError[0][1] = (uEccErr0&(0x7<<4))>>4;
			}
			else
			{
				printf("1st Byte Position : %d\n", (uEccErr0&(0x7FF<<7))>>7);
				printf("1st Bit Position : %d\n", (uEccErr0&(0x7<<4))>>4);
			}
		}
	}
	if(eError & eNAND_2bitEccError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 0)
			printf("NAND Error : Main 2 bit ECC Error\n");
		
		NAND_SeekECCErrorPosition(g_NandContNum, &uEccErr0, &uEccErr1, &uEccErr2);

		if(NAND_Inform[g_NandContNum].uNandType == NAND_MLC8bit)
		{
			if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			{
				aNANDT_EccError[1][0] = (uEccErr0&0x3FF)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[1][1] = GetBitPosition(uEccErr2&0xFF);
				aNANDT_EccError[0][0] = ((uEccErr0&(0x3FF<<16))>>16)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[0][1] = GetBitPosition((uEccErr2&(0xFF<<8))>>8);
			}
			else
			{
				printf("1st Byte Position : %d\n", (uEccErr0&0x3FF));
				printf("1st Bit Pattern : 0x%02x\n", (uEccErr2&0xFF));
				printf("2nd Byte Position : %d\n", (uEccErr0&(0x3FF<<16))>>16);
				printf("2nd Bit Pattern : 0x%02x\n", (uEccErr2&(0xFF<<8))>>8);			
			}
		}
	}	
	if(eError & eNAND_3bitEccError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 0)
			printf("NAND Error : Main 3 bit ECC Error\n");
		NAND_SeekECCErrorPosition(g_NandContNum, &uEccErr0, &uEccErr1, &uEccErr2);

		if(NAND_Inform[g_NandContNum].uNandType == NAND_MLC8bit)
		{
			if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			{
				aNANDT_EccError[2][0] = (uEccErr0&0x3FF)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[2][1] = GetBitPosition(uEccErr2&0xFF);
				aNANDT_EccError[1][0] = ((uEccErr0&(0x3FF<<16))>>16)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[1][1] = GetBitPosition(((uEccErr2&(0xFF<<8))>>8));
				aNANDT_EccError[0][0] = (uEccErr1&0x3FF)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[0][1] = GetBitPosition((uEccErr2&(0xFF<<16))>>16);
			}
			else
			{
				printf("1st Byte Position : %d\n", (uEccErr0&0x3FF));
				printf("1st Bit Pattern : 0x%02x\n", (uEccErr2&0xFF));
				printf("2nd Byte Position : %d\n", (uEccErr0&(0x3FF<<16))>>16);
				printf("2nd Bit Pattern : 0x%02x\n", (uEccErr2&(0xFF<<8))>>8);		
				printf("3rd Byte Position : %d\n", (uEccErr1&0x3FF));
				printf("3rd Bit Pattern : 0x%02x\n", (uEccErr2&(0xFF<<16))>>16);		
			}
		}
	}	
	if(eError & eNAND_4bitEccError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 0)
			printf("NAND Error : Main 4 bit ECC Error\n");
		NAND_SeekECCErrorPosition(g_NandContNum, &uEccErr0, &uEccErr1, &uEccErr2);

		if(NAND_Inform[g_NandContNum].uNandType == NAND_MLC8bit)
		{
			if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			{
				aNANDT_EccError[3][0] = (uEccErr0&0x3FF)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[3][1] = GetBitPosition(uEccErr2&0xFF);
				aNANDT_EccError[2][0] = ((uEccErr0&(0x3FF<<16))>>16)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[2][1] = GetBitPosition(((uEccErr2&(0xFF<<8))>>8));
				aNANDT_EccError[1][0] = (uEccErr1&0x3FF)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[1][1] = GetBitPosition((uEccErr2&(0xFF<<16))>>16);
				aNANDT_EccError[0][0] = ((uEccErr1&(0x3FF<<16))>>16)+(NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_TRANS_SIZE)
														+ (NAND_Inform[g_NandContNum].uMLCECCPageReadSector*NAND_MLC_ECC_SIZE);
				aNANDT_EccError[0][1] = GetBitPosition((uEccErr2&(u32)(0xFF<<24))>>24);
			}
			else
			{		
				printf("1st Byte Position : %d\n", (uEccErr0&0x3FF));
				printf("1st Bit Pattern : 0x%02x\n", (uEccErr2&0xFF));
				printf("2nd Byte Position : %d\n", (uEccErr0&(0x3FF<<16))>>16);
				printf("2nd Bit Pattern : 0x%02x\n", (uEccErr2&(0xFF<<8))>>8);		
				printf("3rd Byte Position : %d\n", (uEccErr1&0x3FF));
				printf("3rd Bit Pattern : 0x%02x\n", (uEccErr2&(0xFF<<16))>>16);	
				printf("4th Byte Position : %d\n", (uEccErr1&(0x3FF<<16))>>16);
				printf("4th Bit Pattern : 0x%02x\n", (uEccErr2&(u32)(0xFF<<24))>>24);
			}
		}
	}	
	if(eError & eNAND_MultiError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			aNANDT_EccError[0][0] = NAND_ECC_MULTI_ERROR;
		else
			printf("NAND Error : Main Multiple ECC Error\n");
	}
	if(eError & eNAND_EccAreaError)
		printf("NAND Error : Main ECC Area Error\n");
	if(eError & eNAND_UncorrectableError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			aNANDT_EccError[0][0] = NAND_ECC_UNCORRECT_ERROR;
		else	
			printf("NAND Error : Main Uncorrectable ECC Error\n");
	}
	if(eError & eNAND_EtcError)
		printf("NAND Error : Etc Error\n");
	if(eError & eNAND_Spare1bitEccError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 0)
			printf("NAND Error : Spare 1 bit ECC Error\n");

		NAND_SeekECCErrorPosition(g_NandContNum, &uEccErr0, &uEccErr1, &uEccErr2);

		if((NAND_Inform[g_NandContNum].uNandType == NAND_Normal8bit) || (NAND_Inform[g_NandContNum].uNandType == NAND_Advanced8bit))
		{
			if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			{
				aNANDT_EccError[0][0] = (uEccErr0&(0xF<<21))>>21;
				aNANDT_EccError[0][1] = (uEccErr0&(0x7<<18))>>18;
			}
			else
			{
				printf("1st Byte Position : %d\n", (uEccErr0&(0xF<<21))>>21);
				printf("1st Bit Position : %d\n", (uEccErr0&(0x7<<18))>>18);
			}	
		}
	}
	
	if(eError & eNAND_SpareMultiError)
	{
		if(NAND_Inform[g_NandContNum].uAllBitEccCheck == 1)
			aNANDT_EccError[0][0] = NAND_ECC_MULTI_ERROR;
		else
			printf("NAND Error : Spare Multiple ECC Error\n");
	}
	
	if(eError & eNAND_SpareEccAreaError)
		printf("NAND Error : Spare ECC Area Error\n");
	if(eError & eNAND_ProgramError)
		printf("NAND Error : Program Error\n");
	if(eError & eNAND_EraseError)
		printf("NAND Error : Erase Error\n");
	if(eError & eNAND_InvalidBlock)
		printf("NAND Error : Invalid Block\n");
}


//////////
// Function Name : NANDT_ReadID
// Function Description : Print NAND Memory Device ID
// Input : 	None
// Output : 	None
void NANDT_ReadID(void)
{
	u32 usId;
	u8 ucMaker, ucDevice, ucThirdByte, ucFourthByte ;

	printf("[NANDT_ReadID]\n");

	usId = NAND_ReadID(g_NandContNum);
	
	ucMaker = (u8)usId;
	ucDevice = (u8)(usId>>8);
	ucThirdByte = (u8)(usId>>16);
	ucFourthByte = (u8)(usId>>24);
	
	printf("Maker:0x%02x, Device:0x%02x\n", ucMaker, ucDevice);
	printf("ucThirdByte:0x%02x, ucFourthByte:0x%02x\n\n", ucThirdByte, ucFourthByte);
}


//////////
// Function Name : NANDT_Reset
// Function Description : generate the NAND Reset
// Input : 	None
// Output : 	None
void NANDT_Reset(void)
{
	printf("[NANDT_Reset]\n");
	
	printf("Measure the RESET Operation timing\n");

	NAND_Reset(g_NandContNum);

	printf("RESET generation complete\n\n");
}


//////////
// Function Name : NANDT_CheckInvalidBlock
// Function Description : Check the Invalid Block of NAND
// Input : 	None
// Output : 	None
void NANDT_CheckInvalidBlock(void)
{
	u32 uBlock;
	NAND_eERROR eError;
	
	printf("[NANDT_CheckInvalidBlock]\n");

	for(uBlock=0 ; uBlock<NAND_Inform[g_NandContNum].uBlockNum ; uBlock++) //  Read [spre area of first page] per Block number(0~2047)
	{
		eError = NAND_CheckInvalidBlock(g_NandContNum, uBlock);   // Print bad block

		if(eError != eNAND_NoError)
		{
			NANDT_PrintErrorType(eError);
			printf("Bad Block Number : %d\n", uBlock);
		}
	}

	printf("\n");
	printf("[NAND Flash bad block check complete..!!]\n\n");
}

//////////
// Function Name : NANDT_ReadPage
// Function Description : Read 1 page data
// Input : 	None
// Output : 	None
void NANDT_ReadPage(void)
{
	u32 i, uBlock, uPage;
	u8 aBuffer[NAND_PAGE_MAX];
	u8 aSpareBuffer[NAND_SPARE_MAX];
	NAND_eERROR eError;

	printf("[NANDT_ReadPage]\n");
	
	for(i=0 ; i<NAND_Inform[g_NandContNum].uPageSize ; i++)
		aBuffer[i] = 0;
	for(i=0 ; i<NAND_Inform[g_NandContNum].uSpareSize ; i++)
		aSpareBuffer[i] = 0xFF;
	
	printf("Input the Block Number to read[0~%d]", NAND_Inform[g_NandContNum].uBlockNum-1);
	uBlock = GetIntNum();
	printf("Input the Page Number to read[0~%d]", NAND_Inform[g_NandContNum].uPageNum-1);
	uPage = GetIntNum();
	printf("\n");

	eError = NAND_ReadPage(g_NandContNum, uBlock, uPage, aBuffer, aSpareBuffer);

	if(eError != eNAND_NoError)
	{
		NANDT_PrintErrorType(eError);
		printf("Read page Error [%d block  %d page]\n", uBlock, uPage);
		getchar();
	}
	//else
	{
		printf("[Main Area]");
		for(i=0 ; i<NAND_Inform[g_NandContNum].uPageSize ; i++)
		{
			if(i%16==0)
	    			printf("\n%04xh:",i);
			
        		printf("%02x ", aBuffer[i]);
		}
		printf("\n");

		printf("[Spare Area]");
		for(i=0 ; i<NAND_Inform[g_NandContNum].uSpareSize ; i++)
		{
			if(i%16==0)
	    			printf("\n%04xh:",i);
			
        		printf("%02x ", aSpareBuffer[i]);
		}
		printf("\n\n");
		
		printf("NAND Read Page : Success\n");
	}
	printf("\n");	
}


//////////
// Function Name : NANDT_WritePage
// Function Description : Write 1 page data
// Input : 	None
// Output : 	None
void NANDT_WritePage(void)
{
	u32 i, uBlock, uPage;
	u8 uOffset;
	u8 aBuffer[NAND_PAGE_MAX];
	u8 aSpareBuffer[NAND_SPARE_MAX];	
	NAND_eERROR eError;

	printf("[NANDT_WritePage]\n");
	
	printf("Input the Block Number to write[0~%d] : ", NAND_Inform[g_NandContNum].uBlockNum-1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -