📄 drvscaler.c
字号:
U16 u16HorizontalPeriod;
U8 u8StableCounter;
switch(enGetSyncType)
{
case GET_SYNC_DIRECTLY:
u16HorizontalPeriod = MDrv_Scaler_GetHorizontalPeriod();
break;
case GET_SYNC_STABLE:
case GET_SYNC_VIRTUAL:
for(u8StableCounter = 0 ; u8StableCounter < 5 ; u8StableCounter++)
{
u16HorizontalPeriod = MDrv_Scaler_GetHorizontalPeriod();
if( (MDrv_Scaler_CalculateHFreqX10(u16HorizontalPeriod) >= 135) &&
(MDrv_Scaler_CalculateHFreqX10(u16HorizontalPeriod) <= 178) )
{
break;
}
else
{
if(enGetSyncType==GET_SYNC_VIRTUAL)
u16HorizontalPeriod = 0;
}
}
if(enGetSyncType==GET_SYNC_VIRTUAL && u16HorizontalPeriod==0)
{
if(MDrv_Scaler_GetVerticalTotal() > 566)
u16HorizontalPeriod = MST_XTAL_CLOCK_HZ/15625;
else
u16HorizontalPeriod = MST_XTAL_CLOCK_HZ/15734;
}
break;
}
return u16HorizontalPeriod;
}
/******************************************************************************/
///This function will return VD's Vertical total
///@param enGetSyncType \b IN
///enGetSyncType is SYNC type
///- GET_SYNC_DIRECTLY
///- GET_SYNC_STABLE
///- GET_SYNC_VIRTUAL
///@param u16HFreqX10 \b IN
///- Horizontal frequncy
///@return
///- U16: VD Vertical Total
/******************************************************************************/
U16 MDrv_Scaler_VD_GetVTotal (EN_GET_SYNC_TYPE enGetSyncType, U16 u16HFreqX10)
{
U16 u16VerticalTotal;
U8 u8StableCounter;
switch(enGetSyncType)
{
case GET_SYNC_DIRECTLY:
u16VerticalTotal = MDrv_Scaler_GetVerticalTotal();
break;
case GET_SYNC_STABLE:
case GET_SYNC_VIRTUAL:
for(u8StableCounter = 0 ; u8StableCounter < 3 ; u8StableCounter++)
{
u16VerticalTotal = MDrv_Scaler_GetVerticalTotal();
if(u16VerticalTotal >= 465 && u16VerticalTotal <= 730)//+-7Hz if(u16VerticalTotal >= 510 && u16VerticalTotal <= 640)
{
break;
}
else
{
if(enGetSyncType==GET_SYNC_VIRTUAL)
u16VerticalTotal = 0;
}
}
if(enGetSyncType==GET_SYNC_VIRTUAL && u16VerticalTotal==0)
{
if(u16HFreqX10 == 156)
u16VerticalTotal = 625;
else
u16VerticalTotal = 525;
}
break;
}
return u16VerticalTotal;
}
/******************************************************************************/
///This function will return Horizontal period value
///@return
///- U16 Horizontal Period
/******************************************************************************/
U16 MDrv_Scaler_GetHorizontalPeriod(void)
{
U8 u8Bank;
U16 u16HorizontalPeriod;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
#if 0//IPMUX CH0 // kevin 071024_0
MDrv_Write2Byte(BK_IPMUX_01_L, 0x0021);
MDrv_Write2Byte(BK_IPMUX_10_L, 0x0040);
MDrv_Write2Byte(BK_IP1_16_02_L, 0x0100);
u16HorizontalPeriod = ( MDrv_Read2Byte(BK_IP1_16_20_L) & MST_H_PERIOD_MASK );
#else//IPMUX CH1
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
u16HorizontalPeriod = ( MDrv_Read2Byte( BK_SC_IP1F2_20_L) & MST_H_PERIOD_MASK );
#endif
MDrv_WriteByte(BK_SELECT_00, u8Bank);
return u16HorizontalPeriod;
}
/******************************************************************************/
///This function will return Vertical total value
///@return
///- U16 Vertical total
/******************************************************************************/
U16 MDrv_Scaler_GetVerticalTotal(void)
{
U8 u8Bank;
U16 u16VerticalTotal;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
#if 0//IPMUX CH0 // kevin 071024_0
u16VerticalTotal = ( MDrv_Read2Byte(BK_IP1_16_1F_L) & MST_V_TOTAL_MASK );
#else//IPMUX CH1
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
u16VerticalTotal = ( MDrv_Read2Byte( BK_SC_IP1F2_1F_L) & MST_V_TOTAL_MASK );
#endif
MDrv_WriteByte(BK_SELECT_00, u8Bank);
return u16VerticalTotal;
}
/*
BOOLEAN MDrv_Scaler_DVIClockMissingDetected(void)
{
BOOLEAN bDVIClockMissingDetected;
bDVIClockMissingDetected = ( (MDrv_ReadByte(BK_ADC_DTOP_57_H) & _BIT3) ? TRUE : FALSE );
return bDVIClockMissingDetected;
}
*/
/******************************************************************************/
/// Get the horizontal period of auto postion
/// @return the horizontal period of auto postion
/******************************************************************************/
U16 MDrv_Scaler_GetHorizontalDEStart(void)
{
U8 u8Bank;
U16 u16HorizontalDE;
u8Bank = MDrv_ReadByte ( BK_SELECT_00 );
#if 0
//IPMUX CH0
u16HorizontalDE = MDrv_Read2Byte ( BK_IP1_16_13_L);
#else
//IPMUX CH1
MDrv_WriteByte ( BK_SELECT_00, REG_BANK_IP1F2 );
u16HorizontalDE = MDrv_Read2Byte ( BK_SC_IP1F2_13_L );
#endif
MDrv_WriteByte ( BK_SELECT_00, u8Bank );
return u16HorizontalDE;
}
/******************************************************************************/
/// Get the horizontal period of auto postion
/// @return the horizontal period of auto postion
/******************************************************************************/
U16 MDrv_Scaler_GetHorizontalDE(void)
{
U8 u8Bank;
U16 u16HorizontalDE;
u8Bank = MDrv_ReadByte ( BK_SELECT_00 );
#if 0
//IPMUX CH0
u16HorizontalDE = MDrv_Read2Byte ( BK_IP1_16_15_L) -
MDrv_Read2Byte ( BK_IP1_16_13_L ) + 1;
#else
//IPMUX CH1
MDrv_WriteByte ( BK_SELECT_00, REG_BANK_IP1F2 );
u16HorizontalDE = MDrv_Read2Byte ( BK_SC_IP1F2_15_L ) -
MDrv_Read2Byte ( BK_SC_IP1F2_13_L ) + 1;
#endif
MDrv_WriteByte ( BK_SELECT_00, u8Bank );
return u16HorizontalDE;
}
/******************************************************************************/
/// Get the vertical period of auto postion
/// @return the vertical period of auto postion
/******************************************************************************/
U16 MDrv_Scaler_GetVerticalDEStart(void)
{
U8 u8Bank;
U16 u16VerticalDE;
u8Bank = MDrv_ReadByte ( BK_SELECT_00 );
#if 0
//IPMUX CH0
u16VerticalDE = MDrv_Read2Byte ( BK_SC_IP1F2_12_L );
#else
//IPMUX CH1
MDrv_WriteByte ( BK_SELECT_00, REG_BANK_IP1F2 );
u16VerticalDE = MDrv_Read2Byte ( BK_SC_IP1F2_12_L );
#endif
MDrv_WriteByte ( BK_SELECT_00, u8Bank );
return u16VerticalDE;
}
/******************************************************************************/
/// Get the vertical period of auto postion
/// @return the vertical period of auto postion
/******************************************************************************/
U16 MDrv_Scaler_GetVerticalDE(void)
{
U8 u8Bank;
U16 u16VerticalDE;
u8Bank = MDrv_ReadByte ( BK_SELECT_00 );
#if 0
//IPMUX CH0
u16HorizontalDE = MDrv_Read2Byte ( BK_IP1_16_14_L) -
MDrv_Read2Byte ( BK_IP1_16_12_L ) + 1;
#else
//IPMUX CH1
MDrv_WriteByte ( BK_SELECT_00, REG_BANK_IP1F2 );
u16VerticalDE = MDrv_Read2Byte ( BK_SC_IP1F2_14_L ) -
MDrv_Read2Byte ( BK_SC_IP1F2_12_L ) + 1;
#endif
MDrv_WriteByte ( BK_SELECT_00, u8Bank );
return u16VerticalDE;
}
//-----------------------------------------------------------------------------
// screen
//-----------------------------------------------------------------------------
/******************************************************************************/
///enable/diable output black pattern
///@param bEnable \b IN
///- False:Disable
///- TRUE :enable
/******************************************************************************/
void MDrv_Scaler_GenerateBlackVideo(BOOLEAN bEnable)
{
U8 u8Bank;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
MDrv_WriteRegBit(BK_SC_VOP_19_L, bEnable, _BIT1);
MDrv_WriteByte(BK_SELECT_00, u8Bank);
}
BOOLEAN MDrv_Scaler_IsBlackVideoEnable(void)
{
U8 u8Bank;
BOOLEAN bBlackVideo;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
if( MDrv_ReadRegBit(BK_SC_VOP_19_L, _BIT1) )
bBlackVideo = 1;
else
bBlackVideo = 0;
MDrv_WriteByte(BK_SELECT_00, u8Bank);
return bBlackVideo;
}
void MDrv_Scaler_SetBlueScreen(BOOLEAN bEnable, U8 u8Color)
{
U8 u8Bank;
BOOLEAN bUseMainFB = (g_SrcInfo.u8MemoryMode != MS_MEM_FMT_NO_USE);
u8Bank = MDrv_ReadByte(BK_SELECT_00);
// seven 070822_01
//TCON: Patch V position different in different timing
//#if (PANEL_ATCON||PANEL_DTCON)
// if( bEnable )
// MDrv_WriteByte(BK_TCON_2B_L, SET_STV_LINE_TH );
//#endif
// end
if((bEnable) && (bUseMainFB == 0))
{
#if(ENABLE_FPLL_CTL)
MDrv_Scaler_CtrlFPLL(FPLL_STOP);
#endif
}
// Free Run setting
if (bEnable)
{
MDrv_Scaler_SetOPClkGating(FALSE);
MDrv_Scaler_SetFreeRunTiming();
DRVSC_DBG(puts("\r\n >>> Blue Screen Enable"));
}
else
{
DRVSC_DBG(puts("\r\n >>> Blue Screen Disable"));
}
if (bEnable)
{
MDrv_WriteByte(BK_SELECT_00, REG_BANK_DNR);
MDrv_WriteRegBit(BK_SC_DNR_11_H, ENABLE, _BIT3);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
MDrv_WriteByte(BK_SC_VOP_24_L, u8Color); // set main window no signal color
MDrv_WriteByteMask(BK_SC_VOP_10_H, _BIT7, _BIT7);// kevin 20070827
MDrv_Write2Byte(BK_SC_VOP_02_L, devPanel_VTOTAL() - devPanel_VSTART());// kevin 20070827
MDrv_Write2Byte(BK_SC_VOP_0D_L, PANEL_VTOTAL-1);// kevin 20070827
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
MDrv_WriteRegBit(BK_SC_IP1F2_02_L, ENABLE, _BIT7); // disable input source
}
else
{
MDrv_WriteByte(BK_SELECT_00, REG_BANK_DNR);
MDrv_WriteRegBit(BK_SC_DNR_11_H, DISABLE, _BIT3);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
MDrv_WriteByteMask(BK_SC_VOP_10_H, ~_BIT7, _BIT7);// kevin
MDrv_Write2Byte(BK_SC_VOP_0D_L, 0x07FF);// kevin
// disable main window blue screen
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
MDrv_WriteRegBit(BK_SC_IP1F2_02_L, DISABLE, _BIT7); // enable input source
MDrv_Scaler_SetOPClkGating(TRUE);
}
MDrv_WriteByte(BK_SELECT_00, u8Bank);
}
//-----------------------------------------------------------------------------
// OP1 control
//-----------------------------------------------------------------------------
void MDrv_Scaler_SetOPClkGating(BOOLEAN bEnable)
{
U8 u8Bank;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_OP1);
if (bEnable)
{
MDrv_Write2Byte(BK_SC_OP1_35_L, 0xA71F);
}
else
{
MDrv_Write2Byte(BK_SC_OP1_35_L, 0x0000);
}
MDrv_WriteByte(BK_SELECT_00, u8Bank);
}
BOOLEAN MDrv_Scaler_GetOPClkGating(void)
{
U8 u8Bank;
U16 u16Value;
u8Bank = MDrv_ReadByte(BK_SELECT_00);
MDrv_WriteByte(BK_SELECT_00, REG_BANK_OP1);
u16Value = MDrv_Read2Byte(BK_SC_OP1_35_L);
MDrv_WriteByte(BK_SELECT_00, u8Bank);
return ((u16Va
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -