⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mode.c

📁 采用台湾MRT晶捷公司的MRT4方案的液晶电视的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************
 *                                              *
 *      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 + -