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

📄 scaler.c

📁 NOVATEK公司的LCD_CONTROLLER源代码 液晶显示器驱动板源代码NT68521
💻 C
📖 第 1 页 / 共 3 页
字号:
	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;
	if(ModePoint >= ModeNum)
		return;
	if(SyncMode != 3){
		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
		i = V_ActiveTab[r]>>1;
	}
	else{
		WriteWordIIC_HW(Scaler_Addr,0x16,V_ActiveTab[r]);		// Capture V_Active
		i = V_ActiveTab[r];
	}
	WriteWordIIC_HW(Scaler_Addr,0x1a,H_ActiveTab[r]);		// Capture H_Active
	if(H_Act == PanelWidth)
		WriteIIC_HW(Scaler_Addr,0x43,0x43);
	else
		WriteIIC_HW(Scaler_Addr,0x43,0x00);
// 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
	dstHtotal = PanelMinHTotal;
// calculate dst vtotal
	dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[r] + 8) >> 4;	//add .5 for rounding, make even

	if(dclk < PanelMinPClk){                            
		dstHtotal = PanelTypHTotal;
	}
	else if(dclk > PanelMaxPClk){
		DispActiveHeight = (unsigned long)PanelHeight * PanelMaxPClk / dclk;
		if(i < PanelHeight)
			i = (unsigned long)i * dclk / PanelMaxPClk;
		WriteWordIIC_HW(Scaler_Addr,0x16,i);		// Capture V_Active
		// calculate new dst vtotal
		dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[r] + 8) >> 4;	//add .5 for rounding, make even
	}
	dclk = ((long)dstHtotal * dstVtotal * V_SYNC + 5) / 10;

	if(dstVtotal < PanelMinVTotal){
		dstVtotal = PanelMinVTotal;
		dstHtotal = PanelTypHTotal;
		dclk = ((unsigned long)PanelTypHTotal * dstVtotal* V_SYNC + 5) / 10;	//Hz
		DV_HFreq = dclk / PanelMinHTotal / 100;
	}
	else{
// HFreq
		DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC / 1000);
	}

	SetDPLL(dclk);
// Htotal
	Sleep(80);
	dstHtotal = ReadWordIIC_HW(Scaler_Addr,0x67) & 0x07ff;
	dstVtotal = dclk * 10 / dstHtotal / V_SYNC;	
	
	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);
	}

	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 DispActiveHeight,dstVtotal,DV_HFreq,dstHtotal,i;
unsigned long dclk;
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
	i = V_ActTab[Vfreq];
	WriteWordIIC_HW(Scaler_Addr,0x1a,H_ActTab[Vfreq]);		// Display H_Active
// calculate dclk for reference
	dclk = ((unsigned long)PanelHeight * VTotal / V_ActTab[Vfreq]) * V_SYNC * PanelMinHTotal / 10000;	//KHz
	DispActiveHeight = PanelHeight;				// set the vertical active height to the Panel Height
	dstHtotal = PanelMinHTotal;
// calculate dstVtotal
	dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[Vfreq] + 8) >> 4;	//add .5 for rounding, make even
// check and calculate dclk
	if(dclk < PanelMinPClk){                            
		dstHtotal = PanelTypHTotal;
	}
	else if(dclk > PanelMaxPClk){
		DispActiveHeight = (unsigned long)PanelHeight * PanelMaxPClk / dclk;
		if(i < PanelHeight)
			i = (unsigned long)i * dclk / PanelMaxPClk;
		WriteWordIIC_HW(Scaler_Addr,0x16,i);		// Capture V_Active
		// calculate new dst vtotal
		dstVtotal = ((((unsigned long)VTotal * DispActiveHeight) << 4) / V_ActiveTab[Vfreq] + 8) >> 4;	//add .5 for rounding, make even
	}
	dclk = ((long)dstHtotal * dstVtotal * V_SYNC + 5) / 10;

	if(dstVtotal < PanelMinVTotal){
		dstVtotal = PanelMinVTotal;
		dstHtotal = PanelTypHTotal;
		dclk = ((unsigned long)PanelTypHTotal * dstVtotal* V_SYNC + 5) / 10;	//Hz
		DV_HFreq = dclk / PanelMinHTotal / 100;
	}
	else{
// HFreq
		DV_HFreq = (unsigned short)((unsigned long)dstVtotal * V_SYNC / 1000);
	}

	SetDPLL(dclk);
// Htotal
	Sleep(80);
	dstHtotal = ReadWordIIC_HW(Scaler_Addr,0x67) & 0x07ff;
	dstVtotal = dclk * 10 / dstHtotal / V_SYNC;	

	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);
	}

	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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -