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

📄 scaler.c

📁 台湾联咏NT68663 LCD MONITOR 控制程序(完整版)
💻 C
📖 第 1 页 / 共 4 页
字号:
		if((SyncMode == 1)||(SyncMode == 2)){ //H+V SOG
			WriteIIC563(0x0d5,0x09);
		}
		else{
			if((HV_Pol & BIT_4) == 0){
				WriteIIC563(0x0d5,0x03&(~BIT_3));
			}
			else{
				WriteIIC563(0x0d5,0x03|BIT_3);
			}
		}
*/
		ch = ReadIIC563(0x0df) & 0x3f;
		PixelRate = ch;
		PixelRate <<= 8;
		ch = ReadIIC563(0x0de);
		PixelRate += ch;
		PixelRate <<= 8;
		ch = ReadIIC563(0x0dd);
		PixelRate += ch;
	}
	else{
		WriteIIC563(0x0d5,0x00);
		H_Counter = 0;
		LocalTimer = 25;
		while(LocalTimer > 0)
			{
			ch = ReadIIC563(0x0df) & 0x3f;
			PixelRate = ch;
			PixelRate <<= 8;
			ch = ReadIIC563(0x0de);
			PixelRate += ch;
			PixelRate <<= 8;
			ch = ReadIIC563(0x0dd);
			PixelRate += ch;
			if(abs(PixelRate - H_Counter) > 2)
				{
				H_Counter = PixelRate;
				LocalTimer = 25;
				}
			if(DetectBacklight())	//waiting for pll stable
			//if(!VideoMute)
				break;
			}
	}
	
		#if PRINT_MESSAGE
			printf("Hcounter = %x %x\r\n",(unsigned short)(PixelRate>>16),(unsigned short)PixelRate);
		#endif
		temp = ((float)FuncBuf[pCLOCK] * 536870912) / PixelRate;
		PixelRate = temp;
		#if PRINT_MESSAGE
			printf("DSS = %x %x\r\n",(unsigned short)(PixelRate>>16),(unsigned short)PixelRate);
		#endif
		for(k; k>0; k--)
			PixelRate <<= 1;
		WriteIIC563(0x0d2,(unsigned char)PixelRate);
		WriteIIC563(0x0d3,(unsigned char)(PixelRate>>8));
		WriteIIC563(0x0d4,(unsigned char)(PixelRate>>16));
//		WriteIIC563(0x0d3,(unsigned char)(PixelRate>>8));
//		IIC_Start();
//		IIC_Tx(SCALER_ADDR);
//		IIC_Tx(0xd4);
//		IIC_TxV((Byte)(PixelRate>>16));
//		IIC_Stop();
		WriteIIC563(0x0d7,(Byte)FuncBuf[pCLOCK]);
		WriteIIC563(0x0d8,(Byte)(FuncBuf[pCLOCK]>>8));
//
		if((SyncMode == 1)||(SyncMode == 2)||(SyncMode == 5)||(SyncMode == 6)){ //H+V SOG
			WriteIIC563(0x0d5,0x09);
		}
		else{
		#if 0
			if((HV_Pol & BIT_4) == 0)
				WriteIIC563(0x0d5,0x03&(~BIT_3));
			else
				WriteIIC563(0x0d5,0x03|BIT_3);
		#else
			WriteIIC563(0x0d5,0x0b);
		#endif
		}
//	}
}
#endif

void SetScaler(void)
{
	unsigned char dstVLockPos,temp154,ch;
	unsigned short DispActiveHeight,dstVtotal,dstHtotal,dstHLockPos;//i,DV_HFreq
	unsigned long dclk;
	float temp;
#if PANEL == QD170E1
	Byte k;
#endif

#if PANEL == CMO_M170ES05 || PANEL == FLC48SXC8V_10|| PANEL == CMO_M170E4_L01
	Word Hr; 
#endif
#if PANEL == Samsung_LTM170E4_L01
		Word Hr; 
#endif
#if PANEL == LP_LM170E01
		xdata unsigned short Hr,Hr2,Ht,Hr_diff1,Hr_diff2; 
		//xdata unsigned char ch;
		xdata unsigned long temp2;
#endif
#if PANEL == AU_L170EN05 || PANEL == Samsung_LTM213U4_L01||PANEL == Sharp_FG170M1LA04
		xdata unsigned short Hr,Hr2; 
		xdata unsigned long temp2;
#endif

	ch = ReadIIC563(0x020);
	if(ReadIIC563(0x19a) & BIT_2){
		Interlance = 1;
		WriteIIC563(0x020,ch|BIT_2);
		}
	else{
		Interlance = 0;
		WriteIIC563(0x020,ch);
	}

	if(SyncMode != 3)
		{
		SetHP();
		SetVP();
		}
//	H_Act = H_ActiveTab[ResolutionPtr];
	#if PRINT_MESSAGE
		printf("Resolution = %d x %d\r\n",Hresolution,Vresolution);
	#endif
	WriteWordIIC563(0x032,Vresolution);		// Capture V_Active
	WriteWordIIC563(0x036,Hresolution);		// Capture H_Active
	WriteWordIIC563(0x175,PanelWidth);		// Display H_Active
#if 1
	// DCLK
		dclk = ((unsigned long)PanelHeight * VTotal / Vresolution) * V_SYNC * PanelMinHTotal / 10;	//kHz
		if(Interlance){
			dclk <<= 1;
		}
		DispActiveHeight = PanelHeight; 			// set the vertical active height to the Panel Height
		dstHtotal = PanelMinHTotal;
	// calculate dst vtotal
		dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / Vresolution + 8) >> 4; //add .5 for rounding, make even
	
		//if(dclk < PanelMinPClk){							
		//	dstHtotal = PanelTypHTotal;
		//}
		//else if(dclk > PanelMaxPClk){
		//	dstHtotal = PanelLowHTotal;
		//}
//		if(H_SYNC < 240)
			temp = ((float)dstHtotal-0.1) * PanelHeight * 4096 / H_Counter / Vresolution;
//		else if(H_SYNC < 480)
//			temp = ((float)dstHtotal-0.1) * PanelHeight * 8192 / H_Counter / Vresolution;
//		else
//			temp = ((float)dstHtotal-0.1) * PanelHeight * 16384 / H_Counter / Vresolution;
		//temp = (float)dstHtotal * PanelHeight * 4096 / H_Counter / Vresolution;
		dclk = (unsigned long)(temp * 12000000);
		if(Interlance){
			dclk <<= 1;
		}
	//	temp = ((float)dstHtotal-0.5) * PanelHeight * 4096 / H_Counter / Vresolution;
	//	dclk = (unsigned long)(temp * 12000000);
	#if PRINT_MESSAGE
	printf("Hcounter = %x %x\r\n",(unsigned short)(H_Counter>>16),(unsigned short)H_Counter);
	printf("DCLK = %ld\n",dclk);
	#endif
#else
// DCLK
	dclk = ((unsigned long)PanelHeight * VTotal / Vresolution) * V_SYNC * PanelMinHTotal / 10;	//Hz
	if(Interlance)
		dclk = dclk*2;
	DispActiveHeight = PanelHeight;				// set the vertical active height to the Panel Height
/*
	if(dclk > PanelMaxPClk){                            
		DispActiveHeight = (unsigned long)PanelHeight * PanelMaxPClk / dclk;
		dclk = PanelMaxPClk;
	}
*/
	dclk = dclk / 1000 - 1;
	dclk = (dclk + 2) * 1000;
// calculate new dst vtotal
	dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / Vresolution + 8) >> 4;	//add .5 for rounding, make even	
	if(Interlance)
		dstVtotal = dstVtotal*2;
	if(dstVtotal < PanelMinVTotal){
		dstVtotal = PanelMinVTotal;
		DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC );
		dclk = ((unsigned long)DV_HFreq * PanelMinHTotal) / 10;	//Hz
		dclk = dclk / 1000 - 1;
		dclk = (dclk + 2) * 1000;
	}
	else{
// HFreq
		DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC);
	}
// Htotal
	dstHtotal = PanelMaxHTotal;
	for(i=PanelMinHTotal; i<PanelMaxHTotal; i=i+2){
		temp = ((unsigned long)DV_HFreq * i) / 10;		//KHz
		if(dclk > temp){
			temp = dclk - temp;
		}
		else{
			temp = temp - dclk;
		}
		if(temp < 100){
			break;
		}
	}
	dstHtotal = i;
#endif
	#if PRINT_MESSAGE
		printf("DCLK = 0x%x 0x%x\n",(unsigned short)(dclk >> 16),(unsigned short)dclk);
		printf("DispActiveHeight = %d\n",DispActiveHeight);
		printf("DispHFreq = %d\n",DV_HFreq);
		printf("dstVtotal = %d\n",dstVtotal);
		printf("dstHtotal = %d\n",dstHtotal);
	#endif
	SetDPLL(dclk);

#if Panel_Spread_Spect_En == 0xff
	WriteIIC563(0x0f5,ReadIIC563(0x0f5) & (~BIT_0));
#endif
	temp154 = ReadIIC563(0x154);
	WriteIIC563(0x154,temp154 & 0xfc);	//Normal display

#if PANEL == QD170E1
	//WriteIIC563(0x154,0x00);
	//temp159 = ReadIIC563(0x159);
	//WriteIIC563(0x159,temp159&0xbf);	//Disable fast mute
	WaitSetup(8);
	for(k = 0; k < 20; k++)
	{
		dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
		if((dstHtotal % 4) != 0){
			temp = (float)dclk * ((dstHtotal % 4));
			temp = temp / ((unsigned long)dstHtotal);
			dclk -= temp;
			SetDPLL(dclk);
			//WriteIIC563(0x159,temp159); //Reset fast mute
			WaitSetup(8);
		}
	}
#endif
#if PANEL == Samsung_LTM170E4_L01
	//temp159 = ReadIIC563(0x159);
	//WriteIIC563(0x159,temp159&0xbf);	//Disable fast mute
	WaitSetup(8);
	dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
	WriteWordIIC563(0x15e,dstHtotal);				// Display Htotal

	Hr = ReadWordIIC563(0x184);
	if(Hr < 0x80){
		temp = (float)dclk * (abs((unsigned long)0x80-Hr));
		temp = temp / ((unsigned long)PanelHeight*dstHtotal);
		dclk += temp;
		SetDPLL(dclk);
		//printf("DCLK5 = %ld\r\n",dclk);
	}
	else if (Hr > (PanelHeight - 0x80)){
		temp = (float)dclk * (abs((unsigned long)Hr-0x380));
		temp = temp / ((unsigned long)PanelHeight*dstHtotal);
		dclk -= temp;
		SetDPLL(dclk);
		//printf("DCLK6 = %ld\r\n",dclk);
	}
	WaitSetup(8);
#endif

#if PANEL == CMO_M170ES05 || PANEL == FLC48SXC8V_10|| PANEL == CMO_M170E4_L01
//-------------------------------------------------- 
// For SSC enable 
	//WriteIIC563(0x154,0x00);
	//temp159 = ReadIIC563(0x159);
	//WriteIIC563(0x159,temp159&0xbf);	//Disable fast mute
	WaitSetup(8);
	dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
	
	/*
	Hr = ReadWordIIC563(0x184) & 0x0fff;
	temp = (float)dclk * (abs((unsigned long)0x100-Hr));
	temp = temp / ((unsigned long)PanelHeight*dstHtotal);
	if(0x100 > Hr)
		dclk += temp;
	else
		dclk -= temp;
	//WriteIIC563(0x159,temp159);	//Reset fast mute
	SetDPLL(dclk);
*/
	Hr = ReadWordIIC563(0x184);
	i = PanelHeight - 0x80 + 0x0d;
	if(Hr < 0x8d){
		temp = (float)dclk * (abs((unsigned long)0x8d-Hr));
		temp = temp / ((unsigned long)PanelHeight*dstHtotal);
		dclk += temp;
		SetDPLL(dclk);
	}
	else if (Hr > i){
		temp = (float)dclk * (abs((unsigned long)Hr-i));
		temp = temp / ((unsigned long)PanelHeight*dstHtotal);
		dclk -= temp;
		SetDPLL(dclk);
	}
//---------------------------------------------------
#endif

#if PANEL == AU_L170EN05
	WaitSetup(8);
	Hr = ReadIIC563(0x184)+(ReadIIC563(0x185)*256); //read R1
	//printf("Hr = %x = %u\n",Hr,Hr);
	dstHtotal = ReadIIC563(0x183) & 0x0f;
	dstHtotal <<= 8;
	dstHtotal |= ReadIIC563(0x182);
	dstVtotal = (ReadIIC563(0x1dd) & 0x0f) << 8;
	dstVtotal += ReadIIC563(0x1dc);
	dstVtotal += PanelHeight; 
	//printf("Htotal=%x = %u\n",dstHtotal,dstHtotal);
	//printf("Vtotal=%x = %u\n",dstVtotal,dstVtotal);
	WriteWordIIC563(0x15e,dstHtotal);
	WriteIIC563(0x150,(DisplayControl & ~BIT_5));
	WriteIIC563(0x186,0x12);
	WaitSetup(8);
	Hr2 = ReadIIC563(0x184)+(ReadIIC563(0x185)*256); //read R2
	//printf("Hr2 = %x = %u\n",Hr2,Hr2);
	if (Hr2 < 0xa8){
		i = 0xa8 - Hr2;
		if ((Hr-0x0d+(unsigned long)i*PanelHeight/dstVtotal) < 0x80)
			i = i + ((unsigned long)0x80 - (Hr-0x0d))*dstVtotal/PanelHeight;
		else if ((Hr-0x0d+(unsigned long)i*PanelHeight/dstVtotal) > 0x380)
			i = i + ((unsigned long)PanelHeight - (Hr-0x0d) + 0x80)*dstVtotal/PanelHeight;
	}
	else if (Hr2 > (dstHtotal - 0x58)){
		i = dstHtotal - Hr2 + 0xa8;
		if ((Hr-0x0d+(unsigned long)i*PanelHeight/dstVtotal) < 0x80)
			i = i + ((unsigned long)0x80 - (Hr-0x0d))*dstVtotal/PanelHeight;
		else if ((Hr-0x0d+(unsigned long)i*PanelHeight/dstVtotal) > 0x380)
			i = i + ((unsigned long)PanelHeight - (Hr-0x0d) + 0x80)*dstVtotal/PanelHeight;
	}
	else {
		i = 0;
		if ((Hr-0x0d) < 0x80){
			i = i + ((unsigned long)0x80 - (Hr-0x0d))*dstVtotal/PanelHeight;
			Hr2 = Hr2 + i;
			if (Hr2 >= dstHtotal)
				Hr2 = Hr2 - dstHtotal;
			if (	Hr2 < 0xa8)
				i = i + 0xa8 - Hr2;
			else if (Hr2 > (dstHtotal - 0x58))
				i = i + dstHtotal - Hr2 + 0xa8;
		}
		else if ((Hr-0x0d) > 0x380){
			i = i + (PanelHeight - (Hr-0x0d) + (unsigned long)0x80)*dstVtotal/PanelHeight;
			Hr2 = Hr2 + i;
			if (Hr2 < dstVtotal)
				Hr2 = Hr2 + dstHtotal- dstVtotal;
			else
				Hr2 = Hr2 - dstVtotal;
			if (Hr2 >= dstHtotal)
				Hr2 = Hr2 - dstHtotal;
			if (Hr2 < 0xa8)
				i = i + 0xa8 - Hr2;
			else if (Hr2 > (dstHtotal - 0x58))
				i = i + dstHtotal - Hr2 + 0xa8;
		}
	}
	temp = dclk * ((float)i);
	//printf("temp=%lu\n",temp);
	temp2 = temp / ((unsigned long)dstVtotal*dstHtotal);
	//printf("temp2=%lu\n",temp2);
	dclk += temp2;
	//	printf("Dclk1=%lu\n",dclk);
	SetDPLL(dclk);
	WaitSetup(8);
	WriteIIC563(0x150,(DisplayControl));
	WriteIIC563(0x186,0x00);
	WaitSetup(8);
#endif
#if PANEL == Samsung_LTM213U4_L01|| PANEL == Sharp_FG170M1LA04
	WaitSetup(8);
	Hr = ReadIIC563(0x184)+(ReadIIC563(0x185)*256); //read R1
	//printf("Hr = %x = %u\n",Hr,Hr);
	dstHtotal = ReadIIC563(0x183) & 0x0f;
	dstHtotal <<= 8;
	dstHtotal |= ReadIIC563(0x182);
	dstVtotal = (ReadIIC563(0x1dd) & 0x0f) << 8;
	dstVtotal += ReadIIC563(0x1dc);
	dstVtotal += PanelHeight; 
	//printf("Htotal=%x = %u\n",dstHtotal,dstHtotal);
	//printf("Vtotal=%x = %u\n",dstVtotal,dstVtotal);
	WriteWordIIC563(0x15e,dstHtotal);
	WriteIIC563(0x150,(DisplayControl & ~BIT_5));
	WriteIIC563(0x186,0x12);
	WaitSetup(8);
	Hr2 = ReadIIC563(0x184)+(ReadIIC563(0x185)*256); //read R2
	//printf("Hr2 = %x = %u\n",Hr2,Hr2);
	temp2=(unsigned long)dstHtotal*i+Hr2;
	i=(unsigned short)(temp2 & 0x7ff);
	if (Hr < (0x80 + 0x0d))
	{
		Hr2 = ((float)0x80+0x0d-Hr)*dstVtotal/PanelHeight;
		i= i+ Hr2;
		i= i & 0xffff;
		if((((i/2)&0xfff)<=0x000)&&(((i/2)&0xfff)>=0x0e0))  // 0x2aa flicker; 0x406 first line error
		{
			i=0x32a-i+ Hr2;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk+=temp;
		}
		else if((((i/2)&0xfff)<=0x720)&&(((i/2)&0xfff)>=0x700))
		{
			i=0x486-i+ Hr2;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk+=temp;
		}
		else
		{
			i=Hr2;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk+=temp;
		}
	}		
	else if (Hr > (PanelHeight -0x80 + 0x0d))
	{
		Hr2 = ((float)Hr -(PanelHeight-0x80+0x0d))*dstVtotal/PanelHeight;
		i= i- Hr2;
		i= i & 0x7ff;
		if((((i/2)&0xfff)<=0x000)&&(((i/2)&0xfff)>=0x0e0))  // 0x2aa flicker; 0x406 first line error
		{
			i=i-0x22a+ Hr2;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk-=temp;
		}
		else if((((i/2)&0xfff)<=0x720)&&(((i/2)&0xfff)>=0x700))
		{
			i=i-0x386+ Hr2;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk-=temp;
		}
		else
		{
			i=Hr2;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk-=temp;
		}
	}		
	else if (Hr < (PanelHeight/2))
	{
		if((((i/2)&0xfff)<=0x000)&&(((i/2)&0xfff)>=0x0e0))  // 0x2aa flicker; 0x406 first line error
		{
			i=0x32a-i;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk+=temp;
		}
		else if((((i/2)&0xfff)<=0x720)&&(((i/2)&0xfff)>=0x700))
		{
			i=0x486-i;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk+=temp;
		}
		else
		{
			i=0;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk+=temp;
		}
	}		
	else
	{
		if((((i/2)&0xfff)<=0x000)&&(((i/2)&0xfff)>=0x0e0))  // 0x2aa flicker; 0x406 first line error
		{
			i=i-0x22a;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk-=temp;
		}
		else if((((i/2)&0xfff)<=0x720)&&(((i/2)&0xfff)>=0x700))
		{
			i=i-0x386;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk-=temp;
		}
		else
		{
			i=0;
			temp= (float)dclk *i;
			temp=temp/dstVtotal/dstHtotal;
			dclk-=temp;
		}
	}		

	SetDPLL(dclk);
	WaitSetup(8);
	WriteIIC563(0x150,(DisplayControl));
	WriteIIC563(0x186,0x00);
	WaitSetup(8);
#endif

#if PANEL == LP_LM170E01
			
			Hr = ReadWordIIC563(0x184);
	//		printf("Hr1 = %d\r\n",Hr);
	//		printf("DCLK1 = %ld\r\n",dclk);
			Ht = (((unsigned long)PanelHeight*(dstHtotal-1)) + Hr) / Vresolution ;
	//		printf("Ht = %d\r\n",Ht);
		
			WriteIIC563(0x186,0x12);	//read Hr2
			WriteIIC563(0x150,(DisplayControl & ~BIT_5));		//manual HTotal 
	
			WaitSetup(8);
			//if(H_SYNC_Temp == 0xffff){
			//	WriteIIC563(0x150,DisplayControl);		//fifo auto lock, auto HTotal
			//	Reg0x154 = 0x02;
			//	goto ERROR;
			//}
	
			Hr2 = ReadWordIIC563(0x184);
	//		printf("Hr2 = %d\r\n",Hr2);
			dstVtotal = ReadWordIIC563(0x1dc) & 0x0fff;
			dstVtotal += PanelHeight;
			WriteWordIIC563(0x15b,dstVtotal);		// Display Vtotal
	//		printf("dstVtotal 1 = %d\r\n",dstVtotal);
		
			if((Hresolution == 1152)||(Hresolution == 1280))
	//		if(H_ActiveTab[Resolution] == 1152)
				SCFactor = 1;
			else
				SCFactor = (Ht+(dstVtotal/2))/dstVtotal;
	//		printf("SCFactor = %bd\r\n",SCFactor);
	
			Hr_diff1 = abs(Hr2 - (abs(Ht - ((SCFactor)*dstVtotal))+100));
			Hr_diff2 = dstHtotal - Hr2 + (abs(Ht - ((SCFactor)*dstVtotal))+100);
	//		printf("Hr_diff1 = %d\r\n",Hr_diff1);
	//		printf("Hr_diff2 = %d\r\n",Hr_diff2);
		
			if(Hr_diff1 > Hr_diff2){
				temp2 = (unsigned long)Hr_diff2 * PanelHeight / dstVtotal;
				if(((Hr + temp2) > PanelHeight) && (Hr_diff2 > (dstHtotal - dstVtotal))){
					Hr_diff2 = Hr_diff2 - (dstHtotal - dstVtotal);
					temp2 = (unsigned long)Hr_diff2 * PanelHeight / dstVtotal;
					if((Hr + temp2) <= (PanelHeight + 0x0d)){
						temp2 = PanelHeight + 0x1d - (Hr + temp2);
						Hr_diff2 = Hr_diff2 + (unsigned long)temp2 * dstVtotal / PanelHeight;
					}
				}
				temp = (float)dclk * Hr_diff2;
				temp2 = temp / dstVtotal / dstHtotal;
				dclk += temp2;
	//			printf("temp = %f\r\n",temp);
	//			printf("Hr_diff2 = %d\r\n",Hr_diff2);
	//			printf("DCLK2 = %ld\r\n",dclk);

⌨️ 快捷键说明

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