/* ********************************************************************************************************* * SYSTEM PWM ENTER STANDBY MODE * * Description: enter standby mode. * * Arguments : none * * Returns : none; ********************************************************************************************************* */ static void standby(void) { /* gating off dram clock */ standby_clk_dramgating(0); /* switch cpu clock to HOSC, and disable pll */ standby_clk_core2hosc(); standby_clk_plldisable(); /* backup voltages */ dcdc2 = standby_get_voltage(POWER_VOL_DCDC2); dcdc3 = standby_get_voltage(POWER_VOL_DCDC3); /* adjust voltage */ standby_set_voltage(POWER_VOL_DCDC3, STANDBY_DCDC3_VOL); standby_set_voltage(POWER_VOL_DCDC2, STANDBY_DCDC2_VOL); /* set clock division cpu:axi:ahb:apb = 2:2:2:1 */ standby_clk_getdiv(&clk_div); tmp_clk_div.axi_div = 0; tmp_clk_div.ahb_div = 0; tmp_clk_div.apb_div = 0; standby_clk_setdiv(&tmp_clk_div); /* swtich apb1 to losc */ standby_clk_apb2losc(); standby_mdelay(10); /* switch cpu to 32k */ standby_clk_core2losc(); #if(ALLOW_DISABLE_HOSC) // disable HOSC, and disable LDO standby_clk_hoscdisable(); standby_clk_ldodisable(); #endif /* cpu enter sleep, wait wakeup by interrupt */ asm("WFI"); #if(ALLOW_DISABLE_HOSC) /* enable LDO, enable HOSC */ standby_clk_ldoenable(); /* delay 1ms for power be stable */ standby_delay(1); standby_clk_hoscenable(); standby_delay(1); #endif /* swtich apb1 to hosc */ standby_clk_apb2hosc(); /* switch clock to hosc */ standby_clk_core2hosc(); /* restore clock division */ standby_clk_setdiv(&clk_div); /* check system wakeup event */ pm_info.standby_para.event = 0; pm_info.standby_para.event |= standby_query_int(INT_SOURCE_EXTNMI)? 0:SUSPEND_WAKEUP_SRC_EXINT; pm_info.standby_para.event |= standby_query_int(INT_SOURCE_USB0)? 0:SUSPEND_WAKEUP_SRC_USB; pm_info.standby_para.event |= standby_query_int(INT_SOURCE_LRADC)? 0:SUSPEND_WAKEUP_SRC_KEY; pm_info.standby_para.event |= standby_query_int(INT_SOURCE_IR0)? 0:SUSPEND_WAKEUP_SRC_IR; pm_info.standby_para.event |= standby_query_int(INT_SOURCE_ALARM)? 0:SUSPEND_WAKEUP_SRC_ALARM; pm_info.standby_para.event |= standby_query_int(INT_SOURCE_TIMER0)? 0:SUSPEND_WAKEUP_SRC_TIMEOFF; /* restore voltage for exit standby */ standby_set_voltage(POWER_VOL_DCDC2, dcdc2); standby_set_voltage(POWER_VOL_DCDC3, dcdc3); standby_mdelay(10); /* enable pll */ standby_clk_pllenable(); standby_mdelay(10); /* switch cpu clock to core pll */ standby_clk_core2pll(); standby_mdelay(10); /* gating on dram clock */ standby_clk_dramgating(1); return; }