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

📄 drvmode.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 4 页
字号:
     	1056*2, 525,   // HTotal, VTotal
#else
        1056, 525,   // HTotal, VTotal
#endif
        25,           // VTotalTorance
        0x3f,        // ADC phase
        MD_FLAG_CHK_POR_BIT | MD_FLAG_POR_HNVP | MD_FLAG_POR_HNVN | MD_FLAG_POR_HPVP | MD_FLAG_POR_HPVN,
    },

#if CRT_IOUT
    //Johnny Test
    // 720x480I 60Hz
    {//47
    RES_720X480, // resolution index
    157, 600,     // HFreq, VFreq
    0x3b, 0x1a,   // HStart, VStart	//may_070401_CompPosAdj
    803, 524,     // HTotal, VTotal
    5,           // VTotalTorance
    0x1f,         // ADC phase
    MD_FLAG_INTERLACE |MD_FLAG_CHK_POR_BIT |MD_FLAG_POR_HPVP |MD_FLAG_POR_HPVN|MD_FLAG_POR_HNVP|MD_FLAG_POR_HNVN, // flags
    },
#endif

};

//end

#define MODE_TABLE_MAXIMUM_NUM    (sizeof(astStandardModeTable) / sizeof(MS_PCADC_MODETABLE_TYPE))

/********************************************************************************/
/*                   Local Function Prototypes                  */
/********************************************************************************/
/********************************************************************************/
/*                   Functions                      */
/********************************************************************************/
//*************************************************************************
//Function name:        MDrv_Mode_GetStdModeResolutionIndex
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter:     Resolution Index
//Description:          get standard resolution index
//*************************************************************************
EN_RESOLUTION_TYPE MDrv_Mode_GetStdModeResolutionIndex( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].enResolutionIndex;
}
//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeResH
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U16: H resolution
//Description:          get standard H resolution
//*************************************************************************
U16 MDrv_Mode_GetStdModeResH ( U8 u8ModeIndex )
{
    return astStandardModeResolution[astStandardModeTable[u8ModeIndex].enResolutionIndex].u16DisplayWidth;
}
//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeResV
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U16: V resolution
//Description:          get standard V resolution
//*************************************************************************
U16 MDrv_Mode_GetStdModeResV ( U8 u8ModeIndex )
{
    return astStandardModeResolution[astStandardModeTable[u8ModeIndex].enResolutionIndex].u16DisplayHeight;
}


//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeHTotal
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U16: H total
//Description:          get standard H total
//*************************************************************************
U16 MDrv_Mode_GetStdModeHTotal ( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].u16HorizontalTotal;
}
//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeVTotal
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U16: V total
//Description:          get standard V total
//*************************************************************************
U16 MDrv_Mode_GetStdModeVTotal ( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].u16VerticalTotal;
}
//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeHStart
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U16: H start
//Description:          get standard H start
//*************************************************************************
U16 MDrv_Mode_GetStdModeHStart ( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].u16HorizontalStart;
}
//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeVStart
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U16: V start
//Description:          get standard V start
//*************************************************************************
U16 MDrv_Mode_GetStdModeVStart ( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].u16VerticalStart;
}
//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeADCPhase
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U8: ADC phase
//Description:          get standard ADC phase
//*************************************************************************
U8 MDrv_Mode_GetStdModeADCPhase ( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].u8AdcPhase;
}

//*************************************************************************
//Function name:    MDrv_Mode_GetStdModeStatusFlag
//Passing parameter:    U8 u8ModeIndex: current mode index
//Return parameter: U8: ADC phase
//Description:          get standard ADC phase
//*************************************************************************
U8 MDrv_Mode_GetStdModeStatusFlag ( U8 u8ModeIndex )
{
    return astStandardModeTable[u8ModeIndex].u8StatusFlag;
}

U8 LDrv_Mode_GetStdModeVTotalTolerance ( U8 u8ModeIndex )	//may_070405_1050mode
{
    return astStandardModeTable[u8ModeIndex].u8VTotalTolerance;
}


U16 MDrv_Mode_GetStdModeVFreq(U8 u8ModeIndex)
{
    return astStandardModeTable[u8ModeIndex].u16VerticalFrequency;
}

U8 MDrv_Mode_GetStdMaxTableIndex(void)
{
    return MD_STD_MODE_MAX_INDEX;
}


BOOLEAN MDrv_Mode_CompareModePolarity(U8 u8InputStatusFlag, U8 u8StdModeIndex)
{
    U8 u8ModeFlag;

    u8ModeFlag = MDrv_Mode_GetStdModeStatusFlag(u8StdModeIndex);

    if (u8ModeFlag & MD_FLAG_CHK_POR_BIT) // check polarity
    {
        if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) ) == 3) && !(u8ModeFlag&MD_FLAG_POR_HPVP) )
        {
            return FALSE;
        }
        if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) )==2) && !(u8ModeFlag&MD_FLAG_POR_HPVN) )
        {
            return FALSE;
        }
        if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) ) == 1) && !(u8ModeFlag&MD_FLAG_POR_HNVP) )
        {
            return FALSE;
        }
        if( ( (u8InputStatusFlag&(MD_HSYNC_POR_BIT|MD_VSYNC_POR_BIT) ) == 0) && !(u8ModeFlag&MD_FLAG_POR_HNVN) )
        {
            return FALSE;
        }

        return TRUE;
    }
    else
    {
        return FALSE;
    }
}


