📄 mstar.c
字号:
#define EnableUseGammaTbl
#define _MSTAR_C_
#define _EnableFCC_
#define _VDCaptureSetting_
#define EnableUseModeTbl
#include <math.h>
#include "board.h"
#include "types.h"
#include "ms_reg.h"
#include "global.h"
#include "panel.h"
#include "adjust.h"
#include "ms_rwreg.h"
#include "DEBUG.h"
#include "misc.h"
#include "power.h"
#include "detect.h"
#include "msOsd.h"
#include "extlib.h"
#include "Valuetbl.h"
#include "msAce.h"
#include "userpref.h"
#include "mstar.h"
#include "DevVd.h"
#include "devvd_user.h"
#include "devtuner.h"
#include "Maria2_FSC_Lib.h"
#include "M2_VD_AGC_Lib.h"
#include "M2_VD_Std_Lib.h"
#if(ENABLE_VD_DSP)
#include "Maria2_dsp_lib.h"
#endif
//*******************************************************************
//
// Constant Definition
//
//*******************************************************************
//14.318 * 15 * 8 / 4 = 429.54, 429.54<<19=225202667.52, 429.54<<3=8=3436.32
#define DClkFactor 225202667ul
//*******************************************************************
//
// extern declaration
//
//*******************************************************************
//*******************************************************************
//
// local declaration
//
//*******************************************************************
#define SSCSTEP 0x119
#define SSCSPAN 0xEC
//*******************************************************************
//
//*******************************************************************
// Function Name: msInit(void)
//
// Description: Initialize mStar chip while 1st power on system
//
// Caller: msInitADC(), msInitTCON, msSetupFreeRunMode()
// msSetupInputPort() in mStar.c
// msWriteByte(), msWriteWord() in ms_rwreg.c
// msWriteDDC1(), msWriteDDC2() in ddc.c
// msInitGamma() in gamma.c
// Osd_InitOSD() in osd.c
// Callee: Init_Device() in main.c
//*******************************************************************
#ifdef EnableUseModeTbl
DynamicLoadModeTblType code tModeIndexTbl[]=
{
{
1<<Input_CVBS1|1<<Input_CVBS2|1<<Input_SVIDEO1|1<<Input_TV,
MD_720x480_60I,
tNtscModeTbl,
},
{
1<<Input_CVBS1|1<<Input_CVBS2|1<<Input_SVIDEO1|1<<Input_TV,
MD_720x576_50I,
tPalModeTbl,
},
{
1<<Input_CVBS1|1<<Input_CVBS2|1<<Input_SVIDEO1,
MD_FreeRun,
tFreeRunModeTbl,
},
{
1<<Input_TV,
MD_TVsnow,
tTVSnowModeTbl,
},
#if VGA_ENABLE
{
1<<Input_VGA,
MD_640x480_60,
t640_480_VGA_ModeTbl,
},
#ifdef D800480PANEL
{
1<<Input_VGA,
MD_640x480_72,
t640_480_VGA_72HZ_ModeTbl,
},
#endif
{
1<<Input_VGA,
MD_800x600_60,
t800_600_VGA_ModeTbl,
},
{
1<<Input_VGA,
MD_1024x768_60,
t1024_768_VGA_ModeTbl,
},
#endif
{
_END_OF_TBL_,
0,
tENDModeTbl
},
};
#endif
void msInit(void)
{
msWriteRegsTbl(tInitializeScaler);
msWriteRegsTbl(tInitializeFCC);
msWriteRegsTbl(tInitializeADC);
#if PANEL_TTL
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU);
msWriteByte(BK1_C1_BND_RST, 0x21);
msWriteByte(BK1_C0_TUNE_FRAME_NO, 0x80);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
#endif
#ifdef P6_GPIO_Enable
msWriteBit(BK0_5E_PATTERN, _ENABLE, _BIT6); // Nelson Switch ITU656 to P6 port 2006-01-25
#endif
#ifdef P5_GPIO_Enable
msWriteBit(BK0_5E_PATTERN, _ENABLE, _BIT7);
#endif
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU); // select register bank ADC
msWriteByte(BK1_0C_GCTRL, 0x02);
#if (PANEL_DIGITAL_TCON|PANEL_ANALOG_TCON)
msWriteRegsTbl(tInitializeTCON);
#else
msWriteByte(BK1_D0_PTC_MODE1, 0x0C); // Disable TCON function
#endif
msWriteByte(BK1_4E, (msReadByte(0x4E)|_BIT0));
//msWriteByte(BK1_F4_PWM1C, 0xFF);
msWriteByte(BK1_F6_PWM1EPL, 0x00);
msWriteByte(BK1_F7_PWM1EPH, 0x01);
msWriteByte(BK1_92_SARADC_AISEL, msReadByte(BK1_92_SARADC_AISEL)|KEY_PORT);
msWriteByte(BK1_94_SAR_CH1_UPB, 0x3F);
msWriteByte(BK1_95_SAR_CH1_LOB, 0x05);
msWriteByte(BK1_96_SAR_CH2_UPB, 0x3F);
msWriteByte(BK1_97_SAR_CH2_LOB, 0x00);
msWriteByte(BK1_98_SAR_CH3_UPB, 0x3F);
msWriteByte(BK1_99_SAR_CH3_LOB, 0x00);
msWriteByte(BK1_7B_TERM_SEL, BK1_7B_TERM_SEL_VALUE);
msWriteByte(BK1_7C_CROING, BK1_7C_CROING_VALUE);
msWriteRegsTbl(tInitializeVFE);
msWriteRegsTbl(tInitializeVCE);
#if (CCFL_FUNCTION)
msWriteRegsTbl(tInitializeCCFL);
#endif
msSetupInputPort();
msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
msWriteByteMask(BK2_9A_SYNC_CTRL1, 0x01, 0x01);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
msWriteByte(BK0_F8_TEST_MODE, 0);
msWriteByte(BK0_FF_BOUNDING_MISC, 0x02 );
}
void OSDGammaInit(void)
{
Osd_InitOSD();
msInitGamma(); // programming gamma table
}
//*******************************************************************
// Function Name: msSetupInputPort
//
// Decscription: setup input port registers for
// Analog/Digital/YCbCr(Video) input
//
// caller: mSar_WriteByte(), msReadByte() in ms_rwreg.c
// callee: msMonitorInputTiming() in detect.c
//*******************************************************************
#if ((MST_CHIP==MST716A)||(MST_CHIP==MST717A)||(MST_CHIP==MST726A))
void SwitchInputPort(InputPortType PortSwitch)
{
BYTE bk1_2F_value;
BYTE bk1_90_mask=0;
switch(PortSwitch)
{
case Input_TV:
bk1_2F_value=TV_RealPortSet;
break;
case Input_CVBS1:
bk1_2F_value=CVBS1_RealPortSet;
break;
case Input_CVBS2:
bk1_2F_value=CVBS2_RealPortSet;
break;
case Input_CVBS3:
bk1_2F_value=CVBS3_RealPortSet;
break;
case Input_VGA:
bk1_2F_value=VGA_RealPortSet;
break;
case Input_SVIDEO1:
bk1_2F_value=SVIDEO1_RealPortSet;
break;
}
#if VGA_ENABLE
if(PortSwitch==Input_VGA)
msWriteRegsTbl(tPCFCC);
else
#endif
msWriteRegsTbl(tVideoFCC);
if(IsVideoPortInUse())
{
if(PortSwitch==Input_TV)
msWriteRegsTbl(t_TVInitializeFCC);
else
msWriteRegsTbl(t_AVInitializeFCC);
}
//if (bk1_2F_value==PORT_CVBS_SV1C)
//bk1_90_mask=_BIT3;
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU);
msWriteByte(BK1_2F, bk1_2F_value);
bk1_2F_value=msReadByte(BK1_90_SARADC_CTRL);
bk1_2F_value&=~_BIT3;
msWriteByte(BK1_90_SARADC_CTRL, bk1_2F_value|bk1_90_mask);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
}
#elif (MST_CHIP==MST710A)
void SwitchInputPort(InputPortType PortSwitch)
{
BYTE bk1_2F_value;
BYTE bk1_90_mask=0;
switch(PortSwitch)
{
case Input_TV:
bk1_2F_value=TV_RealPortSet;
break;
case Input_CVBS1:
bk1_2F_value=CVBS1_RealPortSet;
break;
}
if(IsVideoPortInUse())
{
msWriteRegsTbl(tVideoFCC); // Nelson 2006-03-25 Add
if(PortSwitch==Input_TV)
msWriteRegsTbl(t_TVInitializeFCC);
else
msWriteRegsTbl(t_AVInitializeFCC);
}
if (bk1_2F_value==PORT_CVBS_SV1C)
bk1_90_mask=_BIT3;
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU);
msWriteByte(BK1_2F, bk1_2F_value);
bk1_2F_value=msReadByte(BK1_90_SARADC_CTRL);
bk1_2F_value&=~_BIT3;
msWriteByte(BK1_90_SARADC_CTRL, bk1_2F_value|bk1_90_mask);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
}
#elif (MST_CHIP==MST720A)
void SwitchInputPort(InputPortType PortSwitch)
{
BYTE bk1_2F_value;
BYTE bk1_90_mask=0;
switch(PortSwitch)
{
case Input_TV:
bk1_2F_value=TV_RealPortSet;
break;
case Input_CVBS1:
bk1_2F_value=CVBS1_RealPortSet;
//bk1_90_mask=_BIT3;
break;
case Input_SVIDEO1:
bk1_2F_value=SVIDEO1_RealPortSet;
break;
}
if(IsVideoPortInUse())
{
msWriteRegsTbl(tVideoFCC); // Nelson 2006-03-25 Add
if(PortSwitch==Input_TV)
msWriteRegsTbl(t_TVInitializeFCC);
else
msWriteRegsTbl(t_AVInitializeFCC);
}
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU);
msWriteByte(BK1_2F, bk1_2F_value);
bk1_2F_value=msReadByte(BK1_90_SARADC_CTRL);
bk1_2F_value&=~_BIT3;
msWriteByte(BK1_90_SARADC_CTRL, bk1_2F_value|bk1_90_mask);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
}
#endif
void SetChromaMode(void)
{
BYTE uctemp, temp2;
#if TV_ENABLE
if(IsTVInUse())
{
uctemp=((g_TVChSetting.TvCurChannelMisc&ColorSysMask)>>4)%CHROMA_NUMS;
devSetSWF(((g_TVChSetting.TvCurChannelMisc&SoundSysMask)%TV_SOUND_NUMS));
}
else
#endif
uctemp=g_VideoSetting.VideoColorSys%CHROMA_NUMS;
msWriteByte(BK0_00_REGBK, REG_BANK3_COMB);
switch (uctemp)
{
case CHROMA_SECAM:
case CHROMA_AUTO:
temp2=0;
break;
case CHROMA_PAL:
temp2=0x02;
break;
case CHROMA_NTSC:
temp2=0x01;
break;
}
msWriteByteMask(BK3_1C_CTRLSWCH, temp2, 0x03);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
}
void msLineBufferDelayCtl( BOOL bInterlace )
{
BYTE ucTmp = 0;
bInterlace=bInterlace;
ucTmp = 0x20;
msWriteByte(BK0_0F_ASCTRL, ucTmp );
}
///////////////////////////////////////////////////////////////////////////////
// <Function>: msSetInterrupt
//
// <Description>: Set chip interrrupt.
//
// <Parameter>: - <Flow> - <Description>
//-----------------------------------------------------------------------------
// IntSel - In - interrupt setting
///////////////////////////////////////////////////////////////////////////////
void msSetInterrupt(msInterruptType IntSel)
{
BYTE ucBank;
ucBank = msReadByte( BK0_00_REGBK);
msWriteByte(BK0_00_REGBK,REG_BANK_SCALER);
msWriteByte(BK0_1D_INTENC, 0x00); // Interrupt enable control byte C
msWriteByte(BK0_1F_INTEND, 0x00); // Interrupt enable control byte D
switch( IntSel )
{
case INTERRUPT_PC:
msWriteByte(BK0_1F_INTEND, 0x0E); // V change,H loss,V loss
break;
case INTERRUPT_YPBPR:
msWriteByte(BK0_1F_INTEND, 0x06); // H loss,V loss
break;
case INTERRUPT_INPUT_VSYNC:
msWriteByte(BK0_1D_INTENC, 0x40); // H loss,V loss
break;
}
msWriteByte(BK0_00_REGBK, ucBank);
}
void ChipPowerUpcontrol(void)
{
BYTE vbk0_e0,vbk0_e1,vbk1_31,vbk1_32;
if( IsCVBSInUse())
{
vbk0_e0=0x80;
vbk0_e1=0x1C;
vbk1_31=0x24;
vbk1_32=0x76;
}
else if(IsSVideoInUse())
{
vbk0_e0=0x90;
vbk0_e1=0x18;
vbk1_31=0x20;
vbk1_32=0x34;
}
#if VGA_ENABLE
else if(IsVGAInUse())
{
vbk0_e0=0xb0;
vbk0_e1=0x11;
vbk1_31=0x00;
vbk1_32=0x04;
}
#endif
msWriteByte(BK0_E0_PDMD0, vbk0_e0);
msWriteByte(BK0_E1_PDMD1, vbk0_e1);
Delay1ms(5);//(50);
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU); // switch to Bank 1
msWriteByte(BK1_31, vbk1_31);
msWriteByte(BK1_32, vbk1_32);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER); // switch to Bank 0
}
void msSetupInputPort(void)
{
SwitchInputPort(g_VideoSetting.InputType);
ChipPowerUpcontrol();
#if VGA_ENABLE
if( IsVGAInUse()) // PC
{
msWriteByte(BK0_0D_LYL, 0x00);
msAdjustPCRGB(0x80, 0x80, 0x80);
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU );
msWriteByte( BK1_24, 0x50 );
msWriteByte( BK1_25, 0 ); // FPLL_DIVN => Divide by 1
msWriteByte( BK1_29, 0x18 ); // 20051007
msWriteByte( BK1_2C, 0x00 ); // I clamp
msWriteByte( BK0_00_REGBK, REG_BANK_SCALER);
//msWriteByte( BK0_37, 0 ); // 20051004 Lizst: Disable D-Edge
msWriteByte( BK0_83_DELTA_L, 0 );
msWriteByte( BK0_84_DELTA_H, 0 );
//should turn off in VGA mode,we don't support YPBPR here
//msLPFCtl(LPF_CTL_ANALOG_PORT);
msLPFCtl(LPF_CTL_TURN_OFF);
msWriteRegsTbl(tProgVGAPort); // program VGA port
}
else // CVBS/SV/CCIR656
#endif
{
msWriteByte(BK0_0D_LYL, 0x07);
msWriteByte(BK0_10_COCTRL1,COCTRL1_VALUE);
if( IsVideoPortInUse())
{
//msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
//msWriteBit( BK3_11_COMBCFGB, 1, _BIT5 ); // Patch IC
msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU );
msWriteByte( BK1_24, 0x40 );
msWriteByte( BK1_25, 0x01 ); // FPLL_DIVN => Divide by 2
msWriteByte( BK1_29, 0x1F ); // 20051007
msWriteByte( BK1_2C, 0xF0 ); // 20050624 David.Shen: I clamp
// Reset ADC register for internal VD
msWriteByte( BK1_04_RGAIN_ADC, 0x80);
msWriteByte( BK1_05_GGAIN_ADC, 0x80);
msWriteByte( BK1_06_BGAIN_ADC, 0x80);
msWriteByte( BK1_07_ROFFS_ADC, 0x80);
msWriteByte( BK1_08_GOFFS_ADC, 0x80);
msWriteByte( BK1_09_BOFFS_ADC, 0x80);
msWriteByte( BK1_18_CALEN, 0);
//if( g_ucmsVDCtl&MSVD_CTL_FLAG_NOISE_HANDLER )
msVDNoiseHandlerReset();
if( IsCVBSInUse())
{
msWriteRegsTbl(tProgMsAvPort); // program CVBS port
msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
msWriteByteMask(BK2_1A_SVD_EN, 0x00, 0xC0); // Disable SV
msWriteBit(BK2_1F, 0, _BIT7); // Disable clamp C
msWriteByte(BK2_7F,0x63);
msWriteByte(BK0_00_REGBK, REG_BANK3_COMB);
msWriteBit(BK3_10_COMBCFGA, 0, _BIT7); // Enable comb filter
msWriteBit(BK3_A1_SCM_IDSET1, 0, _BIT3); // Disable Secam-SV
}
else if( IsSVideoInUse())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -