www.pudn.com > USBdiskRW.rar > Nand.c


#include "def.h" 
#include "utils.h" 
 
#define	NAND_FLASH_SUPPORT 
#ifdef	NAND_FLASH_SUPPORT 
 
struct NFChipInfo { 
	U32 id; 
	U32 size; 
} 
 
static NandFlashChip[] = { 
	{0xec73, SIZE_16M}, 
	{0xec75, SIZE_32M}, 
	{0xec76, SIZE_64M}, 
	{0xec79, SIZE_128M}, 
	{0, 0}, 
}; 
 
 
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()) 
 
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(); 
	 
	for(i=0; NandFlashChip[i].id!=0; i++) 
		if(NandFlashChip[i].id==nand_id) {			 
			nand_id = i;			 
			support  = 1;					 
			return; 
		} 
	 
} 
 
void NandFlashStatusRep(void) 
{ 
	if(support) { 
		printf("\nNand Flash ID is 0x%x, Size = %dM, Status = 0x%x\n", NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20, NFReadStat()); 
	} else { 
		printf("\nNo supported Nand Flash Found!\n"); 
	} 
} 
 
//void (*pNandFlashInit)(void) = NandFlashInit; 
 
#endif	/* NAND_SUPPORT */