//*************************************************************************
//Function name:    MDrv_Mode_MatchMode
//Passing parameter:    MS_PCADC_MODETABLE_TYPE * pstInputType: current mode parameters
//                  U8 u8InputSourceType:           current input source type
//Return parameter: U8: Match table index
//Description:  This function will search matched standard mode index
//*************************************************************************
U8 MDrv_Mode_MatchMode ( MS_PCADC_MODETABLE_TYPE *pstInputType, MS_INPUT_SOURCE_TYPE enInputSourceType )
{
    MS_PCADC_MODETABLE_TYPE code *pStdModeTbl; // table pointer
    U8 ucIndex; // loop index
    U8 ucFlagBff; // flag buffer
    U16 u16InputVTotal;

    U8 ucMatchIndex; // match index
    U16 wMatchDelta; // difference
    U16 wDeltaBff;

    U16 wVTotalMatchDelta;
    U16 wVTotalDeltaBff;
#if (MS_VGA_SOG_EN)
    U8  u8Bank;
    U8  u8VGASogStatus;
#endif

    // initilaize
    ucMatchIndex = _END_OF_TBL_;
    wMatchDelta = MD_HFREQ_TORLANCE + MD_VFREQ_TORLANCE;
    wVTotalMatchDelta = 0xFFFF;

    u16InputVTotal = pstInputType->u16VerticalTotal;

    pStdModeTbl = astStandardModeTable; // initailize

    for(ucIndex=0; ucIndex<MODE_TABLE_MAXIMUM_NUM; ucIndex++, pStdModeTbl++)
    {
        ucFlagBff = pStdModeTbl->u8StatusFlag; // get sync flag

        MODE_DBG(printf("\r\n 1:Md=%bu,StatusFlag=0x%bx,Tbl=0x%bx",
                        ucIndex, pstInputType->u8StatusFlag, ucFlagBff);)

        if( IsSrcTypeYPbPr(enInputSourceType) || IsSrcTypeYCbCr(enInputSourceType) ) // Mode detect for YPbPr
        {
            if( !(ucFlagBff & MD_FLAG_YPBPR_BIT) ) // check YPbPr mode only
                continue;
        }
        else // Mode detect for PC
        {
            if( (ucFlagBff&MD_FLAG_YPBPR_BIT) /*&& (ucMatchIndex != _END_OF_TBL_)*/ )
                continue;
        }

#if (MS_VGA_SOG_EN)
        u8Bank = MDrv_ReadByte(BK_SELECT_00);
        MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);

        u8VGASogStatus = MDrv_ReadByte(BK_SC_IP1F2_02_L);

        MDrv_WriteByte(BK_SELECT_00, u8Bank);

        if((u8VGASogStatus & 0x70)==0x70)
        {
            ;
        }
        else
#endif // #if (MS_VGA_SOG_EN)

		if(IsSrcTypeVga(enInputSourceType))
		{
        if(MDrv_Mode_CompareModePolarity(pstInputType->u8StatusFlag, ucIndex)) // check polarity
        {
				MODE_DBG(printf("\r\n MDrv_Mode_CompareModePolarity TRUE  ucIndex %bu", (U8)ucIndex));
        }
        else
        {
				MODE_DBG(printf("\r\n MDrv_Mode_CompareModePolarity fail  ucIndex %bu", (U8)ucIndex));
                continue;
            }
        }

        // match interlace mode
        if ((bit)(ucFlagBff & MD_FLAG_INTERLACE) != (bit)(pstInputType->u8StatusFlag & MD_INTERLACE_BIT))
        {
            MODE_DBG(printf("\r\n Compare Interlace fail"));
            continue;
        }

        //if (wVTotal < tStandardModeResolution[pStdModeTbl->ResolutionIndex].DisplayHeight)
        //    continue;

        MODE_DBG(printf("\r\n Pst Hfreq=%d", pstInputType->u16HorizontalFrequency));
        MODE_DBG(printf("\r\n Std Hfreq=%d", pStdModeTbl->u16HorizontalFrequency));
        MODE_DBG(printf("\r\n Pst Vfreq=%d", pstInputType->u16VerticalFrequency));
        MODE_DBG(printf("\r\n Std Vfreq=%d", pStdModeTbl->u16VerticalFrequency));
        MODE_DBG(printf("\r\n Pst Vtl=%d", u16InputVTotal));
        MODE_DBG(printf("\r\n Std Vtl=%d", pStdModeTbl->u16VerticalTotal));

        // match H/V frequency
        if ( (abs(pstInputType->u16HorizontalFrequency - pStdModeTbl->u16HorizontalFrequency) < MD_HFREQ_TORLANCE) &&
                (abs(pstInputType->u16VerticalFrequency - pStdModeTbl->u16VerticalFrequency) < MD_VFREQ_TORLANCE) &&
                (abs(u16InputVTotal - pStdModeTbl->u16VerticalTotal) < pStdModeTbl->u8VTotalTolerance) )
        {
            MODE_DBG(printf("\r\n Pass TORLANCE"));

            // calculate frequency diffenece
            wDeltaBff = abs(pstInputType->u16HorizontalFrequency - pStdModeTbl->u16HorizontalFrequency) +
                        abs(pstInputType->u16VerticalFrequency - pStdModeTbl->u16VerticalFrequency);

            wVTotalDeltaBff = abs(u16InputVTotal - pStdModeTbl->u16VerticalTotal);

            if ( ((wMatchDelta > wDeltaBff) && (wVTotalMatchDelta > wVTotalDeltaBff)) ||
                ((wDeltaBff <= 10) && (wVTotalDeltaBff < wVTotalMatchDelta)) )// check more near
            {
                wMatchDelta = wDeltaBff;
                ucMatchIndex = ucIndex; // match standard mode table
                wVTotalMatchDelta = wVTotalDeltaBff;
				MODE_DBG(printf("\r\n Match Standard Mode"));
            }
        }
    } // for

    if(ucMatchIndex == _END_OF_TBL_)
    {
        // initilaize
        ucMatchIndex = _END_OF_TBL_;
        wMatchDelta = MD_FREQ_DELTA;
        wVTotalMatchDelta = 0xFFFF;

        pStdModeTbl = astStandardModeTable; // initailize

        for(ucIndex=0; ucIndex<MODE_TABLE_MAXIMUM_NUM; ucIndex++, pStdModeTbl++)
        {
            ucFlagBff = pStdModeTbl->u8StatusFlag; // get sync flag

            MODE_DBG(printf("\r\n 2:Md=%bu,StatusFlag=0x%bx,Tbl=0x%bx",
                        ucIndex, pstInputType->u8StatusFlag, ucFlagBff);)

            // check YPbPr mode detect(only suppot YPbPr mode)
            if( IsSrcTypeYPbPr(enInputSourceType) || IsSrcTypeYCbCr(enInputSourceType) ) // Mode detect for YPbPr
            {
                if( !(ucFlagBff & MD_FLAG_YPBPR_BIT) ) // check YPbPr mode only
                    continue;
            }
            else // Mode detect for PC
            {
            //  if( (ucFlagBff&MD_FLAG_YPBPR_BIT) /*&& (ucMatchIndex != _END_OF_TBL_)*/ )
            //      continue;
            }

            if ((bit)(ucFlagBff & MD_FLAG_INTERLACE) != (bit)(pstInputType->u8StatusFlag & MD_INTERLACE_BIT))
                continue;

            MODE_DBG(printf("\r\n         InputVtt=%u,Mode=%u", u16InputVTotal, astStandardModeResolution[pStdModeTbl->enResolutionIndex].u16DisplayHeight);)

            if ( u16InputVTotal > astStandardModeResolution[pStdModeTbl->enResolutionIndex].u16DisplayHeight)
            {
                MODE_DBG(printf("\r\n         HFreq(%u,%u),VFreq(%u,%u)",
                    pstInputType->u16HorizontalFrequency,
                    pStdModeTbl->u16HorizontalFrequency,
                    pstInputType->u16VerticalFrequency,
                    pStdModeTbl->u16VerticalFrequency);)

                // calculate frequency delta
                wDeltaBff = abs(pstInputType->u16HorizontalFrequency - pStdModeTbl->u16HorizontalFrequency) +
                            abs(pstInputType->u16VerticalFrequency - pStdModeTbl->u16VerticalFrequency);

                wVTotalDeltaBff = abs(u16InputVTotal - pStdModeTbl->u16VerticalTotal);

                // compare delta minimum & match interlace status
                if ( ((wDeltaBff < wMatchDelta) && (wVTotalDeltaBff < wVTotalMatchDelta)) ||
                    ((wDeltaBff <= 10) && (wVTotalDeltaBff < wVTotalMatchDelta)) )
                {
                    wMatchDelta = wDeltaBff;
                    ucMatchIndex = ucIndex; // match user mode index
                    wVTotalMatchDelta = wVTotalDeltaBff;

                    MODE_DBG(printf("\r\n         --Delta Freq=%u,Vtt=%u", wMatchDelta, wVTotalMatchDelta);)
					MODE_DBG(printf("\r\n Match UseNewr Mode"));
                }
            }
        } // for

        if(ucMatchIndex != _END_OF_TBL_)
        {
            pstInputType->u8StatusFlag |= MD_USER_MODE_BIT; //user new mode
        }
    }
    return ucMatchIndex;
}
#undef DRV_MODE_C

⌨️ 快捷键说明

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