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

📄 nv_functions.c

📁 GM5621原代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
	$Workfile:   nv_functions.c  $
	$Revision:   1.67  $
	$Date:   Aug 23 2006 23:27:04  $
*/
//******************************************************************
//
//          Copyright (C) 2001. GENESIS MICROCHIP INC.
//  All rights reserved.  No part of this program may be reproduced.
//
//  Genesis Microchip Inc., 165 Commerce Valley Dr. West
//          Thornhill, Ontario, Canada, L3T 7V8
//	Genesis Microchip Corp., 2150 Gold Street
//			Alviso, CA 95002	USA
//
//================================================================
//
//  MODULE: nv_functions.c
//
//  USAGE : This module contains function for access to nvram data
//
//******************************************************************

//******************************************************************
//                  I N C L U D E    F I L E S
//******************************************************************
#include "inc\all.h"
#include "inc\version.h"
#include <string.h>
#include <math.h>

#define DEBUG_NVRAM 				1
#define DEBUG_NVRAM_EXTENDED  0

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

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

//******************************************************************
//               L O C A L   D E F E N I T I O N S
//******************************************************************
	 //
    // The maximum delta when comparing with mode saved in NVRAM.
    // Normally, these deltas are smaller then ones for standard modes.
    //
	 #define SavedHFreqDelta					10	// 1.0KHz
    #define SavedVFreqDelta					10	// 1.0Hz
    #define SavedVTotalDelta					2	// 2 lines

  	#define FLASH_PAGE_SIZE		256	//use page size for optimizing speed

   //to identify current mode type when searching mode in nvram
NVMODE_TYPE	B_NvramModeType = USER_MODE;
extern bit 	B_DDCCINewControlVal; //Required only for DDCCI - To make DDCCI MCCS 2.0 Compliant - 14June04
//***************************************************************
// FUNCTION     :   gm_InitNVRAM
// USAGE        :   Initialize internal ROM NVRAM routines.
// DESCRIPTION  :
// INPUT        :   None
// OUTPUT       :
// USED_REGS    :   None
//***************************************************************
void InitNVRAM(void)
{
#if NVRAM_32KBIT
	// use 32kbit NVRAM drivers (see nvram\nvram32k.c)
	gm_InitNVRAMLong( gmc_RomDirectory, &gmv_Size_RomDirectory,
							nvram32k_ReadBlock, nvram32k_WriteBlock );
#else
	// used default NVRAM drivers.
	gm_InitNVRAMLong( gmc_RomDirectory, &gmv_Size_RomDirectory,0,0);
#endif


#if NVRAM_USE_FLASH
	pp_InitNVRAM();
#endif
}


//***************************************************************
// FUNCTION     :   ListNvramMappingAddress
// USAGE        :   To list nvram directory
// DESCRIPTION  :
// INPUT        :   None
// OUTPUT       :   None
// GLOBALS      :
// USED_REGS    :   None
//***************************************************************
// if DEBUG_MSG is not set, then ignore function.
#if	DEBUG_MSG
void ListNvramMappingDirectory(void)
{
	msgx("ListNvramMappingDirectory as follow:", 0);

	 #ifdef	NVRAM_BLOCK_ModeIndependentUserPreferences_WB_Used
	msgx("ModeIndependentUserPreferencesStart = 0x%x", ModeIndependentUserPreferencesStart);
    #endif


	#ifdef	ModeDependent_Used
	msgx("PresetModeLookUpEntryStart = 0x%x",    PresetModeLookUpEntryStart);
	msgx("ModeDependentDescrTypeStart = 0x%x",    ModeDependentDescrTypeStart);
	msgx("PresetModeDependentEntryStart = 0x%x",    PresetModeDependentEntryStart);
	msgx("UserModeLookUpEntryStart = 0x%x",    UserModeLookUpEntryStart);
	msgx("UserModeDependentEntryStart = 0x%x",    UserModeDependentEntryStart);
	#endif
    
	#ifdef	NVRAM_BLOCK_ColorTemp_WB_Used
	msgx("ColorTempStart = 0x%x",    ColorTempStart);
    #endif

    #ifdef NVRAM_BLOCK_FactoryDependentEntry_WB_Used
 	msgx("FactoryDependentEntryStart = 0x%x",    FactoryDependentEntryStart);
    #endif

	#ifdef	NVRAM_BLOCK_HDCPData_WB_Used
	msgx("HDCPDataStart = 0x%x",    HDCPDataStart);
    #endif

    #ifdef	NVRAM_BLOCK_SystemInfo_WB_Used
	msgx("SystemInfoStart = 0x%x",    SystemInfoStart);
    #endif

    #ifdef	NVRAM_BLOCK_IA_AutoADCCalibraion_WB_Used
	msgx("IA_AutoADCCalibraionStart = 0x%x",    IA_AutoADCCalibraionStart);
    #endif

    #ifdef	NVRAM_BLOCK_IntegrityCheck_WB_Used
	msgx("IntegrityCheckStart = 0x%x",    IntegrityCheckStart);
    #endif

}
#endif	// DEBUG_MSG

