📄 dvb_nvram.c
字号:
/**************************************************************************
(C)Copyright Cheertek Inc. 2002-2004,
K000, all right reserved.
Product : STB Firmware
****************************************************************************/
/*!
\file
This module provides the API to access NVRAM(Non-Volatile RAM).
*/
#include <stdio.h>
#include <string.h>
#include "dvb_type.h"
#include "dvb_sys.h"
#include "dvb_msg.h"
#include "ct_os.h"
//#include "ap_nvram.h"
#include "ct_iic.h"
#include "hw_config.h"
/*******************************************************************************************/
#if 1
#define NVRAM_MSG(p)
#else
#define NVRAM_MSG(p) printf p
#endif
#if 1
#define NVRAM_DBG(p)
#else
#define NVRAM_DBG(p) printf p
#endif
/*******************************************************************************************/
#define EEPROM_IIC_DEVICE_ID 0xA0 /**< This is EEPROM 24xx IIC write address. */
#define E2P_PAGE_SIZE 8
#define SIZE_OF_NVRAM_ADDRESS 1
static u8 u8IIC_Addr = EEPROM_IIC_DEVICE_ID;
static u16 u16Start = 0;
static u8 au8IICFifoSize[E2P_PAGE_SIZE + SIZE_OF_NVRAM_ADDRESS];
#define EEP_BANK_SIZE 256
#ifndef NVRAM_SIZE
#define NVRAM_SIZE 256
#endif
/*******************************************************************************************/
/*!
\fn bool8 DVB_NVRAM_SetParameter(u8 u8IIC_Addr, u16 u16StartPos, u16 u16Totalsize)
\brief Set the NVRAM parameter.
\param u8IIC_Addr (Input) the address of NVRAM. This parameter is for EEPROM, otherwise is no used.
\param u16StartPos (Input) the start position of NVRAM.
\param u16Totalsize (Input) the total size of NVRAM.
\return TRUE - success.
\return FALSE - fail.
*/
bool8 DVB_NVRAM_SetParameter( u8 u8IIC_Addr, u16 u16StartPos, u16 u16Totalsize )
{
u8IIC_Addr = u8IIC_Addr & 0xFE;
u8IIC_Addr = EEPROM_IIC_DEVICE_ID + u8IIC_Addr;
u16Start = u16StartPos;
NVRAM_DBG(("{DVB_NVRAM_SetParameter} u8IIC_Addr[%d] u16StartPos[%d] u16Totalsize[%d]\n", u8IIC_Addr,
u16StartPos, u16Totalsize));
return TRUE;
}
/*******************************************************************************************/
/*!
\fn bool8 DVB_NVRAM_Read(u8 *pData, u16 u16Length, u16 u16Offset)
\brief Read the data from NVRAM.
\param pData (Output) pointer to a buffer that receives the data read from NVRAM.
\param u16Length (Input) Number of bytes to be read from NVRAM.
\param u16Offset (Input) the start offset in NVRAM.
\return TRUE - success.
\return FALSE - fail.
*/
bool8 DVB_NVRAM_Read( u8 * pData, u16 u16Length, u16 u16Offset )
{
u32 u32Handle;
EN_DRV_RESULT enStatus=0;
s32 s32Length;
u8 u8IICAddrStart;
u8 u8BankNum = 0;
u8 u8AddrOffset = 0;
u16 u16TempLength = 0;
u8 i;
// u32 u32idx;
// does neet to check the length out of range ??? */
if (!pData)
{
return FALSE;
}
if((u16Offset+(u16Length-1))>NVRAM_SIZE)
{
return FALSE;
}
u8IICAddrStart = (u8)((u16Offset/EEP_BANK_SIZE)<<1);
u8AddrOffset = (u8)(u16Offset%EEP_BANK_SIZE);
u16TempLength = u16Length;
u8BankNum = (u8)(((u16)u8AddrOffset + u16Length)/EEP_BANK_SIZE);
if((((u16)u8AddrOffset + u16Length)%EEP_BANK_SIZE)!=0)
{
u8BankNum = u8BankNum+1;
}
for(i=0;i<u8BankNum;i++)
{
//Marlin 20070117, change CT_IIC to DEV_IIC
enStatus = CT_IIC_Open(EN_CT_IIC_BUS_0, u8IIC_Addr+u8IICAddrStart+(i<<1), &u32Handle);
if (enStatus != DRV_OK)
{
return FALSE;
}
if(i==0)
{
u16Offset = u8AddrOffset;
if(u8BankNum==1)
{
u16Length = u16TempLength;
}
else
{
u16Length = EEP_BANK_SIZE-u8AddrOffset;
}
}
else
{
u16Offset = 0;
if(i==(u8BankNum-1))
{
u16Length = ((u16)u8AddrOffset+u16TempLength)%EEP_BANK_SIZE;
}
else
{
u16Length = EEP_BANK_SIZE;
}
}
u16Offset += u16Start;
s32Length = u16Length;
NVRAM_DBG(( "NVRAM read add: %x, len %d\n", u16Offset, s32Length));
if (u16Offset % E2P_PAGE_SIZE == 0)
{
if (s32Length>=E2P_PAGE_SIZE)
{
u16Length = E2P_PAGE_SIZE;
}
else
{
u16Length = s32Length;
}
}
else
{
u16Length = E2P_PAGE_SIZE - (u16Offset % E2P_PAGE_SIZE);
}
while (s32Length>0)
{
if (SIZE_OF_NVRAM_ADDRESS == 1)
{
au8IICFifoSize[0] = u16Offset & 0xff;
}
else
{
au8IICFifoSize[0] = u16Offset >> 8;
au8IICFifoSize[1] = u16Offset & 0xff;
}
// NVRAM_DBG((" -read add: %x, len %d\n", u16Offset, u16Length));
#ifdef ENABLE_SW_IIC
enStatus = CT_SW_IIC_WriteDataNoStop(u32Handle, & au8IICFifoSize[0], SIZE_OF_NVRAM_ADDRESS);
#else
enStatus = CT_IIC_WriteDataNoStop(u32Handle, & au8IICFifoSize[0], SIZE_OF_NVRAM_ADDRESS);
#endif
if (enStatus != DRV_OK)
{
NVRAM_DBG(("CT_IIC_WriteDataNoStop->failure enStatus =%d\n",enStatus));
break;
}
#ifdef ENABLE_SW_IIC
enStatus = CT_SW_IIC_ReadData(u32Handle, pData, u16Length);
#else
enStatus = CT_IIC_ReadData(u32Handle, pData, u16Length);
#endif
if (enStatus != DRV_OK)
{
NVRAM_DBG(("CT_IIC_ReadData->failure\n"));
break;
}
s32Length -= u16Length;
pData += u16Length;
u16Offset += u16Length;
if (s32Length>=E2P_PAGE_SIZE)
{
u16Length = E2P_PAGE_SIZE;
}
else
{
u16Length = s32Length;
}
}
//Marlin 20070117, change CT_IIC to DEV_IIC
CT_IIC_Close(u32Handle);
}
if (enStatus == DRV_OK)
{
return TRUE;
}
else
{
NVRAM_DBG(( "{DVB_NVRAM_Read} call CT_NVM_ReadData () Fail \n"));
return FALSE;
}
}
/*******************************************************************************************/
/*!
\fn bool8 DVB_NVRAM_Write(u8 *pData, u16 u16Length, u16 u16Offset)
\brief Write the data to NVRAM.
\param pData (Input) pointer to a buffer containing data to be written to the NVRAM.
\param u16Length (Input) Number of bytes to be written to the NVRAM.
\param u16Offset (Input) the start offset in NVRAM
\return TRUE - success.
\return FALSE - fail.
*/
bool8 DVB_NVRAM_Write( u8 * pData, u16 u16Length, u16 u16Offset )
{
u32 u32Handle;
EN_DRV_RESULT enStatus=0;
s32 s32Length;
u8 u8IICAddrStart;
u8 u8BankNum = 0;
u8 u8AddrOffset = 0;
u16 u16TempLength =0;
u8 i;
// u32 u32idx;
if (!pData)
{
return FALSE;
}
if((u16Offset+(u16Length-1))>NVRAM_SIZE)
{
return FALSE;
}
u8IICAddrStart = (u8)((u16Offset/EEP_BANK_SIZE)<<1);
u8AddrOffset = (u8)(u16Offset%EEP_BANK_SIZE);
u16TempLength = u16Length;
u8BankNum = (u8)(((u16)u8AddrOffset + u16Length)/EEP_BANK_SIZE);
if((((u16)u8AddrOffset + u16Length)%EEP_BANK_SIZE)!=0)
{
u8BankNum = u8BankNum+1;
}
for(i=0;i<u8BankNum;i++)
{
//Marlin 20070117, change CT_IIC to DEV_IIC
enStatus = CT_IIC_Open(EN_CT_IIC_BUS_0, u8IIC_Addr+u8IICAddrStart+(i<<1), &u32Handle);
if (enStatus != DRV_OK)
{
return FALSE;
}
if(i==0)
{
u16Offset = u8AddrOffset;
if(u8BankNum==1)
{
u16Length = u16TempLength;
}
else
{
u16Length = EEP_BANK_SIZE-u8AddrOffset;
}
}
else
{
u16Offset = 0;
if(i==(u8BankNum-1))
{
u16Length = ((u16)u8AddrOffset+u16TempLength)%EEP_BANK_SIZE;
}
else
{
u16Length = EEP_BANK_SIZE;
}
}
u16Offset += u16Start;
s32Length = u16Length;
NVRAM_DBG(("NVRAM write add: %x, len %d\n", u16Offset, s32Length));
if (u16Offset % E2P_PAGE_SIZE == 0)
{
if (s32Length>=E2P_PAGE_SIZE)
{
u16Length = E2P_PAGE_SIZE;
}
else
{
u16Length = s32Length;
}
}
else
{
u16Length = E2P_PAGE_SIZE - (u16Offset % E2P_PAGE_SIZE);
}
while (s32Length>0)
{
if (SIZE_OF_NVRAM_ADDRESS == 1)
{
au8IICFifoSize[0] = u16Offset & 0xff;
}
else
{
au8IICFifoSize[0] = u16Offset >> 8;
au8IICFifoSize[1] = u16Offset & 0xff;
}
// NVRAM_DBG((" -write add: %x, len %d\n", u16Offset, u16Length));
//Marlin 20070117, change CT_IIC to DEV_IIC
memcpy(& au8IICFifoSize[SIZE_OF_NVRAM_ADDRESS], pData, u16Length);
#ifdef ENABLE_SW_IIC
enStatus = CT_SW_IIC_WriteData(u32Handle, & au8IICFifoSize[0], u16Length + SIZE_OF_NVRAM_ADDRESS);
#else
enStatus = CT_IIC_WriteData(u32Handle, & au8IICFifoSize[0], u16Length + SIZE_OF_NVRAM_ADDRESS);
#endif
if (enStatus != DRV_OK)
{
NVRAM_MSG(("CT_IIC_WriteData->failure enStatus = %d\n",enStatus));
break;
}
CT_OS_Delay(3); //Waiting for page write complete, add by KS
s32Length -= u16Length;
pData += u16Length;
u16Offset += u16Length;
if (s32Length>=E2P_PAGE_SIZE)
{
u16Length = E2P_PAGE_SIZE;
}
else
{
u16Length = s32Length;
}
}
//Marlin 20070117, change CT_IIC to DEV_IIC
CT_IIC_Close(u32Handle);
}
if (enStatus == DRV_OK)
{
return TRUE;
}
else
{
NVRAM_MSG(( "{DVB_NVRAM_Write} call CT_NVM_WriteData () Fail \n"));
return FALSE;
}
}
/*******************************************************************************************/
void nvram_test( u8 u8Mode, u16 u16Para1, u16 u16Para2 )
{
u8 * pu8TestBuffer = NULL;
u32 u32idx;
static u8 u8counter;
u32 u32Handle;
gen_point = 132;
pu8TestBuffer = DVB_MemoryAllocate(128);
if (pu8TestBuffer == NULL)
{
NVRAM_DBG(( "DVB_MemoryAllocate Fail\n"));
return;
}
switch (u8Mode)
{
case 0:
if (DVB_NVRAM_Read(pu8TestBuffer, 128, 0) == FALSE)
{
NVRAM_MSG(( "DVB_NVRAM_Read Fail\n"));
}
else
{
for (u32idx = 0; u32idx<128; u32idx++)
{
if (u32idx % 16 == 0)
{
NVRAM_DBG(( "\n 0x%02hx:", u32idx));
}
NVRAM_DBG(( " %02hx", pu8TestBuffer[u32idx]));
}
NVRAM_DBG(( "\n"));
}
break;
case 1:
for (u32idx = 0; u32idx<128; u32idx++)
{
pu8TestBuffer[u32idx] = 0xff;
}
if (DVB_NVRAM_Write(pu8TestBuffer, 128, 0) == FALSE)
{
NVRAM_DBG(( "DVB_NVRAM_Write Fail\n"));
}
break;
case 2:
for (u32idx = 0; u32idx<128; u32idx++)
{
pu8TestBuffer[u32idx] = u8counter;
}
DVB_NVRAM_Write(pu8TestBuffer, u16Para1, u16Para2);
u8counter++;
break;
case 3:
//Marlin 20070117, change CT_IIC to DEV_IIC
CT_IIC_Open(EN_CT_IIC_BUS_0, u8IIC_Addr, & u32Handle);
pu8TestBuffer[0] = 0x07;
pu8TestBuffer[1] = 0xBB;
pu8TestBuffer[2] = 0xBB;
#ifdef ENABLE_SW_IIC
CT_SW_IIC_WriteData(u32Handle, & pu8TestBuffer[0], 2 + SIZE_OF_NVRAM_ADDRESS);
#else
CT_IIC_WriteData(u32Handle, & pu8TestBuffer[0], 2 + SIZE_OF_NVRAM_ADDRESS);
#endif
CT_IIC_Close(u32Handle);
break;
default:
break;
}
DVB_MemoryFree(pu8TestBuffer);
}
#if 0//dummy eep test
/*******************************************************************************************/
bool8 flash_eep_test( u16 u16Length, u8 u8Offset )
{
u8 * pSetupStr;
u8 * pSetupStr1;
u16 u16Add;
int i;
u16Add = NVRAM_SYSTEM_INFO_START;
char test [] = "1234567890abcdefghijklmn";
pSetupStr = (u8 * )test;
gen_point = 131;
pSetupStr1 = DVB_MemoryAllocate(sizeof(test));
if (FLASH_EEPROM_Write(pSetupStr, u16Length, u16Add + u8Offset) == FALSE)
{
return FALSE;
}
memset(pSetupStr1, 0, sizeof(test));
if (FLASH_EEPROM_Read(pSetupStr1, u16Length, u16Add + u8Offset) == FALSE)
{
return FALSE;
}
for (i = 0; i<u16Length; i++)
{
if (pSetupStr[i] != pSetupStr1[i])
NVRAM_DBG((("\n-------------pSetupStr[%d]=%c, SetupStr1[%d]=%c---------------\n", i, pSetupStr[i], i,
pSetupStr1[i]));
}
DVB_MemoryFree(pSetupStr1);
return TRUE;
}
/*******************************************************************************************/
void debug_dummy_eep( void )
{
int i, j;
bool8 test;
for (i = 1; i<9; i++)
{
for (j = 0; j<8; j++)
{
test = flash_eep_test(i, j);
NVRAM_DBG(("\n-----------DVB_debug_dummy_eep()=%d--------------\n", test));
}
}
return;
}
/*******************************************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -