📄 modedet.c
字号:
// Force screen background color to black
MUTEEnable();
PowerPanel(1); // Panel power-on
ShortDelay(100); //algu 1120 40->100
InitialOsd();
OsdInitCtrl(); // OSD control register data
PowerBacklight(1); // BackLight on
FgNoSignal = 1;
// FgMenuChange = 1;
OSDNumber = OSDTitle;
//algu 1121 FgOsdAct = 1;
FgFreeRun = 1;
}
void ZuracAutoFreeRun( Byte auto_on ) //tonny
{
#if FREERUN_AUTO
Byte bval;
Word IDATA clock,hpos,vpos;
if( auto_on )
{
// PowerBacklight(0); // BackLight off
// ZuracWriteByte(0x04,0x10); // Flush Screen to BLACK
#if BLUE_AUTO
OsdEnable(0); // disable osd display
OsdClearAll(); // OSD control register data
#endif
// ShortDelay(10);
// ZuracWriteByte(0x04,0x20); // disable output
// PowerPanel(0); // Panel power-off
clock = ClockValue;
hpos = HorPositionValue;
vpos = VerPositionValue;
FreeRunInit(); // free run initial
ClockValue = clock;
HorPositionValue = hpos;
VerPositionValue = vpos;
ShortDelay(40);
PowerPanel(1); // Panel power-on
ShortDelay(10);
ZuracWriteByte(0x04,0x10); // Flush Screen to blue
ShortDelay(40);
PowerBacklight(1); // BackLight on
// set RGB 24/48 input port
if( ModeInputport[ModeCounter]==2 ) bval = 0x01; // bit[1]==0,RGB 48 bit input
else bval = 0x03; // bit[1]==1,RGB 24 bit input
#if (ADC_CHIP==ADI_9883)
bval |= 0x80; // bit[7]==1 invert input clock
#endif
ZuracWriteByte(0x02,bval);
#if BLUE_AUTO
OsdMenuItem(L3_AUTO_ADJUST);
ZuracWriteByte(0x04,0x12); // Flush Screen to blue
OsdWrite(0xC3,0x20);
OsdOpenUp();
#endif
FgFreeRun = 1;
}
else
{
PowerBacklight(0); // BackLight off
// HScaling = 32;
// OsdEnable( 0 );
OsdClearAll();
OSDNumber = L0_NOOSD;
// Delay(25);
ZuracWriteByte(0x04,0x10); // Normal Screen
FgFreeRun = 0;
PowerPanel(0); // Panel power-off
EepromTimingRecall( ModeCounter );
Ttfc( ModeCounter,1 );
Zurac0Atoggle();
ShortDelay(20);
PowerPanel(1); // Panel power-on
// HorPositionValue++;
// SetHorPosition(INCREASE,0);
// HorPositionValue--;
// SetHorPosition(DECREASE,0);
ShortDelay(100); //algu 1122 40->100
PowerBacklight(1); // BackLight on
}
#else // set Blue screen only
if( auto_on )
{
#if BLUE_AUTO
OsdEnable(0);
OsdClearAll(); /* OSD control register data */
OsdMenuItem(L3_AUTO_ADJUST);
ZuracWriteByte(0x04,0x12); /* Flush Screen to blue */
OsdWrite(0xC3,0x20);
OsdOpenUp();
#endif
}
else
{
HScaling = 32;
FgScalerAct = FgScalerAdj = 1;
OsdEnable( 0 );
OSDNumber = L0_NOOSD;
#if BLUE_AUTO
ZuracWriteByte(0x04,0x00); /* Normal Screen */
#endif
}
#endif
}
/************************************************************************/
/* Function : SetModeChangeStatus */
/* Description : set mode change status */
/* Input : None */
/* Output : none */
/************************************************************************/
void SetModeChangeStatus( void )
{
#if ZURAC_HWMD
if ( FgSogSignal || FgSepSignal || FgCompSignal )
{
CurHFreq = HWMD_HfCounter(); /* get HfCounter */
CurVFreq = HWMD_VfCounter(); /* get VfCounter */
#if ((OUTPUT_MODE==OUTPUT_SXGA) && (PANEL_DEFAULT==PANEL_ACER))
HS1frCount = ((long)(CurVFreq+2) * 352) / (long)(CurHFreq-2);
HS2frCount = ((long)(CurVFreq-2) * 352) / (long)(CurHFreq+2);
HS2frCount = HS1frCount + HS2frCount;
HS1frCount = HS2frCount / 2;
#else
HS1frCount = ((long)CurVFreq * 352) / (long)CurHFreq;
#endif
CurHFreq = HWMD_HFrequency(); /* get HFrequency */
CurVFreq = HWMD_VFrequency(); /* get VFrequency */
// HS1frCount = ((long)CurHFreq * 1000) / (long)CurVFreq;
FgModeChange = 1;
if ( FgSepSignal || FgCompSignal )
{
FgNoSignal = 0;
}
else
{
SyncSource = 0xA0;
HWMD_ChangeSource();
HWMD_ReadStatus();
ShortDelay(100);
HWMD_ReadStatus();
if( FgHWMDInt )
{
FgHWMDInt = 0;
EX0 = 1; // enable INT0 interrupt
}
MuteTimer = 0;
FgModeDetect = 0;
if( LastHCountH==HCountH && LastVCountH==VCountH &&
LastHPol==CurrentHPol && LastVPol==CurrentVPol )
{
FgModeChange = 0;
}
else
{
FgNoSignal = 0;
LastHCountH = HCountH;
LastVCountH = VCountH;
LastHPol = CurrentHPol;
LastVPol = CurrentVPol;
}
}
if( CurHFreq > 20000 ) FgNoSignal = 1;
// /* Check Hsync frequency : 15KHz - 93KHz */
// if((CurHFreq < 1500) || (CurHFreq > 9300)) FgNoSignal = 1;
// /* Check Vsync frequency : 40Hz - 90Hz */
// if((CurVFreq < 4000) || (CurVFreq > 8750)) FgNoSignal = 1;
if( InputSource==INPUT_DIGITAL )
{
if( DVI_DET_PIN==0 || DVIENN_PIN==0 ) FgNoSignal = 1;
}
}
#endif
}
#if DIGITAL_DOS_MODE
Byte ModeGetDOSMode( void )
{
Byte i,vn,vd;
Word IDATA wval0,wval1,wval2;
i = ModeCounter; // backup mode number
if( ModeCounter==0 || /* 640x350/70 */
ModeCounter==DosModeTable[0][0] || /* 720x400/70 */
ModeCounter==DosModeTable[0][1] ) /* 640x400/70 */
{
ModeCounter = DosModeTable[0][0];
wval2 = 14268; // Vsynctime = 1000000 / 70.086 = 14.268 ms
}
else
{
ModeCounter = DosModeTable[1][0]; /* 720x400/85 */
wval2 = 11759; // Vsynctime = 1000000 / 85.039 = 11.759 ms
}
PowerBacklight(0); // Backlight power-off
PowerPanel(0); // Panel power-off
PowerScaler(1); // Zurac power-on
EepromTimingDefault(ModeCounter);
Ttfc(ModeCounter, 1);
// Zurac0AToggle();
ModeCounter = i;
i = 4 * mode_factor[9];
vn = scale_factor_table[i+2]; // scale factor
vd = scale_factor_table[i+3];
// Enlarge Vn & Vd to maximum
for( i=1; i<64; i++ )
{
if( (vn * i) > 64 )
break;
}
--i;
vn = vn * i;
vd = vd * i;
wval0 = (Word) (449 * (Word)vn) / (Word)vd;
wval2 = (Word) (((Long)wval2 * 16) / wval0);
// set Vsf
ZuracWriteByte(0x6F,vn);
ZuracWriteByte(0x70,vd);
// Set PV start/total & H Sync pulse width
ZuracWriteWord(0x34,0x0028); // output v-start
ZuracWriteWord(0x38,wval0); // output total
ZuracWriteByte(0x3A,0xFF); // output Hsync width
ZuracWriteWord(0x44,0x0028); // background v-start
ZuracWriteByte(0xD0,0x80); // disable interrupt
Delay(40);
HWMD_ReadStatus();
ShortDelay(5);
HWMD_ReadStatus();
ZuracWriteByte(0xD0,0xC4); // select DE, disable INT and count by line
HWMD_ReadStatus();
ShortDelay(5);
HWMD_ReadStatus();
vn = IP; // save IP value
IP = 0x24; // INT1 & Timer2 highest priority
EX1 = 1; // enable INT1(Vsync) interrupt
for( i=0,wval1=0; i<4; i++ )
{
Delay(10);
wval1 += PHsync16;
}
wval1 /= 4; // output 16 PHsync average time
wval0 = HWMD_VfCounter(); // get input DE lines count
ZuracWriteByte(0xD0,0x83); // select sep SYNC, disable INT
Delay(15);
HWMD_ReadStatus();
ShortDelay(5);
HWMD_ReadStatus();
ZuracWriteByte(0xD0,0xA3); // select sep SYNC, disable INT
EX1 = 0; // disable INT1 interrupt
ET2 = 0; // disable Timer2 interrupt
IP = vn; // restore IP value
if( wval1 > wval2 ) // get 16 PHsync time difference
wval1 = wval1 - wval2;
else
wval1 = wval2 - wval1;
if( wval1 <= 10 ) // 16 PHsync time difference L.E. 10us
i = 2; /* 720x400 */
else if( wval0<=410 && wval0>=390 ) // input DE lines count
i = 1; /* 640x400 */
else
i = 0; /* 640x350 */
return i;
}
#endif
/************************************************************************/
/* Function : RangeDetect */
/* Description : Detect H,V frequency */
/* Input : None */
/* Output : 1 -> invalid */
/* : 0 -> valid */
/************************************************************************/
//#define HFREQMIN17 2400//alf 1107 //2900
//#define HFREQMAX17 9000
//#define VFREQMIN17 4850
//#define VFREQMAX17 8400 //algu 1113 //8650
//algu 1122
//return 0->normal mode, 1->Fail-Safe mode, 2->Over-Range, 3->No Signal, 4->Unknow Mode
Byte RangeDetect()
{
if ( CurHFreq>=2900 && CurHFreq<=8100 && CurVFreq>=4900 && CurVFreq<=7600) //normal mode
{
if( ModeCounter < TOTAL_MODE_NUMBER ) /* filter out non-supported mode */
{
if( ModeSupport[ModeCounter]==0 )
{
ModeCounter = TOTAL_MODE_NUMBER; /* make this mode as unknown mode */
return Unknow_Mode;
}
else if( ModeSupport[ModeCounter]==2 )
{
#if (ADC_IS_48_BIT==0) /* filter out scaling down mode */ //mk0614
//algu 1130 ModeCounter = TOTAL_MODE_NUMBER;
return Fail_Safe_Mode;
#endif
}
return Normal_Mode;
}
return Unknow_Mode;
}
else if ( CurHFreq>=2900 && CurHFreq<=8100 && CurVFreq>7600 && CurVFreq<=8600 ) // Fail-Safe mode
{
if( ModeCounter < TOTAL_MODE_NUMBER ) /* filter out non-supported mode */
{
if( ModeSupport[ModeCounter]==0 )
{
ModeCounter = TOTAL_MODE_NUMBER; /* make this mode as unknown mode */
return Unknow_Mode;
}
else if( ModeSupport[ModeCounter]==2 )
{
#if (ADC_IS_48_BIT==0) /* filter out scaling down mode */ //mk0614
//algu 1130 ModeCounter = TOTAL_MODE_NUMBER;
return Fail_Safe_Mode;
#endif
}
return Fail_Safe_Mode;
}
return Unknow_Mode;
}
else if ( CurHFreq>=1000 && CurVFreq>=1000 )
{
return Over_Range_Mode;
}
else
{
return No_Signal_Mode;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -