📄 dvb_cadb.c
字号:
return CA_DB_UNKNOW_CMD; } return CA_DB_SUCCESS;}int DVB_CADB_Set(EN_CA_DB_CMD enCmd, UINT32 uiValue){ #if defined(SDT_CA_40) int iRepeatTimes; UINT32 uiTempValue = 0xFFFF; #endif switch(enCmd) { case CA_DB_CMD_DATE: if(g_stCaDb.usDate == uiValue) break; #if defined(SDT_CA_40) uiTempValue = 0xFFFF; for(iRepeatTimes = 0; iRepeatTimes < DATE_REPEAT_TIMES; iRepeatTimes++) { DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_DATE_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&uiTempValue), sizeof(UINT16)); if(uiTempValue == 0xFFFF) break; } if(iRepeatTimes == 0) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DATE_OFFSET, (BYTE *)(&uiValue), sizeof(UINT16)); else if((g_stCaDb.usDate & uiValue) == uiValue) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DATE_OFFSET + (iRepeatTimes - 1) * sizeof(UINT16), (BYTE *)(&uiValue), sizeof(UINT16)); else if(iRepeatTimes < DATE_REPEAT_TIMES) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DATE_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&uiValue), sizeof(UINT16)); else g_iRefresh = 1; #endif g_stCaDb.usDate = uiValue; break; case CA_DB_CMD_TIME: if(g_stCaDb.usTime == uiValue) break; #if defined(SDT_CA_40) uiTempValue = 0xFFFF; for(iRepeatTimes = 0; iRepeatTimes < TIME_REPEAT_TIMES; iRepeatTimes++) { DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_TIME_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&uiTempValue), sizeof(UINT16)); if(uiTempValue == 0xFFFF) break; } if(iRepeatTimes == 0) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_TIME_OFFSET, (BYTE *)(&uiValue), sizeof(UINT16)); else if((g_stCaDb.usTime & uiValue) == uiValue) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_TIME_OFFSET + (iRepeatTimes - 1) * sizeof(UINT16), (BYTE *)(&uiValue), sizeof(UINT16)); else if(iRepeatTimes < TIME_REPEAT_TIMES) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_TIME_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&uiValue), sizeof(UINT16)); else g_iRefresh = 1; #endif g_stCaDb.usTime = uiValue; break; default: return CA_DB_UNKNOW_CMD; } return CA_DB_SUCCESS;}static void DVB_CADB_Save(void){ int iRepeatTimes; int iPos = 0; DVB_CADB_FlashEarse(DVB_CADB_ADDRESS, DVB_CADB_FLASH_SIZE);ca_printf("DVB_CADB_Save\n"); DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_HEAD_OFFSET, (BYTE *)(&g_stCaDb.uiMagic), DVB_CADB_HEAD_SIZE); #if defined(SDT_CA_40) DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DATE_OFFSET, (BYTE *)(&g_stCaDb.usDate), sizeof(UINT16)); DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_TIME_OFFSET, (BYTE *)(&g_stCaDb.usTime), sizeof(UINT16)); DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MSG_ID_OFFSET, (BYTE *)((g_stCaDb.ausMsgID)), sizeof(UINT16) * g_stCaDb.usMsgNum); #elif defined(SDT_CA_50) iPos = 0; for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES; iRepeatTimes++) { if(g_stCaDb.astMsg[iRepeatTimes].usUsedFlag != 0x00 && g_stCaDb.astMsg[iRepeatTimes].usUsedFlag == 0xFF) { DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MSG_OFFSET + iPos * sizeof(ST_CA_MSG), (BYTE *)(&(g_stCaDb.astMsg[iRepeatTimes])), sizeof(ST_CA_MSG)); iPos++; } } DVB_CADB_LoadMsg(); iPos = 0; for(iRepeatTimes = 0; iRepeatTimes < MSG_ID_REPEAT_TIMES*2; iRepeatTimes++) { if(g_stCaDb.ausDelMsgID[iRepeatTimes] != 0xFFFF) { DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DELMSG_OFFSET + iPos * sizeof(UINT16), (BYTE *)(&(g_stCaDb.ausDelMsgID[iRepeatTimes])), sizeof(UINT16)); iPos++; } } DVB_CADB_LoadDelMsgID(); #endif iPos = 0; for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES; iRepeatTimes++) { if(g_stCaDb.astMail[iRepeatTimes].usUsedFlag == 0x03 || g_stCaDb.astMail[iRepeatTimes].usUsedFlag == 0x01) { DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_MAIL_OFFSET + iPos * sizeof(ST_CA_MAIL), (BYTE *)(&(g_stCaDb.astMail[iRepeatTimes])), sizeof(ST_CA_MAIL)); iPos++; } } DVB_CADB_LoadMail(); iPos = 0; for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES*2; iRepeatTimes++) { if(g_stCaDb.ausDelMailID[iRepeatTimes] != 0xFFFF) { DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DELMAIL_OFFSET + iPos * sizeof(UINT16), (BYTE *)(&(g_stCaDb.ausDelMailID[iRepeatTimes])), sizeof(UINT16)); iPos++; } } DVB_CADB_LoadDelMailID(); g_iRefresh = 0;}static int DVB_CADB_AddDelMailID(UINT16 usMailID){ int iRepeatTimes; for(iRepeatTimes = 0; iRepeatTimes < MAIL_REPEAT_TIMES * 2; iRepeatTimes++) { if(g_stCaDb.ausDelMailID[iRepeatTimes] == 0xFFFF) break; } if(iRepeatTimes == MAIL_REPEAT_TIMES* 2) { return CA_DB_FULL; } else { g_stCaDb.ausDelMailID[iRepeatTimes] = usMailID; DVB_CADB_FlashWrite(DVB_CADB_ADDRESS + DVB_CADB_DELMAIL_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&usMailID), sizeof(UINT16)); return CA_DB_SUCCESS; }}static int DVB_CADB_Load(void){ int iResult = CA_DB_SUCCESS; int iReturn; memset((UINT8 *)(&g_stCaDb), 0x0, sizeof(ST_CA_DB)); //read magic code DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_HEAD_OFFSET, (BYTE *)(&g_stCaDb.uiMagic), DVB_CADB_HEAD_SIZE); //magic code is error if(g_stCaDb.uiMagic != DVB_CA_MAIGC_CODE) { ca_printf("Magic code ERRO!\n"); 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); } #if defined(SDT_CA_40) iReturn = DVB_CADB_LoadDate(); ca_printf("DVB_CADB_LoadDate:%d:%x\n",iReturn,g_stCaDb.usDate); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; iReturn = DVB_CADB_LoadTime(); ca_printf("DVB_CADB_LoadTime:%d:%x\n",iReturn,g_stCaDb.usTime); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; iReturn = DVB_CADB_LoadMsgID(); ca_printf("DVB_CADB_LoadMsgID:%d:%x\n",iReturn,g_stCaDb.usMsgNum); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; #elif defined(SDT_CA_50) iReturn = DVB_CADB_LoadMsg(); ca_printf("DVB_CADB_LoadMsg:%d:%x\n",iReturn,g_stCaDb.usMsgNum); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; iReturn = DVB_CADB_LoadDelMsgID(); ca_printf("DVB_CADB_LoadDelMsgID:%d:%x\n",iReturn,g_stCaDb.usDelMsgNum); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; #endif iReturn = DVB_CADB_LoadMail(); ca_printf("DVB_CADB_LoadMail:%d:%x\n",iReturn,g_stCaDb.usMailNum); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; iReturn = DVB_CADB_LoadDelMailID(); ca_printf("DVB_CADB_LoadDelMailID:%d:%x\n",iReturn,g_stCaDb.usDelMailNum); if(iReturn != CA_DB_SUCCESS) iResult = iReturn; return iResult;}static int DVB_CADB_LoadDelMailID(void){ int iRepeatTimes; int iEndPos = -1; int iResult = CA_DB_SUCCESS; memset((UINT8 *)(g_stCaDb.ausDelMailID), 0xFF, MAIL_REPEAT_TIMES*2* sizeof(UINT16)); g_stCaDb.usDelMailNum = 0; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_DELMAIL_OFFSET, (BYTE *)((g_stCaDb.ausDelMailID)), sizeof(UINT16) * MAIL_REPEAT_TIMES * 2); for(iRepeatTimes = (MAIL_REPEAT_TIMES*2 - 1); iRepeatTimes >= 0; iRepeatTimes--) { if(g_stCaDb.ausDelMailID[iRepeatTimes] != 0xFFFF) { if(iEndPos == -1) iEndPos = iRepeatTimes; if(g_stCaDb.usDelMailNum < MAIL_REPEAT_TIMES) g_stCaDb.usDelMailNum++; else { g_stCaDb.ausDelMailID[iRepeatTimes] = 0xFFFF; iResult = CA_DB_REFRESH; } } } if(iEndPos >= 0 && iEndPos > (((MAIL_REPEAT_TIMES) >> 1) + MAIL_REPEAT_TIMES)) iResult = CA_DB_REFRESH; return iResult;}static int DVB_CADB_LoadMail(void){ int iRepeatTimes; int iEndPos = -1; int iResult = CA_DB_SUCCESS; memset((UINT8 *)(g_stCaDb.astMail), 0xFF, MAIL_REPEAT_TIMES * sizeof(ST_CA_MAIL)); g_stCaDb.usMailNum = 0; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_MAIL_OFFSET , (BYTE *)(&(g_stCaDb.astMail)), sizeof(ST_CA_MAIL) * MAIL_REPEAT_TIMES); for(iRepeatTimes = MAIL_REPEAT_TIMES - 1; iRepeatTimes >= 0; iRepeatTimes--) { if(g_stCaDb.astMail[iRepeatTimes].usMailID != 0xFFFF && g_stCaDb.astMail[iRepeatTimes].usUsedFlag) { if(iEndPos == -1) iEndPos = iRepeatTimes; if(g_stCaDb.usMailNum < MAX_MAIL) g_stCaDb.usMailNum++; else { g_stCaDb.astMail[iRepeatTimes].usUsedFlag = 0; iResult = CA_DB_REFRESH; } } } if(iEndPos >= 0 && iEndPos > (((MAIL_REPEAT_TIMES - MAX_MAIL) >> 1) + MAX_MAIL)) iResult = CA_DB_REFRESH; return iResult;}#if defined(SDT_CA_40)static int DVB_CADB_LoadMsgID(void){ int iRepeatTimes; int iResult = CA_DB_SUCCESS; memset((UINT8 *)(g_stCaDb.ausMsgID), 0xFF, MAX_MSG_ID * sizeof(UINT16)); for(iRepeatTimes = (MSG_ID_REPEAT_TIMES - 1); iRepeatTimes >= (MSG_ID_REPEAT_TIMES - MAX_MSG_ID); iRepeatTimes--) { UINT16 usMsgID = 0xFFFF; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_MSG_ID_OFFSET+ iRepeatTimes * sizeof(UINT16), (BYTE *)(&usMsgID), sizeof(UINT16)); if(usMsgID != 0xFFFF) break; } if(iRepeatTimes > (((MSG_ID_REPEAT_TIMES - MAX_MSG_ID) >> 1) + MAX_MSG_ID)) iResult = CA_DB_REFRESH; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_MSG_ID_OFFSET+ (iRepeatTimes + 1 - MAX_MSG_ID)* sizeof(UINT16), (BYTE *)((g_stCaDb.ausMsgID)), sizeof(UINT16) * MAX_MSG_ID); g_stCaDb.usMsgNum = 0; for(iRepeatTimes = 0; iRepeatTimes < MAX_MSG_ID; iRepeatTimes++) { if(g_stCaDb.ausMsgID[iRepeatTimes] == 0xFFFF) break; g_stCaDb.usMsgNum++; } return iResult;}static int DVB_CADB_LoadTime(void){ int iRepeatTimes; int iResult = CA_DB_SUCCESS; g_stCaDb.usTime = 0xFFFF; for(iRepeatTimes = 0; iRepeatTimes < TIME_REPEAT_TIMES; iRepeatTimes++) { UINT16 usTime = 0xFFFF; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_TIME_OFFSET+ iRepeatTimes * sizeof(UINT16), (BYTE *)(&usTime), sizeof(UINT16)); if(usTime == 0xFFFF) break; g_stCaDb.usTime = usTime; } if(iRepeatTimes > (TIME_REPEAT_TIMES >> 1)) iResult = CA_DB_REFRESH; return iResult;}static int DVB_CADB_LoadDate(void){ int iRepeatTimes; int iResult = CA_DB_SUCCESS; g_stCaDb.usDate = 0xFFFF; for(iRepeatTimes = 0; iRepeatTimes < DATE_REPEAT_TIMES; iRepeatTimes++) { UINT16 usDate = 0xFFFF; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_DATE_OFFSET + iRepeatTimes * sizeof(UINT16), (BYTE *)(&usDate), sizeof(UINT16)); if(usDate == 0xFFFF) break; g_stCaDb.usDate = usDate; } if(iRepeatTimes > (DATE_REPEAT_TIMES >> 1)) iResult = CA_DB_REFRESH; return iResult;}#elif defined(SDT_CA_50)static int DVB_CADB_LoadMsg(void){ int iRepeatTimes; int iEndPos = -1; int iResult = CA_DB_SUCCESS; memset((UINT8 *)(g_stCaDb.astMsg), 0xFF, MSG_ID_REPEAT_TIMES * sizeof(ST_CA_MSG)); g_stCaDb.usMsgNum = 0; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_MSG_OFFSET , (BYTE *)(&(g_stCaDb.astMsg)), sizeof(ST_CA_MSG) * MSG_ID_REPEAT_TIMES); for(iRepeatTimes = MSG_ID_REPEAT_TIMES - 1; iRepeatTimes >= 0; iRepeatTimes--) { if(g_stCaDb.astMsg[iRepeatTimes].usMsgID != 0xFFFF && g_stCaDb.astMsg[iRepeatTimes].usUsedFlag) { if(iEndPos == -1) iEndPos = iRepeatTimes; if(g_stCaDb.usMsgNum < MAX_MSG_ID) g_stCaDb.usMsgNum++; else { g_stCaDb.astMsg[iRepeatTimes].usUsedFlag = 0; iResult = CA_DB_REFRESH; } } } if(iEndPos >= 0 && iEndPos > (((MSG_ID_REPEAT_TIMES - MAX_MSG_ID) >> 1) + MAX_MSG_ID)) iResult = CA_DB_REFRESH; return iResult;}static int DVB_CADB_LoadDelMsgID(void){ int iRepeatTimes; int iEndPos = -1; int iResult = CA_DB_SUCCESS; memset((UINT8 *)(g_stCaDb.ausDelMsgID), 0xFF, MSG_ID_REPEAT_TIMES*2* sizeof(UINT16)); g_stCaDb.usDelMsgNum = 0; DVB_CADB_FlashRead(DVB_CADB_ADDRESS + DVB_CADB_DELMSG_OFFSET, (BYTE *)((g_stCaDb.ausDelMsgID)), sizeof(UINT16) * MSG_ID_REPEAT_TIMES * 2); for(iRepeatTimes = (MSG_ID_REPEAT_TIMES*2 - 1); iRepeatTimes >= 0; iRepeatTimes--) { if(g_stCaDb.ausDelMsgID[iRepeatTimes] != 0xFFFF) { if(iEndPos == -1) iEndPos = iRepeatTimes; if(g_stCaDb.usDelMsgNum < MSG_ID_REPEAT_TIMES) g_stCaDb.usDelMsgNum++; else { g_stCaDb.ausDelMsgID[iRepeatTimes] = 0xFFFF; iResult = CA_DB_REFRESH; } } } if(iEndPos >= 0 && iEndPos > (((MAIL_REPEAT_TIMES) >> 1) + MAIL_REPEAT_TIMES)) iResult = CA_DB_REFRESH; return iResult;}#endifstatic int DVB_CADB_FlashEarse(UINT32 uiStartAdd, UINT32 iLen){ int iResult = 0; #ifndef EEPROM_FLASH_STORE_INFO memset((UINT8 *)(g_ucTempFlash + uiStartAdd - DVB_CADB_ADDRESS), 0xFF, iLen); #else iResult = FlashEraseSecRange(uiStartAdd, iLen); #endif return iResult;}static int DVB_CADB_FlashWrite(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen){ int iResult = 0; #ifndef EEPROM_FLASH_STORE_INFO memcpy((UINT8 *)(g_ucTempFlash + iStartAddr - DVB_CADB_ADDRESS), pBuf, iLen); #else iResult = FlashWrite(iStartAddr, pBuf,iLen); #endif return iResult;}static int DVB_CADB_FlashRead(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen){ int iResult = 0; #ifndef EEPROM_FLASH_STORE_INFO memcpy(pBuf, (UINT8 *)(g_ucTempFlash + iStartAddr - DVB_CADB_ADDRESS), iLen); #else iResult = FlashRead(iStartAddr, pBuf,iLen); #endif return iResult;}unsigned short DVB_CADB_GetDate(void){ return g_stCaDb.usDate;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -