📄 l1_testflash.c
字号:
#include "general.h"
#include "main.h"
UCHAR L2_TestFlash(UCHAR FlashType, USHORT Size, UCHAR PageSize)
{
UCHAR error;
// USHORT page;
USHORT pagesize;
ULONG block,blocksize;
// UCHAR ECCData[12];
UCHAR Ready;
// UCHAR Detect;
UCHAR ByteData;
// USHORT WordData;
// USHORT tmp;
UCHAR tmp0;
XBYTE[0x2401] = 0x01;
XBYTE[0x2405] = 0x01;
// NAND test ///////////////////////////////////////////////////////////////////////
if(FlashType == 1)
{
if(PageSize == 0) { blocksize = Size<<12; pagesize = 256;}
else if(PageSize == 1) { blocksize = Size<<11; pagesize = 512;}
else { blocksize = Size<<10; pagesize =1024;}
// READ ID command
L2_FlashMode(1,3,1);
L2_NANDInit(1,1);
L2_NANDSendCmd(0x90);
L2_NANDSendAddr(1,0);
L2_NANDCheckRdy(&Ready);
L2_NANDReadPort(&ByteData);
L2_NANDReadPort(&ByteData);
L2_NANDCompleteOperation();
// READ ID command
// READ Bad Block
//PRINT_L1("blocksize=%lx",blocksize);
error = 0;
L2_NANDSendCmd(0x50);
L2_NANDSendAddr(3,0);
L2_NANDCheckRdy(&Ready);
L2_NANDSendAddr(1,0);
if(Size < 16)
L2_NANDSendAddr(2,1);
else
L2_NANDSendAddr(3,1);
for(block=1;block<blocksize;block++)
{
P1 = block;
error = 0;
for(tmp0=0;tmp0<8;tmp0++)
{
L2_NANDReadPort(&ByteData);
if(ByteData!=0xff) {error = 1; //PRINT_L1("error block %lx \n",block); }
}
}
L2_NANDCheckRdy(&Ready);
L2_NANDCompleteOperation();
if(error == 1)
{
//PRINT_L1("error block");
}
else
{
//PRINT_L1("good block");
}
/*
L2_NANDSendCmd(0x00);
L2_NANDSendAddr(3,0);
L2_NANDCheckRdy(&Ready);
L2_NANDSendAddr(1,0);
if(Size < 16)
L2_NANDSendAddr(2,block);
else
L2_NANDSendAddr(3,block);
for(page=0;page<(pagesize+8);page++)
{
L2_NANDReadPort(&ByteData);
if(ByteData!=0xff) error = 1;
}
L2_NANDCompleteOperation();
if(error == 1)
{
PRINT_L1("error block %lx \n",block);
}
}
if(error == 1)
{
PRINT_L1("error block");
}
else
{
PRINT_L1("good block");
}
*/
// READ Bad Block
/*
// ERASE BLOCK command
error = L2_NANDSendCmd(0x60);
error = L2_NANDSendAddr(2,0);
error = L2_NANDSendCmd(0xd0);
L2_NANDCheckRdy(&Ready);
error = L2_NANDSendCmd(0x70);
L2_NANDReadPort(&ByteData);
L2_NANDCompleteOperation();
// ERASE Block command
// PREPARE Data in CPU 4K SRAM
// error = L2_DownloadROM(0,0,256); // 256 bytes
tmp0 = XBYTE[0x2C00];
XBYTE[0x2C00] = tmp0 & 0x1d;
XBYTE[0x2C11] = 0x06;
XBYTE[0x2C11] = 0x01;
XBYTE[0x2C00] = tmp0 | 0x02;
XBYTE[0x2C10] = 0x00;
XBYTE[0x2C10] = 0x00;
XBYTE[0x2C10] = 0x00;
for(tmp = 3; tmp<256 ; tmp++)
{
XBYTE[0x2C10] = tmp;
}
// PREPARE Data in CPU 4K SRAM
// WRITE One Page command
error = L2_NANDSendCmd(0x80);
error = L2_NANDSendAddr(3,0);
L2_ECCMode(0);
L2_ClearECC();
error = L2_SetSRAMDMA(0);
// DMA
error = L2_DoDMA(1,2,256,0,1);
error = L2_ReadECC(3,ECCData);
L2_NANDWritePort(ECCData[0]);
L2_NANDWritePort(ECCData[1]);
L2_NANDWritePort(ECCData[2]);
L2_NANDWritePort(0);
L2_NANDWritePort(0);
L2_NANDWritePort(0);
L2_NANDWritePort(0);
L2_NANDWritePort(0);
error = L2_NANDSendCmd(0x10);
L2_NANDCheckRdy(&Ready);
error = L2_NANDSendCmd(0x70);
L2_NANDReadPort(&ByteData);
L2_NANDCompleteOperation();
//PRINT_L1("(ECC0,ECC1,ECC2)=8'h%x,8'h%x,8'h%x\n",(USHORT)ECCData[0],(USHORT)ECCData[1],(USHORT)ECCData[2]);
// WRITE One Page command
// Read One Page command
error = L2_NANDSendCmd(0x00);
error = L2_NANDSendAddr(3,0);
L2_ECCMode(0);
L2_ClearECC();
L2_NANDCheckRdy(&Ready);
error = L2_SetSRAMDMA(256);
error = L2_DoDMA(2,1,256,0,0);
// error = L2_SearchPattern(0,1,0,0x7f7e,&FirstMatchAddr,&MatchCount); // FAT16
// error = L2_SearchPattern(0,1,1,0x0838,&FirstMatchAddr,&MatchCount); // FAT12
L2_ECCMode(1); // disable ECC generator
error = L2_ReadECC(3,ECCData);
error = 0;
L2_NANDReadPort(&ByteData);
if(ByteData != ECCData[0]) error = 1;
L2_NANDReadPort(&ByteData);
if(ByteData != ECCData[1]) error = 1;
L2_NANDReadPort(&ByteData);
if(ByteData != ECCData[2]) error = 1;
L2_NANDReadPort(&ByteData);
L2_NANDReadPort(&ByteData);
L2_NANDReadPort(&ByteData);
L2_NANDReadPort(&ByteData);
L2_NANDReadPort(&ByteData);
L2_NANDCompleteOperation();
//PRINT_L1("(ECC0,ECC1,ECC2)=8'h%x,8'h%x,8'h%x\n",(USHORT)ECCData[0],(USHORT)ECCData[1],(USHORT)ECCData[2]);
//PRINT_L1("ECC error = 8'h%x (1 for error,0 for correct)\n",(USHORT)error);
// Read One Page command
// NAND test ///////////////////////////////////////////////////////////////////////
*/
}
return 0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -