📄 nand.cpp
字号:
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 + -