⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scaler.c

📁 NT68521源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -