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

📄 mstar.c

📁 MSTARXX.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -