measure.c
来自「车载DVD osdIC TW8816原厂代码」· C语言 代码 · 共 1,877 行 · 第 1/4 页
C
1,877 行
#ifdef DEBUG_PC
dPrintf("\r\n=========== PC SVGA ================: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
//InputSource = PC_SVGA;
switch( ivf ) {
case 49: case 50: case 51: _PcMode = EE_RGB_576P; break;
case 55: case 56: case 57: _PcMode = EE_SVGA_56; break;
case 59: case 60: case 61: case 62: case 63: case 64:
_PcMode = EE_SVGA_60; break;
case 69: case 70: case 71: _PcMode = EE_SVGA_70; break;
case 72: case 73: _PcMode = EE_SVGA_72; break;
case 74: case 75: case 76: _PcMode = EE_SVGA_75; break;
case 83:
case 84: case 85: case 86: _PcMode = EE_SVGA_85; break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
//====================== DTV 720P ==============================
else if(vpn>=751-20 && vpn<=751+30) {
#ifdef DEBUG_PC
dPrintf("\r\n============== DTV 720P ============: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
if( ivf>=55 ) {
_PcMode = EE_RGB_720P;
}
else {
_PcMode = EE_RGB_720P50;
}
}
//====================== DTV 1080i =============================
else if(vpn>=563-10 && vpn<=563+10) {
#ifdef DEBUG_PC
dPrintf("\r\n============ DTV 1080i =============: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
if( ivf>=55 ) {
_PcMode = EE_RGB_1080I;
}
else {
_PcMode = EE_RGB_1080I50A;
}
}
//====================== DTV 480i ==============================
else if(vpn>=264-40 && vpn<=264+35) {
#ifdef DEBUG_PC
dPrintf("\r\n=========== DTV 480i ===============: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
_PcMode = EE_RGB_480I;
}
//====================== DTV 576i ==============================
else if(vpn>=314-14 && vpn<=314+50) {
#ifdef DEBUG_PC
dPrintf("\r\n============ DTV 576i ==============: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
_PcMode = EE_RGB_576I;
}
//====================== PC XGA ================================
else if( vpn>=790 && vpn<=820 ) {
#ifdef DEBUG_PC
dPrintf("\r\n============ PC XGA ===============: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
//InputSource = PC_XGA;
switch( ivf ) {
case 59: case 60: case 61: _PcMode = EE_XGA_60; break;
case 69: case 70: case 71: _PcMode = EE_XGA_70; break;
case 72: case 73: _PcMode = EE_XGA_72; break;
case 74: case 75: case 76: _PcMode = EE_XGA_75; break;
case 84: case 85: case 86: _PcMode = EE_XGA_85; break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
//====================== PC 1152x864 ===========================
else if( vpn>=850 && vpn<=1000 ) {
#ifdef DEBUG_PC
dPrintf("\r\n============ PC 1152x864 =========: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
//InputSource = PC_SXGA;
switch( ivf ) {
case 59: case 60: case 61: _PcMode = EE_1152_60; break;
case 69: case 70: case 71: _PcMode = EE_1152_70; break;
case 74: case 75: case 76: _PcMode = EE_1152_75; break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
//====================== PC SXGA ===============================
else if( vpn>=1024 && vpn<=1600 ) {
#ifdef DEBUG_PC
dPrintf("\r\n============ PC SXGA =========: vpn:%4d, ivf:%4d", (WORD)vpn, (WORD)ivf);
#endif
//InputSource = PC_SXGA;
switch( ivf ) {
case 59: case 60: case 61: _PcMode = EE_SXGA_60; break;
case 69: case 70: case 71: _PcMode = EE_SXGA_70; break;
case 74: case 75: case 76: _PcMode = EE_SXGA_75; break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
#ifdef DEBUG_PC
if( _PcMode == EE_PC_UNKNOWN )
dPrintf("\r\nUnknown Input-- VPN:%d IVF:%d", vpn, ivf);
else
dPrintf("\r\nInput VPN(%d) IVF(%d) :%d(%s)", vpn, ivf, (WORD)_PcMode, PcModeStr[_PcMode] );
#endif
if( !PCMDATA[_PcMode].Support ) _PcMode = EE_PC_UNKNOWN;
return _PcMode;
}
WORD ConvertBasedOnInput(WORD dat)
{
DWORD dtmp;
if( IsBypassmode() ) return dat; // HHY 2.01
dtmp = PCMDATA[PcMode].PPF*100000L/dat; // from PPF-based to IPF-based
dtmp = PCMDATA[PcMode].IPF*100000L/dtmp; // NewHPN = OldHPN * (IPF/PPF)
return (WORD)dtmp;
}
//=============================================================================
// Search ADC Clock with measuring Phase
//=============================================================================
#ifdef AUTO_TUNE_CLOCK
WORD AutoTuneClock(void)
{
WORD low, high; // Test value range of plldiv
WORD i;
// BYTE phase, phasepeak, j;
WORD num, width;
#ifdef DEBUG_PC
dPrintf("\r\n---Tune-Coarse Mode=%d", (WORD)PcMode);
#endif
//------ Set Test Range, Divide Range more detail
low = 10;
high = ConvertBasedOnInput( GetHPN() );
SetMeasureWindowH(low, high); //
low = 1;
high = GetVPN() - 1;
SetMeasureWindowV(low, high); //
low = PCMDATA[PcMode].low;
high = PCMDATA[PcMode].high;
#ifdef DEBUG_PC
dPrintf("\r\n===>>>>Get Divider Number=0x%4x to 0x%4x", (WORD)low, (WORD)high);
#endif
MeasureAndWait(3);
width = GetHend() - GetHstart() + 1;
SetCoarse( low );
MeasureAndWait(3);
low = GetHend() - GetHstart() + 1;
SetCoarse( high );
MeasureAndWait(3);
high = GetHend() - GetHstart() + 1;
if(( low > width ) || ( width > high ) ) return 0; // cannot adjustable in setting range...
for(i=PCMDATA[PcMode].low; i <= PCMDATA[PcMode].high; i+=4 ) { // increment by 4
SetCoarse(i);
MeasureAndWait(3);
width = GetHend() - GetHstart() + 1;
if ( width >= PCMDATA[PcMode].HAN ) return (i);
}
return num;
}
#endif
#ifdef AUTOTUNEPHASE
//-----------------------------------------------------------------------------
// Final Set ADC [PLL div], [Phase]
//-----------------------------------------------------------------------------
void AutoTunePhase(void)
{
BYTE i, j, peak_j;
dPuts("\r\n-------------Tune-Fine");
if( IsDTVInput() ) return;
j = GetPhaseCurrent() - 8; //- 0x20;
RGBPeak=0;
for(i=0; i<9; i++, j+=0x02) {
j=j%0x1f;
SetPhase(j); // if NO_INPUT stop
if( !GetPhaseRGB() ) return; //
if(RGBPeak < PhaseRGB) {
RGBPeak = PhaseRGB;
peak_j = j;
dPuts("--peak");
}
else {
dPuts(" ");
}
}
SetPhase(peak_j);
}
#endif
//-----------------------------------------------------------------------------
// Measure VPN, HPN
// Calculate IVF, IHF
//-----------------------------------------------------------------------------
WORD GetHpnVpn(BYTE en)
{
WORD vpn, hpn, sync; //hsync, vsync;
BYTE SyncPol;
en = DebugLevel;
if( !en && DebugLevel ) DebugLevel = 0;
#ifdef DEBUG_PC
dPuts("\r\n------ GetHpnVpn()");
#endif
//----- Measurement Command -------------
if( !MeasureAndWait(3) ) { // field any...
#ifdef DEBUG_PC
dPrintf(" Error at GetHpnVpn ");
#endif
DebugLevel = en;
return 0;
}
//----- Get VPN -------------------------
vpn = GetVPN(); // VPN = V Period Num
sync = GetVSYNCPulse();
// in case of 8816 sync is same to vpn so I cannot use below....
// Polarity check
if( sync > (vpn/3) ) {
InvertVSYNCPolarity();
MeasureAndWait(3);
sync = GetVSYNCPulse();
#ifdef DEBUG_PC
dPrintf(" --->New VSYNC:%04x(%d)", sync, sync);
#endif
}
#ifdef DEBUG_PC
dPrintf("\r\n VPN:%04x(%d) VSYNC:%04x(%d)", vpn, vpn, sync, sync);
dPrintf("\r\n IHF:%08lx(%ld)", IHF, IHF);
#endif
//----- Get HPN ---------------------
hpn = GetHPN(); // HPN = H Period Num
sync = GetHSYNCPulse(); // H sync Pulse Width = HSYNC interval
#ifdef DEBUG_PC
dPrintf("\r\n HPN:%04x(%d) HSYNC:%04x(%d)", hpn, hpn, sync, sync);
dPrintf("\r\n PPF:%08lx(%ld)", GetPPF(), GetPPF() );
#endif
if( sync >= (hpn/3) ) {
SyncPol = ReadDecoder(0x40); // INVERT SYNC POLARITY
if ( SyncPol & 0x04 ) // b'2 is HSYNC POL
SyncPol &= 0xfb;
else SyncPol |= 0x04;
WriteDecoder(0x40, SyncPol);
MeasureAndWait(3);
sync = GetHSYNCPulse(); // H sync Pulse Width = HSYNC interval
hpn = GetHPN(); // HPN = H Period Num
}
//----- Get New HPN -------------
IHF = (GetPPF()+hpn/2) / hpn; // IHF = PPF / HPN
//----- Get New VPN -------------
vpn = GetVPN();
IVF = (WORD)((IHF+vpn/2)/vpn); // IVF = IHF / VPN
#ifdef DEBUG_PC
dPrintf("\r\nIHF(New):%08lx(%ld)", IHF, IHF);
dPrintf("\r\nHPN(New):%04x(%d) HSYNC(New):%04x(%d)", hpn, hpn, sync, sync);
dPrintf("\r\nVPN(New):%04x(%d)", vpn, vpn);
dPrintf("\r\nIVF(New):%04x(%d)", IVF, IVF);
dPuts("\r\n-------");
#endif
DebugLevel = en;
return vpn;
}
//=============================================================================
// Return V active Start
//=============================================================================
WORD GetVerticalActiveArea(void)
{
WORD vstart, vstart1, vend;
char off=0;
dPuts("\r\n----- Get V Active Area");
//----- if current mode is DTV, use default value----------------
//#ifdef SUPPORT_DTV
if( IsDTVInput() ) {
#ifdef DEBUG_DTV
dPrintf(" ---> Use fixed data Vstart=%d VAN=%d", PCMDATA[PcMode].Vstart, PCMDATA[PcMode].VAN);
#endif
SetVactiveStart( PCMDATA[PcMode].Vstart );
switch (PcMode) {
case EE_YPbPr_480I: off = 4; break;
case EE_YPbPr_1080I: off = 2; break;
case EE_RGB_1080I: off = 4; break;
default: off = 0; break;
}
SetVactiveLen( PCMDATA[PcMode].VAN+off+20 );
return PCMDATA[PcMode].Vstart;
}
//#endif
//======================== Get the Bottom End ========================
vend = GetVend();
if( vend >= GetVPN() ) {
#ifdef DEBUG_PC
dPrintf("\r\nToo big vend [%04x]", vend);
#endif
vend = GetVPN()-1;
}
vstart = vend - PCMDATA[PcMode].VAN + 1;
vstart1 = GetVstart();
// vstart = GetVstart();
#ifdef DEBUG_PC
dPrintf("\r\nFind Vend --- %04x %04x", vstart, vend);
#endif
//================================================= HHY 2.00
if( PcMode >= EE_1152_60 && PcMode <=EE_1152_75 ) {
if( vstart1 > vstart && vstart1 <= vstart+3 ) {
vstart = vstart1;
vend = vstart + PCMDATA[PcMode].VAN - 1;
#ifdef DEBUG_PC
dPuts(" -------> Use Vstart");
#endif
}
}
//=================================================
#ifdef DEBUG_PC
dPrintf("\r\nAuto Measure Vstart=%04x(%d) Vend=%04x(%d)", vstart, vstart, vend, vend);
#endif
if( (vstart > PCMDATA[PcMode].Vstart + 30) || ((int)vstart < ((int)PCMDATA[PcMode].Vstart - 30) ) ) {
#ifdef DEBUG_PC
ePrintf(" ==> Out Of Range V Active");
#endif
vstart = GetVactiveStartEE(PcMode);
vend = vstart + PCMDATA[PcMode].VAN - 1;
}
//----- Compensation mode by mode -------------------------------
#ifdef VGA
if( PcMode>=EE_VGA_60 || PcMode<=EE_VGA_85 ) {
vstart -= 5;
dPrintf("\r\n ----------- VGA Bypass !!!");
}
#endif
if( PcMode==EE_SP2 ) vstart = PCMDATA[EE_SP2].Vstart; // HHY 1.62 640x350
//----- set the register values ( Vstart, VAN ) -----------------
SetVactiveStart(vstart);
SetVactiveLen(PCMDATA[PcMode].VAN); // with VAN
#ifdef DEBUG_PC
ePrintf("\r\n@@@@@ Vstart=%04x[%d] Vend=%04x[%d]", vstart, vstart, vend, vend);
#endif
return vstart;
}
//=============================================================================
//
//=============================================================================
BYTE GetHorizontalActiveArea(void)
{
WORD hstart, hend;
dPuts("\r\n----- Get H Active Area ");
#ifdef SUPPORT_DTV
if( IsDTVInput() ) {
hstart = PCMDATA[PcMode].Hstart;
hend = hstart + PCMDATA[PcMode].HAN + 1;
#ifdef DEBUG_PC
dPrintf(" ---> Use fixed data Hstart=%d HAN=%d Hend=%d", hstart, PCMDATA[PcMode].HAN, hend);
#endif
SetHactiveStart( hstart );
SetHactiveEnd( hend+3 ); // with HAN, Hstart
return TRUE;
}
#endif
//======================== Get the Right End ========================
hstart = GetHstart();
hend = hstart + PCMDATA[PcMode].HAN + hstart;
#ifdef DEBUG_PC
dPrintf("\r\nAuto Measure Hstart=%04x(%d) Hend=%04x(%d)", hstart, hstart, hend, hend);
#endif
if( (hstart > PCMDATA[PcMode].Hstart + 100) || ((int)hstart < (int)PCMDATA[PcMode].Hstart - 100) ) {
#ifdef DEBUG_PC
ePuts(" ==> Out Of Range H Active");
#endif
hstart = GetHactiveStartEE(PcMode);
hend = hstart + PCMDATA[PcMode].HAN + 1;
SetHactiveStart(hstart); // with Hstart
SetHactiveEnd( hend ); // with HAN, Hstart
return TRUE;
}
//----- Compensation mode by mode -------------------------------
if( PcMode < EE_XGA_60 ) hend++;
if( !IsBypassmode() ) {
hstart -= 3;
hend -= 3;
}
#ifdef XGA
if( PcMode>=EE_1152_60 ) {
hstart+=3;
hend+=3;
}
#endif
#ifdef SXGA
if( PcMode>=EE_1152_60 && PcMode<=EE_1152_75 ) {
hstart+=2;
hend+=2;
}
#endif
//----- set the register values ( Hstart, Hend ) ----------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?