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

📄 tcl_gdi_eeprom.c

📁 用一个Flash的两个扇区虚拟一个Eeprom
💻 C
📖 第 1 页 / 共 3 页
字号:
* Output:              	TCL_UINT32 *auAlreadyReadLen - 实际读成功的字节数
* Return:        	TCL_NO_ERROR - 操作成功
				其它- 参考TCL_GDI_EEPROM_RETURN_VALUE 定义
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
TCL_UINT32 TCL_GDI_Eeprom_Read(TCL_UINT32 auAddr,TCL_UINT32 auReadLen,TCL_UINT8 *pBuff,TCL_UINT32 *auAlreadyReadLen)
{
	#ifndef USE_VIRTUAL_EEPROM
	ST_ErrorCode_t 	eErrCode 			= ST_NO_ERROR;	/* STAPI 返回值*/
	#endif

	*auAlreadyReadLen = 0;

	/* eeprom 子系统是否初始化?*/
	if ( TCL_FALSE == gbEepromDriverInit)
	{
		/* 没有*/
		/* 返回*/
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_Read -- eeprom driver have not init\n"));
		return TCL_GDI_EEPROM_NOT_INITIALIZED;
	}		
	
	/* pBuff = NULL ?*/
	if ( NULL == pBuff )
	{
		/* pBuff = NULL*/
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_Read --pbuff is NULL \n"));
		return TCL_GDI_EEPROM_PARAMTER_INVALID;
	}

	/* auAlreadyWriteLen 是否为NULL */
	if ( NULL == auAlreadyReadLen )
	{
		/* 为NULL */
		/* 返回*/
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_Read --auAlreadyReadLen is NULL \n"));
		return TCL_GDI_EEPROM_PARAMTER_INVALID;
	}	
	
	/* auLength > 0 */
	if ( auReadLen <= 0 )
	{
		/* auLength <= 0 */
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_Read --aulength is 0 \n"));
		return TCL_GDI_EEPROM_PARAMTER_INVALID;
	}
	
	#ifdef USE_VIRTUAL_EEPROM	
	/* 判断写地址和写字节数是否越界*/
	if ( ( auAddr + auReadLen ) > ( TCL_GDI_EEPROM_AREA_SIZE - TCL_GDI_WRITE_FLAG_BUFFER_LENGTH ) )
	{
		/* 越界*/
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_Write --address and write size is invalid ( auAddr + auReadLen = %d, total size = %d)\n",
			auAddr + auReadLen,TCL_GDI_EEPROM_AREA_SIZE - TCL_GDI_WRITE_FLAG_BUFFER_LENGTH));
		return TCL_GDI_EEPROM_PARAMTER_INVALID;
	}

	/* 等待信号量*/
	Eeprom_Lock();

	/* 从EepromBuffer 把数据拷贝到读buffer 中*/
	memcpy(pBuff,EepromBuffer.pBuff + auAddr,auReadLen);

	/* 释放信号量*/
	Eeprom_UnLock();

	*auAlreadyReadLen = auReadLen;
	#else	

	/* 等待信号量*/
	Eeprom_Lock();
	
	/* 通过ST 的eeprom 驱动读eeprom */
	eErrCode = STE2P_Read(E2PHndl,
		auAddr,
		pBuff,
		auReadLen,
		auAlreadyReadLen);
	/* 读eeprom  成功*/
	if( ST_NO_ERROR == eErrCode )
	{
		/* 成功*/

		/* 释放信号量*/
		Eeprom_UnLock();
		
		EEPROM_DEBUG(("info: TCL_GDI_Eeprom_Read --STE2P_Read eeprom success\n"));		
	}
	else
	{	
		/* 失败*/	

		/* 释放信号量*/
		Eeprom_UnLock();		
		
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_Read --STE2P_Read eeprom failure(eErrCode = %d,error = %s) \n",
			eErrCode,GetErrorText(eErrCode)));
		
		return TCL_GDI_EEPROM_READ_FAILURE;
	}	

	#endif

	/* 返回实际读的字节数*/
	return TCL_NO_ERROR;
}


