📄 nand.c
字号:
#include "def.h"
#include "utils.h"
#include "44b.h"
#define NAND_FLASH_SUPPORT
#ifdef NAND_FLASH_SUPPORT
struct NFChipInfo {
U32 id;
U32 size;
}
NandFlashChip[] = {
{0xec73, SIZE_16M},
{0xec75, SIZE_32M},
{0xec76, SIZE_64M},
{0xec79, SIZE_128M},
{0, 0},
};
static U16 NandAddr;
static U32 support;
static U32 nand_id;
#define READCMD0 0
#define READCMD1 1
#define READCMD2 0x50
#define ERASECMD0 0x60
#define ERASECMD1 0xd0
#define PROGCMD0 0x80
#define PROGCMD1 0x10
#define QUERYCMD 0x70
#define READIDCMD 0x90
#define NFChipEn() NFChipSel(1)
#define NFChipDs() NFChipSel(0)
#define NFIsBusy() (!NFIsReady())
#define NAND_DAT 0x02000000
#define NAND_ALE 0x02000004
#define NAND_CLE 0x02000002
////////////////////////////////////////////////
void NFChipSel(U32 sel)
{
if(sel)
rPDATC &= ~(1<<9);
else
rPDATC |= 1<<9;
}
int NFIsReady(void)
{
return rPDATC&(1<<8);
}
void NFWrCmd(int cmd)
{
*(volatile U8 *)NAND_CLE = cmd;
}
void NFWrAddr(int addr)
{
*(volatile U8 *)NAND_ALE = addr;
}
void NFWrDat(int dat)
{
*(volatile U8 *)NAND_DAT = dat;
}
U8 NFRdDat(void)
{
return *(volatile U8 *)NAND_DAT;
}
//////////////////////////////////////////////////
static U32 NFReadID(void)
{
U32 id, loop = 0;
NFChipEn();
NFWrCmd(READIDCMD);
NFWrAddr(0);
while(NFIsBusy()&&(loop<10000)) loop++;
if(loop>=10000)
return 0;
id = NFRdDat()<<8;
id |= NFRdDat();
NFChipDs();
return id;
}
static U16 NFReadStat(void)
{
U16 stat;
NFChipEn();
NFWrCmd(QUERYCMD);
stat = NFRdDat();
NFChipDs();
return stat;
}
void NandFlashInit(void)
{
//int i;
support = 0;
nand_id = NFReadID();
printf("\nThis is a NandFlash! Size: 16M Nand_id: 0x%x\n",nand_id);
/* printf("%x",NandFlashChip[0].id);
for(i=0; NandFlashChip[i].id!=0; i++)
{
if(NandFlashChip[i].id==nand_id) {
nand_id = i;
support = 1;
return;
}
}
*/
return;
}
//**************************************************
void NandFlashEarse(unsigned block)
{
unsigned blockPage;
unsigned char data;
blockPage=(block<<5);
NFChipEn();
NFWrCmd(ERASECMD0);
NFWrAddr(blockPage&0xff);
NFWrAddr((blockPage>>8)&0xff);
NFWrAddr((blockPage>>16)&0xff);
NFWrCmd(ERASECMD1);
while(NFIsBusy());
data=NFReadStat();
NFChipDs();
//printf("Erase block %x %s \n", block, data&1?"fail":"ok");
return;
}
//**************************************************
void NandFlashWrite(unsigned block,unsigned page,unsigned char *buffer)
{
unsigned char *bufPt=buffer;
unsigned int blockPage,i;
unsigned char se[16],data;
blockPage=(block<<5)+page;
for(i=0;i<16;i++)se[i]=61;
NFChipEn();
NFWrCmd(PROGCMD0);
NFWrAddr(0);
NFWrAddr(blockPage&0xff);
NFWrAddr((blockPage>>8)&0xff);
NFWrAddr((blockPage>>16)&0xff);
for(i=0;i<256;i++) NFWrDat(buffer[i]);
for(i=256;i<512;i++) NFWrDat(buffer[i]);
for(i=0;i<16;i++) NFWrDat(se[i]);
NFWrCmd(PROGCMD1);
while(NFIsBusy());
data=NFReadStat();
NFChipDs();
//printf(" w (%x,%x) ",block,page);
return;
}
//**************************************************
//**************************************************
void NandFlashRead(unsigned block,unsigned page,unsigned char *buffer)
{
unsigned char bufPt[512];
unsigned int blockPage,i;
unsigned char se[16];
blockPage=(block<<5)+page;
for(i=0;i<512;i++)bufPt[i]=0;
for(i=0;i<16;i++)se[i]=0;
NFChipEn();
NFWrCmd(READCMD0);
NFWrAddr(0);
NFWrAddr(blockPage&0xff);
NFWrAddr((blockPage>>8)&0xff);
NFWrAddr((blockPage>>16)&0xff);
while(NFIsBusy());
for(i=0;i<256;i++)buffer[i]=NFRdDat();
for(i=256;i<512;i++)buffer[i]=NFRdDat();
for(i=0;i<16;i++)se[i]=NFRdDat();
NFChipDs();
//printf(" R (%d,%d) ",block,page);
return;
}
//**************************************************
void NandFlashStatusRep(void)
{
if(support) {
printf(" Nand Flash ID is 0x%x, Size = %dM, Status = 0x%x", NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20, NFReadStat());
} else {
printf("No supported Nand Flash Found!\n");
}
}
//void (*pNandFlashInit)(void) = NandFlashInit;
#endif /* NAND_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -