cc3200: Disable WLAN in suspended mode if NW wake is not enabled.

This commit is contained in:
danicampora 2015-03-11 16:50:13 +01:00
parent 8cbbaa052a
commit e9786f40f5
1 changed files with 31 additions and 11 deletions

View File

@ -53,6 +53,7 @@
#include "mpcallback.h" #include "mpcallback.h"
#include "mperror.h" #include "mperror.h"
#include "sleeprestore.h" #include "sleeprestore.h"
#include "serverstask.h"
/****************************************************************************** /******************************************************************************
DECLARE PRIVATE CONSTANTS DECLARE PRIVATE CONSTANTS
@ -160,12 +161,6 @@ void pybsleep_remove (const mp_obj_t obj) {
} }
void pybsleep_set_wlan_wake_callback (mp_obj_t cb_obj) { void pybsleep_set_wlan_wake_callback (mp_obj_t cb_obj) {
if (cb_obj) {
MAP_PRCMLPDSWakeupSourceEnable (PRCM_LPDS_HOST_IRQ);
}
else {
MAP_PRCMLPDSWakeupSourceDisable (PRCM_LPDS_HOST_IRQ);
}
pybsleep_wake_cb.wlan_wake_cb = cb_obj; pybsleep_wake_cb.wlan_wake_cb = cb_obj;
} }
@ -269,9 +264,10 @@ STATIC NORETURN void pybsleep_suspend_enter (void) {
nvic_reg_store->int_priority[i] = base_reg_addr[i]; nvic_reg_store->int_priority[i] = base_reg_addr[i];
} }
// park the io pins // park the gpio pins
pybsleep_iopark(); pybsleep_iopark();
// store the cpu registers
sleep_store(); sleep_store();
// save the restore info and enter LPDS // save the restore info and enter LPDS
@ -326,10 +322,12 @@ void pybsleep_suspend_exit (void) {
// ungate the clock to the shared spi bus // ungate the clock to the shared spi bus
MAP_PRCMPeripheralClkEnable(PRCM_SSPI, PRCM_RUN_MODE_CLK | PRCM_SLP_MODE_CLK); MAP_PRCMPeripheralClkEnable(PRCM_SSPI, PRCM_RUN_MODE_CLK | PRCM_SLP_MODE_CLK);
MAP_PRCMIntEnable (PRCM_INT_SLOW_CLK_CTR);
// reinitialize simplelink's bus // if wakeups are enabled, simplelink is as well, so we only need to
sl_IfOpen (NULL, 0); // reinitialize the interface bus
if (pybsleep_wake_cb.wlan_wake_cb) {
sl_IfOpen (NULL, 0);
}
// initialize the system led // initialize the system led
mperror_init0(); mperror_init0();
@ -441,9 +439,22 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_sleep_idle_obj, pyb_sleep_idle);
// calling this method. // calling this method.
STATIC mp_obj_t pyb_sleep_suspend (mp_obj_t self_in) { STATIC mp_obj_t pyb_sleep_suspend (mp_obj_t self_in) {
nlr_buf_t nlr; nlr_buf_t nlr;
bool servers_enabled = servers_are_enabled();
// check if we need to enable network wake-up
if (pybsleep_wake_cb.wlan_wake_cb) {
MAP_PRCMLPDSWakeupSourceEnable (PRCM_LPDS_HOST_IRQ);
}
else {
MAP_PRCMLPDSWakeupSourceDisable (PRCM_LPDS_HOST_IRQ);
if (servers_enabled) {
wlan_stop_servers();
}
sl_Stop (SL_STOP_TIMEOUT);
}
// entering and exiting suspend mode must be an atomic operation // entering and exiting suspend mode must be an atomic operation
// therefore interrupts must be disabled // therefore interrupts have to be disabled
uint primsk = disable_irq(); uint primsk = disable_irq();
if (nlr_push(&nlr) == 0) { if (nlr_push(&nlr) == 0) {
pybsleep_suspend_enter(); pybsleep_suspend_enter();
@ -452,6 +463,15 @@ STATIC mp_obj_t pyb_sleep_suspend (mp_obj_t self_in) {
// an exception is always raised when exiting suspend mode // an exception is always raised when exiting suspend mode
enable_irq(primsk); enable_irq(primsk);
// enable simplelink if previously disabled
if (!pybsleep_wake_cb.wlan_wake_cb) {
// start simplelink, then enable the servers
sl_Start (0, 0, 0);
if (servers_enabled) {
servers_enable();
}
}
return mp_const_none; return mp_const_none;
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_sleep_suspend_obj, pyb_sleep_suspend); STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_sleep_suspend_obj, pyb_sleep_suspend);