123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555 |
- #include "hal_types.h"
- #include "hal_mcu.h"
- #include "hal_board.h"
- #include "hal_sleep.h"
- #include "hal_led.h"
- #include "hal_key.h"
- #include "mac_api.h"
- #include "OSAL.h"
- #include "OSAL_Timers.h"
- #include "OSAL_Tasks.h"
- #include "OSAL_PwrMgr.h"
- #include "OnBoard.h"
- #include "hal_drivers.h"
- #include "hal_assert.h"
- #include "mac_mcu.h"
- #ifndef ZG_BUILD_ENDDEVICE_TYPE
- # define ZG_BUILD_ENDDEVICE_TYPE FALSE
- #endif
- #if ZG_BUILD_ENDDEVICE_TYPE && defined (NWK_AUTO_POLL)
- #include "nwk_globals.h"
- #include "ZGlobals.h"
- #endif
- #define CC2530_PM0 0
- #define CC2530_PM1 1
- #define CC2530_PM2 2
- #define CC2530_PM3 3
- #define HAL_SLEEP_OFF CC2530_PM0
- #define HAL_SLEEP_TIMER CC2530_PM2
- #define HAL_SLEEP_DEEP CC2530_PM3
- #define MAX_SLEEP_TIME 510000
- #define TICKS_SUBTRACTED 2
- #if !defined (PM_MIN_SLEEP_TIME)
- #define PM_MIN_SLEEP_TIME 14
- #endif
- #pragma location = "SLEEP_CODE"
- void halSetSleepMode(void);
- #define HAL_SLEEP_ADJ_TICKS (11 + 12)
- #ifndef HAL_SLEEP_DEBUG_POWER_MODE
- #define HAL_SLEEP_PREP_POWER_MODE(mode) st( SLEEPCMD &= ~PMODE; \
- SLEEPCMD |= mode; \
- while (!(STLOAD & LDRDY)); \
- halSleepPconValue = PCON_IDLE; \
- )
- #define HAL_SLEEP_SET_POWER_MODE() halSetSleepMode()
- #else
- #define HAL_SLEEP_PREP_POWER_MODE(mode)
- #define HAL_SLEEP_SET_POWER_MODE() st( while(halSleepInt == FALSE); \
- halSleepInt = FALSE; \
- HAL_DISABLE_INTERRUPTS(); \
- )
- #endif
- #define STIE_BV BV(5)
- #define P0IE_BV BV(5)
- #define P1IE_BV BV(4)
- #define P2IE_BV BV(1)
- #define HAL_SLEEP_TIMER_ENABLE_INT() st(IEN0 |= STIE_BV;)
- #define HAL_SLEEP_TIMER_DISABLE_INT() st(IEN0 &= ~STIE_BV;)
- #define HAL_SLEEP_TIMER_CLEAR_INT() st(STIF = 0;)
- #define HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2) st(ien0 = IEN0; \
- ien1 = IEN1; \
- ien2 = IEN2; \
- IEN0 &= STIE_BV; \
- IEN1 &= P0IE_BV; \
- IEN2 &= (P1IE_BV|P2IE_BV);)
- #define HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2) st(IEN0 = ien0; \
- IEN1 = ien1; \
- IEN2 = ien2;)
- #define HAL_SLEEP_MS_TO_320US(ms) (((((uint32) (ms)) * 100) + 31) / 32)
- #if HAL_MCU_LITTLE_ENDIAN()
- #define UINT32_NDX0 0
- #define UINT32_NDX1 1
- #define UINT32_NDX2 2
- #define UINT32_NDX3 3
- #else
- #define UINT32_NDX0 3
- #define UINT32_NDX1 2
- #define UINT32_NDX2 1
- #define UINT32_NDX3 0
- #endif
- static uint32 maxSleepLoopTime = HAL_SLEEP_MS_TO_320US(MAX_SLEEP_TIME);
- volatile __data uint8 halSleepPconValue = PCON_IDLE;
- static uint8 halPwrMgtMode = HAL_SLEEP_OFF;
- #ifdef HAL_SLEEP_DEBUG_POWER_MODE
- static bool halSleepInt = FALSE;
- #endif
- void halSleepSetTimer(uint32 timeout);
- void halSetSleepMode(void)
- {
- PCON = halSleepPconValue;
- HAL_DISABLE_INTERRUPTS();
- }
- void halSetMaxSleepLoopTime(uint32 rolloverTime)
- {
- if( rolloverTime > HAL_SLEEP_MS_TO_320US(MAX_SLEEP_TIME) )
- {
- maxSleepLoopTime = HAL_SLEEP_MS_TO_320US(MAX_SLEEP_TIME);
- }
- maxSleepLoopTime = (rolloverTime - TICKS_SUBTRACTED);
- }
- void halSleep( uint16 osal_timeout )
- {
- uint32 timeout;
- uint32 macTimeout = 0;
-
- timeout = HAL_SLEEP_MS_TO_320US(osal_timeout);
- if (timeout == 0)
- {
- timeout = MAC_PwrNextTimeout();
- }
- else
- {
-
- macTimeout = MAC_PwrNextTimeout();
-
- if ((macTimeout != 0) && (macTimeout < timeout))
- {
- timeout = macTimeout;
- }
- }
-
- halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
-
- #if ZG_BUILD_ENDDEVICE_TYPE && defined (NWK_AUTO_POLL)
- if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
- (timeout == 0 && zgPollRate == 0))
- #else
- if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
- (timeout == 0))
- #endif
- {
- halIntState_t ien0, ien1, ien2;
- HAL_ASSERT(HAL_INTERRUPTS_ARE_ENABLED());
- HAL_DISABLE_INTERRUPTS();
-
- if (halSleepPconValue != 0 && MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)
- {
-
- #if ((defined HAL_KEY) && (HAL_KEY == TRUE))
-
- HalKeyEnterSleep();
- #endif
- #ifdef HAL_SLEEP_DEBUG_LED
- HAL_TURN_OFF_LED3();
- #else
-
- HalLedEnterSleep();
- #endif
- if(timeout > maxSleepLoopTime)
- {
- timeout = maxSleepLoopTime;
- }
-
- if (timeout != 0)
- {
- if (timeout > HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ))
- {
- timeout -= HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME );
- halSleepSetTimer(HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ));
- }
- else
- {
-
- halSleepSetTimer(timeout);
- }
-
- HAL_SLEEP_TIMER_CLEAR_INT();
- HAL_SLEEP_TIMER_ENABLE_INT();
- }
- #ifdef HAL_SLEEP_DEBUG_LED
- if (halPwrMgtMode == CC2530_PM1)
- {
- HAL_TURN_ON_LED1();
- }
- else
- {
- HAL_TURN_OFF_LED1();
- }
- #endif
-
- HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode);
-
- HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2);
- HAL_ENABLE_INTERRUPTS();
-
- HAL_SLEEP_SET_POWER_MODE();
-
-
- HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);
-
- HAL_SLEEP_TIMER_DISABLE_INT();
- #ifdef HAL_SLEEP_DEBUG_LED
- HAL_TURN_ON_LED3();
- #else
-
- HalLedExitSleep();
- #endif
- #if ((defined HAL_KEY) && (HAL_KEY == TRUE))
-
- (void)HalKeyExitSleep();
- #endif
-
- MAC_PwrOnReq();
- HAL_ENABLE_INTERRUPTS();
-
- macMcuTimer2OverflowWorkaround();
- }
- else
- {
-
- HAL_ENABLE_INTERRUPTS();
- }
- }
- }
- void halSleepSetTimer(uint32 timeout)
- {
- uint32 ticks;
-
- ((uint8 *) &ticks)[UINT32_NDX0] = ST0;
- ((uint8 *) &ticks)[UINT32_NDX1] = ST1;
- ((uint8 *) &ticks)[UINT32_NDX2] = ST2;
- ((uint8 *) &ticks)[UINT32_NDX3] = 0;
-
- ticks += (timeout * 671) / 64;
-
- ticks -= HAL_SLEEP_ADJ_TICKS;
-
- ST2 = ((uint8 *) &ticks)[UINT32_NDX2];
- ST1 = ((uint8 *) &ticks)[UINT32_NDX1];
- ST0 = ((uint8 *) &ticks)[UINT32_NDX0];
- }
- uint32 TimerElapsed( void )
- {
-
- return (0);
- }
- void halRestoreSleepLevel( void )
- {
-
- }
- HAL_ISR_FUNCTION(halSleepTimerIsr, ST_VECTOR)
- {
- HAL_ENTER_ISR();
- HAL_SLEEP_TIMER_CLEAR_INT();
- #ifdef HAL_SLEEP_DEBUG_POWER_MODE
- halSleepInt = TRUE;
- #endif
-
- CLEAR_SLEEP_MODE();
- HAL_EXIT_ISR();
- }
|