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

📄 drvscaler.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -