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

📄 nand.c

📁 杭州立宇泰ARMsys-P型ARM开发板BIOS代码
💻 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 + -