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

📄 drv_nandflash.c

📁 drive for nandflash on sansung corp.
💻 C
📖 第 1 页 / 共 2 页
字号:
 	asm("nop");
  	do{}
 	while (!CHECK_BUSY);		/*wait R/#B to high*/

	SET_CLE_H;	/* set CLE high*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
	SET_CLE_L;	/*set CLE l	*/


	ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;

	SET_NAND_CE_H;

	if (ReadStatus & 0x1)
		return FLASH_WRITE_ERR;

	return RetVal;
}




//---------------------------------------------------------------------------------
//  	Function name 		: fnFlash_BlockErase
// 	Function description	: write page data to SMC
//
//      Parameters
//         Input  		:unsigned long 	ulAddress  		block address
//         Output 		:
//         I/O    		:void
//
//      Return value 		:unsigned char	FLASH_SUCCESS		Success
//						FLASH_PAR_ERR		parameter error
//						FLASH_ERASE_ERR		erase error
//	Global variable 	:void
//---------------------------------------------------------------------------------
unsigned char fnFlash_BlockErase(unsigned long ulAddress){

	unsigned char	 ReadStatus;
	unsigned char  RetVal;
	unsigned short pageAddr,blockAddrL,blockAddrH;

	#ifdef	DEBUG
		if((ulAddress < 0 ) || ( ulAddress >= (MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE) ))
  		return FLASH_PAR_ERR;
	#endif

  	pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9) ;     /*A16-9*/
	blockAddrL=(unsigned short)((ulAddress & 0x0fe0000)>>17);    /*A23-17*/
//	blockAddrH=(unsigned short)((ulAddress & 0x10000000)>>28);    /*A28*/

	SET_NAND_CE_L;
	SET_CLE_H;	/* set CLE high*/

	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=AUTO_ERASE_CMD;/* write command*/

	SET_CLE_L;		/* set CLE low*/

	SET_ALE_H;		/* set ALE h*/

	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=pageAddr;	  	 /* send page address*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrL;		 /* send block l address*/
//	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrH;   	/* send block h address*/

	SET_ALE_L;		/*set ALE L*/

	SET_CLE_H;		/* set CLE high*/
	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=ERASE_CMD;

  	SET_CLE_L;		/*set CLE l*/

	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
 	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
 	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
  	asm("nop");
 	asm("nop");
  	do{}
 	while (!CHECK_BUSY);		/*wait R/#B to high*/


	SET_CLE_H;			/* set CLE high*/

	*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;

	SET_CLE_L;			/*set CLE l*/

	ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;

	SET_NAND_CE_H;

	if (ReadStatus & 0x1)
		return FLASH_ERASE_ERR;

 	 return FLASH_SUCCESS;

}

//---------------------------------------------------------------------------------
//  	Function name 		: Flash_Load_Init
// 	Function description	: called by fnFlshErase, every time download srf/sa file from debug tool
//				  must call fnFlshErase.
//
//      Parameters
//         Input  		: void
//         Output 		:
//         I/O    		: void
//
//      Return value 		: unsigned char
//
//
//	Global variable 	:void
//---------------------------------------------------------------------------------
void Flash_Load_Init(void){

	/*Initialize count for fnFlashLoad*/
	databuf_cnt=0;
	fls_ldcnt=0;
	checkSum=0x0;
	page_cnt=0;

}

//---------------------------------------------------------------------------------
//  	Function name 		: fnFlshLoad
// 	Function description	: called by debug tool to download srf/sa file
//
//
//      Parameters
//         Input  		: void
//         Output 		:
//         I/O    		: void
//
//    	Return value 		:unsigned char	FLASH_SUCCESS		write Success
//						FLASH_ECC_ERROR		ecc check error
//						FLASH_PAR_ERR		parameter error
//						FLASH_WRITE_ERR		write error
//
//	Global variable 	:void
//---------------------------------------------------------------------------------
unsigned char  fnFlshLoad(unsigned long ulPA, unsigned long ulData1, unsigned long ulData2){


	int i;
	unsigned char  RetVal,TempData;
	unsigned long	 TempAddr;

	//ulOldPA=ulPA;
	fls_ldcnt++;

	//ulData1;
	TempData=(unsigned short)(ulData1&0x00ff);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	TempData=(unsigned short)((ulData1&0xff00)>>8);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif


	TempData=(unsigned short)((ulData1&0xff0000)>>16);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	TempData=(unsigned short)((ulData1&0xff000000)>>24);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	//ulData2
	TempData=(unsigned short)(ulData2&0x00ff);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	TempData=(unsigned short)((ulData2&0xff00)>>8);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	TempData=(unsigned short)((ulData2&0xff0000)>>16);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	TempData=(unsigned short)((ulData2&0xff000000)>>24);
	write_buf[databuf_cnt++]=TempData;
	checkSum+=TempData;
#ifdef BOOT_16
	// fill high 8 bit
	write_buf[databuf_cnt++]=0x00;
#endif

	#ifdef BOOT
		if (!(fls_ldcnt%2)){//>16 calc checksum
			#ifdef BOOT_L05
				write_buf[databuf_cnt++]=~checkSum;

			#else

				write_buf[databuf_cnt++]=checkSum;
			#endif

			#ifdef BOOT_16
				// fill high 8 bit
				write_buf[databuf_cnt++]=0x00;
			#endif

			checkSum=0;
		}
	#endif
	if (fls_ldcnt>=MAX_LD_CNT){
		#ifdef BOOT
			#ifdef BOOT_16
				memset(&write_buf[databuf_cnt],0xff,2); //only 255

			#else
				memset(&write_buf[databuf_cnt],0xff,257); //only 255
			#endif

		#endif
		TempAddr=ulStAddr+page_cnt*PG_SIZE;


		RetVal=DOWNLOAD_FUN(TempAddr & 0xfffffe00,(unsigned char*)write_buf);

		databuf_cnt=0;
		fls_ldcnt=0;
		page_cnt++;


	}
	return FLASH_SUCCESS;




}


//---------------------------------------------------------------------------------
//  	Function name 		: fnFlshErase
// 	Function description	: called by debug tool to erase srf/sa file
//
//
//      Parameters
//         Input  		: unsigned short ulCtrlReg	the start destination address where need to write data to
//				  unsigned short ulBlockBgn	start block (base on 1)
//				  unsigned short ulBlockEnd	end block (base on 1)
//         Output 		:
//         I/O    		: void
//
//      Return value 		:unsigned char	FLASH_SUCCESS		Success
//						FLASH_PAR_ERR		parameter error
//						FLASH_ERASE_ERR		erase error
//	Global variable 	:void
//---------------------------------------------------------------------------------
unsigned char  fnFlshErase( unsigned long ulCtrlReg, unsigned long ulBlockBgn, unsigned long ulBlockEnd ){

	unsigned short	Cnt;
	unsigned char   RetVal;
	unsigned short	ulEnd,ulBeg;
	unsigned long	 TempAddr;


	#ifdef	DEBUG
		if( ulBlockBgn >= MAX_BLK_NUM )	/*start block parameter is NG */
			return FLASH_PAR_ERR;
		else if(( ulBlockEnd<ulBlockBgn ) || ( ulBlockEnd >MAX_BLK_NUM ))	/*end block parameter is NG*/
			return FLASH_PAR_ERR;
	#endif

	if( (long)ulBlockBgn == -2){
		TempAddr=ulStAddr+page_cnt*PG_SIZE;

		RetVal=DOWNLOAD_FUN(TempAddr & 0xfffffe00,(unsigned char*)write_buf);
		if( RetVal == FLASH_SUCCESS )
			RetVal = FLASH_BUF_FLUSH;
		databuf_cnt=0;
		fls_ldcnt=0;
		page_cnt++;
		return RetVal;
	}

	/* area 6 for internal access , other external area, little endian*/
	*(volatile unsigned short*)0x48132=0x0200;
	/* area 6 1 wait cycle, area5 0 wait cycle*/
	*(volatile unsigned short*)0x4812a=0x0100;
	*(volatile unsigned char*)0x48131=0x04;
	Flash_Load_Init();
	ulStAddr=ulCtrlReg;
	FLASH_INIT();


	//parameter check
	if( !ulBlockBgn ){
		ulEnd=MAX_BLK_NUM;
		ulBeg=1;
	}
	else {
		ulEnd=ulBlockEnd;
		ulBeg=ulBlockBgn;
	}
	for (Cnt=ulBeg-1;Cnt<ulEnd; Cnt++){
		RetVal=ERASE_FUN(Cnt*BLK_SIZE);
		if (RetVal!=FLASH_SUCCESS)
			return RetVal;
	}

	return FLASH_SUCCESS;

}

/**************************************************************************************************
 *      Name:           fnReadID_flash
 *      Type:           T_UBYTE
 *      Ret val:        return value of erase sector
 *                              FLASH_SUCCESS           read Success
 *                              FLASH_FAILED            read failed
 *                              FLASH_ECC_ERROR
 *                              FLASH_PAR_ERR
 *      Argument:       T_UWORD  ulAddress              start address
 *                      T_UBYTE* pReadBuf               buf for store read data
 *      Function:       read Smart Media card ID data
 *************************************************************************************************/
unsigned char fnReadID_flash(unsigned char* pID_Data){

        unsigned char Cnt;
	SET_NAND_CE_L;
	
        SET_CLE_H;              // set CLE H

        *( volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_ID;     // read id 1

        SET_CLE_L;              // set CLE low

        SET_ALE_H;              // set ALE h

        *( volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_ID_ADDR;        // send  address

        SET_ALE_L;              //set ALE L

        fnCheck_busy();

        for (Cnt = 0; Cnt <2; Cnt++){
          *pID_Data++=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
        }

	SET_NAND_CE_H;
        return FLASH_SUCCESS;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -