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

📄 modehandle.c

📁 车载DVD的主控MCU的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*==========================================
==========================================*/
#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 + -