📄 mode.c
字号:
/************************************************
* *
* MODE.C: Mascot Display Mode routine *
* *
************************************************/
#include <reg51.h>
#include <stddef.h>
#include "mascot.h"
#include "osd.h"
#include "global.h"
#if PANEL_1280
#include "SXGATBL.h"
#else
#include "XGATBL.h"
#endif
#include "ADCTBL.h"
//
// Display Mode Table
//
MODETBL code ModeTbl[] = {
#if 0
{tvNTSCTbl,NULL, 640, 240,0+NOPOL }, //0: NTSC
{tvPALTbl, NULL, 720, 286,0+NOPOL }, //1: PAL
#else
{NULL, NULL, 0, 0, 0 },
{NULL, NULL, 0, 0, 0 },
#endif
{Mode350Tbl, Mode2Tda, 640, 350,2 }, //2: 640x350 50
{Mode350Tbl, Mode3Tda, 640, 350,2 }, //3: 640x350 60
{Mode350Tbl, Mode4Tda, 640, 350,2 +PRESETMODE }, //4: 640x350 70
{Mode400aTbl,Mode5Tda, 640, 400,2 }, //5: 640x350 84
{Mode400Tbl, Mode6Tda, 720, 400,1+NOPOL }, //6: 720x400 50
{Mode400Tbl, Mode7Tda, 720, 400,1+NOPOL }, //7: 720x400 60
{Mode400Tbl, Mode8Tda, 720, 400,1+NOPOL+PRESETMODE }, //8: 720x400 70
{Mode400Tbl, Mode9Tda, 720, 400,1+NOPOL }, //9: 720x400 84
{Mode400aTbl,Mode10Tda, 640, 400,3+NOPOL }, //10: 640x400 56
{Mode480Tbl,Mode11Tda, 640, 480,3+NOPOL+PRESETMODE }, //11: 640x480 50
{Mode480Tbl,Mode12Tda, 640, 480,3+NOPOL+PRESETMODE }, //12: 640x480 60
{Mode480Tbl,Mode13Tda, 640, 480,2+NOPOL+PRESETMODE }, //13: 640x480 66 (MAC)
{Mode480Tbl,Mode14Tda, 640, 480,3+NOPOL }, //14: 640x480 70
{Mode480Tbl,Mode15Tda, 640, 480,3+NOPOL+PRESETMODE }, //15: 640x480 72
{Mode480Tbl,Mode16Tda, 640, 480,3+NOPOL+PRESETMODE }, //16: 640x480 75
{Mode480Tbl,Mode17Tda, 640, 480,3+NOPOL }, //17: 640x480 85
{Mode600Tbl,Mode18Tda, 800, 600,0+NOPOL+PRESETMODE }, //18: 800x600 56
{Mode600Tbl,Mode19Tda, 800, 600,0+NOPOL+PRESETMODE }, //19: 800x600 60
{Mode600Tbl,Mode20Tda, 800, 600,0+NOPOL }, //20: 800x600 66 (MAC)
{Mode600Tbl,Mode21Tda, 800, 600,0+NOPOL }, //21: 800x600 70
{Mode600Tbl,Mode22Tda, 800, 600,0+NOPOL+PRESETMODE }, //22: 800x600 72
{Mode600Tbl,Mode23Tda, 800, 600,0+NOPOL+PRESETMODE }, //23: 800x600 75
{Mode600Tbl,Mode24Tda, 800, 600,0+NOPOL }, //24: 800x600 85
{Mode624Tbl,Mode25Tda, 832, 624,3+NOPOL+PRESETMODE }, //25: 832x624 75
{Mode768aTbl,Mode26Tda,1024, 768,0+NOPOL }, //26: 1024x768 43i
{Mode768Tbl,Mode27Tda,1024, 768,3+NOPOL+PRESETMODE }, //27: 1024x768 60
{Mode768Tbl,Mode28Tda,1024, 768,3+NOPOL+PRESETMODE }, //28: 1024x768 66 (MAC)
{Mode768Tbl,Mode29Tda,1024, 768,3+NOPOL+PRESETMODE }, //29: 1024x768 70
{Mode768Tbl,Mode30Tda,1024, 768,0+NOPOL }, //30: 1024x768 72
{Mode768Tbl,Mode31Tda,1024, 768,0+NOPOL+PRESETMODE }, //31: 1024x768 75
{Mode768Tbl,Mode32Tda,1024, 768,3 }, //32: 1024x768 75 (MAC)
{Mode768Tbl,Mode33Tda,1024, 768,0+NOPOL }, //33: 1024x768 85
{Mode768Tbl,Mode34Tda,1024, 768,3+NOPOL }, //34: 1024x768 90
{Mode864Tbl,Mode35Tda,1152, 864, 0+NOPOL }, //35: 1152x864 60
{Mode864Tbl,Mode36Tda,1152, 864, 0+NOPOL }, //36: 1152x864 70
{Mode864Tbl,Mode37Tda,1152, 864, 0+NOPOL+PRESETMODE}, //37: 1152x864 75
{Mode870Tbl,Mode38Tda,1152, 870, 0+NOPOL }, //38: 1152x870 75
{Mode900Tbl,Mode39Tda,1152, 900, 0+NOPOL }, //39: 1152x900 66
{Mode900Tbl,Mode40Tda,1152, 900, 0+NOPOL }, //40: 1152x900 76
{Mode960Tbl,Mode41Tda,1280, 960, 0+NOPOL }, //41: 1280x960 60
{Mode960Tbl,Mode42Tda,1280, 960, 0+NOPOL }, //42: 1280x960 70
{Mode960Tbl,Mode43Tda,1280, 960, 0+NOPOL }, //43: 1280x960 75
{Mode1024Tbl,Mode44Tda,1280, 1024,0+NOPOL+PRESETMODE},//44: 1280x1024 60
{Mode1024Tbl,Mode45Tda,1280, 1024,0+NOPOL },//45: 1280x1024 66
{Mode1024Tbl,Mode46Tda,1280, 1024,0+NOPOL },//46: 1280x1024 70
{Mode1024Tbl,Mode47Tda,1280, 1024,0+NOPOL },//47: 1280x1024 72
{Mode1024Tbl,Mode48Tda,1280, 1024,0+NOPOL+PRESETMODE},//48: 1280x1024 75
{Mode1024Tbl,Mode49Tda,1280, 1024,0+NOPOL },//49: 1280x1024 85
};
#define MAXMODE (sizeof(ModeTbl)/sizeof(MODETBL))
void calculateDCLK(void);
bit fineCalculateDCLK(void);
bit modeAdjust(void);
#if (USE_TCON)
bit modeAdjustMVz(void);
void PatchTconTable(char);
unsigned char checkFifoState(void);
#endif
//
// Set Display Mode
// Return: current mode, -1 unknown mode
//
unsigned char modeSetMode(unsigned char mode, unsigned char sync_pol)
{
MODETBL *modetbl;
unsigned char pol, *regtbl;
#if (!USE_TCON && !MODE_ADJ_BY_CALCULATE)
bit temp;
#endif
if (mode >= MAXMODE)
{
#if DEBUGMSG
printf(" mode overlimit %d\n", MAXMODE);
#endif
return MODE_OUTOFSYNC;
}
#if HYUNDAI_HT17E11_200 //avoid discharge when CR24 sets 0xc0
if (!backlightOffFlag)
miscTurnOffBackLight();
#endif
freeRunFlag = 0;
modetbl = &ModeTbl[mode];
checkModeChange(); // by seven 030718
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
// Program TDA registers
regtbl = modetbl->tdaptr;
if (!(eepData.MascotFlag & FLAG_PORTB) && (regtbl!=NULL))
TDADataTableOut(regtbl);
// Program Mascot
RegBitOut(0x24, 0x00 ,0x03); // disable minify
regtbl = modetbl->modeptr;
if (regtbl == NULL)
{
#if DEBUGMSG
printf(" modeptr==NULL\n");
#endif
return MODE_OUTOFSYNC;
}
RegDataTableOut(regtbl);
dspMute(2); // by seven 030717
// setting polarity
if ( (regtbl = modetbl->tdaptr) != NULL )
{
if (eepData.MascotFlag & FLAG_PORTB)
RegBitOut(0x33, sync_pol<<1, 0x06);
else
{
RegBitOut(0x32, sync_pol<<1, 0x06);
pol = (*(regtbl+TDA_CTRL_OFF) & 0x3F) | (sync_pol<<6);
pol ^= 0x40;
RegByteOut(TDA_CTRL, pol);
//Enable CKADCO, Vsync for COAST
RegBitOut(0x18, 0x18, 0x18);
}
}
CurrentMode = mode | (PresetModeFlag ? 0x00: 0x80);
CurrentWidth = modetbl->width;
CurrentHeight = modetbl->height;
checkModeChange(); // by seven 030718
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
#if PANEL_1280 //by seven 030526
if (CurrentWidth > 1024)
RegBitOut(0x30,0x80,0x80);
else
RegBitOut(0x30,0x00,0x80);
#else // for panel 1024x768
RegBitOut(0x30,0x00,0x80);
#endif
#if CALCULATE_ZOOM
ival = CurrentWidth - 1;
ival1 = CurrentHeight - 1;
#if PANEL_1280
ival = ((unsigned long)ival << 16)/1279;
ival1 = ((unsigned long)ival1 << 16)/1023;
if (CurrentWidth == 1280) ival = 0;
if (CurrentHeight == 1024) ival1 = 0;
#else
ival = ((unsigned long)ival << 16)/1023;
ival1 = ((unsigned long)ival1 << 16)/767;
if (CurrentWidth == 1024) ival = 0;
if (CurrentHeight == 768) ival1 = 0;
#endif
RegWordOut(0x4b, ival);
RegWordOut(0x4d, ival1);
#endif
checkModeChange(); // by seven 030718
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
#if CALCULATE_DCLK
calculateDCLK();
#endif
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
if (!(eepData.MascotFlag & FLAG_PORTB))
{
if ( eepFindModeEntry() )
{
adjVPos(0,HIDE);
adjHPos(0,HIDE);
adjPitch(0,HIDE);
adjPhase(0,HIDE);
#if DEBUGMSG
printf(" PRESET loaded\n");
#endif
}
}
#if (HYUNDAI_HT17E11_200 && !MODE_ADJ_BY_CALCULATE)
if (!((CurrentWidth > 1024 && CurrentWidth <= 1280) && (CurrentHeight > 768 && CurrentHeight < 1024)))
RegBitOut(0x24, 0x10, 0x30);
#elif CHIMEI_M150X3
RegBitOut(0x24, 0x20, 0x30);
RegByteOut(0x5f,0xf0);
#endif
#if SRC_SI151
if ((eepData.MascotFlag & FLAG_PORTB) && (CurrentWidth > 1024))
{
ival = RegByteIn(0x3B);
ival = (ival<<8)+RegByteIn(0x3A)+1;
RegByteOut(0x3A, ival);
RegByteOut(0x3B, ival>>8);
}
#endif
/*
if (eepData.MascotFlag & FLAG_PORTB)
{
if((CurrentMode & 0x7f)== 39 || (CurrentMode & 0x7f)== 41)
RegBitOut(0x31,0x60,0x60); // External DE //09092002
else
RegBitOut(0x31,0x20,0x60); // External DE //09092002
}
*/
// Use DE counter to detect 720/640 modes
if ( RegByteIn(0x31)&0x20 ) // External DE
{
if (CurrentWidth == 640 || CurrentWidth == 720 || CurrentWidth == 800)
{
RegBitOut(0x30, 0x01, 0x01); // start capture
RegBitOut(0x47, 0x00, 0x80); //Select External DE width
RegBitOut(0x07, 0x08, 0x08); //Enable count External DE width
miscDelay(200);
ival = RegByteIn(0x11) & 0x07; //External DE High Byte
ival = (ival<<8) + RegByteIn(0x10); //High+Low byte of external DE
#if DEBUGMSG
printf(" DE=%d\n", ival);
#endif
if ((CurrentWidth == 640 || CurrentWidth == 720)&&(CurrentWidth != ival))
{
//modify for chroma 2326 timing 43
if (ival > 660)
CurrentWidth = ival = 720;
else
CurrentWidth = ival = 640; //720 x 400 x85 --> ival = 669
}
//CurrentWidth = ival;
RegWordOut(0x38, ival-1); //Write back H width
RegByteOut(0x3C, (ival >> 2)-1);
#if PANEL_1280
ival1 = ((unsigned long)(--ival) << 16)/1279;
#else
ival1 = ((unsigned long)(--ival) << 16)/1023;
#endif
RegWordOut(0x4b, ival1);
RegBitOut(0x07, 0x00, 0x08);
}
}
RegBitOut(0x40, 0x80, 0x80);
if (mode != 26)
{
#if 1
RegBitOut(0x32, 0x90, 0x90);
#else
RegBitOut(0x32, 0x80, 0x90);
#endif
RegBitOut(0x29, 0x10, 0x10); //Enable Flash Noise Reduction
}
#if (USE_TCON + USE_RSDS)
#if 1 //(MVXPRL+MVXRL)
RegBitOut(0x24, 0x80, 0xC0);
#else
RegBitOut(0x24, 0x00, 0xC0);
#endif
#else
RegBitOut(0x24, 0xC0, 0xC0);
#endif
RegBitOut(0x4A, 0x80, 0x80);
RegBitOut(0x59, 0x03, 0x03);
RegByteOut(0x5B, 0x00); //Horizontal Zoom Accu Pre-Load Odd
RegByteOut(0x5C, 0x00); //Horizontal Zoom Accu Pre-Load even
if (CurrentWidth == 1152 || CurrentHeight == 960)
RegByteOut(0xa8, 0x04);
else
RegByteOut(0xa8, 0x08);
RegBitOut(0x30,0x00,0x40); //enable digital contrast
RegBitOut(0x40,0x00,0x40); //disable free run for modeadjust
#if USE_GAMMATABLE
setGammaTable(CurrentMode & 0x7f);
#endif
#if SRC_SI151
if (eepData.MascotFlag & FLAG_PORTB)
RegBitOut(0x33, 0x58, 0x58);
#endif
RegBitOut(0x32, 0x80, 0x80);
#if MVXPRL
if (CurrentWidth > 1024)
RegByteOut(0x33,0x08);
else
RegByteOut(0x33,0x0e);
#else
RegBitOut(0x33, 0x00, 0x08);
#endif
// Start Capture
RegBitOut(0x30, 0x01, 0x01);
#if DO_COMPSYNC
pol = RegByteIn(0x07);
#if !NEW_ADC
if (pol & 0x01)
RegBitOut(0x17, 0x80, 0x80);
#endif
if (pol & 0x03 == 0x03)
{
RegBitOut(0x26, 0x02, 0x02);
RegBitOut(0x18, 0x00, 0xC0);
}
#endif
/*
if (CurrentWidth == 1280)
{
if (RegByteIn(0x68) == 0x00)
RegBitOut(0x32, 0x08, 0x08);
else
RegBitOut(0x32, 0x00, 0x08);
}
else
RegBitOut(0x32, 0x00, 0x08);
*/
checkModeChange(); // by seven 030718
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
RegByteOut(0xa5,0x00); //?? disable spectrum modulation
#if USE_TCON
if ( !modeAdjustMVz() )
return MODE_OUTOFSYNC;
#elif MODE_ADJ_BY_CALCULATE
if ( !fineCalculateDCLK() )
return MODE_OUTOFSYNC;
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
#else
if (eepData.MascotFlag & FLAG_PORTB)
{
pol = RegByteIn(0x31);
RegBitOut(0x31,0x00,0x60);
}
temp = modeAdjust();
if (eepData.MascotFlag & FLAG_PORTB)
RegByteOut(0x31,pol);
if (!temp)
return MODE_OUTOFSYNC;
#endif
#if NEW_SSC_HN
#if PANEL_1280
RegByteOut(0xa5,0x13); //?? enable spectrum modulation
#else
RegByteOut(0xa5,0x11); //?? enable spectrum modulation
#endif
#elif NEW_SSC_HO
#if PANEL_1280
RegByteOut(0xa5,0x47); //?? enable spectrum modulation
#else
RegByteOut(0xa5,0x45); //?? enable spectrum modulation
#endif
#else
RegByteOut(0xa5,0x47); //?? enable spectrum modulation
#endif
if (!(eepData.MascotFlag & FLAG_PORTB))
{
#if SRC_SI151
setColorRGB(EEP_DATA); // gain
#else
setBlackLevel();
#endif
}
checkVtotal();
disableOSD();
#if AUTO_CLAMP
//adcColorTune(SELECTALL);
adcClampTune();
#endif
if (modechangeflag) // by seven 030718
return MODE_CHANGE;
if ( HsyncCnt < HSYNC_KHZ(MIN_hsync) || HsyncCnt > HSYNC_KHZ(MAX_hsync)
|| VsyncCnt > VSYNC_HZ(MIN_vsync) || VsyncCnt < VSYNC_HZ(MAX_vsync)
|| CurrentWidth > PANEL_WIDTH || CurrentHeight > PANEL_HEIGHT)
{
OutWithBackground = 1;
osdOutofsync();
}
if (eepData.MascotFlag & FLAG_POWERSTATUS)
{
dspMute(0);
miscTurnOnPower();
}
else
miscEnterSleepMode();
return CurrentMode;
}
#if (!MODE_ADJ_BY_CALCULATE)
#define MADJ_LIMIT 400
bit modeAdjust(void)
{
bit up,down,findflag;
int startValue,madj_cnt,temp;
#if CALCULATE_DCLK
char step = 3;
#else
char step = 15;
#endif
#if DEBUGMSG
printf(" ModeAdjust\n");
#endif
#if CHIMEI_M150X3
redo_madj:
step = 3;
#endif
up=0;down=0;findflag=0;
startValue=-128;
madj_cnt=0;
miscDelay(10);
RegByteOut(0x01,0x00);
madj_next:
temp = RegByteIn(0x01);
if ( temp & ((eepData.MascotFlag & FLAG_PORTB) ? 0xc9 : 0x35 ))
{
#if DEBUGMSG
printf(" Freq is changed, sync_status = %2X\n", (unsigned int)temp);
#endif
return 0;
}
RegByteOut(0x02, 0x00);
RegByteOut(0xB0, 0x80);
temp = 0;
while (RegByteIn(0xB0) & 0x80)
{
temp++;
miscDelay(2);
if (temp > 100)
goto madj_fail;
}
temp = RegByteIn(0x02);
if (temp & 0x01) goto madj_down;
if (temp & 0x02) goto madj_up;
//done
if (findflag && up)
{
if (startValue== -128)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -