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

📄 main.c

📁 主要用于液晶电视解码,内置51单片机,全部代码用C编写,编译环境为KEILC
💻 C
字号:
#include "types.h"
#include "board.h"
#include "global.h"
#include "mcu.h"
#include "detect.h"
#include "menu.h"
#include "ms_reg.h"
#include "power.h"
#include "DEBUG.h"
#include "ms_rwreg.h"
#include "msosd.h"
#include "misc.h"
#include "NVRam.h"
#include "panel.h"
#include "mstar.h"
#include "UserPref.h"
#include "keypad.h"
#include "TV.h"
#include "DevVD.h"
#include "msvd.h"
#include "DEBUG.h"
#include "Tda7052.h"
#include "Game.h"
#include "Maria2_FSC_Lib.h"
#include "Maria2_ACC_Lib.h"
#include "M2_VD_Std_Lib.h"
#include "M2_VD_AGC_Lib.h"
#include "msVDField.h"
#include "msddc2bi.h"

#if(ENABLE_VD_DSP)
#include "Maria2_dsp_lib.h"
#endif

void Init_Device(void);
void StartConfig(void);
void SyncModeHandler(void);
BOOL TV_SearchHandle(void);
void VD_DSP_Processor(void);

#if(RM_EEPROM_TYPE==RM_TYPE_PMC010)
void msSPI_CheckWriteProtect(void);
#endif

extern BOOL ExecuteKeyEvent(MenuItemActionType menuAction);

void VersionMsg(void)
{
    putstr("\r\nMstar Semiconductor");
    putstr("\r\n[Date]:");
    putstr(__DATE__);
    putstr("\r\n[Time]:");
    putstr(__TIME__);
    putstr("\r\nACC version: " );
    putstr(msVDAcc_GetVersion() );
    putstr("\r\nDSP version: " );
    putstr(VD_DSP_GetVersion() );
    putstr("\r\nFSC version: " );
    putstr(msVD_FSC_GetVersion() );
    putstr("\r\nAGC version: " );
    putstr(VD_AGC_GetVersion() );
    printf("\r\nMaria Ver: %d ",VD_Type );
    putstr("\r\nPanel:");
    putstr(PanelName);
}

/*
void Load4K(void)
{
	BYTE xdata *dest;
	BYTE code *src;

	src = 0xf000; // Code
	dest = 0xf000; // SRam
	do {
		*dest = *src;
		src++;
		dest++;
	} while (dest != 0);
	//P3_4 = 0;
    sfRegs[0x9e]=0x0f;
    sfRegs[0x39]=0x10;  //0x30 make address after 0xf000->code memory(address 0x0000)
                        //0x10 make address after 0xf000->code memory(address 0xf000)
}
*/

#if( LOAD_4K_TO == 0x0000 ) // SRAM mapping to 0000
code char dummy[16] _at_ 0x0FF8;
#endif
void Load4K(void)
{
	BYTE xdata *dest;
	BYTE code *src;

#if( LOAD_4K_TO == 0x0000 ) // SRAM mapping to 0000
	src = 0x0000; // Code
	dest = 0xf000; // SRam
	do {
		*dest = *src;
		src++;
		dest++;
        WDTCON = 1;
	} while (dest != 0);
    sfRegs[0x9e]=0x0f;
    sfRegs[0x39]=0x50; // 0x50 make address after 0xf000->code memory(address 0x0000)

#elif( LOAD_4K_TO == 0xF000 ) // SRAM mapping to F000
	src = 0xf000; // Code
	dest = 0xf000; // SRam
	do {
		*dest = *src;
		src++;
		dest++;
        WDTCON = 1;
	} while (dest != 0);
    sfRegs[0x9e]=0x0f;
    sfRegs[0x39]=0x10; // 0x10 make address after 0xf000->code memory(address 0xf000)
#endif

if( VD_Type >= MARIA2_E )
    sfRegs[0x39] |= 0x80; // Enable HW patch
}

void main(void)
{
	  Init_MCU();
	  StartConfig();

	  #if(RM_EEPROM_TYPE==RM_TYPE_PMC010)
	  msSPI_CheckWriteProtect();
	  #endif

	  Load4K();
	  WatchDogClear();
	  #if(ENABLE_VD_DSP)
	  VD_DSP_Init();
	  #endif

	  WatchDogClear();

	  VersionMsg();
	  WatchDogClear();

	  Init_GlobalVariables();

	  ReadSetting();
	  Set_PowerOnFlag();

	  WatchDogClear();
   	  msInit();
	  WatchDogClear();

	  OSDGammaInit();
	  WatchDogClear();

   	  vdInitVariable();
	  Init_Device();
	  CheckFactoryKeyStatus();

#if ENABLE_DDC2BI
      msDDC2BIInit();
#endif

      #if ENABLE_MCU_USE_INTERNAL_CLOCK
      McuUseInternalClock();
      #endif

	  Menu_InitVariable();

	  #if(ENABLE_WATCH_DOG)
	  McuWatchDogSetTimer(WatchDogTime_5S);
	  #endif
	  while (1)
        {
			WatchDogClear();
			uartDecodeCommand(); // uart debug command

			if(g_bDebugProgStopFlag)
				continue;

			if(IsVideoPortInUse()&&PowerOnFlag)
			{
				VD_DSP_Processor();
			#if(ENABLE_DDC2BI)
				CheckDSPVSYNC();
			#endif
                #if(ENABLE_SW_FILED)
                MSVD_FieldProcessor();
                #endif

		   		msVD_FSC_Detect();

		   		if((g_ucmsVDCtl&MSVD_CTL_FLAG_ACC))
		   		    msVDAcc_Processor();

		   		//if( g_ucmsVDCtl&MSVD_CTL_FLAG_NOISE_HANDLER )
		   		msVDNoiseHandler();

                //if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_AFEC )
                msVDAFECHandler();

			    if( IsSrcHasSignal()||IsTVInUse())
                {
					//if ( g_ucmsVDCtl&MSVD_CTL_FLAG_COLOR_BURST_HANDLER )
					msVDColorBurstHandler(NULL);

                    #if(ENABLE_VCR_HANDLER)
					if(g_ucmsVDCtl2&MSVD_CTL2_FLAG_VCR)
                        if( !IsTVInUse())
						    msVDVCRHandler();
                    #endif

                    #if( ENABLE_HSYNC_HANDLER )
                    msVDHSyncHandler();
                    #endif
                }
			}

			SlowTimeHandler();

			VD_DSP_Processor();
			Menu_OsdHandler();

			#if TV_ENABLE
			if (TV_SearchHandle())
			    continue;
			#endif

			#if( ENABLE_PAL_SWITCH_HANDLER )
			//if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_PAL_SWITCH )
			msVDPalSwitchHandler();
			#endif

			SyncModeHandler();
			Power_PowerHandler();

			#if GAME_ENABLE
			GameHandle();
			#endif

			#ifdef IR_DEBUG_EN
			DebugIRHandler();
			#endif

			VD_DSP_Processor();

			#if(ENABLE_CHECK_AUTO_H_TOTAL)
			msCheckBK0_57_Value(0);
			#endif


			#if(ENABLE_DDC2BI)
			msDDC2BICommandHandler();
			#endif
	    }
}

void VD_DSP_Processor(void)
{
    BYTE ucBank;

    if( IsVideoPortInUse() && PowerOnFlag)
    {
        if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_AGC_PROCESSOR )
            VD_AGC_Processor();

        #if( ENABLE_SECAM )
        if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_SECAM )
            msVDSecamHandler();
        #endif

        #if( ((DSP_RUN_MODE == DSP_RUN_MODE_POLLING)||(DSP_RUN_MODE == DSP_RUN_MODE_TIMER_AND_POLLING)) )
        //if( g_ucmsVDCtl&MSVD_CTL_FLAG_VSYNC )
        {
            VD_DSP();

            ucBank = msReadByte( BK0_00_REGBK);
            msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
            if( msVDGetVTotal() > 566 ) // 50Hz
                msWriteByteMask(BK3_40_TIMDETCFGA, 0x03, 0x03); // Force 625 lines
            else
                msWriteByteMask(BK3_40_TIMDETCFGA, 0x02, 0x03); // Force 525 lines
            msWriteByte( BK0_00_REGBK, ucBank );
        }
        #endif

        #ifdef VD_PATCH_005
        if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_PATCH5 )
            msVD_Patch_005( 0 );
        #endif

        //if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_AFEC )
            //msVDAFECHandler();
    }
}

void Init_Device(void)
{
	if (PowerOnFlag)
   		Power_TurnOnGreenLed();

	#if TV_ENABLE
	TV_ChannelInit();
	#endif

   	msInitdevAudio();

	#if PanelLG07_AT
	msWriteByte(BK0_00_REGBK, REG_BANK1_ADC_ACE_MCU);			// Switch to Bank 1 for Turn off VGH and VGL
	msWriteByte(BK1_4A, 0x00);
	msWriteByte(BK1_4B, 0x40);
	msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);			// Switch to Bank 0
	#endif
}

void StartConfig(void)
{
	while((msReadByte(BK0_00_REGBK)&0xC0)!= 0x80)
		WatchDogClear();

	msChipVersionRead();

	if( VD_Type >= MARIA2_G)
	{
	msWriteBit(BK0_F7_TEST_BUS_SELECT, 1,_BIT6);
	msWriteByte(BK0_F8_TEST_MODE, 0x00);
	msWriteBit(BK0_F7_TEST_BUS_SELECT, 0,_BIT6);
	}
	msSoftwareReset(SWR_B|REGR_B, 10);
	devAudioWrite(0);
}

void SyncModeHandler(void)
{
	#if GAME_ENABLE
    if (g_bGameEnable)
		return;
	#endif

   	if(IsVideoPortInUse())
   	{
   	    VD_DSP_Processor();

        #if(ENABLE_MONITOR_VTOTAL)
	    msMonitorVTotal( 0 );
        #endif

   	    vdMonitorInput();

   	    vdModeHandler();
	    VD_DSP_Processor();
   	}
    #if VGA_ENABLE
    else
   	{
      if (!g_ucModeDetectCounter || g_bInputTimingChangeFlag)
        {
        	msMonitorInputTiming();
	  		g_ucModeDetectCounter=10;
      	}
      	msModeHandler();
   	}
   #endif
}

#if TV_ENABLE
BOOL TV_SearchHandle(void)
{
    if(!IsTVInUse())
        return FALSE;

    if(g_bTVAutoScanChannelEnable)
    {
        TV_ChannelAutoScan();
        return TRUE;
    }
#if TV_SYSTEM!=TV_NTSC
    else if(g_bTVManualSearchEnable)
    {
        TV_ChannelManualScan();
        return TRUE;
    }
#endif

    if (g_bTVManualStore)
    {
        SaveChannelData( g_TVChSetting.ucCurChannelNO, &chData );
        g_bTVManualStore = FALSE;
    }

    return FALSE;
}
#endif

#if(RM_EEPROM_TYPE==RM_TYPE_PMC010)
void msSPI_CheckWriteProtect(void)
{
    BYTE ucTmp;

    // Read serial flash status
    MCUXFR_40_SSPI_WD0 = 0x05;
    MCUXFR_48_SSPI_TRIG= 0xF9;
    ucTmp = MCUXFR_49;
    //printf("\r\nFlash status=%x", ucTmp);

    if( (ucTmp&_BIT7) == 0 || (ucTmp&_BIT1) )
    {
        // Write Enable
        MCUXFR_40_SSPI_WD0 = 0x06;
        MCUXFR_48_SSPI_TRIG = 0xF9;

        // Write protect
        MCUXFR_40_SSPI_WD0 = 0x01;
        MCUXFR_41_SSPI_WD1= 0x9C;
        MCUXFR_48_SSPI_TRIG  = 0xF9;
    }
}
#endif

⌨️ 快捷键说明

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