📄 drvpower.c
字号:
return FALSE;
}
//-------------------------------------------------------------------------------------------------
/// Power wakeup : Keypad Wakeup
/// @return None
//-------------------------------------------------------------------------------------------------
// see msKeypad.c: MDrv_Power_CheckPowerOnKeyPad
//-------------------------------------------------------------------------------------------------
/// Power wakeup : RTC Wakeup
/// @return None
//-------------------------------------------------------------------------------------------------
void MDrv_Power_RTCCallback()
{
// MDrv_Power_SetMode(PM_MODE_ON);
//gRTCWakeup = TRUE;
//MDrv_RTC_ClearInterrupt();
}
//-------------------------------------------------------------------------------------------------
/// Reset and power up : used in MDrvPowerStandby mode
/// @param
/// @return
///
//-------------------------------------------------------------------------------------------------
void MDrv_Power_ResetAndPowerUp()
{
DRVPOWER_DBG(printf("Reset and power up now!\r\n"));
// Change power management status
XBYTE[PM_OFF_FLAG] = (XBYTE[PM_OFF_FLAG] & ~PM_MODE_MASK) | PM_MODE_ON_EXEC;
XBYTE[PM_OFF_FLAG] = XBYTE[PM_OFF_FLAG] & ~PM_P3_RESET_FLAG;
// disable interrupt.
MDrv_Sys_SetInterrupt( GLOBAL, DISABLE );
MDrv_Sys_RunCodeInSPI();
MDrv_Sys_Reboot();
}
// S2 do not need MCU reset to change code fetch path
// please call msAPI_Power_PowerDown_EXEC() directly
#if 0
//-------------------------------------------------------------------------------------------------
/// Reset and power down : used in MDrvPowerStandby mode
/// @param
/// @return
///
//-------------------------------------------------------------------------------------------------
void MDrv_Power_ResetAndPowerDown()
{
DRVPOWER_DBG(printf("Reset and power down now!\r\n"));
// Change power management status
XBYTE[PM_OFF_FLAG] = (XBYTE[PM_OFF_FLAG] & ~PM_MODE_MASK) | PM_MODE_OFF_EXEC;
XBYTE[PM_OFF_FLAG] = (XBYTE[PM_OFF_FLAG] | PM_P3_RESET_FLAG);
// disable interrupt.
MDrv_Sys_SetInterrupt( GLOBAL, DISABLE );
// Disable XDATA Mapping
XBYTE[0x2BC4] &= ~0x04;
MDrv_Sys_RunCodeInSPI();
XBYTE[VD_MCU_RESET] |= 0x01;
// Switch MCU clock to XTAL
XBYTE[0x1E22] = 0x00;
MDrv_Sys_Reboot();
// Note: The real power down sequence will be done in MDrv_Power_ExecutePowerDown().
}
#endif
//-------------------------------------------------------------------------------------------------
/// Execute power on initialization.
/// @param
/// @return TRUE- Success.
/// FALSE - Failure.
//-------------------------------------------------------------------------------------------------
BOOLEAN MDrv_Power_ExecutePowerUp()
{
// Change power management status
XBYTE[PM_OFF_FLAG] = (XBYTE[PM_OFF_FLAG] & ~PM_MODE_MASK) | PM_MODE_ON;
XBYTE[PM_OFF_FLAG] = XBYTE[PM_OFF_FLAG] & ~PM_P3_RESET_FLAG;
#if ENABLE_POWER_SAVING_DPMS
XBYTE[PM_OFF_FLAG] = XBYTE[PM_OFF_FLAG] & ~VGA_POWERSAVING;
#endif
return TRUE;
}
//-------------------------------------------------------------------------------------------------
/// Power down procedure: after reboot, the main loop will execute power down procedure, and enter standby mode then
/// @param
/// @return
///
//-------------------------------------------------------------------------------------------------
void MDrv_Power_ExecutePowerDown()
{
// disable interrupt.
MDrv_Sys_SetInterrupt( GLOBAL, DISABLE );
if( g_u32WakeupSystemTime < gSystemTimeCount )
{
g_u8WakeUpOnOffFlag = 0;
g_u32WakeupSystemTime = 0xFFFFFF;
}
// Switch MCU clock to XTAL
XBYTE[0x1E22] = 0x00;
msIR_Initialize(MST_XTAL_CLOCK_MHZ);
// Setting SPI clock
XBYTE[0x3c4c]=(XBYTE[0x3c4c] & 0xe3);
// Reset VDMCU
XBYTE[VD_MCU_RESET] |= 0x01;
MDrv_Sys_RunCodeInSPI();
// Power down peripheral
Peripheral_Device_Reset_OFF();
Tuner_OFF();
Demodulator_OFF();
LED_RED_OFF();
LED_GREEN_OFF();
Power_Off();
// Power down SAR
XBYTE[REG_SAR_CTRL0] = 0x20;
XBYTE[REG_SAR_CTRL1] = 0x00;
XBYTE[REG_SAR_CTRL2] = 0x05;
XBYTE[REG_SAR_CTRL3] = 0x00;
XBYTE[REG_SAR_CTRL20] = 0xFF;
XBYTE[REG_SAR_CTRL21] = 0x80;
// Power down Scaler
MDrv_Scaler_PowerOff();
// power down all ADC
XBYTE[BK_ADC_ATOP_04_L] = 0xFF;
XBYTE[BK_ADC_ATOP_04_H] = 0xFF;
#if ENABLE_POWER_SAVING_DPMS
if(XBYTE[PM_OFF_FLAG] & VGA_POWERSAVING)
{
XBYTE[BK_ADC_ATOP_05_L] = 0x1F;
}
else
{
XBYTE[BK_ADC_ATOP_05_L] = 0xFF;
}
#else
XBYTE[BK_ADC_ATOP_05_L] = 0xFF;
#endif
// power down fast blanking ADC
XBYTE[0x2580] |= 0x40;
// power down DVI
XBYTE[0x25C0] = 0xFF;
XBYTE[0x25C1] = 0xFF;
// Power down OTG
XBYTE[0x2440] |=0x10;
XBYTE[0x2434] &= 0xBF;
// power down DAC
XBYTE[0x3209] |= 0x02;
// Disable DDR PAD
XBYTE[0x1202] &= 0x3F;
XBYTE[0x1203] |= 0xF0;
// Power down DACA, DACR, DACG, DACB
XBYTE[0x3206] |= 0x0F;
// Power down VCOM
XBYTE[0x3205] |= 0x02;
// Disable HW clock
MDrv_Power_Set_HwClock(E_HWCLK_GE_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_GOP0_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_GOP1_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_GOPD_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_MVD_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_MVDBOOT_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_M4V_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_DC0_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_MADSTC_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_TS0_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_TS2_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_TSOUT_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_FCLK_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_FMCLK_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_ODCLK_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_IDCLK2_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_FICLKF2_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_VEIN_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_VE_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_VEDAC_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_VD_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_VDMCU_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_VD200_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_DHCSBM_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_DHCDDR_GATING, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_DHCSYNTH_GATING, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_DHCMCU_GATING, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_DHCLIVE_GATING, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_USB_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_FCIE_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_PCMCIA_ONOFF, POWER_DOWN);
// Disable XDATA Mapping
XBYTE[0x2BC4] &= ~0x04;
/* seven 070911_00
// Power down PCMCIA
XBYTE[0x1E0E] = 0xFF;
XBYTE[0x1E0F] = 0xFF;
XBYTE[0x1E10] = 0xFF;
XBYTE[0x1E11] = 0xFF;
XBYTE[0x1E12] = 0xFF;
XBYTE[0x1E13] = 0xFF;
XBYTE[0x1E14] = 0xFF;
XBYTE[0x1E15] = 0xFF;
XBYTE[0x1E16] = 0xFF;
XBYTE[0x1E17] = 0xFF;
XBYTE[0x1E18] = 0xFF;
XBYTE[0x1E19] = 0xFF;
XBYTE[0x1EE0] |= 0x08;
XBYTE[0x1E96] = 0xFF;
end */
// power down LPLL
XBYTE[0x3106] |= 0x20;
// Power down DDRPLL
XBYTE[0x1225] |= 0x02;
// Power down MIU & DDR
// seven 070911_00
MDrv_Power_Set_HwClock(E_HWCLK_MIU_ONOFF, POWER_DOWN);
MDrv_Power_Set_HwClock(E_HWCLK_TCK_ONOFF, POWER_DOWN);
// XBYTE[BK_CHIPTOP_12_H] |= 0x11;
// end
// Power down MPLL
XBYTE[BK_ADC_ATOP_08_L] = 0x10;
// Change power management status
XBYTE[PM_OFF_FLAG] = (XBYTE[PM_OFF_FLAG] & ~PM_MODE_MASK) | PM_MODE_OFF;
XBYTE[PM_OFF_FLAG] = XBYTE[PM_OFF_FLAG] & ~PM_P3_RESET_FLAG;
}
//-------------------------------------------------------------------------------------------------
/// Power standby: After execution MDrvPowerExecutePowerDown, the MDrvPowerStandby will be called
/// @param u32StandbyS \b IN: Specify the standby time in seconds.
/// If u32StandbyS is equal to zero, will enter standby mode forever.
/// @return
///
//-------------------------------------------------------------------------------------------------
U8 data KeypadCount, KeypadSamplePeriod;
void MDrv_Power_Standby()
{
#ifdef USE_TIMER0_FOR_SYSTEM_TIME
MDrv_XC51_Timer2_Init();
#else
MDrv_Write4Byte(REG_TIMER1_MAX, MST_XTAL_CLOCK_HZ);
MDrv_WriteByte(REG_TIMER1_CTRL + 1, 0x03);
MDrv_Sys_SetInterrupt( EX3, ENABLE );
#endif
MDrv_Sys_SetInterrupt( GLOBAL, ENABLE );
KeypadCount = 0;
KeypadSamplePeriod = 0;
#if( POWER_KEY_PAD_BY_INTERRUPT )
MDrv_Sys_SetInterrupt( EX0, ENABLE );
MDrv_Sys_SetInterrupt( EX0_INT_IN, ENABLE );
u8PwrKeypadIntFlag = FALSE;
#endif
while(1)
{
#if ( WATCH_DOG == ENABLE )
XBYTE[PIU_MISC_REG_BASE+0x66] |= 0x02; //reset WDT timer
#endif
// IR Wakeup
if (MDrv_Power_CheckPowerOnKey())
MDrv_Power_ResetAndPowerUp();
#if (IR_MODE_SEL == IR_TYPE_SWDECODE_MODE)
if (MDrv_Power_CheckPowerOnSWIRKey())
MDrv_Power_ResetAndPowerUp();
#endif
// Keypad Wakeup
if (MDrv_Power_CheckPowerOnKeyPad())
MDrv_Power_ResetAndPowerUp();
#if ENABLE_POWER_SAVING_DPMS
if(XBYTE[PM_OFF_FLAG] & VGA_POWERSAVING)
{
MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
if((MDrv_Read2Byte( BK_SC_IP1F2_20_L) & 0x1FFF )>10)
{
if((MDrv_Read2Byte( BK_SC_IP1F2_20_L) & 0x1FFF )!=0x1FFF)
{
if((MDrv_Read2Byte( BK_SC_IP1F2_1F_L) & 0x07FF)>200)
{
if((MDrv_Read2Byte( BK_SC_IP1F2_1F_L) & 0x07FF)!=0x07FF)
{
MDrv_Power_ResetAndPowerUp();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -