measure.c
来自「车载DVD osdIC TW8816原厂代码」· C语言 代码 · 共 1,877 行 · 第 1/4 页
C
1,877 行
SetHactiveStart(hstart); // with Hstart
SetHactiveEnd( hend ); // with HAN, Hstart
#ifdef DEBUG_PC
ePrintf("\r\n@@@@@ Hstart=%04x[%d] Hend=%04x[%d]", hstart, hstart, hend, hend);
#endif
return TRUE;
}
//-----------------------------------------------------------------------------
// Calcurate and Save VOback(0xb9) & PVP(0xb7,0xbb)
// - Refer to additional document
//-----------------------------------------------------------------------------
void SetVValueForPanel(WORD VIstart)
{
WORD PVR, VAN, VScale, VIsync;
BYTE VOsync, VOback;
VIstart = VIstart;
VIsync = VIstart; // active pulse width
PVR = GetPVR();
VAN = PCMDATA[PcMode].VAN;
VOsync = ReadTW88(0xb8);
// dtmp = VIstart + 3 - VIsync - 1;
// dtmp = VIstart + 3;
// dtmp = (dtmp * PVR * 10) / VAN; // +5 means round-up.
VScale = ReadTW88(0x63) & 0x0c;
VScale <<= 6;
VScale += ReadTW88(0x62); // read VScale
// VIsync--;
VIsync <<= 8; // multiply by 256
// VIsync += 128;
VIsync /= VScale; // divide by scale, calculate
VOback = VIsync - VOsync - 1;
#ifdef DEBUG_PC
dPrintf("\r\n************************");
dPrintf("\r\nVScale=%d VIsync=%d PVR=%d VAN=%d ", (WORD)VScale, (WORD)VIsync, (WORD)PVR, (WORD)VAN);
dPrintf("\r\nVIstart=%d VIsync=%d PVR=%d VAN=%d ", (WORD)VIstart, (WORD)VIsync, (WORD)PVR, (WORD)VAN);
dPrintf("VOsync=%d", (WORD)VOsync);
dPrintf("==> VOback=%02bx(%bd)", VOback, VOback);
dPrintf("\r\n************************");
#endif // DEBUG_PC
/*
//----- Compensation mode by mode -------------------------------
#ifdef XGA
if ( PcMode==EE_DOS ) VOback -= 2; // HHY 3.00
else if( PcMode==EE_SP1 ) VOback -= 2; // HHY 3.00
#endif
#if defined VGA || defined WVGA
if ( PcMode==EE_DOS ) VOback += 1;
else if( (PcMode>=EE_SVGA_56) && (PcMode<=EE_SVGA_85) ) VOback += 1;
#endif
*/
//-----------------------------------------------------------
#ifdef WQVGA
SetVBackPorch(PanelData.VBackporch);
SetPVP(PanelData.VPeriod);
#else
SetVBackPorch( (BYTE)VOback );
SetPVP(VOsync + VOback + PVR + 10);
#endif
}
//-----------------------------------------------------------------------------
// Calcurate [Panel H. Cycle] = PHP(Panel H Period)
//-----------------------------------------------------------------------------
#ifndef AUTOCALC_PC
BYTE SetHValueForPanel(void)
{
WORD sum=0;
WORD php;
sum = ReadTW88(0xb3) + ReadTW88(0xb4) + GetPHR(); // sum = AA+AB+AC,AD = From Hsync to Active region
MeasureAndWait(3);
php = (DWORD)(GetHPN()) * PCMDATA[PcMode].VAN / GetPVR(); // PHP = HPN * (VAN/PVR)
#ifdef DEBUG_PC
dPrintf("\r\nHPN:%04x(%d)", GetHPN(), GetHPN());
dPrintf("\r\nVAN:%04x(%d)", PCMDATA[PcMode].VAN, PCMDATA[PcMode].VAN);
dPrintf("\r\nPVR:%04x(%d)", GetPVR(), GetPVR());
dPrintf("\r\nPanel H. Cycle:%04x(%d), aa+ab+ac:%04x(%d)", php, php, sum, sum);
#endif
if( php <= sum ) {
ePuts("--not enough");
#ifdef DEBUG_PC
return FALSE;
#endif
}
//=================================
#ifdef SXGA
switch( PcMode ) {
case EE_RGB_576I: case EE_YPbPr_576I: php = 0x70f; break;
case EE_RGB_720P: case EE_YPbPr_720P: php = 0x623; break;
case EE_RGB_1080I: case EE_YPbPr_1080I: php = 0x618; break;
case EE_RGB_1080I50A: case EE_YPbPr_1080I50A: php -= 6; break;
}
#endif
//=================================
//------ Set PHP ----------
SetPHP(php);
return TRUE;
}
#else
BYTE SetHValueForPanel(void)
{
return TRUE;
}
#endif
//-----------------------------------------------------------------------------
// VAN = V Active Number
// HAN = H active Number
//-----------------------------------------------------------------------------
BYTE GetActiveRegion(void)
{
WORD vstart;
DWORD pres, scale;
DWORD ppf;
WORD period, sync;
//----- Set Measurement Wondow Size -----
SetMeasureWindowV(1, 0x400);
MeasureAndWait(3);
// Set H window
if( (PCMDATA[PcMode].VAN != GetPVR()) || !Flag4Bypass ) { // --- Change hpulse & hpn ---
period = ConvertBasedOnInput( GetHPN() );
sync = ConvertBasedOnInput( GetHSYNCPulse() );
}
else {
period = GetCoarse();
sync = GetHSYNCPulse();
}
SetMeasureWindowH(sync, period);
// Set V window
period = GetVPN();
sync = GetVSYNCPulse();
SetMeasureWindowV(1, period);
//----- Do Measurement ---------------------------
MeasureAndWait(3);
//----- Get VAN = Vertical Active Area -----------
vstart = GetVerticalActiveArea(); // Measure Input Vstart, Vactive
SetMeasureWindowV(1, period); // HHY 1.61 for stable h sync region
//----- Calculate Y-scale Factor, and save -------
#if (defined WIDE_SCREEN)
Set4WideScreen(GetWideModeEE());
#else
{ //NORNAL SCREEN
pres = (DWORD)PVR_;
scale = (PCMDATA[PcMode].VAN * 0x10000L) / pres;
#ifdef DEBUG_PC
dPrintf("\r\n VAN=%04x PVR=%04x", PCMDATA[PcMode].VAN, pres);
dPrintf("\r\nYscaleFactor:%04x(%d)", scale, scale);
#endif
#ifndef WXGA
if( scale==0x10000 && Flag4Bypass ) { // Bypass
BypassZoom();
}
else
#endif
{
Clear_bypass();
YScale2(scale); // save V Scale Up Factor
}
} // WIDE
#endif
vstart = GetVactiveStart();
SetVValueForPanel(vstart); // with VAN, Vstart
//----- Calcurate Panel H. Cycle(A9,AD) ----------
ppf = GetPPF();
/****/
#if 0 // Hans
#ifdef DEBUG_PC
while( !SetHValueForPanel() ) { // we need to use higher PPF
ppf += 2700000;
if( ppf > MAX_PPF ) {
ePuts("\r\n\n--------------Too big IPF\r\n");
return FALSE;
}
ChangeInternPLL(ppf); // internal PLL
#ifdef DEBUG_PC
dPrintf("--> Increased PPF:%8ld", ppf);
#endif
delay(10);
}
#endif
#endif
/****/
//----- Get HAN = Horizontal Active Area ---------
GetHorizontalActiveArea();
if( (PCMDATA[PcMode].VAN != GetPVR()) || !Flag4Bypass) { // non-bypass
pres = (DWORD)GetPHR();
scale = (PCMDATA[PcMode].HAN * 0x10000L ) / pres; // 256*han/phr
#ifdef DEBUG_PC
dPrintf("\r\nXscaleFactor:%04x(%d)", scale, scale);
#endif
//#if (defined SXGA) || (defined WXGA) || (defined WSGA)
if( PCMDATA[PcMode].HAN > 1024 ) {//1100
scale = (PCMDATA[PcMode].HAN * 0x80L ) / 1024 + 1; // (HAN/1024)*256
XscaleD(scale);
#ifdef DEBUG_PC
dPrintf("\r\nXscaleFactorD:%04x(%d)", scale, scale);
#endif
scale = (1024 * 0x10000L ) / 1280; // (1024/PHR)*256
XscaleU(scale);
#ifdef DEBUG_PC
dPrintf("\r\nXscaleFactorU:%04x(%d)", scale, scale);
#endif
}
else
//#endif
{
#ifdef WIDE_SCREEN
if(WideScreenMode == WIDESCREEN_WIDE)
#endif // WIDE_SCREEN
XScale2(scale);
}
}
SavePCDataEE(PcMode);
return TRUE;
}
/*===========================================================================*/
/* Display The Result for Debugging */
/*===========================================================================*/
void DisplayResultAndSetActiveRange(void)
{
BYTE cRang;
//------- Display the Result ---------------------
#ifdef DEBUG_PC
dPuts ("\r\n-------------------------------------------");
dPrintf("\r\n Resolution = %d x %d (%s)", PCMDATA[PcMode].HAN, PCMDATA[PcMode].VAN, PcModeStr[PcMode]);
dPrintf("\r\n IVF(Refresh) = (%d)", IVF);
dPrintf("\r\n IHF = %08lx (%ld)", IHF, IHF);
dPuts ("\r\n-------------------------------------------");
#endif
//----- calculate H Pos Range
HPosCurr = GetHactiveStart();
cRang = PCMDATA[PcMode].HAN / 20;
HPosMax = PCMDATA[PcMode].Hstart + cRang;
#ifdef DEBUG_PC
dPrintf("\r\n HPosCurr = %d, HPosMax = %d, HRang = %d ", (WORD)HPosCurr, (WORD)HPosMax, (WORD)cRang);
#endif
//----- calculate V Pos Range
VPosCurr = GetVactiveStart();
cRang = PCMDATA[PcMode].VAN / 40;
VPosMax = PCMDATA[PcMode].Vstart + cRang;
#ifdef DEBUG_PC
dPrintf("\r\n VPosCurr = %d, VPosMax = %d, VRang = %d ", (WORD)VPosCurr, (WORD)VPosMax, (WORD)cRang);
#endif
}
/*===========================================================================*/
/* Real Measurement routine */
/*===========================================================================*/
BYTE DoMeasurement(void)
{
/* WORD coarse;
//------------------------ Clock Tuning -------------------------------
#ifdef DEBUG_PAUSE
Pause("coarse = AutoTuneClock()");
#endif
coarse = AutoTuneClock(); // plldiv
if( coarse == 0 ) {
ePuts("\r\nToo big IPF");
MeasureAndWait(3);
return FALSE;
}
*/
//-------------------------- Fine Tuning ------------------------------
#ifdef AUTOTUNEPHASE
AutoTunePhase();
#endif
//-------------------------- Get Active Region ------------------------
if( !GetActiveRegion() ) {
GetPCDataEE(PcMode);
MeasureAndWait(3);
return FALSE;
}
//-------------------------- Display Result ---------------------------
DisplayResultAndSetActiveRange();
return TRUE;
}
//#ifdef SUPPORT_DTV
void RGBModeFieldDetect(BYTE flag)
{
BYTE val;
val = ReadTW88(0x42);
if( flag ) val = val | 0x80;
else val = val & 0x7f;
WriteTW88( 0x42, val);
}
//#endif
/*===========================================================================*/
/* */
/*===========================================================================*/
BYTE SetADCandInputRegisterByMode(BYTE mode)
{
BYTE fielddetect=0, ret;
SetCoarse( PCMDATA[mode].CLOCK );
// ret = SetVCORange(IHF * PCMDATA[mode].CLOCK);
ret = SetVCORange(PCMDATA[mode].IPF * 100000L);
{
switch (mode) {
case EE_RGB_480I:
case EE_RGB_576I:
case EE_RGB_1080I:
case EE_RGB_1080I50A:
fielddetect = 1;
break;
default:
fielddetect = 0;
break;
}
}
RGBModeFieldDetect(fielddetect);
return ret;
}
CODE_P BYTE *GetPCInputSourceName(void)
{
BYTE *ptr;
if( PcMode<EE_PC_MAX ) ptr = PcModeStr[PcMode];
else ptr = (CODE_P BYTE *)"";
#ifdef DEBUG
dPrintf("\r\n++(GetPCInputSourceName)=<%s>", ptr);
#endif
return ptr;
}
BYTE AutoAdjust(void)
{
BYTE ret=0;
ClearOSDInfo();
DisplayAutoAdjust();
SaveDefaultPCDataEE(); // reset position/phase/pll of PC
MeasureSetup();
delay(2);
PcMode = DecideVGAInputSource(GetHpnVpn(1), IVF);
ret = DoMeasurement();
// WriteTW88( 0x44, (ReadTW88(0x44)&0xf3)|0x0c ); // set mode to RGB
ClearAutoAdjust();
LCDPowerON(0); //HHY 1.63
WriteTW88( STATUS0, 0xff );
WriteTW88( STATUS1, 0xff );
return ret;
}
#endif
#ifdef SUPPORT_COMPONENT
// Hans
BYTE DetectComponentInputMode(void)
{
BYTE mode, pcmodetemp;
mode = ((ReadDecoder(CVFMT) & 0x70) >> 4);
ComponentMode = mode;
#ifdef DEBUG
dPrintf("\n\r component Mode: %2x-> %2x (%s)", (WORD)mode, (WORD)mode,COMPONENT_STR[mode]);
#endif
switch (mode)
{
case YPBPR_480i:
pcmodetemp = EE_YPbPr_480I;
break;
case YPBPR_576i:
pcmodetemp = EE_YPbPr_576I;
break;
case YPBPR_480p:
pcmodetemp = EE_YPbPr_480P;
break;
case YPBPR_576p:
pcmodetemp = EE_YPbPr_576P;
break;
case YPBPR_720p:
pcmodetemp = EE_YPbPr_720P;
break;
case YPBPR_1080i:
pcmodetemp = EE_YPbPr_1080I;
break;
default:
pcmodetemp = EE_PC_UNKNOWN;
break;
}
return pcmodetemp;
}
#endif
// Hans
BYTE ModeDetect(void)
{
BYTE i = 0;
#if (defined SUPPORT_PC) || (defined SUPPORT_DTV)
WORD vpn, ivf;
#endif
#ifdef DEBUG
dPrintf("\r\n ModeDetect ==========");
#endif
bPanelMute = 0; // clear panel mute flag
cCounter = 0; // clear monitor
PcMode = EE_PC_NO_SIGNAL; // clear PcMode
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?