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

📄 canlgpvr.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
字号:
/******************************************************************************//*  canlgpvr.c : specific code for ANALOG_PVR board*  REALmagic Quasar Hardware Library*  Created by Aurelia Popa-Radu*  Copyright Sigma Designs Inc*  Sigma Designs Proprietary and confidential*  Created on 8/7/01*  Description:/******************************************************************************//****h* HwLib/CAnlgPvr_Implementation * DESCRIPTION *  CAnlgPvr implementation of the IDecoderBoard interface. * AnalogOverlay PVR uses EM847X, EM9010, AD7170, SA7114, SM2288, Sii168 components * to implement video/audio encoding, analog overlay output, TV and scart output, * HDTV output, DVI output. * Identified by HwLib reading MD5,MD4,MD3,MD2 pins  = 0111 (MDCFG_ANLG_DIG_PVR) * and first EEPROM location (0xBA). * PIO0	- IIC Clock for EM9010, AD7170, Eeprom, Sii168 * PIO1	- IIC Data for EM9010, AD7170, Eeprom, Sii168 * PIO2 - FILTER_0_PIO * PIO3 - FILTER_1_PIO * PIO4	- SCART_169_PIO * PIO5	- nSCART_EN_PIO * PIO6 - nSCART_RGB_PIO * PIO7 - DACS_VGA_PIO * PIO8 - SEL_DIG_AUDIO_IN_PIO * PIO9 - SEL2288_PIO * PIO10 - DACS_VGA_PIO = 1/0 select sm2288/saa7114 data & syncs * Implementation is based on NE2000: * Specific implementation: * QRESULT CAnlgPvr__VidSetVGATV(IDecoderBoard* pIDecoderBoard, *		DWORD VideoRunning, DWORD TvOut) * QRESULT CAnlgPvr__PrepareVideoIn(IDecoderBoard* pIDecoderBoard, DWORD config) * QRESULT CAnlgPvr__PrepareLBCCapture(IDecoderBoard* pIDecoderBoard, DWORD config)/******************************************************************************/#include "pch.h"#if defined ANALOG_PVR_BRD#include "cqsrbrd.h"#include "regs847x.h"#include "em847x.h"// use predefined PIO0 and PIO1 for I2C_CLK_PIO, I2C_DATA_PIO#define FILTER_0_PIO				PIO2#define FILTER_1_PIO				PIO3#define SCART_169_PIO				PIO4#define nSCART_EN_PIO				PIO5#define nSCART_RGB_PIO				PIO6#define DACS_VGA_PIO				PIO7#define SEL_DIG_AUDIO_IN_PIO		PIO8#define SEL2288_PIO					PIO9	// 1/0=select sm2288/saa7114 data & syncs#define nAVIN_ENABLE_PIO			PIO10	// 1/0=disable/enable data & syncs coming from sm2288 or saa7114QRESULT CAnlgPvr__VidSetVGATV(IDecoderBoard* pIDecoderBoard, DWORD VideoRunning, DWORD TvOut){	CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard;	DWORD ccir = CCIR_601 | NO_INVERT_FIELD | SYNC_ENABLE_1;	// make sure to reject wrong setting and keep the previous mode	if( (TvOut == SET_VGA) && !(this->BoardCapabilities & MPEG_CAPABILITY_VGA_WINDOW) )// no analog cable connected		return Q_OK;	this->TvOut = TvOut;	QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("CNE2000__VidSetVGATV VideoRunning=%x this->TvOut=%x"),		VideoRunning, this->TvOut));	switch(this->TvOut)	{	case SET_VGA:	// Nova master, SigmaTv slave, Quasar slave		if(VideoRunning & RST_DC)			IDecoder_StopDisplayController(this->m_pIDecoder);		ITvEncoder_ProgramTV(this->m_pISigmaTv, TVSLAVE, 8,			ccir, this->Standard_TvOut, 0);		IDecoder_QuasarSlave( this->m_pIDecoder, 16, ccir,			(this->Standard_TvOut == SET_PAL) ? &this->MasterParamsPal:&this->MasterParamsNtsc,			VSHS_ACTIVE_HI, Q3CTRL2_NOINTERLACED | DIGITAL_DATA_ENABLE);		IDecoderBoard_SelectVClk(pIDecoderBoard, VgaVClk, NULL, 0);		// Nova enable DVCLK, VRDY selected - show the MPEG		IAnalogOverlay_SetVGA(this->m_pINova1);		// change resolution if it is any real change and update the overlay 		CNE2000__VidChangeResolution(pIDecoderBoard,  &this->NewDisplayResolution);		IDecoder_SetKmin(this->m_pIDecoder, this->SrcWnd.w + 6, this->DefHFrequency * 100);		CNE2000__VGAUpdateVideoWindow(pIDecoderBoard);		break;		case SET_HDTV:	// SigmaTv master, Quasar slave, Nova slave		// Nova - DVCLK disable, GND selected - hide the MPEG		IAnalogOverlay_SetTv(this->m_pINova1);		C847xBrd__CheckHdtvMcrvsn(pIDecoderBoard);		C847xBrd__VidSetHdtv(pIDecoderBoard, VideoRunning);		break;	case SET_TV:	// SigmaTv master, Quasar slave, Nova slave		if(VideoRunning & RST_DC)			IDecoder_StopDisplayController(this->m_pIDecoder);		// Nova - DVCLK disable, GND selected - hide the MPEG		IAnalogOverlay_SetTv(this->m_pINova1);		IDecoderBoard_SelectVClk(pIDecoderBoard, TvVClk, NULL, 0);		ITvEncoder_SetCurrentYcYuvRgb(this->m_pITvEncoder, this->ReqYcYuvRgb);		ITvEncoder_ProgramTV(this->m_pISigmaTv, TVMASTER, 8,			ccir, this->Standard_TvOut, VideoRunning & ~RST_DC);		IDecoder_QuasarSlave( this->m_pIDecoder, 8, ccir,			(this->Standard_TvOut == SET_PAL) ? &this->MasterParamsPal:&this->MasterParamsNtsc,			VSHS_ACTIVE_LOW, Q3CTRL2_NOINTERLACED | DIGITAL_DATA_ENABLE);		CQuasarBoard__TVVMIUpdateVideoWindow(pIDecoderBoard);		break;	}	return Q_OK;}QRESULT CAnlgPvr__PrepareVideoIn(IDecoderBoard* pIDecoderBoard, DWORD config){	CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard;	// it should work 601 too	DWORD ccir = CCIR_656 | NO_INVERT_FIELD | SYNC_ENABLE_1;	IDecoder_WritePIO(this->m_pIDecoder, SEL2288_PIO, 0);	// select saa7114 data & syncs	IDecoder_WritePIO(this->m_pIDecoder, nAVIN_ENABLE_PIO, 0);	// enable data & syncs from saa7114/sm2288	// AD717x is connected only on video-in signals	// let's use same settings from main TvEncoder	ITvEncoder_SetCurrentYcYuvRgb(this->m_pIExtTv,		ITvEncoder_GetCurrentYcYuvRgb(this->m_pITvEncoder));	ITvEncoder_ProgramTV(this->m_pIExtTv, TVSLAVE, 8,		ccir, this->Standard_TvOut, 1);				// TV slave, dacs enabled	ITvEncoder_DisableTVBlackout(this->m_pIExtTv);	OSTimeDelay(1000);#ifdef EM848X_MICROCODE	if( this->QuasarVersion == EM848XA_Q4 )	{		IDecoder_WriteReg(this->m_pIDecoder, DRAM_portmux,			(IDecoder_ReadReg(this->m_pIDecoder, DRAM_portmux) & ~(DRAM_portmux_CHW0_Mask | DRAM_portmux_CHW4_Mask)) |			(DRAM_portmux_VCLuma_to_CHW0 | DRAM_portmux_VCChroma_to_CHW4));	}	else#endif#ifdef EM847X_REVC_MICROCODE	if( this->QuasarVersion == EM847XC_Q4 )	{		IDecoder_WriteReg(this->m_pIDecoder, DRAM_portmux,			(IDecoder_ReadReg(this->m_pIDecoder, DRAM_portmux) & ~(DRAM_portmux_CHW0_Mask | DRAM_portmux_CHW4_Mask)) |			(DRAM_portmux_VCLuma_to_CHW0 | DRAM_portmux_VCChroma_to_CHW4));	}	else#endif	{		IDecoder_WriteReg(this->m_pIDecoder, DRAM_portmux,			(IDecoder_ReadReg(this->m_pIDecoder, DRAM_portmux) & ~(DRAM_portmux_CHW0_Mask | DRAM_portmux_CHW3_Mask)) |			(DRAM_portmux_VCLuma_to_CHW0 | DRAM_portmux_VCChroma_to_CHW3));	}	return Q_OK;}QRESULT CAnlgPvr__PrepareLBCCapture(IDecoderBoard* pIDecoderBoard, DWORD config){	CQuasarBoard *this = (CQuasarBoard*) pIDecoderBoard;	// it should work 601 too	DWORD ccir = CCIR_656 | NO_INVERT_FIELD | SYNC_ENABLE_1;	IDecoder_WritePIO(this->m_pIDecoder, SEL_DIG_AUDIO_IN_PIO, 0);	// enable stereo in	IDecoder_WritePIO(this->m_pIDecoder, SEL2288_PIO, 1);		// select sm2288 data & syncs	IDecoder_WritePIO(this->m_pIDecoder, nAVIN_ENABLE_PIO, 0);	// enable data & syncs from saa7114/sm2288	// let's use same settings from main TvEncoder	ITvEncoder_SetCurrentYcYuvRgb(this->m_pIExtTv,		ITvEncoder_GetCurrentYcYuvRgb(this->m_pITvEncoder));	ITvEncoder_ProgramTV(this->m_pIExtTv, TVSLAVE, 8,		ccir, this->Standard_TvOut, 1);				// TV slave, dacs enabled	ITvEncoder_DisableTVBlackout(this->m_pIExtTv);	OSTimeDelay(1000);	return Q_OK;}void CAnlgPvr__InitVtable(IDecoderBoard* pIDecoderBoard){	CQuasarBoard* this = (CQuasarBoard*) pIDecoderBoard;	CNE2000Common__InitVtable(pIDecoderBoard);	this->lpVtbl->SelectVClk				= C847xBrd__SelectVClk;	this->lpVtbl->AudioSetSampleRate		= C847xBrd__AudioSetSampleRate;	this->lpVtbl->WriteDataToLBC			= C847xBrd__WriteDataToLBC;	this->lpVtbl->ReadDataFromLBC			= C847xBrd__ReadDataFromLBC;	this->lpVtbl->VidSetVGATV				= CAnlgPvr__VidSetVGATV;	this->lpVtbl->PrepareVideoIn			= CAnlgPvr__PrepareVideoIn;	this->lpVtbl->PrepareLBCCapture			= CAnlgPvr__PrepareLBCCapture;#if defined SM2288_OBJECT	this->lpVtbl->EnableLBCInterrupt		= CSm2288PvrBrd__EnableLBCInterrupt;#endif	// SM2288_OBJECT}QRESULT CAnlgPvr__SpecificCreateInstance(IDecoderBoard* pIDecoderBoard, DWORD dwInstance){	CQuasarBoard* this = (CQuasarBoard*) pIDecoderBoard;	QRESULT qr;	DWORD TvEncoderId = 1;	if( QFAILED(qr = CNE2000Common__SpecificCreateInstance(pIDecoderBoard, dwInstance)) )		return qr;	// Create CTvEncoder instance	if( ModCreateInstance (dwInstance, &CLSID_CTVENCODER, &IID_ITVENCODER,		(void**)&this->m_pIExtTv) != NOERROR)	{		return Q_FAIL;	}	ISetI2CpIO_SetI2C_params( this->m_pISetI2CpIO, I2C_PIO_DATA, I2C_PIO_CLOCK);	ITvEncoder_Init(this->m_pIExtTv, &TvEncoderId);	ITvEncoder_SetRegistry(this->m_pIExtTv, this->pRegistry);//	this->m_pITvEncoder = this->m_pIExtTv;	// used for Sm2288 output	// Create also Csaa7174 instance	if( ModCreateInstance (dwInstance, &CLSID_CSAA7114, &IID_IVIDEODECODER,		(void**)&this->m_pIVideoDecoder) != NOERROR )	{		return Q_FAIL;	}	IVideoDecoder_Init(this->m_pIVideoDecoder);	IVideoDecoder_InitPropertySet(this->m_pIVideoDecoder, this->pPropSetList, sizeof(PROPERTY_SET_ITEM));#if defined SM2288_OBJECT	// Create also Csm2288 instance	if( ModCreateInstance (dwInstance, &CLSID_CSM2288, &IID_IMPEGENCODER,		(void**)&this->m_pIMpegEncoder) != NOERROR )	{		return Q_FAIL;	}	IMpegEncoder_Init(this->m_pIMpegEncoder);	IMpegEncoder_InitPropertySet(this->m_pIMpegEncoder, this->pPropSetList, sizeof(PROPERTY_SET_ITEM));	{	// initialize some parameters for transfering the encoder microcode	emeXferUcodeParameters_type XferUcodeParams;	CommonSymbolTable* pQ = (CommonSymbolTable*)this->pQ;	XferUcodeParams.SysPhysAddr = this->HwLibConf.OsdDmaBuffPhysAddr;	XferUcodeParams.SysLinAddr = (DWORD)this->HwLibConf.OsdDmaBuffLinAddr;	XferUcodeParams.SysSizeInBytes = 0x8000;	// 32k	XferUcodeParams.DramAddr =		(IDecoder_ReadDM(this->m_pIDecoder, pQ->OSD_BuffStart_Hi.addr)<<16) 		| (IDecoder_ReadDM(this->m_pIDecoder, pQ->OSD_BuffStart_Lo.addr));	XferUcodeParams.DramSizeInBytes = 0x8000;	// 32k	IDecoder_SetProperty(this->m_pIMpegEncoder, MPEG_ENCODER_SET, emeXferUcodeParameters, 0,		&XferUcodeParams, sizeof(emeXferUcodeParameters_type), NULL);	}#endif	// SM2288_OBJECT	// Create also Csii168 instance	if( ModCreateInstance (dwInstance, &CLSID_CSII168, &IID_IDVITRANSMITTER,		(void**)&this->m_pIDviTransmitter) != NOERROR )	{		return Q_FAIL;	}	IDviTransmitter_Init(this->m_pIDviTransmitter);	IDviTransmitter_InitPropertySet(this->m_pIDviTransmitter, this->pPropSetList, sizeof(PROPERTY_SET_ITEM));	this->BoardCapabilities |= MPEG_CAPABILITY_DVI;	// overwrite necessary values	CAnlgPvr__InitVtable(pIDecoderBoard);	this->BoardVersion = ANALOG_PVR;	this->SubId = (this->BoardVersion>>8);	if( (IDecoder_ReadReg(this->m_pIDecoder, DRAM_startup) & 0x3C) != MDCFG_ANLG_DIG_PVR )		QDbgLog((QLOG_TRACE, QDebugLevelWarning, TEXT("\n\nERROR: Create ANALOG_PVR is FORCED !") ));	{	DWORD Value = JDA1_SCkinJDA1CK_Jda1CkinGCK_ScinOUT_DamckOUT;	IDecoder_SetProperty(this->m_pIDecoder,		DECODER_SET, edecAudioInOutConfig, 0, &Value, sizeof(DWORD), NULL);	Value = 24;	IDecoder_SetProperty(this->m_pIDecoder,		DECODER_SET, edecAudioDacBitsPerSample, 0, &Value, sizeof(DWORD), NULL);	}	return Q_OK;}#endif	// ANALOG_PVR_BRD#if defined ANALOG_PVR_BRD && !defined ANY_BRDQRESULT CreateInstance(DWORD* pInstance, void* pHwLibConf){	QRESULT qr = CommonCreateInstance(pInstance, pHwLibConf);	if( QSUCCEEDED(qr) )		qr = CAnlgPvr__SpecificCreateInstance(g_pIDecoderBoard[*pInstance], *pInstance);	if( QFAILED(qr) )	{		CQuasarBoard__DeleteObjects(g_pIDecoderBoard[*pInstance]);		g_pIDecoderBoard[*pInstance] = 0;		return E_CREATE_INSTANCE_FAILED;	}	return Q_OK;}#endif	// ANALOG_PVR_BRD && !ANY_BRD

⌨️ 快捷键说明

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