scaler.lst

来自「台湾联咏NT68663 LCD MONITOR 控制程序(完整版)」· LST 代码 · 共 1,527 行 · 第 1/5 页

LST
1,527
字号
              		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;
              				}
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 11  

              			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
 646          
 647          void SetScaler(void)
 648          {
 649   1      	unsigned char dstVLockPos,temp154,ch;
 650   1      	unsigned short DispActiveHeight,dstVtotal,dstHtotal,dstHLockPos;//i,DV_HFreq
 651   1      	unsigned long dclk;
 652   1      	float temp;
 653   1      #if PANEL == QD170E1
              	Byte k;
              #endif
 656   1      
 657   1      #if PANEL == CMO_M170ES05 || PANEL == FLC48SXC8V_10|| PANEL == CMO_M170E4_L01
              	Word Hr; 
              #endif
 660   1      #if PANEL == Samsung_LTM170E4_L01
 661   1      		Word Hr; 
 662   1      #endif
 663   1      #if PANEL == LP_LM170E01
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 12  

              		xdata unsigned short Hr,Hr2,Ht,Hr_diff1,Hr_diff2; 
              		//xdata unsigned char ch;
              		xdata unsigned long temp2;
              #endif
 668   1      #if PANEL == AU_L170EN05 || PANEL == Samsung_LTM213U4_L01||PANEL == Sharp_FG170M1LA04
              		xdata unsigned short Hr,Hr2; 
              		xdata unsigned long temp2;
              #endif
 672   1      
 673   1      	ch = ReadIIC563(0x020);
 674   1      	if(ReadIIC563(0x19a) & BIT_2){
 675   2      		Interlance = 1;
 676   2      		WriteIIC563(0x020,ch|BIT_2);
 677   2      		}
 678   1      	else{
 679   2      		Interlance = 0;
 680   2      		WriteIIC563(0x020,ch);
 681   2      	}
 682   1      
 683   1      	if(SyncMode != 3)
 684   1      		{
 685   2      		SetHP();
 686   2      		SetVP();
 687   2      		}
 688   1      //	H_Act = H_ActiveTab[ResolutionPtr];
 689   1      	#if PRINT_MESSAGE
              		printf("Resolution = %d x %d\r\n",Hresolution,Vresolution);
              	#endif
 692   1      	WriteWordIIC563(0x032,Vresolution);		// Capture V_Active
 693   1      	WriteWordIIC563(0x036,Hresolution);		// Capture H_Active
 694   1      	WriteWordIIC563(0x175,PanelWidth);		// Display H_Active
 695   1      #if 1
 696   1      	// DCLK
 697   1      		dclk = ((unsigned long)PanelHeight * VTotal / Vresolution) * V_SYNC * PanelMinHTotal / 10;	//kHz
 698   1      		if(Interlance){
 699   2      			dclk <<= 1;
 700   2      		}
 701   1      		DispActiveHeight = PanelHeight; 			// set the vertical active height to the Panel Height
 702   1      		dstHtotal = PanelMinHTotal;
 703   1      	// calculate dst vtotal
 704   1      		dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / Vresolution + 8) >> 4; //add .5 for rou
             -nding, make even
 705   1      	
 706   1      		//if(dclk < PanelMinPClk){							
 707   1      		//	dstHtotal = PanelTypHTotal;
 708   1      		//}
 709   1      		//else if(dclk > PanelMaxPClk){
 710   1      		//	dstHtotal = PanelLowHTotal;
 711   1      		//}
 712   1      //		if(H_SYNC < 240)
 713   1      			temp = ((float)dstHtotal-0.1) * PanelHeight * 4096 / H_Counter / Vresolution;
 714   1      //		else if(H_SYNC < 480)
 715   1      //			temp = ((float)dstHtotal-0.1) * PanelHeight * 8192 / H_Counter / Vresolution;
 716   1      //		else
 717   1      //			temp = ((float)dstHtotal-0.1) * PanelHeight * 16384 / H_Counter / Vresolution;
 718   1      		//temp = (float)dstHtotal * PanelHeight * 4096 / H_Counter / Vresolution;
 719   1      		dclk = (unsigned long)(temp * 12000000);
 720   1      		if(Interlance){
 721   2      			dclk <<= 1;
 722   2      		}
 723   1      	//	temp = ((float)dstHtotal-0.5) * PanelHeight * 4096 / H_Counter / Vresolution;
 724   1      	//	dclk = (unsigned long)(temp * 12000000);
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 13  

 725   1      	#if PRINT_MESSAGE
              	printf("Hcounter = %x %x\r\n",(unsigned short)(H_Counter>>16),(unsigned short)H_Counter);
              	printf("DCLK = %ld\n",dclk);
              	#endif
 729   1      #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 roun
             -ding, 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
 774   1      	#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
 781   1      	SetDPLL(dclk);
 782   1      
 783   1      #if Panel_Spread_Spect_En == 0xff
 784   1      	WriteIIC563(0x0f5,ReadIIC563(0x0f5) & (~BIT_0));
 785   1      #endif
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 14  

 786   1      	temp154 = ReadIIC563(0x154);
 787   1      	WriteIIC563(0x154,temp154 & 0xfc);	//Normal display
 788   1      
 789   1      #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
 807   1      #if PANEL == Samsung_LTM170E4_L01
 808   1      	//temp159 = ReadIIC563(0x159);
 809   1      	//WriteIIC563(0x159,temp159&0xbf);	//Disable fast mute
 810   1      	WaitSetup(8);
 811   1      	dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
 812   1      	WriteWordIIC563(0x15e,dstHtotal);				// Display Htotal
 813   1      
 814   1      	Hr = ReadWordIIC563(0x184);
 815   1      	if(Hr < 0x80){
 816   2      		temp = (float)dclk * (abs((unsigned long)0x80-Hr));
 817   2      		temp = temp / ((unsigned long)PanelHeight*dstHtotal);
 818   2      		dclk += temp;
 819   2      		SetDPLL(dclk);
 820   2      		//printf("DCLK5 = %ld\r\n",dclk);
 821   2      	}
 822   1      	else if (Hr > (PanelHeight - 0x80)){
 823   2      		temp = (float)dclk * (abs((unsigned long)Hr-0x380));
 824   2      		temp = temp / ((unsigned long)PanelHeight*dstHtotal);
 825   2      		dclk -= temp;
 826   2      		SetDPLL(dclk);
 827   2      		//printf("DCLK6 = %ld\r\n",dclk);
 828   2      	}
 829   1      	WaitSetup(8);
 830   1      #endif
 831   1      
 832   1      #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
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 15  

              		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

⌨️ 快捷键说明

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