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

📄 msapi_scaler.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 4 页
字号:
                g_DisplayWindowSetting.u16ColorFinetuneFlag &= ~(FINETUNE_FILM_MODE | FINETUNE_3DCOMB);
                APISC_DBG(printf("\r\nVD De-interlace without FB"));
            }
            else
            {
                // FB
                g_SrcInfo.u8DeInterlaceMode = MS_DEINT_2P5DDI;// 2.5D // kevin 080128
                g_SrcInfo.u8EODiMode = MS_EODI_2D;//MS_EODI_OFF;
                g_SrcInfo.u16ColorFinetuneFlag &= ~(FINETUNE_FILM_MODE | FINETUNE_3DCOMB);
                APISC_DBG(printf("\r\nVD De-interlace with FB"));
            }
        }
        else
        {
            // PC/YPbPr/DVI/HDMI
            if(g_DisplayWindowSetting.u8MemoryMode == MS_MEM_FMT_NO_USE)
            {
                // FBL
                g_DisplayWindowSetting.u8DeInterlaceMode = MS_DEINT_OFF;
                g_DisplayWindowSetting.u8EODiMode = MS_EODI_OFF;
                g_DisplayWindowSetting.u16ColorFinetuneFlag &= ~(FINETUNE_FILM_MODE | FINETUNE_3DCOMB);
                APISC_DBG(printf("\r\nNot VD De-interlace without FB"));
            }
            else
            {
                // FB
                g_SrcInfo.u8DeInterlaceMode = MS_DEINT_2P5DDI;// kevin 080131
                g_SrcInfo.u8EODiMode = MS_EODI_2D;
                g_SrcInfo.u16ColorFinetuneFlag &= ~(FINETUNE_FILM_MODE | FINETUNE_3DCOMB);
                APISC_DBG(printf("\r\nVD De-interlace with FB"));
            }
        }
    }
    else
    {
        // non-interlace
        g_DisplayWindowSetting.u8DeInterlaceMode = MS_DEINT_OFF;
        g_DisplayWindowSetting.u8EODiMode = MS_EODI_OFF;
        g_DisplayWindowSetting.u16ColorFinetuneFlag &= ~(FINETUNE_FILM_MODE | FINETUNE_3DCOMB);
        APISC_DBG(printf("\r\nNon interlace"));
    }

    APISC_DBG(printf("\r\nu8DeInterlaceMode=%bu",g_DisplayWindowSetting.u8DeInterlaceMode));
    APISC_DBG(printf("\r\nu8EODiMode=%bu",g_DisplayWindowSetting.u8EODiMode));
    APISC_DBG(printf("\r\nu16ColorFinetuneFlag=%bu",g_DisplayWindowSetting.u16ColorFinetuneFlag));

    //------------------------------------
    // Setup Delay line
    //------------------------------------
    if(IS_SRC_USE_2DDI(g_DisplayWindowSetting))
        {
        g_DisplayWindowSetting.u8DelayLines = 1;    // 5
        }
        else
        {
        g_DisplayWindowSetting.u8DelayLines = 2;
        }

    APISC_DBG(printf("\r\nu8DelayLines=%d",g_DisplayWindowSetting.u8DelayLines));
}

/******************************************************************************/
/// -Program the analog and digital  window information including aspect ratio, scaling.(MVD part)
/// @param enInputSourceType \b IN: the input video source type
/// - INPUT_SOURCE_VGA
/// - INPUT_SOURCE_TV
/// - INPUT_SOURCE_CVBS
/// - INPUT_SOURCE_SVIDEO
/// - INPUT_SOURCE_YPBPR
/// - INPUT_SOURCE_SCART
/// @param *ptiming \b IN: the timing information
///-u16V_TotalCount
///-u16H_TotalCount
///-u16VBlank0_Start
///-u16VBlank0_End
///-u16VBlank1_Start
///-u16VBlank1_End
///-u16TopField_Start
///-u16BottomField_Start
///-u16HActive_Start
///-u8VSync_Offset
///-bInterlace
///-u16FrameRate
///-u16H_Freq
///-u32PixelClock
///@param u8ModeIndex\b IN: the mode index
/******************************************************************************/
void msAPI_Scaler_ProgramWin( MS_INPUT_SOURCE_TYPE enInputSourceType)
{
    if ( IsSrcTypeVga(enInputSourceType) || IsSrcTypeYPbPr(enInputSourceType ))
    {
        MDrv_Scaler_ProgAnalogWin( enInputSourceType, &g_PcadcModeSetting, g_u8CurrentSyncStatus );
    }
    else //if( IsSrcTypeDigitalVD(enInputSourceType) )
    {
        MDrv_Scaler_ProgDigitalWin( enInputSourceType, g_VdInfo.ucVideoSystem );
    }
    // Setup HD flag
    if(g_DisplayWindowSetting.u16H_CapSize >= 1280 && g_DisplayWindowSetting.u16V_CapSize >= 720)
    {
        g_DisplayWindowSetting.u8DisplayStatus |= DISPLAYWINDOW_HDTV;
    }
    else
    {
        g_DisplayWindowSetting.u8DisplayStatus &= ~DISPLAYWINDOW_HDTV;
    }

#if 0
    printf("\r\nProg H start = %d", (U16)g_DisplayWindowSetting.u16H_CapStart);
    printf("\r\nProg V start = %d", (U16)g_DisplayWindowSetting.u16V_CapStart);
    printf("\r\nProg H Size = %d", (U16)g_DisplayWindowSetting.u16H_CapSize);
    printf("\r\nProg V Size =%d", (U16)g_DisplayWindowSetting.u16V_CapSize);
    printf("\r\nProg Input H Freq = %d", (U16)g_DisplayWindowSetting.u16InputHFreq);
    printf("\r\nProg Input V Total = %d", (U16)g_DisplayWindowSetting.u16InputVTotal);
    printf("\r\nProg Display V Freq = %d", (U16)g_DisplayWindowSetting.u16InputVFreq);
    printf("\r\nProg Display DisplayStatus = 0x%02bX", (U8)g_DisplayWindowSetting.u8DisplayStatus);
#endif
}

void msAPI_Scaler_InitRegInTimingChange(void)
{
    MDrv_Scaler_SoftwareResetEx(RST_IP_F2);
    MDrv_Timer_Delayms(60);// kevin 071030_0
    MDrv_Scaler_InitRegInTimingChange();
}

void msAPI_Scaler_SetFilmMode(BOOLEAN bEnable)
{
    if (g_DisplayWindowSetting.u16ColorFinetuneFlag & FINETUNE_FILM_MODE)
    {
        MDrv_Scaler_SetFilmMode(bEnable, (g_DisplayWindowSetting.u16InputVFreq>550));
    }
}

BOOLEAN msAPI_Scaler_IsAspectRatioWide(void)
{
    //720*480 must be 4:3
    if( ((U32)msAPI_Mode_GetStdModeResH(g_PcadcModeSetting.u8ModeIndex)*2) >
        ((U32)msAPI_Mode_GetStdModeResV(g_PcadcModeSetting.u8ModeIndex)*3) )
        return TRUE;
    else
        return FALSE;
}

#if (MS_VGA_SOG_EN)
/******************************************************************************/
///-Program the analog input port
/******************************************************************************/
void msAPI_Scaler_ProgAnalogInputPort(void)
{
    U8 u8Bank;
    U8 u8SOGState;

    u8Bank = MDrv_ReadByte(BK_SELECT_00);
    MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
    u8SOGState = MDrv_ReadByte(BK_SC_IP1F2_02_L);

    // check Separated -> Composite -> SOG -> Separated
    if(u8SOGState & _BIT4)
    {
        // in detecting SOG, turn SOG detect off and set back to auto-detect
        u8SOGState &= ~0x70;    // set BIT[6..4] to 0 to turn off SOG detect
        u8SOGState |= 0x00;     // switch to detect separated H/V Sync
    }
    else if((u8SOGState & 0x60) == 0x40)
    {
        // detecting separated H/V sync, switch to detect composite sync
        u8SOGState &= ~0x70;
        u8SOGState |= 0x20;     // switch to detect composite sync
    }
    else if((u8SOGState & 0x60) == 0x20)
    {
        // detecting composite sync, switch to detect SOG
        u8SOGState |= 0x70;     // set BIT[6..4] to 0x7 to turn SOG detect on
    }
    else
    {
        // detecting separated H/V sync, switch to detect composite sync
        u8SOGState &= ~0x70;
        u8SOGState |= 0x40;     // switch to detect composite sync
    }

    MDrv_WriteByte(BK_SC_IP1F2_02_L, u8SOGState);
    MDrv_Scaler_SoftwareResetEx(RST_IP_F2|RST_ADC);

    // adjust ADC bandwidth
    if((u8SOGState & 0x70) == 0x70)
    {
        // SOG
        MDrv_WriteRegBit(BK_SC_IP1F2_03_L, DISABLE, _BIT5);  // Delay 1/4 input HSYNC
//    seven    MDrv_WriteRegBit(BK_ADC_ATOP_1C_L, DISABLE, _BIT5);
        MDrv_WriteRegBit(BK_ADC_ATOP_1C_L, DISABLE, _BIT5);// kevin 080229
        MDrv_WriteByte(BK_ADC_ATOP_1C_H, 0x38);          // Turn on SOG input low bandwidth filter
//    seven    MDrv_WriteRegBit(BK_ADC_DTOP_07_L, ENABLE, _BIT6);   // ADC PLL lock source is SOG
        MDrv_WriteRegBit(BK_ADC_DTOP_07_L, ENABLE, _BIT6);   // ADC PLL lock source is SOG  // kevin 080229
    }
    else
    {
        // Non SOG
        MDrv_WriteRegBit(BK_SC_IP1F2_03_L, DISABLE, _BIT5);  // No delay input HSYNC
//   seven     MDrv_WriteRegBit(BK_ADC_ATOP_1C_L, ENABLE, _BIT5);
        MDrv_WriteRegBit(BK_ADC_ATOP_1C_L, ENABLE, _BIT5);// kevin 080229
        MDrv_WriteByte(BK_ADC_ATOP_1C_H, 0x30);           // Turn off SOG input low bandwidth filter
//   seven     MDrv_WriteRegBit(BK_ADC_DTOP_07_L, DISABLE, _BIT6);   // ADC PLL lock source is HSync
        MDrv_WriteRegBit(BK_ADC_DTOP_07_L, DISABLE, _BIT6);   // ADC PLL lock source is HSync   // kevin 080229
    }

    MDrv_WriteByte(BK_SELECT_00, u8Bank);
}
#endif // #if (MS_VGA_SOG_EN)

#if (ENABLE_SCART_VIDEO)
/******************************************************************************/
///-Detect the sync signal of SCART connect
///@param enInputSourceType1 \b IN
///-INPUT_SOURCE_VGA
///-INPUT_SOURCE_TV
///-INPUT_SOURCE_CVBS
///-INPUT_SOURCE_SVIDEO
///-INPUT_SOURCE_YPBPR
///-INPUT_SOURCE_SCART
///@return the input port which get sync signal
//////////////////// 0:None, 1:Port1, 2:Port2, 3:Both
/******************************************************************************/
U8 msAPI_VD_DetectScartSync(void)
{
    U8 u8CheckSyncCounter, u8CheckInputPort;
    U8 u8SyncStatus; // 0:None, 1:Port1, 2:Port2, 3:Both

    u8SyncStatus = 0;

    for(u8CheckInputPort = 1 ; u8CheckInputPort <= INPUT_SCART_VIDEO_COUNT ; u8CheckInputPort++)
    {
        u8SyncStatus |= u8CheckInputPort;

        for(u8CheckSyncCounter = 0 ; u8CheckSyncCounter < 30 ; u8CheckSyncCounter++)
        {
            MDrv_Timer_Delayms(1);
            if(!MDrv_CheckScartInput(u8CheckInputPort-1))
            {
                u8SyncStatus &= ~u8SyncStatus;
                break;
            }
        }
    }

    return u8SyncStatus;
}
#endif

