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

📄 cad7170.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
字号:
/******************************************************************************//*  CAd7170.c : Implementation of the AD7170A 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/CAD7170_implementation * NAME *	HwLib/CAD7170_implementation * COPYRIGHT *  Copyright Sigma Designs Inc *  Sigma Designs Proprietary and confidential * DESCRIPTION *  CAD7170 implementation of the ITvEncoder interface: *  void CAD7170__Init(ITvEncoder* pITvEncoder) *  void CAD7170__InitTvEncoder(ITvEncoder* pITvEncoder) *  void CAD7170__ProgramTV(ITvEncoder* pITvEncoder, *		DWORD TvMaster, DWORD nbits, DWORD ccir, DWORD TvStandard, DWORD DacsEnable) *  void CAD7170__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value) *  void CAD7170__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value) *  void CAD7170__SetTVStandard(ITvEncoder* pITvEncoder, DWORD TvStandard) *  void CAD7170__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb) *  void CAD7170__SendCCData(ITvEncoder* pITvEncoder, BYTE field, BYTE* Data) *  void CAD7170__ShowCloseCaption(ITvEncoder* pITvEncoder) *  void CAD7170__HideCloseCaption(ITvEncoder* pITvEncoder) *  void CAD7170__DisableTVBlackout(ITvEncoder* pITvEncoder)/******************************************************************************/#include "pch.h"#if defined AD7170_OBJECT#include "ci2c.h"#include "ctvenc.h"#include "cad7170.h"// The following values are for NTSCBYTE init7170Regs[] = {	0x00,	//	0x00= 00 Mode Reg 0	0x7F,	//	0x01= 01 Mode Reg 1 - power down	0x08,	//	0x02= 02 Mode Reg 2	0x00,	//	0x03= 03 mode reg 3	0x40,	//	0x04= 04 mode reg 4 - lower power mode, enable color, CCIR 601	0x00,	//	0x05= 05 reserved	0x00,	//	0x06= 06 reserved	0x0c,	//	0x07= 07 Timing reg 0 - 8 bit, slave, CCIR 601-HSYNC,VSYNC,BLANK	0x73,	//	0x08= 08 Timing reg 1 - some delays	0x16,	//	0x09= 09 Subcarrier Frequency Reg0	0x7C,	//	0x0a= 10 Subcarrier Frequency Reg1	0xF0,	//	0x0b= 11 Subcarrier Frequency Reg2	0x21,	//	0x0c= 12 Subcarrier Frequency Reg3	0x00,	//	0x0d= 13 Subcarrier Phase Reg	0x00,	//	0x0e= 14 Closed Captioning Ext Reg0	0x00,	//	0x0f= 15 Closed Captioning Ext Reg1	0x00,	//	0x10= 16 Closed Captioning Reg0	0x00,	//	0x11= 17 Closed Captioning Reg1	0x00,	//	0x12= 18 NTSC Pedestal Control Reg0	0x00,	//	0x13= 19 NTSC Pedestal Control Reg1	0x00,	//	0x14= 20 NTSC Pedestal Control Reg2	0x00,	//	0x15= 21 NTSC Pedestal Control Reg3	0x00,	//	0x16= 22 CGMS_WSS_0	0x00,	//	0x17= 23 CGMS_WSS_1	0x00,	//	0x18= 24 CGMS_WSS_2	0x00,	// 	0x19= 25 Teletext Request Position	0x00,	// 	0x1a= 26 reserved	0x00,	// 	0x1b= 27 reserved	0x00,	// 	0x1c= 28 reserved	0x00,	// 	0x1d= 29 reserved};////////////////////////////////////////////////////////////////////////////void CAD7170__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		= CAD7170__InitTvEncoder;	this->VTable.ProgramTV			= CAD7170__ProgramTV;	this->VTable.SetTVStandard		= CAD7170__SetTVStandard;	this->VTable.EnableMacrovision	= CAD7170__EnableMacrovision;	this->VTable.SendCCData			= CAD7170__SendCCData;	this->VTable.ShowCloseCaption	= CAD7170__ShowCloseCaption;	this->VTable.HideCloseCaption	= CAD7170__HideCloseCaption;	this->VTable.DisableTVBlackout	= CAD7170__DisableTVBlackout;	this->VTable.SetPALSubcarrier	= CAD7170__SetPALSubcarrier;	this->VTable.SetNTSCSubcarrier	= CAD7170__SetNTSCSubcarrier;	this->VTable.SetCurrentYcYuvRgb	= CAD7170__SetCurrentYcYuvRgb;	this->lpVtbl = &this->VTable ;	this->TVRegsTable = init7170Regs;}void CAD7170__InitTvEncoder(ITvEncoder* pITvEncoder){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	if (this->TVRegsTable == NULL)	return;	//VG	*(this->TVRegsTable + 0) = AD_LUMA_FILTER_EXTENDED_MODE;	*(this->TVRegsTable + 1) = 0x7F;	*(this->TVRegsTable + 7) = 0x04;	// 8 bit, slave, mode 2, blackout	*(this->TVRegsTable + 8) = 0x73;	// timing	OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+9);	II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 30);		// without Macrovision}void CAD7170__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		*(this->TVRegsTable + 4) = 0x00;			// wake up TVEncoder	}	else	{		*(this->TVRegsTable + 1) = 0x78;			// Power down DACs of TVEncoder		if(!TvMaster)			*(this->TVRegsTable + 4) = 0x40;		// sleep mode TVEncoder		else			*(this->TVRegsTable + 4) = 0x00;		// wake up TVEncoder	}	if(nbits == 8)		nbits = 0x00;	else		nbits = 0x40;	if( TvMaster )		*(this->TVRegsTable + 8) = 0x73;	// timing	else		*(this->TVRegsTable + 8) = 0x00;	// timing	if( (ccir & CCIR_MASK) == CCIR_656 )		*(this->TVRegsTable + 7) = (BYTE)(0x00 | TvMaster | nbits);	// BlackOut, mode 0	else	// CCIR_601		*(this->TVRegsTable + 7) = (BYTE)(0x04 | TvMaster | nbits);	// BlackOut, mode 2	CAD7170__SetTVStandard(pITvEncoder, TvStandard);	switch(this->YcYuvRgb)	{	case COMPONENT_YUV:		*(this->TVRegsTable + 4) |= 0x03;	// select component output YUV		break;	case COMPONENT_RGB:		*(this->TVRegsTable + 4) |= 0x05;	// select component output RGB		break;	case OUTPUT_OFF:		*(this->TVRegsTable + 1) = 0x78;			// Power down DACs of TVEncoder		break;	case COMPOSITE:	default:		*(this->TVRegsTable + 4) |= 0x00;	// select YC output		break;	}	// let's write the first 13 TV registers	II2C_Write((II2C*)this->m_pII2C, 0, this->TVRegsTable, 0x0d);}void CAD7170__SetNTSCSubcarrier(ITvEncoder* pITvEncoder, DWORD value){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->NTSC_SubcarrierFrequency = value;	OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+9);	if (this->CurrentTvStandard == SET_NTSC)		II2C_Write((II2C*)this->m_pII2C, 9, this->TVRegsTable+9, 4);}void CAD7170__SetPALSubcarrier(ITvEncoder* pITvEncoder, DWORD value ){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->PAL_SubcarrierFrequency = value;	OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+9);	if ( (this->CurrentTvStandard == SET_PAL) || (this->CurrentTvStandard == SET_PAL60) )		II2C_Write((II2C*)this->m_pII2C, 9,this->TVRegsTable+9,4);}void CAD7170__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+9);	}	else if( TvStandard == SET_PAL60 )	{		// PAL-60 settings		*(this->TVRegsTable + 0) = 0x02 | AD_LUMA_FILTER_EXTENDED_MODE;		OSPutDword(this->PAL_SubcarrierFrequency, this->TVRegsTable+9);	}	else	{		// NTSC settings		*(this->TVRegsTable + 0) = 0x00 | AD_LUMA_FILTER_EXTENDED_MODE;		OSPutDword(this->NTSC_SubcarrierFrequency, this->TVRegsTable+9);	}	this->CurrentTvStandard = TvStandard;	CAD7170__EnableMacrovision( pITvEncoder, CURRENT_MACROVISION );}void CAD7170__SetCurrentYcYuvRgb(ITvEncoder* pITvEncoder, DWORD YcYuvRgb){	CTvEncoder* this = (CTvEncoder*) pITvEncoder;	this->YcYuvRgb = YcYuvRgb;	*(this->TVRegsTable + 4) &= ~0x07;		// clear mask	switch(this->YcYuvRgb)	{	case COMPONENT_YUV:		*(this->TVRegsTable + 4) |= 0x03;	// select component output YUV		break;	case COMPONENT_RGB:		*(this->TVRegsTable + 4) |= 0x05;	// select component output RGB		break;	case OUTPUT_OFF:		*(this->TVRegsTable + 1) = 0x78;			// Power down DACs of TVEncoder		II2C_Write((II2C*)this->m_pII2C, 1, this->TVRegsTable + 1, 1);		return;	case COMPOSITE:	default:		*(this->TVRegsTable + 4) |= 0x00;	// select YC output		break;	}	// update to hardware	II2C_Write((II2C*)this->m_pII2C, 4, this->TVRegsTable + 4, 1);} void CAD7170__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, 0x10, Data, 2);		// CloseCaption registers		}		else		{			this->CC_FieldEnable |= AD_ECCF2;			II2C_Write((II2C*)this->m_pII2C, 0x0e, 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 CAD7170__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 CAD7170__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 CAD7170__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	// ! AD7170_OBJECTvoid CAD7170__Init (ITvEncoder* pITvEncoder){}#endif	// AD7170_OBJECT

⌨️ 快捷键说明

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