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

📄 drvvd.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 4 页
字号:
                 break;
            case SIG_PAL: // 1135
                 u16CurrentHStart = 1135;
                 break;
            case SIG_NTSC_443: // 1127
                 u16CurrentHStart = 1127;
                 break;
            case SIG_PAL_M: // 909
                 u16CurrentHStart = 909;
                 break;
            case SIG_PAL_NC: // 917
                 u16CurrentHStart = 917;
                 break;
            case SIG_SECAM: // 1097
                 u16CurrentHStart = 1097;
                 break;
            default:
                 /* ASSERT */
                 break;
        }
        if( u16Htotal != u16CurrentHStart )
        {
            if( u8AbnormalCounter < 15 )
                u8AbnormalCounter++;
        }
        else
        {
            if( u8AbnormalCounter > 1 )
                u8AbnormalCounter -= 2;
            else
                u8AbnormalCounter = 0;
        }
        if( u8AbnormalCounter > 10 )
        {
            u8AbnormalSignal = 1;
        }
        else if( u8AbnormalCounter == 0 )
        {
            u8AbnormalSignal = 0;
        }
        // For Bug 267 <--

        u16DataH[2] = u16DataH[1];
        u16DataH[1] = u16DataH[0];
        u16DataH[0] = u16Htotal;

        if( u16DataH[2] == u16DataH[1] && u16DataH[1] == u16DataH[0] )
        {
            if( u8HtotalDebounce > 3 )
                u16LatchH = u16DataH[0];
            else
                u8HtotalDebounce++;
        }
        else
        {
            u8HtotalDebounce = 0;
        }

        u16Htotal = u16LatchH;
        switch( u8VideoSystem )
        {
            case SIG_PAL:
            case SIG_NTSC_443:
                    u8Value = 3;
                    break;
            case SIG_PAL_M:
            case SIG_PAL_NC:
                    u8Value = 1;
                    break;
            default: // NTSC
                    u8Value = 2;
        }
        u8Ctl = ( u16Htotal - u8Value ) % 4;
        u8update =  1;
        if( u8Ctl == 3 )
            u16Htotal = u16Htotal + 1;
        else if( u8Ctl == 2 )
            u8update = 0;
        else
            u16Htotal = u16Htotal - u8Ctl;

        if( u8update )
        {
            MDrv_Write2Byte( BK_COMB_52, u16Htotal );
        }

        // Fix VD have large noise and use different Comb setting

        MDrv_WriteByte( BK_AFEC_04, 0x04 );

        u8Ctl = MDrv_ReadByte( BK_AFEC_02 ); // get VD Noise Magnitude
        if( u8Ctl >= 0x20 )
            u8Ctl = 0x20 ;
        if( u8Ctl != u8BackupNoiseMag )
        {
            u8BackupNoiseMag = ( u8Ctl + u8BackupNoiseMag + 1 ) >> 1;
            //ucValue = tVDtoCombTbl[g_ucBackupNoiseMag][0];
            //msWriteByte(BK6_31, ucValue);
            //ucValue = tVDtoCombTbl[g_ucBackupNoiseMag][1];
            u8Value = tVDtoCombTbl[u8BackupNoiseMag];
            u8Ctl = MDrv_ReadByte( BK_COMB_14 );
            MDrv_WriteByte( BK_COMB_14, (u8Ctl & 0xE0) | u8Value );
        }

        // Fix Comb bug
        u8Value = MDrv_ReadByte_SH( BK_AFEC_CC );

        if( !( u8Value & _BIT1 ) )
        {
            MDrv_WriteByte( BK_COMB_5A, 0x20 ); // No Burst (for hsync tolerance)

        }
        else
        {
            MDrv_WriteByte( BK_COMB_5A, 0x00); // Burst On
        }
    }

    {
        if( (MDrv_VD_GetStatus() & (VD_HSYNC_LOCKED|VD_MACROVISION|VD_STATUS_RDY)) ==
            (VD_HSYNC_LOCKED|VD_MACROVISION|VD_STATUS_RDY)
            )
        {
            MDrv_WriteRegBit( BK_COMB_40, ENABLE, _BIT2 );
        }
        else
        {
            MDrv_WriteRegBit( BK_COMB_40, DISABLE, _BIT2 );
        }
    }

    // for SECAM
    #if 0
    {
        if( MDrv_ReadRegBit( BK_AFEC_C9, _BIT1) )
        {
            MDrv_WriteByte( BK_SECAM_15, 0x3F );
        }
        else
        {
            MDrv_WriteByte( BK_SECAM_15, 0xBF );
        }
    }
    #endif

#ifdef PATCH_V_NONSTAND
    {
        U16 u16Vtotal;

        u16Vtotal = MDrv_Read2Byte_SH(BK_AFEC_C5); // Vtotal, already debounced
        if (u16Vtotal<514)
        {
            U8 u8Bank;
            U16 u16TempV_CapStart,u16OrgV_CapStart;
            u8Bank = MDrv_ReadByte(BK_SELECT_00);
            MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
            u16TempV_CapStart=g_SrcInfo.u16V_CapStart-(514-u16Vtotal);
            u16TempV_CapStart=(u16TempV_CapStart>5) ? u16TempV_CapStart : 5;
            u16OrgV_CapStart=MDrv_Read2Byte(BK_SC_IP1F2_04_L);
            if ( u16OrgV_CapStart != u16TempV_CapStart)
            {
                MDrv_Write2Byte(BK_SC_IP1F2_04_L, u16TempV_CapStart);
            }
            MDrv_WriteByte(BK_SELECT_00, u8Bank);
        }
    }
#endif
}


/******************************************************************************/
///Get VD status (VD AFEC & Comb)
///@return
///Status represented bits from VD
///- VD_PAL_SWITCH: BIT9
///- VD_COLOR_LOCKED: BIT10
///- VD_RESET_ON: BIT11
///- VD_VSYNC_50HZ: BIT12
///- VD_INTERLACED: BIT13
///- VD_HSYNC_LOCKED: BIT14
///- VD_SYNC_LOCKED: BIT15
///- VD_MACROVISION: BIT2
///- VD_VCR_MODE: BIT4
///- VD_FSC_3579: BIT6
///- VD_FSC_3575: BIT7
///- VD_FSC_3582: (BIT6|BIT7)
///- VD_FSC_4433: 0
///- VD_FSC_4285: BIT5
/******************************************************************************/
static U8 vDStatusBuf[2]; // <-<<<
static U8 vDStatusHangCnt; // <-<<<

U16 MDrv_VD_GetStatus ( void )
{
    U16 u16Status = 0x00;
    U8  u8BkAFEC_04;

    u8BkAFEC_04 = MDrv_ReadByte( BK_AFEC_04 ); //back up

    MDrv_WriteByte( BK_AFEC_04, 0x00 );
    u16Status = MDrv_Read2Byte_SH( BK_AFEC_CC );

    MDrv_WriteByte( BK_AFEC_04, u8BkAFEC_04 );


    { // <-<<<
        static U32 startHangTime;

        vDStatusBuf[0] = MDrv_ReadByte_SH(BK_AFEC_D6);

        if (vDStatusBuf[0] == vDStatusBuf[1])
        {
            if (vDStatusHangCnt > 0x02
            	&& MDrv_Timer_TimeDifferenceFromCurrent(startHangTime) > 30
            	)
            {
                DRVVD_DBG(printf (">>> ERROR: %04X, %02BX, %02BX <<<\r\n", vdResetCnt, vDStatusBuf[1]));
                MDrv_VD_McuReset(20);
            }
            else
            {
                DRVVD_DBG(printf ("- %02BX, %02BX\n", vDStatusHangCnt, vDStatusBuf[1]));
                vDStatusHangCnt++;
            }
        }
        else
        {
            vDStatusBuf[1] = vDStatusBuf[0];
            vDStatusHangCnt = 0;
            startHangTime = MDrv_Timer_GetTime0();
        }
    } // <-<<<

    DRVVD_DBG(printf("\r\nGet VD Status=%x", u16Status));
    return u16Status;
}

#if 0
/******************************************************************************/
///Get WSS information (VBI)
///@return
///WSS Information
/******************************************************************************/
U16 MDrv_VD_GetWSS( void )
{
    return u16WSSinfo;
}
#endif

/******************************************************************************/
///Set VD Default data
///@param pRegTable \b IN: Register table
/******************************************************************************/
void MDrv_VD_WriteRegTbl ( MS_REG_TYPE *pRegTable )
{
    U16 u16Index; // register index
    U16 u16Dummy;

    u16Dummy = 65535;
    while ( 1 )
    {
        u16Index = pRegTable->u16Index; // get register index

        if ( u16Index == _END_OF_TBL_ ) // check end of table
            break;

        MDrv_WriteByte( u16Index, pRegTable->u8Value ); // write register

        pRegTable++; // next

        if( (u16Dummy--) == 0 ) break;
    } // while
}

//************************************************************************
///reset VD mcu address to 0x0000
//*************************************************************************
void ResetVdMcuAddress(void)
{
    U16    TimeOut;

    XBYTE[VD_MCU_OFFSET_ADDR_0]=0x00;   //offset address=0x0000
    XBYTE[VD_MCU_OFFSET_ADDR_1]=0x80;
    for ( TimeOut=0;TimeOut<0xffff;TimeOut++ )
    {
        if ( (XBYTE[VD_MCU_OFFSET_ADDR_1] & 0x80 ) == 0x00 )
            break;
    }
}
/******************************************************************************/
///initialize video decoder registers
/******************************************************************************/
void MDrv_VD_RegInit ( void )
{
     U16 TimeOut;
    //Reset page address=0x0000
    XBYTE[VD_MCU_PAGE_ADDR]=0x20;   //reset page =0x00
    for ( TimeOut=0;TimeOut<0xffff;TimeOut++ )
    {
        if ( (XBYTE[VD_MCU_PAGE_ADDR] & 0x20 ) == 0x00 )
            break;
    }

    ResetVdMcuAddress();            //reset address=0x0000

/*// seven 070913_00
    #if (MST_XTAL_CLOCK_HZ == FREQ_14P318MHZ)// kevin e
    MDrv_Write2ByteA(0x3510, 0x1AB0);
    MDrv_Write2ByteA(0x3547, 0x1580);
    #elif (MST_XTAL_CLOCK_HZ == FREQ_12MHZ)
    MDrv_Write2ByteA(0x3510, 0x1CB0);
    MDrv_Write2ByteA(0x3547, 0x1980);
    #else
    #error "Wrong Divider setting A"
    #endif
// end*/

#if 1
    /******************
     *  ADC reg init
     ******************/
#else // #if 1
    MDrv_WriteByte(BK_ADC_12, 0x05);
    MDrv_WriteByte(BK_ADC_24, 0x00);
    //MDrv_WriteByte(BK_ADC_2F, 0x1F);test
    MDrv_WriteByte(BK_ADC_29, 0x03);
    MDrv_WriteByte(BK_ADC_3C, 0x01);
    MDrv_WriteByte(BK_ADC_40, 0x00);
#endif // #if 1

    MDrv_WriteByte(BK_AFEC_0A, 0x10);
    MDrv_WriteByte(BK_AFEC_0F, 0x48);
    MDrv_WriteByte(BK_AFEC_68, 0xDD);
    MDrv_WriteRegBit(BK_AFEC_14, ENABLE, _BIT7);
    MDrv_WriteRegBit(BK_AFEC_14, DISABLE, _BIT7);

// seven 070912_00
//    MDrv_WriteRegBit(BK_AFEC_B2, ENABLE, _BIT7); // patch Lola color stripe issue (ref Venus' VD driver)
// end

    MDrv_VD_WriteRegTbl( astVdDecInitialize ); // initialize video decoder

    MDrv_WriteByte( BK_VBI_70, 0x80); // enable VPS/WSS

    MDrv_WriteByteMask(BK_AFEC_39, 0x03, _BIT1 | _BIT0);

    MDrv_VD_Hsen_Set_Detect_Win (HSEN_NORMAL_DETECT_WIN_BEFORE_LOCK, HSEN_NORMAL_DETECT_WIN_AFTER_LOCK);
    MDrv_VD_Hsen_Set_Cntr_Before_Lock (HSEN_NORMAL_CNTR_FAIL_BEFORE_LOCK, HSEN_NORMAL_CNTR_SYNC_BEFORE_LOCK);
    MDrv_VD_Hsen_Set_Cntr_After_Lock (HSEN_NORMAL_CNTR_SYNC_AFTER_LOCK);

    u8BackupNoiseMag = 0x20;
    u8SVflag = 0;
    u8VideoSystem = SIG_NONE;
    u16DataH[0] = u16DataH[1] = u16DataH[2] = 910;//SIG_NTSC
    u8HtotalDebounce = 0;
    u16WSSinfo = 0;
    u8WSSinfoCount = 0;
}
//*************************************************************************
///VD_MCU Reset
///@param u16DelayTime \b IN: delay time after VD MCU reset
//*************************************************************************
void MDrv_VD_McuReset( U16 u16DelayTime )
{
#if 0
//    MDrv_WriteByte( VDMCU_MIU_MAP_CMD, 0x82 );
    XBYTE[VD_MCU_RESET]|=0x01;
    MDrv_Timer_Delayms( 30 );//50
//    MDrv_WriteByte( VDMCU_MIU_MAP_CMD, 0x02 );
    XBYTE[VD_MCU_RESET]&=0xfe;

    MDrv_Timer_Delayms( u16DelayTime );
#else
    vDStatusBuf[0] = 0; // <-<<<
    vDStatusBuf[1] = 0; // <-<<<
    vDStatusHangCnt = 0; // <-<<<

    // MDrv_Timer_Delayms(100);

    XBYTE[VD_MCU_RESET]|=0x01;
    MDrv_Timer_Delayms( 10 ); //30 //50
    XBYTE[VD_MCU_RESET]&=0xfe;

    MDrv_Timer_Delayms( u16DelayTime );
#endif
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//*************************************************************************
///VD Parametter Initial
//*************************************************************************
void MDrv_VD_Parameter_Initial( void )
{
    // !!! CHECK WHO CALL THIS FUNCTION !!!
}

//------------------------------------------------------------------------
//*************************************************************************
///load DSP code to VD MCU
//*************************************************************************
void MDrv_VD_LoadDSPCode( void )
{
    BINFORMAT BinInfo;


    BinInfo.B_ID = g_u16VdBinSel;
    if( MDrv_MIU_Get_BinInfo(&BinInfo) != PASS )
    {
        DRVVD_DBG( printf( "could not find VD binary on flash.\r\n" ) );
        return;
    }
    DRVVD_DBG( printf("\r\n vd_mcu address: %08LX, len: %08LX", BinInfo.B_FAddr, BinInfo.B_Len) );

    MDrv_VDMCU_Init( BinInfo.B_FAddr, 0x00000l, MemAlign(BinInfo.B_Len, 8) );

⌨️ 快捷键说明

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