📄 drvtvencoder.c
字号:
///
/// @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 + -