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

📄 modectrl.c

📁 这是T118和T103的通用程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//	Description: Get VSync. period  
//	Output:		 dwVSyncCount : VSync period.
//	---------------------------------------------------------------
uDWORD GetInputVSyncXclkCnt(void)			 
{
	uDWORD dwVSyncCount;

	I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)&0xEF);	// Disable HSo source from PLL.
	
	m_dwBuff[0] = 0;
	m_cBuff[1]=20;
RECHECK:		
	twdDelay(100);		
	m_cBuff[1]--;
	m_cBuff[0] = I2CReadByte(TW803_P0, 0x50);
	I2CWriteByte(TW803_P0, 0x50, m_cBuff[0] | 0x10);    	//Enable VSYNC counter
	m_cBuff[0] = 100;
	while(m_cBuff[0]--)
	{
		twdDelay(1);
		if ((I2CReadByte(TW803_P0, 0x50)&0x20)) //V sync counter is done exit
			break;
	}	   
	m_cBuff[0] = I2CReadByte(TW803_P0, 0x50);
	m_cBuff[0] &= 0xCF;			//Disable Auto Position
	I2CWriteByte(TW803_P0, 0x50, m_cBuff[0]);

	dwVSyncCount =  I2CReadByte(TW803_P0, 0x53);
	dwVSyncCount <<= 8;
	dwVSyncCount |= I2CReadByte(TW803_P0, 0x52);
	dwVSyncCount <<= 8;
	dwVSyncCount |= I2CReadByte(TW803_P0, 0x51);
	if((m_dwBuff[0]&0xFFFF00)!=(dwVSyncCount&0xFFFF00))
	{
		m_dwBuff[0] = dwVSyncCount;
		if(m_cBuff[1])
			goto RECHECK;
	}
	I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)|(~0xEF)); 	// Enable HSo source from PLL.
	return dwVSyncCount;	
}
void VGAScaling(void)
{
	float x;
 	m_wBuff[0] = I2CReadByte(TW803_P0, 0x59);
	m_wBuff[0] <<= 8;
	m_wBuff[0] |= I2CReadByte(TW803_P0, 0x58);	

	switch(m_cDspPllSwitch)
	{
		case DSPPLL_100:x=DNDIV_100;break;
		case DSPPLL_108:x=DNDIV_108;break;
		case DSPPLL_120:x=DNDIV_120;break;
		case DSPPLL_136:x=DNDIV_136;break;
		case DSPPLL_140:x=DNDIV_140;break;
		default:x=DNDIV_108;break;
	}

	//if((float)EepPrivate.wHTotal*32/ m_wBuff[0]>x) 
	if((float)m_pModeDescriptorPtr->wHTotal*32/ m_wBuff[0]>x)
		I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)|DCLKI_IS_FASTER);	//Input clk faster, enable this bit
	else
		I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0,0x70)&~DCLKI_IS_FASTER);	//Input clk slower, disable this bit
 
	//Horizontal	
	m_wBuff[0] = (float)m_wHRes/VGAState.HDispSize * 0x2000; 
	I2CWriteByte(TW803_P0, SC_HOR_H1, (uCHAR)m_wBuff[0]);
    I2CWriteByte(TW803_P0, SC_HOR_H2, (uCHAR)(m_wBuff[0]>>8));

	//Vertical
	if(!(m_cModeStatus & VSYNCOVERRANGE))
	{
		m_wBuff[0] = (float)m_wVRes/(VGAState.VDispSize) * 0x2000;
	}
	else
	{
		m_wBuff[0] = (float)m_wVRes/(VGAState.VDispSize) * 0x2000;  
	}

	I2CWriteByte(TW803_P0, SC_VER_V1, (uCHAR)m_wBuff[0]);
	I2CWriteByte(TW803_P0, SC_VER_V2, (uCHAR)(m_wBuff[0]>>8)); 
	I2CWriteByte(TW803_P0, 0xDC, (uCHAR)VGAState.HDispSize);
	I2CWriteByte(TW803_P0, 0xDD, (uCHAR)(VGAState.HDispSize>>8));
	I2CWriteByte(TW803_P0, 0xDE, (uCHAR)VGAState.VDispSize);
	I2CWriteByte(TW803_P0, 0xDF, (uCHAR)(VGAState.VDispSize>>8));
}

void VGASetPll(void)
{								
	switch(m_pModeDescriptorPtr->cModeFlags0 & DSPPLL_MASK)
	{
		case bDSPPLL_100:m_cDspPllSwitch=DSPPLL_100;break;
		case bDSPPLL_108:m_cDspPllSwitch=DSPPLL_108;break;
		case bDSPPLL_120:m_cDspPllSwitch=DSPPLL_120;break;
		case bDSPPLL_136:m_cDspPllSwitch=DSPPLL_136;break;
		case bDSPPLL_140:m_cDspPllSwitch=DSPPLL_140;break;
		default:m_cDspPllSwitch=DSPPLL_108;break;
	}
	switch(m_cDspPllSwitch)
	{
		case DSPPLL_100:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_100);break;
		case DSPPLL_108:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_108);break;
		case DSPPLL_120:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_120);break;
		case DSPPLL_136:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_136);break;
		case DSPPLL_140:I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_140);break;  
		default:	I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_108);break;
	}  						   
	I2CWriteByte(TW803_P0, PLLDIV_I,DIDIV);
	I2CWriteByte(TW803_P0, PLLDIV_O,0x10|DODIV); 
 /*	m_cDspPllSwitch=DSPPLL_140;
	I2CWriteByte(TW803_P0, PLLDIV_F,DFDIV_140);
	I2CWriteByte(TW803_P0, PLLDIV_I,DIDIV);
	I2CWriteByte(TW803_P0, PLLDIV_O,0x10|DODIV);	 */
}												  



// ================================================================
//	VGACalOPTiming							Kevin Hsu.	Mar. 15th, 2006
// ================================================================
//	Description: Calculate output timming.  
//	Output:		 None.
//	--------------------------------------------------------------- 
#define LB_WIDTH 1280	// For T103											   
void VGACalOPTiming(void)
{
	uWORD wDVTotal, wDHTotal, wDVBILK, wTemp;
	float Temp, DNDIV_40_Temp;

	//~ Calculate PH_TOT and PV_TOT ~//
	m_wBuff[0] = I2CReadByte(TW803_P0, 0x59);
	m_wBuff[0] <<= 8;
	m_wBuff[0] |= I2CReadByte(TW803_P0, 0x58);	
	m_wBuff[0] /= 32;	
	m_dwBuff[0] = I2CReadByte(TW803_P0, 0x53);
	m_dwBuff[0] <<= 8;
	m_dwBuff[0] |= I2CReadByte(TW803_P0, 0x52);					 	
	m_dwBuff[0] <<= 8;
	m_dwBuff[0] |= I2CReadByte(TW803_P0, 0x51);
	DNDIV_40_Temp = ((float)(I2CReadByte(TW803_P0, PLLDIV_F)+2)/(DIDIV+2)/DRDIV);
	Temp = (27000000.0/m_dwBuff[0])*m_pModeDescriptorPtr->wHTotal*m_pModeDescriptorPtr->wVTotal;
	if(Temp>(DNDIV_40_Temp*27000000.0))
		I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)|0x20);
	else
		I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)&0xDF);	
	wDHTotal=(float)m_wBuff[0]*m_wVRes*DNDIV_40_Temp/VGAState.VDispSize;		   	
	wDVTotal=((DNDIV_40_Temp*(float)XCLK)/(float)(((float)(XCLK)/m_pModeDescriptorPtr->dwVFrameCount)*wDHTotal));

	twdDelay(100);
	m_dwBuff[1]=I2CReadByte(TW803_P0, 0x83);
	m_dwBuff[1] <<= 8;
	m_dwBuff[1]=I2CReadByte(TW803_P0, 0x82);
	m_dwBuff[1] <<= 8;
  	m_dwBuff[1] |= I2CReadByte(TW803_P0, 0x81);
	wDVBILK=m_dwBuff[1];
	
	//~ Calculate back porch "DWHS" ~//
	wTemp = ((wDHTotal - DWHSZ - DISP_DFLT_HSWIDTH)>>1); 

	I2CWriteByte(TW803_P0, 0xB0, wTemp);
	I2CWriteByte(TW803_P0, 0xB1, wTemp>>8);//Horizontal back porch	
	I2CWriteByte(TW803_P0, 0xB2, DISP_DFLT_VDS);
	I2CWriteByte(TW803_P0, 0xB3, DISP_DFLT_VDS>>8);//Vertical back porch 
	I2CWriteByte(TW803_P0, 0xB4,(uCHAR)(DWHSZ));	
	I2CWriteByte(TW803_P0, 0xB5,(uCHAR)(DWHSZ>>8));//Horizontal width
	I2CWriteByte(TW803_P0, 0xB6,(uCHAR)(DWVSZ));	
	I2CWriteByte(TW803_P0, 0xB7,(uCHAR)(DWVSZ>>8));//Vertical height
	I2CWriteByte(TW803_P0, 0xB8,(uCHAR) wDHTotal);
	I2CWriteByte(TW803_P0, 0xB9,(uCHAR)(wDHTotal>>8));//Htotal
	I2CWriteByte(TW803_P0, 0xBA,(uCHAR) wDVTotal);
	I2CWriteByte(TW803_P0, 0xBB,(uCHAR)(wDVTotal>>8));//Vtotal	              
	I2CWriteByte(TW803_P0, 0xBC,(uCHAR) DISP_DFLT_HSWIDTH);
	I2CWriteByte(TW803_P0, 0xBD,(uCHAR)(DISP_DFLT_HSWIDTH>>8));//HSYNC Width	
	I2CWriteByte(TW803_P0, 0xBE,(uCHAR) DISP_DFLT_VSWIDTH);
	I2CWriteByte(TW803_P0, 0xBF,(uCHAR)(DISP_DFLT_VSWIDTH>>8));//VSYNC Width	 
			 
	//~ Calculate line buffer ~//
	if(H_Size>m_wHRes) 				  // HSize in LB
		m_wBuff[1] = m_wHRes; 
	else
		m_wBuff[1] = H_Size; 
	
	if(LB_WIDTH >= (m_wBuff[1]<<1))	  //PREFILL Size
		Temp = 4.0;					
	else
	{
		Temp = 2.45 - ((float)(m_wVRes)/V_Size)/2.0;
	 	if(LB_WIDTH>=m_wBuff[1])
			Temp += (LB_WIDTH-m_wBuff[1])/m_wBuff[1];
		else
			Temp += 0;
	}		 
	
	m_wBuff[1] = ((Temp-(int)(Temp))*m_wHRes/m_pModeDescriptorPtr->wHTotal + (int)(Temp))*m_wBuff[0]; // T_PerFill
	m_wBuff[2] = ((DISP_DFLT_VSWIDTH+DISP_DFLT_VDS+I2CReadByte(TW803_P0, 0xDA))*wDHTotal + DISP_DFLT_HSWIDTH + wTemp + I2CReadByte(TW803_P0, 0xD8))/DNDIV_40_Temp; //VBo_Xclk
	m_dwBuff[1] =I2CReadByte(TW803_P0, 0x53);
	m_dwBuff[1] <<= 8;
	m_dwBuff[1] |=I2CReadByte(TW803_P0, 0x52);
	m_dwBuff[1] <<= 8;
  	m_dwBuff[1] |= I2CReadByte(TW803_P0, 0x51);
	Temp = ((m_dwBuff[1]+1)*DNDIV_40_Temp * m_wVRes)/((m_dwBuff[1]/m_wBuff[0]) *VGAState.VDispSize);  // Ideal PH_TOT
	m_wBuff[0] =  (Temp - (float)wDHTotal)*VGAState.VDispSize/DNDIV_40_Temp/2;
 	//~ VSDLY_XCLK = T_PreFill + VBi_XClk + (End_LB_Short/2) - VBo_Xclk ~//
	m_dwBuff[0] = m_wBuff[1] + wDVBILK +m_wBuff[0];
	wTemp = m_dwBuff[0]-m_wBuff[2];	 	  
	I2CWriteByte(TW803_P0, 0x84, wTemp);
	I2CWriteByte(TW803_P0, 0x85, wTemp>>8);//line buffer delay XClk


/*-------------------------------------------------------------------------
 Phil 060921 for 17" panel VGA    
-------------------------------------------------------------------------*/
#if (defined __FUJI_17_DIGITAL__)
        I2CWriteByte(TW803_P0, 0x20, 0x80);
        I2CWriteByte(TW803_P0, 0x21, 0x07);

        I2CWriteByte(TW803_P0, 0x30, 0x03);
		I2CWriteByte(TW803_P0, 0x32, 0x3F);
		I2CWriteByte(TW803_P0, 0x36, 0xBC);
		I2CWriteByte(TW803_P0, 0x3F, 0x00);
		
		I2CWriteByte(TW803_P0, 0x48, 0x20);
        I2CWriteByte(TW803_P0, 0x4C, 0xCA);
		I2CWriteByte(TW803_P0, 0x4E, 0x11);		
		I2CWriteByte(TW803_P0, 0x54, 0x20);
		I2CWriteByte(TW803_P0, 0x63, 0x0F);
		I2CWriteByte(TW803_P0, 0x68, 0x9B);
		I2CWriteByte(TW803_P0, 0x69, 0xA7);
		I2CWriteByte(TW803_P0, 0x72, 0x00);
		I2CWriteByte(TW803_P0, 0x74, 0x00);
		I2CWriteByte(TW803_P0, 0x84, 0x8D);
		I2CWriteByte(TW803_P0, 0x85, 0x28);
		I2CWriteByte(TW803_P0, 0x87, 0xFF);
		I2CWriteByte(TW803_P0, 0x90, 0x01);
		I2CWriteByte(TW803_P0, 0x91, 0x00);
		I2CWriteByte(TW803_P0, 0xA0, 0x00);
		I2CWriteByte(TW803_P0, 0xA1, 0x00);
		I2CWriteByte(TW803_P0, 0xB0, 0x3A);
		I2CWriteByte(TW803_P0, 0xB2, 0x0E);
		I2CWriteByte(TW803_P0, 0xB8, 0x94);
		I2CWriteByte(TW803_P0, 0xB9, 0x05);
		I2CWriteByte(TW803_P0, 0xBA, 0x26);
		I2CWriteByte(TW803_P0, 0xC1, 0x00);
		I2CWriteByte(TW803_P0, 0xC8, 0x27);
		I2CWriteByte(TW803_P0, 0xE0, 0xB0);
		
		I2CWriteByte(TW803_P0, 0xDE, 0x00);
		I2CWriteByte(TW803_P0, 0xDF, 0x03);	
