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

📄 modehandle.c

📁 NOVATEK公司的LCD_CONTROLLER源代码 液晶显示器驱动板源代码NT68521
💻 C
📖 第 1 页 / 共 2 页
字号:
			if((flag3 & BIT_0) == 0){
				if(Read24C16(0xdc) == 0){
					PoSvTimer = 500;
				}
				else{
					PowerSaving();
					LED_GrnOff();
					LED_RedOn();
				}
			}
			else{
				OSD_OFF();			//Factory mode
				PoSvTimer = 500;
				value = ReadIIC_HW(Scaler_Addr,0x4d) & 0x1f;
				value >>= 2;
				if(++value > 7)
					value = 0;
				flag1 &= ~BIT_1;		//Clear fource to background
				ForceToBackground(value);	//Set fource to background
			}
		}
#ifdef MoveAltOSD
		else if(((PortD & BIT_5) != 0)&&(PoSvTimer < 400)&&((flag3 & BIT_0) == 0)){
			if(PoSvTimer == 0){
				ScalerPowerUp();
			}
			else{
				PoSvTimer = 500;
				ShowDisconnector();
				if((PortC & BIT_6) != 0){
					BackLightOn();
				}
			}
			return;
		}
		else if(((PortD & BIT_5) == 0)&&((flag2 & BIT_2) != 0)&&((flag3 & BIT_0) == 0)){
			flag1 &= ~BIT_3;		//preset no sync
			NoSync();
		}
#endif
		switch(SyncMode){
		case 0x00:		// H/V
			value = MUTE_CTRL & 0x30;
			if(value == 0x00){	//no H,V; goto SOG
				CheckSOG();
			}
			else if(value == 0x20){	//no V; goto H+V
				GoToCompositeSync();
			}
			break;
		case 0x01:		// H+V
			value = MUTE_CTRL & 0x30;
			if(value == 0x00){	//no H,V; goto SOG
				CheckSOG();
			}
			else if(value == 0x20){	//no V; goto H/V
				GoToSeparateSync();
			}
			break;
		case 0x02:		//SOG
			GoToSeparateSync();
			break;
		case 0x03:		//DVI
			DIG_SEL();
			HVI_REG = 0xE0;	// HVI_REG
#if DVImode == DEmode
			WriteIIC_HW(Scaler_Addr,0x12,0xb1);
#else
			WriteIIC_HW(Scaler_Addr,0x12,0x81);
#endif
			WriteIIC_HW(Scaler_Addr,0x86,0xc0);
			WriteIIC_HW(Scaler_Addr,0x87,0xc0);
			WriteIIC_HW(Scaler_Addr,0xd5,0x00);
			WriteIIC_HW(Scaler_Addr,0xe5,0xc0);
			WriteIIC_HW(Scaler_Addr,0xe6,0x03);
			WriteIIC_HW(Scaler_Addr,0xf8,DTF8);
			if(Panel_Interface == LVDS){
				WriteIIC_HW(Scaler_Addr,0xfe,0x02);
			}
			else if(Panel_Interface == TTL){
				WriteIIC_HW(Scaler_Addr,0xfe,0xc0);
			}
			else{
				WriteIIC_HW(Scaler_Addr,0xfe,0xc1);
			}
			if((flag3 & BIT_2) != 0x00){
				printf("DVI Input\r\n");
			}
			break;
		}
		Timer3 = 50;
		while(Timer3 != 0){
			CheckKey();
		}
	}
}

void GoToSeparateSync(void)
{
	DIG_Off();
	HVI_REG = 0xE0;	// HVI_REG
	WriteIIC_HW(Scaler_Addr,0x01,(0x48 | DT01));
//	WriteIIC_HW(Scaler_Addr,0xe8,0x80);
	WriteIIC_HW(Scaler_Addr,0x86,0xc0);
	WriteIIC_HW(Scaler_Addr,0x87,0xc0);
	WriteIIC_HW(Scaler_Addr,0xd5,0x00);
	WriteIIC_HW(Scaler_Addr,0xe6,0x03);
	WriteIIC_HW(Scaler_Addr,0xf8,DTF8);
	if(Panel_Interface == LVDS){
		WriteIIC_HW(Scaler_Addr,0xfe,0x02);
	}
	else if(Panel_Interface == TTL){
		WriteIIC_HW(Scaler_Addr,0xfe,0xc0);
	}
	else{
		WriteIIC_HW(Scaler_Addr,0xfe,0xc1);
	}
	SyncMode = 0;
	if((flag3 & BIT_2) != 0x00){
		printf("Separate Sync\r\n");
	}
}

void GoToCompositeSync(void)
{
	HVI_REG = 0xA0;	// HVI_REG
	WriteIIC_HW(Scaler_Addr,0x01,(0xd8 | DT01));
//	WriteIIC_HW(Scaler_Addr,0xe8,0xc0);
	WriteIIC_HW(Scaler_Addr,0x86,0xc0);
	WriteIIC_HW(Scaler_Addr,0x87,0x80);
	WriteIIC_HW(Scaler_Addr,0xd5,0x00);
	WriteIIC_HW(Scaler_Addr,0xe6,0x03);
	WriteIIC_HW(Scaler_Addr,0xf8,DTF8);
	if(Panel_Interface == LVDS){
		WriteIIC_HW(Scaler_Addr,0xfe,0x02);
	}
	else if(Panel_Interface == TTL){
		WriteIIC_HW(Scaler_Addr,0xfe,0xc0);
	}
	else{
		WriteIIC_HW(Scaler_Addr,0xfe,0xc1);
	}
	SyncMode = 1;
	if((flag3 & BIT_2) != 0x00){
		printf("Composite Sync\r\n");
	}
}

void CheckSOG(void)
{
	WriteIIC_HW(Scaler_Addr,0x01,(0xd8 | DT01));
//	WriteIIC_HW(Scaler_Addr,0xe8,0xc0);
	WriteIIC_HW(Scaler_Addr,0x86,0xe0);
	WriteIIC_HW(Scaler_Addr,0x87,0x00);
	WriteIIC_HW(Scaler_Addr,0xd5,0x04);
	WriteIIC_HW(Scaler_Addr,0xe6,0x7f);
	WriteIIC_HW(Scaler_Addr,0xf8,(DTF8|BIT_7));
	if(Panel_Interface == LVDS){
		WriteIIC_HW(Scaler_Addr,0xfe,0x12);
	}
	else if(Panel_Interface == TTL){
		WriteIIC_HW(Scaler_Addr,0xfe,0xd0);
	}
	else{
		WriteIIC_HW(Scaler_Addr,0xfe,0xd1);
	}
	SYNC_REG = 0x40;
	Sleep(40);
	Timer1 = 40;
	H_SYNC = 0;
	V_SYNC = 0;
	while(Timer1 != 0){
		if((PortC & BIT_2) == 0){
			V_SYNC++;
		}
		else{
			H_SYNC++;
		}
	}
	H_SYNC >>= 2;
	SYNC_REG = 0x60;
	if(H_SYNC > V_SYNC){
		HVI_REG = 0x20;	// HVI_REG
		SyncMode = 2;
		if((flag3 & BIT_2) != 0x00){
			printf("Sync on green\r\n");
		}
	}
	else{
		GoToSeparateSync();
	}
}

void NoSync(void)
{
	if((flag1 & BIT_3) == 0){
		OSD_Control &= ~BIT_0;
		WriteIIC_HW(Scaler_Addr,0x95,OSD_Control);
		flag1 |= BIT_3;
		flag2 &= 0xe1;
		flag3 &= ~BIT_1;		//in range
		BackLightOff();
		ForceToBackground(0);	//Set fource to background
		PoSvTimer = 500;
		if((flag3 & BIT_2) != 0x00){
			printf("NoSync\r\n");
		}
	}
	else if((PoSvTimer < 300)&&(PoSvTimer > 0)&&((flag2 & BIT_1)==0)){
//	else if((PoSvTimer == 0)&&((flag2 & BIT_1)==0)){
		flag2 |= BIT_1;
		ShowNoSync();
		if((PortC & BIT_6) != 0){
			BackLightOn();
		}
	}
}

void SetMinMax(void)
{
#if 0
code unsigned short TypClk[]={
	800,900,832,1040,1152,1344,1600,1800,1688,2160,1688,1688,1688,1056
};
unsigned short i,k;
unsigned char w;
	if(ModePoint >= UserModeSt){
// Set Minimum and Maximum
		i = 0x106 + (ModePoint * 8);
		i = Read24C16(i);
		HP_Max = TypClk[i] - H_Act;
		if(HP_Start > HP_Max){
			HP_Max = HP_Start;
		}
		HP_Min = (unsigned char)((TypClk[i] * 3) / 100);
		if(HP_Start < HP_Min){
			HP_Min = HP_Start;
		}
		if((HP_Start + H_Act) < (TypClk[i] - 50)){
			Clk_Min = TypClk[i] - 50;
			Clk_Max = TypClk[i] + 50;
		}
		else{
			Clk_Min = HP_Start + H_Act;
			Clk_Max = Clk_Min + 100;
		}
	}
	else{
// Set Minimum and Maximum
		i = 0x104 + (ModePoint * 8);
		k = MCU_DataMap[i];
		i++;
		k <<= 8;
		k += MCU_DataMap[i];
		w = HPW_REG;
		w = (unsigned long)H_SYNC * k / (120000 / w);
//		w = (unsigned long)H_SYNC * k / (140000 / w);
		w = (w + 4) & 0xf8;
		HP_Max = k - H_Act - w;
//		HP_Max = k - H_Act;
		if(HP_Start > HP_Max){
			HP_Max = HP_Start;
		}
		HP_Min = (unsigned char)((k * 3) / 100);
		if(HP_Start < HP_Min){
			HP_Min = HP_Start;
		}
		if((HP_Start + H_Act) < (k - 50)){
			Clk_Min = k - 50;
			Clk_Max = k + 50;
		}
		else{
			Clk_Min = HP_Start + H_Act;
			Clk_Max = Clk_Min + 100;
		}
	}
#else
unsigned short i,k;
unsigned char w;
// Set Minimum and Maximum
		i = 0x290 + (ModePoint << 1);
		k = Read24C16(i);
		i++;
		k <<= 8;
		k += Read24C16(i);
		w = HPW_REG;
		w = (unsigned long)H_SYNC * k / (120000 / w);
//		w = (unsigned long)H_SYNC * k / (140000 / w);
		w = (w + 4) & 0xf8;
		HP_Max = k - H_Act - w;
//		HP_Max = k - H_Act;
		if(HP_Start > HP_Max){
			HP_Max = HP_Start;
		}
		HP_Min = (unsigned char)((k * 3) / 100);
		if(HP_Start < HP_Min){
			HP_Min = HP_Start;
		}
		if((HP_Start + H_Act) < (k - 50)){
			Clk_Min = k - 50;
			Clk_Max = k + 50;
		}
		else{
			Clk_Min = HP_Start + H_Act;
			Clk_Max = Clk_Min + 100;
		}
		if((flag3 & BIT_2) != 0x00){
			printf("HPW = %d\r\n",(unsigned short)w);
			printf("HP_Max = %d\r\n",HP_Max);
			printf("HP_Min = %d\r\n",(unsigned short)HP_Min);
			printf("Clk_Max = %d\r\n",Clk_Max);
			printf("Clk_Min = %d\r\n",Clk_Min);
		}
#endif
}

void CheckModeChange(void)
{
#if 0
	if(((INTHV_FLG & 0x07) != 0)||((MUTE_CTRL & 0x30) != 0x30)){
		BackLightOff();
		flag2 |= BIT_0;
		H_SYNC_Temp = 0xffff;
		V_SYNC_Temp = 0xffff;
	}
#else
unsigned char value,temp;
unsigned long Freq;
	if(PowerStatus > 0x80)
		return;
	if(((INTHV_FLG & 0x07) != 0)||((MUTE_CTRL & 0x30) != 0x30)){
		BackLightOff();
		flag2 |= BIT_0;
		H_SYNC_Temp = 0xffff;
		V_SYNC_Temp = 0xffff;
		return;
	}

	flag1 |= BIT_0;
//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;
		}
	}
	if(V_SYNC_Temp > V_SYNC){
		if((V_SYNC_Temp - V_SYNC) > 3){
			BackLightOff();
			flag2 |= BIT_0;
			H_SYNC_Temp = 0xffff;
			V_SYNC_Temp = 0xffff;
			return;
		}
	}
	else{
		if((V_SYNC - V_SYNC_Temp) > 3){
			BackLightOff();
			flag2 |= BIT_0;
			H_SYNC_Temp = 0xffff;
			V_SYNC_Temp = 0xffff;
			return;
		}
	}
#endif
}

⌨️ 快捷键说明

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