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