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

📄 nand.cpp

📁 smdk2416 wince source code/BSP
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				continue;

MarkAndSkipBadBlock:

				pLowFuncTbl->Erase(0, dwBlock, enuBOTH_PLANE_BITMAP);
				memset(pSBuf, 0x0, BYTES_PER_SPARE_SUPAGE);
				IS_CHECK_SPARE_ECC = FALSE32;
				pLowFuncTbl->Write(0, dwBlock*PAGES_PER_BLOCK+PAGES_PER_BLOCK-1, 0x0, enuBOTH_PLANE_BITMAP, NULL, pSBuf);
				IS_CHECK_SPARE_ECC = TRUE32;
				dwBlock++;
				continue;
			}
			else
			{
				OALMSG(TRUE, (TEXT("Bad Block %d Skipped\r\n"), dwBlock));
				dwBlock++;
				continue;
			}
		}

		OALMSG(TRUE, (TEXT("Write Eboot image to BootMedia Success\r\n")));
	}
	else if (g_ImageType == IMAGE_TYPE_STEPLDR)
	{
		BOOL bFormatted = FALSE;
		UINT32 nSctBitmap;
		UINT32 nBufCnt;
		UINT32 nCnt;

		pLowFuncTbl = FIL_GetFuncTbl();
		nRet = pLowFuncTbl->Read(0, PAGES_PER_BLOCK - 1, FULL_SECTOR_BITMAP_PAGE, enuBOTH_PLANE_BITMAP, WMRBuf, WMRBuf+BYTES_PER_MAIN_SUPAGE, TRUE32, TRUE32);
		if (nRet == FIL_SUCCESS_CLEAN || nRet == FIL_U_ECC_ERROR)	// WMR Not formatted
		{
			bFormatted = FALSE;
		}
		else
		{
			OALMSG(TRUE, (TEXT("VFL Already Formatted\r\n")));
			nRet = pLowFuncTbl->Read(0, PAGES_PER_BLOCK-2, LEFT_SECTOR_BITMAP_PAGE, enuLEFT_PLANE_BITMAP, BadInfoBuf, NULL, FALSE32, FALSE32);
			if (nRet == FIL_SUCCESS)
			{
				bFormatted = TRUE;
			}
			else
			{
				OALMSG(TRUE, (TEXT("VFL Formatted... But There is no Initial Bad Block Infomation -> Clear VFL Signiture\r\n")));
				bFormatted = FALSE;
			}
		}

		pbBuffer = OEMMapMemAddr(dwImageStart, dwImageStart);

		dwStartPage = 0;

		dwNumPage = (dwImageLength)/(BYTES_PER_MAIN_PAGE)+((dwImageLength%BYTES_PER_MAIN_PAGE)? 1 : 0);
		if (SECTORS_PER_PAGE == 8) dwNumPage++;  // page No. 0 and 1 use only 2KByte/Page, so add 1 page.

		OALMSG(TRUE, (TEXT("Write Steploader (NBL1+NBL2) image to BootMedia dwNumPage : %d \r\n"),dwNumPage));
		OALMSG(TRUE, (TEXT("ImageLength = %d Byte \r\n"), dwImageLength));
		OALMSG(TRUE, (TEXT("Start Page = %d, End Page = %d, Page Count = %d\r\n"), dwStartPage, dwStartPage+dwNumPage-1, dwNumPage));

		for (dwPage = dwStartPage, nCnt = 0; nCnt < dwNumPage; nCnt++)
		{
			if (dwPage < 2 || IS_SLC)
			{
#if (BSP_TYPE == BSP_SMDK2443)
				nSctBitmap = 0xf;
				nBufCnt = BYTES_PER_SECTOR*4;
#elif (BSP_TYPE == BSP_SMDK2450)
				if(BYTES_PER_MAIN_PAGE == 2048)//for 2Kpage
				{

					nSctBitmap = 0xf;
					nBufCnt = BYTES_PER_SECTOR*4;
				}
				else if(BYTES_PER_MAIN_PAGE == 4096)//for 4Kpage
				{

					nSctBitmap = 0xff;
					nBufCnt = BYTES_PER_SECTOR*8;
				}
#endif				
			}
			else
			{
				nSctBitmap = LEFT_SECTOR_BITMAP_PAGE;
				nBufCnt = BYTES_PER_MAIN_PAGE;
			}
			
			if (dwPage%PAGES_PER_BLOCK == 0)
			{
				pLowFuncTbl->Erase(0, dwPage/PAGES_PER_BLOCK, enuBOTH_PLANE_BITMAP);
				if (pLowFuncTbl->Sync(0, &nSyncRet) != FIL_SUCCESS)
				{
					OALMSG(TRUE, (TEXT("[ERR] FIL Erase Error @ %d block\r\n"), dwPage/PAGES_PER_BLOCK));
					OALMSG(TRUE, (TEXT("Write Steploader image to BootMedia Failed !!!\r\n")));
					return FALSE;
				}
			}

			OALMSG(OAL_FUNC, (TEXT(" dwPage = 0x%x, pbBuffer = 0x%x \r\n"), dwPage, pbBuffer));

			if (dwPage < PAGES_PER_BLOCK-2)
			{
				pLowFuncTbl->Steploader_Write(0, dwPage, nSctBitmap, enuLEFT_PLANE_BITMAP, pbBuffer, NULL);
//				pLowFuncTbl->Write(0, dwPage, nSctBitmap, enuLEFT_PLANE_BITMAP, pbBuffer, NULL);
			}
			else
			{
				OALMSG(TRUE, (TEXT("Cannot Write image on page %d (Reserved area) !!!\r\n"), dwPage));
				return FALSE;
			}
			
			if (pLowFuncTbl->Sync(0, &nSyncRet) != FIL_SUCCESS)
			{
				OALMSG(TRUE, (TEXT("[ERR] FIL Write Error @ %d page\r\n"), dwPage));
				OALMSG(TRUE, (TEXT("Write Steploader image to BootMedia Failed !!!\r\n")));
				return FALSE;
			}

			// write pages with 0, 1 and 6 to PAGES_PER_BLOCK-3
			dwPage++;
#if (BSP_TYPE == BSP_SMDK2443)		
			if (IS_MLC && dwPage >= 2 && dwPage < 6) dwPage = 6;
				
#elif (BSP_TYPE == BSP_SMDK2450)
				if(BYTES_PER_MAIN_PAGE == 2048)//for 2Kpage
				{
					if (IS_MLC && dwPage >= 4 && dwPage < 10) dwPage = 10; //for 8K Stepping stone
				}
				else if(BYTES_PER_MAIN_PAGE == 4096)//for 4Kpage
				{
					if (IS_MLC && dwPage >= 2 && dwPage < 10) dwPage = 10; //for 8K Stepping stone
				}
#endif
			pbBuffer += nBufCnt;
		}

		// Write WMR Data (last page of block 0)
		if (bFormatted)
		{
			pLowFuncTbl->Write(0, PAGES_PER_BLOCK-2, LEFT_SECTOR_BITMAP_PAGE, enuLEFT_PLANE_BITMAP, BadInfoBuf, NULL);
			if (pLowFuncTbl->Sync(0, &nSyncRet) != FIL_SUCCESS)
			{
				OALMSG(TRUE, (TEXT("[ERR] FIL Write Error @ %d page\r\n"), PAGES_PER_BLOCK-2));
				OALMSG(TRUE, (TEXT("Write Steploader image to BootMedia Failed !!!\r\n")));
				return FALSE;
				
			}
			else
			{
				pLowFuncTbl->Write(0, PAGES_PER_BLOCK-1, FULL_SECTOR_BITMAP_PAGE, enuBOTH_PLANE_BITMAP, WMRBuf, WMRBuf+BYTES_PER_MAIN_SUPAGE);
				if (pLowFuncTbl->Sync(0, &nSyncRet) != FIL_SUCCESS)
				{
					OALMSG(TRUE, (TEXT("[ERR] FIL Write Error @ %d page\r\n"), PAGES_PER_BLOCK-1));
					OALMSG(TRUE, (TEXT("Write Steploader image to BootMedia Failed !!!\r\n")));
					return FALSE;
				}
			}
		}

		OALMSG(TRUE, (TEXT("Write Steploader image to BootMedia Success\r\n")));
	}

	if (g_ImageType == IMAGE_TYPE_LOADER)
	{
		g_pTOC->id[0].dwLoadAddress = dwImageStart;
		g_pTOC->id[0].dwJumpAddress = 0;
		g_pTOC->id[0].dwTtlSectors  = FILE_TO_SECTOR_SIZE(dwImageLength);
		g_pTOC->id[0].sgList[0].dwSector = BLOCK_TO_SECTOR(EBOOT_BLOCK);
		g_pTOC->id[0].sgList[0].dwLength = g_pTOC->id[0].dwTtlSectors;
	}

	OALMSG(OAL_FUNC, (TEXT("_WriteRawImageToBootMedia\r\n")));

	return TRUE;
}

static DWORD GetDecimalNumber(void)
{
	DWORD dwNumber = 0;
	int InChar = 0;

	while(!((InChar == 0x0d) || (InChar == 0x0a)))
	{
		InChar = OEMReadDebugByte();
		if (InChar != OEM_DEBUG_COM_ERROR && InChar != OEM_DEBUG_READ_NODATA)
		{
			if ((InChar >= '0' && InChar <= '9'))
			{
				dwNumber = dwNumber*10;
				dwNumber = dwNumber+(InChar-'0');
				OEMWriteDebugByte((BYTE)InChar);
			}
			else if (InChar == 8)		// If it's a backspace, back up.
			{
				dwNumber = dwNumber/10;
				OEMWriteDebugByte((BYTE)InChar);
			}
		}
	}

	OEMWriteDebugByte('\n');
	OEMWriteDebugByte('\r');

	return dwNumber;
}

static void MLC_Print_Page_Data(unsigned char *pMBuf, unsigned char *pSBuf)
{
	unsigned int i, j;

	if (pMBuf != NULL)
	{
		OALMSG(TRUE, (TEXT("Main Data\r\n")));
		for (j = 0; j < SECTORS_PER_PAGE; j++)
		{
			OALMSG(TRUE, (TEXT("================================================= Sector %d\n"), j));
			for (i = (BYTES_PER_SECTOR * j); i < (BYTES_PER_SECTOR * (j+1)); i++)
			{
				OALMSG(TRUE, (TEXT("%02x "), pMBuf[i]));
				if (i%BYTES_PER_SPARE == 15) OALMSG(TRUE, (TEXT("\n")));
			}
		}
#if 1
		if (TWO_PLANE_PROGRAM == TRUE32)
		{
			for (j = SECTORS_PER_PAGE; j < (SECTORS_PER_PAGE * 2); j++)
			{
				OALMSG(TRUE, (TEXT("================================================= Sector %d\n"), j));
				for (i = (BYTES_PER_SECTOR * j); i < (BYTES_PER_SECTOR * (j+1)); i++)
				{
					OALMSG(TRUE, (TEXT("%02x "), pMBuf[i]));
					if (i%BYTES_PER_SPARE == 15) OALMSG(TRUE, (TEXT("\n")));
				}
			}
		}
#endif
		OALMSG(TRUE, (TEXT("=================================================\n")));
	}

	if (pSBuf != NULL)
	{
		OALMSG(TRUE, (TEXT("Spare Data\n")));
		for (i = 0; i < BYTES_PER_SPARE_PAGE; i++)
		{
			OALMSG(TRUE, (TEXT("%02x "), pSBuf[i]));
			if (i%BYTES_PER_SPARE == 15) OALMSG(TRUE, (TEXT("\n")));
		}
#if 1
		if (TWO_PLANE_PROGRAM == TRUE32)
		{
			for (i = BYTES_PER_SPARE_PAGE; i < BYTES_PER_SPARE_SUPAGE; i++)
			{
				OALMSG(TRUE, (TEXT("%02x "), pSBuf[i]));
				if (i%BYTES_PER_SPARE == 15) OALMSG(TRUE, (TEXT("\n")));
			}
		}
#endif
		OALMSG(TRUE, (TEXT("=================================================\n")));
	}
}

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

	pLowFuncTbl = FIL_GetFuncTbl();

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

		dwNum = GetDecimalNumber();

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

static void MLC_FIL_Write_Test(void)
{
	DWORD dwNum;
	UINT32 iCnt;
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	LowFuncTbl *pLowFuncTbl;
	UINT32 nSyncRet;
	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;
	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 FIL Write 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))
		{
			s2450IOP->GPFDAT |= (1<<7);
			pLowFuncTbl->Write(0, dwNum, FULL_SECTOR_BITMAP_PAGE, enuBOTH_PLANE_BITMAP, pMBuf, pSBuf);
			s2450IOP->GPFDAT &= ~(1<<7);
			if (pLowFuncTbl->Sync(0, &nSyncRet))
			{
				OALMSG(TRUE, (TEXT(" FIL Write Fail \r\n")));
			}
			else
			{
				OALMSG(TRUE, (TEXT(" FIL 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_FIL_Read_Test(void)
{
	DWORD dwNum;
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	LowFuncTbl *pLowFuncTbl;
	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 FIL Read Test \r\n")));
		OALMSG(TRUE, (TEXT(" Page Number [99999999 to exit] = ")));
		memset((void *)pMBuf, 0xff, BYTES_PER_MAIN_SUPAGE);
		memset((void *)pSBuf, 0xff, BYTES_PER_SPARE_SUPAGE);

		dwNum = GetDecimalNumber();

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

static void MLC_VFL_Erase_Test(void)
{
	DWORD dwNum;

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

		dwNum = GetDecimalNumber();

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

static void MLC_VFL_Write_Test(void)
{
	DWORD dwNum;
	UINT32 iCnt;
	unsigned char *pMBuf;
	unsigned char *pSBuf;
	Buffer InBuf;
	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 VFL Write Test \r\n")));
		OALMSG(TRUE, (TEXT(" Page Number [99999999 to exit] = ")));

⌨️ 快捷键说明

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