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

📄 tcl_gdi_eeprom.c

📁 用一个Flash的两个扇区虚拟一个Eeprom
💻 C
📖 第 1 页 / 共 3 页
字号:
						giCurFlashSectorNo = gbFlashSectorNo;
					}

					/* 擦除扇区*/
					EEPROM_DEBUG(("---------------Eeprom erase flash begin--------------\n"));
					if ( TCL_NO_ERROR != TCL_GDI_Flash_Erase(giCurFlashSectorNo,1) )
					{
						/* 擦除扇区失败*/
						EEPROM_ERROR(("error: Eeprom_Task_Entry--erase flash failure \n"));
						bError = TCL_TRUE;
					}	
					else
					{
						/* 擦除扇区成功*/
						EEPROM_DEBUG(("info: Eeprom_Task_Entry: erase flash success\n"));
					}	

					task_delay(TCL_GDI_EEPROM_ONE_SECOND * 3);
					
					EEPROM_DEBUG(("---------------Eeprom erase flash end--------------\n"));
				}
			}			

			EEPROM_DEBUG(("-----giCurFlashSectorNo = %d,gbCurAreaIndex = %d,  gbWriteAreaIndex = %d-------\n",
				giCurFlashSectorNo,gbCurAreaIndex,gbWriteAreaIndex));

			/* 前面的操作成功?*/
			if (TCL_FALSE == bError )
			{
				/* 成功*/
				uWriteAddress = gbWriteAreaIndex * TCL_GDI_EEPROM_AREA_SIZE;	

				/* 设置flag 数据*/
				memset(cFlagBuffer,TCL_GDI_WRITE_FLAG,TCL_GDI_WRITE_FLAG_BUFFER_LENGTH );

				if ( guWriteCount < 0xFFFFFFFF )
				{
					guWriteCount = guWriteCount + 1;
				}
				else
				{
					guWriteCount = 0;
				}
				
				memcpy(&(cFlagBuffer[TCL_GDI_WRITE_FLAG_BUFFER_LENGTH - 4]),&guWriteCount,4);				
				memcpy(EepromBuffer.pWriteBuffer + EepromBuffer.uBufferLength, cFlagBuffer, TCL_GDI_WRITE_FLAG_BUFFER_LENGTH);

				/* 写flash  */
				if ( TCL_NO_ERROR != Eeprom_FlashWrite(giCurFlashSectorNo,uWriteAddress,TCL_GDI_EEPROM_AREA_SIZE,EepromBuffer.pWriteBuffer,&bWriteBytesOk))
				{
					/* 写falsh 失败*/
					EEPROM_ERROR(("error: Eeprom_Task_Entry - Eeprom_FlashWrite failure,maybe state is not correct,reset sector %d and wait again\n",giCurFlashSectorNo));

					/* 如果写flash 失败,可能是状态出错,复位当前写出错的Flash,再写,这样可以保证不会出错*/
					if ( TCL_GDI_Flash_Erase(giCurFlashSectorNo,1) == TCL_NO_ERROR )
					{
						gbCurAreaIndex = 0; 
						uWriteAddress = gbCurAreaIndex * TCL_GDI_EEPROM_AREA_SIZE;	
						if ( TCL_NO_ERROR != Eeprom_FlashWrite(giCurFlashSectorNo,uWriteAddress,TCL_GDI_EEPROM_AREA_SIZE,EepromBuffer.pWriteBuffer,&bWriteBytesOk))
						{
							EEPROM_ERROR(("error: Eeprom_Task_Entry - write flash again failure\n"));
						}
					}
					else
					{
						EEPROM_ERROR(("error: Eeprom_Task_Entry - erase sector %d failure, sector maybe have been destroyed\n",giCurFlashSectorNo));	
					}	
					
					/* 写falsh 失败*/
					EEPROM_ERROR(("error: Eeprom_Task_Entry --Eeprom_FlashWrite failure \n"));
					EepromBuffer.uNeedWriteToFlash  = TCL_TRUE;						
				}
				else
				{	
					/* 写falsh 成功*/
					EEPROM_DEBUG(("info: Eeprom_Task_Entry --Eeprom_FlashWrite success \n"));

					/* 记录此次写的区域*/
					gbCurAreaIndex = gbWriteAreaIndex;						
				}															
			}
		}
		else
		{
			/* 释放信号量*/
			Eeprom_UnLock(); 
		}
	}
}


 /******************************************************************************
* Function:            Eeprom_InitBuffer
* Description:		初始化buffer ,将Flash 中的数据读入buffer 中
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		void
* Output:              	none
* Return:              	TCL_NO_ERROR	- 操作成功
				其它- 参考TCL_GDI_EEPROM_RETURN_VALUE 定义
* Arithmetic		
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
******************************************************************************/
static TCL_UINT32 Eeprom_InitBuffer(TCL_VOID)
{
	TCL_INT32 		iLoop		= 0;
	TCL_INT32		iLoop2		= 0;
	TCL_INT32		iInvalidDataAreaIndex1;
	TCL_INT32		iInvalidDataAreaIndex2;
	TCL_UINT32		uReadBytesOk = 0;
	TCL_UINT8 		cReadBuffer[TCL_GDI_WRITE_FLAG_BUFFER_LENGTH ] = {0};
	TCL_UINT32 		uAddress	= 0;	
	TCL_UINT32 		uWriteCount1 = 0;
	TCL_UINT32 		uWriteCount2 = 0;

	/* 设置buffer 字节数*/
	EepromBuffer.uBufferLength = TCL_GDI_EEPROM_AREA_SIZE - TCL_GDI_WRITE_FLAG_BUFFER_LENGTH ;
	/* 初始化' 写flash ' 标志为TCL_FALSE*/
	EepromBuffer.uNeedWriteToFlash = TCL_FALSE;
	/* 分配 buffer 内存*/
	EepromBuffer.pBuff = memory_allocate(SystemPartition, TCL_GDI_EEPROM_AREA_SIZE);	
	if ( NULL == EepromBuffer.pBuff )
	{
		/* 分配 buffer 内存失败*/
		EEPROM_ERROR(("error: Eeprom_InitBuffer --allocate pBuff failed\n"));
		return TCL_GDI_EEPROM_NO_ENOUGH_MEM;
	}
	/* 分配 写buffer 内存*/	
	EepromBuffer.pWriteBuffer = memory_allocate(SystemPartition, TCL_GDI_EEPROM_AREA_SIZE);	
	if ( NULL == EepromBuffer.pWriteBuffer )
	{
		/* 分配 写buffer 内存失败*/
		EEPROM_ERROR(("error: Eeprom_InitBuffer --allocate pWriteBuffer failed\n"));
		return TCL_GDI_EEPROM_NO_ENOUGH_MEM;
	}	

	/* 在第一个扇区中查找 一个无效的数据区*/
	iInvalidDataAreaIndex1 = -1;
	for ( iLoop = 0; iLoop < TCL_GDI_EEPGOM_AREA_AMOUNT; iLoop++ )
	{
		uAddress = (iLoop + 1) * TCL_GDI_EEPROM_AREA_SIZE  - TCL_GDI_WRITE_FLAG_BUFFER_LENGTH;
		memset(cReadBuffer,0,sizeof( cReadBuffer ));

		/* 读数据校验区*/
		if ( TCL_NO_ERROR != Eeprom_FlashRead(gbFlashSectorNo,uAddress,TCL_GDI_WRITE_FLAG_BUFFER_LENGTH ,cReadBuffer,&uReadBytesOk) )
		{
			EEPROM_ERROR(("error: Eeprom_InitBuffer --read falsh failure\n"));
			return TCL_GDI_EEPROM_READ_FLASH_FAILURE;
		}

		/* 取出最后一个写的count */
		memcpy(&uWriteCount1,&(cReadBuffer[TCL_GDI_WRITE_FLAG_BUFFER_LENGTH - 4]),4);

		/* 校验数据*/
		for ( iLoop2 = 0; iLoop2 < TCL_GDI_WRITE_FLAG_BUFFER_LENGTH - 4; iLoop2++)
		{
			if ( cReadBuffer[iLoop2] != TCL_GDI_WRITE_FLAG )
			{	
				/*  数据校验没有通过*/
				iInvalidDataAreaIndex1 = iLoop;
				break;
			}
		}

		/* 数据校验是否通过?*/
		if ( iInvalidDataAreaIndex1 != -1 )
		{		
			/* 没有通过,既找到了一个无效的数据区*/
			iInvalidDataAreaIndex1 = iLoop;
			break;
		}
	}


	/* 在第二个扇区中查找 一个无效的数据区*/
	iInvalidDataAreaIndex2 = -1;
	for ( iLoop = 0; iLoop < TCL_GDI_EEPGOM_AREA_AMOUNT; iLoop++ )
	{
		uAddress = (iLoop + 1) * TCL_GDI_EEPROM_AREA_SIZE  - TCL_GDI_WRITE_FLAG_BUFFER_LENGTH;
		memset(cReadBuffer,0,sizeof( cReadBuffer ));

		/* 读数据校验区*/
		if ( TCL_NO_ERROR != Eeprom_FlashRead(gbFlashSectorNo2,uAddress,TCL_GDI_WRITE_FLAG_BUFFER_LENGTH ,cReadBuffer,&uReadBytesOk) )
		{
			EEPROM_ERROR(("error: Eeprom_InitBuffer --read falsh failure\n"));
			return TCL_GDI_EEPROM_READ_FLASH_FAILURE;
		}

		/* 取出最后一个写的count */
		memcpy(&uWriteCount2,&(cReadBuffer[TCL_GDI_WRITE_FLAG_BUFFER_LENGTH - 4]),4);

		/* 校验数据*/
		for ( iLoop2 = 0; iLoop2 < TCL_GDI_WRITE_FLAG_BUFFER_LENGTH - 4; iLoop2++)
		{
			if ( cReadBuffer[iLoop2] != TCL_GDI_WRITE_FLAG )
			{	
				/*  数据校验没有通过*/
				iInvalidDataAreaIndex2 = iLoop;
				break;
			}
		}

		/* 数据校验是否通过?*/
		if ( iInvalidDataAreaIndex2 != -1 )
		{		
			/* 没有通过( 既找到了一个无效的数据区)*/
			iInvalidDataAreaIndex2 = iLoop;
			break;
		}
	}

	EEPROM_DEBUG(("--------------iInvalidDataAreaIndex1 = %d,iInvalidDataAreaIndex2 = %d--------\n",
		iInvalidDataAreaIndex1,iInvalidDataAreaIndex2));
	
	if ( 0 == iInvalidDataAreaIndex1 )
	{
		/* 扇区1 中没有数据*/
		if ( 0 == iInvalidDataAreaIndex2 )
		{
			/* 扇区2 中没有数据*/
			/* 系统是初次运行,复位*/
			if ( TCL_NO_ERROR != TCL_GDI_Flash_Erase(gbFlashSectorNo,1) )
			{
				/* 擦除失败*/			
				EEPROM_ERROR(("error: Eeprom_InitBuffer--erase flash failure \n"));
				return TCL_GDI_EEPROM_ERASE_FLASH_FAILURE;
			}

			/* 清空buffer */
			memset(EepromBuffer.pBuff,0,EepromBuffer.uBufferLength);			

			/* 设置当前写入的区域为0xFF */
			gbCurAreaIndex		= 0xFF;
			giCurFlashSectorNo	= gbFlashSectorNo;
			guWriteCount		= 0;
		}
		else if ( -1 == iInvalidDataAreaIndex2 ) 
		{
			/* 扇区2 写满*/
			/* 扇区2 的最后一个数据区为有效数据区*/
			giCurFlashSectorNo	= gbFlashSectorNo2;
			gbCurAreaIndex		= TCL_GDI_EEPGOM_AREA_AMOUNT -1;	
			guWriteCount		= uWriteCount2;
		}
		else
		{
			/* 扇区2  有 数据但没有写满*/
			/* 扇区2 的最后一个数据区为有效数据区*/
			giCurFlashSectorNo	= gbFlashSectorNo2;
			gbCurAreaIndex		= iInvalidDataAreaIndex2 -1;
			guWriteCount		= uWriteCount1;
		}			
	}
	else if ( -1 == iInvalidDataAreaIndex1 )
	{
		/* 扇区1  写满*/
		if ( 0 == iInvalidDataAreaIndex2 )
		{
			/* 扇区2 中没有数据*/
			/* 扇区1 的最后一个数据区为有效数据区*/
			gbCurAreaIndex		= TCL_GDI_EEPGOM_AREA_AMOUNT -1;
			giCurFlashSectorNo	= gbFlashSectorNo;	
			guWriteCount		= uWriteCount1; 
		}
		else if ( -1 == iInvalidDataAreaIndex2 ) 
		{
			/* 扇区2 写满*/
			if ( 0 == uWriteCount1)
			{
				/* 扇区1 的数据比较新*/
				giCurFlashSectorNo	= gbFlashSectorNo;
				guWriteCount		= uWriteCount1;  			
			}
			else if ( 0 == uWriteCount2 )
			{
				/* 扇区2  的数据比较新*/
				giCurFlashSectorNo = gbFlashSectorNo2;
				guWriteCount		= uWriteCount2;  
			}
			else if ( uWriteCount1 > uWriteCount2 )
			{
				/* 扇区1 的数据比较新*/
				giCurFlashSectorNo	= gbFlashSectorNo;
				guWriteCount		= uWriteCount1;  
			}
			else
			{
				/* 扇区2 的数据比较新*/
				giCurFlashSectorNo	= gbFlashSectorNo2;
				guWriteCount		= uWriteCount2;  
			}
			
			gbCurAreaIndex = TCL_GDI_EEPGOM_AREA_AMOUNT -1;
		}
		else
		{
			/* 扇区2  有 数据但没有写满*/
			/* 扇区2 的最后一个数据区为有效数据区*/
			giCurFlashSectorNo	= gbFlashSectorNo2;
			guWriteCount		= uWriteCount2; 
			gbCurAreaIndex		= iInvalidDataAreaIndex2 -1;			
		}		
	}
	else
	{
		/* 扇区1  有 数据但没有写满*/
		giCurFlashSectorNo	= gbFlashSectorNo;
		guWriteCount		= uWriteCount1; 
		gbCurAreaIndex		= iInvalidDataAreaIndex1 -1;	
	}

	if ( gbCurAreaIndex != 0xFF )
	{
		/* 找到了一个有效的数据区*/
		/* 将此数据区中的数据读到内存*/
		uAddress = gbCurAreaIndex * TCL_GDI_EEPROM_AREA_SIZE;
		if ( TCL_NO_ERROR != Eeprom_FlashRead(giCurFlashSectorNo,uAddress,EepromBuffer.uBufferLength,EepromBuffer.pBuff,&uReadBytesOk) )
		{
			/* 读flash 失败*/
			EEPROM_ERROR(("error: Eeprom_InitBuffer - read flash failure \n"));
			return TCL_GDI_EEPROM_READ_FLASH_FAILURE;
		}		
	}

	/* 操作成功*/
	EEPROM_DEBUG(("info: Eeprom_InitBuffer - gbFlashSectorNo = %d,gbCurAreaIndex = %d\n",giCurFlashSectorNo,gbCurAreaIndex));
	return TCL_NO_ERROR;
}
#endif


/******************************************************************************
* Function:		Eeprom_Lock
* Description:		等待eeprom信号量
* Calls:			omit
* Called By:		omit
* Table Accessed:	none
* Table Updated:	none
* Input:			TCL_VOID
* Output:			none
* Return:			TCL_VOID
* Others:				
* Note:
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
*******************************************************************************/
static TCL_VOID Eeprom_Lock(TCL_VOID)
{
	if ( ghEepromMutex != NULL )
	{
		TCL_OSP_Mutex_Lock(ghEepromMutex);		
	}
	else
	{
		EEPROM_ERROR(("error: Eeprom_Lock - ghEepromMutex = NULL\n"));
	}
}


/******************************************************************************
* Function:		Eeprom_UnLock
* Description:		释放eeprom 信号量
* Calls:			omit
* Called By:		omit
* Table Accessed:	none
* Table Updated:	none
* Input:			TCL_VOID
* Output:			none
* Return:			TCL_BOOL - 操作成功
				TCL_FALSE - 操作失败
* Others:				
* Note:
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20070712						create
*******************************************************************************/
static TCL_VOID Eeprom_UnLock(TCL_VOID)
{	
	if ( ghEepromMutex != NULL )
	{
		TCL_OSP_Mutex_UnLock(ghEepromMutex);
	}
	else
	{
		EEPROM_ERROR(("error: Eeprom_UnLock - ghEepromMutex = NULL\n"));
	}
}

⌨️ 快捷键说明

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