📄 modectrl.c
字号:
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 + -