📄 nv_functions.c
字号:
/*
$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 + -