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