📄 scaler.c
字号:
}
else{
if(Hr2 > (abs(Ht - ((SCFactor)*dstVtotal))+100)){
temp2 = (unsigned long)Hr_diff1*PanelHeight/dstVtotal;
if(Hr < temp2 && Hr_diff1 > (dstHtotal-dstVtotal))
Hr_diff1 = Hr_diff1-(dstHtotal-dstVtotal);
temp = (float)dclk * Hr_diff1;
temp2 = temp / dstVtotal / dstHtotal;
dclk -= temp2;
// printf("temp = %f\r\n",temp);
// printf("Hr_diff1 = %d\r\n",Hr_diff1);
// printf("DCLK3 = %ld\r\n",dclk);
}
else{
temp2 = (unsigned long)Hr_diff1*PanelHeight/dstVtotal;
if((Hr + temp2) > PanelHeight && Hr_diff1 > (dstHtotal-dstVtotal)){
Hr_diff1 = Hr_diff1-(dstHtotal-dstVtotal);
temp2 = (unsigned long)Hr_diff1*PanelHeight/dstVtotal;
if ((Hr + temp2) <= (PanelHeight + 0x0d)){
temp2 = PanelHeight + 0x1d - (Hr + temp2);
Hr_diff2 = Hr_diff1 + (unsigned long)temp2*dstVtotal/PanelHeight;
}
}
temp = (float)dclk * Hr_diff1;
temp2 = temp / dstVtotal / dstHtotal;
dclk += temp2;
// printf("temp = %f\r\n",temp);
// printf("Hr_diff1 = %d\r\n",Hr_diff1);
// printf("DCLK4 = %ld\r\n",dclk);
}
}
SetDPLL(dclk);
WriteIIC563(0x150,DisplayControl); //fifo auto lock, auto HTotal
WriteIIC563(0x186,0x00);
WaitSetup(8);
//if(H_SYNC_Temp == 0xffff){
// WriteIIC563(0x150,DisplayControl); //fifo auto lock, auto HTotal
// Reg0x154 = 0x02;
// goto ERROR;
//}
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;
}
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
#if PANEL != LP_LM170E01
dstVLockPos = (ReadIIC563(0x178) & 0xf0) >> 4 ;
dstHLockPos = ReadWordIIC563(0x177) & 0x0fff;
WriteIIC563(0x151,dstVLockPos);
WriteWordIIC563(0x152,dstHLockPos);
#endif
#if Panel_Spread_Spect_En == 0xff
WriteIIC563(0x0f5,ReadIIC563(0x0f5)|BIT_0);
#endif
WriteIIC563(0x154,temp154);
if(!DetectBacklight())
WriteIIC563(0x154,0x02);
WriteWordIIC563(0x15b,dstVtotal); // Display Vtotal
WriteWordIIC563(0x15e,dstHtotal); // Display Htotal
#if PRINT_MESSAGE
Sleep(40);
dstHtotal = ReadWordIIC563(0x182) & 0x0fff;
printf("dstHtotal = %d\n",dstHtotal);
#endif
//WriteIIC563(0x16e,0x01); //Graphic display enable
}
void SetDPLL(unsigned long dclk)
{
#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:
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
Byte i;
unsigned long temp;
unsigned long code DpllTab[4]={80000000,40000000,20000000,0};//{120000,60000,24000,0};
for(i=0;i<4;i++)
if(dclk > DpllTab[i])
break;
WriteIIC563(0x0f1,0x10+i);
if(PanelTwoPixelPerClk == 1) //Jacky 20050107
WriteIIC563(0x1fb,i * 2);
else
WriteIIC563(0x1fb,i & 0xFE );
switch(i)
{
case 0:
temp = ((float)dclk / 1000) * 131072 / REFCLK;
break;
case 1:
temp = ((float)dclk / 1000) * 131072 / REFCLK * 2;
break;
case 2:
temp = ((float)dclk / 1000) * 131072 / REFCLK * 4;
break;
case 3:
temp = ((float)dclk / 1000) * 131072 / REFCLK * 8;
break;
};
//printf("dclk ratio=%lx\n",temp);
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,0x03);
}
/*
void SetLVDS_PLL(unsigned long dclk)
{
Byte i;
float A,B,C,D,E;
A = (float)dclk/1000000;
A = 1000/A/3.5;
B = A/0.266;
C = B/2;
D = B/4;
E = A*9.6 -20.17 + D;
//E = A*9.48 -18.3;
//E = A*8.89-17;
if(E > B)
E = E-B;
if(E > C)
E = E-C;
if(E < 0)
E = E+C;
i = ReadIIC563(0x157) & 0xe0;
WriteIIC563(0x157, i |(unsigned char)(E+0.5));
}
*/
void SetHP(void)
{
// Horizontal Start
WriteWordIIC563(0x034,FuncBuf[pHPOSITION]);
#if PRINT_MESSAGE
printf("HP_Start = %d\n",FuncBuf[pHPOSITION]);
#endif
}
void SetOsdTrans()
{
Byte Attr,TranValue;
if(FuncBuf[pTRANSOSD] == 0)
Attr = 0;
else{
Attr = 0x10;
TranValue = (FuncBuf[pTRANSOSD]<<3)|(FuncBuf[pTRANSOSD]-1);
}
//for(i=0;i<4;i++)
// {
// WriteIIC563(0x0a5,i);
// WriteIIC563(0x0aa,Attr);
// }
WriteIIC563(0x0a5,WINDOW4);
WriteIIC563(0x0aa,Attr);
WriteWordIIC563(0x0a1,TranValue);
}
void SetVP(void)
{
// Vertical Start
if(Interlance)
{
WriteWordIIC563(0x030,FuncBuf[pVPOSITION]);
if(V_SYNC < 550)
WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]-1);
else
WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
}
else
WriteWordIIC563(0x02e,FuncBuf[pVPOSITION]);
#if PRINT_MESSAGE
printf("VP_Start = %d\n",FuncBuf[pVPOSITION]);
#endif
}
/*
void AdjVP(void)
{
unsigned short i;
unsigned char ch;
i = ReadWordIIC563(0x162); //PanelVActiveStart
//Calculate the delay between bCapture V and Display V delay
dstVdelay = ReadWordIIC563(0x1dc) & 0x0fff;
dstVdelay += PanelHeight;
dstVdelay = ((unsigned long)VTotal * i) / dstVdelay;
if(FuncBuf[pVPOSITION] > dstVdelay)
dstVdelay = FuncBuf[pVPOSITION] - dstVdelay ;
else
dstVdelay = 1;
// printf("Vsync delay = %d lines\r\n",dstVdelay);
dstVdelay = (unsigned long)dstVdelay * 2222 / H_SYNC;
// printf("Vsync delay = %d us\r\n",dstVdelay);
if(FuncBuf[pVPOSITION] > ReadWordIIC563(0x02e)){
ch = ReadIIC563(0x150);
i = ReadWordIIC563(0x182) & 0x0fff;
if((Hresolution == 1152)||(Hresolution== 1280))
WriteWordIIC563(0x15e,i+2); // Display Htotal
else
WriteWordIIC563(0x15e,i+SCFactor); // Display Htotal
WaitSync();
SetVP();
CheckRegPage(0x150);
WriteIIC_WaitVd(Scaler_Addr,0x50,(ch & ~BIT_5));
WriteIIC_WaitVd(Scaler_Addr,0x50,ch);
}
else{
ch = ReadIIC563(0x150);
i = ReadWordIIC563(0x182) & 0x0fff;
if(Hresolution == 1152)
WriteWordIIC563(0x15e,i-1); // Display Htotal
else
WriteWordIIC563(0x15e,i-SCFactor); // Display Htotal
WaitSync();
SetVP();
CheckRegPage(0x150);
WriteIIC_WaitVd(Scaler_Addr,0x50,(ch & ~BIT_5));
WriteIIC_WaitVd(Scaler_Addr,0x50,ch);
}
}
*/
void SetSharpness(void)
{
Word code H_Sharp_A[]={
0x1a,0x14,0x00,0x04,0x0a
};
Word code H_Sharp_D[]={
0x1a,0x14,0x00,0x04,0x0a
};
Word code V_Sharp[]={
0x00,0x00,0x00,0x03,0x05
};
unsigned char H_value,V_value;
if(SyncMode != 3)
H_value = H_Sharp_A[FuncBuf[pSHARPNESS] & 0x0f];
else
H_value = H_Sharp_D[FuncBuf[pSHARPNESS] & 0x0f];
V_value = V_Sharp[FuncBuf[pSHARPNESS] & 0x0f];
WriteIIC563(0x060,H_value);
WriteIIC563(0x066,V_value);
/*
unsigned char value;
value = FuncBuf[pSHARPNESS] & 0x07;
if(FuncBuf[pSHARPNESS] > 0x07){
WriteIIC563(0x060,value);
WriteIIC563(0x066,value);
}
else{
value = 7 - value;
value |= BIT_7;
WriteIIC563(0x060,value);
WriteIIC563(0x066,value);
}
*/
#if PRINT_MESSAGE
printf("FuncBuf[pSHARPNESS] = %d\n",(unsigned short)H_value);
#endif
}
void SetBrightness(void)
{
Byte value;
//value = FuncBuf[pBRIGHTNESS];
value = 78 + FuncBuf[pBRIGHTNESS];
if(value > 0x7f)
value &= 0x7f;
else
value |= 0x80;
WriteIIC563(0x061,0x0c);
WriteIIC563(0x062,value);
#if PRINT_MESSAGE
printf("FuncBuf[pBRIGHTNESS] of ASIC = %x\n",value);
#endif
}
void SetContrast(void)
{
#if ContrastBlock == sRGBGain
sRGB((Byte)FuncBuf[pCONTRAST],(Byte)FuncBuf[pRCOLOR],(Byte)FuncBuf[pGCOLOR],(Byte)FuncBuf[pBCOLOR]);
#else
Word value,k;
#if PRINT_MESSAGE
printf("FuncBuf[pCONTRAST] = %x\n",(unsigned short)FuncBuf[pCONTRAST]);
#endif
k = FuncBuf[pCONTRAST] + 78; //78 ---- 178
value = FuncBuf[pRCOLOR];
value = (unsigned short)value * k / 128;
WriteIIC563(0x061,0x0d);
WriteIIC563(0x063,value);
#if PRINT_MESSAGE
printf("R of ASIC = %x\n",(unsigned short)value);
#endif
value = FuncBuf[pGCOLOR];
value = (unsigned short)value * k / 128;
WriteIIC563(0x061,0x0e);
WriteIIC563(0x063,value);
#if PRINT_MESSAGE
printf("G of ASIC = %x\n",(unsigned short)value);
#endif
value = FuncBuf[pBCOLOR];
value = (unsigned short)value * k / 128;
WriteIIC563(0x061,0x0f);
WriteIIC563(0x063,value);
#if PRINT_MESSAGE
printf("B of ASIC = %x\n",(unsigned short)value);
#endif
#endif
}
void ForceToBackground(Byte color_r,Byte color_g,Byte color_b)
{
unsigned char temp;
if((ForceToBack == 0)||(FactMode!= 0)){
ForceToBack = 1;
#if PRINT_MESSAGE
printf("Force To Background R %x\n",(unsigned short)color_r);
printf("Force To Background G %x\n",(unsigned short)color_g);
printf("Force To Background B %x\n",(unsigned short)color_b);
#endif
WriteIIC563(0x16b,color_r);
WriteIIC563(0x16c,color_g);
WriteIIC563(0x16d,color_b);
temp = ReadIIC563(0x159);
WriteIIC563(0x159,temp&0xa0); //RGB
WriteIIC563(0x154,0x02);
}
}
void SetDisplayNormal(void)
{
Byte ch;
WriteIIC563(0x1a9,0x00);
ch = ReadIIC563(0x101);
WriteIIC563(0x101,ch|BIT_5); //chip warm reset
//Sleep(20);
WriteIIC563(0x101,ch); //chip warm reset
#if DVImode == DEmode
// Jacky 20040623 For DE mode scaler shut down
if(SyncMode == 3) //DVI
{
WriteIIC563(0x1a9,0x00); //disable IRQ interrupt
ch = ReadIIC563(0x196);
WriteIIC563(0x196,0x94);
Sleep(20);
WriteIIC563(0x196,ch&(~BIT_7));
//Sleep(20);
}
#endif
Sleep(50);
//-------------------------
WriteIIC563(0x1ab,0x3f); //clear IRQ
WriteIIC563(0x1ac,0x1f);
WriteIIC563(0x1a9,0x3c);
LoadADC_Gain();
//for NR when DVI input NR need disable jacky 20041202
if(SyncMode == 3) //DVI
{
WriteIIC563(0x068,0x00);
WriteIIC563(0x06a,0x00);
}
else
{
WriteIIC563(0x068,0x7a);
WriteIIC563(0x06a,0xd2);
}
//WriteIIC563(0x069,0x32);
ForceToBack = 0;
// ForceToBackground(0,0,0); //Set fource to background
WriteIIC563(0x159,ReadIIC563(0x159)&0xa0); //RGB
WriteIIC563(0x154,0x00); //comeback to image
WriteIIC563(0x16e,0x07); //Graphic display enable
SetAudioMute();
SetLightHS();
SetLightHW();
SetLightVS();
SetLightVH();
#if PRINT_MESSAGE
printf("Set Display Normal\n");
#endif
}
void PowerSaving(void)
{
// unsigned char temp;
ForceToBackground(0,0,0);
//FastMuteOn();
WriteIIC563(0x154,0x09); //lo_cs 930309
BackLightOff();
//-----save BackLightTime-----------------------------------------
SaveBackLightTime();
Sleep(PowerDownInvTiming);
ScalerPowerDown();
PowerDown = 1;
#if PRINT_MESSAGE
printf("Power Saving\n");
#endif
}
void ScalerPowerDown(void)
{
// for NT68563 Power Down process
unsigned char temp;
//temp = ReadIIC563(0x16e);
//WriteIIC563(0x16e,temp&(~BIT_0));
AUDIO_MUTE();
WriteIIC563(0x101,0xD7);
// temp = ReadIIC563(0x208);
// WriteIIC563(0x208,temp&(~BIT_4));
Sleep(PowerDownPanelTiming);
//DC2DCPowerOff();
WaitSetup(5);
PanelPowerOff(); // panle power off
Sleep(5);
WriteIIC563(0x101,0x07);
// Jacky 20040906 for LVDS power down and pull low the LVDS pad
WriteIIC563(0x1f7,0x00); //Power down LVDS buffer
WriteIIC563(0x1f5,0x16); //Pull low the LVDS pad
WriteIIC563(0x102,0x00);
WriteIIC563(0x0f0,0x00);
WriteIIC563(0x143,0xa0); //Power down DVI Pll
WriteIIC563(0x144,0x01); //Power down DVI impedance circuit
WriteIIC563(0x146,0xb3); //Power down DVI SCDT detect
temp = ReadIIC563(0x00e);
WriteIIC563(0x00e,temp & 0xf8); // power down ADC R/G/B channel
#if PRINT_MESSAGE
printf("Power Down OK\n");
#endif
}
void ScalerPowerUp(void)
{
unsigned char temp;
PanelPowerOn();
Sleep(PowerUpPanelTiming);
LED_GrnOn();
LED_RedOff();
PowerDown = 0;
SetInterface();
temp = ReadIIC563(0x00e);
WriteIIC563(0x00e,temp | 0x07);
WriteIIC563(0x150,DisplayControl);
SetBrightness();
LoadADC_Gain();
SetContrast();
#if PRINT_MESSAGE
printf("WakeUp\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -