www.pudn.com > nandflash_1G08U0A.rar > drv_nandfls.h


//////////////////////////////////////////////////////////////////////// 
//	文件名		:drv_nandfls.c 
//	文件功能	:系统读取Nand Flash驱动 
//	作者		:xyliu 
//	创建时间	:2003年5月09日 
//      处理器	        : Epson E0C33S01 
//	项目名称	: 
//	备注		:适合硬件板卡Epson S1C33 Star、Legend MobilePhone 
//                可以驱动的Nand Flash型号: 
//				  K9F1208U0  2003/05/09  
//				  K9F5616    2003/05/09 
//   
//////////////////////////////////////////////////////////////////////// 
//	历史记录: 
//	编号     日期    	作者    备注 
//       1      2004/10/20      xyliu    加入了K9F1208U0M支持 
//////////////////////////////////////////////////////////////////////// 
 
 
#ifndef _Nand_Fls_H 
 
//Use K9F1208U0M 
 
typedef struct _tag_nand_fls 
{ 
	unsigned char  maker_code; 
	unsigned char  device_code; 
	unsigned char  rev1; 
	unsigned char  mutiplane_code; 
}t_nand_fls_id; 
 
 
#define MAKER_CODE		0xEC 
//#define DEVICE_CODE		0x76 
//#define MULTI_PLANE_CODE 	0xC0 
#define DEVICE_CODE		0xF1 
#define MULTI_PLANE_CODE 	0x15 
 
#define Nand_Fls_Status_Reg     0x402DD  //Port3 data register 
#define NAND_FLS_READY              1 
#define NAND_FLS_BUSY               0  
 
/*Flash command	*/								 
#define	 READ_MODE1_CMD		0x0000 
#define  READ_ADV_CMD     	0x0030 
#define	 READ_MODE2_CMD		0x0001 
#define	 READ_MODE3_CMD		0x0050 
#define  AUTO_WRITE_CMD		0x0080 
#define  PAGE_WRITE_CMD		0x0010 
#define  READ_STATUS_CMD	0x0070 
#define  AUTO_ERASE_CMD		0x0060 
#define  ERASE_CMD		0x00D0 
#define	 RESET_CMD		0x00ff 
#define  READ_ID      		0x0090 
#define  READ_ID_ADDR	 	0x0000 
 
//flash device information const 
#define	TOTAL_SIZE		0x1000000 
#define MAX_BLK_NUM 		1024		// mcp 
#define MAX_PG_NUM 		0x20  		//32 
#define PG_SIZE  		0x200 
#define BLK_SIZE 		0x4000 
 
#define	NAND_Flash_BASE_ADDRESS	0x4000000 	//both flash and SMC map to area 15 
 
 
#define	FLASH_SUCCESS		0x0  
#define	FLASH_FAILED		0x1  
#define	FLASH_PAR_ERR		0x2 
#define	FLASH_DATA_ERR		0x4 
#define	FLASH_TIME_OUT_ERR	0x5 
#define	FLASH_WRITE_ERR		0x6 
#define	FLASH_ERASE_ERR		0x7 
#define	FLASH_ECC_ERROR		0x8 
#define FLASH_ID_ERROR      	0x9 
 
 
//--------------------------------------------------------------------------------- 
// macro definition 
//--------------------------------------------------------------------------------- 
/* control port register */ 
#define	SET_ALE_OUTPUT		*(volatile unsigned char*)0x402da|=0x20		//p25	 
#define SET_CLE_OUTPUT		*(volatile unsigned char*)0x402da|=0x10		//p24 
 
#define	SET_ALE_H		*(volatile unsigned char*)0x402d9|=0x20		//set p25 H	 
#define	SET_ALE_L		*(volatile unsigned char*)0x402d9&=0xdf		//set p25 L	 
 
#define SET_CLE_H		*(volatile unsigned char*)0x402d9|=0x10		//set p24 H 
#define SET_CLE_L		*(volatile unsigned char*)0x402d9&=0xef		//set p24 L 
 
#define SET_WP_OUTPUT		*(volatile unsigned char*)0x300021|=0x01	// set P40 output 
#define SET_WP_H		*(volatile unsigned char*)0x300020|=0x01    	// set P40 high 
#define SET_WP_L		*(volatile unsigned char*)0x300020&=0xfe    	// set P40 low 
#define SET_WP_GPIO		*(volatile unsigned char*)0x300048|=0x01    	// set P40 as GPIO, not A25 
 
#define SET_BUSY_INPUT		*(volatile unsigned char*)0x300f47&=0xdf 	// set PD5 input 
#define CHECK_BUSY		(*(volatile unsigned char*)0x300f46 & 0x20 )	// PD5=L mean busy 
 
//Dual address DMA setting (ch2) 
#define DMA_DUAL 	  	*(volatile unsigned short*)0x48242 = 0x8000 	//  dual address mode 
#define DMA_EN  		*(volatile unsigned char*)0x4824c |= 0x01 	// enable Ch.2 DMA  
#define DMA_TRIG  		*(volatile unsigned char*)0x4029a |= 0x04 	// software trigger Ch.2 DMA  
 
#define CHECK_DMA_END		(*(volatile unsigned char*)0x4824c & 0x01 ) 
 
