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

📄 scaler.c

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