📄 drvmode.c
字号:
1056*2, 525, // HTotal, VTotal
#else
1056, 525, // HTotal, VTotal
#endif
25, // VTotalTorance
0x3f, // ADC phase
MD_FLAG_CHK_POR_BIT | MD_FLAG_POR_HNVP | MD_FLAG_POR_HNVN | MD_FLAG_POR_HPVP | MD_FLAG_POR_HPVN,
},
#if CRT_IOUT
//Johnny Test
// 720x480I 60Hz
{//47
RES_720X480, // resolution index
157, 600, // HFreq, VFreq
0x3b, 0x1a, // HStart, VStart //may_070401_CompPosAdj
803, 524, // HTotal, VTotal
5, // VTotalTorance
0x1f, // ADC phase
MD_FLAG_INTERLACE |MD_FLAG_CHK_POR_BIT |MD_FLAG_POR_HPVP |MD_FLAG_POR_HPVN|MD_FLAG_POR_HNVP|MD_FLAG_POR_HNVN, // flags
},
#endif
};
//end
#define MODE_TABLE_MAXIMUM_NUM (sizeof(astStandardModeTable) / sizeof(MS_PCADC_MODETABLE_TYPE))
/********************************************************************************/
/* Local Function Prototypes */
/********************************************************************************/
/********************************************************************************/
/* Functions */
/********************************************************************************/
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeResolutionIndex
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: Resolution Index
//Description: get standard resolution index
//*************************************************************************
EN_RESOLUTION_TYPE MDrv_Mode_GetStdModeResolutionIndex( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].enResolutionIndex;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeResH
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U16: H resolution
//Description: get standard H resolution
//*************************************************************************
U16 MDrv_Mode_GetStdModeResH ( U8 u8ModeIndex )
{
return astStandardModeResolution[astStandardModeTable[u8ModeIndex].enResolutionIndex].u16DisplayWidth;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeResV
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U16: V resolution
//Description: get standard V resolution
//*************************************************************************
U16 MDrv_Mode_GetStdModeResV ( U8 u8ModeIndex )
{
return astStandardModeResolution[astStandardModeTable[u8ModeIndex].enResolutionIndex].u16DisplayHeight;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeHTotal
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U16: H total
//Description: get standard H total
//*************************************************************************
U16 MDrv_Mode_GetStdModeHTotal ( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].u16HorizontalTotal;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeVTotal
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U16: V total
//Description: get standard V total
//*************************************************************************
U16 MDrv_Mode_GetStdModeVTotal ( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].u16VerticalTotal;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeHStart
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U16: H start
//Description: get standard H start
//*************************************************************************
U16 MDrv_Mode_GetStdModeHStart ( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].u16HorizontalStart;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeVStart
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U16: V start
//Description: get standard V start
//*************************************************************************
U16 MDrv_Mode_GetStdModeVStart ( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].u16VerticalStart;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeADCPhase
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U8: ADC phase
//Description: get standard ADC phase
//*************************************************************************
U8 MDrv_Mode_GetStdModeADCPhase ( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].u8AdcPhase;
}
//*************************************************************************
//Function name: MDrv_Mode_GetStdModeStatusFlag
//Passing parameter: U8 u8ModeIndex: current mode index
//Return parameter: U8: ADC phase
//Description: get standard ADC phase
//*************************************************************************
U8 MDrv_Mode_GetStdModeStatusFlag ( U8 u8ModeIndex )
{
return astStandardModeTable[u8ModeIndex].u8StatusFlag;
}
U8 LDrv_Mode_GetStdModeVTotalTolerance ( U8 u8ModeIndex ) //may_070405_1050mode
{
return astStandardModeTable[u8ModeIndex].u8VTotalTolerance;
}
U16 MDrv_Mode_GetStdModeVFreq(U8 u8ModeIndex)
{
return astStandardModeTable[u8ModeIndex].u16VerticalFrequency;
}
U8 MDrv_Mode_GetStdMaxTableIndex(void)
{
return MD_STD_MODE_MAX_INDEX;
}
BOOLEAN MDrv_Mode_CompareModePolarity(U8 u8InputStatusFlag, U8 u8StdModeIndex)
{
U8 u8ModeFlag;
u8ModeFlag = MDrv_Mode_GetStdModeStatusFlag(u8StdModeIndex);
if (u8ModeFlag & MD_FLAG_CHK_POR_BIT) // check polarity
{
if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) ) == 3) && !(u8ModeFlag&MD_FLAG_POR_HPVP) )
{
return FALSE;
}
if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) )==2) && !(u8ModeFlag&MD_FLAG_POR_HPVN) )
{
return FALSE;
}
if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) ) == 1) && !(u8ModeFlag&MD_FLAG_POR_HNVP) )
{
return FALSE;
}
if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) ) == 0) && !(u8ModeFlag&MD_FLAG_POR_HNVN) )
{
return FALSE;
}
return TRUE;
}
else
{
return FALSE;
}
}
//*************************************************************************
//Function name: MDrv_Mode_MatchMode
//Passing parameter: MS_PCADC_MODETABLE_TYPE * pstInputType: current mode parameters
// U8 u8InputSourceType: current input source type
//Return parameter: U8: Match table index
//Description: This function will search matched standard mode index
//*************************************************************************
U8 MDrv_Mode_MatchMode ( MS_PCADC_MODETABLE_TYPE *pstInputType, MS_INPUT_SOURCE_TYPE enInputSourceType )
{
MS_PCADC_MODETABLE_TYPE code *pStdModeTbl; // table pointer
U8 ucIndex; // loop index
U8 ucFlagBff; // flag buffer
U16 u16InputVTotal;
U8 ucMatchIndex; // match index
U16 wMatchDelta; // difference
U16 wDeltaBff;
U16 wVTotalMatchDelta;
U16 wVTotalDeltaBff;
#if (MS_VGA_SOG_EN)
U8 u8Bank;
U8 u8VGASogStatus;
#endif
// initilaize
ucMatchIndex = _END_OF_TBL_;
wMatchDelta = MD_HFREQ_TORLANCE + MD_VFREQ_TORLANCE;
wVTotalMatchDelta = 0xFFFF;
u16InputVTotal = pstInputType->u16VerticalTotal;
pStdModeTbl = astStandardModeTable; // initailize
for(ucIndex=0; ucIndex<MODE_TABLE_MAXIMUM_NUM; ucIndex++, pStdModeTbl++)
{
ucFlagBff = pStdModeTbl->u8StatusFlag; // get sync flag
MODE_DBG(printf("\r\n 1:Md=%bu,StatusFlag=0x%bx,Tbl=0x%bx",
ucIndex, pstInputType->u8StatusFlag, ucFlagBff);)
if( IsSrcTypeYPbPr(enInputSourceType) || IsSrcTypeYCbCr(enInputSourceType) ) // Mode detect for YPbPr
{
if( !(ucFlagBff & MD_FLAG_YPBPR_BIT) ) // check YPbPr mode only
continue;
}
else // Mode detect for PC
{
if( (ucFlagBff&MD_FLAG_YPBPR_BIT) /*&& (ucMatchIndex != _END_OF_TBL_)*/ )
continue;
}
#if (MS_VGA_SOG_EN)
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
u8VGASogStatus = MDrv_ReadByte(BK_SC_IP1F2_02_L);
MDrv_WriteByte(BK_SELECT_00, u8Bank);
if((u8VGASogStatus & 0x70)==0x70)
{
;
}
else
#endif // #if (MS_VGA_SOG_EN)
if(IsSrcTypeVga(enInputSourceType))
{
if(MDrv_Mode_CompareModePolarity(pstInputType->u8StatusFlag, ucIndex)) // check polarity
{
MODE_DBG(printf("\r\n MDrv_Mode_CompareModePolarity TRUE ucIndex %bu", (U8)ucIndex));
}
else
{
MODE_DBG(printf("\r\n MDrv_Mode_CompareModePolarity fail ucIndex %bu", (U8)ucIndex));
continue;
}
}
// match interlace mode
if ((bit)(ucFlagBff & MD_FLAG_INTERLACE) != (bit)(pstInputType->u8StatusFlag & MD_INTERLACE_BIT))
{
MODE_DBG(printf("\r\n Compare Interlace fail"));
continue;
}
//if (wVTotal < tStandardModeResolution[pStdModeTbl->ResolutionIndex].DisplayHeight)
// continue;
MODE_DBG(printf("\r\n Pst Hfreq=%d", pstInputType->u16HorizontalFrequency));
MODE_DBG(printf("\r\n Std Hfreq=%d", pStdModeTbl->u16HorizontalFrequency));
MODE_DBG(printf("\r\n Pst Vfreq=%d", pstInputType->u16VerticalFrequency));
MODE_DBG(printf("\r\n Std Vfreq=%d", pStdModeTbl->u16VerticalFrequency));
MODE_DBG(printf("\r\n Pst Vtl=%d", u16InputVTotal));
MODE_DBG(printf("\r\n Std Vtl=%d", pStdModeTbl->u16VerticalTotal));
// match H/V frequency
if ( (abs(pstInputType->u16HorizontalFrequency - pStdModeTbl->u16HorizontalFrequency) < MD_HFREQ_TORLANCE) &&
(abs(pstInputType->u16VerticalFrequency - pStdModeTbl->u16VerticalFrequency) < MD_VFREQ_TORLANCE) &&
(abs(u16InputVTotal - pStdModeTbl->u16VerticalTotal) < pStdModeTbl->u8VTotalTolerance) )
{
MODE_DBG(printf("\r\n Pass TORLANCE"));
// calculate frequency diffenece
wDeltaBff = abs(pstInputType->u16HorizontalFrequency - pStdModeTbl->u16HorizontalFrequency) +
abs(pstInputType->u16VerticalFrequency - pStdModeTbl->u16VerticalFrequency);
wVTotalDeltaBff = abs(u16InputVTotal - pStdModeTbl->u16VerticalTotal);
if ( ((wMatchDelta > wDeltaBff) && (wVTotalMatchDelta > wVTotalDeltaBff)) ||
((wDeltaBff <= 10) && (wVTotalDeltaBff < wVTotalMatchDelta)) )// check more near
{
wMatchDelta = wDeltaBff;
ucMatchIndex = ucIndex; // match standard mode table
wVTotalMatchDelta = wVTotalDeltaBff;
MODE_DBG(printf("\r\n Match Standard Mode"));
}
}
} // for
if(ucMatchIndex == _END_OF_TBL_)
{
// initilaize
ucMatchIndex = _END_OF_TBL_;
wMatchDelta = MD_FREQ_DELTA;
wVTotalMatchDelta = 0xFFFF;
pStdModeTbl = astStandardModeTable; // initailize
for(ucIndex=0; ucIndex<MODE_TABLE_MAXIMUM_NUM; ucIndex++, pStdModeTbl++)
{
ucFlagBff = pStdModeTbl->u8StatusFlag; // get sync flag
MODE_DBG(printf("\r\n 2:Md=%bu,StatusFlag=0x%bx,Tbl=0x%bx",
ucIndex, pstInputType->u8StatusFlag, ucFlagBff);)
// check YPbPr mode detect(only suppot YPbPr mode)
if( IsSrcTypeYPbPr(enInputSourceType) || IsSrcTypeYCbCr(enInputSourceType) ) // Mode detect for YPbPr
{
if( !(ucFlagBff & MD_FLAG_YPBPR_BIT) ) // check YPbPr mode only
continue;
}
else // Mode detect for PC
{
// if( (ucFlagBff&MD_FLAG_YPBPR_BIT) /*&& (ucMatchIndex != _END_OF_TBL_)*/ )
// continue;
}
if ((bit)(ucFlagBff & MD_FLAG_INTERLACE) != (bit)(pstInputType->u8StatusFlag & MD_INTERLACE_BIT))
continue;
MODE_DBG(printf("\r\n InputVtt=%u,Mode=%u", u16InputVTotal, astStandardModeResolution[pStdModeTbl->enResolutionIndex].u16DisplayHeight);)
if ( u16InputVTotal > astStandardModeResolution[pStdModeTbl->enResolutionIndex].u16DisplayHeight)
{
MODE_DBG(printf("\r\n HFreq(%u,%u),VFreq(%u,%u)",
pstInputType->u16HorizontalFrequency,
pStdModeTbl->u16HorizontalFrequency,
pstInputType->u16VerticalFrequency,
pStdModeTbl->u16VerticalFrequency);)
// calculate frequency delta
wDeltaBff = abs(pstInputType->u16HorizontalFrequency - pStdModeTbl->u16HorizontalFrequency) +
abs(pstInputType->u16VerticalFrequency - pStdModeTbl->u16VerticalFrequency);
wVTotalDeltaBff = abs(u16InputVTotal - pStdModeTbl->u16VerticalTotal);
// compare delta minimum & match interlace status
if ( ((wDeltaBff < wMatchDelta) && (wVTotalDeltaBff < wVTotalMatchDelta)) ||
((wDeltaBff <= 10) && (wVTotalDeltaBff < wVTotalMatchDelta)) )
{
wMatchDelta = wDeltaBff;
ucMatchIndex = ucIndex; // match user mode index
wVTotalMatchDelta = wVTotalDeltaBff;
MODE_DBG(printf("\r\n --Delta Freq=%u,Vtt=%u", wMatchDelta, wVTotalMatchDelta);)
MODE_DBG(printf("\r\n Match UseNewr Mode"));
}
}
} // for
if(ucMatchIndex != _END_OF_TBL_)
{
pstInputType->u8StatusFlag |= MD_USER_MODE_BIT; //user new mode
}
}
return ucMatchIndex;
}
#undef DRV_MODE_C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -