📄 saa7118.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 + -