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

📄 drvvd.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 4 页
字号:

}

/******************************************************************************/
///Program  Output &  Video's setting
///@param penMsSysInfo \b IN: display system information
/******************************************************************************/
void MDrv_VD_ProgMultiInput( MS_SYS_INFO *penMsSysInfo )
{
    u8SVflag = 0;

#if (ENABLE_SCART_VIDEO)
        if (penMsSysInfo->enInputSourceType == INPUT_SOURCE_SCART
  #if (INPUT_SCART_VIDEO_COUNT == 2)
            || penMsSysInfo->enInputSourceType == INPUT_SOURCE_SCART2
  #endif
            )
        {
            /* power on fast blanking ADC, select FB MUX */
            MDrv_WriteByte (BK_ADC_ATOP_40_L,
                            ((MDrv_ReadByte(BK_ADC_ATOP_40_L)&0xbf) | (INPUT_SCART_FB_MUX) << 4) // i.e. 0x80[6:4]
                            );
            MDrv_WriteByte (BK_ADC_ATOP_42_L, 0xEC); // i.e. 0x83
        }
        else
        {
            /* power down fast blanking ADC */
            MDrv_WriteRegBit (BK_ADC_ATOP_40_L, ENABLE, _BIT6); // i.e. 0x80[6]
            MDrv_WriteByte (BK_ADC_ATOP_42_L, 0xEC); // i.e. 0x83
        }
#endif



    switch( penMsSysInfo->enInputSourceType )
    {
#if (ENABLE_SCART_VIDEO)
        case INPUT_SOURCE_SCART:
  #if (INPUT_SCART_VIDEO_COUNT == 2)
        case INPUT_SOURCE_SCART2:
  #endif
#endif
        case INPUT_SOURCE_CVBS:
#if (INPUT_AV_VIDEO_COUNT == 2)
        case INPUT_SOURCE_CVBS2:
#endif
            // MDrv_WriteRegBit(BK_SECAM_01, DISABLE, _BIT3); // Disable Secam-SV <- removed because this register is combined with COMB_10[7]

            MDrv_WriteRegBit (BK_COMB_10, DISABLE, _BIT7); // <- SET COMB
            MDrv_WriteRegBit (BK_COMB_60, DISABLE, _BIT6); // <- SET COMB

            MDrv_WriteByte( BK_AFEC_1A, ( MDrv_ReadByte( BK_AFEC_1A ) ) & ~0xC0 ); // disable SV input
            MDrv_WriteRegBit( BK_AFEC_1F, DISABLE, _BIT7); // disable clamp C
#if (ENABLE_SCART_VIDEO)
            if(!(IsSrcTypeAV(penMsSysInfo->enInputSourceType))) // i.e. SCART
            {
                MS_ADC_SETTING adcSetting;

                // for setting ADC gain and offset
                adcSetting.u8RedGain = 0x80;
                adcSetting.u8GreenGain = 0x80;
                adcSetting.u8BlueGain = 0x80;
                adcSetting.u8RedOffset = 0x80;
                adcSetting.u8GreenOffset = 0x80;
                adcSetting.u8BlueOffset = 0x80;

                MDrv_WriteByte (BK_ADC_ATOP_44_H, 0xFF); // i.e. ATOP 0x88
                MDrv_WriteByte (BK_ADC_ATOP_44_L, 0x10); // i.e. ATOP 0x87
                MDrv_WriteByte (BK_ADC_ATOP_41_L, 0x18); // i.e. ATOP 0x81
                MDrv_WriteByte (BK_ADC_ATOP_41_H, 0x40); // i.e. ATOP 0x82
                MDrv_WriteByte (BK_ADC_ATOP_43_H, 0x2E); // i.e. ATOP 0x85
                MDrv_WriteByte (BK_ADC_ATOP_43_L, 0x30); // i.e. ATOP 0x84

// seven 070927 MDrv_WriteByte (BK_ADC_ATOP_1C_L, MDrv_ReadByte(BK_ADC_ATOP_1C_L) & 0xE0); // i.e. ATOP 0x36 set SOG level (BIT4~0) to 0
// seven 070927 MDrv_WriteByte (BK_ADC_ATOP_2C_L, 0x00); // i.e. ATOP 0x58 set VClamp to VCLAMP_RGB_ClampGnd (i.e. 0)
                MDrv_WriteByte (BK_ADC_ATOP_1C_H, 0x40); // i.e. ATOP 0x37
                MDrv_WriteByte (BK_ADC_ATOP_4C_L, 0x31); // i.e. ATOP 0x98

                MDrv_WriteRegBit (BK_ADC_ATOP_2D_H, ENABLE, _BIT6); // i.e. ATOP 0x5C disable ADC clamp from VD

// seven 070927 MDrv_WriteByte (BK_ADC_DTOP_0B_L, 0xFF); // i.e. DTOP 0x14 set clamp placement
// seven 070927 MDrv_WriteByte (BK_ADC_DTOP_0B_H, 0x40); // i.e. DTOP 0x15 set clamp duration
                MDrv_WriteByte (BK_ADC_DTOP_07_L, 0x8A); // i.e. DTOP 0x0D
                MDrv_WriteByte (BK_ADC_DTOP_10_L, 0x00); // i.e. DTOP 0x20

                MDrv_WriteByte(BK_AFEC_7F, 0x66); // Switch to Comb Y/U/V 444 input.
            }
            else
            {
                MDrv_WriteByte( BK_AFEC_7F, 0x65); // Switch to Comb Y/U/V 444 input.
            }
#endif
             break;

        case INPUT_SOURCE_SVIDEO:
#if (INPUT_SV_VIDEO_COUNT == 2)
        case INPUT_SOURCE_SVIDEO2:
#endif
             u8SVflag = 1;

             // MDrv_WriteRegBit( BK_SECAM_01, ENABLE, _BIT3 ); // Enable Secam-SV <- removed because this register is combined with COMB_10[7]

             MDrv_WriteRegBit (BK_COMB_10, ENABLE, _BIT7); // <- SET COMB
             MDrv_WriteRegBit (BK_COMB_60, DISABLE, _BIT6); // <- SET COMB

             MDrv_WriteByte( BK_AFEC_1A, ( MDrv_ReadByte(BK_AFEC_1A) )| 0xC0); // Enable SV input
             MDrv_WriteRegBit( BK_AFEC_1F, ENABLE, _BIT7); // Enable clamp C
             MDrv_WriteByte( BK_AFEC_7F, 0x65); // Switch to Comb Y/U/V 444 input. <- 0x65 used in Saturn
             break;
    }
}

/******************************************************************************/
///Set VD 's video horizontal total
///@param u32HTotal \b IN: video horizontal total
/******************************************************************************/
void MDrv_VD_SetHTotal(U32 u32HTotal)
{
    MDrv_WriteRegBit( BK_AFEC_A0, ENABLE, _BIT7 );

    u32HTotal = ( u32HTotal + 1 ) & 0xFFFE;
#if( ENABLE_DYNAMIC_VD_HTOTAL )
{
    U32 u32Mid;
    u32Mid = MAKEWORD(MDrv_ReadByte(BK_AFEC_9D), MDrv_ReadByte(BK_AFEC_9D));
    u32Mid = u32Mid>>5;
    u32Mid = (u32Mid+u32HTotal)>>1;
    MDrv_WriteByte( BK_AFEC_9D, (u32Mid>>3) );     // bit3~10
    MDrv_WriteByte( BK_AFEC_9E, (U8)u32Mid<<5 );  // bit0~2
    MDrv_Timer_Delayms(75);
    MDrv_WriteByte( BK_AFEC_9D, u32HTotal >> 3 );
    MDrv_WriteByte( BK_AFEC_9E, (U8)u32HTotal << 5 );
    MDrv_Timer_Delayms(75);
}
#else
    MDrv_WriteByte( BK_AFEC_9D, u32HTotal >> 3 );
    MDrv_WriteByte( BK_AFEC_9E, (U8)u32HTotal << 5 );
#endif
    MDrv_WriteRegBit( BK_AFEC_A0, DISABLE, _BIT7 );

#if (PATCH_PAL_VTOTAL624SHAKE)
    MDrv_Write2Byte( BK_COMB_52, u32HTotal );
    MDrv_WriteRegBit( BK_COMB_50, DISABLE, _BIT0 ); // disable H/W auto Htotal
#endif
}

/******************************************************************************/
///Program Field information for different signal type.
///@param enSignalType \b IN:
///enSignalType is Video signal type
///- SIG_NTSC
///- SIG_PAL
///- SIG_SECAM
///- SIG_NTSC_443
///- SIG_PAL_M
///- SIG_PAL_NC
///@param penMsSysInfo \b IN: penMsSysInfo is input type
/******************************************************************************/
void MDrv_VD_ProgramDiffField( EN_VD_SIGNALTYPE enSignalType, MS_SYS_INFO *penMsSysInfo )
{
    u8VideoSystem = enSignalType;

    switch( enSignalType )
    {
        case SIG_PAL:
             // 1135
             MDrv_VD_SetHTotal( VD_HT_PAL * ( VD_USE_FB + 1 ) );
             MDrv_WriteByte( BK_AFEC_7B, 0xB6 ); // 656_HDES.
             u16LatchH = 1135;
             DRVVD_DBG(printf("SIG_PAL \r\n"));
             break;
        case SIG_NTSC_443:
             // PAL-60: 1127
             MDrv_VD_SetHTotal( VD_HT_NTSC_443 * ( VD_USE_FB + 1 ) );
             MDrv_WriteByte( BK_AFEC_7B, 0xB4 ); // 656_HDES.
             u16LatchH = 1127;
             DRVVD_DBG(printf("SIG_NTSC_443 \r\n"));
             break;
        case SIG_SECAM:
             // 1097
             MDrv_VD_SetHTotal( VD_HT_SECAM * ( VD_USE_FB + 1 ) );
             MDrv_WriteByte( BK_AFEC_7B, 0xB2 ); // 656_HDES.
             u16LatchH = 1097;
             DRVVD_DBG(printf("SIG_SECAM \r\n"));
             break;
        case SIG_PAL_M:
             // 909
             MDrv_VD_SetHTotal( VD_HT_PAL_M * ( VD_USE_FB + 1 ) );
             MDrv_WriteByte( BK_AFEC_7B, 0x8E ); // 656_HDES.
             u16LatchH = 909;
             DRVVD_DBG(printf("SIG_PAL_M \r\n"));
             break;
        case SIG_PAL_NC:
             // 917
             MDrv_VD_SetHTotal( VD_HT_PAL_NC * ( VD_USE_FB + 1 ) );
             MDrv_WriteByte( BK_AFEC_7B, 0x93 ); // 656_HDES.
             u16LatchH = 917;
             DRVVD_DBG(printf("SIG_PAL_NC \r\n"));
             break;
        default:
             //case SIG_NTSC: //910
             MDrv_VD_SetHTotal(VD_HT_NTSC*(VD_USE_FB+1));
             MDrv_WriteByte( BK_AFEC_7B, 0x6D ); // 656_HDES.
             u16LatchH = 910;
             DRVVD_DBG(printf("SIG_NTSC \r\n"));
             break;
    } // switch

    MDrv_WriteByteMask (BK_COMB_1C, _BIT7|_BIT5, _BIT7|_BIT6|_BIT5); // (BIT7:1, BIT6:0, BIT5:1) Use AFEC vsync switch to DAC output.

    if(IsUseInternalSVPort(penMsSysInfo->enInputPortType))
    {
        if (SIG_NTSC == enSignalType)
        {
            MDrv_WriteByteMask( BK_COMB_48, 0x20, 0x30 );
        }
        else // SIG_NTSC_443, SIG_PAL, SIG_PAL_M, SIG_PAL_NC, SIG_SECAM
        {
            MDrv_WriteByteMask( BK_COMB_48, 0x30, 0x30 );
        }

        switch (enSignalType)
        {
        case SIG_PAL_M:
        case SIG_PAL_NC:
            MDrv_WriteByteMask( BK_COMB_6C, 0x04, 0x0C );
            break;

        case SIG_PAL:
            MDrv_WriteByteMask( BK_COMB_6C, 0x08, 0x0C );
            break;

        case SIG_NTSC_443:
            if (g_VdInfo.u16VideoStatus & VD_PAL_SWITCH)
            {
                MDrv_WriteByteMask( BK_COMB_6C, 0x08, 0x0C );
            }
            else
            {
                MDrv_WriteByteMask( BK_COMB_6C, 0x0C, 0x0C );
            }
            break;

        default: // SIG_NTSC, SIG_SECAM
            MDrv_WriteByteMask( BK_COMB_6C, 0x00, 0x0C );
            break;
        }

        MDrv_WriteByteMask( BK_COMB_10, 0x00, 0x10 );
    }
    else
    {
        MDrv_WriteByteMask( BK_COMB_48, 0x20, 0x30 );
        MDrv_WriteByteMask( BK_COMB_6C, 0x00, 0x0C );

        MDrv_VD_SetupComb (penMsSysInfo->enInputPortType);

        if (SIG_NTSC_443 == enSignalType)
        {
        }
        else
        {
        }
    }

    if (enSignalType == SIG_NTSC_443)
    {
        MDrv_WriteByteMask( BK_COMB_50, 0x06, 0x07 );
        MDrv_WriteByte( BK_COMB_52, 0x67 );
        MDrv_WriteByte( BK_COMB_53, 0x04 );
        MDrv_WriteRegBit(BK_COMB_6B, DISABLE, _BIT0); // Turn off 2D comb peaking
    }
    else
    {
        MDrv_WriteByteMask( BK_COMB_50, 0x07, 0x07 );
        MDrv_WriteByte( BK_COMB_52, 0x8D );
        MDrv_WriteByte( BK_COMB_53, 0x03 );
        MDrv_WriteRegBit(BK_COMB_6B, ENABLE, _BIT0); // Turn on 2D comb peaking
    }

    MDrv_WriteByte(BK_COMB_42, 0x80);
    MDrv_Timer_Delayms(10);
    MDrv_WriteByte(BK_COMB_42, 0xff);

    if (enSignalType == SIG_SECAM)
    {
        MDrv_WriteByte(BK_VBI_99, 0x6D);
        MDrv_WriteByte(BK_VBI_9A, 0x9A);
    }
    else
    {
        MDrv_WriteByte(BK_VBI_99, 0x8C);
        MDrv_WriteByte(BK_VBI_9A, 0x01);
    }

    u8BackupNoiseMag = 0x20;

    MDrv_VD_FinetuneComb(enSignalType);
}

/******************************************************************************/
///Fine tune COMB filter when mode changed (i.e. based on signal type)
///@param enSignalType \b IN:
///enSignalType is Video signal type
///- SIG_NTSC
///- SIG_PAL
///- SIG_SECAM
///- SIG_NTSC_443
///- SIG_PAL_M
///- SIG_PAL_NC
/******************************************************************************/
void MDrv_VD_FinetuneComb(EN_VD_SIGNALTYPE enSignalType)
{
    /*++ Comb fine tune (Color team) ++*/
    #if (PANEL_TYPE_SEL == Pnl_TMD07_DT || PANEL_TYPE_SEL == Pnl_AU07_DT)// kevin 071218
    MDrv_WriteByte(BK_COMB_72, 0x7090);
    #elif (PANEL_TYPE_SEL == Pnl_CPT07_AT || PANEL_TYPE_SEL == Pnl_AU07_AT)
    MDrv_WriteByte(BK_COMB_72, 0x7890);
    #else
    MDrv_WriteByte(BK_COMB_72, 0x8090);
    #endif

    if ((enSignalType == SIG_NTSC) || (enSignalType == SIG_NTSC_443))
    {
        DRVVD_DBG(printf("===> MDrv_VD_FinetuneComb NTSC\n"));
        MDrv_Write2Byte(BK_COMB_16, 0xB770);
        MDrv_WriteRegBit(BK_COMB_38, DISABLE, _BIT4);
        //MDrv_WriteByte(BK_COMB_31, 0x35);
        //MDrv_WriteByte(BK_COMB_33, 0x35);
    }
    else
    {
        DRVVD_DBG(printf("===> MDrv_VD_FinetuneComb PAL\n"));
        MDrv_WriteRegBit(BK_COMB_16, ENABLE, _BIT1);
        MDrv_WriteRegBit(BK_COMB_38, ENABLE, _BIT4);
        //MDrv_WriteByte(BK_COMB_31, 0x25);
        //MDrv_WriteByte(BK_COMB_33, 0x30);
    }
    /*-- Comb fine tune (Color team) --*/
}

/******************************************************************************/
///Program Field information for different signal type.
///@param u32src \b IN
///- u32src is flash's Source code address
///@param u32dst \b IN
///- u32dst is SDRAM's DSP code address
///@param u32len \b IN
///- u32len is DSP code 's length
/******************************************************************************/
void MDrv_VDMCU_Init(U32 u32src, U32 u32dst, U32 u32len)
{
    XBYTE[VD_MCU_RESET] |= 0x01;            //halt VD MCU first
    XBYTE[VD_MCU_READ_WRITE] = 0x00;        //disable Read/write

    //get demux binary information
    XBYTE[VD_MCU_READ_WRITE] = 0x00;        //read/write turn off

    //--------------------------------------------------------
    // Load code
    //--------------------------------------------------------

    // copy code from flash to SDRAM
    MDrv_MIU_XCopy(MCPY_LOADVDMCUFW, u32src, u32dst, u32len);

    DRVVD_DBG(printf("\r\n VD load code OK"));

/*// seven 070912_00

    //--------------------------------------------------------
    // Start
    //--------------------------------------------------------
    MDrv_WriteByte( VDMCU_SDRAM_CODE_MAP, VARBYTE(u32dst, 1) );
    DRVVD_DBG(printf("code map = 0x%bx\n", VARBYTE(u32dst, 1)));
    MDrv_WriteByte( VDMCU_SDRAM_CODE_MAP_H, VARBYTE(u32dst, 0) & 0x7 );
    DRVVD_DBG(printf("code map h = 0x%bx\n", VARBYTE(u32dst, 0) & 0x7));
// end*/

    // release VD_MCU and run code on SDRAM
    // clear MCU2MIU_RST and enable MIU_FETCH_EN
    // MDrv_WriteByte( VDMCU_MIU_MAP_CMD, (MDrv_ReadByte(VDMCU_MIU_MAP_CMD) & ~0x80) | 0x02 );
    // XBYTE[BK_CHIPTOP_17_L] = XBYTE[BK_CHIPTOP_17_L] & ~(0x0C) | 0x04;
//    XBYTE[BK_CHIPTOP_17_L] = XBYTE[BK_CHIPTOP_17_L] & ~(0x0E) | 0x06; // inverse clock
    XBYTE[VD_MCU_RESET] &= 0xfe;

    DRVVD_DBG(printf("\r\n Start VD MCU code...."));
}

//LACHESIS_070110
/******************************************************************************/
///Adjust blacklevel
///@param blacklevel \b IN: blacklevel value
///- 0 - 0x1FF
/******************************************************************************/
void MDrv_VD_SetBlacklevel( U16 u16Blacklevel )
{
    // U8 u8Bank; <- remove the bank change code

    // u8Bank = MDrv_ReadByte( BK_SELECT_00 ); // store bank <- remove the bank change code

    // MDrv_WriteByte( BK_SELECT_00, REG_BANK_AFEC ); <- remove the bank change code

    MDrv_WriteRegBit( BK_AFEC_38, ENABLE, _BIT7 );

#if 1// kevin 071218
    MDrv_WriteRegBit( BK_AFEC_38, ENABLE, _BIT6 );
#else
    if( HIBYTE(u16Blacklevel) )
        MDrv_WriteRegBit( BK_AFEC_38, ENABLE, _BIT6 );
    else
        MDrv_WriteRegBit( BK_AFEC_38, DISABLE, _BIT6 );
#endif

    MDrv_WriteByte( BK_AFEC_3A, LOBYTE(u16Blacklevel) );

⌨️ 快捷键说明

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