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

📄 nand.cpp

📁 smdk2416 wince source code/BSP
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum >= PAGES_PER_BLOCK && dwNum < (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1))
		{
			InBuf.nBitmap = FULL_SECTOR_BITMAP_PAGE;
			InBuf.eStatus = BUF_AUX;
			InBuf.pData = pMBuf;
			InBuf.pSpare = pSBuf;

			s2450IOP->GPFDAT |= (1<<7);
			VFL_Write(dwNum, &InBuf);
			s2450IOP->GPFDAT &= ~(1<<7);
			if (VFL_Sync())
			{
				OALMSG(TRUE, (TEXT(" VFL Write Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" VFL Write Success \r\n")));
			}
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Page Number ! You can write %d~%d page \r\n"), PAGES_PER_BLOCK, (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1)));
		}
	}
}

static void MLC_VFL_Read_Test(void)
{
	DWORD dwNum;
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	LowFuncTbl *pLowFuncTbl;
	Buffer InBuf;
	INT32 nRet;
	volatile S3C2450_IOPORT_REG *s2450IOP = (S3C2450_IOPORT_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_IOPORT, FALSE);

	pLowFuncTbl = FIL_GetFuncTbl();

	pMBuf = WMRBuf;
	pSBuf = WMRBuf+BYTES_PER_MAIN_SUPAGE;

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n VFL Read Test \r\n")));
		OALMSG(TRUE, (TEXT(" Page Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum >= PAGES_PER_BLOCK && dwNum < (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1))
		{
			memset((void *)pMBuf, 0xff, BYTES_PER_MAIN_SUPAGE);
			memset((void *)pSBuf, 0xff, BYTES_PER_SPARE_SUPAGE);

			InBuf.nBitmap = FULL_SECTOR_BITMAP_PAGE;
			InBuf.eStatus = BUF_AUX;
			InBuf.pData = pMBuf;
			InBuf.pSpare = pSBuf;

			s2450IOP->GPFDAT |= (1<<7);
			nRet = VFL_Read(dwNum, &InBuf, 0);
			s2450IOP->GPFDAT &= ~(1<<7);
			if (nRet)
			{
				OALMSG(TRUE, (TEXT(" VFL Read Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" VFL Read Success \r\n")));
				MLC_Print_Page_Data(pMBuf, pSBuf);
			}
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Page Number ! You can read %d~%d page \r\n"), PAGES_PER_BLOCK-1, (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1)));
		}
	}
}

#define FTL_TEST 0

#if FTL_TEST
#include <FTL.h>

static void MLC_FTL_Write_Test(void)
{
	DWORD dwNum;
	UINT32 iCnt;
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	volatile S3C2450_IOPORT_REG *s2450IOP = (S3C2450_IOPORT_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_IOPORT, FALSE);

	pMBuf = WMRBuf;
	pSBuf = WMRBuf+BYTES_PER_MAIN_SUPAGE;
	memcpy((void *)pMBuf, (void *)prayer16bpp, BYTES_PER_MAIN_SUPAGE);
	memset((void *)pSBuf, 0xff, BYTES_PER_SPARE_SUPAGE);

	for (iCnt=0; iCnt<BYTES_PER_SPARE_SUPAGE; iCnt++)
	{
		pSBuf[iCnt] = iCnt;
	}

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n FTL Write Test \r\n")));
		OALMSG(TRUE, (TEXT(" Sector Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum >= 0 && dwNum < (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1))
		{
			s2450IOP->GPFDAT |= (1<<7);
			FTL_Write(dwNum, 16, pMBuf);
			s2450IOP->GPFDAT &= ~(1<<7);
			if (VFL_Sync())
			{
				OALMSG(TRUE, (TEXT(" FTL Write Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" FTL Write Success \r\n")));
			}
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Sector Number ! You can write 0~%d sector \r\n"), (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1)));
		}
	}
}

static void MLC_FTL_Read_Test(void)
{
	DWORD dwNum;
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	LowFuncTbl *pLowFuncTbl;
	UINT32 nRet;
	volatile S3C2450_IOPORT_REG *s2450IOP = (S3C2450_IOPORT_REG *)OALPAtoVA(S3C2450_BASE_REG_PA_IOPORT, FALSE);

	pLowFuncTbl = FIL_GetFuncTbl();

	pMBuf = WMRBuf;
	pSBuf = WMRBuf+BYTES_PER_MAIN_SUPAGE;

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n FTL Read Test \r\n")));
		OALMSG(TRUE, (TEXT(" Sector Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum >= 0 && dwNum < (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1))
		{
			memset((void *)pMBuf, 0xff, BYTES_PER_MAIN_SUPAGE);
			memset((void *)pSBuf, 0xff, BYTES_PER_SPARE_SUPAGE);

			s2450IOP->GPFDAT |= (1<<7);
			nRet = FTL_Read(dwNum, 16, pMBuf);
			s2450IOP->GPFDAT &= ~(1<<7);
			if (nRet)
			{
				OALMSG(TRUE, (TEXT(" FTL Read Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" FTL Read Success \r\n")));
				MLC_Print_Page_Data(pMBuf, pSBuf);
			}
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Sector Number ! You can read 0~%d sector \r\n"), (BLOCKS_PER_BANK*PAGES_PER_SUBLK-1)));
		}
	}
}
#endif

static void MLC_RAW_Erase_Test(void)
{
	DWORD dwNum;
	DWORD endblock = BANKS_TOTAL*BLOCKS_PER_BANK*(TWO_PLANE_PROGRAM+1);

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n RAW Erase Test \r\n")));
		OALMSG(TRUE, (TEXT(" Block Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum > 0 && dwNum < endblock)
		{
			if (MLC_Erase_RAW(0, dwNum))
			{
				OALMSG(TRUE, (TEXT(" RAW Erase Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" RAW Erase Success \r\n")));
			}
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Block Number ! You can erase 1~%d block \r\n"), endblock-1));
		}
	}
}

static void MLC_RAW_Write_Test(void)
{
	DWORD dwNum;
	UINT32 iCnt;
	DWORD endblock = BANKS_TOTAL*BLOCKS_PER_BANK*(TWO_PLANE_PROGRAM+1);
	unsigned char *pMBuf;
	unsigned char *pSBuf;

	pMBuf = WMRBuf;
	pSBuf = WMRBuf+BYTES_PER_MAIN_PAGE;
	memcpy((void *)pMBuf, (void *)prayer16bpp, BYTES_PER_MAIN_PAGE);
	memset((void *)pSBuf, 0xff, BYTES_PER_SPARE_PAGE);

	for (iCnt=0; iCnt<BYTES_PER_SPARE_PAGE; iCnt++)
	{
		pSBuf[iCnt] = iCnt;
	}

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n RAW Write Test \r\n")));
		OALMSG(TRUE, (TEXT(" Page Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum >= (PAGES_PER_BLOCK*2) && dwNum < (endblock*PAGES_PER_BLOCK))
		{
			if (MLC_Write_RAW(0, dwNum, pMBuf, pSBuf))
			{
				OALMSG(TRUE, (TEXT(" RAW Write Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" RAW Write Success \r\n")));
			}
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Page Number ! You can write %d~%d page \r\n"), PAGES_PER_BLOCK*2, endblock*PAGES_PER_BLOCK-1));
		}
	}
}

static void MLC_RAW_Read_Test(void)
{
	DWORD dwNum;
	DWORD endblock = BANKS_TOTAL*BLOCKS_PER_BANK*(TWO_PLANE_PROGRAM+1);
	unsigned char *pMBuf;
	unsigned char *pSBuf;

	pMBuf = WMRBuf;
	pSBuf = WMRBuf+BYTES_PER_MAIN_PAGE;

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n RAW Read Test \r\n")));
		OALMSG(TRUE, (TEXT(" Page Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum >= 0 && dwNum < (endblock*PAGES_PER_BLOCK))
		{
			memset((void *)pMBuf, 0xff, BYTES_PER_MAIN_PAGE);
			memset((void *)pSBuf, 0xff, BYTES_PER_SPARE);

			MLC_Read_RAW(0, dwNum, pMBuf, pSBuf);
			MLC_Print_Page_Data(pMBuf, pSBuf);
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Page Number ! You can read 0~%d page \r\n"), endblock*PAGES_PER_BLOCK-1));
		}
	}
}

static void MLC_RAW_Find_MBR_Test(void)
{
	DWORD dwNum;
	DWORD endblock = BANKS_TOTAL*BLOCKS_PER_BANK*(TWO_PLANE_PROGRAM+1);
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	unsigned char uLoc;

	pMBuf = WMRBuf;
	pSBuf = WMRBuf+BYTES_PER_MAIN_PAGE;

	for (dwNum=0; dwNum<(endblock*PAGES_PER_BLOCK-1); dwNum++)
	{
		uLoc = 0x0;
		
		if (dwNum%PAGES_PER_BLOCK == 0) OALMSG(TRUE, (TEXT("."), dwNum));

		memset((void *)pMBuf, 0xff, BYTES_PER_MAIN_PAGE);
		memset((void *)pSBuf, 0xff, BYTES_PER_SPARE_PAGE);

		MLC_Read_RAW(0, dwNum, pMBuf, pSBuf);

		if ((WMRBuf[0] == 0xe9) &&
		     (WMRBuf[1] == 0xfd) &&
		     (WMRBuf[2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR-1] == 0xaa)) uLoc = 0x1;
		if ((WMRBuf[BYTES_PER_SECTOR+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*2-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*2-1] == 0xaa)) uLoc = 0x2;
		if ((WMRBuf[BYTES_PER_SECTOR*2+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR*2+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR*2+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*3-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*3-1] == 0xaa)) uLoc = 0x4;
		if ((WMRBuf[BYTES_PER_SECTOR*3+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR*3+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR*3+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*4-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*4-1] == 0xaa)) uLoc = 0x8;
		if ((WMRBuf[BYTES_PER_SECTOR*4+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR*4+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR*4+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*5-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*5-1] == 0xaa)) uLoc = 0x10;
		if ((WMRBuf[BYTES_PER_SECTOR*5+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR*5+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR*5+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*6-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*6-1] == 0xaa)) uLoc = 0x20;
		if ((WMRBuf[BYTES_PER_SECTOR*6+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR*6+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR*6+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*7-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*7-1] == 0xaa)) uLoc = 0x40;
		if ((WMRBuf[BYTES_PER_SECTOR*7+0] == 0xe9) &&
		     (WMRBuf[BYTES_PER_SECTOR*7+1] == 0xfd) &&
		     (WMRBuf[BYTES_PER_SECTOR*7+2] == 0xff) &&
		     (WMRBuf[BYTES_PER_SECTOR*8-2] == 0x55) &&
		     (WMRBuf[BYTES_PER_SECTOR*8-1] == 0xaa)) uLoc = 0x80;

		if (uLoc & 0xff)
		{
			OALMSG(TRUE, (TEXT("\r\nMBR is found on Page %d (%x)\r\n"), dwNum, uLoc));
			MLC_Print_Page_Data(pMBuf, pSBuf);
		}
	}
}

static void MLC_Mark_BadBlock_Test(void)
{
	DWORD dwNum;
	LowFuncTbl *pLowFuncTbl;
	UINT32 nSyncRet;

	pLowFuncTbl = FIL_GetFuncTbl();

	while(1)
	{
		OALMSG(TRUE, (TEXT("\r\n Mark Bad Block \r\n")));
		OALMSG(TRUE, (TEXT(" Block Number [99999999 to exit] = ")));

		dwNum = GetDecimalNumber();

		if (dwNum == 99999999) break;
		else if (dwNum > 0 && dwNum < (SUBLKS_TOTAL*BANKS_TOTAL*(TWO_PLANE_PROGRAM+1)))
		{
			pLowFuncTbl->Erase(0, dwNum, enuBOTH_PLANE_BITMAP);
			if (pLowFuncTbl->Sync(0, &nSyncRet))
			{
				OALMSG(TRUE, (TEXT(" FIL Erase Fail \r\n")));
				return;
			}

			memset(WMRBuf, 0x00, BYTES_PER_SPARE_SUPAGE);
			IS_CHECK_SPARE_ECC = FALSE32;
			pLowFuncTbl->Write(0, dwNum*PAGES_PER_BLOCK+PAGES_PER_BLOCK-1, 0x00, enuBOTH_PLANE_BITMAP, NULL, WMRBuf);
			IS_CHECK_SPARE_ECC = TRUE32;

			OALMSG(TRUE, (TEXT(" Mark Bad Block Success \r\n")));
		}
		else
		{
			OALMSG(TRUE, (TEXT(" Wrong Block Number ! You can mark 1~%d block \r\n"), SUBLKS_TOTAL-1));
		}
	}
}

void MLC_LowLevelTest(void)
{
	int iNum;

	while (1)
	{
		OALMSG(TRUE, (TEXT("\r\n====================\r\n")));
		OALMSG(TRUE, (TEXT(" MLC Low Level Test \r\n")));
		OALMSG(TRUE, (TEXT("  1. FIL Erase Test \r\n")));
		OALMSG(TRUE, (TEXT("  2. FIL Write Test \r\n")));
		OALMSG(TRUE, (TEXT("  3. FIL Read Test \r\n")));
		OALMSG(TRUE, (TEXT("  4. VFL Erase Test \r\n")));
		OALMSG(TRUE, (TEXT("  5. VFL Write Test \r\n")));
		OALMSG(TRUE, (TEXT("  6. VFL Read Test \r\n")));
		OALMSG(TRUE, (TEXT("  7. RAW Erase Test \r\n")));
		OALMSG(TRUE, (TEXT("  8. RAW Write Test \r\n")));
		OALMSG(TRUE, (TEXT("  9. RAW Read Test \r\n")));
		OALMSG(TRUE, (TEXT(" 10. Mark Bad Block \r\n")));
		OALMSG(TRUE, (TEXT(" 11. Find MBR Page \r\n")));
#if FTL_TEST
		OALMSG(TRUE, (TEXT(" 12. FTL Write Test \r\n")));
		OALMSG(TRUE, (TEXT(" 13. FTL Read Test \r\n")));
#endif
		OALMSG(TRUE, (TEXT("  0. Exit Test \r\n")));
		OALMSG(TRUE, (TEXT("====================\r\n")));

		OALMSG(TRUE, (TEXT("Select : ")));
		iNum = GetDecimalNumber();

		if (iNum == 0) break;
		else if (iNum == 1) MLC_FIL_Erase_Test();
		else if (iNum == 2) MLC_FIL_Write_Test();
		else if (iNum == 3) MLC_FIL_Read_Test();
		else if (iNum == 4) MLC_VFL_Erase_Test();
		else if (iNum == 5) MLC_VFL_Write_Test();
		else if (iNum == 6) MLC_VFL_Read_Test();
		else if (iNum == 7) MLC_RAW_Erase_Test();
		else if (iNum == 8) MLC_RAW_Write_Test();
		else if (iNum == 9) MLC_RAW_Read_Test();
		else if (iNum == 10) MLC_Mark_BadBlock_Test();
		else if (iNum == 11) MLC_RAW_Find_MBR_Test();
#if FTL_TEST
		else if (iNum == 12) MLC_FTL_Write_Test();
		else if (iNum == 13) MLC_FTL_Read_Test();
#endif
		else OALMSG(TRUE, (TEXT("Wrong selection\r\n")));
	}
}

⌨️ 快捷键说明

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