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

📄 dvb_calogo.c

📁 我国有线电视条件接受标准目前还没有统一
💻 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 + -