@@ -123,6 +123,7 @@ STATIC nvic_reg_store_t *nvic_reg_store;
123123STATIC pybsleep_data_t pybsleep_data = {NULL , NULL , NULL , 0 };
124124volatile arm_cm4_core_regs_t vault_arm_registers ;
125125STATIC pybsleep_reset_cause_t pybsleep_reset_cause = PYB_SLP_PWRON_RESET ;
126+ STATIC pybsleep_reset_cause_t pybsleep_wake_reason = PYB_SLP_WAKED_PWRON ;
126127
127128/******************************************************************************
128129 DECLARE PRIVATE FUNCTIONS
@@ -179,6 +180,17 @@ void pybsleep_init0 (void) {
179180 }
180181 else {
181182 pybsleep_reset_cause = PYB_SLP_HIB_RESET ;
183+ // set the correct wake reason
184+ switch (MAP_PRCMHibernateWakeupCauseGet ()) {
185+ case PRCM_HIB_WAKEUP_CAUSE_SLOW_CLOCK :
186+ pybsleep_wake_reason = PYB_SLP_WAKED_BY_RTC ;
187+ break ;
188+ case PRCM_HIB_WAKEUP_CAUSE_GPIO :
189+ pybsleep_wake_reason = PYB_SLP_WAKED_BY_GPIO ;
190+ break ;
191+ default :
192+ break ;
193+ }
182194 }
183195 break ;
184196 default :
@@ -410,15 +422,18 @@ STATIC void PRCMInterruptHandler (void) {
410422 switch (MAP_PRCMLPDSWakeupCauseGet ()) {
411423 case PRCM_LPDS_HOST_IRQ :
412424 mpcallback_handler (pybsleep_data .wlan_lpds_wake_cb );
425+ pybsleep_wake_reason = PYB_SLP_WAKED_BY_WLAN ;
413426 break ;
414427 case PRCM_LPDS_GPIO :
415428 mpcallback_handler (pybsleep_data .gpio_lpds_wake_cb );
429+ pybsleep_wake_reason = PYB_SLP_WAKED_BY_GPIO ;
416430 break ;
417431 case PRCM_LPDS_TIMER :
418432 // disable the timer as a wake-up source
419433 pybsleep_data .timer_wake_pwrmode &= ~PYB_PWR_MODE_LPDS ;
420434 MAP_PRCMLPDSWakeupSourceDisable (PRCM_LPDS_TIMER );
421435 mpcallback_handler (pybsleep_data .timer_lpds_wake_cb );
436+ pybsleep_wake_reason = PYB_SLP_WAKED_BY_RTC ;
422437 break ;
423438 default :
424439 break ;
@@ -630,7 +645,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_sleep_reset_cause_obj, pyb_sleep_reset_caus
630645/// \function wake_reason()
631646/// Returns the wake up reson from ldps or hibernate
632647STATIC mp_obj_t pyb_sleep_wake_reason (mp_obj_t self_in ) {
633- return mp_const_none ;
648+ return MP_OBJ_NEW_SMALL_INT ( pybsleep_wake_reason ) ;
634649}
635650STATIC MP_DEFINE_CONST_FUN_OBJ_1 (pyb_sleep_wake_reason_obj , pyb_sleep_wake_reason );
636651
@@ -646,13 +661,13 @@ STATIC const mp_map_elem_t pybsleep_locals_dict_table[] = {
646661 { MP_OBJ_NEW_QSTR (MP_QSTR_ACTIVE ), MP_OBJ_NEW_SMALL_INT (PYB_PWR_MODE_ACTIVE ) },
647662 { MP_OBJ_NEW_QSTR (MP_QSTR_SUSPENDED ), MP_OBJ_NEW_SMALL_INT (PYB_PWR_MODE_LPDS ) },
648663 { MP_OBJ_NEW_QSTR (MP_QSTR_HIBERNATING ), MP_OBJ_NEW_SMALL_INT (PYB_PWR_MODE_HIBERNATE ) },
649- { MP_OBJ_NEW_QSTR (MP_QSTR_PWR_ON_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_PWRON_RESET ) },
664+ { MP_OBJ_NEW_QSTR (MP_QSTR_POWER_ON ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_PWRON_RESET ) },
650665 { MP_OBJ_NEW_QSTR (MP_QSTR_HARD_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_HARD_RESET ) },
651666 { MP_OBJ_NEW_QSTR (MP_QSTR_WDT_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WDT_RESET ) },
652667 { MP_OBJ_NEW_QSTR (MP_QSTR_HIB_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_HIB_RESET ) },
653668 { MP_OBJ_NEW_QSTR (MP_QSTR_SOFT_RESET ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_SOFT_RESET ) },
654669 { MP_OBJ_NEW_QSTR (MP_QSTR_WLAN_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_WLAN ) },
655- { MP_OBJ_NEW_QSTR (MP_QSTR_PIN_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_PIN ) },
670+ { MP_OBJ_NEW_QSTR (MP_QSTR_PIN_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_GPIO ) },
656671 { MP_OBJ_NEW_QSTR (MP_QSTR_RTC_WAKE ), MP_OBJ_NEW_SMALL_INT (PYB_SLP_WAKED_BY_RTC ) },
657672};
658673
0 commit comments