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

📄 saa7118.cpp

📁 一个开放源码的bt848/878驱动程序的源码
💻 CPP
字号:

#include "SAA7118.hpp"

void SAA7118::SetRegister(BYTE Register, BYTE Value)
{
	i2c.Write(i2caddr,Register,Value);
}

BYTE SAA7118::GetRegister(BYTE Register)
{
	BYTE Result(0);
	i2c.WR(i2caddr,&Register,1,&Result,1);
    return Result;
}


SAA7118::SAA7118(I2C& bus, const BYTE Addr) :
	i2c(bus) , i2caddr(Addr)
{
	SAA7118::Restart();
}


// Information
int	SAA7118::SVideoCount( void ) const
{
	return 2;
}

int	SAA7118::CompositeCount( void ) const
{
	return 6;
}

int	SAA7118::SerialDigitalCount( void ) const
{
	return 1;
}

int	SAA7118::ParallelDigitalCount( void ) const
{
	return 1;
}

int	SAA7118::RGBCount( void ) const
{
	return 1;
}

int	SAA7118::ComponentVideoCount( void ) const
{
	return 1;
}

// To support Hibernate mode
void SAA7118::Restart( void )
{
	int i;
	
	BYTE dBrightness = 135, dContrast = 62, dSat = 64, dHue = 0, // Other analog
		cBrightness = 176, cContrast = 90, cSat = 64, // Component
		ABrightness = 128, AContrast = 64, ASat = 64, // Post
		verticalChromaPhaseOffset = 0, verticalLumaPhaseOffset = 0,
		horizontalChromaPhaseOffset = 0, horizontalLumaPhaseOffset = 0;
	
	SetRegister(0x01,0x47);
	//0x02 is input selection
	SetRegister(0x03,0x20);
	SetRegister(0x04,0x90); //not on datasheet
	SetRegister(0x05,0x90); //not on datasheet
	SetRegister(0x06,0xeb);
	SetRegister(0x07,0xe0);
	SetRegister(0x08,0xe8);  //enforce even/odd toggle even if non-interlaced detected //0x98); 
	
	/* Decoder Brightness(Lumin), Contrast(Lumin), Saturation(Chromin) & Hue(Chromin) */
	SetRegister(0x0a,dBrightness);
	SetRegister(0x0b,dContrast);
	SetRegister(0x0c,dSat);
	SetRegister(0x0d,dHue);
	
	SetRegister(0x11,0x00);
	SetRegister(0x12,0x00);
	SetRegister(0x13,0x00);
	SetRegister(0x14,0x00);
	SetRegister(0x15,0x11);
	SetRegister(0x16,0xfe);
	SetRegister(0x17,0xc0);
	SetRegister(0x18,0x40);
	SetRegister(0x19,0x80);
	SetRegister(0x23,0x00);
	SetRegister(0x24,0x90);
	SetRegister(0x25,0x90);
	SetRegister(0x29,0x00);
	
	/* Component Brightness(Lumin), Contrast(Lunin) & Satutration(Chromin) */
	SetRegister(0x2a,cBrightness);
	SetRegister(0x2b,cContrast);
	SetRegister(0x2c,cSat);
	
	SetRegister(0x2d,0x00);
	SetRegister(0x2e,0x00);
	SetRegister(0x2f,0x00);
	
	//0x30-0x3A = default
	SetRegister(0x40,0x22);
	for (i=0x41; i<=0x57; i++)
	{
		SetRegister(i,0xff);
	}
	
	SetRegister(0x58,0x00);
	SetRegister(0x59,0x00);
	SetRegister(0x5a,0x07);
	SetRegister(0x5b,0x00);
	SetRegister(0x5c,0x00);
	SetRegister(0x5d,0x00);
	SetRegister(0x5e,0x00);
	SetRegister(0x5f,0x00);
	
	// 2
	// stop the scaler
	SetRegister(0x88,0x00);
	SetRegister(0x83,0x00); // Xport Output Disable (i.e. Enable Input)
	
	SetRegister(0x84,0x00);
	SetRegister(0x85,0x00);
	SetRegister(0x86,0x40);
	SetRegister(0x87,0x01);
	
	SetRegister(0x90,0x00);
	
	SetRegister(0x93,0x80);
	
	/* Acquisition Window Settings */
	SetRegister(0x94,0x00); // horizontal input offset, min >= 2
	SetRegister(0x95,0x00);
	SetRegister(0x96,0xd0); // horizontal input window length = 720
	SetRegister(0x97,0x02);
	
	SetRegister(0x9c,0xd0); // horizontal output window length = 720
	SetRegister(0x9d,0x02);
	//SetRegister(0x9e,0xe0);//V=480 //ha e0
	//SetRegister(0x9f,0x1); //ha 1
	
	
	/* Scaler Settings */
	SetRegister(0xa0,0x1); // hori prescaling
	SetRegister(0xa1,0x00);
	SetRegister(0xa2,0x00);
	SetRegister(0xa4,ABrightness);//0x80);//Register A Brightness(Lumin)
	SetRegister(0xa5,AContrast);//0x40);//Register A Contrast(Lumin)
	SetRegister(0xa6,ASat);//0x40);//Register A Saturation(Chromin)
	SetRegister(0xa8,0x00);
	SetRegister(0xa9,0x04);
	SetRegister(0xaa,0x20);
	SetRegister(0xac,0x00);
	SetRegister(0xad,0x02);
	SetRegister(0xae,0x00);
	SetRegister(0xb0,0x00);
	SetRegister(0xb1,0x04);
	SetRegister(0xb2,0x00);
	SetRegister(0xb3,0x04);
	SetRegister(0xb4,0x00);
	
	//SetRegister(0xaa,horizontalLumaPhaseOffset);
	//SetRegister(0xae,horizontalChromaPhaseOffset);
	SetRegister(0xb8,0x00);
	SetRegister(0xbc,0x00);
	
	//SetRegister(0x0E, 137); Problem! can't set D7 here, but only in PMSDeluxeInputSelect()

}

void SAA7118::SetFormat(VideoFormat v)
{
	vf = v;
	SetConnector(conn);
}

condesc_t SAA7118::SetConnector(VideoConnector c)
{
	// Store connector
	conn = c;
	
	switch(conn)
	{
	case VideoConComponent0:	// PMS_COMPONENT:
		SetRegister(0x02, 0xe0);
		break;
	case VideoConSVideo0:		// PMS_SVIDEO:
		SetRegister(0x02, 0xcc);
		break;
	case VideoConSVideo1:		// PMS_SVIDEO2:
		SetRegister(0x02, 0xcd);
		break;
	case VideoConComposite0:	// PMS_COMPOSITE1:
		SetRegister(0x02, 0xd2);
		break;
	case VideoConComposite1:	// PMS_COMPOSITE2:
		SetRegister(0x02, 0xc2);
		break;
	case VideoConComposite2:	// PMS_COMPOSITE3:
		SetRegister(0x02, 0xd0);
		break;
	case VideoConComposite3:	// PMS_COMPOSITE_SV_1:
		SetRegister(0x02, 0xce);
		break;
	case VideoConComposite4:	// PMS_COMPOSITE_SV_2:
		SetRegister(0x02, 0xc4);
		break;
	case VideoConComposite5:	// PMS_COMPOSITE_SV_3:
		SetRegister(0x02, 0xcf);
		break;
	case VideoConComposite6:	// PMS_COMPOSITE_SV_4:
		SetRegister(0x02, 0xc5);
		break;
	case VideoConRGB0:			// PMS_RGBS:
		SetRegister(0x02, 0xf0);
		break;
	}
	
	
	BYTE ChrominanceControl(0x81);
	BYTE ChrominanceControl2(0x00);
	BYTE ChrominanceGainControl(0x2A);
	BYTE LuminanceControl;
	
	// get existing sharpness and set luma comb filter
	LuminanceControl = (GetRegister(0x09) & 0x0F) | 0x40;
	
	if( vf == VFormat_PAL_BDGHI || 
		vf == VFormat_PAL_N || 
		vf == VFormat_SECAM || 
		vf == VFormat_PAL_N_COMB ||
		vf == VFormat_NTSC_50) {
		
		// 576 lines
		SetRegister(0x08, 0x28);
		SetRegister(0x5A, 0x03);
		SetRegister(0x5B, 0x00);
		
		SetRegister(0x98,0x0d); // vertical input offset
		SetRegister(0x99,0x00);
		
		SetRegister(0x9A, 0x38);
		SetRegister(0x9B, 0x01);
		SetRegister(0x9E, 0x40-2);
		SetRegister(0x9F, 0x02);
	}
	else
	{
		SetRegister(0x08, 0x68);
		SetRegister(0x5A, 0x06);
		SetRegister(0x5B, 0x83);
		
		SetRegister(0x98,0x0a); // vertical input offset
		SetRegister(0x99,0x00);
		
		SetRegister(0x9A, 0x06);
		SetRegister(0x9B, 0x01);
		SetRegister(0x9E, 0xE0 - 2);
		SetRegister(0x9F, 0x01);
	}
	
	if(conn == VideoConPDI0 /* PMS_XPORT*/ ) {
		SetRegister(0x80, 0x11);
		SetRegister(0x91, 0x18);
		SetRegister(0x92, 0x19);
	}
	else
	{
		SetRegister(0x80, 0x10);
		SetRegister(0x91, 0x08);
		SetRegister(0x92, 0x10);
	}
	
	
	switch(conn)
	{
	case VideoConComponent0:	// PMS_COMPONENT:
	case VideoConRGB0:			// PMS_RGBS:
	case VideoConPDI0:			// PMS_XPORT:
	case VideoConSDI0:			// PMS_SDI:
		// doesn't really matter for these inputs
		// but we'll set the default
		ChrominanceControl = 0x89;
		SetRegister(0x29, 0x40);
		break;
	case VideoConSVideo0:		// PMS_SVIDEO:
	case VideoConSVideo1:		// PMS_SVIDEO2:
	case VideoConComposite0:	// PMS_COMPOSITE1:
	case VideoConComposite1:	// PMS_COMPOSITE2:
	case VideoConComposite2:	// PMS_COMPOSITE3:
	case VideoConComposite3:	// PMS_COMPOSITE_SV_1: // Composite over S-Video
	case VideoConComposite4:	// PMS_COMPOSITE_SV_2: // Composite over S-Video
	case VideoConComposite5:	// PMS_COMPOSITE_SV_3: // Composite over S-Video
	case VideoConComposite6:	// PMS_COMPOSITE_SV_4: // Composite over S-Video
		SetRegister(0x29, 0x00);
		switch(vf)
		{
		case VFormat_PAL_M:
			ChrominanceControl |= 3 << 4;
			ChrominanceControl2 = 0x06;
			break;
		case VFormat_PAL_60:
			ChrominanceControl |= 1 << 4;
			ChrominanceControl2 = 0x06;
			break;
		case VFormat_NTSC_50:
			ChrominanceControl |= 1 << 4;
			ChrominanceControl |= 1 << 3;
			ChrominanceControl2 = 0x0E;
			break;
		case VFormat_PAL_N_COMB:
			ChrominanceControl |= 2 << 4;
			ChrominanceControl2 = 0x06;
			break;
		case VFormat_SECAM:
			ChrominanceControl = 0xD0;
			ChrominanceControl2 = 0x00;
			ChrominanceGainControl = 0x80;
			LuminanceControl = 0x1B;
			break;
		case VFormat_NTSC_J:
			ChrominanceControl |= 4 << 4;
			ChrominanceControl |= 1 << 3;
			ChrominanceControl2 = 0x0E;
			break;
		case VFormat_PAL_BDGHI:
			ChrominanceControl |= 0 << 4;
			ChrominanceControl2 = 0x06;
			break;
		case VFormat_NTSC:
		default:
			ChrominanceControl |= 0 << 4;
			ChrominanceControl |= 1 << 3;
			ChrominanceControl2 = 0x0E;
			break;
		}
		break;
	}
	
	if(conn == VideoConSVideo0 || conn == VideoConSVideo1 
		/*nInput == PMS_SVIDEO || nInput == PMS_SVIDEO2*/)
	{
		LuminanceControl |= 0x80;
	}
	
	SetRegister(0x09, LuminanceControl);
	SetRegister(0x0E, ChrominanceControl);
	SetRegister(0x0F, ChrominanceGainControl);
	SetRegister(0x10, ChrominanceControl2);
	
	// reset the scaler
	SetRegister(0x88,0x00);
	SetRegister(0x88,0x20);
	
	return CONDESC(0,0,1); // Always digital in
}


⌨️ 快捷键说明

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