📄 scaler.c
字号:
dstHtotal = PanelMaxHTotal;
for(i=PanelMinHTotal; i<PanelMaxHTotal; i=i+2){
temp = ((unsigned long)DV_HFreq * i) / 10; //KHz
#if 0
if(dclk > temp){
temp = dclk - temp;
}
else{
temp = temp - dclk;
}
if(temp < 100){
break;
}
#else
if(temp >= dclk){
break;
}
else{
temp = dclk - temp;
if(temp < 100){
break;
}
}
#endif
}
dstHtotal = i;
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);
}
SetDPLL(dclk);
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 i,DispActiveHeight,dstVtotal,DV_HFreq,dstHtotal;
unsigned long dclk,temp;
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
WriteWordIIC_HW(Scaler_Addr,0x1a,H_ActTab[Vfreq]); // Display H_Active
// DCLK
dclk = ((unsigned long)PanelHeight * VTotal / V_ActTab[Vfreq]) * V_SYNC * PanelMinHTotal / 10000; //KHz
DispActiveHeight = PanelHeight; // set the vertical active height to the Panel Height
dclk = dclk / 1000 - 1;
dclk = (dclk + 2) * 1000;
// calculate new dst vtotal
dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActTab[Vfreq] + 8) >> 4; //add .5 for rounding, make even
if(dstVtotal < PanelMinVTotal){
dstVtotal = PanelMinVTotal;
DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC / 1000);
dclk = ((unsigned long)DV_HFreq * PanelMinHTotal) / 10; //KHz
dclk = dclk / 1000 - 1;
dclk = (dclk + 2) * 1000;
}
else{
// HFreq
DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC / 1000);
}
// Htotal
for(i=PanelMinHTotal; i<PanelMaxHTotal; i=i+2){
temp = ((unsigned long)DV_HFreq * i) / 10; //KHz
#if 0
if(dclk > temp){
temp = dclk - temp;
}
else{
temp = temp - dclk;
}
if(temp < 100){
break;
}
#else
if(temp >= dclk){
break;
}
else{
temp = dclk - temp;
if(temp < 100){
break;
}
}
#endif
}
dstHtotal = i;
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);
}
SetDPLL(dclk);
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 SetDPLL(unsigned long dclk)
{
unsigned long temp;
WriteIIC_HW(Scaler_Addr,0xff,0x01); // DPLL
WriteIIC_HW(Scaler_Addr,0xf0,0x00);
if(dclk >= 140000){
WriteIIC_HW(Scaler_Addr,0xf1,0x10);
temp = (dclk / 10) * 131072 / 1200;
}
else if(dclk >= 70000){
WriteIIC_HW(Scaler_Addr,0xf1,0x11);
temp = (dclk / 10) * 131072 / 600;
}
else if(dclk >= 35000){
WriteIIC_HW(Scaler_Addr,0xf1,0x12);
temp = (dclk / 10) * 131072 / 300;
}
else{
WriteIIC_HW(Scaler_Addr,0xf1,0x13);
temp = (dclk / 10) * 1048576 / 1200;
}
WriteIIC_HW(Scaler_Addr,0xf2,(unsigned char)temp);
WriteIIC_HW(Scaler_Addr,0xf3,(unsigned char)(temp >> 8));
WriteIIC_HW(Scaler_Addr,0xf4,(unsigned char)(temp >> 16));
WriteIIC_HW(Scaler_Addr,0xf0,0x01);
WriteIIC_HW(Scaler_Addr,0xff,0x00);
}
void SetHP(void)
{
// Horizontal Start
WriteWordIIC_HW(Scaler_Addr,0x18,HP_Start);
if((flag3 & BIT_2) != 0x00){
printf("HP_Start = %d\r\n",HP_Start);
}
}
void SetVP(void)
{
// Vertical Start
if((flag3 & BIT_6) != 0){
WriteWordIIC_HW(Scaler_Addr,0x14,VP_Start | 0x6000);
}
else{
WriteWordIIC_HW(Scaler_Addr,0x14,VP_Start);
}
if((flag3 & BIT_2) != 0x00){
printf("VP_Start = %d\r\n",VP_Start);
}
}
void SetSharpness(void)
{
WriteIIC_HW(Scaler_Addr,0x70,Sharpness);
if((flag3 & BIT_2) != 0x00){
printf("Sharpness = %d\r\n",(unsigned short)Sharpness);
}
}
void SetBrightness(void)
{
unsigned char value;
value = 78 + Brightness;
if(value > 0x7f)
value &= 0x7f;
else
value |= 0x80;
WriteIIC_HW(Scaler_Addr,0x6c,value);
WriteIIC_HW(Scaler_Addr,0x6d,value);
WriteIIC_HW(Scaler_Addr,0x6e,value);
if((flag3 & BIT_2) != 0x00){
printf("Brightness of ASIC = %x\r\n",(unsigned short)value);
}
}
void SetInverter(void)
{
unsigned char value;
value = Inverter * 2 + Inverter/2;
PWM_REG[15] = value;
if((flag3 & BIT_2) != 0x00){
printf("Inverter = %x\r\n",(unsigned short)value);
}
}
/*
void SetContrast(void)
{
unsigned char value,k;
if((flag3 & BIT_2) != 0x00){
printf("Contrast = %x\r\n",(unsigned short)Contrast);
}
if((flag3 & BIT_0) != 0){
// k = Contrast * 2 + 28; //28 ---- 228
k = Contrast + 78; //78 ---- 178
value = R_Gain;
value = ((unsigned short)value * k + 64) / 128;
WriteIIC_HW(Scaler_Addr,0x69,value);
if((flag3 & BIT_2) != 0x00){
printf("R of ASIC = %x\r\n",(unsigned short)value);
}
value = G_Gain;
value = ((unsigned short)value * k + 64) / 128;
WriteIIC_HW(Scaler_Addr,0x6a,value);
if((flag3 & BIT_2) != 0x00){
printf("G of ASIC = %x\r\n",(unsigned short)value);
}
value = B_Gain;
value = ((unsigned short)value * k + 64) / 128;
WriteIIC_HW(Scaler_Addr,0x6b,value);
if((flag3 & BIT_2) != 0x00){
printf("B of ASIC = %x\r\n",(unsigned short)value);
}
}
else{
// k = (100 - Contrast) + 78;
k = 178 - Contrast;
value = ((unsigned short)R_ADC * k + 64) / 128;
WriteIIC_HW(Scaler_Addr,0x02,value);
value = ((unsigned short)G_ADC * k + 64) / 128;
WriteIIC_HW(Scaler_Addr,0x04,value);
value = ((unsigned short)B_ADC * k + 64) / 128;
WriteIIC_HW(Scaler_Addr,0x06,value);
WriteIIC_HW(Scaler_Addr,0x69,R_Gain);
if((flag3 & BIT_2) != 0x00){
printf("R of ASIC = %x\r\n",(unsigned short)R_Gain);
}
WriteIIC_HW(Scaler_Addr,0x6a,G_Gain);
if((flag3 & BIT_2) != 0x00){
printf("G of ASIC = %x\r\n",(unsigned short)G_Gain);
}
WriteIIC_HW(Scaler_Addr,0x6b,B_Gain);
if((flag3 & BIT_2) != 0x00){
printf("B of ASIC = %x\r\n",(unsigned short)B_Gain);
}
}
}
*/
void ForceToBackground(unsigned char color)
{
if(((flag1 & BIT_1) == 0)||((flag3 & BIT_0) != 0)){
flag1 |= BIT_1; //Set fource to background
if((flag3 & BIT_2) != 0x00){
printf("Force To Background %x\r\n",(unsigned short)color);
}
color <<= 2;
color |= 0x02;
WriteIIC_HW(Scaler_Addr,0x4d,color);
}
}
void SetDisplayNormal(void)
{
flag1 &= ~BIT_5;
flag1 &= ~BIT_1;
CLRWDT = 0x55;
Sleep(200);
CLRWDT = 0x55;
Sleep(200);
CLRWDT = 0x55;
WriteIIC_HW(Scaler_Addr,0x4d,0x00); //comeback to image
//
if(PanelShortHsync == 1){
WriteIIC_HW(Scaler_Addr,0x74,0x13);
WriteIIC_HW(Scaler_Addr,0x75,0x03);
}
//
MuteTimer = 255;
if((flag3 & BIT_2) != 0x00){
printf("Set Display Normal\r\n");
}
}
void PowerSaving(void)
{
// OSD_OFF();
OSD_Control &= ~BIT_0;
WriteIIC_HW(Scaler_Addr,0x95,OSD_Control);
AUDIO_MUTE();
ForceToBackground(0);
BackLightOff();
Sleep(PowerDownInvTiming);
ScalerPowerDown();
AMP_STBY();
if((flag3 & BIT_2) != 0x00){
printf("Power Saving\r\n");
}
}
void ScalerPowerDown(void)
{
// for Scaler Power Down process
if(Use_TCON != 0){
WriteIIC_HW(Scaler_Addr,0xff,0x01);
WriteIIC_HW(Scaler_Addr,0x08,0x00);
WriteIIC_HW(Scaler_Addr,0xff,0x00);
}
// WriteIIC_HW(Scaler_Addr,0x03,0x00);
// WriteIIC_HW(Scaler_Addr,0x05,0x00);
// WriteIIC_HW(Scaler_Addr,0x07,0x00);
WriteIIC_HW(Scaler_Addr,0x4c,0x00);
WriteIIC_HW(Scaler_Addr,0x6f,0x00);
WriteIIC_HW(Scaler_Addr,0xE8,0x00);
WriteIIC_HW(Scaler_Addr,0xfa,0x00);
WriteIIC_HW(Scaler_Addr,0xfb,0x00);
WriteIIC_HW(Scaler_Addr,0xfe,0x00);
WriteIIC_HW(Scaler_Addr,0x00,0x07);
Sleep(PowerDownPanelTiming);
PanelPowerOff(); //panle power off
Timer4 = 100; //delay 1 second for power on/off
}
void ScalerPowerUp(void)
{
if((ReadIIC_HW(Scaler_Addr,0x00) & BIT_0) != 0){
AMP_On();
#if PanelPowerActive == High
// if((PortC & BIT_1) == 0x00){
if((PortC & BIT_1) != 0x00){
#else
if((PortC & BIT_1) != 0x00){
#endif
while(Timer4 != 0){};
PanelPowerOn();
Sleep(PowerUpPanelTiming);
}
if(Use_TCON == 0){
WriteIIC_HW(Scaler_Addr,0xfa,0x00);
WriteIIC_HW(Scaler_Addr,0xfb,0x00);
WriteIIC_HW(Scaler_Addr,0xfe,0xc0);
}
else{
WriteIIC_HW(Scaler_Addr,0xfa,0xc0);
WriteIIC_HW(Scaler_Addr,0xfb,0x00);
WriteIIC_HW(Scaler_Addr,0xfe,0xc1);
WriteIIC_HW(Scaler_Addr,0xff,0x01);
WriteIIC_HW(Scaler_Addr,0x08,0x10);
WriteIIC_HW(Scaler_Addr,0xff,0x00);
}
WriteIIC_HW(Scaler_Addr,0xe8,0x80);
WriteIIC_HW(Scaler_Addr,0x6f,0x0f);
// WriteIIC_HW(Scaler_Addr,0x07,0x00);
// WriteIIC_HW(Scaler_Addr,0x05,0x00);
// WriteIIC_HW(Scaler_Addr,0x03,0x00);
WriteIIC_HW(Scaler_Addr,0x4c,DisplayControl);
WriteIIC_HW(Scaler_Addr,0x00,0x30);
SetBrightness();
sRGB();
// AUDIO_On();
}
PoSvTimer = 500;
flag1 &= ~BIT_3;
H_SYNC_Temp = 0xffff;
V_SYNC_Temp = 0xffff;
if((flag3 & BIT_2) != 0x00){
printf("WakeUp\r\n");
}
}
void LoadADC_Gain(void)
{
WriteIIC_HW(Scaler_Addr,0x0f,Read24C16(0xfa));
WriteIIC_HW(Scaler_Addr,0x10,Read24C16(0xfb));
WriteIIC_HW(Scaler_Addr,0x11,Read24C16(0xfc));
R_ADC = Read24C16(0xfd);
WriteIIC_HW(Scaler_Addr,0x02,R_ADC);
G_ADC = Read24C16(0xfe);
WriteIIC_HW(Scaler_Addr,0x04,G_ADC);
B_ADC = Read24C16(0xff);
WriteIIC_HW(Scaler_Addr,0x06,B_ADC);
}
void SetVolume(void)
{
unsigned char value;
// if(PowerStatus != 0x80)
// {
// value = (Volume << 1) + Volume / 2;
value = (Volume << 1) + 50;
PWM_REG[11] = value;
if(Volume == 0)
AUDIO_MUTE();
else
AUDIO_On();
// }
if((flag3 & BIT_2) != 0x00){
printf("Volume = %x\r\n",(unsigned short)value);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -