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

📄 drvtvencoder.c

📁 mstar 776 开发的车载dvd
💻 C
📖 第 1 页 / 共 5 页
字号:
///
/// @param  -pOutputCtrl \b IN: the control information of VE
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_Set_OutputCtrl(PMS_VE_OUTPUT_CTRL pOutputCtrl)
{

    BOOLEAN bOutCCIR656, bOutTVE;
    U16 u16EnVal;
    U8  u8ADCATOP38;


    if(g_VEInfo.InputSrcType != MS_VE_SRC_SCALER &&
       g_VEInfo.InputSrcType != MS_VE_SRC_MAIN &&
       g_VEInfo.InputSrcType != MS_VE_SRC_SUB)
    {
        return;
    }

    if(g_VEInfo.InputSrcType == MS_VE_SRC_SCALER)
    {
        //return; //test for setop_box
    }

    if(g_VEInfo.InputSrcType == MS_VE_SRC_MAIN ||
       g_VEInfo.InputSrcType == MS_VE_SRC_SUB)
    {
        //if( stSystemInfo.enInputSourceType == INPUT_SOURCE_NONE)
            //return;  //mask for DTV bypass mode for TTX
    }

    if(pOutputCtrl->bEnable)
    {
        if(g_VEInfo.InputSrcType == MS_VE_SRC_SCALER)
        {
             MDrv_VE_Set_DestDevice(MS_SCALER_DEST_TVENCODER);

            // disable Scaling
            //MDrv_WriteRegBit(BK_VE_SRC(0x00), 1, _BIT8);
            MDrv_WriteRegBit(H_BK_VE_SRC(0x00), 1, _BIT0);
            MsWriteVEReg(BK_VE_SRC(0x16), 0x0000);
            //MDrv_WriteRegBit(BK_VE_SRC(0x00), 1, _BIT9);
            MDrv_WriteRegBit(H_BK_VE_SRC(0x00), 1, _BIT1);
            MsWriteVEReg(BK_VE_SRC(0x17), 0x0000);

            // disable FRC
            MDrv_WriteRegBit(BK_VE_SRC(0x20), 1, _BIT0); // disable Full drop
            MDrv_Write4Byte(BK_VE_SRC(0x21),  0x00);
            MDrv_Write4Byte(BK_VE_SRC(0x30),  0x00);
            MDrv_WriteByteMask(BK_VE_SRC(0x35), _BIT2, _BIT3|_BIT2);
        }
        else
        {
            _MDrv_VE_Set_ScalingRatio(); // scaling down ratio
            _MDrv_VE_Set_FRC(); // frame rate convert
        }

        bOutCCIR656 = (pOutputCtrl->OutputType == MS_VE_OUT_CCIR656) ? TRUE : FALSE;
        bOutTVE     = (pOutputCtrl->OutputType == MS_VE_OUT_TVENCODER) ? TRUE : FALSE;
        if(g_VEInfo.InputSrcType == MS_VE_SRC_SCALER)
            u16EnVal = 0x04;
        else
            u16EnVal = (g_VEInfo.bDEmode << 7) | (bOutTVE << 2) | (bOutCCIR656 << 1);

        if(bOutCCIR656)
        {
            if(g_VEInfo.VideoSystem <= MS_VE_NTSC_J)
            {   // NTSC
                MDrv_WriteVERegTbl(tVE_CCIROUT_NTSC_TBL);
                MDrv_WriteRegBit(BK_VE_SRC(0x40), _DISABLE, _BIT0); // CCIR656 out is NTSC
            }
            else
            {   // PAL
                MDrv_WriteVERegTbl(tVE_CCIROUT_PAL_TBL);
                MDrv_WriteRegBit(BK_VE_SRC(0x40), _ENABLE, _BIT0); // CCIR656 out is PAL
            }
        }

        //---------------------------------------------//
        //Disable ADC buffer out before VE reset
        //After reset, set original value back
        //to avoid green image flash in Ch/Src change
        //---------------------------------------------//
        u8ADCATOP38 = MDrv_ReadByte(BK_ADC_ATOP_38_L);
        printf("u8ADCATOP38 is %bx\n",u8ADCATOP38);
        MDrv_WriteByte(BK_ADC_ATOP_38_L, 0x0F);

        //MDrv_WriteRegBit(BK_VE_SRC(0x000), _ENABLE, _BIT4); // soft reset
        MDrv_WriteByte(BK_VE_SRC(0x000), _BIT4); // software reset
        MDrv_Timer_Delayms(100) ; // delay 100 ms

        //MDrv_WriteRegBit(BK_VE_SRC(0x000), _ENABLE, _BIT5); // load register
        MDrv_WriteByte(BK_VE_SRC(0x000),  _BIT5); // load register
        MDrv_WriteByteMask(BK_VE_SRC(0x000), u16EnVal, _BIT7|_BIT5|_BIT4|_BIT2|_BIT1);
        MDrv_Timer_Delayms(100) ; // delay 100 ms
        MDrv_WriteByte(BK_ADC_ATOP_38_L, u8ADCATOP38);
        MDrv_WriteRegBit(BK_VE_SRC(0x000), _ENABLE, _BIT0);
    }
    else
    {
        if(g_VEInfo.bUse_ADC_BuffOut)
            _MDrv_VE_Set_ADC_BuffOut(_DISABLE,  stSystemInfo.enInputPortType);

        if(g_VEInfo.InputSrcType == MS_VE_SRC_SCALER)
            MDrv_VE_Set_DestDevice(MS_SCALER_DEST_PANEL);

        MDrv_WriteByteMask(BK_VE_SRC(0x000), 0, _BIT2|_BIT1|_BIT0); // disable En_CCIR, En_TVE, En_VE
    }

}