// ECC setting 
#define EN_ECC			*(volatile unsigned char*)0x300102|=0x01 	// enable ecc check 
#define DIS_ECC			*(volatile unsigned char*)0x300102 &=0xfe	// disable ecc check 
#define SET_DEVICE_16		*(volatile unsigned char*)0x300103|=0x01 	// 16 bit device 
#define SET_DEVICE_8		*(volatile unsigned char*)0x300103&=0xfe 	// 8 bit device 
#define RESET_ECC		*(volatile unsigned char*)0x300101|=0x01 	// reset ECC  
#define CHECK_ECC_READY		(*(volatile unsigned char*)0x300101& 0x1) 	// if can start ecc check 
 
#define ECC_AREA0_COL_ADDR	(unsigned char*)0x300104 
 
 
/* nand flash only control port register */ 
#define SET_NAND_CE_OUTPUT	*(volatile unsigned char*)0x300023|=0x02	//set P51 output 
#define SET_NAND_CE_H		*(volatile unsigned char*)0x300022|=0x2		//set CE H 
#define SET_NAND_CE_L		*(volatile unsigned char*)0x300022&=0xfd	//set CE L 
#define SET_NAND_CE_CE		*(volatile unsigned char*)0x30004a &=0xf3	// set p51 as CE15&16 for CE don't-care flash 
#define SET_NAND_CE_GPIO	*(volatile unsigned char*)0x30004a |=0x4 	// set p51 as GPIO 
 
/*smt only control port register*/ 
#define SET_SMC_CE_OUTPUT	*(volatile unsigned char*)0x300023|=0x10 	//set P54 output 
#define SET_SMC_CE_H		*(volatile unsigned char*)0x300022|=0x10	//set CE H 
#define SET_SMC_CE_L		*(volatile unsigned char*)0x300022&=0xef    	//set CE L 
#define SET_SMC_CE_GPIO 	*(volatile unsigned char*)0x30004b |=0x01	// set p54 as GPIO 
 
#define CLR_SMIFREG		*(volatile unsigned char*)0x300047&=0xf0	// clear smart media i/f lower 4 bit 
#define SET_SMIF_WE		*(volatile unsigned char*)0x300047|=0x01	// set p34 as SMWE 
#define SET_SMIF_RD		*(volatile unsigned char*)0x300047|=0x04	// set p35 as SMRD 
 
#define SET_NAND_AREA		*(volatile unsigned char*)0x300100=0x0  	// not select boot mode , area 15; both SMC, flash all map to area 15 
 //flash all map to area 15 
 
 
//Nand Flash Command and Data Port address 
#define 	Nand_Fls_Data_ADD	0x4000000 
#define 	Nand_Fls_COMM_ADD	0x4000004	 
#define 	Nand_Fls_Reg_ADD	0x4000008 
#define 	Nand_Fls_ADD_ADD	0x4000008 
 
//#define 	Nand_Fls_Data_ADD	0x1000000 
//#define 	Nand_Fls_COMM_ADD	0x1000004	 
//#define 	Nand_Fls_Reg_ADD	0x1000008 
//#define 	Nand_Fls_ADD_ADD	0x1000008 
 
 
 
#define BLOCK_Er_SETUP_COMMAND 0x60  //Auto Block Erase Setup Command 
#define Er_COMMAND 	       0xD0  //Erase Command 
#define READ_St_COMMAND        0x70  //Read Status Command 
#define SEQ_DATA_IN_COMMAND    0x80  //Sequential Data Input Command 
#define PROG_COMMAND           0x10  //Program Command 
 
 
//#define NFS_MAX_PLANE  4 
#define NFS_MAX_BLOCK  1024//4096 
#define NFS_MAX_PAGE   64//131072//65536//32768//16384//131072 
 
 
//Operation Nand Flash Status Flag 
#define ERASE_OK         0          //Erase OK 
#define ERASE_ERROR      1          //Erase Error 
#define ERASE_OK_FLAG    0           
#define ERASE_ERROR_FLAG 1 
 
#define NAND_INIT_OK     0 
#define NAND_INIT_ERROR  1  
 
 
#define PROG_OK          0          //Program OK 
#define PROG_ERROR       1          //Program Error 
#define PROG_OK_FLAG     0          //Program OK 
#define PROG_ERROR_FLAG  1          //Program Error 
 
//#define NAND_FLS_MAIN    512 
//#define NAND_FLS_ALL     528 
#define NAND_FLS_MAIN    2048 
#define NAND_FLS_ALL     2112 
 
//#define SET_NAND_CE_HIGH  REG_CHAR(IO_P2D_ADDR)  |= 0x04 
#define SET_NAND_CE_HIGH  REG_CHAR(0x300022) |= 0x02; 
//#define SET_NAND_CE_LOW	  REG_CHAR(IO_P2D_ADDR)  &= 0xfb 
#define SET_NAND_CE_LOW   REG_CHAR(0x300022) &= 0xfd; 
 
int nand_fls_init(void); 
int nand_fls_write_page(unsigned char *data,unsigned int page_num,unsigned int block_num); 
int nand_fls_read_page(unsigned char *data,unsigned int page_num,unsigned int block_num); 
int nand_fls_erase_block(unsigned int Block_Number); 
 
 
 
void Test_Nand_Flash(void); 
 
 
 
void nand_fls_tst_all(void); 
 
 
 
 
#endif