scaler.lst

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

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

              				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
1234   1      
1235   1      #if PANEL != LP_LM170E01
1236   1      	dstVLockPos = (ReadIIC563(0x178) & 0xf0) >> 4 ;
1237   1      	dstHLockPos = ReadWordIIC563(0x177) & 0x0fff;
1238   1      	WriteIIC563(0x151,dstVLockPos);
1239   1      	WriteWordIIC563(0x152,dstHLockPos);
1240   1      #endif
1241   1      	
1242   1      #if Panel_Spread_Spect_En == 0xff
1243   1      	WriteIIC563(0x0f5,ReadIIC563(0x0f5)|BIT_0);
1244   1      #endif
1245   1      	WriteIIC563(0x154,temp154);	
1246   1      	if(!DetectBacklight())
1247   1      		WriteIIC563(0x154,0x02);
1248   1      	WriteWordIIC563(0x15b,dstVtotal);				// Display Vtotal
1249   1      	WriteWordIIC563(0x15e,dstHtotal);				// Display Htotal
1250   1      	#if PRINT_MESSAGE
              	Sleep(40);
              	dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
              		printf("dstHtotal = %d\n",dstHtotal);
              	#endif
1255   1      	//WriteIIC563(0x16e,0x01);	//Graphic display enable
1256   1      }
1257          
1258          void SetDPLL(unsigned long dclk)
1259          {
1260   1      #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:
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 22  

              			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
1297   1      	Byte i;
1298   1      	unsigned long temp;
1299   1      	unsigned long code DpllTab[4]={80000000,40000000,20000000,0};//{120000,60000,24000,0};
1300   1      	for(i=0;i<4;i++)
1301   1      		if(dclk > DpllTab[i])
1302   1      			break;
1303   1      	WriteIIC563(0x0f1,0x10+i);
1304   1      	if(PanelTwoPixelPerClk == 1)	//Jacky 20050107
1305   1      		WriteIIC563(0x1fb,i * 2);
1306   1      	else
1307   1      		WriteIIC563(0x1fb,i & 0xFE );
1308   1      	switch(i)
1309   1      	{
1310   2      		case 0:
1311   2      			temp = ((float)dclk / 1000) * 131072 / REFCLK;
1312   2      			break;
1313   2      		case 1:
1314   2      			temp = ((float)dclk / 1000) * 131072 / REFCLK * 2;
1315   2      			break;
1316   2      		case 2:
1317   2      			temp = ((float)dclk / 1000) * 131072 / REFCLK * 4;
1318   2      			break;
1319   2      		case 3:
1320   2      			temp = ((float)dclk / 1000) * 131072 / REFCLK * 8;
1321   2      			break;
1322   2      	};
1323   1      	//printf("dclk ratio=%lx\n",temp);
1324   1      	WriteIIC563(0x0f2,(unsigned char)temp);
1325   1      	WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
1326   1      	WriteIIC563(0x0f4,(unsigned char)(temp >> 16));
1327   1      	//WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
1328   1      	WriteIIC563(0x0f0,0x03);
1329   1      
1330   1      }
1331          /*
1332          void SetLVDS_PLL(unsigned long dclk)
1333          {
1334          	Byte i;
1335          	float A,B,C,D,E;
1336          	
1337          	A = (float)dclk/1000000;
1338          	A = 1000/A/3.5;
1339          	B = A/0.266;
1340          	C = B/2;
1341          	D = B/4;
1342          	E = A*9.6 -20.17 + D;
1343          	//E = A*9.48 -18.3;
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 23  

1344          	//E = A*8.89-17;
1345          	if(E > B)
1346          		E = E-B;
1347          	if(E > C)
1348          		E = E-C;
1349          	if(E < 0)
1350          		E = E+C;
1351          	i = ReadIIC563(0x157) & 0xe0;
1352          	WriteIIC563(0x157, i |(unsigned char)(E+0.5));
1353          }
1354          */
1355          void SetHP(void)
1356          {
1357   1      // Horizontal Start
1358   1      	WriteWordIIC563(0x034,FuncBuf[pHPOSITION]);
1359   1      	#if PRINT_MESSAGE
              		printf("HP_Start = %d\n",FuncBuf[pHPOSITION]);
              	#endif
1362   1      }
1363          
1364          void SetOsdTrans()
1365          {
1366   1      	Byte Attr,TranValue;
1367   1      	if(FuncBuf[pTRANSOSD] == 0)
1368   1      		Attr = 0;
1369   1      	else{
1370   2      		Attr = 0x10;
1371   2      		TranValue = (FuncBuf[pTRANSOSD]<<3)|(FuncBuf[pTRANSOSD]-1);
1372   2      	}
1373   1      		//for(i=0;i<4;i++)
1374   1      		//	{
1375   1      		//	WriteIIC563(0x0a5,i);
1376   1      		//	WriteIIC563(0x0aa,Attr);
1377   1      		//	}
1378   1      	WriteIIC563(0x0a5,WINDOW4);
1379   1      	WriteIIC563(0x0aa,Attr);
1380   1      	WriteWordIIC563(0x0a1,TranValue);
1381   1      }
1382          
1383          void SetVP(void)
1384          {
1385   1      // Vertical Start
1386   1      	if(Interlance)
1387   1      		{
1388   2      		WriteWordIIC563(0x030,FuncBuf[pVPOSITION]);
1389   2      		if(V_SYNC < 550)
1390   2      			WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]-1);
1391   2      		else
1392   2      			WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
1393   2      		}
1394   1      	else
1395   1      		WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
1396   1      	#if PRINT_MESSAGE
              		printf("VP_Start = %d\n",FuncBuf[pVPOSITION]);
              	#endif
1399   1      }
1400          /*
1401          void AdjVP(void)
1402          {
1403          unsigned short i;
1404          unsigned char ch;
1405          	i = ReadWordIIC563(0x162);		//PanelVActiveStart
C51 COMPILER V6.12  SCALER                                                                 03/05/2008 14:35:00 PAGE 24  

1406          	//Calculate the delay between bCapture V and Display V delay
1407          	dstVdelay = ReadWordIIC563(0x1dc) & 0x0fff;
1408          	dstVdelay += PanelHeight;
1409          	dstVdelay = ((unsigned long)VTotal * i) / dstVdelay;
1410          	if(FuncBuf[pVPOSITION] > dstVdelay)
1411          		dstVdelay = FuncBuf[pVPOSITION] - dstVdelay ;
1412          	else
1413          		dstVdelay = 1;
1414          //	printf("Vsync delay = %d lines\r\n",dstVdelay);
1415          	dstVdelay = (unsigned long)dstVdelay * 2222 / H_SYNC;	
1416          //	printf("Vsync delay = %d us\r\n",dstVdelay);
1417          	if(FuncBuf[pVPOSITION] > ReadWordIIC563(0x02e)){
1418          		ch = ReadIIC563(0x150);
1419          		i = ReadWordIIC563(0x182) & 0x0fff;
1420          		if((Hresolution == 1152)||(Hresolution== 1280))
1421          			WriteWordIIC563(0x15e,i+2);				// Display Htotal
1422          		else
1423          			WriteWordIIC563(0x15e,i+SCFactor);		// Display Htotal
1424          		WaitSync();
1425          		SetVP();
1426          
1427          		CheckRegPage(0x150);
1428          		WriteIIC_WaitVd(Scaler_Addr,0x50,(ch & ~BIT_5));
1429          		WriteIIC_WaitVd(Scaler_Addr,0x50,ch);
1430          	}
1431          	else{
1432          		ch = ReadIIC563(0x150);
1433          		i = ReadWordIIC563(0x182) & 0x0fff;
1434          		if(Hresolution == 1152)
1435          			WriteWordIIC563(0x15e,i-1);				// Display Htotal
1436          		else
1437          			WriteWordIIC563(0x15e,i-SCFactor);		// Display Htotal
1438          		WaitSync();
1439          		SetVP();
1440          		
1441          		CheckRegPage(0x150);
1442          		WriteIIC_WaitVd(Scaler_Addr,0x50,(ch & ~BIT_5));
1443          		WriteIIC_WaitVd(Scaler_Addr,0x50,ch);
1444          	}
1445          }
1446          */
1447          void SetSharpness(void)
1448          {
1449   1      	Word code H_Sharp_A[]={
1450   1      		0x1a,0x14,0x00,0x04,0x0a
1451   1      	};
1452   1      	Word code H_Sharp_D[]={
1453   1      		0x1a,0x14,0x00,0x04,0x0a
1454   1      	};
1455   1      	Word code V_Sharp[]={
1456   1      		0x00,0x00,0x00,0x03,0x05
1457   1      	};
1458   

⌨️ 快捷键说明

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