📄 modehandle.c
字号:
/*==========================================
==========================================*/
#include "include.h"
/*==========================================
==========================================*/
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 && !NoSyncFlag)
if(!VsyncValide()) //for SOG Vsync pulse detect
{
V_SYNC = 0;
H_SYNC = 0;
NoSyncFlag = 1;
}
}
/*==========================================
==========================================*/
void OutputDisplayData(void)
{
WriteIIC563(0x1f7,0xc0); //Power up LVDS buffer
WriteIIC563(0x1f5,0x06); //disable Pull low LVDS pad
}
void PanelPowerUpSequence(void)
{
SetCaptureEnable();
//if(I_OPanelPowerStatus){ //only do whlie last time happened power offf
//Sleep(250); //for turn on picture garbage
BackLightOn();
//}else{
if(!I_OLCDSTBStatus)
PanelPowerOn();
//Sleep(PowerUpPanelTiming);
OutputDisplayData();
//Sleep(PowerUpInvTiming);
//BackLightOn();
//}
}
void DVIBandWidthDetection(void)
{
Byte DVI_Clock_Temp,temp143;
WriteIIC563(0x01d,0x01);//Jacky 20050118
WriteIIC563(0x145,0x00);//Jacky 20041221
WriteIIC563(0x144,0x00);
// Reset DVI PLL
temp143 = ReadIIC563(0x143);
WriteIIC563(0x143,temp143 |0x80);
WriteIIC563(0x143,temp143 & 0x7f);
Sleep(20);
LocalTimer = 5;
DVI_Clock = 0;
do{
DVI_Clock_Temp = ReadIIC563(0x016);
if(abs(DVI_Clock - DVI_Clock_Temp) > 2)
{
DVI_Clock = DVI_Clock_Temp;
LocalTimer = 5;
}
}while(LocalTimer != 0); //Jacky 20050107
if(DVI_Clock < 20)
return;
if(DVI_Clock <= 50)
{
WriteIIC563(0x144,0x04);//Jacky 20041221
WriteIIC563(0x145,0x03);//Jacky 20041221
}
//printf("R144 = %2bx\n\r",ReadIIC563(0x144));
//printf("R145 = %2bx\n\r",ReadIIC563(0x145));
// Reset DVI PLL
temp143 = ReadIIC563(0x143);
WriteIIC563(0x143,temp143 |0x80); // DVI pll power off
WriteIIC563(0x143,temp143 & 0x7f); // DVI pll power on
//UU=DVI_Clock;
if(DVI_Clock <= 140 && DVI_Clock >= 100){
WriteIIC563(0x145,0x00);//Jacky 20041221
WriteIIC563(0x144,0x00);
WriteIIC563(0x01b,0x0d); //DVI DPLL FSM mode select evan date 050823
// WriteIIC563(0x01b,0x05); //DVI DPLL FSM mode select //joe remove2005/4/29
}
else
WriteIIC563(0x01b,0x00); //DVI DPLL FSM mode select
//if(!ColordotTimer)
// ColordotTimer=9;
//WriteIIC563(0x143,0x00);//Jacky 20041221
// LED_RedOff(); //power saving only red light joe 2005/4/23
}
/*==========================================
==========================================*/
void SetInterface()
{
#define NT68665 1
Word code InterfaceTab[]={0x000,0x008,0x102,0x023,0x196,0x012,0x072};
Byte code InterfaceDat[][7]={
#if NT68665 == 1
{0x12,0x04,0x29,0x00,0x64,0x00,0x01}, //channel 1 sep +-
{0x12,0x04,0x29,0x40,0x65,0x00,0x00}, //channel 1 comp +-
{0x1a,0x04,0x29,0x40,0x65,0x7c,0x00}, //channel 1 SOG -
#else
{0x12,0x00,0x29,0x00,0x64,0x00,0x01}, //channel 1 sep +-
{0x12,0x00,0x29,0x40,0x65,0x00,0x00}, //channel 1 comp +-
{0x1a,0x00,0x29,0x40,0x65,0x7c,0x00}, //channel 1 SOG -
#endif
#if DVImode == DEmode
{0x10,0x00,0x03,0x00,0x24,0x00,0x01}, //DVI +-
#else
{0x10,0x00,0x03,0x08,0x94,0x00,0x01}, //DVI +-
#endif
#if NT68665 == 1
{0x12,0x00,0x29,0x00,0x64,0x00,0x01}, //channel 2 sep +-
{0x12,0x00,0x29,0x40,0x65,0x00,0x00}, //channel 2 comp +-
{0x1a,0x00,0x29,0xc0,0x65,0xe4,0x00}, //channel 2 SOG -
#else
{0x12,0x04,0x29,0x00,0x64,0x00,0x01}, //channel 2 sep +-
{0x12,0x04,0x29,0x40,0x65,0x00,0x00}, //channel 2 comp +-
{0x1a,0x04,0x29,0xc0,0x65,0xe4,0x00}, //channel 2 SOG -
#endif
};
//Byte SourSel,temp,i;
Byte i;
if(!PowerDown)
{
#if PanelInterface == TCON_TO_RSDS
WriteIIC563(0x101,0x90);
#endif
#if PanelInterface == LVDS_TO_TCON
WriteIIC563(0x101,0x40);
#endif
#if PanelInterface == TTL_TO_TCON
WriteIIC563(0x101,0x00);
WriteIIC563(0x1f7,0x00); //Power off LVDS buffer
#endif
#if PanelInterface == TCON_TO_TTL
WriteIIC563(0x101,0x00);
#endif
// Jacky 20040906 for LVDS power up
WriteIIC563(0x1f5,0x06); //disable Pull low LVDS pad
#if PanelInterface == LVDS_TO_TCON
//WriteIIC563(0x1f7,0xc0); //Power up LVDS buffer
#endif
}
Interlance = 0;
if(SyncMode == 3){
WriteIIC563(0x020,0x83);// 0x83 enable interlace signal
WriteIIC563(0x143,0x20); //Power up DVI Pll
WriteIIC563(0x146,0xf3); //Power up DVI SCDT detect
}
else{
WriteIIC563(0x020,0x81);
WriteIIC563(0x143,0xa0); //Power down DVI Pll
}
for(i=0;i<7;i++)
{
if(InterfaceTab[i] == 0x102 && PowerDown)
WriteIIC563(InterfaceTab[i],InterfaceDat[SyncMode][i]&0x02);
//else if(InterfaceTab[i] == 0x021 && (HV_Pol & BIT_4)){
// WriteIIC563(InterfaceTab[i],InterfaceDat[SyncMode][i]|BIT_7);
// }
else
WriteIIC563(InterfaceTab[i],InterfaceDat[SyncMode][i]);
Sleep(1);
}
if(HV_Pol & BIT_4){
WriteIIC563(0x021,0x81);
/*if((SCID & 0x0f) == 7) //NT68663A
WriteIIC563(0x021,0xc1);
else
WriteIIC563(0x021,0x81);
*/
}
else{
WriteIIC563(0x021,0x01);
/*if((SCID & 0x0f) == 7) //NT68663A
WriteIIC563(0x021,0x41);
else
WriteIIC563(0x021,0x01);
*/
}
}
void SyncSource()
{
// Byte temp,Max;
// Bit ExitLoop;
if(FLG_Change_SyncMode)
{
// if(SyncMode == 3)
// {
// if(1)
// {
WriteIIC563(0x144,0);//Dvi power up for RU
WriteIIC563(0x01d, 0x01);
SetInterface();
NoSyncFlag=0;
#if PRINT_MESSAGE
printf("DVI Input\n");
#endif
// }
// }
ChangeMode = 1;
FLG_Change_SyncMode=0;
}
}
void CheckFreq(void)
{
bit UnStable;
Byte i,Count;
if(DetectIRQ() || ChangeMode>0){
if(SyncMode == 3){
DVIBandWidthDetection();
}
OutOfRange = Within_range;
H_SYNC_Temp = 0x5555;
V_SYNC_Temp = 0x5555;
ForceToBackground(0xff,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)){
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){
INTEXT_FLG = INTE0; //add by kevin 92/10/17
INTEXT_EN = INTEN_INIT; // Disable interrupt INT0 enable INT1
ChangeMode++;
return;
}
}
}else{
if(ChangeMode == 0 && !EndMute && MuteTimer == 0){
BackLightOff();
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(ChangeMode == 0){
INTEXT_FLG = INTE0; //moved by kevin y50321
INTEXT_EN=INTEN_INIT;
WriteIIC563(0x1ab,0x3f); //clear IRQ added by kevin y50321 move here from setdisplaynormal()
WriteIIC563(0x1ac,0x1f); //added by kevin y50321
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -