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

📄 scaler.c

📁 车载DVD的主控MCU的源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	//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 + -