//***************************************************************
// FUNCTION     :   ReadModeIndependentSettings
// USAGE        :   Read mode independent user prefered settings
// DESCRIPTION  :
// INPUT        :   None
// OUTPUT       :   None
// GLOBALS      :   ModeIndependentUserPreferences
// USED_REGS    :   None
//***************************************************************
#ifdef	NVRAM_BLOCK_ModeIndependentUserPreferences_WB_Used
void ReadModeIndependentSettings(void)
{
	gm_ReadNVRAMBlock(ModeIndependentUserPreferences_ID, 0, (BYTE *)&ModeIndependentUserPreferences, 0, sizeof(ModeIndependentUserPreferences));
	msg("Rd ModeIndependent from NVRAM", 0);
}
#endif

//***************************************************************
// FUNCTION     :   SaveModeIndependentSettings
// USAGE        :   Save mode independent user preferred
//                  settings to NVRam
// DESCRIPTION  :
// INPUT        :   None
// OUTPUT       :   None
// GLOBALS      :   ModeIndependentUserPreferences
// USED_REGS    :   None
//***************************************************************
void  SaveModeIndependentSettings(void)
{
#ifdef	NVRAM_BLOCK_ModeIndependentUserPreferences_WB_Used
	gm_WriteNVRAMBlock(ModeIndependentUserPreferences_ID, 0, (BYTE *)&ModeIndependentUserPreferences, 0, sizeof(ModeIndependentUserPreferences));
  	B_DDCCINewControlVal = 1; //Required only for DDCCI - To make DDCCI MCCS 2.0 Compliant - 14June04
	msg("Save ModeIndependent to NVRAM", 0);
#endif
}

//***************************************************************
// FUNCTION     :   SaveModeIndependentSettings
// USAGE        :   Save mode independent user preferred
//                  settings to NVRam
// DESCRIPTION  :
// INPUT        :   BYTE B_IsCheckPassed -- is integrity check passed
// OUTPUT       :   None
// GLOBALS      :   ModeIndependentUserPreferences
// USED_REGS    :   None
//***************************************************************
#ifdef	NVRAM_BLOCK_ModeIndependentUserPreferences_WB_Used
void InitModeIndependentSettings(BYTE B_IsCheckPassed)
{
	BYTE B_ReadStatus = gmd_FALSE;

#if	DEBUG_MSG && DEBUG_NVRAM
	if(!B_IsCheckPassed)
		msg("Init ModeIndependent from NVRAM", 0);
#endif

	B_ReadStatus = (gm_ReadNVRAMBlock(ModeIndependentUserPreferences_ID, 0, (BYTE *) &ModeIndependentUserPreferences, 0, sizeof(ModeIndependentUserPreferences)) == gmd_OK);

	if(!B_IsCheckPassed || !B_ReadStatus)
	{
		msg("Save dflt ModeIndependent to NVRAM", 0);

		ModeIndependentUserPreferences = FactoryDefaultInROM;
		msgx("UserPrefRedColor = %d", UserPrefRedColor);
   	msgx("UserPrefGreenColor = %d", UserPrefGreenColor);
	   msgx("UserPrefBlueColor = %d", UserPrefBlueColor);

		#ifdef Action_FactoryReset_WB_Used
		InitModeDependentDescr(); // if integrity bad, reset modedependent entries.
		InitModeDependentLookUp();

		InitFactoryDependentSettings();
		ResetFactoryDependentSettings();
		#endif
		SaveModeIndependentSettings();
	}
}
#endif

//***************************************************************
// FUNCTION     :   InitializePresetModeFlag
// USAGE        :   to initialize preset Mode Flag
//
// DESCRIPTION  :
// INPUT        :
// OUTPUT       :   None
// GLOBALS      :
// USED_REGS    :   None
//Note: DO NOT combined this function with InitModeDependentDescr()
//which does initialization for USER_MODE only
//***************************************************************
#if	DEBUG_MSG && defined(ModeDependent_Used)
void InitializePresetModeFlag(void)
{
	ModeDependentDescrTypeUserPrefType Desk;

	msg("Init PresetMode flag", 0);

	gm_ReadNVRAMBlock(ModeDependentDescrType_ID, 0, (BYTE *) &Desk, 0, sizeof(ModeDependentDescrTypeUserPrefType));
	Desk.PresetModeFlag.ModeFlag = 0;
	gm_WriteNVRAMBlock(ModeDependentDescrType_ID, 0, (BYTE *) &Desk, 0, sizeof(ModeDependentDescrTypeUserPrefType));
}
#endif

//***************************************************************
// FUNCTION     :   InitializePresetModes
// USAGE        :   to initialize preset Mode
//                  to entry in NVRAM
// DESCRIPTION  :
// INPUT        :   BYTE B_IsCheckPassed -- is integrity check passed
// OUTPUT       :   None
// GLOBALS      :   ModeDependentUserPreferences
// USED_REGS    :   None
//***************************************************************
#ifdef	ModeDependent_Used 
void InitializePresetModes(BYTE B_IsCheckPassed)
{
	gmt_RET_STAT  ret;
	ModeDependentDescrTypeUserPrefType Desk;
	ModeLookUpEntryTypeUserPrefType savedIFM;
	StandardModeType ROM * LocalTablePtr;
	BYTE i;

	msg("Init PresetMode", 0);

	if(B_IsCheckPassed)
		ret = gm_ReadNVRAMBlock(ModeDependentDescrType_ID, 0, (BYTE *) &Desk, 0, sizeof(ModeDependentDescrTypeUserPrefType));
	else
		ret = gmd_FAIL;     //NOTE: gmd_OK, gmd_FALSE are 0.

	msgx("Desk.PresetModeFlag.ModeFlag = 0x%x", (WORD)(Desk.PresetModeFlag.ModeFlag) );

	if((Desk.PresetModeFlag.ModeFlag & InitializedBitMask) && (ret == gmd_OK))
		return;
	else
	{
		msg("Dflt form PresetModes to NVRAM", 0);
		Desk.PresetModeFlag.ModeFlag |= InitializedBitMask;
	}

	//to initialize preset mode
	//The first MaxNumOfPresetModes in InputPortArray[IP_RGB].StdModeArray[] array are used for preset modes.
	//only initialize HFreq, VFreq, VTotal; SyncPolarity saved during run time.
#if NVRAM_USE_FLASH && FAST_FLASH_PAGE_UPDATE
	{
		BYTE B_Buffer[FLASH_PAGE_SIZE];
		WORD W_Length, W_HeaderSize, W_Addr;
      BYTE B_entryNumPerTime, B_StartIndex;

		W_HeaderSize = sizeof(block_hdr_type);


      //look up entry
      _fmemset(&B_Buffer, 0xff, FLASH_PAGE_SIZE);
   	W_Length = sizeof(ModeLookUpEntryTypeUserPrefType);
      B_entryNumPerTime = FLASH_PAGE_SIZE / (W_HeaderSize+W_Length);
      W_Addr = W_HeaderSize;
      B_StartIndex = 0;
      for(i=0; i<MaxNumOfPresetModeLookUpEntry; i++)
      {
         LocalTablePtr = &StandardModeTable[InputPortArray[IP_RGB].StdModeArray[i]];
         savedIFM.Tags.HFreq =  LocalTablePtr->StdHFreq;    //in 100Hz
         savedIFM.Tags.VTotal =  LocalTablePtr->StdVTotal;
         savedIFM.Tags.VFreq =  (WORD)(((DWORD)(savedIFM.Tags.HFreq*1000l))/((DWORD)LocalTablePtr->StdVTotal));    //in 1/10 Hz
         savedIFM.SyncPolarity = 0;  //initialized to 0


	      _fmemcpy(&B_Buffer[W_Addr], (BYTE *)&savedIFM, W_Length);
         W_Addr += (W_Length + W_HeaderSize);

         //update data to flash
         if( (!((i+1)%B_entryNumPerTime)) || (i==MaxNumOfPresetModeLookUpEntry-1) )
         {
         	gm_ClearNVRAMBlock(PresetModeLookUpEntry_ID, B_StartIndex, (i%B_entryNumPerTime)+1, B_Buffer, W_Length);
		      W_Addr = W_HeaderSize;
            B_StartIndex += B_entryNumPerTime;
         }
      }

      //user preference entry
      _fmemset(&B_Buffer, 0xff, FLASH_PAGE_SIZE);
   	W_Length = sizeof(ModeDependentUserPreferences);
      B_entryNumPerTime = FLASH_PAGE_SIZE / (W_HeaderSize+W_Length);
      W_Addr = W_HeaderSize;
      B_StartIndex = 0;
      for(i=0; i<MaxNumOfPresetModeLookUpEntry; i++)
      {
         LocalTablePtr = &StandardModeTable[InputPortArray[IP_RGB].StdModeArray[i]];
         UserPrefHTotal = LocalTablePtr->StdHTotal;
         if(LocalTablePtr->ModeType & gmd_NEG_HSYNC)
            UserPrefHStart = (UserPrefHTotal / 2) - LocalTablePtr->StdHBackPorch;
         else
            UserPrefHStart = (UserPrefHTotal / 2) - LocalTablePtr->StdHSyncWidth - LocalTablePtr->StdHBackPorch;

         if(LocalTablePtr->ModeType & gmd_NEG_VSYNC)
            UserPrefVStart = LocalTablePtr->StdVBackPorch;
         else
            UserPrefVStart = LocalTablePtr->StdVSyncWidth + LocalTablePtr->StdVBackPorch;

         UserPrefHSyncPhase = 20;  //initialize to a value before adjustment
     #ifdef PHOENIX_U         
         UserPrefHTotalBestValue = LocalTablePtr->StdHTotal;  //Steven: 1121 : to fix 1024x768x75hz mode issue
     #endif

	      _fmemcpy(&B_Buffer[W_Addr], (BYTE *)&ModeDependentUserPreferences, W_Length);
         W_Addr += (W_Length + W_HeaderSize);

         //update data to flash
         if( (!((i+1)%B_entryNumPerTime)) || (i==MaxNumOfPresetModeLookUpEntry-1))
         {
         	gm_ClearNVRAMBlock(PresetModeDependentEntry_ID, B_StartIndex, (i%B_entryNumPerTime)+1, B_Buffer, W_Length);
		      W_Addr = W_HeaderSize;
            B_StartIndex += B_entryNumPerTime;
         }
		}
   }

#else
	for(i=0; i<MaxNumOfPresetModeLookUpEntry; i++)
	{
		//look up entry
		LocalTablePtr = &StandardModeTable[InputPortArray[IP_RGB].StdModeArray[i]];
		savedIFM.Tags.HFreq =  LocalTablePtr->StdHFreq;    //in 100Hz
		savedIFM.Tags.VTotal =  LocalTablePtr->StdVTotal;
		savedIFM.Tags.VFreq =  (WORD)(((DWORD)(savedIFM.Tags.HFreq*1000l))/((DWORD)LocalTablePtr->StdVTotal));    //in 1/10 Hz
		savedIFM.SyncPolarity = 0;  //initialized to 0
		gm_WriteNVRAMBlock(PresetModeLookUpEntry_ID, i, (BYTE *) &savedIFM, 0, sizeof(ModeLookUpEntryTypeUserPrefType));

		//user preference entry
		UserPrefHTotal = LocalTablePtr->StdHTotal;
		if(LocalTablePtr->ModeType & gmd_NEG_HSYNC)
			UserPrefHStart = (UserPrefHTotal / 2) - LocalTablePtr->StdHBackPorch;
		else
			UserPrefHStart = (UserPrefHTotal / 2) - LocalTablePtr->StdHSyncWidth - LocalTablePtr->StdHBackPorch;

		if(LocalTablePtr->ModeType & gmd_NEG_VSYNC)
			UserPrefVStart = LocalTablePtr->StdVBackPorch;
		else
			UserPrefVStart = LocalTablePtr->StdVSyncWidth + LocalTablePtr->StdVBackPorch;

		UserPrefHSyncPhase = 20;  //initialize to a value before adjustment
		gm_WriteNVRAMBlock(PresetModeDependentEntry_ID, i, (BYTE *) &ModeDependentUserPreferences, 0, sizeof(ModeDependentUserPreferences));
	}
#endif

	gm_WriteNVRAMBlock(ModeDependentDescrType_ID, 0, (BYTE *) &Desk, 0, sizeof(ModeDependentDescrTypeUserPrefType));
}
#endif

//***************************************************************
// FUNCTION     :   to read Preset Mode flag
// USAGE        :
//
// DESCRIPTION  :

⌨️ 快捷键说明

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