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