?? modehandle.c
字號:
#include "MyDef.H"
#include "F63XREG.H"
#include "F63XDEF.H"
#include "math.h"
#include "stdio.h"
#include "RAM.H"
#include "ModeHandle.H"
#include "UserAdj.H"
#include "IIC.H"
#include "Scaler.H"
#include "MCU.H"
#include "PANEL.H"
#include "AutoAdj.H"
#include "ROM_MAP.H"
#include "SAA7114.H"
typedef union
{
unsigned short w;
unsigned char b[2];
}Union;
void GetCounter(void)
{
unsigned char temp;
Union TempFreq;
NoSyncFlag = 0;
if(ReadIIC563(0x19a) & BIT_5) //H+V high piority
if(SyncMode == 0)
{
V_SYNC = 0;
H_SYNC = 0;
NoSyncFlag = 1;
return;
}
temp = ReadIIC563(0x19a);
HV_Pol = (temp & 0x03) << 4;
BypassSOG = 0;
if(!(temp & BIT_6)) //Sep/Comp Hsync present
{
TempFreq.w = ReadWordIIC563(0x19b);
H_SYNC = (HSYNC_CLK)/TempFreq.w;
BypassSOG = 1;
if(H_SYNC <100)
{
H_SYNC = 0;
NoSyncFlag = 1;
}
}
else
{
if(SyncMode == 3){// Jacky 20040623 When DVI DE mode, GI_HCNT_OV alway "1"
#if DVImode == DEmode
if(ReadIIC563(0x1ab) & BIT_0)
{
TempFreq.w = ReadWordIIC563(0x19b);
H_SYNC = (HSYNC_CLK)/TempFreq.w;
BypassSOG = 1;
if(H_SYNC <100)
{
H_SYNC = 0;
NoSyncFlag = 1;
}
}
else
{
H_SYNC = 0;
NoSyncFlag = 1;
}
#else
H_SYNC = 0;
NoSyncFlag = 1;
#endif
}
else{
H_SYNC = 0;
NoSyncFlag = 1;
}
}
if(!(temp & BIT_7))//Sep/Comp Vsync present
{
TempFreq.w = ReadWordIIC563(0x19d);
V_SYNC = (VSYNC_CLK)/TempFreq.w;
BypassSOG = 1;
if(V_SYNC <100)
{
V_SYNC = 0;
NoSyncFlag = 1;
}
}
else
{
V_SYNC = 0; //over flow
NoSyncFlag = 1;
}
if((SyncMode == 2||SyncMode == 6) && !NoSyncFlag)
if(!VsyncValide()) //for SOG Vsync pulse detect
{
V_SYNC = 0;
H_SYNC = 0;
NoSyncFlag = 1;
}
}
void CheckFreq(void)
{
bit UnStable;
Byte i,Count;
if(DetectIRQ() || ChangeMode>0)
{
if(SyncMode == 3){
DVIBandWidthDetection();
}
OutOfRange = 0;
H_SYNC_Temp = 0x5555;
V_SYNC_Temp = 0x5555;
if(!BurnInMode && !ForceToBack)
ForceToBackground(0,0,0); //Set fource to background
Count = 0;
for(i=0;i<3;i++)
{
UnStable = 0;
GetCounter();
if(HV_Pol_Temp != HV_Pol)
UnStable = 1;
if(abs(H_SYNC_Temp - H_SYNC)>10)
UnStable = 1;
if(abs(V_SYNC_Temp - V_SYNC)>10)
UnStable = 1;
if(UnStable)
{
if((SyncMode == 3) && (abs(DVI_Clock - ReadIIC563(0x016)) > 2)) //Jacky 20050512
DVIBandWidthDetection();
HV_Pol_Temp = HV_Pol;
H_SYNC_Temp = H_SYNC;
V_SYNC_Temp = V_SYNC;
i = 0;
}
Sleep(35); //wait for Vsync update
Count++;
if(Count > 15) //freq unstable too long
{
V_SYNC = 0;
H_SYNC = 0;
NoSyncFlag = 1;
break;
}
}
ChangeMode = 0;
FastMuteEnable = 1;
WriteIIC563(0x1ab,0x3f); //clear IRQ
WriteIIC563(0x1ac,0x1f);
EndMute = 0;
MuteTimer = MUTE_DELAY_TIME;
}
if(NoSyncFlag)
{
if(ChangeMode == 0)
{
FastMuteEnable = 0;
if(!BurnInMode)
WriteIIC563(0x159,0x20); //fast mute disable
NoSync();
}
}
else
{
if(ChangeMode == 0 && !EndMute && MuteTimer == 0)
{
GetCounter(); //recheck frequency
if(HV_Pol_Temp != HV_Pol)
ChangeMode = 1;
if(abs(H_SYNC_Temp - H_SYNC)>10)
ChangeMode = 1;
if(abs(V_SYNC_Temp - V_SYNC)>10)
ChangeMode = 1;
EndMute = 1;
if(PowerDown)
{
ScalerPowerUp();
PowerTimer = POWER_TIME;
MuteTimer = 0;
}
if(BurnInMode)
{
BurnInMode = 0;
FactMode = 0;//jacky0316 Item41 BurnInMode
Write24C16(ep_Status,StatusFlag);
LED_GrnOn();
LED_RedOff();
}
//FastMuteOn();
WriteIIC563(0x159,0xa0); //fast mute disable
BackLightOff();
/*
VideoMute = 1;
ForceToBackground(0,0,0); //Set fource to background
*/
Osd_Off();
if(ChangeMode == 0)
{
GetMode();
switch(OutOfRange)
{
case 0:
SetDisplayNormal();
//if(NewMode && SyncMode < 3) //bypass DVI
// TunePositionOnly();
//ShowSource();
break;
case 1:
SetDisplayNormal();
TunePositionOnly();
ShowMessage(MSG_OUTRANGE);
break;
case 2:
FastMuteEnable = 0;
ShowMessage(MSG_OUTRANGE);
break;
}
Sleep(PowerUpInvTiming);
//FastMuteOff();
BackLightOn();
VideoMute = 0;
if(NewMode && (AutoSetting == 1) && (SyncMode < 3) && (OutOfRange == 0) && (ModePoint > 18)) //bypass DVI and normal mode
{
ShowMessage(MSG_AUTOTUNE);
AutoTune();
//Write24C16(ep_Reso_Offset + (ModePoint * 8), ResolutionPtr|0x80);
}
}
}
}
}
void GetMode(void)
{
bit PolPass;
Byte ch;
Word i,Addr;
Union Hf,Vf;
ModePoint = 0;
UserModeRefReso = 0;
/*
ch = ReadIIC563(0x020);
if(ReadIIC563(0x19a) & BIT_2){
Interlance = 1;
WriteIIC563(0x020,ch|BIT_2);
}
else{
Interlance = 0;
WriteIIC563(0x020,ch);
}
*/
VTotal = (Word)(((unsigned long)H_SYNC * 1000)/ V_SYNC);
if(SyncMode == 0 || SyncMode == 3)
i = 0;
else
i = 8;
for(;i< ModeNum;i++)
{
Addr = ep_Mode_Data + i * 4;
Hf.b[0] = Read24C16(Addr++); //check h_sync
Hf.b[1] = Read24C16(Addr++);
Vf.b[0] = Read24C16(Addr++);
Vf.b[1] = Read24C16(Addr);
PolPass = 0;
if(Vf.b[0] & 0x80)
PolPass = 1;
if((Vf.b[0] & 0x30) == HV_Pol)
PolPass = 1;
if(Vf.b[0] & 0x40)
{
ch = (Vf.b[0] & 0x40) >> 1;
ch |= ch >> 1;
if(ch == HV_Pol)
PolPass = 1;
}
if(PolPass)
{
if(i == 35 || i== 68 ){// Jacky 20040524 for 1024x768@60Hz and 1280x768@60Hz
if(abs(Hf.w - H_SYNC)<5)
{
Vf.b[0] &= 0x0f;
if(abs(Vf.w - V_SYNC) < 5)
{
//#if PRINT_MESSAGE
// printf("Mode %d\n",(unsigned short)ModePoint);
//#endif
//if(i < 8 && !TextMode)
// break;
//if(i >= 8)
break;
}
}
}
else{
if(abs(Hf.w - H_SYNC)<10)
{
Vf.b[0] &= 0x0f;
if(abs(Vf.w - V_SYNC) < 10)
{
//#if PRINT_MESSAGE
// printf("Mode %d\n",(unsigned short)ModePoint);
//#endif
//if(i < 8 && !TextMode) //graph mode stop search text mode 62~69
// break;
//if(i >= 8)
break;
}
}
}
}
}
ModePoint = i;
//if(ModePoint < 18)
// GTmodeEn = 1;
//else
// GTmodeEn = 0;
if(SyncMode == 6 && ModePoint == 11)
if(ModePoint == 11) //For NTSC 480P
ModePoint = 12;
else if(ModePoint == 8) //For PAL 574i
ModePoint = 69;
if(ModePoint == ModeNum)
{
#if PRINT_MESSAGE
printf("user's mode\n");
#endif
NewMode = 1;
SetUserMode();
}
else
NewMode = 0;
#if PRINT_MESSAGE
printf("Mode %d\n",(unsigned short)ModePoint);
#endif
LoadModeDependentSettings();
// if(SyncMode < 3)
FuncBuf[pCONTRAST] = Read24C16(ep_Contrast);
// else
// FuncBuf[pCONTRAST] = Read24C16(ep_DVI_Contrast);
Addr = ep_Reso_Offset + (ModePoint * 8);
ResolutionPtr = Read24C16(Addr);
if(!(ResolutionPtr & 0x80))
NewMode = 1;
ResolutionPtr &= 0x7f;
Hresolution = H_ActiveTab[ResolutionPtr];
Vresolution = V_ActiveTab[ResolutionPtr];
if(ModePoint < UserModeSt)
Addr = ModePoint * 8 + 2;
else{
UserModeRefReso = SearchEstimatedModeTables();
Addr = UserModeRefReso * 8 + 2;
}
HPositionBase = EEP_SyncMap[Addr];
HPositionBase <<= 8;
HPositionBase |= EEP_SyncMap[Addr+1];
ClockBase = EEP_SyncMap[Addr+2];
ClockBase <<= 8;
ClockBase |= EEP_SyncMap[Addr+3];
if(HV_Pol & BIT_4)
WriteIIC563(0x021,0x81);
else
WriteIIC563(0x021,0x01);
//SetInterface();
#if PRINT_MESSAGE
printf("HV_Pol= %x\n",(unsigned short)HV_Pol);
printf("H_SYNC= %d\n",H_SYNC);
printf("V_SYNC= %d\n",V_SYNC);
#endif
SetADC_PLL();
CheckDVIresolution();
if(OutOfRange < 2)
{
SetScalerMode();
//SetScaler();
if(SyncMode != 3)
{
ch = FuncBuf[pPHASE];
if(FuncBuf[pPHASE] != 0)
{
for(FuncBuf[pPHASE]=0; FuncBuf[pPHASE]<=ch; FuncBuf[pPHASE]++)
SetADC_Phase();
}
FuncBuf[pPHASE] = ch;
}
SetSharpness();
}
if(SyncMode == 3) //DVI
{
#if DVImode == DEmode
FuncBuf[pVPOSITION] = 0x1e0; // for DE mode scaler shut down Jacky20040629
FuncBuf[pHPOSITION] = 0;
WriteWordIIC563(0x030,FuncBuf[pVPOSITION]);
WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
WriteWordIIC563(0x030,FuncBuf[pVPOSITION]);
WriteWordIIC563(0x034,FuncBuf[pHPOSITION]);
#else
//if((SyncMode == 3) && ((PortD & BIT_3) != 0)) //DVI
AutoPosition();
#endif
}
SetContrast();
SetInverter();
}
void CheckDVIresolution()
{
Union Hf,Vf;
if(SyncMode == 3)
{
Vf.w = ReadWordIIC563(0x03e);
Hf.w = ReadWordIIC563(0x03c);
//if(Vf.w > 1024 || Hf.w > 1280)
if(Vf.w > 1200 || Hf.w > 1600)
{
OutOfRange = 2;
}
else
{
if((Vf.w == 1200 || Hf.w == 1600)&&(V_SYNC > 620))
{
OutOfRange = 2;
}
Hresolution = Hf.w;
Vresolution = Vf.w;
//ResolutionPtr = 0xff;
}
}
}
void SetUserMode(void)
{
/*
code unsigned short Vt_Tab[]={
500,600,700,760,850,950,1050,1200
};
code unsigned char UserTimeTab[]={
0x00,0x7d,0x00,0x30,0x03,0x84,0x03,0x10, //720*400 500
0x00,0x21,0x00,0x30,0x03,0x20,0x04,0x10, //640x480 600
0x00,0x10,0x00,0x98,0x04,0x18,0x06,0x10, //800x600 700
0x00,0x10,0x00,0xe0,0x06,0x72,0x0f,0x10, //1280x720 760 (HDTV 720p)
0x00,0x10,0x01,0x00,0x05,0x40,0x08,0x10, //1024x768 850
0x00,0x10,0x00,0xd0,0x06,0x40,0x09,0x10, //1152x864 950
0x00,0x10,0x00,0xe0,0x06,0xc0,0x0c,0x10, //1280x960 1050
0x00,0x10,0x00,0xf8,0x06,0x98,0x0d,0x10, //1280x1024 1200
0x00,0x2e,0x01,0x30,0x0b,0xb8,0x0e,0x10 //over (1600x1200)
};
unsigned short addr;
unsigned char i,j,k;
#if PRINT_MESSAGE
printf("Vtotal = %d\n",VTotal);
#endif
if(Interlance)
addr = VTotal << 1;
else
addr = VTotal;
j = 8;
for(i=0; i<8; i++)
{
if(addr < Vt_Tab[i])
{
j = i;
break;
}
}
j = j * 8;
ModePoint = UserModePtr;
UserModePtr++;
Write24C16(ep_User_Ptr,UserModePtr);
if(UserModePtr > ModeNum)
UserModePtr = UserModeSt;
#if PRINT_MESSAGE
printf("UserModePoint = %d\n",(unsigned short)ModePoint);
#endif
addr = ModePoint * 8;
for(i=0; i<8; i++)
{
k = UserTimeTab[j];
Write24C16(ep_Sync_Data+addr,k);
#if PRINT_MESSAGE
printf("Data %x = %x\n",(unsigned short)i,(unsigned short)k);
#endif
addr++;
j++;
}
addr = ep_Mode_Data+ModePoint * 4;
k = H_SYNC >> 8;
Write24C16(addr,k);
addr++;
k = H_SYNC;
Write24C16(addr,k);
addr++;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -