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

📄 cad7177.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
字号:
/******************************************************************************//*  Cad7177.c : Implementation of the AD7177 interface*  REALmagic Quasar Hardware Library*  Created by Aurelia Popa-Radu*  Copyright Sigma Designs Inc*  Sigma Designs Proprietary and confidential*  Created on 8/27/99*  Description:/******************************************************************************//****h* HwLib/CAD7177_implementation * NAME *	HwLib/CAD7177_implementation * COPYRIGHT *  Copyright Sigma Designs Inc *  Sigma Designs Proprietary and confidential * DESCRIPTION *  CAD7177 implementation of the ITvEncoder interface: *  void CAD7177__Init(ITvEncoder* pITvEncoder) *  void CAD7177__InitTvEncoder(ITvEncoder* pITvEncoder) *  void CAD7177__ProgramTV(ITvEncoder* pITvEncoder, *		DWORD TvMaster, DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable) *  void CAD7177__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value) *  void CAD7177__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value) *  void CAD7177__SetTVStandard(ITvEncoder* pITvEncoder, DWORD TvStandard) *  void CAD7177__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) *  void CAD7177__SendCCData(ITvEncoder* pITvEncoder, BYTE field, BYTE* Data) *  void CAD7177__ShowCloseCaption(ITvEncoder* pITvEncoder) *  void CAD7177__HideCloseCaption(ITvEncoder* pITvEncoder) *  void CAD7177__DisableTVBlackout(ITvEncoder* pITvEncoder)/******************************************************************************/#include "pch.h"#if defined AD7177_OBJECT#include "ci2c.h"#include "ctvenc.h"#include "cad7177.h"BYTE init7177Regs[] = {	0x00,	//	0x00= 00 Mode Reg 0	0x7f,	//	0x01= 01 Mode Reg 1 - power down	0x16,	//	0x02= 02 Subcarrier Frequency Reg0	0x7C,	//	0x03= 03 Subcarrier Frequency Reg1	0xF0,	//	0x04= 04 Subcarrier Frequency Reg2	0x21,	//	0x05= 05 Subcarrier Frequency Reg3	0x00,	//	0x06= 06 Subcarrier Phase Reg	0x04,	//	0x07= 07 Timing reg 0 - 8 bit, slave, CCIR 601-HSYNC,VSYNC,BLANK	0x00,	//	0x08= 08 Closed Captioning Ext Reg0	0x00,	//	0x09= 09 Closed Captioning Ext Reg1	0x00,	//	0x0a= 10 Closed Captioning Reg0	0x00,	//	0x0b= 11 Closed Captioning Reg1	0x73,	//	0x0c= 12 Timing reg 1 - some delays	0x08,	//	0x0d= 13 Mode Reg 2 - lower power mode, enable color, CCIR 601	0x00,	//	0x0e= 14 Pedestal Control Reg0	0x00,	//	0x0f= 15 Pedestal Control Reg1	0x00,	//	0x10= 16 Pedestal Control Reg2	0x00,	//	0x11= 17 Pedestal Control Reg3	0x08	//	0x12= 18 mode reg 3};////////////////////////////////////////////////////////////////////////////void CAD7177__Init(ITvEncoder* pITvEncoder){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	// Initialize virtual table with proper functions	this->VTable.Write				= CTvEncoder__Write;	this->VTable.Read				= CTvEncoder__Read;	this->VTable.WriteN				= CTvEncoder__WriteN;	this->VTable.ReadN				= CTvEncoder__ReadN;	this->VTable.InitTvEncoder		= CAD7177__InitTvEncoder;	this->VTable.ProgramTV			= CAD7177__ProgramTV;	this->VTable.SetTVStandard		= CAD7177__SetTVStandard;	this->VTable.EnableMacrovision	= CAD7177__EnableMacrovision;	this->VTable.SendCCData			= CAD7177__SendCCData;	this->VTable.ShowCloseCaption	= CAD7177__ShowCloseCaption;	this->VTable.HideCloseCaption	= CAD7177__HideCloseCaption;	this->VTable.DisableTVBlackout	= CAD7177__DisableTVBlackout;	this->VTable.SetPALSubcarrier	= CAD7177__SetPALSubcarrier;	this->VTable.SetNTSCSubcarrier	= CAD7177__SetNTSCSubcarrier;	this->VTable.SetCurrentYcYuvRgb	= CAD7177__SetCurrentYcYuvRgb;	//initialize AD7177 object	this->TVRegsTable = init7177Regs;}void CAD7177__InitTvEncoder(ITvEncoder* pITvEncoder){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	if (this->TVRegsTable == NULL)	return;	//VG	*(this->TVRegsTable + 0) = AD_LUMA_FILTER_EXTENDED_MODE;	*(this->TVRegsTable + 7) = 0x05;	//Timing reg 0 - 8 bit, slave, CCIR 601-HSYNC,VSYNC,BLANK	*(this->TVRegsTable + 0xc) = 0x73;	// ???	OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+2);	// without Macrovision	II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 18);}void CAD7177__ProgramTV(ITvEncoder* pITvEncoder, DWORD TvMaster,	DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->TvDacsEnable = DacsEnable;	if(DacsEnable)		*(this->TVRegsTable + 1) = this->CC_Enable;	// Power up DACs of TVEncoder	else		*(this->TVRegsTable + 1) = 0x7F;			// Power down DACs of TVEncoder	if(nbits == 8)	{		nbits = 0x00;		*(this->TVRegsTable + 0x12) = 0x08;	// 27 MHz	}	else	{		nbits = 0x40;		*(this->TVRegsTable + 0x12) = 0x04;	// 13.5 MHz	}	if( (ccir & CCIR_MASK) == CCIR_656 )	{		*(this->TVRegsTable + 7) = (BYTE)(0x00 | TvMaster | nbits);	// BlackOut, mode 0		*(this->TVRegsTable + 0xc) = 0x00;	// timing	}	else	// CCIR_601	{		*(this->TVRegsTable + 7) = (BYTE)(0x04 | TvMaster | nbits);	// BlackOut, mode 2		*(this->TVRegsTable + 0xc) = 0x33;	// timing	}	CAD7177__SetTVStandard(pITvEncoder, TvStandard);	switch(this->YcYuvRgb)	{	case COMPONENT_YUV:		*(this->TVRegsTable + 0) |= 0x40;	// select component output YUV or RGB		*(this->TVRegsTable + 0xd) = 0x48;// select YUV component		break;	case COMPONENT_RGB:		*(this->TVRegsTable + 0) |= 0x40;	// select component output YUV or RGB		*(this->TVRegsTable + 0xd) = 0x08;// select RGB component		break;	case COMPOSITE:	default:		*(this->TVRegsTable + 0) |= 0x00;	// select YC output		*(this->TVRegsTable + 0xd) = 0x08;// don't care ?		break;	}	// let's write the first 0x13 TV registers	II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 0x13);}void CAD7177__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->NTSC_SubcarrierFrequency = value;	OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+2);	if (this->CurrentTvStandard == SET_NTSC)		II2C_Write((II2C*)this->m_pII2C, 2, this->TVRegsTable+2, 4);}void CAD7177__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->PAL_SubcarrierFrequency = value;	OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+2);	if ( (this->CurrentTvStandard == SET_PAL) || (this->CurrentTvStandard == SET_PAL60) )		II2C_Write((II2C*)this->m_pII2C, 2,this->TVRegsTable+2,4);}void CAD7177__SetTVStandard(ITvEncoder* pITvEncoder, DWORD TvStandard){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	if( TvStandard == SET_PAL )	{		// PAL-B,D,G,H,I settings		*(this->TVRegsTable + 0) = 0x01 | AD_LUMA_FILTER_EXTENDED_MODE;		OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+2);	}	else if( TvStandard == SET_PAL60 )	{		// PAL-60 settings		*(this->TVRegsTable + 0) = 0x02 | AD_LUMA_FILTER_EXTENDED_MODE;		OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+2);	}	else	{		// NTSC settings		*(this->TVRegsTable + 0) = 0x00 | AD_LUMA_FILTER_EXTENDED_MODE;		OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+2);	}	this->CurrentTvStandard = TvStandard;	CAD7177__EnableMacrovision( pITvEncoder, CURRENT_MACROVISION );}void CAD7177__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->YcYuvRgb = YcYuvRgb;	*(this->TVRegsTable + 0) &= ~0x40;		// clear mask	switch(this->YcYuvRgb)	{	case COMPONENT_YUV:		*(this->TVRegsTable + 0) |= 0x40;	// select component output YUV or RGB		*(this->TVRegsTable + 0xd) = 0x48;	// select YUV component		break;	case COMPONENT_RGB:		*(this->TVRegsTable + 0) |= 0x40;	// select component output YUV or RGB		*(this->TVRegsTable + 0xd) = 0x08;	// select RGB component		break;	case COMPOSITE:	default:		*(this->TVRegsTable + 0) |= 0x00;	// select YC output		*(this->TVRegsTable + 0xd) = 0x08;	// don't care ?		break;	}	// update to hardware	II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable + 0, 1);	II2C_Write((II2C*)this->m_pII2C, 0xd, this->TVRegsTable + 0xd, 1);} void CAD7177__SendCCData(ITvEncoder* pITvEncoder, BYTE field, BYTE* Data){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	if ( (this->CC_Enable == 0) || (this->CC_UserEnable == 0) )		return;	if( field & 0x80 )	// line21_switch = 1 -> valid data	{		if( (field & 0x01) == 0)		{			this->CC_FieldEnable |= AD_ECCF1;			II2C_Write((II2C*)this->m_pII2C, 0x0a, Data, 2);		// CloseCaption registers		}		else		{			this->CC_FieldEnable |= AD_ECCF2;			II2C_Write((II2C*)this->m_pII2C, 0x08, Data, 2);		// Extended data		}	}	else				// line21_switch = 0 -> invalid data	{		if( (field & 0x01) == 0)			this->CC_FieldEnable &= ~AD_ECCF1;		else			this->CC_FieldEnable &= ~AD_ECCF2;	}	II2C_Write((II2C*)this->m_pII2C, 0x01, &(this->CC_FieldEnable), 1);	QDbgLog((QLOG_TRACE, QDebugLevelTrace, TEXT("_%x "), this->CC_FieldEnable));}void CAD7177__ShowCloseCaption(ITvEncoder* pITvEncoder){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	BYTE Byte = 0;	this->CC_Enable = (this->CC_UserEnable) ? (AD_ECCF1 | AD_ECCF2):0;	this->CC_FieldEnable = this->CC_Enable;	II2C_Read((II2C*)this->m_pII2C, 0x01, &Byte, 1);	Byte |= this->CC_Enable;	II2C_Write((II2C*)this->m_pII2C, 0x01, &Byte, 1);}void CAD7177__HideCloseCaption(ITvEncoder* pITvEncoder){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	BYTE Byte = 0;	this->CC_Enable = 0;	this->CC_FieldEnable = 0;	II2C_Read((II2C*)this->m_pII2C, 0x01, &Byte, 1);	Byte &= ~(AD_ECCF1 | AD_ECCF2);	II2C_Write((II2C*)this->m_pII2C, 0x01, &Byte, 1);}void CAD7177__DisableTVBlackout(ITvEncoder* pITvEncoder){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	*(this->TVRegsTable + 7) |= 8;					// disable BlackOut for TV	II2C_Write((II2C*)this->m_pII2C, 7, this->TVRegsTable + 7, 1);}#else	// ! AD7177_OBJECTvoid CAD7177__Init(ITvEncoder* pITvEncoder){}#endif	// AD7177_OBJECT

⌨️ 快捷键说明

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