📄 scaler.c
字号:
WaitStop();
}
#endif
void SetADC_Phase(void)
{
WriteIIC_HW(Scaler_Addr,0xFF,0x01); // page1 enable
WriteIIC_HW(Scaler_Addr,0xD9,ADC_Phase);
WriteIIC_HW(Scaler_Addr,0xFF,0x00); // page1 disable
}
void SetADC_PLL(void)
{
unsigned long PixelRate,H_Counter;
unsigned short addr;
unsigned char ch,k;
float temp;
PixelRate = ((unsigned long)HTotal * H_SYNC)/10000;
ch = (unsigned char)PixelRate;
WriteIIC_HW(Scaler_Addr,0xFF,0x01); // page1 enable
//
WriteIIC_HW(Scaler_Addr,0xd0,0x43);
//out of range
addr = 0x106 + (ModePoint * 8);
k = Read24C16(addr);
flag3 &= ~BIT_1; //in range
if((ch > P_Max)||(k == 9))
flag3 |= BIT_1; //out of range
if((H_SYNC > H_Max * 10)||(H_SYNC < H_Min * 10))
flag3 |= BIT_1; //out of range
if((V_SYNC > V_Max * 10)||(V_SYNC < V_Min * 10))
flag3 |= BIT_1; //out of range
//
if((flag1 & BIT_1) == 0){
k = ReadIIC_HW(Scaler_Addr,0xd1) & 0x03;
}
else{
if(ch > 100){
WriteIIC_HW(Scaler_Addr,0xd1,0x10);
k = 0;
}
else if (ch > 50){
WriteIIC_HW(Scaler_Addr,0xd1,0x11);
k = 1;
}
else{
WriteIIC_HW(Scaler_Addr,0xd1,0x12);
k = 2;
}
}
if((flag3 & BIT_2) != 0x00){
printf("Htotal = %d\r\n",HTotal);
printf("PixelRate = %d MHz\r\n",(unsigned short)PixelRate);
}
if((SyncMode == 0)||(SyncMode == 3))
WriteIIC_HW(Scaler_Addr,0xd6,0xbf);
else
WriteIIC_HW(Scaler_Addr,0xd6,0xa0);
WriteIIC_HW(Scaler_Addr,0xdb,0x0c);
if((flag1 & BIT_1) == 0){
//
if((SyncMode == 1)||(SyncMode == 2)){ //H+V SOG
WriteIIC_HW(Scaler_Addr,0xd5,0x0D);
}
else{
if((HV_Pol & BIT_4) == 0){
WriteIIC_HW(Scaler_Addr,0xd5,0x05);
}
else{
WriteIIC_HW(Scaler_Addr,0xd5,0x0d);
}
}
//
ch = ReadIIC_HW(Scaler_Addr,0xdf) & 0x3f;
PixelRate = ch;
PixelRate <<= 8;
ch = ReadIIC_HW(Scaler_Addr,0xde);
PixelRate += ch;
PixelRate <<= 8;
ch = ReadIIC_HW(Scaler_Addr,0xdd);
PixelRate += ch;
}
else{
WriteIIC_HW(Scaler_Addr,0xd5,0x00);
H_Counter = 0;
Timer3 = 25;
while(Timer3 != 0){
ch = ReadIIC_HW(Scaler_Addr,0xdf) & 0x3f;
PixelRate = ch;
PixelRate <<= 8;
ch = ReadIIC_HW(Scaler_Addr,0xde);
PixelRate += ch;
PixelRate <<= 8;
ch = ReadIIC_HW(Scaler_Addr,0xdd);
PixelRate += ch;
if(PixelRate > H_Counter){
if((PixelRate - H_Counter ) > 2){
H_Counter = PixelRate;
Timer3 = 25;
}
}
else{
if((H_Counter - PixelRate ) > 2){
H_Counter = PixelRate;
Timer3 = 25;
}
}
}
}
if((flag3 & BIT_2) != 0x00){
printf("Hcounter = %x %x\r\n",(unsigned short)(PixelRate>>16),(unsigned short)PixelRate);
}
temp = ((float)HTotal * 536870912) / PixelRate;
PixelRate = temp;
if((flag3 & BIT_2) != 0x00){
printf("DSS = %x %x\r\n",(unsigned short)(PixelRate>>16),(unsigned short)PixelRate);
}
for(k; k>0; k--){
PixelRate <<= 1;
}
WriteIIC_HW(Scaler_Addr,0xd2,(unsigned char)PixelRate);
WriteIIC_HW(Scaler_Addr,0xd3,(unsigned char)(PixelRate>>8));
WriteIICV_HW(Scaler_Addr,0xd4,(unsigned char)(PixelRate>>16));
WriteWordIIC_HW(Scaler_Addr,0xd7,HTotal);
//
if((SyncMode == 1)||(SyncMode == 2)){ //H+V SOG
WriteIIC_HW(Scaler_Addr,0xd5,0x0D);
}
else{
if((HV_Pol & BIT_4) == 0){
WriteIIC_HW(Scaler_Addr,0xd5,0x07);
}
else{
WriteIIC_HW(Scaler_Addr,0xd5,0x0F);
}
}
//
WriteIIC_HW(Scaler_Addr,0xFF,0x00); // page1 disable
}
void SetScaler(void)
{
unsigned char r;
unsigned short i,DispActiveHeight,dstVtotal,DV_HFreq,dstHtotal;
unsigned long dclk;
if(ModePoint >= ModeNum)
return;
if(SyncMode != 3){
SetHP();
SetVP();
}
// WriteIIC_HW(Scaler_Addr,0x88,0xc8);
// Window size
i = 0x106 + (ModePoint * 8);
r = Read24C16(i);
H_Act = H_ActiveTab[r];
if((flag3 & BIT_2) != 0x00){
printf("Resolution = %d x %d\r\n",H_ActiveTab[r],V_ActiveTab[r]);
}
if((flag3 & BIT_6) != 0){
WriteWordIIC_HW(Scaler_Addr,0x16,V_ActiveTab[r]>>1); // Capture V_Active
i = V_ActiveTab[r]>>1;
}
else{
WriteWordIIC_HW(Scaler_Addr,0x16,V_ActiveTab[r]); // Capture V_Active
i = V_ActiveTab[r];
}
WriteWordIIC_HW(Scaler_Addr,0x1a,H_ActiveTab[r]); // Capture H_Active
if(H_Act == PanelWidth)
WriteIIC_HW(Scaler_Addr,0x43,0x43);
else
WriteIIC_HW(Scaler_Addr,0x43,0x00);
// DCLK
dclk = ((unsigned long)PanelHeight * VTotal / V_ActiveTab[r]) * V_SYNC * PanelMinHTotal / 10000; //kHz
DispActiveHeight = PanelHeight; // set the vertical active height to the Panel Height
dstHtotal = PanelMinHTotal;
// calculate dst vtotal
dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[r] + 8) >> 4; //add .5 for rounding, make even
if(dclk < PanelMinPClk){
dstHtotal = PanelTypHTotal;
}
else if(dclk > PanelMaxPClk){
DispActiveHeight = (unsigned long)PanelHeight * PanelMaxPClk / dclk;
if(i < PanelHeight)
i = (unsigned long)i * dclk / PanelMaxPClk;
WriteWordIIC_HW(Scaler_Addr,0x16,i); // Capture V_Active
// calculate new dst vtotal
dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[r] + 8) >> 4; //add .5 for rounding, make even
}
dclk = ((long)dstHtotal * dstVtotal * V_SYNC + 5) / 10;
if(dstVtotal < PanelMinVTotal){
dstVtotal = PanelMinVTotal;
dstHtotal = PanelTypHTotal;
dclk = ((unsigned long)PanelTypHTotal * dstVtotal* V_SYNC + 5) / 10; //Hz
DV_HFreq = dclk / PanelMinHTotal / 100;
}
else{
// HFreq
DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC / 1000);
}
SetDPLL(dclk);
// Htotal
Sleep(80);
dstHtotal = ReadWordIIC_HW(Scaler_Addr,0x67) & 0x07ff;
dstVtotal = dclk * 10 / dstHtotal / V_SYNC;
if((flag3 & BIT_2) != 0x00){
printf("DCLK = 0x%x 0x%x\r\n",(unsigned short)(dclk >> 16),(unsigned short)dclk);
printf("DispActiveHeight = %d\r\n",DispActiveHeight);
printf("DispHFreq = %d\r\n",DV_HFreq);
printf("dstVtotal = %d\r\n",dstVtotal);
printf("dstHtotal = %d\r\n",dstHtotal);
}
WriteWordIIC_HW(Scaler_Addr,0x4e,dstVtotal); // Display Vtotal
dstVtotal = dstVtotal - PanelMinVSyncWidth - PanelMinVSyncBackPorch;
WriteWordIIC_HW(Scaler_Addr,0x52,dstVtotal); // Display VStart
dstVtotal = dstVtotal + PanelMinVSyncWidth;
WriteWordIIC_HW(Scaler_Addr,0x54,dstVtotal); // Display VEnd
WriteWordIIC_HW(Scaler_Addr,0x56,dstHtotal); // Display Htotal
dstHtotal = dstHtotal - PanelMinHSyncWidth - PanelMinHSyncBackPorch;
WriteWordIIC_HW(Scaler_Addr,0x5a,dstHtotal); // Display HStart
dstHtotal = dstHtotal + PanelMinHSyncWidth;
WriteWordIIC_HW(Scaler_Addr,0x5c,dstHtotal); // Display HEnd
}
void SetScalerAV(void)
{
unsigned char Vfreq;
unsigned short DispActiveHeight,dstVtotal,DV_HFreq,dstHtotal,i;
unsigned long dclk;
code unsigned short H_ActTab[]={
680,680
};
code unsigned short V_ActTab[]={
232,278
};
if((flag2 & BIT_2) == 0)
Vfreq = 1;
else
Vfreq = 0;
if(Vfreq == 0){ //60Hz
WriteWordIIC_HW(Scaler_Addr,0x18,150); //H pos
WriteWordIIC_HW(Scaler_Addr,0x14,0x6015); //V pos
H_SYNC = 157;
V_SYNC = 599;
VTotal = 262;//525;
}
else{ //50Hz
WriteWordIIC_HW(Scaler_Addr,0x18,159); //H pos
WriteWordIIC_HW(Scaler_Addr,0x14,0x0019); //V pos
H_SYNC = 156;
V_SYNC = 500;
VTotal = 302;//625;
}
// WriteIIC_HW(Scaler_Addr,0x88,0xc8);
// Window size
H_Act = H_ActTab[Vfreq];
if((flag3 & BIT_2) != 0x00){
printf("Resolution = %d x %d\r\n",H_ActTab[Vfreq],V_ActTab[Vfreq]);
}
WriteWordIIC_HW(Scaler_Addr,0x16,V_ActTab[Vfreq]); // Display V_Active
i = V_ActTab[Vfreq];
WriteWordIIC_HW(Scaler_Addr,0x1a,H_ActTab[Vfreq]); // Display H_Active
// calculate dclk for reference
dclk = ((unsigned long)PanelHeight * VTotal / V_ActTab[Vfreq]) * V_SYNC * PanelMinHTotal / 10000; //KHz
DispActiveHeight = PanelHeight; // set the vertical active height to the Panel Height
dstHtotal = PanelMinHTotal;
// calculate dstVtotal
dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[Vfreq] + 8) >> 4; //add .5 for rounding, make even
// check and calculate dclk
if(dclk < PanelMinPClk){
dstHtotal = PanelTypHTotal;
}
else if(dclk > PanelMaxPClk){
DispActiveHeight = (unsigned long)PanelHeight * PanelMaxPClk / dclk;
if(i < PanelHeight)
i = (unsigned long)i * dclk / PanelMaxPClk;
WriteWordIIC_HW(Scaler_Addr,0x16,i); // Capture V_Active
// calculate new dst vtotal
dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[Vfreq] + 8) >> 4; //add .5 for rounding, make even
}
dclk = ((long)dstHtotal * dstVtotal * V_SYNC + 5) / 10;
if(dstVtotal < PanelMinVTotal){
dstVtotal = PanelMinVTotal;
dstHtotal = PanelTypHTotal;
dclk = ((unsigned long)PanelTypHTotal * dstVtotal* V_SYNC + 5) / 10; //Hz
DV_HFreq = dclk / PanelMinHTotal / 100;
}
else{
// HFreq
DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC / 1000);
}
SetDPLL(dclk);
// Htotal
Sleep(80);
dstHtotal = ReadWordIIC_HW(Scaler_Addr,0x67) & 0x07ff;
dstVtotal = dclk * 10 / dstHtotal / V_SYNC;
if((flag3 & BIT_2) != 0x00){
printf("DCLK = 0x%x 0x%x\r\n",(unsigned short)(dclk >> 16),(unsigned short)dclk);
printf("DispActiveHeight = %d\r\n",DispActiveHeight);
printf("DispHFreq = %d\r\n",DV_HFreq);
printf("dstVtotal = %d\r\n",dstVtotal);
printf("dstHtotal = %d\r\n",dstHtotal);
}
WriteWordIIC_HW(Scaler_Addr,0x4e,dstVtotal); // Display Vtotal
dstVtotal = dstVtotal - PanelMinVSyncWidth - PanelMinVSyncBackPorch;
WriteWordIIC_HW(Scaler_Addr,0x52,dstVtotal); // Display VStart
dstVtotal = dstVtotal + PanelMinVSyncWidth;
WriteWordIIC_HW(Scaler_Addr,0x54,dstVtotal); // Display VEnd
WriteWordIIC_HW(Scaler_Addr,0x56,dstHtotal); // Display Htotal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -