⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand.c

📁 一个精简的FAT16文件系统在NandFLASH上的建立。开发环境ARM7 S3C44b0
💻 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 + -