//------------------------------------------------------------------------------
/// set the output video standard of video encoder
///
/// @param  -VideoSystem \b IN: the video standard
/// @return TRUE: supported and success,  FALSE: unsupported or unsuccess
//------------------------------------------------------------------------------
BOOLEAN MDrv_VE_Set_Output_VideoStd(MS_VE_VIDEOSYS VideoSystem)
{
    BOOLEAN bRet;
    PMS_VE_OUT_VIDEOSYS pVideoSysTbl = NULL; //<NHK_Coverity> : Declared variable "pVideoSysTbl" without initializer

    g_VEInfo.VideoSystem = VideoSystem;

    if(VideoSystem >= MS_VE_VIDEOSYS_NUM)
    {
//      bRet = FALSE;
	    return FALSE;
        MSG_DRV_VE(printf("VE:unsupported video standard\n"););
    }
    else
    {
        bRet = TRUE;
        if(VideoSystem == MS_VE_PAL)
            pVideoSysTbl = &VE_OUT_VIDEOSTD_TBL[MS_VE_PAL];
        else
            pVideoSysTbl = &VE_OUT_VIDEOSTD_TBL[VideoSystem];

    }

    if(bRet)
    {

        MDrv_WriteVERegTbl(pVideoSysTbl->pVE_TBL);
        MDrv_WriteVERegTbl(pVideoSysTbl->pVE_Coef_TBL);
        MDrv_WriteVERegTbl(pVideoSysTbl->pVBI_TBL);
        if (VideoSystem>MS_VE_PAL_M)
        {
            MDrv_WriteRegBit(L_BK_VE_ENC(0x03), pVideoSysTbl->bvtotal_525, _BIT3); // vtotal
            MDrv_WriteRegBit(L_BK_VE_ENC(0x06), pVideoSysTbl->bPALSwitch, _BIT0);  // Palswitch
        }
        MDrv_WriteRegBit(L_BK_VE_SRC(0x00), 1, _BIT5); // load register
        MDrv_WriteRegBit(L_BK_VE_SRC(0x00), 0, _BIT5);

    }

    return bRet;
}


//------------------------------------------------------------------------------
/// Set VE fix color out
///
/// @param  -pInfo \b IN: the information of fix color out
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_Set_FixColorOut(PMS_VE_FIX_COLOR_INFO pInfo)
{
    if(pInfo->bEnable)
    {
        MsWriteVEMask(BK_VE_SRC(0x38), pInfo->u8Color_Y << 7, 0x7F80);
        MsWriteVEReg(BK_VE_SRC(0x39), ((pInfo->u8Color_Cb<<8) | pInfo->u8Color_Cb));
    }

    MsWriteVEBit(BK_VE_SRC(0x38), pInfo->bEnable, _BIT6);
}


//------------------------------------------------------------------------------
/// Adjust contrast
/// @param  -u8Constrast \b IN: adjusting value for contrast, range:0~FFh
/// @return MS_MTSTATUS
//------------------------------------------------------------------------------
void MDrv_VE_Adjust_Contrast(U8 u8Constrast)
{
	MsWriteVEMask(BK_VE_ENC(0x04), u8Constrast, 0x0F);
}


//------------------------------------------------------------------------------
/// Adjust Hue
/// @param  -u8Hue \b IN: adjusting value for Hue, range:0~FFh
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_Adjust_Hue(U8 u8Hue)
{
	MsWriteVEMask(BK_VE_ENC(0x05), u8Hue, 0xF0);
}


//------------------------------------------------------------------------------
/// Adjust saturation
///
/// @param  -u8Saturation \b IN: adjusting value for saturation, range:0~FFh
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_Adjust_Saturation(U8 u8USaturation, U8 u8VSaturation)
{
	MsWriteVEMask(BK_VE_ENC(0x2A), u8USaturation, 0x0F);
	MsWriteVEMask(BK_VE_ENC(0x2A), u8VSaturation, 0xF0);
}


//------------------------------------------------------------------------------
/// Adjust brightness
///
/// @param  -u8brightness \b IN: adjusting value for brightness, range:0~FFh
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_Adjust_Brightness(U8 u8brightness)
{
	MsWriteVEMask(BK_VE_ENC(0x04), u8brightness, 0xF0);
}


//------------------------------------------------------------------------------
/// VE power trun on
///
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_PowerOn(void)
{
    MDrv_Power_Set_HwClock(E_HWCLK_VEIN_ONOFF, POWER_ON);
    MDrv_Power_Set_HwClock(E_HWCLK_VE_ONOFF, POWER_ON);
    MDrv_Power_Set_HwClock(E_HWCLK_VEDAC_ONOFF, POWER_ON);
    MDrv_WriteByteMask(BK_DAC_00_L, 0x8F, 0x8F);
}


//------------------------------------------------------------------------------
/// VE power trun off
///
/// @return none
//------------------------------------------------------------------------------
void MDrv_VE_PowerOff(void)
{
    MDrv_Power_Set_HwClock(E_HWCLK_VEIN_ONOFF, POWER_DOWN);
    MDrv_Power_Set_HwClock(E_HWCLK_VE_ONOFF, POWER_DOWN);
    MDrv_Power_Set_HwClock(E_HWCLK_VEDAC_ONOFF, POWER_DOWN);
    MDrv_WriteByteMask(BK_DAC_00_L, 0x00, 0x8F);
}

void MDrv_VE_Set_DestDevice(MS_SCALER_DEST_TYPE eDestType)
{
    U8 u8Bank;
    U16 u16Htotal, u16Vtotal, u16Hstart, u16Hsize, u16Vstart, u16Vsize;
    MS_DISPLAYWINDOW_TYPE SetDisplayWindow;

    u8Bank = MDrv_ReadByte(BK_SELECT_00);

    switch(eDestType)
    {
    case MS_SCALER_DEST_PANEL:
        MDrv_WriteByte(BK_CHIPTOP_1B_H, 0x1C); // odclk -> LPLL
        MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
        MDrv_Write2Byte(BK_SC_VOP_0C_L, devPanel_HTOTAL()-1);  // HTotal
        MDrv_Write2Byte(BK_SC_VOP_0D_L, devPanel_VTOTAL()-1);  // VTotal
        // FDE
        MDrv_Write2Byte(BK_SC_VOP_04_L, devPanel_HSTART());                         // DE H start
        MDrv_Write2Byte(BK_SC_VOP_05_L, devPanel_HSTART() + devPanel_WIDTH() - 1);  // DE H end
        MDrv_Write2Byte(BK_SC_VOP_06_L, 0);                                         // DE V start
        MDrv_Write2Byte(BK_SC_VOP_07_L, 0 + devPanel_HEIGHT() - 1);                 // DE V end
        // Main Display Window
        MDrv_Write2Byte(BK_SC_VOP_08_L, g_SrcInfo.u16H_DisStart); // Image H start
        MDrv_Write2Byte(BK_SC_VOP_09_L, g_SrcInfo.u16H_DisStart +  g_SrcInfo.u16H_DisSize - 1); // Image H end
        MDrv_Write2Byte(BK_SC_VOP_0A_L, g_SrcInfo.u16V_DisStart); // Image V start
        MDrv_Write2Byte(BK_SC_VOP_0B_L, g_SrcInfo.u16V_DisStart +  g_SrcInfo.u16V_DisSize - 1); // Image V end

        MDrv_WriteByte(BK_SC_VOP_2F_L, 0x15); // enable CSC
        MDrv_WriteRegBit(BK_SC_VOP_21_L, ENABLE, _BIT1); // enable R,B exchange

        // restore register
        MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP2F2);
        MDrv_Write4Byte(BK_SC_IP2F2_04_L, g_VEInfo.BackupReg.PreHScalingRatio); // Pre H scale ratio
        MDrv_Write4Byte(BK_SC_IP2F2_08_L, g_VEInfo.BackupReg.PreVScalingRatio); // Pre V scale ratio

        MDrv_WriteByte(BK_SELECT_00, REG_BANK_OP1);
        MDrv_Write4Byte(BK_SC_OP1_06_L, g_VEInfo.BackupReg.PostHScalingRatio); // Post H scale ratio
        MDrv_Write4Byte(BK_SC_OP1_08_L, g_VEInfo.BackupReg.PostVScalingRatio); // Post V scale ratio

        MDrv_WriteByte(BK_SELECT_00, REG_BANK_S_VOP);
        //MDrv_WriteRegBit(BK_SC_S_VOP_2B_L, DISABLE, _BIT15); // disable field invert
        //MDrv_WriteRegBit(BK_SC_S_VOP_2C_L, DISABLE, _BIT15); // disable interlace out
        MDrv_WriteRegBit(BK_SC_S_VOP_2B_H, DISABLE, _BIT7); // disable field invert
        MDrv_WriteRegBit(BK_SC_S_VOP_2C_H, DISABLE, _BIT7); // disable interlace out

        MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
        MDrv_Write2Byte(BK_SC_VOP_0D_L, 0x7FF);            // Vtotal
#if NEW_LOCK
        //MDrv_WriteRegBit(BK_SC_VOP_1C_L, ENABLE, _BIT8);  // disable free run mode
        MDrv_WriteRegBit(BK_SC_VOP_1C_H, ENABLE, _BIT0);  // disable free run mode
        MDrv_WriteRegBit(BK_LPLL_0C_L, ENABLE, _BIT3); // enable FPLL
#else
        //MDrv_WriteRegBit(BK_SC_VOP_1C_L, DISABLE, _BIT8); // disable free run mode
        MDrv_WriteRegBit(BK_SC_VOP_1C_H, DISABLE, _BIT0); // disable free run mode
        MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
        //MDrv_WriteRegBit(BK_SC_IP1F2_03_H, ENABLE, _BIT8); // enable frame lock
        MDrv_WriteRegBit(BK_SC_IP1F2_03_H, ENABLE, _BIT7); // enable frame lock
#endif

        MDrv_WriteRegBit(BK_TCON_02_H, DISABLE, _BIT5);   // enable interlace mode
        break;

    case MS_SCALER_DEST_TVENCODER:
        if(g_VEInfo.VideoSystem == MS_VE_NTSC ||
           g_VEInfo.VideoSystem == MS_VE_NTSC_443 ||
           g_VEInfo.VideoSystem == MS_VE_NTSC_J)
        {   // NTSC
            u16Htotal = 858 * 2;
            u16Vtotal = 262;
            u16Hstart = devPanel_HSTART();
            u16Vstart = 1;
            u16Hsize = 720*2;
            u16Vsize = 240;
        }
        else
        {   // PAL
            u16Htotal = 864 * 2;
            u16Vtotal = 312;
            u16Hstart = devPanel_HSTART();
            u16Vstart = 1;
            u16Hsize = 720*2;
            u16Vsize = 288;
        }
        MDrv_WriteByte(BK_CHIPTOP_1B_H, 0x18); // odclk -> XTAL
        MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
        MDrv_Write2Byte(BK_SC_VOP_0C_L, u16Htotal-1);  // HTotal
        MDrv_Write2Byte(BK_SC_VOP_0D_L, u16Vtotal-1);  // VTotal

        printf("Scaler to VE:Hstart=%d, Hend=%d, Vstart=%d, Vend=%d, \r\n ",
               u16Hstart,
               u16Hstart + u16Hsize -1,
               u16Vstart,
               u16Vstart + u16Vsize -1);
        // FDE
        MDrv_Write2Byte(BK_SC_VOP_04_L, u16Hstart);                         // DE H start
        MDrv_Write2Byte(BK_SC_VOP_05_L, u16Hstart + u16Hsize -1);  // DE H end
        MDrv_Write2Byte(BK_SC_VOP_06_L, u16Vstart);                                         // DE V start
        MDrv_Write2Byte(BK_SC_VOP_07_L, u16Vstart + u16Vsize -1);                 // DE V end

        // Main Display Window
        MDrv_Write2Byte(BK_SC_VOP_08_L, u16Hstart);               // Image H start
        MDrv_Write2Byte(BK_SC_VOP_09_L, u16Hstart + u16Hsize -1); // Image H end
        MDrv_Write2Byte(BK_SC_VOP_0A_L, u16Vstart);                                        // Image V start
        MDrv_Write2Byte(BK_SC_VOP_0B_L, u16Vstart + u16Vsize -1);                // Image V end

        MDrv_WriteByte(BK_SC_VOP_2F_L, 0x00);             // disable CSC
        MDrv_WriteRegBit(BK_SC_VOP_21_L, DISABLE, _BIT1); // disable R,B exchange

       // bakcup

⌨️ 快捷键说明

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