/******************************************************************************
* Function:            TCL_GDI_Eeprom_GetInfo
* Description:        获取eeprom 相关信息
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_VOID
* Output:              	none
* Return:              TCL_NO_ERROR - 操作成功
				其它- 参考TCL_GDI_EEPROM_RETURN_VALUE 定义
* Arithmetic
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
TCL_VOID TCL_GDI_Eeprom_GetInfo(TCL_GDI_EEPROM_INFO *pEepromInfo)

{
	/* 判断参数是否有效*/
	if ( NULL == pEepromInfo )
	{
		EEPROM_ERROR(("error: TCL_GDI_Eeprom_GetInfo --pEepromInfo is NULL\n"));	
		return;
	}
	
	#ifdef USE_VIRTUAL_EEPROM
 	pEepromInfo->bUseVirtualEeprom	= TCL_TRUE;
	pEepromInfo->uSize 				= TCL_GDI_EEPROM_AREA_SIZE - TCL_GDI_WRITE_FLAG_BUFFER_LENGTH;
	pEepromInfo->uStartAddress 		= 0x0;	
	#else
 	pEepromInfo->bUseVirtualEeprom	= TCL_FALSE;
	/* 以下两个参数根据不用的平台会有不同*/
	pEepromInfo->uSize 				= 4 * 1024;
	pEepromInfo->uStartAddress 		= 0x0;		
	#endif
}


/******************************************************************************
* Function:          	TCL_GDI_Eeprom_PrintInfo
* Description:		打印eeprom 模块相应信息
* Calls:			omit
* Called By:		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		none
* Output: 		none
* Return:			TCL_VOID
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20080611						create
*******************************************************************************/
TCL_VOID TCL_GDI_Eeprom_PrintInfo(TCL_VOID)
{
	EEPROM_DEBUG(("-----------------------eeprom info----------------------\n"));
	EEPROM_DEBUG(("eeprom version = %s\n",TCL_Eeprom_Version));	
	EEPROM_DEBUG(("init = %s\n",gbEepromDriverInit?"TRUE":"FALSE"));
	#ifdef USE_VIRTUAL_EEPROM	
	EEPROM_DEBUG(("user virtual eeprom = TRUE, uSize = 0x%x, start address = 0x%x, flash section = %d\n",
		 4 * 1024,
		0,
		gbFlashSectorNo
		));
	#else
	EEPROM_DEBUG(("user virtual eeprom = TRUE, uSize = 0x%x, start address = 0x%x\n",
		4 * 1024,0
		));

	#endif
			
	EEPROM_DEBUG(("-------------------------------------------------------\n"));		
}


/******************************************************************************
* Function:            TCL_GDI_Eeprom_GetVersion
* Description:        获取eeprom 驱动版本号
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_VOID
* Output:              	none
* Return:               eeprom 驱动版本号
* Arithmetic
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
const TCL_CHAR *TCL_GDI_Eeprom_GetVersion(TCL_VOID)
{
	return TCL_Eeprom_Version;
}


#ifdef USE_VIRTUAL_EEPROM	
/******************************************************************************
* Function:            Eeprom_FlashWrite
* Description:		将数据写入flash
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		uBuff - 写buffer 
				uSize - 写字节数
				uOffset - 偏移地址(相对于扇区的起始地址)
* Output:              	none
* Return:              	实际写入的字节数
* Arithmetic
* Others: 		this function encapsulation Eeprom_FlashWrite(),we can do something in this funcion
				( such as, disable power off)	
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
static TCL_UINT32 Eeprom_FlashWrite(TCL_UINT32 uFlashSectorNo,TCL_UINT32 uOffset, TCL_UINT32 uSize, TCL_UINT8 *uBuff,TCL_UINT32 *pAlreadyWriteLen )
{
	TCL_UINT32 uAddress = 0;	/* 物理地址*/

	/* 得到用来虚拟eeprom 的flash 扇区起始地址*/
	uAddress = TCL_GDI_Flash_GetSecStartAddr(uFlashSectorNo);

	/* 地址有效?*/
	if(uAddress == 0xFFFFFFFF)
	{
		/* 无效*/
		EEPROM_ERROR(("error: Eeprom_FlashWrite -- Error: the page write is not correct:%x\n",uFlashSectorNo));
		return TCL_GDI_EEPROM_FLASH_ADDRESS_ERROR;
	}

	/* 计算物理地址*/
	uAddress += uOffset;		

	/* 写flash */
	if( TCL_NO_ERROR != TCL_GDI_Flash_Write(uAddress, uBuff, uSize,pAlreadyWriteLen) )
	{
		/* 写flash 失败*/
		EEPROM_ERROR(("error: Eeprom_FlashWrite -- Error: the offset write is not correct:%x\n",uAddress));
		return TCL_GDI_EEPROM_WRITE_FLASH_FAILURE;
	}

	/* 返回写入的字节数*/
	return TCL_NO_ERROR;
}


/******************************************************************************
* Function:            Eeprom_FlashRead
* Description:		从flash 读数据
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		uBuff - 读buffer 
				uSize - 写字节数
				uOffset - 偏移地址(相对于扇区的起始地址)
* Output:              	none
* Return:              	实际读成功的字节数
* Arithmetic
* Others: 		TCL_NO_ERROR - 操作成功
				其它- 参考TCL_GDI_EEPROM_RETURN_VALUE 定义
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
static TCL_UINT32 Eeprom_FlashRead(TCL_UINT32 uFlashSectorNo, TCL_UINT32 uOffset, TCL_UINT32 uSize, TCL_UINT8 *uBuff ,TCL_UINT32 *pAlreadyReadLen)
{
	TCL_UINT32 uAddress;	/* 物理地址*/

	/* 得到用来虚拟eeprom 的flash 扇区起始地址*/
	uAddress = TCL_GDI_Flash_GetSecStartAddr(uFlashSectorNo);

	/* 地址有效?*/
	if(uAddress == 0xFFFFFFFF)
	{
		/* 无效*/
		EEPROM_ERROR(("error: Eeprom_FlashRead -- Error: the page write is not correct:%x\n",uFlashSectorNo));
		return TCL_GDI_EEPROM_FLASH_ADDRESS_ERROR;
	}

	/* 计算物理地址*/
	uAddress += uOffset;		

	/* 读flash */
	if( TCL_NO_ERROR != TCL_GDI_Flash_Read(uAddress, uBuff, uSize,pAlreadyReadLen) )
	{
		/* 读flash 失败*/
		EEPROM_ERROR(("error: Eeprom_FlashRead -- Error: the offset write is not correct:%x\n",uAddress));
		return TCL_GDI_EEPROM_READ_FLASH_FAILURE;
	}

	/* 返回实际读成功的字节数*/
	return TCL_NO_ERROR;
}


 /******************************************************************************
* Function:            Eeprom_Task_Entry
* Description:		此任务用来将buffer 中的数据写入flash
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_UINT8 *pArg - 参数
* Output:              	none
* Return:              	void
* Arithmetic
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
static TCL_VOID Eeprom_Task_Entry(TCL_VOID *pArg)
{	
	TCL_BOOL	bError				= TCL_FALSE;
	TCL_UINT32	bWriteBytesOk		= 0;
	TCL_UINT32 	uWriteAddress		= 0;							/* 写地址 */
	TCL_UINT32 	gbWriteAreaIndex	= 0;							/* 写index */
	TCL_UINT8 	cFlagBuffer[TCL_GDI_WRITE_FLAG_BUFFER_LENGTH ] = {0};	/* flag buffer */

	while(1)
	{
		TCL_OSP_TaskWait(1);
		bError = TCL_FALSE;

		/* 在此之前有没有写flash 的操作?*/
		if ( TCL_FALSE == bFirstWriteFlash )
		{
			/* 有*/
			/* 确保两次写flash 的时间间隔>= 2秒*/
			while( time_minus(time_now(),uLastWriteFlashTime) < TCL_GDI_EEPROM_ONE_SECOND * 3 )
			{
				TCL_OSP_TaskWait(10);
			}			
		}		
		
		/* 等待信号量*/
		Eeprom_Lock();

		/* 是否有数据需要写入flash */
		if ( TCL_TRUE == EepromBuffer.uNeedWriteToFlash )
		{	
			/* 有*/
			EepromBuffer.uNeedWriteToFlash  = TCL_FALSE;

			/* 将buffer 中的数据写入写buffer 中*/
			memcpy(EepromBuffer.pWriteBuffer,EepromBuffer.pBuff,TCL_GDI_EEPROM_AREA_SIZE);

			/* 释放信号量*/
			Eeprom_UnLock(); 

			/* 设置' 第一次写Flash 标志' 为TCL_FALSE */
			bFirstWriteFlash 		= TCL_FALSE;

			/* 记录此次写flash 的时间*/
			uLastWriteFlashTime	= time_now();
				
			EEPROM_DEBUG(("info: Eeprom_Task_Entry: need to write to flash\n"));

			/* 计算要写的区域*/
			if ( gbCurAreaIndex == 0xFF )
			{
				gbWriteAreaIndex = 0;
			}
			else
			{
				gbWriteAreaIndex = (gbCurAreaIndex + 1) % TCL_GDI_EEPGOM_AREA_AMOUNT;
				if ( 0 == gbWriteAreaIndex )
				{
					/* 当前扇区写满了,写另一个扇区*/
					if ( giCurFlashSectorNo == gbFlashSectorNo )
					{
						giCurFlashSectorNo = gbFlashSectorNo2;
					}
					else
					{

⌨️ 快捷键说明

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