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

📄 dvb_nvram.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 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 + -