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

📄 videocore.cpp

📁 自己在wince的环境下做的一移动数字电视驱动
💻 CPP
字号:
// VideoCore.cpp: implementation of the CVideoCore class.
//
//////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "VideoCore.h"
#include "Virtual.h"
#include "TCCUtil.h"

#if defined(__TCC79XX_WINCE__) 
#include "TCC79x_Physical.h"
typedef volatile struct{
	/* UNUSED must be declared to access BCLKCTR and SWRESET. see VirtualCopy()*/
	unsigned int UNUSED[6];	//0xF3000000 ~ 0xF3000014
	unsigned int BCLKCTR;	//0xF3000018
	unsigned int BCLKCTR1;	//0xF300001C
	unsigned int SWRESET;	//0xF3000020
	//skip other registers
}sCKCReg;
#else // TCC78x
#include "TCC78xPhysical.h"
typedef volatile struct{
	/* UNUSED must be declared to access BCLKCTR and SWRESET. see VirtualCopy()*/
	unsigned int UNUSED[6];	//0xF3000000 ~ 0xF3000014
	unsigned int BCLKCTR;	//0xF3000018
	unsigned int SWRESET;	//0xF300001C
	//skip other registers
}sCKCReg;
#endif


typedef volatile struct{	
	unsigned int REMAP;	//0xF3005000
	unsigned int VCFG0;	//0xF3005004
	//skip other registers
}sSYSCReg;

int VCORE_Open(unsigned uCODEC, unsigned uCODE, unsigned uCODESize, unsigned int nROBASE,
								unsigned uCODE2, unsigned uCODESize2, unsigned int nROBASE2)
{
	volatile sCKCReg	*pCKCReg = NULL;
	volatile sSYSCReg	*pSYSCReg = NULL;

	volatile unsigned char* pSPBASE = NULL;
	volatile unsigned char* pSPBASE2 = NULL;
	
	//HwCLKCTRL
	pCKCReg = (sCKCReg*)SetVirtual(0xF3000000, sizeof(sCKCReg));
	if(!pCKCReg)
		return -1;

	//HwREMAP
	pSYSCReg = (sSYSCReg*)SetVirtual(0xF3005000, sizeof(sSYSCReg));
	if(!pSYSCReg)
	{
		FreeVirtual((void*)pCKCReg, sizeof(sCKCReg));
		return -1;
	}
	pSPBASE = (unsigned char*)SetVirtual(nROBASE, uCODESize);
	if(!pSPBASE)
	{
		FreeVirtual((void*)pCKCReg, sizeof(sCKCReg));
		FreeVirtual((void*)pSYSCReg, sizeof(sSYSCReg));
		return -1;
	}
	if( uCODESize2 ) {
		pSPBASE2 = (unsigned char*)SetVirtual( nROBASE2,uCODESize2);
		if(!pSPBASE2)
		{
			FreeVirtual((void*)pCKCReg, sizeof(sCKCReg));
			FreeVirtual((void*)pSYSCReg, sizeof(sSYSCReg));
			FreeVirtual((void*)pSPBASE, uCODESize);
		}
	}

	BITSET( pCKCReg->SWRESET, HwSWRESET_VCH_ON|HwSWRESET_SUBPRO|HwSWRESET_SUBPROPERI );
	BITSET( pCKCReg->BCLKCTR, HwBCLKCTR_SUBPRO|HwBCLKCTR_VCH_ON|HwBCLKCTR_SUBPROPERI );
	pSYSCReg->VCFG0 = nROBASE;
	BITCLR( pCKCReg->SWRESET,  HwSWRESET_VCH_ON);	 // Release Reset to access the region of 0x10010000 ~ 0x10018000
	
	if ((uCODE|nROBASE) & 3)
	{
		printf("[Error!!] SubCore Code Base is not Aligned\n");
		Sleep(1000);
		return -1;
	}

	//CAPP_SetModeClock(0, 196, 98, VCORE_PRIORITY_CLOCK);
	memcpy( (void*)pSPBASE, (void*)uCODE, uCODESize);
	if( pSPBASE2 )
		memcpy( (void*)pSPBASE2, (void*)uCODE2,uCODESize2);
	Sleep(10);
	BITCLR(pCKCReg->SWRESET, HwSWRESET_SUBPRO|HwSWRESET_SUBPROPERI);
	Sleep(10);

	FreeVirtual((void*)pCKCReg, sizeof(sCKCReg));
	FreeVirtual((void*)pSYSCReg, sizeof(sSYSCReg));
	FreeVirtual((void*)pSPBASE, uCODESize);
	if( pSPBASE2 )
		FreeVirtual((void*)pSPBASE2, uCODESize2);

	return 0;
}

void VCORE_Close()
{
	volatile sCKCReg	*pCKCReg = NULL;
	volatile sSYSCReg	*pSYSCReg = NULL;

	//HwCLKCTRL
	pCKCReg = (sCKCReg*)SetVirtual(0xF3000000, sizeof(sCKCReg));
	if(!pCKCReg)
		return;

	//HwREMAP
	pSYSCReg = (sSYSCReg*)SetVirtual(0xF3005000, sizeof(sSYSCReg));
	if(!pSYSCReg)
	{
		FreeVirtual((void*)pCKCReg, sizeof(sCKCReg));
		return;
	}

	BITSET( pCKCReg->SWRESET, HwSWRESET_VCH_ON|HwSWRESET_SUBPRO|HwSWRESET_SUBPROPERI );
	BITCLR( pCKCReg->BCLKCTR, HwBCLKCTR_SUBPRO|HwBCLKCTR_VCH_ON|HwBCLKCTR_SUBPROPERI );

	FreeVirtual((void*)pCKCReg, sizeof(sCKCReg));
	FreeVirtual((void*)pSYSCReg, sizeof(sSYSCReg));
}

⌨️ 快捷键说明

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