void msAPI_Scaler_SetDisplayWindowStatus(U8 val)
{
    g_DisplayWindowSetting.u8DisplayStatus = val;
}

U8 msAPI_Scaler_GetDisplayWindowStatus()
{
    return g_DisplayWindowSetting.u8DisplayStatus;
}

void msAPI_Scaler_SetDisplayWindowInputFrenquency(E_ORIENTATIOM orientation,U16 freq)
{
    switch(orientation)
    {
        case E_ORIENTATIOM_HORIZONTAL:
            g_DisplayWindowSetting.u16InputHFreq = freq;
            break;

        case E_ORIENTATIOM_VERTICAL:
            g_DisplayWindowSetting.u16InputVFreq = freq;
            break;
    }
}

U16 msAPI_Scaler_GetDisplayWindowInputFrenquency(E_ORIENTATIOM orientation)
{
    U16 freq;
    switch(orientation)
    {
        case E_ORIENTATIOM_HORIZONTAL:
            freq = g_DisplayWindowSetting.u16InputHFreq;
            break;

        case E_ORIENTATIOM_VERTICAL:
            freq = g_DisplayWindowSetting.u16InputVFreq;
            break;
    }

    return freq;
}

void msAPI_Scaler_SetDisplayWindowColorFineTuneFlag(U16 val)
{
    g_DisplayWindowSetting.u16ColorFinetuneFlag = val;
}

U16 msAPI_Scaler_GetDisplayWindowInputVerticalTotal()
{
    return g_DisplayWindowSetting.u16InputVTotal;
}

void msAPI_Scaler_SetDisplayWindowCapSize(E_ORIENTATIOM orientation,U16 size)
{
    switch(orientation)
    {
        case E_ORIENTATIOM_HORIZONTAL:
            g_DisplayWindowSetting.u16H_CapSize = size;
            break;

        case E_ORIENTATIOM_VERTICAL:
            g_DisplayWindowSetting.u16V_CapSize = size;
            break;
    }
}

U16 msAPI_Scaler_GetDisplayWindowCapStart(E_ORIENTATIOM orientation)
{
    switch(orientation)
    {
        case E_ORIENTATIOM_HORIZONTAL:
            return g_DisplayWindowSetting.u16H_CapStart;

        case E_ORIENTATIOM_VERTICAL:
            return g_DisplayWindowSetting.u16V_CapStart;
    }
}


U16 msAPI_Scaler_GetDisplayWindowCapSize(E_ORIENTATIOM orientation)
{
    switch(orientation)
    {
        case E_ORIENTATIOM_HORIZONTAL:
            return g_DisplayWindowSetting.u16H_CapSize;

        case E_ORIENTATIOM_VERTICAL:
            return g_DisplayWindowSetting.u16V_CapSize;
    }
}

void msAPI_Scaler_SetFreezeImg(BOOLEAN bEn)
{
    MDrv_Scaler_SetFreezeImg(bEn);
}

/******************************************************************************/
///-Enable output and set to a pure color
///@param u8R \b IN Red
///@param u8G \b IN Green
///@param u8B \b IN Blue
/******************************************************************************/
void msAPI_Scaler_FreezeImageWithColor(U8 u8R, U8 u8G, U8 u8B)
{
    U8 u8Y, u8Cb, u8Cr;
    U32 u32Color;
    MS_INPUT_SOURCE_TYPE fakeInputType = INPUT_SOURCE_CVBS;
    // kevin 071220_2//MS_INPUT_SOURCE_TYPE fakeInputType = INPUT_SOURCE_DTV;

    // RGB to YCbCr
#if 1   // HDTV
    u8Y  =  0.183 * u8R + 0.614 * u8G + 0.062 * u8B + 16;
    u8Cb = -0.101 * u8R - 0.338 * u8G + 0.439 * u8B + 128;
    u8Cr =  0.439 * u8R - 0.399 * u8G - 0.040 * u8B + 128;
#else   // SDTV
    u8Y  =  0.257 * u8R + 0.504 * u8G + 0.098 * u8B + 16;
    u8Cb = -0.148 * u8R + 0.291 * u8G + 0.439 * u8B + 128;
    u8Cr =  0.439 * u8R + 0.368 * u8G + 0.071 * u8B + 128;
#endif

    XBYTE[0x1266] |= 0x40;

    MDrv_Scaler_SetBlueScreen( ENABLE, 0 );

    g_DisplayWindowSetting.u16H_CapStart = 0x3e;
    g_DisplayWindowSetting.u16V_CapStart = 0x1b;
    g_DisplayWindowSetting.u16H_CapSize = 640;
    g_DisplayWindowSetting.u16V_CapSize = 480;
    g_DisplayWindowSetting.u16InputVTotal = 525;
    g_DisplayWindowSetting.u8DisplayStatus &= ~DISPLAYWINDOW_INTERLACE;
    g_DisplayWindowSetting.u16InputVFreq = 600;

    msAPI_Scaler_SetModeFlag( fakeInputType );
    msAPI_Scaler_SetupMode2( fakeInputType, &g_DisplayWindowSetting );

    MDrv_Scaler_GetStdDisplayWindow();

    MDrv_Scaler_CalculateOverScan( fakeInputType, &g_DisplayWindowSetting );

    MDrv_Scaler_CalculateAspectRatio( fakeInputType, &g_DisplayWindowSetting, VIDEOSCREEN_WIDE );

    MDrv_Scaler_SetScalingRatio( fakeInputType, &g_DisplayWindowSetting );

    MDrv_Scaler_SetCaptureWindow();

    MDrv_Scaler_SetDisplayWindow();

    MDrv_Scaler_SetPanelTiming( fakeInputType, &g_DisplayWindowSetting );

    MDrv_Scaler_FineTune( fakeInputType, &g_DisplayWindowSetting );

    MDrv_Scaler_SetBlueScreen( DISABLE, 0 );
    MDrv_Scaler_GenerateBlackVideo( DISABLE );

    MDrv_Scaler_SetFrameLock( DISABLE );

    MDrv_Scaler_SetFreezeImg( TRUE );

    // hardcode to YUV422
    VARBYTE(u32Color, 3) = u8Y;
    VARBYTE(u32Color, 2) = u8Cb;
    VARBYTE(u32Color, 1) = u8Y;
    VARBYTE(u32Color, 0) = u8Cr;

    MDrv_GE_ClearFrameBufferByWord( SCALER_DNR_BUF_ADR, SCALER_DNR_BUF_LEN, u32Color );

    XBYTE[0x1266] &= ~0x40;
}

/******************************************************************************/
/// -This function will set output test pattern
/// @param enColorOfPattern
/// - TEST_COLOR_OFF,
/// - TEST_COLOR_WHITE,
/// - TEST_COLOR_RED,
/// - TEST_COLOR_GREEN,
/// - TEST_COLOR_BLUE,
/// - TEST_COLOR_BLACK,
/// @param enInputSourceType
/// -  Indicate what's the current input source
/// @param ptiming
/// -  Carry the VOP timing info
/// @param enVideoScreen
/// -  Carry the aspect ratio info
/******************************************************************************/
void msAPI_Scaler_SetTestPattern(EN_TEST_COLOR enColorOfPattern,
                                            MS_INPUT_SOURCE_TYPE enInputSourceType,
                                            EN_ASPECT_RATIO_TYPE enVideoScreen)
{

⌨️ 快捷键说明

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