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

📄 adv_ctl.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif	//END ADV_ECC
			(unsigned short*)pBuffer = smtProlBuff.bFlatBuff;	// Switch the address of Prolix buffer;  
		  }
								
		ADV_R_CLE = SMT_BYTE1;					// CLE is set up in high
		*ADV_R_DATAIO = SMT_C_RNDOUT1;			// Random Read command 05h
		ADV_R_CLE = SMT_BYTE0;					// CLE is set up in low
		
		ADV_R_ALE = SMT_BYTE1;					// ALE is set up in high
		*ADV_R_DATAIO = (unsigned short)((ulColumn & 0xFF) | ((ulPage % 4) << 3));	// column address
		*ADV_R_DATAIO = (unsigned short)(((ulColumn >> 8) & 0xFF) | 0x04);
		ADV_R_ALE = SMT_BYTE0;					// ALE is set up in low

		ADV_R_CLE = SMT_BYTE1;					// CLE is set up in high
		*ADV_R_DATAIO = SMT_C_RNDOUT2;			// Random Read command e0h
		ADV_R_CLE = SMT_BYTE0;					// CLE is set up in low

		for(iLoop = 0; iLoop < SMT_S_PROLIX; iLoop+=2)
		{
			*(unsigned short*)pBuffer = *ADV_R_DATAIO;	// Read data area
			pBuffer +=2;
		}

		iRetVal = advReadyCheck(SMT_M_US2CNT(1));		// Ready check (1uS) routine is call
	  }

	return(iRetVal);
  }

/************************************************************************
 *  advPageProgram
 *      Type     : int
 *      Ret val  : Error Code
 *                    SMT_E_SUCCESS ( 0) ... Successful
 *                    SMT_E_FAILURE (-1) ... Failure
 *      Argument : unsigned long ulColumn ... Column address
 *                 unsigned long ulPage   ... Page address
 *                 const char *pBuffer    ... Read data buffer
 *                 unsigned char bVerify  ... Verify Enable/Disable flag
 *      Function : Page program function
 ************************************************************************/
int	advPageProgram(unsigned long ulColumn, unsigned long ulPage, const char *pBuffer, unsigned char bVerify)
{
	int	iRetVal;									// Return value
	int	iLoop;										// Loop Counter
	unsigned long	uTimeLoop;						// Time Loop Counter
	union SMT_STATUS	uStatus;					// Status code
	unsigned long 	ulCvtPage;
	unsigned short	*pWrtPnt;

	if(adv_EraseFlg)
	  {
		advEraseChk();
	  }
	
	ulCvtPage = ulPage/4;

	if((unsigned long)pBuffer & 0x01)				// check if pBuffer Address A0
	  {
		memcpy(ulTranBuf, pBuffer , SMT_S_DATA);
		pWrtPnt = ulTranBuf;
	  }			
	else
		pWrtPnt = (unsigned short *)pBuffer;

#ifdef	ADV_HDMA
	// HDMA Setting
	*(volatile unsigned long*)0x48240 = 0x0;				// clear DmaReg
	*(volatile unsigned short*)0x48240 = SMT_S_DATA/2;		// transfer count
	*(volatile unsigned char*)0x48243 = 0x80;				// dual transfer mode	

	*(volatile unsigned long*)0x48244 = (unsigned long)pWrtPnt;		// source address
	*(volatile unsigned char*)0x48247 |=0x70;						// 16bit transfer, src inc

	*(volatile unsigned long*)0x48248 = (unsigned long)ADV_R_DATAIO;	// dest address
	*(volatile unsigned char*)0x4824b &=0x0f;				// successive transfer mode, dest fix
	*(volatile unsigned char*)0x4824b |=0x40;				
#endif

	ADV_R_WP = SMT_BYTE1;			// WP is set up in high

	ADV_R_CLE = SMT_BYTE1;			// CLE is set up in high
	*ADV_R_DATAIO = SMT_C_SDATINP;	// Serial data input command 80h
	ADV_R_CLE = SMT_BYTE0;			// CLE is set up in low

	ADV_R_ALE = SMT_BYTE1;			// ALE is set up in high
	*ADV_R_DATAIO = (unsigned short)(ulColumn & 0xFF);			// column address
	*ADV_R_DATAIO = (unsigned short)((ulColumn >> 8) & 0xFF |(ulPage % 4));
	*ADV_R_DATAIO = (unsigned short)(ulCvtPage & 0xFF);			// page address
	*ADV_R_DATAIO = (unsigned short)((ulCvtPage >> 8) & 0xFF);	//
	ADV_R_ALE = SMT_BYTE0;			// ALE is set up in low

#ifdef	ADV_ECC
			SMT_ECC_RST;					// Reset ECC
			SMT_ECC_EN;						// Enable ECC
#endif		

#ifdef	ADV_HDMA
			SMT_DMA_ENABLE;
			SMT_DMA_TRG;
			
			for(uTimeLoop = 0; uTimeLoop<SMT_M_US2CNT(10); uTimeLoop++)
			{
				if(!SMT_DMA_FLAG)
					break;
			}
#else
//	pWrtPnt = (unsigned short *)pBuffer;
	for(iLoop = 0; iLoop < SMT_S_DATA; iLoop+=2)		// Write data area
	  {
		*ADV_R_DATAIO = *pWrtPnt++;
	  }
#endif

#ifdef	ADV_ECC
			SMT_ECC_DIS;
			if(SMT_ECC_RDY)
				smtProlBuff.stDatBuff.bEcc1[0] = *ECC_A0_LPL_ADDR;		//LP0
				smtProlBuff.stDatBuff.bEcc1[1] = *ECC_A0_LPH_ADDR;		//LP1
				smtProlBuff.stDatBuff.bEcc1[2] = *ECC_A0_CP_ADDR;		//CP
				smtProlBuff.stDatBuff.bEcc2[0] = *ECC_A1_LPL_ADDR;
				smtProlBuff.stDatBuff.bEcc2[1] = *ECC_A1_LPH_ADDR;
				smtProlBuff.stDatBuff.bEcc2[2] = *ECC_A1_CP_ADDR;
#endif	

	ADV_R_CLE = SMT_BYTE1;			// CLE is set up in high
	*ADV_R_DATAIO = SMT_C_RNDIN;	// Serial data input command 85h
	ADV_R_CLE = SMT_BYTE0;			// CLE is set up in low

	ADV_R_ALE = SMT_BYTE1;			// ALE is set up in high
	*ADV_R_DATAIO = (unsigned short)((ulColumn & 0xFF) | ((ulPage % 4) << 3));	// column address
	*ADV_R_DATAIO = (unsigned short)(((ulColumn >> 8) & 0xFF) | 0x04);
	ADV_R_ALE = SMT_BYTE0;			// ALE is set up in low

	pWrtPnt = (unsigned short *)smtProlBuff.bFlatBuff;
	for(iLoop = 0; iLoop < SMT_S_PROLIX; iLoop+=2)		// Write data area
	  {
		*ADV_R_DATAIO = *pWrtPnt++;
	  }

	ADV_R_CLE = SMT_BYTE1;								// CLE is set up in high
	*ADV_R_DATAIO = SMT_C_PROGRAM;						// Page program command 10h
	ADV_R_CLE = SMT_BYTE0;								// CLE is set up in low

	iRetVal = advReadyCheck(SMT_M_MS2CNT(20));			// Ready check (20mS) routine is call
	if(iRetVal == SMT_E_SUCCESS)
	  {

		ADV_R_WP = SMT_BYTE0;		// WP is set up in low

		iRetVal = advStatusRead(&uStatus.bByte);			// Status read routine is call
		if(iRetVal == SMT_E_SUCCESS)
		  {
			if(((uStatus.stBit.bRB)&&(uStatus.stBit.bPF))	// Status = Ready? and Erase = Fail?
			||(!uStatus.stBit.bRB))							// or Status = Busy?
			  {
				smtErrInf.iSmtErr = SMT_E_PAGPROG;			// ERROR : Page program error !!
				iRetVal = SMT_E_FAILURE;
			  }
		  }
	  }
	  
	if(bVerify)
	  {
		iRetVal = smtVerifyCheck(ulPage, pBuffer);
	  }
	return(iRetVal);
}

/************************************************************************
 *  advProlixProgram
 *      Type     : int
 *      Ret val  : Error Code
 *                    SMT_E_SUCCESS ( 0) ... Successful
 *                    SMT_E_FAILURE (-1) ... Failure
 *      Argument : unsigned long ulColumn ... Column address
 *                 unsigned long ulPage   ... Page address
 *                 const char *pBuffer    ... Read data buffer (16 Bytes)
 *      Function : Prolix program function
 ************************************************************************/
int	advProlixProgram(unsigned long ulColumn, unsigned long ulPage, const char *pBuffer)
  {
	int	iRetVal;							// Return value
	int	iLoop;								// Loop Counter
	union SMT_STATUS	uStatus;			// Status code
	unsigned long	 	ulCvtPage;
	unsigned short		*pWrtPnt;

	if(adv_EraseFlg)
	  {
		advEraseChk();
	  }
	
	ulCvtPage = ulPage/4;

	ADV_R_WP = SMT_BYTE1;			// WP is set up in high

	ADV_R_CLE = SMT_BYTE1;			// CLE is set up in high
	*ADV_R_DATAIO = SMT_C_SDATINP;	// Serial data input command
	ADV_R_CLE = SMT_BYTE0;			// CLE is set up in low

	ADV_R_ALE = SMT_BYTE1;			// ALE is set up in high
	*ADV_R_DATAIO = (unsigned short)(ulColumn & 0xFF | ((ulPage %4)<<3));	// column addrss
	*ADV_R_DATAIO = (unsigned short)(((ulColumn >> 8) & 0xFF) | 0x04);
	*ADV_R_DATAIO = (unsigned short)(ulCvtPage & 0xFF);						// page address
	*ADV_R_DATAIO = (unsigned short)((ulCvtPage >> 8) & 0xFF);
	ADV_R_ALE = SMT_BYTE0;			// ALE is set up in low

	pWrtPnt = (unsigned short *)pBuffer;
	for(iLoop = 0; iLoop < SMT_S_PROLIX; iLoop+=2)
	  {
		*ADV_R_DATAIO = *pWrtPnt++;	// Write prolix area
	  }

	ADV_R_CLE = SMT_BYTE1;			// CLE is set up in high
	*SMT_R_DATAIO = SMT_C_PROGRAM;	// Page program command
	ADV_R_CLE = SMT_BYTE0;			// CLE is set up in low
	
	iRetVal = advReadyCheck(SMT_M_MS2CNT(20));		// Ready check (20mS) routine is call
	if(iRetVal == SMT_E_SUCCESS)
	  {
		ADV_R_WP = SMT_BYTE0;						// WP is set up in low

		iRetVal = advStatusRead(&uStatus.bByte);	// Status read routine is call
		if(iRetVal == SMT_E_SUCCESS)
		  {
			if(((uStatus.stBit.bRB)&&(uStatus.stBit.bPF))	// Status = Ready? and Erase = Fail?
			||(!uStatus.stBit.bRB))							// or Status = Busy?
			  {
				smtErrInf.iSmtErr = SMT_E_PAGPROG;			// ERROR : Page program error !!
				iRetVal = SMT_E_FAILURE;
			  }
		  }
	  }

	return(iRetVal);
  }

/************************************************************************
 *  advReadyCheck
 *      Type     : int
 *      Ret val  : Error Code
 *                    SMT_E_SUCCESS ( 0) ... Successful
 *                    SMT_E_FAILURE (-1) ... Failure
 *      Argument : unsigned long ulTime ... Wait time
 *      Function : Ready statuc check
 ************************************************************************/
int	advReadyCheck(unsigned long ulTime)
{
	int	iRetVal;							// Return Value
	unsigned long	ulLoop;					// Loop Counter

	for(ulLoop = 0; ulLoop < ulTime; ulLoop++)
	  {
		if(ADV_R_RB)			// Ready?
		  {
			break;
		  }
	  }

	if(ulLoop < ulTime)
	  {
		iRetVal = SMT_E_SUCCESS;
		smtErrInf.iSmtErr = SMT_E_SUCCESS;
	  }
	else
	  {
		iRetVal = SMT_E_FAILURE;
		smtErrInf.iSmtErr = SMT_E_TIMEOUT;
	  }

	return(iRetVal);
  }

/************************************************************************
 *  advEraseChk
 *      Type     : int
 *      Ret val  : Error Code
 *                    SMT_E_SUCCESS ( 0) ... Successful
 *                    SMT_E_FAILURE (-1) ... Failure
 *      Argument : none
 *      Function : Block Erase result check
 ************************************************************************/
int	advEraseChk(void)
{
	int	iRetVal;
	union SMT_STATUS	uStatus;			// Status code

	if(!adv_EraseFlg)
	  {
		return(SMT_E_SUCCESS);
	  }

	adv_EraseFlg = 0;						// Erasing flag clear

	iRetVal = advReadyCheck(SMT_M_MS2CNT(400));		// Ready check (400mS) routine is call
	if(iRetVal == SMT_E_SUCCESS)
	  {
		ADV_R_WP = SMT_BYTE0;		// WP is set up in low
		iRetVal = advStatusRead(&uStatus.bByte);	// Status read routine is call
		if(iRetVal == SMT_E_SUCCESS)
		  {
			if(((uStatus.stBit.bRB)&&(uStatus.stBit.bPF))	// Status = Ready? and Erase = Fail?
			||(!uStatus.stBit.bRB))					// or Status = Busy?
			  {
				smtErrInf.iSmtErr = SMT_E_BKERASE;	// ERROR : Block erase error !!
				iRetVal = SMT_E_FAILURE;
			  }
		  }
	  }

	return(iRetVal);
}

/***** End of file *****/

⌨️ 快捷键说明

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