📄 nand.c
字号:
/****************************************************************
* ARMSYS7 S3C44B0X developer's notes *
****************************************************************
***************************************************************/
#include "..\inc\def.h"
#include "..\inc\44b.h"
#include "..\inc\config.h"
#include "..\inc\utils.h"
#include "..\inc\board.h"
#include "..\inc\flash.h"
#ifdef NAND_FLASH_SUPPORT
U32 NandFlashSize;
static U16 NFsupport;
struct NFChipInfo {
U32 id;
U32 size;
}
static NandFlashChip[] = {
{0xec73, SIZE_16M},
{0xec75, SIZE_32M},
{0xec76, SIZE_64M},
{0xec79, SIZE_128M},
{0, 0},
};
#define Nand_RB (0x01)
#define Nand_CE (0x02)
#define Nand_CLE (0x04)
#define Nand_ALE (0x08)
#define Nand_IO (*(volatile unsigned char *)0x02000000) //bank1
#define READCMD0 0x00
#define READCMD1 0x01
#define READCMD2 0x50
#define ERASECMD0 0x60
#define ERASECMD1 0xd0
#define PROGCMD0 0x80
#define PROGCMD1 0x10
#define STATUSCMD 0x70
#define READIDCMD 0x90
#define RESETCMD 0xff
void NAND_CMD(void)
{
rPDATC =(rPDATC & 0xf1)|(Nand_CLE &(~(Nand_CE|Nand_ALE)));
// CLE为高、CE和ALE为低
}
void NAND_ADR(void)
{
rPDATC =(rPDATC & 0xf1)|(Nand_ALE &(~(Nand_CE|Nand_CLE)));
// ALE为高、CE和CLE为低
}
void NAND_DAT(void)
{
rPDATC =(rPDATC & 0xf1)|( ~(Nand_CE|Nand_CLE| Nand_ALE));
// ALE、CE和CLE全为低
}
void NAND_INVALID(void)
{
rPDATC =(rPDATC & 0xf1)|( Nand_CE &(~(Nand_CLE|Nand_ALE)));
// CE为高、ALE和CLE为低
}
void NF_Reset()
{
int i;
// rPDATC = rPDATC | WP;
NAND_CMD();
Nand_IO = 0xff;
for (i=0;i<3000;i++);
}
void WAIT_RB(void)
{
while(!(rPDATC & Nand_RB));
}
U32 NFReadID(void)
{
int i;
unsigned int id;
NAND_CMD();
Nand_IO = READIDCMD; //0x90
NAND_ADR();
Nand_IO = 0;
NAND_DAT();
for(i=0;i<10;i++);
id = Nand_IO<<8; //连续读出两个字节
id += Nand_IO;
NAND_INVALID();
return id;
}
/********************************************************/
/*功能:擦除FLASH的1Block(对应文件系统为1Cluster) */
/*输出:0:Fail;1:OK */
/********************************************************/
U8 NFEraseBlock(U32 block)
{
U32 i;
U32 blockPage = (block<<5);
NAND_CMD();
Nand_IO = ERASECMD0; //0x60
NAND_ADR();
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
for(i=0;i<2;i++);
NAND_CMD();
Nand_IO = ERASECMD1; //0xd0
for(i=0;i<3;i++);
NAND_DAT();
WAIT_RB();
NAND_CMD();
Nand_IO = STATUSCMD; //0x70
NAND_DAT();
if (Nand_IO & 0x1)
{
NAND_INVALID();
return 0;
}
else
{
NAND_INVALID();
return 1;
}
}
/*****************************************************************/
/*功能:读取FLASH的某个Block中的1page数据 */
/*****************************************************************/
//addr = page address
void NFReadPage(U32 block,U32 page,U8 *buff)
{
U32 i;
U32 blockPage = (block<<5) + page;
NAND_CMD();
Nand_IO = READCMD0; //0x00
NAND_ADR();
Nand_IO = 0;
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
for(i=0;i<3;i++);
NAND_DAT();
WAIT_RB();
//NAND_DAT();
for(i=0;i<528;i++)
{
*buff++=Nand_IO;
} //ReadPage(buffer);
NAND_INVALID();
}
/*****************************************************************/
/*功能:向FLASH的某个Block中的1page写入数据 */
/*输出:0:Fail;1:OK */
/*****************************************************************/
//addr = page address
int WritePage(U32 block,U32 page,U8 *buff)
{
int i;
//U8 *Source;
U32 blockPage = (block<<5) + page;
//Source=buff;
NAND_CMD();
Nand_IO = PROGCMD0; //0x80
NAND_ADR();
Nand_IO = 0;
Nand_IO = blockPage & 0xff;
Nand_IO = (blockPage>>8) & 0xff;
NAND_DAT();
for(i=0;i<528;i++)
{
Nand_IO=*buff++;
} //WritePage(buffer);
NAND_CMD();
Nand_IO = PROGCMD1; //0x10
for(i=0;i<10;i++);
WAIT_RB();
Nand_IO = STATUSCMD; //0x70
NAND_DAT();
for(i=0;i<3;i++);
if((Nand_IO & 0x1)) //
{
NAND_INVALID();
return 0;
}
else
{
NAND_INVALID();
return 1;
}
}
static U32 nand_id;
void NandFlashInit(void)
{
int i;
NFsupport = 0;
nand_id = NFReadID();
for(i=0; NandFlashChip[i].id!=0; i++)
if(NandFlashChip[i].id==nand_id)
{
nand_id = i;
NandFlashSize = NandFlashChip[i].size;
NFsupport = 1;
}
}
void NandFlashStatusRep(void)
{
if(NFsupport)
{
printf("Nand Flash :");
//printf(" ID = 0x%x, Size = %dMByte\n", NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20);
printf(" ID: 0x%x, Size: %dMByte\n", NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20 );
} else {
printf("Nand Flash : No supported Nand Flash Found!\n");
}
}
#endif /* NAND_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -