?? measure.c
字號:
#include "Config.h"
//#define DEBUG_PC1
#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
#include "typedefs.h"
#include "main.h"
#include "tw88.h"
#include "measure.h"
#include "adc.h"
#include "i2c.h"
#include "debug.h"
#include "dispinfo.h"
#include "pc_eep.h"
#include "etc_eep.h"
#include "printf.h"
#include "osdmenu.h"
#include "RegMap.h"
#include "panel.h"
//================== Input Measurement ====================================
static PDATA WORD LastVPN=0;
static PDATA DWORD LastIHF=0;
PDATA BYTE VPosMax, VPosCurr, HPosMax, HPosCurr;
PDATA DWORD RGBPeak, PhaseRGB;
#ifdef WIDE_SCREEN
extern PDATA BYTE WideScreenMode;
#endif
CODE BYTE PcModeStr[][15] = {
"720x400 70Hz", // 0
"640x400 80Hz", // 1
"640x350 85Hz", // 2
"720x400 85Hz", // 3
"640x480 60Hz", // 4
"640x480 66Hz", // 5
"640x480 70Hz", // 6
"640x480 72Hz", // 7
"640x480 75Hz", // 8
"640x480 85Hz", // 9
"800x600 56Hz", // 10
"800x600 60Hz", // 11
"800x600 70Hz", // 12
"800x600 72Hz", // 13
"800x600 75Hz", // 14
"800x600 85Hz", // 15
"832x624 75Hz", // 16
"1024x768 60Hz", // 17
"1024x768 70Hz", // 18
"1024x768 72Hz", // 19
"1024x768 75Hz", // 20
"1024x768 85Hz", // 21
"1152x864 60Hz", // 22
"1152x864 70Hz", // 23
"1152x864 75Hz", // 24
"1280x1024 60Hz", // 25
"1280x1024 70Hz", // 26
"1280x1024 75Hz", // 27
"RGB 480p 60Hz", // 28
"RGB 720p 60Hz", // 29
"RGB 720p 50Hz", // 30
"RGB 1080i 60Hz", // 31
"RGB 1080i 50Hz", // 32
"RGB 1080i 50Hz", // 33
"RGB 480i 60Hz", // 34
"RGB 576i 50Hz", // 35
"RGB 576p 50Hz", // 36
"YPbPr 480p", // 37
"YPbPr 720p", // 38
"YPbPr 720p50", // 39
"YPbPr 1080i", // 40
"YPbPr 1080i50", // 41
"YPbPr 1080i50", // 42
"YPbPr 480i", // 43
"YPbPr 576i", // 44
"YPbPr 576p", // 45
""
};
//-------------------------------------------------------------------------
extern CODE struct RegisterInfo UserRange;
extern IDATA WORD IVF;
extern IDATA DWORD IHF;
extern PDATA BYTE DebugLevel;
extern bit Range4Coarse;
extern DATA WORD tm01, tm001;
extern DATA BYTE tic01;
extern DATA WORD tic_pc;
IDATA BYTE PcMode;
#if defined WVGA || defined WSVGA || defined WXGA || defined VGA_PRIMEVIEW
bit Flag4Bypass=0; // 0:non-bypass
#else
bit Flag4Bypass=0;//1; // 1:bypass
#endif
//-----------------------------------------------------------------------------
extern CODE struct _PCMDATA PCMDATA[];
extern CODE BYTE *CheckPCCableStr[];
extern CODE BYTE *CheckDTVCableStr[];
extern CODE BYTE *OutOfRangeStr[] ;
//=============================================================================
BYTE Measure_VPN_IHF( WORD *p_vpn, DWORD *p_ihf)
{
DWORD ppf;
WORD hpn;
if( !MeasureAndWait(3) )
{
#ifdef DEBUG_PC
Puts("\r\n ** Error at Get_VPN_IHF");
#endif
return 0;
}
ppf = GetPPF(); //
*p_vpn = GetVPN(); //
hpn = GetHPN(); // HPN = H Period Num
*p_ihf = (ppf + hpn/2) / hpn; // IHF = PPF / HPN
#ifdef DEBUG_PC1
dPrintf("\r\n *** PPF=%ld HPN=%4d", ppf, hpn);
dPrintf(" --> VPN=%4d IHF=%ld ", *p_vpn, *p_ihf);
dPrintf(" IVF=%d", (WORD)((*p_ihf + *p_vpn/2) / *p_vpn) );
dPrintf(" [%d, %ld]", LastVPN, LastIHF);
#endif
return 1;
}
void ResetPCValue(void)
{
SaveDefaultPCDataEE();
if( DetectAndSetForVGAInput(3)==FALSE ) // HHY 1.44 change 1 to 3
CloseOSDMenu();
LCDPowerON(0);
}
void StartNewDetect(void)
{
ClearEnDet();
MeasureAndWait(3);
SetEnDet();
WriteTW88(0xd0, 0xff);
WriteTW88(0xd1, 0xff);
}
WORD gap(WORD a, WORD b)
{
if( a>b ) return a-b;
return b-a;
}
WORD GetCoarseValue(void)
{
return GetCoarse();
}
WORD SetPCCoarseValue(BYTE val) //1:Up 2:Dn
{
WORD coarse;
WriteADC(0xc1, 0x30);
coarse = GetCoarse();
if( val==UP ) coarse++;
else coarse--;
SetCoarse(coarse);
SaveCoarseEE(PcMode); // HHY 1.33
StartNewDetect();
WriteADC(0xc1, 0x20);
return coarse;
}
BYTE GetPhaseValue(void)
{
return (GetPhaseCurrent()>>3);
}
BYTE SetPhaseValue(BYTE val)
{
BYTE phase;
phase = GetPhaseValue();
if( val==UP ) {
if( phase>=31 ) return phase;
else phase++;
}
else {
if( phase==0 ) return phase;
else phase--;
}
SetPhase(phase);
SavePhaseEE(PcMode); // HHY 1.33
return phase;
}
BYTE IsDTVInput(void)
{
if( GetInputSelection()==DTV || GetInputSelection()==PC ) {
if( PcMode>=EE_RGB_480P && PcMode<=EE_YPbPr_576P ) return 1;
}
return 0;
}
IDATA struct RegisterInfo VPositionRange={0,100, 50};
//=============================================================================
// PC Screen Position Move Functions
//=============================================================================
void MoveActiveVpos(BYTE dir) //=== Up
{
char add;
if( dir==UP ) {
if( VPosCurr>=VPosMax ) return;
add = 1;
}
else {
if( VPosCurr==0 ) return;
add = -1;
}
VPosCurr += add;
if( IsBypassmode() ) {
SetVactiveStart( GetVactiveStart()+add );
SaveVactiveEE(PcMode); // HHY 1.33
}
else {
SetVactiveStart( GetVactiveStart()+add );
SaveVactiveEE(PcMode); // HHY 1.33
SetVBackPorch( GetVBackPorch()+add ); // A6
SaveVBackPorchEE(PcMode); // HHY 1.33
}
}
void MoveActiveHpos(BYTE dir) //=== Right
{
char add;
WORD hstart, hend;
if( dir==UP ) {
if( HPosCurr>=HPosMax ) return;
add = 1;
}
else {
if( HPosCurr==0 ) return;
add = -1;
}
HPosCurr += add;
hstart = GetHactiveStart();
hend = GetHactiveEnd();
hstart += add;
hend += add;
SetHactiveStart(hstart);
SetHactiveEnd(hend);
SaveHactiveEE(PcMode); // HHY 1.33
}
BYTE GetVPosition(void)
{
int newv;
VPositionRange.Max = VPosMax;
VPositionRange.Default = VPosMax/2;
Mapping2( VPosCurr, &VPositionRange, &newv, &UserRange );
return newv;
}
BYTE SetVPosition(BYTE val) //0:UP, 1:DOWN
{
int newv;
MoveActiveVpos(val);
VPositionRange.Max = VPosMax;
VPositionRange.Default = VPosMax/2;
Mapping2( VPosCurr, &VPositionRange, &newv, &UserRange );
return newv;
}
BYTE GetHPosition(void)
{
return HPosCurr;
}
BYTE SetHPosition(BYTE val)
{
MoveActiveHpos(val);
return HPosCurr;
}
//=============================================================================
// Phase Measurement
// Return : PhaseBlue, PhaseGreen, PhaseRed
//=============================================================================
DWORD ReadOut4(void)
{
BYTE i;
DWORD dat=0;
for(i=0; i<4; i++) {
dat <<= 8;
dat |= (DWORD)ReadTW88(0x5a-i);
}
return dat;
}
BYTE GetPhaseRGB(void) // HHY 1.10 BYTE return
{
static bit flag=0;
DWORD _RGB;
#ifdef DEBUG_PC
BYTE sign;
#endif
_RGB = PhaseRGB;
if( !MeasureAndWait(3) ) {
#ifdef DEBUG_PC
Puts("\r\n Error at GetPhaseRGB");
#endif
return 0; //LJY001219
}
WriteTW88(0x5b, 0x00); // Read Phase B
PhaseRGB = ReadOut4();
WriteTW88(0x5b, 0x10); // Read Phase G
PhaseRGB += ReadOut4();
WriteTW88(0x5b, 0x20); // Read Phase R
PhaseRGB += ReadOut4();
#ifdef DEBUG_PC
if( PhaseRGB >= _RGB ) sign = '+'; else sign = '-';
dPrintf("(%c%08lx)", (WORD)sign, PhaseRGB);
#endif
if( PhaseRGB==_RGB ) { // NO INPUT ???
dPuts("\r\n??? SYNC loss...");
if(flag) {
flag = 0;
return 0;
}
else flag = 1;
}
else flag = 0;
return 1;
}
//============================================================================
// Detect Input source for DTV
//============================================================================
BYTE DetectDTVInputSource(void)
{
BYTE mode, _PcMode;
mode = ReadADC(0xC2)>>1 ;
#ifdef DEBUG_PC
Printf("\n +++DetectDTVInputSource==> Detect from ADC : 0x%2x", (WORD)mode);
#endif
if( GetInputSelection()==PC ) {
switch(mode)
{
case 1: _PcMode = EE_RGB_480I; break;
case 2: _PcMode = EE_RGB_576I; break;
case 3: _PcMode = EE_RGB_480P; break;
case 4: _PcMode = EE_RGB_576P; break;
case 5: _PcMode = EE_RGB_720P; break;
default:_PcMode = EE_PC_UNKNOWN; break;
}
}
else {
switch(mode)
{
case 1: _PcMode = EE_YPbPr_480I; break;
case 2: _PcMode = EE_YPbPr_576I; break;
case 3: _PcMode = EE_YPbPr_480P; break;
case 4: _PcMode = EE_YPbPr_576P; break;
case 5: _PcMode = EE_YPbPr_720P; break;
default:_PcMode = EE_PC_UNKNOWN; break;
}
}
return _PcMode;
}
//============================================================================
// Determine InputSource Format based on VPN
//============================================================================
// Input VPN
// Return PcMode
// InputSource (PC_XGA, PC_SVGA, PC_VGA)
BYTE DecideVGAInputSource(WORD vpn, WORD ivf)
{
BYTE _PcMode;
WORD sync;
_PcMode = EE_PC_UNKNOWN;
//InputSource = UNKNOWN;
_PcMode = DetectDTVInputSource();
if(_PcMode != EE_PC_UNKNOWN ) return _PcMode;
//====================== PC DOS ================================
if( vpn >= 440 && vpn <= 460 ) {
//InputSource = PC_DOS1;
switch( ivf ) {
case 69: case 70: case 71: _PcMode = EE_DOS; break;
case 84: case 85: case 86: case 87:
GetHpnVpn(1);
if( ReadTW88(0x40) & 0x02 )
_PcMode = EE_SP1;
else
_PcMode = EE_SP2;
break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
//====================== PC VGA, DTV 480P ======================
else if( vpn>=490 && vpn<=540 ) {
//------ DTV YPbPr 480P ------
if( GetInputSelection()==DTV ) {
_PcMode = EE_YPbPr_480P;
}
//------ PC VGA --------------
else {
switch( ivf ) {
case 59: case 60: case 61:
//#ifdef SUPPORT_DTV
MeasureAndWait(3);
sync = GetVSYNCPulse();
if(sync > 5) _PcMode = EE_RGB_480P;
else
//#endif
_PcMode = EE_VGA_60;
break;
case 65: case 66: case 67: _PcMode = EE_VGA_66; break;
case 69: case 70: case 71: _PcMode = EE_VGA_70; break;
case 72: case 73: _PcMode = EE_VGA_72; break;
case 74: case 75: case 76: _PcMode = EE_VGA_75; break;
case 83:
case 84: case 85: case 86: _PcMode = EE_VGA_85; break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
}
//====================== PC SVGA ===============================
else if( vpn>=610 && vpn<=680+30 ) {
//InputSource = PC_SVGA;
switch( ivf ) {
case 49: case 50: case 51:
if( GetInputSelection()==PC ) _PcMode = EE_RGB_576P;
else _PcMode = EE_YPbPr_576P;
break;
case 55: case 56: case 57: _PcMode = EE_SVGA_56; break;
case 59: case 60: case 61: _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:
if( vpn>=650 ) _PcMode = EE_832_75;
else _PcMode = EE_SVGA_75;
break;
case 83:
case 84: case 85: case 86: _PcMode = EE_SVGA_85; break;
default: _PcMode = EE_PC_UNKNOWN; break;
}
}
//#ifdef SUPPORT_DTV
//====================== DTV 720P ==============================
else if(vpn>=751-20 && vpn<=751+30) {
if( ivf>=55 ) {
if( GetInputSelection()==PC ) _PcMode = EE_RGB_720P;
else _PcMode = EE_YPbPr_720P;
}
else {
if( GetInputSelection()==PC ) _PcMode = EE_RGB_720P50;
else _PcMode = EE_YPbPr_720P50;
}
}
//====================== DTV 1080i =============================
else if(vpn>=563-10 && vpn<=563+10) {
if( ivf>=55 ) {
if( GetInputSelection()==PC ) _PcMode = EE_RGB_1080I;
else _PcMode = EE_YPbPr_1080I;
}
else {
if( GetInputSelection()==PC ) _PcMode = EE_RGB_1080I50A;
else _PcMode = EE_YPbPr_1080I50A;
}
}
//====================== DTV 480i ==============================
else if(vpn>=264-40 && vpn<=264+35) {
if( GetInputSelection()==PC ) _PcMode = EE_RGB_480I;
else _PcMode = EE_YPbPr_480I;
}
//====================== DTV 576i ==============================
else if(vpn>=314-14 && vpn<=314+50) {
if( GetInputSelection()==PC ) _PcMode = EE_RGB_576I;
else _PcMode = EE_YPbPr_576I;
}
//#endif // SUPPORT_DTV
//====================== PC XGA ================================
else if( vpn>=790 && vpn<=820 ) {
//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 ) {
//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 ) {
//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 )
ePrintf("\r\nUnknown Input:%d IVF:%d", vpn, ivf);
else
ePrintf("\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
//=============================================================================
WORD AutoTuneClock(void)
{
WORD low, high; // Test value range of plldiv
WORD i;
BYTE phase, phasepeak, j;
WORD num;
#ifdef DEBUG_PC3
dPrintf("\r\n---Tune-Coarse Mode=%d", (WORD)PcMode);
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -