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