📄 ms_func.c
字号:
/******************************************************************************
Copyright (c) 2005 MStar Semiconductor, Inc.
All rights reserved.
[Module Name]: Ms_Func.c
[Date]: 17-Feb-2005
[Comment]:
For MST IC functions.
[Reversion History]:
*******************************************************************************/
#define _MSFUNC_C_
/********************
* INCLUDE FILES *
*********************/
#include "Project.h"
#include "TypeDef.h"
#include "Ms7X_reg.h"
#include "Global.h"
#include "Debug.h"
#include "Ms_Rwreg.h"
#include "Misc.h"
#include "Sync.h"
#include "Ms_Func.h"
#include "OSDMenu.h"
#include "OSDFunc.h"
#include "Mcu.h"
#include "I2C.h"
#include "msACE.h"
#include "PANEL.h"
#if ((MARIA_TYPE_SEL == MARIA_2) && ENABLE_VD_DSP)
#include "Maria2_dsp_lib.h"
#endif // ENABLE_VD_DSP
/**********************
* FUNCTION PROTOTYPES *
***********************/
void mstEnableMute(void)
{
mstWriteByte(GEN_00_REGBK, REGBANKSCALER);
// Set frame color to BLUE (20050609)
mstWriteByte(BK0_5C_FRAME_COLOR_1, 0x3F);
mstWriteByte(BK0_5D_FRAME_COLOR_2, 0x00);
// Enable free-run mode
mstWriteByte(BK0_02_ISELECT, mstReadByte(BK0_02_ISELECT)|NIS_B);
// Set Display CLK to default
// Set Display HTotal and VTotal to default
//mstWriteWord(BK0_4F_VDTOT_H, PANEL_VTOTAL);
mstWriteWord(BK0_55_HDTOT_H, PANEL_HTOTAL-1); //BK0_54_HDTOT_L, BK0_55_HDTOT_H
}
void mstDisableMute(void)
{
mstWriteByte(GEN_00_REGBK, REGBANKSCALER);
// Disable free-run mode
mstWriteByte(BK0_02_ISELECT, mstReadByte(BK0_02_ISELECT) & ~NIS_B);
}
#if SSC_ENABLE
void mstEnableSSC(void)
{
// toggle BK0_E2[3] (Reset output)
mstWriteByte(GEN_00_REGBK, REGBANKSCALER);
mstWriteByte(BK0_E2_SWRST0, _BIT3);
miscDelay1ms(20);
mstWriteByte(BK0_E2_SWRST0, 0x00);
}
#endif // SSC_ENABLE
void mstResetVedioDecoder(void)
{
mstWriteByte(GEN_00_REGBK, REGBANKVFE);
mstWriteByte(BK2_14_SOFT_RST, 0x90);
miscDelay1ms(2);
mstWriteByte(BK2_14_SOFT_RST, 0x10);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER);
#if((MARIA_TYPE_SEL == MARIA_2) && ENABLE_VD_DSP)
VD_DSP_Ctl(TRUE);
g_bEnableVDDSP = 1;
miscDelay1ms(50);
#endif
}
void mstPowerManagement(BYTE status)
{
switch (status)
{
case PM_CVBS:
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
#if ((BOARD_TYPE_SEL == BD_DEMO_7985M_IDP)||(BOARD_TYPE_SEL == BD_DEMO_7988M_IAP)||(BOARD_TYPE_SEL == BD_SOCKET_7988M_IAP)||(BOARD_TYPE_SEL == BD_SOCKET_7985M_IDP)||(BOARD_TYPE_SEL == BD_EXMCU_7988M_IAP))//kevin
mstWriteByte(BK1_31, 0x20);
mstWriteByte(BK1_32, 0x34);
#else
mstWriteByte(BK1_31, 0x24);
mstWriteByte(BK1_32, 0x76);
#endif
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E0_PDMD0, 0x80);
mstWriteByte(BK0_E1_PDMD1, 0x18);
break;
case PM_SVIDEO:
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_31, 0x20);
mstWriteByte(BK1_32, 0x34);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E0_PDMD0, 0x90);
mstWriteByte(BK0_E1_PDMD1, 0x18);
break;
case PM_YCbCr:
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_31, 0x00);
mstWriteByte(BK1_32, 0x04);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E0_PDMD0, 0xB0);
mstWriteByte(BK0_E1_PDMD1, 0x11);
#if 0 //(MARIA_TYPE_SEL == MARIA_2)
mstWriteByte(BK0_E3_SWRST1, 0x80);
miscDelay1ms(10);
mstWriteByte(BK0_E3_SWRST1, 0x00);
#endif
break;
case PM_VGA:
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_31, 0x00);
mstWriteByte(BK1_32, 0x04);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E0_PDMD0, 0xB0);
mstWriteByte(BK0_E1_PDMD1, 0x11);
break;
case PM_CCIR656:
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_31, 0x3E);
mstWriteByte(BK1_32, 0xFF);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E0_PDMD0, 0xB0);
mstWriteByte(BK0_E1_PDMD1, 0x19);
break;
case PM_REG_WRITE_ENABLE:
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E1_PDMD1, (mstReadByte(BK0_E1_PDMD1) & ~BIUCLK_GAT_B));
break;
case PM_REG_WRITE_DISABLE:
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E1_PDMD1, (mstReadByte(BK0_E1_PDMD1) | BIUCLK_GAT_B));
break;
case PM_OSD_TURN_ON:
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E1_PDMD1, (mstReadByte(BK0_E1_PDMD1) & ~OSDCLK_GAT_B));
break;
case PM_OSD_TURN_OFF:
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E1_PDMD1, (mstReadByte(BK0_E1_PDMD1) | OSDCLK_GAT_B));
break;
case PM_POWER_OFF:
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_31, 0x7F);
mstWriteByte(BK1_32, 0xFF);
mstWriteByte(BK1_45, 0x01);
mstWriteByte(BK1_A9_PD_VDAC, 0x0F);
#if !PANEL_ANALOG_TCON
mstWriteByte(BK1_4C, 0x5F);
#endif
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E0_PDMD0, 0xB0);
mstWriteByte(BK0_E1_PDMD1, 0x80);
mstWriteByte(BK0_E1_PDMD1, 0xFF);
#if (MARIA_TYPE_SEL == MARIA_2 && PANEL_LVDS)
mstWriteByte(GEN_00_REGBK, REGBANKLVDS_CCFL); // switch to Bank 4
mstWriteByte(BK4_1E_MOD_CTRL, 0x04);
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_AC_EN_CDAC, 0x00);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
#endif
break;
case PM_POWER_ON:
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
mstWriteByte(BK0_E1_PDMD1, 0x00);
mstWriteByte(BK0_E0_PDMD0, 0x00);
miscDelay1ms(50);
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
#if PANEL_ANALOG_TCON
//mstWriteByte(BK1_45, 0x00);
mstWriteByte(BK1_A9_PD_VDAC, 0x00);
#else
mstWriteByte(BK1_4C, 0x5F);
#endif
mstWriteByte(BK1_31, 0x00);
mstWriteByte(BK1_32, 0x00);
#if (MARIA_TYPE_SEL == MARIA_2 && PANEL_LVDS)
mstWriteByte(GEN_00_REGBK, REGBANKLVDS_CCFL); // switch to Bank 4
mstWriteByte(BK4_1E_MOD_CTRL, 0x02);
mstWriteByte(GEN_00_REGBK, REGBANKADC); // switch to Bank 1
mstWriteByte(BK1_AC_EN_CDAC, 0x01);
#endif
miscDelay1ms(50);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // switch to Bank 0
//mstWriteByte(BK0_E1_PDMD1, 0x00);
break;
}
miscDelay1ms(10);
}
#if VIDEO_NON_LINEAR_ADJ
BYTE mstNonLinearCalculate(NonLinearCurveType NoLinear,BYTE AdjustValue)
{
BYTE rValue,ucXVStart,ucXVEnd,ucXStar,ucXEnd,ucStartPoint;
WORD wDistance;
BYTE temData = AdjustValue;
if (AdjustValue < NON_LINEAR_POINT_X1)
{
ucXVStart = NoLinear.X0;
ucXVEnd = NoLinear.X1;
ucXStar = NON_LINEAR_POINT_X0;
ucXEnd = NON_LINEAR_POINT_X1;
}
else if (AdjustValue < NON_LINEAR_POINT_X2)
{
ucXVStart = NoLinear.X1;
ucXVEnd = NoLinear.X2;
ucXStar = NON_LINEAR_POINT_X1;
ucXEnd = NON_LINEAR_POINT_X2;
}
else if (AdjustValue < NON_LINEAR_POINT_X3)
{
ucXVStart = NoLinear.X2;
ucXVEnd = NoLinear.X3;
ucXStar = NON_LINEAR_POINT_X2;
ucXEnd = NON_LINEAR_POINT_X3;
}
else
{
ucXVStart = NoLinear.X3;
ucXVEnd = NoLinear.X4;
ucXStar = NON_LINEAR_POINT_X3;
ucXEnd = NON_LINEAR_POINT_X4;
}
if (ucXVEnd > ucXVStart)
{
wDistance = ucXVEnd - ucXVStart;
ucStartPoint = ucXVStart;
temData = AdjustValue - ucXStar;
}
else
{
wDistance = ucXVStart - ucXVEnd;
ucStartPoint = ucXVEnd;
temData = ucXEnd - AdjustValue;
}
rValue = ((WORD)wDistance*temData/(ucXEnd - ucXStar)) + ucStartPoint;
return rValue;
}
void mstInitialConBriNLCCurve(void)
{
g_NLCVideoContrast.X0 = INIT_VIDEO_CONTRAST_X0;
g_NLCVideoContrast.X1 = INIT_VIDEO_CONTRAST_X1;
g_NLCVideoContrast.X2 = INIT_VIDEO_CONTRAST_X2;
g_NLCVideoContrast.X3 = INIT_VIDEO_CONTRAST_X3;
g_NLCVideoContrast.X4 = INIT_VIDEO_CONTRAST_X4;
g_NLCVideoBrightness.X0 = INIT_VIDEO_BRIGHTNESS_X0;
g_NLCVideoBrightness.X1 = INIT_VIDEO_BRIGHTNESS_X1;
g_NLCVideoBrightness.X2 = INIT_VIDEO_BRIGHTNESS_X2;
g_NLCVideoBrightness.X3 = INIT_VIDEO_BRIGHTNESS_X3;
g_NLCVideoBrightness.X4 = INIT_VIDEO_BRIGHTNESS_X4;
g_NLCVideoSaturation.X0 = INIT_VIDEO_SATURATION_X0;
g_NLCVideoSaturation.X1 = INIT_VIDEO_SATURATION_X1;
g_NLCVideoSaturation.X2 = INIT_VIDEO_SATURATION_X2;
g_NLCVideoSaturation.X3 = INIT_VIDEO_SATURATION_X3;
g_NLCVideoSaturation.X4 = INIT_VIDEO_SATURATION_X4;
}
#endif // VIDEO_NON_LINEAR_ADJ
void mstSetContrast(BYTE ConValue)
{
BYTE ucTemp;
mstWriteByte(GEN_00_REGBK, REGBANKSCALER); // select register bank scaler
if (tOSDSourcSELSequence[Display.ucSourceSEL] == VGA)
{
ucTemp = 0x80 + ((SCHAR)(ConValue - DEF_CONTRAST));
msAdjustPCContrast(ucTemp);
}
else
{
#if VIDEO_NON_LINEAR_ADJ
ucTemp=mstNonLinearCalculate(g_NLCVideoContrast,ConValue);
#else
ucTemp = _COLOR_DEF_CONTRAST+((SCHAR)(ConValue - DEF_CONTRAST));
#endif // VIDEO_NON_LINEAR_ADJ
msAdjustVideoContrast(ucTemp);
}
}
void msSetCCFLBrightness(void)
{
#if ENABLE_CCFL_FUNCTION
mstWriteByte(GEN_00_REGBK,REGBANKLVDS_CCFL);
mstWriteByte(BK4_6B, 0x80);
#if CCFL_BURST_MODE
mstWriteByte(BK4_91, 0x00);
mstWriteByte(BK4_90, 0xae);//tony for SZ demo 0xAE);//0x90
#else
mstWriteByte(BK4_82, 0xAA);
#endif
mstWriteByte(BK4_6B, 0x00);
mstWriteByte(GEN_00_REGBK, REGBANKSCALER);
#endif
;
}
void mstSetBrightness(BYTE BriValue)
{
BYTE ucTemp;
#if VIDEO_NON_LINEAR_ADJ
ucTemp=mstNonLinearCalculate(g_NLCVideoBrightness,BriValue);
#else
if(BriValue >= DEF_BRIGHTNESS)
ucTemp = 0x80 + (BriValue - DEF_BRIGHTNESS);
else
ucTemp = 0x80 - (DEF_BRIGHTNESS - BriValue);
#endif // VIDEO_NON_LINEAR_ADJ
mstWriteByte(GEN_00_REGBK, REGBANKSCALER);
mstWriteByte(BK0_59_BRI_R, ucTemp-8);
mstWriteByte(BK0_5A_BRI_G, ucTemp-8);
mstWriteByte(BK0_5B_BRI_B, ucTemp-8);
mstWriteByte(BK0_58_BRIGHTNESS_EN, 0x01);
}
void mstSetHue(BYTE HueValue)
{
BYTE ucTemp;
if (tOSDSourcSELSequence[Display.ucSourceSEL] != VGA)
{
if (HueValue >= 50)
ucTemp = ((WORD)(100 -_COLOR_DEF_HUE)*(HueValue-DEF_HUE)/(100-DEF_HUE))+_COLOR_DEF_HUE;
else
ucTemp = (WORD)_COLOR_DEF_HUE*HueValue/DEF_HUE;
msAdjustVideoHue(ucTemp);
}
}
#define SAT_ACC_DOWN 30
void mstSetSaturation(BYTE SatValue)//The saturation way is the bad.
{
#if 0
SINT wTemp,wBurstGap;
if (tOSDSourcSELSequence[Display.ucSourceSEL] != VGA)
{
mstWriteByte(GEN_00_REGBK, REGBANKVCF); // select register bank scaler
wBurstGap = (0x38-mstReadByte(BK3_76_DET_BST_HGHT))*2;
if (tOSDSourcSELSequence[Display.ucSourceSEL] == YPBPR)
wBurstGap = 0;
// Patch for saturattion low level range not enough
if (SatValue <= SAT_ACC_DOWN)
{
wBurstGap *= SatValue;
wBurstGap /= SAT_ACC_DOWN;
}
#if VIDEO_NON_LINEAR_ADJ
wTemp = mstNonLinearCalculate(g_NLCVideoSaturation,SatValue);
wTemp += wBurstGap;
#else
wTemp = _COLOR_DEF_SATURATION+wBurstGap+((SCHAR)(SatValue - DEF_SATURATION));
#endif
if(wTemp>0xFF)//20050915 forte modify for changing different source
{
// For saturattion high level range not enough, patch BK3.65h value
wBurstGap = (wTemp -0xFF) + _INIT_VD_SATURATION;
#if DEMODULELATOR_MODE
mstWriteByte(BK3_65_REG_SAT, (BYTE)wBurstGap);
#else
mstWriteByte(BK3_13_CBGAIN, (BYTE)wBurstGap);
mstWriteByte(BK3_14_CRGAIN, (BYTE)wBurstGap);
#endif // !DEMODULELATOR_MODE
wTemp = 0xFF;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -