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

📄 scaler.c

📁 台湾联咏NT68663 LCD MONITOR 控制程序(完整版)
💻 C
📖 第 1 页 / 共 4 页
字号:
			}
			else{
				if(Hr2 > (abs(Ht - ((SCFactor)*dstVtotal))+100)){
					temp2 = (unsigned long)Hr_diff1*PanelHeight/dstVtotal;
					if(Hr < temp2 && Hr_diff1 > (dstHtotal-dstVtotal))
						Hr_diff1 = Hr_diff1-(dstHtotal-dstVtotal);	
					temp = (float)dclk * Hr_diff1;
					temp2 = temp / dstVtotal / dstHtotal;
					dclk -= temp2;
	//				printf("temp = %f\r\n",temp);
	//				printf("Hr_diff1 = %d\r\n",Hr_diff1);
	//				printf("DCLK3 = %ld\r\n",dclk);
				}
				else{
					temp2 = (unsigned long)Hr_diff1*PanelHeight/dstVtotal;
					if((Hr + temp2) > PanelHeight && Hr_diff1 > (dstHtotal-dstVtotal)){
						Hr_diff1 = Hr_diff1-(dstHtotal-dstVtotal);	
						temp2 = (unsigned long)Hr_diff1*PanelHeight/dstVtotal;
						if ((Hr + temp2) <= (PanelHeight + 0x0d)){
							temp2 = PanelHeight + 0x1d - (Hr + temp2);
							Hr_diff2 = Hr_diff1 + (unsigned long)temp2*dstVtotal/PanelHeight;
						}
					}
					temp = (float)dclk * Hr_diff1;
					temp2 = temp / dstVtotal / dstHtotal;
					dclk += temp2;
	//				printf("temp = %f\r\n",temp);
	//				printf("Hr_diff1 = %d\r\n",Hr_diff1);
	//				printf("DCLK4 = %ld\r\n",dclk);
				}
			}
			SetDPLL(dclk);
		
			WriteIIC563(0x150,DisplayControl);		//fifo auto lock, auto HTotal 
			WriteIIC563(0x186,0x00);
	
			WaitSetup(8);
			//if(H_SYNC_Temp == 0xffff){
			//	WriteIIC563(0x150,DisplayControl);		//fifo auto lock, auto HTotal 
			//	Reg0x154 = 0x02;
			//	goto ERROR;
			//}
		
			Hr = ReadWordIIC563(0x184);
			if(Hr < 0x80){
				temp = (float)dclk * (abs(0x80-Hr));
				temp2 = temp / ((unsigned long)PanelHeight*dstHtotal);
				dclk += temp2;
				SetDPLL(dclk);
	//			printf("temp = %f\r\n",temp);
	//			printf("DCLK5 = %ld\r\n",dclk);
				WaitSetup(8);
				//if(H_SYNC_Temp != 0xffff){
				//	Reg0x154 = 0x02;
				//	goto ERROR;
				//}
			}
			else if (Hr > (PanelHeight - 0x80)){
				temp = (float)dclk * (abs(Hr-0x380));
				temp2 = temp / ((unsigned long)PanelHeight*dstHtotal);
				dclk -= temp2;
				SetDPLL(dclk);
	//			printf("temp = %f\r\n",temp);
	//			printf("DCLK6 = %ld\r\n",dclk);
				WaitSetup(8);
				//if(H_SYNC_Temp != 0xffff){
				//	Reg0x154 = 0x02;
				//	goto ERROR;
				//}
			}
			if(SyncMode != 3){
				Hr = ReadWordIIC563(0x184);
				dstVLockPos = (ReadIIC563(0x178) & 0xf0) >> 4 ;
				dstHLockPos = ReadIIC563(0x178) & 0x0f;
				dstHLockPos <<= 8;
				dstHLockPos = dstHLockPos + ReadIIC563(0x177);
				if(ResolutionPtr == 13)	//1280x1024
					dstVLockPos += 1;
				else if(Hresolution == 1280){	//1280x...
					if((dstHLockPos + 0x200) > Hresolution)
						dstVLockPos += 1;
					else
						if(Hr < 0x100)
							dstHLockPos = 0;
						else if(Hr < 0x200)
							dstHLockPos = 0xc0;
						else if(Hr < 0x300)
							dstHLockPos = 0x200;
						else
							dstHLockPos = 0x300;
				}
				else if(Hresolution == 1024){	//1024x...
					if(Hr < 0x200 && Hr > 0x100)
						dstHLockPos += 0xa0;
					else if(Hr >= 0x200)
						dstHLockPos += 0x200;
				}
				else if((Hr > 0x200) &&  Hresolution != 1152){	//1152x...
					if((dstHLockPos + 0x200) > Hresolution)
						dstVLockPos += 1;
					else
						dstHLockPos += 0x200;
				}
				
				WriteIIC563(0x151,dstVLockPos);
				WriteWordIIC563(0x152,dstHLockPos); 	
				WriteIIC563(0x150,(DisplayControl & ~BIT_6));		//fifo manual lock
		//		printf("dstVLockPos = %d\r\n",dstVLockPos);
		//		printf("dstHLockPos = %d\r\n",dstHLockPos);
			}
#endif

#if PANEL != LP_LM170E01
	dstVLockPos = (ReadIIC563(0x178) & 0xf0) >> 4 ;
	dstHLockPos = ReadWordIIC563(0x177) & 0x0fff;
	WriteIIC563(0x151,dstVLockPos);
	WriteWordIIC563(0x152,dstHLockPos);
#endif
	
#if Panel_Spread_Spect_En == 0xff
	WriteIIC563(0x0f5,ReadIIC563(0x0f5)|BIT_0);
#endif
	WriteIIC563(0x154,temp154);	
	if(!DetectBacklight())
		WriteIIC563(0x154,0x02);
	WriteWordIIC563(0x15b,dstVtotal);				// Display Vtotal
	WriteWordIIC563(0x15e,dstHtotal);				// Display Htotal
	#if PRINT_MESSAGE
	Sleep(40);
	dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
		printf("dstHtotal = %d\n",dstHtotal);
	#endif
	//WriteIIC563(0x16e,0x01);	//Graphic display enable
}

void SetDPLL(unsigned long dclk)
{
#if 0
	Byte i;
	unsigned long temp,temp2;
	unsigned long code DpllTab[4]={100000,50000,25000,0};
	for(i=0;i<4;i++)
		if(dclk > DpllTab[i])
			break;
	WriteIIC563(0x0f0,0x00);
	WriteIIC563(0x0f1,0x10+i);
	temp = dclk / 1000;
	temp2 = dclk % 1000;
	switch(i)
		{
		case 0:
			temp2 = temp2 * 131072 / REFCLK ;
			temp = temp * 100 * 131072 / REFCLK;
			break;
		case 1:
			temp2 = temp2 * 131072 / REFCLK * 2;
			temp = temp * 100 * 131072 / REFCLK * 2;
			break;
		case 2:
			temp2 = temp2 * 131072 / REFCLK * 4;
			temp = temp * 100 * 131072 / REFCLK * 4;
			break;
		case 3:
			temp2 = (dclk % 1000) * 131072 / REFCLK * 8;
			temp = (dclk / 10) * 131072 / (REFCLK/10) * 8;
			break;
		};
	temp = temp * 10 + temp2;
	WriteIIC563(0x0f2,(unsigned char)temp);
	WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
	WriteIIC563(0x0f4,(unsigned char)(temp >> 16));
	//WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
	WriteIIC563(0x0f0,0x23);
#endif
	Byte i;
	unsigned long temp;
	unsigned long code DpllTab[4]={80000000,40000000,20000000,0};//{120000,60000,24000,0};
	for(i=0;i<4;i++)
		if(dclk > DpllTab[i])
			break;
	WriteIIC563(0x0f1,0x10+i);
	if(PanelTwoPixelPerClk == 1)	//Jacky 20050107
		WriteIIC563(0x1fb,i * 2);
	else
		WriteIIC563(0x1fb,i & 0xFE );
	switch(i)
	{
		case 0:
			temp = ((float)dclk / 1000) * 131072 / REFCLK;
			break;
		case 1:
			temp = ((float)dclk / 1000) * 131072 / REFCLK * 2;
			break;
		case 2:
			temp = ((float)dclk / 1000) * 131072 / REFCLK * 4;
			break;
		case 3:
			temp = ((float)dclk / 1000) * 131072 / REFCLK * 8;
			break;
	};
	//printf("dclk ratio=%lx\n",temp);
	WriteIIC563(0x0f2,(unsigned char)temp);
	WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
	WriteIIC563(0x0f4,(unsigned char)(temp >> 16));
	//WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
	WriteIIC563(0x0f0,0x03);

}
/*
void SetLVDS_PLL(unsigned long dclk)
{
	Byte i;
	float A,B,C,D,E;
	
	A = (float)dclk/1000000;
	A = 1000/A/3.5;
	B = A/0.266;
	C = B/2;
	D = B/4;
	E = A*9.6 -20.17 + D;
	//E = A*9.48 -18.3;
	//E = A*8.89-17;
	if(E > B)
		E = E-B;
	if(E > C)
		E = E-C;
	if(E < 0)
		E = E+C;
	i = ReadIIC563(0x157) & 0xe0;
	WriteIIC563(0x157, i |(unsigned char)(E+0.5));
}
*/
void SetHP(void)
{
// Horizontal Start
	WriteWordIIC563(0x034,FuncBuf[pHPOSITION]);
	#if PRINT_MESSAGE
		printf("HP_Start = %d\n",FuncBuf[pHPOSITION]);
	#endif
}

void SetOsdTrans()
{
	Byte Attr,TranValue;
	if(FuncBuf[pTRANSOSD] == 0)
		Attr = 0;
	else{
		Attr = 0x10;
		TranValue = (FuncBuf[pTRANSOSD]<<3)|(FuncBuf[pTRANSOSD]-1);
	}
		//for(i=0;i<4;i++)
		//	{
		//	WriteIIC563(0x0a5,i);
		//	WriteIIC563(0x0aa,Attr);
		//	}
	WriteIIC563(0x0a5,WINDOW4);
	WriteIIC563(0x0aa,Attr);
	WriteWordIIC563(0x0a1,TranValue);
}

void SetVP(void)
{
// Vertical Start
	if(Interlance)
		{
		WriteWordIIC563(0x030,FuncBuf[pVPOSITION]);
		if(V_SYNC < 550)
			WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]-1);
		else
			WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
		}
	else
		WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
	#if PRINT_MESSAGE
		printf("VP_Start = %d\n",FuncBuf[pVPOSITION]);
	#endif
}
/*
void AdjVP(void)
{
unsigned short i;
unsigned char ch;
	i = ReadWordIIC563(0x162);		//PanelVActiveStart
	//Calculate the delay between bCapture V and Display V delay
	dstVdelay = ReadWordIIC563(0x1dc) & 0x0fff;
	dstVdelay += PanelHeight;
	dstVdelay = ((unsigned long)VTotal * i) / dstVdelay;
	if(FuncBuf[pVPOSITION] > dstVdelay)
		dstVdelay = FuncBuf[pVPOSITION] - dstVdelay ;
	else
		dstVdelay = 1;
//	printf("Vsync delay = %d lines\r\n",dstVdelay);
	dstVdelay = (unsigned long)dstVdelay * 2222 / H_SYNC;	
//	printf("Vsync delay = %d us\r\n",dstVdelay);
	if(FuncBuf[pVPOSITION] > ReadWordIIC563(0x02e)){
		ch = ReadIIC563(0x150);
		i = ReadWordIIC563(0x182) & 0x0fff;
		if((Hresolution == 1152)||(Hresolution== 1280))
			WriteWordIIC563(0x15e,i+2);				// Display Htotal
		else
			WriteWordIIC563(0x15e,i+SCFactor);		// Display Htotal
		WaitSync();
		SetVP();

		CheckRegPage(0x150);
		WriteIIC_WaitVd(Scaler_Addr,0x50,(ch & ~BIT_5));
		WriteIIC_WaitVd(Scaler_Addr,0x50,ch);
	}
	else{
		ch = ReadIIC563(0x150);
		i = ReadWordIIC563(0x182) & 0x0fff;
		if(Hresolution == 1152)
			WriteWordIIC563(0x15e,i-1);				// Display Htotal
		else
			WriteWordIIC563(0x15e,i-SCFactor);		// Display Htotal
		WaitSync();
		SetVP();
		
		CheckRegPage(0x150);
		WriteIIC_WaitVd(Scaler_Addr,0x50,(ch & ~BIT_5));
		WriteIIC_WaitVd(Scaler_Addr,0x50,ch);
	}
}
*/
void SetSharpness(void)
{
	Word code H_Sharp_A[]={
		0x1a,0x14,0x00,0x04,0x0a
	};
	Word code H_Sharp_D[]={
		0x1a,0x14,0x00,0x04,0x0a
	};
	Word code V_Sharp[]={
		0x00,0x00,0x00,0x03,0x05
	};
	unsigned char H_value,V_value;
	if(SyncMode != 3)
		H_value = H_Sharp_A[FuncBuf[pSHARPNESS] & 0x0f];
	else
		H_value = H_Sharp_D[FuncBuf[pSHARPNESS] & 0x0f];
	V_value = V_Sharp[FuncBuf[pSHARPNESS] & 0x0f];
	WriteIIC563(0x060,H_value);
	WriteIIC563(0x066,V_value);
/*
unsigned char value;
	value = FuncBuf[pSHARPNESS] & 0x07;
	if(FuncBuf[pSHARPNESS] > 0x07){
		WriteIIC563(0x060,value);
		WriteIIC563(0x066,value);
	}
	else{
		value = 7 - value;
		value |= BIT_7;
		WriteIIC563(0x060,value);
		WriteIIC563(0x066,value);
	}
*/	
	#if PRINT_MESSAGE
		printf("FuncBuf[pSHARPNESS] = %d\n",(unsigned short)H_value);
	#endif
}

void SetBrightness(void)
{
	Byte value;
	//value = FuncBuf[pBRIGHTNESS];
	value = 78 + FuncBuf[pBRIGHTNESS];
	if(value > 0x7f)
		value &= 0x7f;
	else
		value |= 0x80;
	WriteIIC563(0x061,0x0c);
	WriteIIC563(0x062,value);

	#if PRINT_MESSAGE
		printf("FuncBuf[pBRIGHTNESS] of ASIC = %x\n",value);
	#endif
}

void SetContrast(void)
{
#if ContrastBlock == sRGBGain
	sRGB((Byte)FuncBuf[pCONTRAST],(Byte)FuncBuf[pRCOLOR],(Byte)FuncBuf[pGCOLOR],(Byte)FuncBuf[pBCOLOR]);
#else

	Word value,k;
	#if PRINT_MESSAGE
		printf("FuncBuf[pCONTRAST] = %x\n",(unsigned short)FuncBuf[pCONTRAST]);
	#endif
	k = FuncBuf[pCONTRAST] + 78;		//78 ---- 178
	value = FuncBuf[pRCOLOR];
	value = (unsigned short)value * k / 128;
	WriteIIC563(0x061,0x0d);
	WriteIIC563(0x063,value);
	#if PRINT_MESSAGE
		printf("R of ASIC = %x\n",(unsigned short)value);
	#endif
	value = FuncBuf[pGCOLOR];
	value = (unsigned short)value * k / 128;
	WriteIIC563(0x061,0x0e);
	WriteIIC563(0x063,value);
	#if PRINT_MESSAGE
		printf("G of ASIC = %x\n",(unsigned short)value);
	#endif
	value = FuncBuf[pBCOLOR];
	value = (unsigned short)value * k / 128;
	WriteIIC563(0x061,0x0f);
	WriteIIC563(0x063,value);
	#if PRINT_MESSAGE
		printf("B of ASIC = %x\n",(unsigned short)value);
	#endif

#endif
 }

void ForceToBackground(Byte color_r,Byte color_g,Byte color_b)
{
	unsigned char temp;
	
	if((ForceToBack == 0)||(FactMode!= 0)){
		ForceToBack = 1;
	#if PRINT_MESSAGE
		printf("Force To Background R %x\n",(unsigned short)color_r);
		printf("Force To Background G %x\n",(unsigned short)color_g);
		printf("Force To Background B %x\n",(unsigned short)color_b);
	#endif
		WriteIIC563(0x16b,color_r);
		WriteIIC563(0x16c,color_g);
		WriteIIC563(0x16d,color_b);
		temp = ReadIIC563(0x159);
		WriteIIC563(0x159,temp&0xa0);	//RGB
		WriteIIC563(0x154,0x02);
	}
}

void SetDisplayNormal(void)
{

	Byte ch;
	
	WriteIIC563(0x1a9,0x00);
	ch = ReadIIC563(0x101);
	WriteIIC563(0x101,ch|BIT_5);	//chip warm reset
	//Sleep(20);
	WriteIIC563(0x101,ch);	//chip warm reset
	
#if DVImode == DEmode
	// Jacky 20040623 For DE mode scaler shut down
	if(SyncMode == 3)	//DVI
	{
		WriteIIC563(0x1a9,0x00);	//disable IRQ interrupt
		ch = ReadIIC563(0x196);
		WriteIIC563(0x196,0x94);
		Sleep(20);
		WriteIIC563(0x196,ch&(~BIT_7));
		//Sleep(20);
	}
#endif
	Sleep(50);
	//-------------------------
	WriteIIC563(0x1ab,0x3f);	//clear IRQ
	WriteIIC563(0x1ac,0x1f);
	WriteIIC563(0x1a9,0x3c);
	
	LoadADC_Gain();
	//for NR when DVI input NR need disable jacky 20041202
	if(SyncMode == 3)	//DVI
	{
		WriteIIC563(0x068,0x00);
		WriteIIC563(0x06a,0x00);
	}
	else
	{
		WriteIIC563(0x068,0x7a);
		WriteIIC563(0x06a,0xd2);
	}
	//WriteIIC563(0x069,0x32);
	ForceToBack = 0;
//	ForceToBackground(0,0,0);	//Set fource to background
	WriteIIC563(0x159,ReadIIC563(0x159)&0xa0);	//RGB
	WriteIIC563(0x154,0x00);	//comeback to image
	WriteIIC563(0x16e,0x07);	//Graphic display enable
	SetAudioMute();
	SetLightHS();
	SetLightHW();
	SetLightVS();
	SetLightVH();

	#if PRINT_MESSAGE
		printf("Set Display Normal\n");
	#endif
}

void PowerSaving(void)
{
//	unsigned char temp;
	
	ForceToBackground(0,0,0);
	//FastMuteOn();
	WriteIIC563(0x154,0x09);	//lo_cs 930309 
	BackLightOff();
	//-----save BackLightTime-----------------------------------------
	SaveBackLightTime();
	Sleep(PowerDownInvTiming);
	ScalerPowerDown();
	PowerDown = 1;
	#if PRINT_MESSAGE
		printf("Power Saving\n");
	#endif
}

void ScalerPowerDown(void)
{
	// for NT68563 Power Down process
	unsigned char temp;
	//temp = ReadIIC563(0x16e);
	//WriteIIC563(0x16e,temp&(~BIT_0));	
	AUDIO_MUTE();
	WriteIIC563(0x101,0xD7);

//	temp = ReadIIC563(0x208);
//	WriteIIC563(0x208,temp&(~BIT_4));
	
	Sleep(PowerDownPanelTiming);
	//DC2DCPowerOff();
	WaitSetup(5);
	PanelPowerOff();		// panle power off
	Sleep(5);
	WriteIIC563(0x101,0x07);
	// Jacky 20040906 for LVDS power down and pull low the LVDS pad
	WriteIIC563(0x1f7,0x00);	//Power down LVDS buffer
	WriteIIC563(0x1f5,0x16);	//Pull low the LVDS pad	
	WriteIIC563(0x102,0x00);
	WriteIIC563(0x0f0,0x00);
	WriteIIC563(0x143,0xa0);	//Power down DVI Pll
	WriteIIC563(0x144,0x01);	//Power down DVI impedance circuit
	WriteIIC563(0x146,0xb3);	//Power down DVI SCDT detect
	temp = ReadIIC563(0x00e);
	WriteIIC563(0x00e,temp & 0xf8); // power down ADC R/G/B channel
#if PRINT_MESSAGE
	   printf("Power Down OK\n");
#endif
}

void ScalerPowerUp(void)
{
	unsigned char temp;
	PanelPowerOn();
	Sleep(PowerUpPanelTiming);
	LED_GrnOn();
	LED_RedOff();
	PowerDown = 0;
	SetInterface();
	temp = ReadIIC563(0x00e);
	WriteIIC563(0x00e,temp | 0x07);
	WriteIIC563(0x150,DisplayControl);
	SetBrightness();
	LoadADC_Gain();
	SetContrast();
	#if PRINT_MESSAGE
		printf("WakeUp\n");

⌨️ 快捷键说明

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