📄 scaler.c
字号:
#include "Scaler.H"
#include "MCU.H"
#include "UserAdj.H"
#include "MyDef.H"
#include "F63REG.H"
#include "IIC.H"
#include "stdio.h"
#include "PANEL.H"
#include "RAM.H"
#include "sRGB.H"
#include "OSD.H"
#if 0
#define DT63 0x80
#else
#define DT63 0x00
#endif
#if PanelDepth == 6
#define DisplayColorDepth 0xff
#else
#define DisplayColorDepth 0x00
#endif
#if PanelTwoPixelPerClk == 1
#define DisplayBusWidth 0x00
#else
#define DisplayBusWidth 0xff
#endif
#if PanelSync_DE == 1
#define DisplaySyncMode 0xff
#else
#define DisplaySyncMode 0x00
#endif
#define DisplayControl (0x68 | (DisplayColorDepth & BIT_2) | (DisplayBusWidth & BIT_1) | (DisplaySyncMode & BIT_0))
#define DT5E (unsigned char)PanelPadDrive
#define DT5F (unsigned char)(PanelPadDrive >> 8)
#define DT61 ((Panel_Invert_DVS & BIT_0) | (Panel_Invert_DHS & BIT_1) | (Panel_Invert_DCLK & BIT_2) | (Panel_Invert_DEN & BIT_3))
code unsigned short H_ActiveTab[]={
// 640,720,640,800,832,1024,1152,1280,1280,1600,1280,1280,1280,848,1152,720
1280,720,1280,800,832,1024,1152,1280,1280,1600,1280,1280,1280,848,1152,720
};
code unsigned short V_ActiveTab[]={
350,400,480,600,624,768,864,960,1024,1200,0,0,720,480,870,576
};
/*
#if PANEL == CPT_CLAA150XG08
code unsigned char TCON_Tab[]={
// 0 1 2 3 4 5 6 7 8 9 a
#if 1
0x00,0x62,0x22,0x0f,0x08,0x62,0x01,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x07,0x04,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x81,0x02,0x81,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0xe0,0x03,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
#else
0x00,0x62,0x22,0x0f,0x08,0x62,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x04,0x04,0x48,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x03,0xa0,0x03,0xa0,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x8c,0x01,0x8a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0xc0,0x03,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0xe0,0x03,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
#endif
};
#endif
*/
#if PANEL == QD170ER01
code unsigned char TCON_Tab[]={
// 0 1 2 3 4 5 6 7 8 9 a
0x00,0x60,0x22,0x03,0x08,0x66,0x00,0x88,0x10,0x80,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x04,0x05,0x70,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x04,0xf6,0x04,0xf6,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x8c,0x02,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x04,0x05,0x56,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x04,0x3a,0x05,0xc0,0x03,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x04,0x04,0x56,0x02,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
};
#endif
/*
#if PANEL == INNONLUX_RSDS
code unsigned char TCON_Tab[]={
// 0 1 2 3 4 5 6 7 8 9 a
0x00,0x62,0x22,0x0f,0x08,0xa3,0x01,0x86,0x10,0x80,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x04,0x05,0x48,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0xa0,0x04,0xa0,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x8c,0x02,0x8a,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0xc0,0x04,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0xe0,0x04,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
};
#endif
*/
void UpdatePresetData(void)
{
code unsigned char UpdateSquenceTable[]={
0x0a,0x09,0x0B,0x0C,0x12,0x13,0x14,0x15,
0x16,0x17,0x18,0x19,0x1A,0x1B,0x4D,0x5E,
0x5F,0x60,0x61,0x63,0x6f
};
code unsigned char D1024x768[]={
0x1E,0x05,0x51,0x84,0x08,0x00,0x1D,0x00,
0x00,0x03,0x95,0x00,0x00,0x04,0x00,DT5E,
DT5F,0x03,DT61,DT63,0x0f
};
unsigned char i;
for(i=0; i<21; i++){
WriteIIC_HW(Scaler_Addr,UpdateSquenceTable[i],D1024x768[i]);
}
}
void InitScaler(void)
{
unsigned char i;
code unsigned char InitTab[30][2]={
{0x01,(0x48|DT01)},
{0x4E,(unsigned char)PanelTypVTotal},{0x4F,(unsigned char)(PanelTypVTotal>>8)}, // Display Vtotal
{0x50,(unsigned char)PanelHeight},{0x51,(unsigned char)(PanelHeight>>8)}, // Display VActive
{0x52,(unsigned char)PanelVSyncStart},{0x53,(unsigned char)(PanelVSyncStart>>8)}, // Display VStart
{0x54,(unsigned char)PanelVSyncEnd},{0x55,(unsigned char)(PanelVSyncEnd>>8)}, // Display VEnd
{0x56,(unsigned char)PanelMinHTotal},{0x57,(unsigned char)(PanelMinHTotal>>8)}, // Display Htotal
{0x58,(unsigned char)PanelWidth},{0x59,(unsigned char)(PanelWidth>>8)}, // Display HActive
{0x5A,(unsigned char)PanelHSyncStart},{0x5B,(unsigned char)(PanelHSyncStart>>8)}, // Display HStart
{0x5C,(unsigned char)PanelHSyncEnd},{0x5D,(unsigned char)(PanelHSyncEnd>>8)}, // Display HEnd
{0x85,0x04}, //04
{0x86,0xc0}, // Sync Processor Ctrl: Enable Free-run
{0x87,0xc0}, // H/V Sync input Ctrl: Separate Sync input
{0x88,0xc8}, // H/V Sync output Ctrl: Free-Run Output enable
{0x8b,0x0f},
{0x91,0xFF}, // H/V interrupt clear
{0x92,0x00}, // H/V interrupt enable
{0x93,0x40}, // Fast mute ctrl
{0x94,0xa6}, //0xc4
{0xe6,0x03},
{0xf8,DTF8},
{0xfd,0x05},
// {0xfb,0xc3},
};
if((flag3 & BIT_2) != 0x00)
printf("Init Scaler\r\n");
TCONInit();
for(i=0; i<29; i++) {
WriteIIC_HW(Scaler_Addr,InitTab[i][0],InitTab[i][1]);
}
UpdatePresetData();
if(Use_TCON != 0){
WriteIIC_HW(Scaler_Addr,0xfa,0xc0);
WriteIIC_HW(Scaler_Addr,0xfb,0x00);
WriteIIC_HW(Scaler_Addr,0xfe,0xc1);
}
else{
WriteIIC_HW(Scaler_Addr,0xfa,0x00);
WriteIIC_HW(Scaler_Addr,0xfb,0x00);
WriteIIC_HW(Scaler_Addr,0xfe,0xc0);
}
SetDPLL(FreeRunH_Freq*PanelMinHTotal/1000);
WriteIIC_HW(Scaler_Addr,0x03,0x00);
WriteIIC_HW(Scaler_Addr,0x05,0x00);
WriteIIC_HW(Scaler_Addr,0x07,0x00);
WriteIIC_HW(Scaler_Addr,0x40,0x01);
WriteIIC_HW(Scaler_Addr,0xf4,0xc0);
WriteIIC_HW(Scaler_Addr,0x4c,DisplayControl);
WriteIIC_HW(Scaler_Addr,0x4d,0x02);
//Noise reduction
WriteIIC_HW(Scaler_Addr,0x42,0x3a);
WriteIIC_HW(Scaler_Addr,0x43,0x43);
// WriteIIC_HW(Scaler_Addr,0x44,0x12); //orange
// WriteIIC_HW(Scaler_Addr,0x45,0x30);
// WriteIIC_HW(Scaler_Addr,0x49,0x10);
//
WriteIIC_HW(Scaler_Addr,0xb3,0x09);
if((flag3 & BIT_2) != 0x00)
printf(PanelName);
DVI_On();
}
void TCONInit(void)
{
unsigned char i;
WriteIIC_HW(Scaler_Addr,0xFF,0x01); // page1 enable
#if Use_TCON != 0
if((flag3 & BIT_2) != 0x00)
printf("TCON Init\r\n");
for(i=0; i<0x70; i=i+16){
WritePageScaler(i,i,TCON_Tab);
}
for(i=0x70; i<0x7b; i++){
WriteIIC_HW(Scaler_Addr,i,TCON_Tab[i]);
}
for(i=0x80; i<0xa0; i=i+16){
WritePageScaler(i,i,TCON_Tab);
}
#endif
#if Panel_Spread_Spect_En == 0xff
i = (PanelSpreadSpectrumCtrl << 1) | BIT_0;
WriteIIC_HW(Scaler_Addr,0xf5,i);
#endif
WriteIIC_HW(Scaler_Addr,0xFF,0x00); // page1 disable
}
#if Use_TCON != 0
void WritePageScaler(unsigned char addr1,unsigned char addr2,unsigned char *p)
{
unsigned char i,ch;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = Scaler_Addr;
IIC1_CLK = 0x20 | IIC_BaudRate;
IIC1_CON = 0x00;
/* transmit addr */
MasterSendByte(addr1);
/* transmit data */
for(i=0; i<16; i++){
ch = p[addr2 + i];
MasterSendByte(ch);
}
/* transmit dumy data for stop bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
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,temp;
if(ModePoint >= ModeNum)//define ModeMun 50
return;
if(SyncMode != 3)
//0 = Separate H & V
//1 = H+V
//2 = Sync on green
{
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
}
else{
WriteWordIIC_HW(Scaler_Addr,0x16,V_ActiveTab[r]); // Capture V_Active
}
WriteWordIIC_HW(Scaler_Addr,0x1a,H_ActiveTab[r]); // Capture H_Active
// 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
/*************************************************************************/
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) / V_ActiveTab[r] + 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -