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 + -
显示快捷键?