📄 nand_test.c
字号:
/**************************************************************************************
*
* 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 + -