📄 drvscaler.c
字号:
XBYTE[0x2CC2] &= 0xFC;
}
else
{
// Disable SIF
XBYTE[0x2CC1] |= 0x18;
XBYTE[0x2CC0] |= 0x0C;
XBYTE[0x2CC2] |= 0x03;
}
#endif
#if 0// kevin 071221//ENABLE_POWER_SAVING_VDMVD
if(IsAnalogSourceInUse() || IsHDMIInUse() )
{
// Disable VD / MVD
XBYTE[BK_CHIPTOP_16_H] |= 0x10;
XBYTE[BK_CHIPTOP_17_L] |= 0x11;
XBYTE[0x1E29] |= 0x11;
XBYTE[0x1E2A] |= 0x11;
}
else if (IsDigitalSourceInUse() &&!IsSrcTypeATV(penMsSysInfo->enInputSourceType))
{
// Disable MVD
// Enable VD
XBYTE[0x1E29] |= 0x11;
XBYTE[0x1E2A] |= 0x11;
XBYTE[BK_CHIPTOP_16_H] &= 0xEF;
XBYTE[BK_CHIPTOP_17_L] &= 0xEE;
}
else
{
// Enable MVD / VD
XBYTE[0x1E29] &= 0xEE;
XBYTE[0x1E2A] &= 0xEE;
XBYTE[BK_CHIPTOP_16_H] &= 0xEF;
XBYTE[BK_CHIPTOP_17_L] &= 0xEE;
}
#endif
MDrv_WriteByte(BK_SELECT_00, u8Bank);
}
//-----------------------------------------------------------------------------
// Sync & pixel clk
//-----------------------------------------------------------------------------
/******************************************************************************/
///This function will calculate and return H Frequency x 10
///@param wHPeriod \b IN
///- Horizontal period
///@return
///- U16 H Frequency x 10
/******************************************************************************/
U16 MDrv_Scaler_CalculateHFreqX10(U16 wHPeriod)
{
if(wHPeriod)
return ( (((U32)MST_XTAL_CLOCK_HZ + (wHPeriod/2)) / wHPeriod ) / 100 ); //KHz
else
return 1; // avoid devide by 0 error
}
/******************************************************************************/
///This function will calculate and return V Frequency x 10
///@param wHFreq \b IN
///- Horizontal Frequency
///@param wVTotal \b IN
///- Vertical Frequency
///@return
///- U16 V Frequency x 10
/******************************************************************************/
U16 MDrv_Scaler_CalculateVFreqX10(U16 wHFreq, U16 wVTotal)
{
if(wHFreq && wVTotal)
return ( (((U32)wHFreq * 1000 ) + (wVTotal/2)) / wVTotal ); // Hz
else
return 0;
}
/******************************************************************************/
///This function will calculate and return Vsync time
///@return
///- U8 VSync time
/******************************************************************************/
U8 MDrv_Scaler_CalculateVSyncTime(U16 u16VTotal, U16 u16HPeriod)
{
U16 wHFreqX10; // horizontal frequency
wHFreqX10 = MDrv_Scaler_CalculateHFreqX10(u16HPeriod); // calculate HSync frequency
return (U8)(((u16VTotal*10)+(wHFreqX10/2))/wHFreqX10);
}
/******************************************************************************/
///Set line buffer clock
///@param u16HTotal \b IN
///- Horizontal total
///@return
///- Output Pixel colok
/******************************************************************************/
U8 MDrv_Scaler_CalculatePixClk(U16 u16HTotal)
{
return (U8)
(((U32)MDrv_Scaler_CalculateHFreqX10(MDrv_Scaler_GetHorizontalPeriod())*u16HTotal+5000)/10000);
}
/******************************************************************************/
/// -This function will return input video source status
/// @return Video status
/// - BIT0:VSnc polarity bit(0/1 = positive/negative)
/// - BIT1:HSync polarity bit(0/1 = positive/negative)
/// - BIT2:HSync loss bit
/// - BIT3:VSync loss bit
/// - BIT4:Interlace mode
/// - BIT7:User new mode (Not found in mode table)
/******************************************************************************/
U8 MDrv_Scaler_GetInputSyncStatus(void)
{
U8 u8Bank;
U16 u16SyncCounter; // sync counter
U8 u8SyncStatus = 0x00; // sync status
U8 u8DetectStatus; // mode detect status
/* HSync */
u16SyncCounter = MDrv_Scaler_GetHorizontalPeriod();
if( (u16SyncCounter == MST_H_PERIOD_MASK) || (u16SyncCounter < 10) )
{
u8SyncStatus |= MD_HSYNC_LOSS_BIT;
}
DRVSC_DBG(printf("Hperiod=0x%x\n", u16SyncCounter));
/* VSync */
u16SyncCounter = MDrv_Scaler_GetVerticalTotal();
if ( (u16SyncCounter == MST_V_TOTAL_MASK) || (u16SyncCounter < 200) )
{
u8SyncStatus |= MD_VSYNC_LOSS_BIT;
}
DRVSC_DBG(printf("Vtotal=0x%x\n", u16SyncCounter));
/* mode detect status */
#if 0
//IPMUX CH0
u8Bank = MDrv_ReadByte(BK_SELECT_00);
u8DetectStatus = MDrv_ReadByte(BK_IP1_16_1E_H);
MDrv_WriteByte( BK_SELECT_00, u8Bank );
#else
//IPMUX CH1
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
u8DetectStatus = MDrv_ReadByte(BK_SC_IP1F2_1E_H);
MDrv_WriteByte( BK_SELECT_00, u8Bank );
#endif
if ( u8DetectStatus & _BIT0 )
{
u8SyncStatus |= MD_VSYNC_POR_BIT;
}
if ( u8DetectStatus & _BIT1 )
{
u8SyncStatus |= MD_HSYNC_POR_BIT;
}
if ( u8DetectStatus & _BIT3 )
{
u8SyncStatus |= MD_INTERLACE_BIT;
}
DRVSC_DBG(printf("SyncStatus=0x%bx\n", u8SyncStatus));
return u8SyncStatus;
}
U8 MDrv_Scaler_WaitInputVSync(U8 u8NumVSyncs, U16 u16Timeout)
{
U8 u8Bank;
U32 u32Time;
bit bVSync;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
bVSync = 0;
u32Time = MDrv_Timer_GetTime0();
while (1)
{
#if 0
//IPMUX CH0
if (_bit2_(MDrv_ReadByte(BK_IP1_16_1E_L)) == bVSync)
{
if (bVSync && --u8NumVSyncs == 0)
break;
bVSync = !bVSync;
}
#else
//IPMUX CH1
if (_bit2_(MDrv_ReadByte(BK_SC_IP1F2_1E_L)) == bVSync)
{
if (bVSync && --u8NumVSyncs == 0)
break;
bVSync = !bVSync;
}
#endif
if (MDrv_Timer_TimeDifferenceFromCurrent(u32Time) >= u16Timeout)
break;
}
MDrv_WriteByte(BK_SELECT_00, u8Bank);
return u8NumVSyncs;
}
/*
U8 MDrv_Scaler_WaitOutputVSync(U8 u8NumVSyncs, U16 u16Timeout)
{
U8 u8Bank;
U32 u32Time;
bit bVSync;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
bVSync = 0;
u32Time = MDrv_Timer_GetTime0();
while (1)
{
#if 0
//IPMUX CH0
if (_bit0_(MDrv_ReadByte(BK_IP1_16_1E_L)) == bVSync)
{
if (bVSync && --u8NumVSyncs == 0)
break;
bVSync = !bVSync;
}
#else
//IPMUX CH1
if (_bit0_(MDrv_ReadByte(BK_SC_IP1F2_1E_L)) == bVSync)
{
if (bVSync && --u8NumVSyncs == 0)
break;
bVSync = !bVSync;
}
#endif
if (MDrv_Timer_TimeDifferenceFromCurrent(u32Time) >= u16Timeout)
break;
}
ASSERT(u8NumVSyncs == 0);
MDrv_WriteByte(BK_SELECT_00, u8Bank);
return u8NumVSyncs;
}
*/
//-----------------------------------------------------------------------------
// over scan
//-----------------------------------------------------------------------------
void MDrv_Scaler_CalculateOverScan(MS_INPUT_SOURCE_TYPE enInputSrcType, MS_DISPLAYWINDOW_TYPE *pstDisplayWindow )
{
U32 u32Temp;
U16 u16HSize, u16VSize;
u16HSize = pstDisplayWindow->u16H_CapSize;
u16VSize = pstDisplayWindow->u16V_CapSize;
DRVSC_RATIO(puts("\r\nCal OverScan..."));
DRVSC_RATIO(printf("\r\nPre H Size=%d", u16HSize));
DRVSC_RATIO(printf("\r\nPre V Size=%d", u16VSize));
if(IsSrcTypeYPbPr(enInputSrcType))
{
if(u16HSize <= 850 && u16VSize <= 500)
{
if(pstDisplayWindow->u8DisplayStatus & DISPLAYWINDOW_INTERLACE)
{// 480i
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_480I;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_480I;
}
else
{// 480p
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_480P;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_480P;
}
}
else if(u16HSize <= 850 && u16VSize <= 600)
{
if (pstDisplayWindow->u8DisplayStatus & DISPLAYWINDOW_INTERLACE)
{// 576i
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_576I;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_576I;
}
else
{// 576p
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_576P;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_576P;
}
}
else if(u16HSize <= 1300 && u16VSize <= 750)
{
if(pstDisplayWindow->u16InputVFreq<550)
{
//720P //50Hz
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_720P_50;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_720P_50;
}
else
{
//720P //60Hz
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_720P_60;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_720P_60;
}
}
else if(u16HSize <= 1950 && u16VSize <= 1200)
{
if (pstDisplayWindow->u8DisplayStatus & DISPLAYWINDOW_INTERLACE)
{//1080i
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_1080I;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_1080I;
}
else
{
if(pstDisplayWindow->u16InputVFreq>550)
{
// 1080P (60P)
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_1080P_60;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_1080P_60;
}
else if(pstDisplayWindow->u16InputVFreq>450)
{
// 1080P (50P)
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_1080P_50;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_1080P_50;
}
else if(pstDisplayWindow->u16InputVFreq>275)
{
// 1080P (30P)
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_1080P_30;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_1080P_30;
}
else if(pstDisplayWindow->u16InputVFreq>200)
{
// 1080P (25P)
pstDisplayWindow->u8H_OverScanRatio = YPBPR_OVERSCAN_H_1080P_25;
pstDisplayWindow->u8V_OverScanRatio = YPBPR_OVERSCAN_V_1080P_25;
}
}
}
}
else if(IsSrcTypeDigitalVD(enInputSrcType))
{
pstDisplayWindow->u8H_OverScanRatio = VideoCaptureWinTbl[g_VdInfo.ucVideoSystem].u8HOverscan;
pstDisplayWindow->u8V_OverScanRatio = VideoCaptureWinTbl[g_VdInfo.ucVideoSystem].u8VOverscan;
}
else
{
pstDisplayWindow->u8H_OverScanRatio = 0;
pstDisplayWindow->u8V_OverScanRatio = 0;
}
if (pstDisplayWindow->u8H_OverScanRatio) // Horizontal
{
u32Temp = ((U32)pstDisplayWindow->u16H_CapSize * (U32)pstDisplayWindow->u8H_OverScanRatio * 2 + 500 ) / 1000;
pstDisplayWindow->u16H_CapStart += (U16) u32Temp/2;
pstDisplayWindow->u16H_CapSize = pstDisplayWindow->u16H_CapSize - (U16) (u32Temp);
}
if (pstDisplayWindow->u8V_OverScanRatio) // Vertical
{
u32Temp = ((U32)pstDisplayWindow->u16V_CapSize * pstDisplayWindow->u8V_OverScanRatio * 2 + 500 ) / 1000;
pstDisplayWindow->u16V_CapStart += (U16) u32Temp/2;
pstDisplayWindow->u16V_CapSize = pstDisplayWindow->u16V_CapSize - (U16) ( u32Temp );
}
DRVSC_RATIO(printf("\r\nAfter H Size=%d", pstDisplayWindow->u16H_CapSize));
DRVSC_RATIO(printf("\r\nAfter H Star=%d", pstDisplayWindow->u16H_CapStart));
DRVSC_RATIO(printf("\r\nAfter V Size=%d", pstDisplayWindow->u16V_CapSize));
DRVSC_RATIO(printf("\r\nAfter V Star=%d", pstDisplayWindow->u16V_CapStart));
}
/******************************************************************************/
///This function will return VD's Horizontal period
///@param enGetSyncType \b IN
///EN_GET_SYNC_TYPE is SYNC type
///-GET_SYNC_DIRECTLY
///-GET_SYNC_STABLE
///-GET_SYNC_VIRTUAL
///@return
///- U16 VD Horizontal Period
/******************************************************************************/
U16 MDrv_Scaler_VD_GetHPeriod (EN_GET_SYNC_TYPE enGetSyncType)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -