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

📄 dvb_cadb.c

📁 我国有线电视条件接受标准目前还没有统一
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include "custom.h"#ifdef EEPROM_FLASH_STORE_INFO#include "flash.h"#endif#include "dvb_time.h"#include "DVB_CADb.h"#define	DVB_CA_MAIGC_CODE	0xbeaf#define BASE_MJD	(51544) //2000/1/1#ifndef EEPROM_FLASH_STORE_INFOstatic UINT8 g_ucTempFlash[DVB_CADB_FLASH_SIZE];#endif#ifndef DVB_CA_DBG	#define ca_printf(f, a...)	do{}while(0)#else	#define ca_printf(f, a...)	 ecos_printf(f, ##a)#endifstatic ST_CA_DB g_stCaDb;static int g_iRefresh = 0;static void DVB_CADB_Save(void);static int DVB_CADB_AddDelMailID(UINT16 usMailID);static int DVB_CADB_Load(void);static int DVB_CADB_LoadDelMailID(void);static int DVB_CADB_LoadMail(void);#if defined(SDT_CA_40)static int DVB_CADB_LoadMsgID(void);static int DVB_CADB_LoadTime(void);static int DVB_CADB_LoadDate(void);#elif defined(SDT_CA_50)static int DVB_CADB_LoadMsg(void);static int DVB_CADB_LoadDelMsgID(void);static int DVB_CADB_DelMsg(UINT16 usMsgID);static int DVB_CADB_AddDelMsgID(UINT16 usMsgID);#endifstatic int DVB_CADB_FlashEarse(UINT32 uiStartAdd, UINT32 iLen);static int DVB_CADB_FlashWrite(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen);static int DVB_CADB_FlashRead(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen);void DVB_CADB_Init(void){		#ifdef EEPROM_FLASH_STORE_INFO	UINT8 *pucBuffer = (UINT8 *)(0xa8000000 + 64 * 1024 - 20);	#endif	if(DVB_CADB_Load() == CA_DB_REFRESH)	{		DVB_CADB_Save();	}		#if defined(SDT_CA_50)	g_stCaDb.usDate = 0;	g_stCaDb.usTime = 0;	#endif		#ifndef EEPROM_FLASH_STORE_INFO	g_stCaDb.uiStbID = 0x1234;	g_stCaDb.uiSmartID = 0x1234;	g_stCaDb.uiSwVer = 0;#if (IC_VER==IC_1002) 	#if defined(DVB_QAM)	g_stCaDb.uiHWVer = 0x34303032;	#elif defined(DVB_QPSK)	g_stCaDb.uiHWVer = 0x35303032;	#endif#else	#if defined(DVB_QAM)	g_stCaDb.uiHWVer = 0x34303031;	#elif defined(DVB_QPSK)	g_stCaDb.uiHWVer = 0x35303031;	#endif#endif		g_stCaDb.uiFactoryID = 0x19;	#else	g_stCaDb.uiFactoryID = (pucBuffer[0] << 24) | (pucBuffer[1] << 16) | (pucBuffer[2] << 8) | (pucBuffer[3]);	g_stCaDb.uiHWVer = (pucBuffer[4] << 24) | (pucBuffer[5] << 16) | (pucBuffer[6] << 8) | (pucBuffer[7]);	g_stCaDb.uiStbID = (pucBuffer[16] << 24) | (pucBuffer[17] << 16) | (pucBuffer[18] << 8) | (pucBuffer[19]);	g_stCaDb.uiSwVer = (pucBuffer[24] << 24) | (pucBuffer[25] << 16) | (pucBuffer[26] << 8) | (pucBuffer[27]);	g_stCaDb.uiSmartID = g_stCaDb.uiStbID;	#endif}void DVB_CADB_Default(void){	DVB_CADB_FlashEarse(DVB_CADB_ADDRESS, DVB_CADB_FLASH_SIZE);	g_stCaDb.uiMagic = DVB_CA_MAIGC_CODE;	DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_HEAD_OFFSET, (BYTE *)(&g_stCaDb.uiMagic), DVB_CADB_HEAD_SIZE);	DVB_CADB_Init();}void DVB_CADB_CheckRefresh(void){	if(g_iRefresh == 0)		return;	DVB_CADB_Save();}UINT16 DVB_CADB_GetMailNum(EN_CA_DB_MAIL_CMD enCmd){	UINT16 i;	UINT16 usNum = 0;			switch(enCmd)	{		case CA_DB_MAIL_TOTAL_NUM:			usNum = g_stCaDb.usMailNum;			break;		case CA_DB_MAIL_READ_NUM:			for(i = 0; i <MAIL_REPEAT_TIMES; i++)			{				if(g_stCaDb.astMail[i].usUsedFlag == 0x01)					usNum++;			}			break;		case CA_DB_MAIL_NOT_READ_NUM:			for(i = 0; i <MAIL_REPEAT_TIMES; i++)			{				if(g_stCaDb.astMail[i].usUsedFlag == 0x03)					usNum++;			}			break;		default:			break;	}	return usNum;}UINT16 DVB_CADB_GetMail(ST_CA_MAIL *pstMail, UINT8 ucStartPos, UINT16 usNum){	UINT16 usRealNum = 0;	UINT16 usPos = 0;	int iRepeatTimes;		if(pstMail == NULL )		return usRealNum;	if(ucStartPos >= MAX_MAIL)		return usRealNum;	if((ucStartPos + usNum) > MAX_MAIL)		usRealNum = MAX_MAIL - ucStartPos;	else		usRealNum = usNum;	for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES && usPos < (ucStartPos + usRealNum); iRepeatTimes++)	{		if(g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0x00 && g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0xFF)		{						if(usPos >= ucStartPos)				memcpy((UINT8 *)(&pstMail[usPos - ucStartPos]), (UINT8 *)(&(g_stCaDb.astMail[iRepeatTimes])), sizeof(ST_CA_MAIL));			usPos++;		}	}	return usRealNum;}int DVB_CADB_SetMailRead(UINT16 usMailID){		int iRepeatTimes;	int iMailPos = 0;	for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES; iRepeatTimes++)	{		if(usMailID == g_stCaDb.astMail[iRepeatTimes].usMailID && g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0x00			&& g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0xFF)			break;	}	if(iRepeatTimes == MAIL_REPEAT_TIMES)		return CA_DB_NOT_EXIST;	iMailPos = iRepeatTimes;		if(g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0x01)	{		g_stCaDb.astMail[iRepeatTimes].usUsedFlag = 0x01;				DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MAIL_OFFSET + iRepeatTimes * sizeof(ST_CA_MAIL), 					(BYTE *)(&(g_stCaDb.astMail[iRepeatTimes])), sizeof(ST_CA_MAIL));	}		return CA_DB_SUCCESS;	}int DVB_CADB_AddMail(ST_CA_MAIL *pstMail){	int iRepeatTimes;	int iNewPos = -1;	if(pstMail == NULL)		return CA_DB_NULL_PTR;	for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES; iRepeatTimes++)	{		if(pstMail->usMailID == g_stCaDb.astMail[iRepeatTimes].usMailID)			return CA_DB_EXIST;	}	for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES * 2; iRepeatTimes++)	{		if(pstMail->usMailID == g_stCaDb.ausDelMailID[iRepeatTimes])			return CA_DB_EXIST;	}	for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES; iRepeatTimes++)	{		if(0xFFFF == g_stCaDb.astMail[iRepeatTimes].usMailID)		{			iNewPos = iRepeatTimes;			break;		}	}	if(iNewPos < 0)		return CA_DB_FULL;	if(g_stCaDb.usMailNum >= MAX_MAIL)	{		int iUnReadPos = -1;		int iReadPos = -1;		int iResult = -1;		for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES; iRepeatTimes++)		{			if(iReadPos == -1 && g_stCaDb.astMail[iRepeatTimes].usUsedFlag == 0x01)			{				iReadPos = iRepeatTimes;				break;			}			else if(g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0 && 				g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0xFF && iUnReadPos == -1)				iUnReadPos = iRepeatTimes;					}		if(iReadPos >= 0)			iResult = DVB_CADB_DelMail(g_stCaDb.astMail[iReadPos].usMailID);		else if(iUnReadPos >= 0)			iResult = DVB_CADB_DelMail(g_stCaDb.astMail[iUnReadPos].usMailID);		if(iResult < 0)			return iResult;	}	memcpy(&(g_stCaDb.astMail[iNewPos]), pstMail, sizeof(ST_CA_MAIL));	g_stCaDb.astMail[iNewPos].usUsedFlag = 0x3;	DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MAIL_OFFSET + iNewPos * sizeof(ST_CA_MAIL), 				(BYTE *)(&(g_stCaDb.astMail[iNewPos])), sizeof(ST_CA_MAIL));	g_stCaDb.usMailNum++;	return CA_DB_SUCCESS;	}int DVB_CADB_DelMail(UINT16 usMailID){		int iRepeatTimes;	for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES; iRepeatTimes++)	{		if(g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0 			&& g_stCaDb.astMail[iRepeatTimes].usUsedFlag != 0xFF			&& usMailID == g_stCaDb.astMail[iRepeatTimes].usMailID)			break;	}	if(iRepeatTimes == MAIL_REPEAT_TIMES)		return CA_DB_NOT_EXIST;	if(DVB_CADB_AddDelMailID(usMailID) >= 0)	{		g_stCaDb.astMail[iRepeatTimes].usUsedFlag = 0;				DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MAIL_OFFSET + iRepeatTimes * sizeof(ST_CA_MAIL), 					(BYTE *)(&(g_stCaDb.astMail[iRepeatTimes])), sizeof(ST_CA_MAIL));		g_stCaDb.usMailNum--;				return CA_DB_SUCCESS;		}	else		return CA_DB_FULL;}#if defined(SDT_CA_40)int DVB_CADB_AddMsg(UINT16 usMsgID){	int iRepeatTimes;	for(iRepeatTimes = 0; iRepeatTimes < g_stCaDb.usMsgNum; iRepeatTimes++)	{		if(g_stCaDb.ausMsgID[iRepeatTimes] == usMsgID)			return CA_DB_EXIST;	}		for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES; iRepeatTimes++)	{		UINT16 usTempMsgID = 0xFFFF;		DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_MSG_ID_OFFSET+ iRepeatTimes * sizeof(UINT16), (BYTE *)(&usTempMsgID), sizeof(UINT16));		if(usTempMsgID == 0xFFFF)			break;			}	if(iRepeatTimes == MSG_ID_REPEAT_TIMES)	{		g_iRefresh = 1;		for(iRepeatTimes = 1; iRepeatTimes < MAX_MSG_ID; iRepeatTimes++)		{			g_stCaDb.ausMsgID[iRepeatTimes - 1] = g_stCaDb.ausMsgID[iRepeatTimes];		}		g_stCaDb.ausMsgID[iRepeatTimes - 1] = usMsgID;	}	else	{		DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MSG_ID_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&usMsgID), sizeof(UINT16));		DVB_CADB_LoadMsgID();	}	return CA_DB_SUCCESS;	}#elif defined(SDT_CA_50)int DVB_CADB_GetMsg(UINT8 *pucMsgContext, UINT8 *ucBgColor, UINT8 *ucFontColor){	int iMsgPos = 0;	UINT32 uiTime;	int iResult = 0;	UINT32 uiDate = 0;	UINT16 ucHour = 0;	UINT8 ucMin = 0;		if(pucMsgContext == NULL)		return CA_DB_NULL_PTR;	uiDate = DVB_TimeGetMjd() - BASE_MJD;	DVB_TimeGetTime((UINT8 *)&ucHour, &ucMin, NULL);	uiTime = (uiDate << 16) | (ucHour << 8) | (ucMin);		//uiTime = (g_stCaDb.usDate << 16) | g_stCaDb.usTime;		for(iMsgPos = 0; iMsgPos < MSG_ID_REPEAT_TIMES ; iMsgPos++)	{				if(g_stCaDb.astMsg[iMsgPos].usUsedFlag != 0 && g_stCaDb.astMsg[iMsgPos].usUsedFlag != 0xFF			&& g_stCaDb.astMsg[iMsgPos].uiShowTime <= uiTime)		{			memcpy(pucMsgContext, g_stCaDb.astMsg[iMsgPos].aucContext, MSG_CONTEXT_SIZE);			*ucBgColor = g_stCaDb.astMsg[iMsgPos].ucBgColor;			*ucFontColor = g_stCaDb.astMsg[iMsgPos].ucFontColor;			DVB_CADB_DelMsg(g_stCaDb.astMsg[iMsgPos].usMsgID);			iResult = 1;			break;		}	}	return iResult;}int DVB_CADB_AddMsg(ST_CA_MSG *pstMsg){	int iRepeatTimes;	int iNewPos = -1;	if(pstMsg == NULL)		return CA_DB_NULL_PTR;	for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES; iRepeatTimes++)	{		if(pstMsg->usMsgID == g_stCaDb.astMsg[iRepeatTimes].usMsgID)			return CA_DB_EXIST;	}	for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES * 2; iRepeatTimes++)	{		if(pstMsg->usMsgID == g_stCaDb.ausDelMsgID[iRepeatTimes])			return CA_DB_EXIST;	}	for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES; iRepeatTimes++)	{		if(g_stCaDb.astMsg[iRepeatTimes].usMsgID == 0xFFFF)		{			iNewPos = iRepeatTimes;			break;		}	}	if(iNewPos < 0 || g_stCaDb.usMsgNum>= MAX_MSG_ID)		return CA_DB_FULL;	memcpy(&(g_stCaDb.astMsg[iNewPos]), pstMsg, sizeof(ST_CA_MSG));	g_stCaDb.astMsg[iNewPos].usUsedFlag = 0x7;	DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MSG_OFFSET + iNewPos * sizeof(ST_CA_MSG), 				(BYTE *)(&(g_stCaDb.astMsg[iNewPos])), sizeof(ST_CA_MSG));	g_stCaDb.usMsgNum++;	return CA_DB_SUCCESS;	}static int DVB_CADB_DelMsg(UINT16 usMsgID){		int iRepeatTimes;	for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES; iRepeatTimes++)	{		if(usMsgID == g_stCaDb.astMsg[iRepeatTimes].usMsgID && g_stCaDb.astMsg[iRepeatTimes].usUsedFlag != 0 			&& g_stCaDb.astMsg[iRepeatTimes].usUsedFlag != 0xff)			break;	}	if(iRepeatTimes == MSG_ID_REPEAT_TIMES)		return CA_DB_NOT_EXIST;		if(DVB_CADB_AddDelMsgID(usMsgID) >= 0)	{		g_stCaDb.astMsg[iRepeatTimes].usUsedFlag = 0;		DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MSG_OFFSET + iRepeatTimes * sizeof(ST_CA_MSG), 					(BYTE *)(&(g_stCaDb.astMsg[iRepeatTimes])), sizeof(ST_CA_MSG));		g_stCaDb.usMsgNum--;				return CA_DB_SUCCESS;		}	else		return CA_DB_FULL;	}static int DVB_CADB_AddDelMsgID(UINT16 usMsgID){	int iRepeatTimes;	for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES * 2; iRepeatTimes++)	{		if(g_stCaDb.ausDelMsgID[iRepeatTimes] == 0xFFFF)			break;			}	if(iRepeatTimes == MSG_ID_REPEAT_TIMES * 2)	{		return CA_DB_FULL;	}	else	{		g_stCaDb.ausDelMsgID[iRepeatTimes] = usMsgID;		DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DELMSG_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&usMsgID), sizeof(UINT16));		return CA_DB_SUCCESS;		}}#endifint DVB_CADB_Get(EN_CA_DB_CMD enCmd, void *pValue){	if(pValue == NULL)		return CA_DB_NULL_PTR;	switch(enCmd)	{		case CA_DB_CMD_DATE:			*(UINT16 *)(pValue) = g_stCaDb.usDate;			break;		case CA_DB_CMD_TIME:			*(UINT16 *)(pValue) = g_stCaDb.usTime;			break;		case CA_DB_CMD_STB_ID:			*(UINT32 *)(pValue) = g_stCaDb.uiStbID;			break;		case CA_DB_CMD_SMART_ID:			*(UINT32 *)(pValue) = g_stCaDb.uiSmartID;			break;		case CA_DB_CMD_SW_VER:			*(UINT32 *)(pValue) = g_stCaDb.uiSwVer;			break;		case CA_DB_CMD_HW_VER:			*(UINT32 *)(pValue) = g_stCaDb.uiHWVer;			break;		case CA_DB_CMD_FACTORY_ID:			*(UINT32 *)(pValue) = g_stCaDb.uiFactoryID;			break;		default:

⌨️ 快捷键说明

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