📄 dvb_calogo.c
字号:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <cyg/io/io.h>#include <cyg/hal/types.h>#include <cyg/kernel/kapi.h>#include <cyg/infra/diag.h>#include "custom.h"#ifdef EEPROM_FLASH_STORE_INFO#include "flash.h"#endif#include "dvb_ca.h"#include "DVB_CALogo.h"#include "message_id.h"#include "mbuf_ext_data.h"#include "dvb_module.h"#define SWAP32(x) ((((UINT32)x) >> 24)| (((UINT32)x&0x00ff0000)>> 8)|(((UINT32)x<<8) & 0x00ff0000)|(((UINT32)x) << 24)) //#define DVB_CA_DBG#ifndef DVB_CA_DBG #define ca_printf(f, a...) do {} while (0)#else #define ca_printf(f, a...) ecos_printf(f, ##a)#endif#define MAGIC_CODE 0xbeafstatic UINT8 g_ucVer = 0xFF;static UINT8 g_ucCaLogoBuffer[MAX_LOGO_SIZE];static UINT8 g_ucRefresh = 0;static ST_LOGO g_stLogo;static int DVB_CALogo_FlashEarse(UINT32 uiStartAdd, UINT32 iLen);static int DVB_CALogo_FlashWrite(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen);static int DVB_CALogo_FlashRead(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen);extern unsigned long crc32(char *data, int len);UINT8 DVB_CALogo_GetVer(void){ return g_ucVer;}int DVB_CALogo_GetUpgradeState(UINT8 *pucVer, UINT16 *pusTotalBlock, UINT16 *pusRecBlock){ int iResult = -1; int i = 0; if(g_stLogo.ucVer != 0xFF && g_stLogo.ucVer != g_ucVer) { iResult = 0; *pucVer = g_stLogo.ucVer; *pusTotalBlock = g_stLogo.usTotalBlock; (*pusRecBlock) = 0; for(i = 0 ; i < g_stLogo.usTotalBlock && i < MAX_BLOCK; i++) { if(g_stLogo.aucBlockReceive[i]) (*pusRecBlock)++; } } return iResult;}void DVB_CALogo_Init(void){ int i; UINT32 uiMagicCode = 0; UINT8 ucOrder = 0; for(i = 0; i < LOGO_MAX_SECTOR; i++) { DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024, (UINT8 *)(&uiMagicCode),4); DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024 + 4, (UINT8 *)(&ucOrder),1); ca_printf("Logo uiMagicCode:%d, ucOrder:%d\n",uiMagicCode, ucOrder); if(uiMagicCode != MAGIC_CODE || ucOrder != 0xFF) { DVB_CALogo_FlashEarse(LOGO_START_ADDR + i * 64 * 1024, 64 * 1024); } else if(g_ucVer == 0xFF) { DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024 + 5, (UINT8 *)(&g_ucVer),1); } } if(g_ucVer == 0xFF) g_ucVer = 0x00; memset(g_ucCaLogoBuffer, 0x0, MAX_LOGO_SIZE); memset(&g_stLogo, 0x0, sizeof(ST_LOGO)); g_stLogo.ucVer = 0xFF;}UINT16 DVB_CALogo_GetBlockAverSize(void){ int i; UINT16 usAverSize = 0; for(i = 0; i <(g_stLogo.usTotalBlock-1); i++) // don't used the lastest block { if(g_stLogo.aucBlockReceive[i] && g_stLogo.ausBlockSize[i] != 0) { usAverSize = g_stLogo.ausBlockSize[i]; break; } } return usAverSize;}void DVB_CALogo_AddBlock(S_STB_Face *pstFace){ UINT16 usBlockAverSize = 0; UINT16 usRealBlockSize = 0; UINT8 *pucBuffer = NULL; int i; if(pstFace == NULL || pstFace->version_ID == 0xFF || g_ucVer == pstFace->version_ID) return; if(g_ucRefresh) return; if(g_stLogo.ucVer == 0xFF || pstFace->version_ID != g_stLogo.ucVer) { ca_printf("pstFace->version_ID:%d, g_stLogo.ucVer:%d\n",pstFace->version_ID, g_stLogo.ucVer); memset(&g_stLogo, 0x0, sizeof(ST_LOGO)); memset(g_ucCaLogoBuffer, 0x0, MAX_LOGO_SIZE); g_stLogo.ucVer = pstFace->version_ID; g_stLogo.ucMark = pstFace->mark; g_stLogo.usTotalBlock = pstFace->block_sum; } if(g_stLogo.aucBlockReceive[pstFace->block_ID]) return; usBlockAverSize = DVB_CALogo_GetBlockAverSize(); if(usBlockAverSize == 0) { if(pstFace->block_ID == (pstFace->block_sum - 1)) return; else usBlockAverSize = pstFace->block_size; } g_stLogo.aucBlockReceive[pstFace->block_ID] = 1; g_stLogo.ausBlockSize[pstFace->block_ID] = pstFace->block_size; if(pstFace->mark) { pucBuffer = pstFace->U_Content.longContent; } else { pucBuffer = pstFace->U_Content.shortContent; } if(pstFace->block_ID * usBlockAverSize < MAX_LOGO_SIZE) { if(pstFace->block_ID * usBlockAverSize + pstFace->block_size > MAX_LOGO_SIZE) usRealBlockSize = MAX_LOGO_SIZE - pstFace->block_ID * usBlockAverSize; else usRealBlockSize = pstFace->block_size; memcpy(g_ucCaLogoBuffer + pstFace->block_ID * usBlockAverSize, pucBuffer, usRealBlockSize); ca_printf("ID:%d Total:%d, Len:%d, AverBlockSize:%d\n",pstFace->block_ID, pstFace->block_sum,pstFace->block_size,usBlockAverSize); } for(i = 0; i < g_stLogo.usTotalBlock; i++) { if(g_stLogo.aucBlockReceive[i] == 0) break; } if(i == g_stLogo.usTotalBlock) { UINT32 uiLen; UINT8 ucWriteSec = LOGO_MAX_SECTOR; UINT32 uiMagicCode = 0; UINT8 ucOrder = 1; uiLen = (g_ucCaLogoBuffer[0] << 24) | (g_ucCaLogoBuffer[1] << 16) | (g_ucCaLogoBuffer[2] << 8) | g_ucCaLogoBuffer[3]; ca_printf("Receive Over!:%x\n",uiLen); if((uiLen + 8) > MAX_LOGO_SIZE) return; ca_printf("Receive Len!:%x\n",(usBlockAverSize * (g_stLogo.usTotalBlock - 1) + g_stLogo.ausBlockSize[g_stLogo.usTotalBlock - 1])); if((uiLen + 8) != (usBlockAverSize * (g_stLogo.usTotalBlock - 1) + g_stLogo.ausBlockSize[g_stLogo.usTotalBlock - 1])) return; uiLen += 4; if(crc32(g_ucCaLogoBuffer + 4, uiLen) == 0) { ca_printf("CRC OK!\n"); for(i = 0; i < LOGO_MAX_SECTOR; i++) { DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024, (UINT8 *)(&uiMagicCode),4); if(uiMagicCode == 0xFFFFFFFF) { ucWriteSec = i; } } ca_printf("ucWriteSec:%d\n",ucWriteSec); if(ucWriteSec != LOGO_MAX_SECTOR) { int iPos = 0; int iWriteLen = WRITE_LEN; for(i = 0; i < LOGO_MAX_SECTOR; i++) { if(i != ucWriteSec) DVB_CALogo_FlashWrite(LOGO_START_ADDR + i * 64 * 1024 + 4, (UINT8 *)(&ucOrder), 1); } while(iPos < uiLen) { if(iPos + WRITE_LEN < uiLen) iWriteLen = WRITE_LEN; else iWriteLen = uiLen - iPos; if(DVB_CALogo_FlashWrite(LOGO_START_ADDR + ucWriteSec * 64 * 1024 + 6 + iPos, g_ucCaLogoBuffer + iPos, iWriteLen) < 0) { g_ucRefresh = 1; break; } ca_printf("Write:%d\n",iPos); iPos += iWriteLen; if(iPos % (WRITE_LEN * 5) == 0) cyg_thread_delay(1); } if(iPos == uiLen) { uiMagicCode = MAGIC_CODE; if(DVB_CALogo_FlashWrite(LOGO_START_ADDR + ucWriteSec * 64 * 1024 + 5, (UINT8 *)(&g_stLogo.ucVer), 1) < 0) g_ucRefresh = 1; else { DVB_CALogo_FlashWrite(LOGO_START_ADDR + ucWriteSec * 64 * 1024, (UINT8 *)(&uiMagicCode), 4) ; } g_ucVer = pstFace->version_ID; ca_printf("Write End!\n"); } } else { g_ucRefresh = 1; ca_printf("Flash Full!\n"); memset(&g_stLogo, 0x0, sizeof(ST_LOGO)); memset(g_ucCaLogoBuffer, 0x0, MAX_LOGO_SIZE); g_stLogo.ucVer = 0xFF; } } else { ca_printf("Logo Crc ERROR!\n"); memset(&g_stLogo, 0x0, sizeof(ST_LOGO)); memset(g_ucCaLogoBuffer, 0x0, MAX_LOGO_SIZE); g_stLogo.ucVer = 0xFF; } } main_prog_msg_t stMsg; stMsg.u8MsgID = DVB_MODULE_ID; stMsg.u8SubModID = DVB_MONITOR; stMsg.u16FuncID = LOGO_UPGRADE; stMsg.pData = NULL; DVB_SendBackMsg(&stMsg, 0); cyg_thread_delay(1);}UINT32 DVB_CALogo_Get(UINT8 **pucBuffer){ int i; UINT32 uiMagicCode = 0; UINT8 ucOrder = 0; UINT32 uiLen = 0; /*if(g_ucRefresh) { *pucBuffer = g_ucCaLogoBuffer + 4; uiLen = (g_ucCaLogoBuffer[0] << 24) | (g_ucCaLogoBuffer[1] << 16) | (g_ucCaLogoBuffer[2] << 8) | g_ucCaLogoBuffer[3]; } else*/ { for(i = 0; i < LOGO_MAX_SECTOR; i++) { DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024, (UINT8 *)(&uiMagicCode),4); DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024 + 4, (UINT8 *)(&ucOrder),1); ca_printf("%d:%08x:%08x\n",1,uiMagicCode, ucOrder); if(uiMagicCode == MAGIC_CODE && ucOrder == 0xFF) { *pucBuffer = (UINT8 *)(0xa8000000 + LOGO_START_ADDR + i * 64 * 1024 + 6 + 4); DVB_CALogo_FlashRead(LOGO_START_ADDR + i * 64 * 1024 + 6, (UINT8 *)(&uiLen),4); uiLen = SWAP32(uiLen); break; } } } return uiLen; }static int DVB_CALogo_FlashEarse(UINT32 uiStartAdd, UINT32 iLen){ int iResult = 0; #ifndef EEPROM_FLASH_STORE_INFO memset((UINT8 *)(g_ucCaLogoBuffer + uiStartAdd % (64 * 1024)), 0xFF, (64 * 1024)); #else iResult = FlashEraseSecRange(uiStartAdd, iLen); #endif return iResult;}static int DVB_CALogo_FlashWrite(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen){ int iResult = 0; #ifndef EEPROM_FLASH_STORE_INFO memcpy((UINT8 *)(g_ucCaLogoBuffer + iStartAddr % (64 * 1024)), pBuf, iLen); #else iResult = FlashWrite(iStartAddr, pBuf,iLen); #endif return iResult;}static int DVB_CALogo_FlashRead(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen){ int iResult = 0; #ifndef EEPROM_FLASH_STORE_INFO //memcpy(pBuf, (UINT8 *)(g_ucCaLogoBuffer + iStartAddr % (64 * 1024)), iLen); ca_printf("FlashRead:%08x\n",(0xa8000000 + iStartAddr)); memcpy(pBuf, (UINT8 *)(0xa8000000 + iStartAddr) , iLen); #else iResult = FlashRead(iStartAddr, pBuf,iLen); #endif return iResult;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -