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 + -
显示快捷键?