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

📄 modehandle.c

📁 NOVATEK公司的LCD_CONTROLLER源代码 液晶显示器驱动板源代码NT68521
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "F63REG.H"
#include "stdio.h"
#include "RAM.H"
#include "ModeHandle.H"
#include "MyDef.H"
#include "UserAdj.H"
#include "IIC.H"
#include "Scaler.H"
#include "MCU.H"
#include "PANEL.H"
#include "AutoAdj.H"
#include "OSD.H"
#include "ROM_MAP.H"

#define MoveAltOSD

void GetCounter(void)
{
unsigned char value,temp;
unsigned long Freq;
// VGA/DVI Connector
// Connected
	value = INTHV_FLG & 0x47;		//V sync
	if(value != 0){
		INTHV_FLG = 0xc7;
		flag1 |= BIT_0;
//bit4==>H_pol, bit5==>V_pol
		HV_Pol = 0;
		value = HVI_REG & 0x03;
		if((value & BIT_0) != 0)
			HV_Pol |= BIT_5;
		if((value & BIT_1) != 0)
			HV_Pol |= BIT_4;
//H_SYNC=xx.xKHz
		temp = HCNT_LB;
		value = HCNT_HB;
		if((value & BIT_7) != 0){
			H_SYNC = 0;
			flag1 &= ~BIT_0;
		}
		else{
			H_SYNC = value & 0x0f;
			H_SYNC <<= 8;
			H_SYNC = H_SYNC | temp;
			if((H_SYNC == 0x0fff)||(H_SYNC == 0)){
				H_SYNC = 0;
				flag1 &= ~BIT_0;
			}
			else{
			    Freq = (unsigned long)H_SYNC * 100000;
			    H_SYNC = (unsigned int)(((Freq / 32768) + 5) / 10);
			}
		}
//V_SYNC=xx.xHz
		temp = VCNT_LB;
		value = VCNT_HB;
		if((value & BIT_7) != 0){
			V_SYNC = 0;
			flag1 &= ~BIT_0;
		}
		else{
			V_SYNC = value & 0x3f;
			V_SYNC <<= 8;
			V_SYNC = V_SYNC | temp;
			if((V_SYNC == 0x3fff)||(V_SYNC == 0)){
				V_SYNC = 0;
				flag1 &= ~BIT_0;
			}
			else{
			    Freq = (unsigned long)12500000 / V_SYNC + 5;
				V_SYNC = Freq / 10;
			}
		}
	}
	else{
		if((MUTE_CTRL & 0x30) != 0x30){
			flag1 &= ~BIT_0;
		}
	}
}

void CheckFreq(void)
{
//	Timer4 = 0;
	Timer3 = 100;
	do{
		GetCounter();
		if(((flag1 & BIT_0)==0)||(Timer3 == 0)){
			NoSync();
			return;
		}
		else{
			if((flag1 & BIT_3) != 0){
				if((SyncMode == 2) && ((flag2 & BIT_4) == 0)){
					flag1 &= ~BIT_0;
					flag2 |= BIT_4;
					return;
				}
				ScalerPowerUp();
			}
		}
		if(HV_Pol_Temp != HV_Pol){
			BackLightOff();
			ForceToBackground(0);	//Set fource to background
			HV_Pol_Temp = HV_Pol;
			Timer4 = SyncStabTime;
			OSD_OFF();
			flag1 |= BIT_4;
			if((flag3 & BIT_2) != 0x00)
				printf("HV_Pol Change\r\n");
		}
		if(H_SYNC_Temp > H_SYNC){
			if((H_SYNC_Temp - H_SYNC) > 10){
				BackLightOff();
				ForceToBackground(0);	//Set fource to background
				H_SYNC_Temp = H_SYNC;
				Timer4 = SyncStabTime;
				OSD_OFF();
				flag1 |= BIT_4;
				if((flag3 & BIT_2) != 0x00)
					printf("H_SYNC Change %d\r\n",(unsigned short)H_SYNC);
			}
		}
		else{
			if((H_SYNC - H_SYNC_Temp) > 10){
				BackLightOff();
				ForceToBackground(0);	//Set fource to background
				H_SYNC_Temp = H_SYNC;
				Timer4 = SyncStabTime;
				OSD_OFF();
				flag1 |= BIT_4;
				if((flag3 & BIT_2) != 0x00)
					printf("H_SYNC Change %d\r\n",(unsigned short)H_SYNC);
			}
		}
		if(V_SYNC_Temp > V_SYNC){
			if((V_SYNC_Temp - V_SYNC) > 10){
				BackLightOff();
				ForceToBackground(0);	//Set fource to background
				V_SYNC_Temp = V_SYNC;
				Timer4 = SyncStabTime;
				OSD_OFF();
				flag1 |= BIT_4;
				if((flag3 & BIT_2) != 0x00)
					printf("V_SYNC Change %d\r\n",(unsigned short)V_SYNC);
			}
		}
		else{
			if((V_SYNC - V_SYNC_Temp) > 10){
				BackLightOff();
				ForceToBackground(0);	//Set fource to background
				V_SYNC_Temp = V_SYNC;
				Timer4 = SyncStabTime;
				OSD_OFF();
				flag1 |= BIT_4;
				if((flag3 & BIT_2) != 0x00)
					printf("V_SYNC Change %d\r\n",(unsigned short)V_SYNC);
			}
		}
	}while(Timer4 != 0);
	if((flag1 & BIT_4) != 0){
		flag1 &= ~BIT_4;
		GetMode();
		SetMinMax();
		CheckModeChange();
		if(H_SYNC_Temp == 0xffff){
			return;
		}
		if((flag3 & BIT_1) == 0){
			SetDisplayNormal();
			if(Read24C16(0xdb) != 0){
//				if((PortC & BIT_6) != 0){
//					Sleep(PowerUpInvTiming);
					BackLightOn();
//				}
				AutoTune();
			}
//			ShowInputSource();
			SetVolume();
		}
		else{
			ShowOutOfRange();
			BackLightOn();
		}
//		if((PortC & BIT_6) != 0){
//			Sleep(PowerUpInvTiming);
//			BackLightOn();
//		}
	}
#ifdef MoveAltOSD
	else{
		if(((flag3 & BIT_1) != 0)&&(OutOfRangeTimer < 400)&&(OutOfRangeTimer > 0)){
			ShowOutOfRange();
		}
	}
#endif
}

void GetMode(void)
{
unsigned char ch;
unsigned short i,j,value;
#if 0
	ch = ReadIIC_HW(Scaler_Addr,0x87);
	if((ch & BIT_4) == 0){
		flag3 &= ~BIT_6;
		WriteIIC_HW(Scaler_Addr,0x13,0x00);
		if((flag3 & BIT_2) != 0x00){
			printf("Non-Interlace mode\r\n");
		}
	}
	else{
		flag3 |= BIT_6;
		WriteIIC_HW(Scaler_Addr,0x13,0x31);
		if((flag3 & BIT_2) != 0x00){
			printf("Interlace mode\r\n");
		}
	}
#endif
	ModePoint = 0;
	VTotal = (unsigned short)(((unsigned long)H_SYNC * 1000)/ V_SYNC);
	for(j=0; j< ModeButtom; j=j+4){
		i = j;
		ch = Read24C16(i);	//check h_sync
		value = ch;
		value = value << 8;
		i++;
		ch = Read24C16(i);
		value = value + ch;
		i++;
		if((H_SYNC < (value + 10))&&(H_SYNC > (value - 10))){
			ch = Read24C16(i);	// check hv_pol
			value = ch & 0x0f;
			value = value << 8;
			ch = ch & 0x30;
			i++;
			if(ch == HV_Pol){
				ch = Read24C16(i);	// check v_sync
				value = value + ch;
				i++;
				if((V_SYNC < (value + 10))&&(V_SYNC > (value - 10))){
					if((flag3 & BIT_2) != 0x00){
						printf("Mode %d\r\n",(unsigned short)ModePoint);
					}
					break;
				}
			}
		}
		ModePoint++;
	}
	if(ModePoint >= ModeNum){
		if((flag3 & BIT_2) != 0x00){
			printf("user's mode\r\n");
		}
		SetUserMode();
	}
	LoadModeDependentSettings();
	i = 0x106 + (ModePoint * 8);
	i = Read24C16(i);
	VP_Max = (unsigned char)(VTotal - V_ActiveTab[i] + 20);
	if(VP_Max < VP_Start)
		VP_Max = (unsigned char)VP_Start;
	if((flag3 & BIT_2) != 0x00){
		printf("HV_Pol= %x\r\n",(unsigned short)HV_Pol);
		printf("H_SYNC= %d\r\n",H_SYNC);
		printf("V_SYNC= %d\r\n",V_SYNC);
		printf("VP_Max = %d\r\n",(unsigned short)VP_Max);
	}
/*
	if((SyncMode == 2)||(SyncMode == 1)){	//sog,h+v
		WriteIIC_HW(Scaler_Addr,0x01,(0xd8 | DT01));
		WriteIIC_HW(Scaler_Addr,0xe8,0xc0);
	}
	else{
		WriteIIC_HW(Scaler_Addr,0x01,(0x48 | DT01));
		WriteIIC_HW(Scaler_Addr,0xe8,0x80);
	}
*/
	SetADC_PLL();
	if((flag3 & BIT_1) == 0){
		SetScaler();
		if(SyncMode != 3){
			SetADC_Phase();
			SetSharpness();
		}
	}
#if DVImode == DEmode
	VP_Start = 0;
	HP_Start = 0;
	WriteWordIIC_HW(Scaler_Addr,0x14,VP_Start);
	WriteWordIIC_HW(Scaler_Addr,0x18,HP_Start);
#else
	if((SyncMode == 3) && ((PortD & BIT_2) != 0))	//DVI
		AutoPosition();
#endif
}

void SetUserMode(void)
{
code unsigned short Vt_Tab[]={
	500,600,700,768,850,950,1050,1080
};

code unsigned char UserTimeTab[]={
	0x00,0x10,0x00,0x60,0x03,0x84,0x01,0x10,	//720x400
	0x00,0x10,0x00,0x50,0x06,0x80,0x02,0x10,	//640x480
	0x00,0x10,0x00,0x98,0x04,0x18,0x03,0x10,	//800x600
	0x00,0x10,0x00,0xe0,0x06,0xc0,0x0c,0x10,	//1280x720
	0x00,0x10,0x00,0xd0,0x05,0x40,0x05,0x10,	//1024x768
	0x00,0x10,0x00,0xd0,0x06,0x40,0x06,0x10,	//1152x864
	0x00,0x10,0x00,0xe0,0x06,0xc0,0x07,0x10,	//1280x960
	0x00,0x10,0x00,0xf8,0x06,0x98,0x08,0x10,	//1280x1024
	0x00,0x2e,0x01,0x30,0x08,0x70,0x09,0x10		//over (1600x1200)
};

unsigned short addr;
unsigned char i,j,k;
	if((flag3 & BIT_2) != 0x00){
		printf("Vtotal = %d\r\n",VTotal);
	}	
	if((flag3 & BIT_6) != 0){
		addr = VTotal << 1;
	}
	else{
		addr = VTotal;
	}
	j = 8;
	for(i=0; i<8; i++){
		if(addr < Vt_Tab[i]){
			j = i;
			break;
		}
	}
	j = j * 8;
	ModePoint = Read24C16(0xd2);
	ModePoint++;
	if(ModePoint >= ModeNum){
		ModePoint = UserModeSt - 1;
	}
	Write24C16(0xd2,ModePoint);
	if((flag3 & BIT_2) != 0x00){
		printf("UserModePoint =  %d\r\n",(unsigned short)ModePoint);
	}
	addr = 0x100 + (ModePoint * 8);
	for(i=0; i<8; i++){
		k = UserTimeTab[j];
		Write24C16(addr,k);
		if((flag3 & BIT_2) != 0x00){
			printf("Data %x = %x\r\n",(unsigned short)i,(unsigned short)k);
		}
		addr++;
		j++;
	}
	addr = ModePoint * 4;
	k = H_SYNC >> 8;
	Write24C16(addr,k);
	addr++;
	k = H_SYNC;
	Write24C16(addr,k);
	addr++;
	k = V_SYNC >> 8;
	k |= HV_Pol;
	Write24C16(addr,k);
	addr++;
	k = V_SYNC;
	Write24C16(addr,k);
	addr = 0x290 + (ModePoint << 1);
	j = j - 4;
	k = UserTimeTab[j];
	Write24C16(addr,k);
	addr++;
	j++;
	k = UserTimeTab[j];
	Write24C16(addr,k);
}

void SyncSource(void)
{
unsigned char value;
	if((flag1 & BIT_3) != 0){
		if((PoSvTimer == 0)&&((PortC & BIT_6) == 0)){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -