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

📄 modectrl.c

📁 这是T118和T103的通用程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		I2CWriteByte(TW803_P0,0x14,0x65);
		twdDelay(500);
		//~ Enable CSync detect and XCLK ~//
	/*	I2CWriteByte(TW803_P0,0x13,0x22);
		twdDelay(1000);
		
		if(I2CReadByte(TW803_P0, 0x13)&0x80) //~ Check CSync detection is done or not. ~//
		{
			//~ If true, sync is Composite type. ~//
			m_Synctype=Sync_CS;
		}
		else							     //~ Sync. is Separate type. ~//
		{*/
			//~ Setup Separate type. ~// 	  			
			m_Synctype=Sync_SS;  
			//~ Setup Separate type route. ~// 
			I2CWriteByte(TW803_P0,0x14,0xF0);
		
		//}  
	}
	else  									 //~ No HS and VS, we suppose that synchronize is SOG type. ~//
	{	
		//~ Setup SOG/SOY type. ~//
		m_Synctype=Sync_SOG;  
		//~ Set up SOG/SOY  polarity. We set it as non-invert. ~//
		I2CWriteByte(TW803_P0,0x10,0x39);
		//~ Setup SOG/SOY  type route. ~//
		I2CWriteByte(TW803_P0,0x11,0x20);
		I2CWriteByte(TW803_P0,0x12,0xef);
		I2CWriteByte(TW803_P0,0x14,0x6c);	
	}

}


void SearchAltMode(void)
{
	m_pModeDescriptorPtr = &ModeTable[EepPrivate.cModeID];

	m_cBuff[0] = m_pModeDescriptorPtr->cResID;
	m_pResolutionPtr = &ResolutionTable[m_cBuff[0]];

	if(m_pModeDescriptorPtr->cModeFlags1 & bSubSample)
	{
		SetModeCaptureData(m_pModeDescriptorPtr->wHTotal/2, (m_pModeDescriptorPtr->wHBlk-HOFFSETPW-HOFFSET_MIN)/2,
        	(m_pModeDescriptorPtr->cVBlk-VSGEPW),m_pModeDescriptorPtr->cModeFlags2);
	}
	else if(m_pModeDescriptorPtr->cModeFlags1 & bDoubSample)
	{
		SetModeCaptureData(m_pModeDescriptorPtr->wHTotal*2, (m_pModeDescriptorPtr->wHBlk-HOFFSETPW-HOFFSET_MIN)*2,
        	(m_pModeDescriptorPtr->cVBlk-VSGEPW),m_pModeDescriptorPtr->cModeFlags2);
	}
	else
	{
		SetModeCaptureData(m_pModeDescriptorPtr->wHTotal,(m_pModeDescriptorPtr->wHBlk-HOFFSETPW-HOFFSET_MIN),
    		(m_pModeDescriptorPtr->cVBlk-VSGEPW), m_pModeDescriptorPtr->cModeFlags2);
	}

	
	if(!m_bDosMode)
  	{
		GetVResolution();
		if(abs(m_pResolutionPtr->wVRes-m_wVRes) >2)
		{
			m_dwBuff[0] = 0;
			m_bAlt = GetAlternate();
		}	  
		else
		{
			m_wBuff[0] = m_pModeDescriptorPtr->wHTotal; 
			m_dwBuff[0] = GetPhaseDelta(m_wBuff[0]);
			m_bAlt = GetAlternate();      
		}
	}
	else
	{
  		m_wBuff[0] = m_pModeDescriptorPtr->wHTotal; 
		m_dwBuff[0] = GetPhaseDelta(m_wBuff[0]);
		m_bAlt = GetAlternate();
	}	
}

BOOL GetAlternate(void)
{
	m_cBuff[2] = 0xFF;           
	        
	for (m_cBuff[0] = 0; m_cBuff[0] <= ALTHTOTAL; m_cBuff[0]++)
	{
		m_pAltHTotalPtr = &AltHTotals[m_cBuff[0]];
		if (m_pAltHTotalPtr->cModeID == EepPrivate.cModeID)
		{
			if(!m_bDosMode)	//None Dos Mode
			{
				m_cBuff[1] = m_pAltHTotalPtr->cResID;
				m_pResolutionPtr = &ResolutionTable[m_cBuff[1]];
				if ((m_cBuff[3] = abs(m_wVRes - m_pResolutionPtr->wVRes)) < 5)
				{
					if(m_pAltHTotalPtr->cModeFlags & bSubSample)
					{
		    			SetModeCaptureData(m_pAltHTotalPtr->wHTotal/2,(m_pAltHTotalPtr->wHBlk-HOFFSETPW-HOFFSET_MIN)/2,
											(m_pAltHTotalPtr->cVBlk-VSGEPW),m_pAltHTotalPtr->cModeFlags);
					}
					else if(m_pAltHTotalPtr->cModeFlags & bDoubSample)
					{
		    			SetModeCaptureData(m_pAltHTotalPtr->wHTotal*2,(m_pAltHTotalPtr->wHBlk-HOFFSETPW-HOFFSET_MIN)*2,
											(m_pAltHTotalPtr->cVBlk-VSGEPW),m_pAltHTotalPtr->cModeFlags);
					}
					else
					{
					SetModeCaptureData(m_pAltHTotalPtr->wHTotal,(m_pAltHTotalPtr->wHBlk-HOFFSETPW-HOFFSET_MIN),
										(m_pAltHTotalPtr->cVBlk-VSGEPW), m_pAltHTotalPtr->cModeFlags);
					}

					twdDelay(300);  //Add for 3100
					m_wBuff[0] = m_pAltHTotalPtr->wHTotal; 
					m_dwBuff[1] = GetPhaseDelta(m_wBuff[0]);
					//Keep bigger one
					if(m_dwBuff[0] < m_dwBuff[1])
					{
						m_dwBuff[0] = m_dwBuff[1];
						EepPrivate.cAltID    = m_cBuff[0];
					}
				}
			}
			else				//Dos Mode
			{
        		if(m_pAltHTotalPtr->cModeFlags & bSubSample)
			{
		    		SetModeCaptureData(m_pAltHTotalPtr->wHTotal/2,(m_pAltHTotalPtr->wHBlk-HOFFSETPW-HOFFSET_MIN)/2,
										(m_pAltHTotalPtr->cVBlk-VSGEPW),m_pAltHTotalPtr->cModeFlags);
			}
			else if(m_pAltHTotalPtr->cModeFlags & bDoubSample)
			{
		    		SetModeCaptureData(m_pAltHTotalPtr->wHTotal*2,(m_pAltHTotalPtr->wHBlk-HOFFSETPW-HOFFSET_MIN)*2,
										(m_pAltHTotalPtr->cVBlk-VSGEPW),m_pAltHTotalPtr->cModeFlags);
			}
			else
			{
				SetModeCaptureData(m_pAltHTotalPtr->wHTotal,(m_pAltHTotalPtr->wHBlk-HOFFSETPW-HOFFSET_MIN),
									(m_pAltHTotalPtr->cVBlk-VSGEPW), m_pAltHTotalPtr->cModeFlags);
			}

			twdDelay(300);  //Add for 3100
			m_wBuff[0] = m_pAltHTotalPtr->wHTotal; 
			m_dwBuff[1] = GetPhaseDelta(m_wBuff[0]);
			//Keep bigger one
			if(m_dwBuff[0] < m_dwBuff[1])
			{
				m_dwBuff[0] = m_dwBuff[1];
				EepPrivate.cAltID    = m_cBuff[0];
			}
			}
		}
	}	
        
	if (EepPrivate.cAltID == 0xff)
		return FALSE;
	else 
		return TRUE;
}


void SetModeCaptureData(uWORD wHTotal, uWORD wHsst, uCHAR cVsst, uCHAR cVCO)
{
	//~ Set PLL Freq. ~//	
	I2CWriteByte(TW803_P0, ADC_PLLDIV_H, (cVCO&0x01)<<6);
	//~ Set PLL Divider 0x16[3~0],0x15[7~0] ~//
	I2CWriteByte(TW803_P0, ADC_PLLDIV_H, ((I2CReadByte(TW803_P0, ADC_PLLDIV_H)&0xF0)|((uCHAR)(wHTotal>> 8))));
  	I2CWriteByte(TW803_P0, ADC_PLLDIV_L, (uCHAR)(wHTotal));  
	//~ Set VCO and Charge Pump ~//      
	I2CWriteByte(TW803_P0, ADC_VCOCP, cVCO&0xFE);	
	//~ Set ADC Capture HSync Back Proch 0x4C, 0x4D ~//
  	I2CWriteByte(TW803_P0, HSST_L, (uCHAR)wHsst);
  	I2CWriteByte(TW803_P0, HSST_H, (uCHAR)(wHsst>>8));

  	//~ Set ADC Capture VSync Back Proch 0x4E, 0x4F ~//
	I2CWriteByte(TW803_P0, VSST_L, (uCHAR)cVsst);
	I2CWriteByte(TW803_P0, VSST_H, (uCHAR)(cVsst >> 8));

	//~ Set ADC Capture HSize 0x48, 0x49 ~//
  	I2CWriteByte(TW803_P0, HATVC_L, (uCHAR)m_pResolutionPtr->wHRes);
  	I2CWriteByte(TW803_P0, HATVC_H, (uCHAR)(m_pResolutionPtr->wHRes>>8));
	//~ Set ADC Capture VSize 0x4A, 0x4B ~//
  	I2CWriteByte(TW803_P0, VATVR_L, (uCHAR)m_pResolutionPtr->wVRes);
  	I2CWriteByte(TW803_P0, VATVR_H, (uCHAR)(m_pResolutionPtr->wVRes>>8));
} 


void GetModeCaptureData(void)
{
	if(m_bAlt)
	{
		m_pAltHTotalPtr = &AltHTotals[EepPrivate.cAltID];
		m_cBuff[0] = m_pAltHTotalPtr->cResID;
		m_pResolutionPtr = &ResolutionTable[m_cBuff[0]];
		m_wHRes = m_pResolutionPtr->wHRes;
		m_wVRes = m_pResolutionPtr->wVRes;
		m_cBuff[0] = m_pAltHTotalPtr->cModeFlags;  //VCO & Charge Pump
	}
	else
	{
		m_pModeDescriptorPtr = &ModeTable[EepPrivate.cModeID];
		
		m_cBuff[0] = m_pModeDescriptorPtr->cResID;
		m_pResolutionPtr = &ResolutionTable[m_cBuff[0]];
		m_wHRes = m_pResolutionPtr->wHRes;
		m_wVRes = m_pResolutionPtr->wVRes;
		m_cBuff[0] = m_pModeDescriptorPtr->cModeFlags2; //VCO & Charge Pump
	}

	if(m_bInterlaced)
	{
		m_wVRes /= 2;
	}

	
}

//Only used in analog inputs
void SetupMode(void)
{ 
   if(!m_bDigital)
	{                        
		if(I2CReadByte(TW803_P0, 0x3F)&0x10)
			I2CWriteByte(TW803_P0, 0x63, 0xCF);
		else
			I2CWriteByte(TW803_P0, 0x63, 0x40);	
	}
   
	GetModeCaptureData();
	//m_cBuff[0] saved VCO&Charge Pump
	//SetModeCaptureData(EepPrivate.wHTotal, FIXEDHSST, FIXEDVSST, m_cBuff[0]);		
	SetModeCaptureData(m_pModeDescriptorPtr->wHTotal, FIXEDHSST, FIXEDVSST, m_cBuff[0]);
}


#define MINVRES		0x0000
#define MAXVRES		0xFFFF
BOOL GetVResolution(void)
{
	//How to define THRESHOLD is a question mark, need confirm later. 
	McWaitReady(0x04, 0x08);

	//start data
	m_wBuff[0] = I2CReadByte(TW803_P0, POS_TB_H);        
	m_wBuff[0] <<= 8;
	m_wBuff[0] |= I2CReadByte(TW803_P0, POS_TB_L); 
	
	//end data
	m_wBuff[1] = I2CReadByte(TW803_P0, POS_BB_H);       
	m_wBuff[1] <<= 8;
	m_wBuff[1] |= I2CReadByte(TW803_P0, POS_BB_L);

	m_wVRes = m_wBuff[1] - m_wBuff[0] + 1;
     	
	
	return FALSE;

	//How can I know the VRes is valid or not, inputs depend on input pattern 
	if (m_wVRes >= MINVRES && m_wVRes <= MAXVRES)
		return TRUE;
	else
		return FALSE;
}	   



void GetModeInfo(uWORD *wVTotal, uWORD *wHPeriodCount, uDWORD dwFrameCnt)
{	
	uWORD	wTemp;
	int i;
	
	//~ Get HSync period. ~//
	I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)&0xEF);	// Disable HSo source from PLL.
	I2CWriteByte(TW803_P0, 0x16, I2CReadByte(TW803_P0, 0x16)|0x04);	// Set PLL divider default value.
	wTemp=0;
	for(i=0; i<30; i++)
	{
		twdDelay(10);	
		*wHPeriodCount = I2CReadByte(TW803_P0, HS_PERIOD_H);
		*wHPeriodCount <<= 8;
		*wHPeriodCount += I2CReadByte(TW803_P0, HS_PERIOD_L);
		if((wTemp&0xFF00)==((*wHPeriodCount)&0xFF00))
			break;
		else
			wTemp = *wHPeriodCount;
	}
	wTemp = dwFrameCnt * 32 * 10 / (*wHPeriodCount); 
	if(wTemp % 10 >= 9)
		m_wBuff[0] = wTemp/10 + 1;
	else	
		m_wBuff[0] = wTemp/10;
	
	*wVTotal = m_wBuff[0]; 
	I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)|(~0xEF)); 	// Enable HSo source from PLL.
}



	  
// ================================================================
//	McPolDetect			Kevin Hsu.	Mar. 2th, 2006
// ================================================================
//	Description: Detect VSyn and HSyn polarity. 
//	Output:		 VGA sync. type.
//	---------------------------------------------------------------
uCHAR McPolDetect(void)
{
	I2CWriteByte(TW803_P0, 0x10, I2CReadByte(TW803_P0, 0x10)|0x10);
	m_cBuff[0] = I2CReadByte(TW803_P0, 0x10)>>6; 
	return m_cBuff[0]&0x03;
}

BOOL McWaitReady(uCHAR cEnableBit, uCHAR cReadyBit)
{
	I2CWriteByte(TW803_P0, 0x50, I2CReadByte(TW803_P0, 0x50)|cEnableBit);
	
	m_cBuff[0] = 0xFF;
	while(m_cBuff[0]--)
	{ 
		twdDelay(1);
		if(I2CReadByte(TW803_P0, 0x50)&cReadyBit)
			break;
	}
	//Disable Enable bit for next sync coming in
	I2CWriteByte(TW803_P0, 0x50, I2CReadByte(TW803_P0, 0x50)&~(cEnableBit|cReadyBit));
	if(m_cBuff[0])	return TRUE;
	else return FALSE; 
}


// ================================================================
//	GetInputVSyncXclkCnt			Kevin Hsu.	Mar. 7th, 2006
// ================================================================

⌨️ 快捷键说明

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