📄 tcl_gdi_eeprom.c
字号:
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 + -