📄 power.c
字号:
/* $Workfile: power.c $ $Revision: 1.76 $ $Date: Aug 23 2006 23:04:06 $*///******************************************************************//// Copyright (C) 2003. 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////================================================================//// MODULE: power.c////******************************************************************#include ".\inc\all.h"#include "system\mcu186.h"//******************************************************************// Local Equates and Enums//******************************************************************#define DEBUG_PH 0#if DEBUG_PH && DEBUG_MSG #define msg(a,b) gm_Print((const char far *)a,b)#else #define msg(a,b)#endif#define PWRDWN_OSDACK_TIMEOUT 100 // * 10ms = 1 Sec#if defined(PHOENIX_U) && ((defined(EV_BD_B_57XX) && ( BOARD == EV_BD_B_57XX )) || (defined(RD3_57XX) && ( BOARD == RD3_57XX )))#define PWRDWN_NOTICE_WAIT 900 // * 10ms = Five Seconds#else#define PWRDWN_NOTICE_WAIT 500 // * 10ms = Five Seconds#endif// Total Powerdown wait timeout = 6 seconds#define POWER_DOWN_WAIT_TIMEOUT PWRDWN_NOTICE_WAIT+PWRDWN_OSDACK_TIMEOUTtypedef enum PwrHandlerStatesEnum{ PWR_KEY_OFF_STATE = 1, PWR_ON_STATE, PWR_STANDBY_STATE, PWR_SUSPEND_STATE, PWR_DOWN_WAIT_STATE, PWR_DOWN_STATE, PWR_INVALID_STATE = 0xFF} PwrHandlerStates;//******************************************************************// LOCAL variables//******************************************************************static BYTE Msg, OsdNoticed = gmd_FALSE;static BYTE PowerHandlerState = PWR_ON_STATE;/*PWR_KEY_OFF_STATE; *///******************************************************************// LOCAL function prototypes//******************************************************************static void __near PowerUp(void);static void __near PowerDown(void);static PwrHandlerStates __near DetNewPwrState( BYTE SyncState );//******************************************************************//******************************************************************// External interfaces//******************************************************************extern BYTE XROM_StateMachine_Settle_Count;extern BYTE InputCableDetect(void); // 1124extern BOOL FirstPowerUp;#if !defined(TUCSON) && HDCP_ENABLE_4TH extern void Hdcp_DVIPowerON(void);extern void Hdcp_DVIPowerOFF(void);#endif// Stub Function.BYTE usrsync = gmd_HONVON;extern BYTE SoftPowerReInitforTestPattern;BYTE gm_GetSyncStateStub( void ) { return usrsync; }#define gm_GetSyncStateMain gm_GetSyncStateStub//*****************************************************************// FUNCTION : SleepMode// DESCRIPTION : Based on input parameter, sets up ADC/DVI/IFM for// working in sleep mode. For sleep mode, ADC is off but// synctip is enabled. DVI is in standby mode, and IFM// is on.// INPUT : TRUE/FALSE// OUTPUT : None// GLOBALS : None// USED_REGS : None directly//******************************************************************void SleepMode(BYTE enable){ if(enable) { #ifdef VPORT_CTRL gm_PowerDown(gmd_VPORT_BLK); #endif // Powering down DVI_BLK will actually put DVI into STANDBY. gm_PowerDown(gmd_DVI_BLK); #if !defined(TUCSON) && HDCP_ENABLE_4TH Hdcp_DVIPowerOFF(); #endif // synctip enabled automatically enabled when ADC powered down gm_PowerDown(gmd_ADC_BLK); gm_PowerDown(gmd_SDDS_BLK); gm_PowerDown(gmd_RCLK_BLK); gm_PowerUp(gmd_IFM_BLK); } else { PowerUpDevice(InputPortArray[gmvb_CurrentPortMain].PowerDev); }}//******************************************************************// FUNCTION : PowerUpDevice// USAGE : Power up device and associated input blocks.// DESCRIPTION : Function powers up device and any associated// input blocks like SDDS or LCLK etc.//// INPUT : PowerControlDeviceType, device to power up.// OUTPUT : None// GLOBALS : None// USED_REGS : None directly//******************************************************************void PowerUpDevice(PowerControlDeviceType dev){#ifdef PHOENIX_U // Add for DVI DPMS issue if (SystemFlags.DVI_Sleep) { gm_SetRegBitsByte(BYPASS, POWER_DOWN); gm_ClearAndSetBitsByte(DDS_CONTROL, (SDDS_ENABLE | DDDS_ENABLE), ( FORCE_SDDS_OPLOOP | FORCE_DDDS_OPLOOP)); gm_WriteRegByte(RCLK_CONFIG, RCLK_POWER_DN | RCLK_RESET ); SystemFlags.DVI_Sleep = gmd_FALSE; }#endif gm_PowerUp(gmd_RCLK_BLK); gm_PowerUp(gmd_IFM_BLK); gm_PowerUp(gmd_IP_BLK); SystemFlags.MH_SleepMode = gmd_FALSE; switch(dev) { case gmd_PCD_NONE : return; //no device top power up. case gmd_PCD_RGB : msg("PowerUpDevice: RGB",0); gm_PowerUp( gmd_ADC_BLK); gm_PowerUp( gmd_SDDS_BLK ); break; case gmd_PCD_DVI : msg("PowerUpDevice: DVI",0); #if !defined(TUCSON) && HDCP_ENABLE_4TH Hdcp_DVIPowerON(); #endif gm_PowerUp(gmd_DVI_BLK); gm_PowerDown( gmd_SDDS_BLK ); break; case gmd_PCD_VIDEO : msg("PowerUpDevice: Video",0); #ifdef VPORT_CTRL gm_PowerUp(gmd_VPORT_BLK); #endif gm_PowerDown( gmd_SDDS_BLK ); // initialize video decoder. #if USE_GSEL_DRVR_MODEL gm_CallDriver(DEV_VIDEO_DECODER, gmd_VID_PWR_UP, NULL_PTR, NULL_PTR); gm_CallDriver(DEV_VIDEO_DECODER, gmd_VID_SET_MODE, VDD_MODE_INIT, NULL_PTR); // gm_CallDriver(DEV_VIDEO_DECODER, gmd_VID_SET_OUTPUT_FORMAT, VDD_OUTTYPE_656, NULL_PTR); // gm_CallDriver(DEV_VIDEO_DECODER, gmd_VID_SET_MODE, VDD_MODE_NTSC, NULL_PTR); #endif // USE_GSEL_DRVR_MODEL break; default : msg("PowerUpDevice: Unknown device!! %x",dev); return; }// switch dev}//******************************************************************// FUNCTION : PowerDownDevice// USAGE : Power down device and associated input blocks.// DESCRIPTION : Function powers down device and any associated// input blocks like SDDS or LCLK etc.//// INPUT : PowerControlDeviceType, device to power down.// OUTPUT : None// GLOBALS : None// USED_REGS : None directly//******************************************************************void PowerDownDevice(PowerControlDeviceType dev){ gm_PowerDown( gmd_IFM_BLK ); gm_PowerDown( gmd_IP_BLK ); switch(dev) { case gmd_PCD_NONE : return; //no device top power down. case gmd_PCD_RGB : msg("PowerDownDevice: RGB",0); gm_PowerDown(gmd_ADC_BLK); gm_PowerDown( gmd_SDDS_BLK ); break; case gmd_PCD_DVI : msg("PowerDownDevice: DVI",0); #if !defined(TUCSON) && HDCP_ENABLE_4TH Hdcp_DVIPowerOFF(); #endif gm_PowerDown(gmd_DVI_BLK); break; case gmd_PCD_VIDEO : msg("PowerDownDevice: Video",0);#ifdef VPORT_CTRL gm_PowerDown(gmd_VPORT_BLK);#endif#if USE_GSEL_DRVR_MODEL gm_CallDriver(DEV_VIDEO_DECODER, gmd_VID_PWR_DOWN, NULL_PTR, NULL_PTR);#endif break; default : msg("PowerDownDevice: Unknown device!! %x",dev); return; }// switch dev}//******************************************************************// FUNCTION : PowerUp// USAGE : Restore system from low power state.// DESCRIPTION : This function brings up the system from low// mode waits for 200 msec and signalizes that// system is active.//// INPUT : None// OUTPUT : None// GLOBALS : PowerUpFlag// USED_REGS : None directly//******************************************************************static void __near PowerUp(void){ if (PowerUpFlag.PowerOnState == gmd_TRUE ) { msg("Already Power is ON",0); return; }#ifdef PHOENIX_U // Add for DVI DPMS issue if (SystemFlags.DVI_Sleep) { gm_SetRegBitsByte(BYPASS, POWER_DOWN); gm_ClearAndSetBitsByte(DDS_CONTROL, (SDDS_ENABLE | DDDS_ENABLE), ( FORCE_SDDS_OPLOOP | FORCE_DDDS_OPLOOP)); gm_WriteRegByte(RCLK_CONFIG, RCLK_POWER_DN | RCLK_RESET ); SystemFlags.DVI_Sleep = gmd_FALSE; }#endif msg("PowerUp",0);#if DEBUG_PH && DEBUG_MSG if ( gmc_SerialBaudRate == 115200UL ) { msg("Restoring baud rate to 115200", 0); } else { msg("Restoring baud rate to %d", (WORD)(gmc_SerialBaudRate)); }#endif#if !defined(TUCSON) && HDCP_ENABLE_4TH Hdcp_DVIPowerON();#endif // power up GM chip gm_PowerUp(gmd_ALL_BLKS); // Restore gm chip from low power state. #ifdef PHOENIX_U //gm_PowerUpPanel(); // Test 1112#else gm_PowerUpPanel();#endif // Reinitialize timers, since CPU is running at full speed. gm_TimerInit( gmc_CPU_CLK_KHZ * 1000UL, &UserTimers[0], Num10mstimers, Num100mstimers); // Reinitialize serial port for new CPU clock frequency and higher baud rate. gm_UartInit(gmc_CPU_CLK_KHZ * 1000UL, gmc_SerialBaudRate); // Reinitialize IR with new CPU frequency. #ifdef PORT_IR_USED IRInit(gmc_CPU_CLK_KHZ * 1000UL); #endif#if USE_AUDIO && USE_GSEL_DRVR_MODEL gm_CallDriver(DEV_AUDIO_DECODER, gmd_AUD_SET_STANDBY_ON, AUDIO_STANDBY_OFF, NULL_PTR);#endif // set flag for power ON PowerUpFlag.PowerOnState = gmd_TRUE; // Run keypad scanning from ISR StartGetKeyISR(); // Speed up the detection time and reduce more power consumption. gm_Delay1ms(10);}//******************************************************************// FUNCTION : PowerDown// USAGE : Put system in low power state.// DESCRIPTION : This function puts the system in low power mode// waits for 200 msec and signalizes that system// is in low power mode.//// INPUT : None// OUTPUT : None// GLOBALS : PowerUpFlag// USED_REGS : None directly//******************************************************************static void __near PowerDown(void){ BYTE B_TclkDivisor = 0;#ifdef PHOENIX_U // Add for DVI DPMS issue if ((PowerUpFlag.PowerOnState == gmd_FALSE) && (SystemFlags.PowerSaving != gmd_TRUE)) { msg("Already Power is DOWN",0); return; } else if (SystemFlags.DVI_Sleep) { SystemFlags.DVI_Sleep = gmd_FALSE; }#else if (PowerUpFlag.PowerOnState == gmd_FALSE) { msg("Already Power is DOWN",0); return; }#endif //Osd_Hide(); msg("Power Down",0);#if USE_AUDIO && USE_GSEL_DRVR_MODEL gm_CallDriver(DEV_AUDIO_DECODER, gmd_AUD_SET_STANDBY_ON, AUDIO_STANDBY_ON, NULL_PTR);#endif // Compute the TCLK divisor based on the OCM frequency in low power. if(gmc_OCM_CLK_POWERDOWN != 0) { B_TclkDivisor = (BYTE)(((gmc_T_CLK_KHZ * 10) / gmc_OCM_CLK_POWERDOWN) + 5) / 10; }#if DEBUG_PH && DEBUG_MSG if ( B_TclkDivisor >= 1 ) { #if SBAUD_IN_LOW_POWER == 115200UL msg("Changing baud rate to 115200", 0); #else msg("Changing baud rate to %d", (WORD)SBAUD_IN_LOW_POWER); #endif }#endif #if !defined(TUCSON) && HDCP_ENABLE_4TH Hdcp_DVIPowerOFF(); #endif // power down GM chip gm_PowerDown(gmd_ALL_BLKS); // Put gm52xx in low power state. // Reinitialize the timers with the lower clock frequency. If a TCLK // divisor is programmed, adjust the CPU frequency accordingly. Also, // reinitialize the serial and IR drivers with new CPU frequency. if ( B_TclkDivisor >= 1 ) { gm_TimerInit( (gmc_T_CLK_KHZ * 1000UL / (DWORD)(B_TclkDivisor)), &UserTimers[0], Num10mstimers, Num100mstimers ); gm_UartInit( (gmc_T_CLK_KHZ * 1000UL / (DWORD)(B_TclkDivisor)), SBAUD_IN_LOW_POWER ); #ifdef PORT_IR_USED IRInit(gmc_T_CLK_KHZ * 1000UL / (DWORD)(B_TclkDivisor)); #endif } else { gm_TimerInit( gmc_T_CLK_KHZ * 1000UL, &UserTimers[0], Num10mstimers, Num100mstimers); gm_UartInit(gmc_T_CLK_KHZ * 1000UL, gmc_SerialBaudRate);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -