📄 scaler.c
字号:
//WriteIIC563(0x159,0xA0);
WriteIIC563(0x159,0x00); //close fast mute for HDCP
WriteIIC563(0x1af,0x0A);
WriteWordIIC563(0x179,PanelMinHTotal);
//-----------------------------
WriteIIC563(0x014,0x07);
WriteIIC563(0x005,0x01); //module test, nt68665
WriteIIC563(0x204,0); //module test, nt68665
/* ray,disable BF3
WriteIIC563(0x130,0);
BFsRGB(0x100,0x100,0x100);
WriteIIC563(0x131,1);
WriteIIC563(0x390,0x0C); //enable BF2 csc and Border, if border not enable, border color can;t be change
WriteIIC563(0x394,0x07); //enable BF2 border
WriteIIC563(0x391,0xFF); //enable BF2 border color
*/
//WriteHDCPKey();
//EnableHDCP();
#endif
}
/*==========================================
==========================================*/
void TCONInit(void)
{
//WriteIIC563(0x102,PU_DDDS); //DPLL enable
#if PanelSxga == 1
SetDPLL(100000000);
//WriteIIC563(0x0f1,0x10); //103MHz
#else
SetDPLL(30000000);
//WriteIIC563(0x0f1,0x11); //51.5MHz
#endif
//WriteIIC563(0x0f2,0xaa);
//WriteIIC563(0x0f3,0x2a);
//WriteIIC563(0x0f4,0x11);
//WriteIIC563(0x0f0,0x03);
/*
#if PanelInterface == TCON_TO_RSDS || PanelInterface == TCON_TO_TTL
if(PanelInterface == TCON_TO_RSDS || PanelInterface == TCON_TO_TTL)
{
WriteIIC563(0x0FF,0x02); // page2 enable
#if PRINT_MESSAGE
printf("TCON Init\r\n");
#endif
for(i=0; i<0x70; i=i+16)
WritePage563(i,i,TCON_Tab);
for(i=0x70; i<0x7b; i++)
WriteIIC(SCALER_ADDR,i,TCON_Tab[i]);
for(i=0x80; i<0xa0; i=i+16)
WritePage563(i,i,TCON_Tab);
WriteIIC563(0x0FF,0x00); // page1 disable
WriteIIC563(0x2d0,0xb5); // Deflicker control
}
#endif
*/
#if Panel_Spread_Spect_En == 0xff
WriteIIC563(0x0f5,(PanelSpreadSpectrumCtrl << 1) | BIT_0);
#endif
}
/*==========================================
==========================================*/
#if PanelInterface == TCON_TO_RSDS || PanelInterface == TCON_TO_TTL
void WritePage563(unsigned char addr1,unsigned char addr2,unsigned char *p)
{
unsigned char i,ch;
IIC_Start();
IIC_Tx(SCALER_ADDR);
IIC_Tx(addr1);
for(i=0; i<16; i++){
ch = p[addr2 + i];
IIC_Tx(ch);
}
IIC_Stop();
}
#endif
/*==========================================
==========================================*/
void SetADC_Phase(void)
{
WriteIIC563(0x0d9,FuncBuf[pPHASE]);
}
/*==========================================
==========================================*/
/*
Byte Check_HFreqRange(void)
{
//first priority
if((H_SYNC > H_OverMuteScreenLimit)||(H_SYNC < H_UnderMuteScreenLimit))
return OverRangeMuteScreen;
//if((H_SYNC > H_OverNormalDisplayLimit)||(H_SYNC < H_UnderNormalDisplayLimit))
//return OverRangeWithCanDisplay;
return Within_range;
}
*/
/*==========================================
==========================================*/
/*
Byte Check_VFreqRange(void)
{
//first priority
if((V_SYNC > V_OverMuteScreenLimit)||(V_SYNC < V_UnderMuteScreenLimit))
return OverRangeMuteScreen;
// y050818,Eason
// if (Hresolution==PanelWidth&& Vresolution==PanelHeight &&abs(V_SYNC-850)<10){
// return OverRangeMuteScreen;
// }else
// if((V_SYNC > V_OverNormalDisplayLimit)||(V_SYNC < V_UnderNormalDisplayLimit))
// return OverRangeWithCanDisplay;
return Within_range;
}
*/
/*==========================================
==========================================*/
/*
Byte Check_PixelRange(Byte Pixel)
{
//first priority
if((Pixel > MaxPixelClock)||(Hresolution> Rel_OverMuteScreenLimit))
return OverRangeMuteScreen;
//if(Hresolution> Rel_OverNormalDisplayLimit)
//return OverRangeWithCanDisplay;
return Within_range;
}
*/
/*==========================================
==========================================*/
/*
void CheckFreqRange(Byte Pixel)
{
if(Check_HFreqRange()==OverRangeMuteScreen||Check_VFreqRange()==OverRangeMuteScreen||Check_PixelRange(Pixel)==OverRangeMuteScreen){
OutOfRange=OverRangeMuteScreen;
return;
}
//if(Check_HFreqRange()==OverRangeWithCanDisplay||Check_VFreqRange()==OverRangeWithCanDisplay||Check_PixelRange(Pixel)==OverRangeWithCanDisplay){
//OutOfRange=OverRangeWithCanDisplay;
//return;
//}
OutOfRange=Within_range;
}
*/
/*==========================================
==========================================*/
void SetScaler(void)
{
unsigned char temp154,ch;
unsigned short DispActiveHeight,dstVtotal,DV_HFreq,dstHtotal;
unsigned long dclk;
//,old_ratio,new_ratio,delta;//,i
float temp;
//xdata unsigned short Hr;
if(SyncMode < 3){ //y50316 error setting in DVI mdeo kevin
ch = ReadIIC563(0x020);
if(ReadIIC563(0x19a) & BIT_2){
// Interlance = 1; //kevin
Interlance = 0; //1280*1024 soft power Off/On abnormal
// WriteIIC563(0x020,ch|BIT_2); //1280*1024 soft power Off/On abnormal
}else{
Interlance = 0;
WriteIIC563(0x020,ch);
}
Interlance = 0;
}
if(SyncMode != 3){
SetHP();
SetVP();
}
// H_Act = H_ActiveTab[ResolutionPtr];
if(Interlance){
WriteWordIIC563(0x032,Vresolution); // Capture V_Active
}else{
WriteWordIIC563(0x032,Vresolution); // Capture V_Active
}
WriteWordIIC563(0x036,Hresolution); // Capture H_Active
WriteWordIIC563(0x175,PanelWidth); // Display H_Active
dclk = (unsigned long)PanelHeight *VTotal ;// / Vresolution) * V_SYNC * PanelTypHTotal / 10; //Hz
dclk = (unsigned long)dclk / Vresolution;//) * V_SYNC * PanelTypHTotal / 10; //Hz
dclk = (unsigned long)dclk * V_SYNC;// * PanelTypHTotal / 10; //Hz
dclk = (unsigned long)dclk * PanelMinHTotal;// / 10; //Hz
dclk = (unsigned long)dclk / 10; //Hz
if(Interlance){
dclk = dclk*2;
}
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;
if(dclk < PanelMinPClk){
dstHtotal = PanelTypHTotal;
dclk = ((unsigned long)dstHtotal * dstVtotal * V_SYNC + 5) / 10;
}else if(dclk > PanelMaxPClk){
dstHtotal = PanelLowHTotal;
dclk = PanelMaxPClk;
}
if(dstVtotal < PanelMinVTotal)
{
dstVtotal = PanelMinVTotal;
dstHtotal = PanelMinHTotal;
dclk = ((unsigned long)PanelMinHTotal * dstVtotal * V_SYNC + 5) / 10;
DV_HFreq = dclk / PanelMinHTotal / 100;
}else
DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC/1000);
if(SyncMode<3)
{
WriteIIC563(0x0f5,ReadIIC563(0x0f5) & (~BIT_0)); // Disable SSC_EN
temp154 = ReadIIC563(0x154);
WriteIIC563(0x154,temp154 & 0xfc); //Normal display
temp = ((float)dstHtotal-0.1) * PanelHeight * 4096 / H_Counter / Vresolution;
dclk = (unsigned long)(temp * 12000000);
}
Sleep(80);
//SetDPLL(dclk);
SetDPLL(33200000);
//SetDPLL(30000000);
/*
if((FuncBuf[pVIDEOSOURCE]==SourceDVI) && (ReadIIC563(0x19a) & BIT_3) ==0x00)
{
Hr = ReadWordIIC563(0x184);
dstHtotal = ReadWordIIC563(0x182);
old_ratio = ReadWordIIC563(0x0f3);
old_ratio <<=8;
ch = ReadIIC563(0x0f2);
old_ratio += ch;
delta = old_ratio * Hr / dstHtotal / PanelHeight;
new_ratio = old_ratio - delta;
WriteIIC563(0x0f2,(unsigned char)new_ratio);
WriteIIC563(0x0f3,(unsigned char)(new_ratio >> 8));
WriteIIC563(0x0f4,(unsigned char)(new_ratio >> 16));
WriteWordIIC563(0x15e,dstHtotal-1);
WriteIIC563(0x150, ReadIIC563(0x150)&0xdf);
}
*/
/*
Hr = ReadIIC563(0x184)+(ReadIIC563(0x185)*256);
if(Hr < 0x80)
{
temp = (float)dclk * (abs(0x80-Hr));
temp2 = temp / ((unsigned long)PanelHeight*dstHtotal);
dclk += temp2;
SetDPLL(dclk);
Sleep(80);
}
else if (Hr > (PanelHeight - 0x80))
{
temp = (float)dclk * (abs(Hr-0x380));
temp2 = temp / ((unsigned long)PanelHeight*dstHtotal);
dclk -= temp2;
SetDPLL(dclk);
Sleep(80);
}
*/
#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
if(dstHtotal < PanelMinHTotal){ //y50819 for 2 msg display same time
dstHtotal = PanelMinHTotal;
}
WriteWordIIC563(0x15e,dstHtotal); // Display Htotal
}
void SetADC_PLL(void)
{
Byte code DpllSeqTab[4]={100,50,20,0};
unsigned long PixelRate,LineCounter;
Byte ch,k;
float temp;
PixelRate = ((unsigned long)FuncBuf[pCLOCK] * H_SYNC)/10000;
ch = (unsigned char)PixelRate;
WriteIIC563(0x0d0,0x23);
//CheckFreqRange(ch);
//----------------------------------
if(ForceToBack == 0){
k = ReadIIC563(0x0d1);
k &= 0x03;
}else{
for(k=0;k<4;k++)
if(ch > DpllSeqTab[k])
break;
WriteIIC563(0x0d1,0x10+k);
}
WriteIIC563(0x0d6,0xc0);
WriteIIC563(0x0db,0x0c);
LineCounter = 4096;
ch = ReadIIC563(0x102);
WriteIIC563(0x102,ch|BIT_5);
Sleep(5);
WriteIIC563(0x102,ch);
if(ForceToBack != 0){
WriteIIC563(0x0d5,0x01);
H_Counter = 0;
if((FuncBuf[pVIDEOSOURCE] == SourceDVI) && (ReadIIC563(0x19a) & BIT_3) ==0x00)
{
PixelRate = ReadWordIIC563(0x19b) & 0x1fff;
if((PixelRate == 0x1fff)||(PixelRate == 0))
H_SYNC_Temp = 0xffff;
else
H_Counter = PixelRate * 512;
}
else
{
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
break;
}
H_Counter = PixelRate;
}
temp = ((float)FuncBuf[pCLOCK] * 536870912) / PixelRate;
PixelRate = temp;
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(0x0d7,(Byte)FuncBuf[pCLOCK]);
WriteIIC563(0x0d8,(Byte)(FuncBuf[pCLOCK]>>8));
if((SyncMode == 1)||(SyncMode == 2)||(SyncMode == 5)||(SyncMode == 6)){ //H+V SOG
WriteIIC563(0xd5,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
}
}
void SetDPLL(unsigned long dclk)
{
Byte i;
unsigned long temp;
unsigned long code DpllTab[4]={80000000,40000000,20000000,0}; //050428,Eason
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;
};
WriteIIC563(0x0f2,(unsigned char)temp);
WriteIIC563(0x0f3,(unsigned char)(temp >> 8));
WriteIIC563(0x0f4,(unsigned char)(temp >> 16));
WriteIIC563(0x0f0,0x03);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -