FreeCalypso > hg > fc-selenite
diff src/cs/layer1/cfile/l1_pwmgr.c @ 148:c47e2dc10134
l1_pwmgr.c & l1_cust.c: sleep logic changes from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 06 Feb 2019 23:15:04 +0000 |
parents | b6a5e36de839 |
children |
line wrap: on
line diff
--- a/src/cs/layer1/cfile/l1_pwmgr.c Wed Feb 06 23:00:51 2019 +0000 +++ b/src/cs/layer1/cfile/l1_pwmgr.c Wed Feb 06 23:15:04 2019 +0000 @@ -782,7 +782,7 @@ #if (W_A_CALYPSO_PLUS_SPR_19599 == 1) BOOL extended_page_mode_state = 0; //Store state of extended page mode #endif - WORD32 time_from_last_wakeup=0; + WORD32 time_from_last_wakeup, min_time_from_last_wakeup; UWORD32 sleep_mode; #if (OP_BT == 1) @@ -793,8 +793,33 @@ why_big_sleep = BIG_SLEEP_DUE_TO_UNDEFINED; wakeup_type = WAKEUP_FOR_UNDEFINED; + /* + * FreeCalypso change: TI's original code implemented logic to + * suppress both big and deep sleep (i.e., retry on the next frame) + * if less than 7 frames have elapsed since the last wakeup and + * if the previous sleep cycle was CLOCK_STOP. We are changing + * this logic in two ways: the check has been moved up here + * (originally the check code was way down, wasting work on other + * logic if there will be no sleep anyway), and we additionally + * suppress both big and deep sleep (effecting retry on the next + * frame) if the previous sleep cycle was FRAME_STOP and less than + * 5 frames have elapsed since wakeup. The reason for the latter + * addition is that we now allow big sleep while UART and/or SIM + * activity timers are running (suppressing deep sleep), and + * holding off for 5 frames before going into another big sleep + * keeps us from fluttering in and out of big sleep as the external + * host or the SIM is trying to talk to us. + */ time_from_last_wakeup = (sleep_time - last_wakeup + 42432) % 42432; + if (previous_sleep == CLOCK_STOP) + min_time_from_last_wakeup = 7; + else + min_time_from_last_wakeup = 5; + + if (time_from_last_wakeup < min_time_from_last_wakeup) + return; + //================================================= // check System (SIM, UART, LDC ..... ) //================================================= @@ -844,10 +869,15 @@ // return and wait end of this activity (few TDMA frames) then check on next TDMA frames // if MS can go in deep sleep /* - * FreeCalypso change: the abstention from big sleep because of UART or SIM - * has been moved into Cust_check_system(), which now returns DO_NOT_SLEEP - * in these cases, while still returning FRAME_STOP if the cause is - * the backlight or charging. + * FreeCalypso change: we no longer abstain from big sleep because of UART + * and SIM activity timers, i.e., when deep sleep is suppressed because of + * either of those, we go into big sleep instead. We also do big sleep + * if deep sleep is disallowed because of the backlight or charging. + * However, if the UART issue is not the running activity timer, but some + * output being drained from the Tx FIFO, for that case our new code in + * Cust_check_system() will return DO_NOT_SLEEP (checked above), causing + * us to retry on the next frame and hopefully go into deep sleep after + * another frame or two. */ if ( !min_time || !HWtimer @@ -925,14 +955,18 @@ why_big_sleep = BIG_SLEEP_DUE_TO_DSP_TRACES; } } - if (l1s.pw_mgr.mode_authorized == BIG_SLEEP) + if (l1s.pw_mgr.mode_authorized == BIG_SLEEP || + l1s.pw_mgr.mode_authorized == BIG_SMALL_SLEEP) why_big_sleep = BIG_SLEEP_DUE_TO_SLEEP_MODE; if ( ((l1s.pw_mgr.mode_authorized == BIG_SLEEP) && (sleep_mode >= FRAME_STOP)) || + ((l1s.pw_mgr.mode_authorized == BIG_SMALL_SLEEP) && (sleep_mode >= FRAME_STOP)) || ((l1s.pw_mgr.mode_authorized >= DEEP_SLEEP) && (sleep_mode == FRAME_STOP)) ) l1s.pw_mgr.sleep_performed = FRAME_STOP; + /* FreeCalypso change: check moved up and extended */ + #if 0 if ((previous_sleep == CLOCK_STOP) && (time_from_last_wakeup < 7)) { #if (CODE_VERSION != SIMULATION) @@ -944,6 +978,7 @@ #endif // NOT SIMULATION return; } + #endif // update previous sleep previous_sleep = l1s.pw_mgr.sleep_performed;