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

📄 52xx-init.c

📁 GM5621原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
	$Workfile:   52xx-init.c  $
	$Revision:   1.197  $
	$Date:   Apr 08 2005 02:17:28  $
*/

//******************************************************************
//
//          Copyright (C) 2002. GENESIS MICROCHIP INC.
//  All rights reserved.  No part of this program may be reproduced.
//
//	Genesis Microchip Corp., 2150 Gold Street
//			Alviso, CA 95002	USA
//  Genesis Microchip Inc., 165 Commerce Valley Dr. West
//          Thornhill, Ontario, Canada, L3T 7V8
//
//================================================================
//
//  MODULE: 52xx_init.c
//
//************************************************************************
#include "..\inc\all.h"

BYTE	ROM  FirmwareVersion[] = "52xx F/W 1.3REL"; // firmware version string

void InitGM(void);
void InitGamma(void);
void NativeModeTest( void );

extern gmt_REG_BLOCK ROM SystemInitBlock[];

#define DEBUG_INIT				1
#define DEBUG_INIT_EXTENDED	0

#if	DEBUG_MSG && DEBUG_INIT
	#define	msg(a,b)		gm_Print((const char far *)a,b)
#else
	#define	msg(a,b)
#endif

#if DEBUG_MSG && DEBUG_INIT_EXTENDED
	#define	msgx(a,b)	gm_Print((const char far *)a,b)
#else
	#define msgx(a,b)
#endif


//***************************************************************
// GSEL Constant definitions:
//***************************************************************
DWORD ROM gmc_SerialBaudRate= SERIAL_BAUD_RATE;
DWORD ROM gmc_T_CLK_KHZ 	= T_CLK_KHZ;
DWORD ROM gmc_CPU_CLK_KHZ 	= CPU_CLK_KHZ;
BYTE  ROM gmc_CPU_SPEED		= CPU_SPEED;
BYTE  ROM gmc_CPU_WaitStates_NS 		= FLASH_SPEED_NS;
WORD  ROM gmc_I2cSclk_Khz           = I2C_SPEED;
DWORD ROM gmc_OCM_CLK_POWERDOWN     = OCM_CLK_PWRDOWN_KHZ;
WORD  ROM gmc_BrightnessPWMPort 		= BRIGHTNESS_PWM_PORT;
BYTE  gmc_SPI_Clock_Sel			= (SPI_DEFAULT_CLOCK_SEL << 4);
BYTE  ROM gmc_ADC_OFFSET2_YUV_MIN_VALUE = 16;
BYTE  ROM gmc_ADC_OFFSET2_Y_MAX_VALUE = 235;
BYTE  ROM gmc_ADC_OFFSET2_UV_MAX_VALUE = 240;
 
WORD  gmc_PanelWidth;
WORD  gmc_PanelHeight;
WORD  gmc_PanelVActiveStart;
WORD  gmc_PanelVActiveEnd;
BYTE   gmc_PanelDepth;		// Add for panel array 0401
// *** Unused parameters, can be removed at some point ***/
//WORD  gmc_PowerUpPanelTiming 		= PowerUpPanelTiming;
//WORD  gmc_PowerDownPanelTiming 	= PowerDownPanelTiming;
//BYTE  gmc_PowerDownTimeIn10ms 		= PowerDownTimeIn10ms;
//BYTE  gmc_PanelMinHTotal 			= PanelMinHTotal;
//WORD  gmc_PanelTypVTotal 			= PanelTypVTotal;
//DWORD gmc_PanelMaxPClk 				= PanelMaxPClk;
//WORD  gmc_PanelMaxVTotal 			= PanelMaxVTotal;
//WORD  gmc_PanelMinVTotal 			= PanelMinVTotal;
//BYTE  gmc_PanelTwoPixelPerClk 		= PanelTwoPixelPerClk;
//BYTE  gmc_Panel_Spread_Spect_En	= Panel_Spread_Spect_En;
//BYTE  gmc_PanelSpreadSpectrumCtrl = PanelSpreadSpectrumCtrl;

BYTE  ROM gmc_IPHS_ActiveStart			= IPHS_ActiveStart;
BYTE  ROM gmc_IPVS_ActiveStart			= IPVS_ActiveStart;

BYTE  gmvb_CurrentPortMain = 0x00;

static void _near InitPanelParameters(void);

//***************************************************************
// Application Function.
// Prints the software revision and chip ID
//***************************************************************
void PrintVersion(void)
{
	//WORD ProductID;
	msg((const char *)FirmwareVersion,0);
	msg(__TIME__"  "__DATE__,0);
	msg(PanelName,0);
	msg("TCLK = %dMHz", T_CLK_MHZ);
	msgx("IROM major: %d",gm_ISPGetParameter(gmd_IROM_MAJ_VERSION, NULL_PTR));
	msgx("IROM minor: %d",gm_ISPGetParameter(gmd_IROM_MINOR_VERSION, NULL_PTR));
	msgx("IROM build: %d",gm_ISPGetParameter(gmd_IROM_BUILDNO, NULL_PTR));
}

void ext_InitDdc2BiIrq(void);

//***************************************************************
// Application Function.
// Initializes System Parameters calling Driver functions.
//***************************************************************
void System_Init(void)
{
	BYTE ws;
   DWORD ddsInitFreqValue;
    BYTE B_IsIntegrityCheckPassed = gmd_TRUE;

	// For lower power consumption, oscillator AGC loop on.
	gm_SetRegBitsByte(RCLK_PLL, AGCON);

	// Set CPU waitstates based on CPU clock. (round up to nearest integer)
	ws = (BYTE)((((DWORD)gmc_CPU_CLK_KHZ * (DWORD)gmc_CPU_WaitStates_NS) + 999999UL)/1000000UL);
	gm_WriteRegByte(EXT_ROM_RD_CTRL, (ws - 1));

	gm_I2cInit(0, gmc_CPU_CLK_KHZ, gmc_I2cSclk_Khz );

	InitNVRAM();

	gm_WriteRegBlock(SystemInitBlock);

	InitPanelParameters();

   //Init DDDS_INITIAL_FREQ according to panel resolution
   ddsInitFreqValue = (((DWORD)PanelMinHTotal*(DWORD)PanelTypVTotal)*60UL)/1000000UL;  //in MHz
   ddsInitFreqValue = (ddsInitFreqValue*4096*4096)/RCLK_MHZ;
  	gm_WriteRegDWord(DDDS_INITIAL_FREQ, ddsInitFreqValue);

	gm_SetDisplayFreeRunMode();// quickly put display in free run.

	//
	// enable cache in case we're running from SPI rom
	//  this has no effect if running in parrallel rom but allows same
	//  image to be used for SPI and parallel rom.
	gm_WriteRegByte(SPI_CACHE_CTRL, SPI_CACHE_EN | CACHE_FILL_LINE);
	// moved CLOCK_CONFIG out of SystemInitBlock so we can set individual bits
	 // in CLOCK_CONFIG, leaving OCM_CLKSEL undisturbed.
	 gm_SetRegBitsByte(CLOCK_CONFIG, IP_CLK_RGB | DP_CLK_DCLK);

	// Need to replace to Calibrate ADC
	// initialize chip ADC block
	#if !(USE_ADC_CALIBRATION_ISR)
	gm_AutoADCInitMain();     
	#endif

	#if DEBUG_MSG

   // Install the functions that powers Up/Down external devices(except panel)
	gm_SetExtDevicesPowerUpMain(ExtPowerUp);
	gm_SetExtDevicesPowerDownMain(ExtPowerDown);

	#endif

	#if USE_ACC_ACM
		gm_InitACM(CMFineTableFleshTone, (BYTE const far *)CMIntpTableFleshTone, 0x01);
     	gm_InitACC(&ACCData_Vivid);
	#endif

	#if	USE_GAMMA
		// initialize RGB output gamma table
		InitGamma();
	#endif

	#if ENABLE_HDCP
		HDCP_Init();
	 #endif

#ifdef _CUSTOMER_D_SPECIFIC_IN_52XX_
    // Configure
    //1) PWM2 as GPIO13, for Customer D Audio On/Off
    //2) PWM1 for customer D Backlight based brightness control
	 Customer_D_ApplicationInit();	 // Defination in customer D's file
#endif


#if defined(NVRAM_BLOCK_IntegrityCheck_WB_Used)
#if USE_NVRAM_INTEGRITY_CHECK
	B_IsIntegrityCheckPassed = GetIntegrityCheckSettings();

	if(B_IsIntegrityCheckPassed)
		msgx("NVRAM integrity check passed", 0);
	else
	{
		msg("NVRAM integrity check not passed", 0);
        	SaveIntegrityCheckSettings();
	}
#else
    msg("NVRAM integrity check disabled", 0);
#endif
#endif


#ifdef NVRAM_BLOCK_ColorTemp_WB_Used
	InitColorTempSettings(B_IsIntegrityCheckPassed);
#endif


#ifdef UserPrefPowerOnTimes
	ReadFactoryDependentSettings();
	UserPrefPowerOnTimes++;	//to increase time of powered-on
	SaveFactoryDependentSettings();
	msgx("Factory: MonitorOnTime_offset = %d", MonitorOnTime_offset);
	msgx("Factory: BacklightOnTime = 0x%x hours", UserPrefBacklightOnTime);
	msgx("Factory: MonitorOnTime = 0x%x hours", UserPrefMonitorOnTime);
   msgx("Factory: UserPrefPowerOnTimes = %d time", UserPrefPowerOnTimes);
#endif
   

	InitModeIndependentSettings(B_IsIntegrityCheckPassed);
	AdjustAllModeIndependentSettings();
	RestoreSystemInfoFromNVRAM(B_IsIntegrityCheckPassed);

	InitializePresetModes(B_IsIntegrityCheckPassed);

	InitADCCalibrationISR(B_IsIntegrityCheckPassed);
	InitModeHandler();

#if DDCCI_CUSTOM_SUPPORT
	//  customers using non-compliant protocols may write their own
	//  "ddc2bi" interrupt handler which may be installed by defining
	//  DDCCI_SUPPORT (see inc\options.h)
	ext_InitDdc2BiIrq();
#endif

	// Run keypad scanning from ISR
	StartGetKeyISR();
}

//******************************************************************
// FUNCTION    :  InitPanelParameters
// DESCRIPTION :	Panel parameters below have been moved out of SystemInitBlock
// 		since panel parameters are now run time variables, and can not be
// 		initiaized with gm_WriteRegBlock routine.
// SYNTEX		:	void InitPanelParameters(void)
// PARAMETERS	:	none
// RETURN		:
//******************************************************************
static void _near InitPanelParameters(void)
{
#if defined(LVDS_PANEL)
	BYTE OddEn = Panel_LVDS_BusType; //Only enable Odd bus for dual bus panels
#endif

	gmc_PanelWidth 				= PanelWidth;
	gmc_PanelHeight 				= PanelHeight;
	gmc_PanelVActiveStart     	= PanelVActiveStart;
	gmc_PanelVActiveEnd 			= PanelVActiveEnd;

	gm_WriteRegByte(TIMING_CONFIG,	PanelDClkDelay);
	gm_WriteRegDWord(PADDRIVE,	    	PanelPadDrive);
	gm_WriteRegByte(DP_POLARITY,		(Panel_Invert_DVS << DVS_INV_SHIFT) | (Panel_Invert_DHS << DHS_INV_SHIFT) | (Panel_Invert_DCLK << DCLK_INV_SHIFT) | (Panel_Invert_DEN << DEN_INV_SHIFT));
	// Set up Display Registers
	// program panel power up/down register first before program OP_ENABLE register for powr up.
	// otherwise, there is the screen flashing problem
	gm_WriteRegWord(PANEL_PWR_UP_T1,	PowerUpPanelTiming);
	gm_WriteRegWord(PANEL_PWR_DN_T1,	PowerDownPanelTiming);
	gm_WriteRegByte(OP_ENABLE, 		POWER_SEQ_EN | DCLK_EN | DCNTL_EN | DDATA_EN);

	gm_WriteRegByte(DISPLAY_CONTROL, PanelTwoPixelPerClk << D2PIXWIDE_SHIFT );
	gm_WriteRegWord(DH_TOTAL,		   PanelMinHTotal);
	gm_WriteRegByte(DH_HS_END,			PanelMinHSyncWidth / 4);

	gm_WriteRegWord(DH_BKGND_START,	PanelHActiveStart);
	gm_WriteRegWord(DH_BKGND_END, 	(PanelHActiveStart + PanelWidth - 1));
	gm_WriteRegWord(DH_ACTIV_START,	PanelHActiveStart);
	gm_WriteRegWord(DH_ACTIV_WIDTH,	PanelWidth);
	gm_WriteRegWord(SDDS_HTOTAL, 	   PanelMinHTotal - 1);

	gm_WriteRegByte(DV_VS_END,			PanelMinVSyncWidth);
	gm_WriteRegWord(DV_BKGND_START,	PanelVActiveStart);
	gm_WriteRegWord(DV_ACTIV_START,	PanelVActiveStart);
	gm_WriteRegWord(DV_ACTIV_LENGTH,	PanelHeight);
	gm_WriteRegWord(DP_FLAGLINE,	   PanelVActiveStart + PanelHeight);
	gm_WriteRegWord(DV_TOTAL, 		   PanelTypVTotal);

	gm_WriteRegWord(DV_BKGND_END,		(PanelVActiveStart + PanelHeight - 1));

	gm_WriteRegByte(HOST_CONTROL, 	0x1c);
	/********************************************************************/
	/*	Initialize:  LVDS                         						*/
	/********************************************************************/
#if USING_PANEL_ARRAY
	if(LVDS_PANEL)
	{
		if(PanelDepth == 8)
		{
			gm_WriteRegByte(LVDS_POWER, TTL_LVDS_SEL | LVDS_BIAS_EN | LVDS_PLL_EN | LVDS_DRIVER_EVEN_EN | OddEn | LVDDS_CH3_EN);
			gm_WriteRegByte(LVDS_DIGITAL_CTRL, POS_NEG_SWAP | (Panel_LVDSBus_EvenOddSwap << EVEN_ODD_SWAP_SHIFT) | (Panel_LVDS_BusType << DUAL_BUS_EN_SHIFT) | EIGHT_BIT_MODE_SEL);
		}
		else
		{
			gm_WriteRegByte(LVDS_POWER, TTL_LVDS_SEL | LVDS_BIAS_EN | LVDS_PLL_EN | LVDS_DRIVER_EVEN_EN | OddEn);
			gm_WriteRegByte(LVDS_DIGITAL_CTRL, POS_NEG_SWAP | (Panel_LVDSBus_EvenOddSwap << EVEN_ODD_SWAP_SHIFT) | (Panel_LVDS_BusType <<DUAL_BUS_EN_SHIFT ));

⌨️ 快捷键说明

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