📄 scaler.c
字号:
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 + -