#endif
/*-------------------------------------------------------------------------
 Phil 060921 for 17" panel VGA    
-------------------------------------------------------------------------*/
	m_dwBuff[0]=(wDVTotal-m_wVRes-DWVSST-DISP_DFLT_VSWIDTH)*wDHTotal;
	m_dwBuff[1]=wTemp*DNDIV_40_Temp;
	if(m_dwBuff[0]<m_dwBuff[1])
		I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)|0x20);
	else
		I2CWriteByte(TW803_P0, 0x70, I2CReadByte(TW803_P0, 0x70)&0xDF);	  
} 	 																	  



/*   S Y N C   C H A N G   D E C T   */
/*-------------------------------------------------------------------------
    sync changed or lost?
-------------------------------------------------------------------------*/
BOOL SyncChangDect()
{
	//~ Detect V/H Sync changed. ~//
	if(I2CReadByte(TW803_P0, 0x32)&0x0F)
	{
		ClosePanel(0x10,0xFF,0x40);	  
		if(!SrcAnalogProcess()) 
		{
			I2CWriteByte(TW803_P0, 0x32, 0x0F);	
			return FALSE;
		}
		I2CWriteByte(TW803_P0, 0x32, 0x0C);	
		return TRUE;
	}
	//~ Detect if V/H Sync lost. ~//
	if((I2CReadByte(TW803_P0, 0x32)&0x03)==0x03)
	{  		
		ClosePanel(0x10,0xFF,0x40);
		I2CWriteByte(TW803_P0, 0x32, 0x0F);
		return FALSE;
	} 					   
	return TRUE;
	

}

BOOL SrcAnalogProcess(void)
{
	Sync_Mode_Detect();
	if(!ModeDetect()) return FALSE;
	SetupMode();
	VGASetPll(); 	
	AutoPositionAdj(0xF0);
	VGAState.HDispSize = H_Size;
	VGAState.VDispSize = V_Size;
	VGAState.fHDispSize = H_Size;
	VGAState.fVDispSize = V_Size;
	VGAState.AdjHATV = m_wHRes; 
	VGAState.AdjVATV = m_wVRes; 
	VGACalOPTiming();
	VGAScaling(); 
	if((I2CReadByte(TW803_P0, 0x32)&0x03))  return FALSE;
	I2CWriteByte(TW803_P0, 0xE2, 0x11);
	OpenPanel();
	I2CWriteByte(TW803_P0, INT_STATUS, 0x3f);
	AutoPhaseAdj();	
	I2CWriteByte(TW803_P0, INT_STATUS, 0x3f);
	VGAState.PositionH = I2CReadByte(TW803_P0, 0x45);
	I2CWriteByte(TW803_P0, 0xE2, 0x11);		
	VGAState.ADCVBaPorch = I2CReadByte(TW803_P0, VSST_L)|(I2CReadByte(TW803_P0, VSST_H)<<8);	
	VGAState.ADCHBaPorch = I2CReadByte(TW803_P0, HSST_L)|(I2CReadByte(TW803_P0, HSST_H)<<8);	
	VGAState.HATV = I2CReadByte(TW803_P0, HATVC_L)|(I2CReadByte(TW803_P0, HATVC_H)<<8);
	VGAState.VATV = I2CReadByte(TW803_P0, VATVR_L)|(I2CReadByte(TW803_P0, VATVR_H)<<8);	
	OSDVGAValueSet(); 
	return TRUE;
}

#endif









⌨️ 快捷键说明

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