summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--cc3200/mods/modwlan.c112
-rw-r--r--cc3200/mods/modwlan.h3
-rw-r--r--cc3200/mptask.c34
3 files changed, 66 insertions, 83 deletions
diff --git a/cc3200/mods/modwlan.c b/cc3200/mods/modwlan.c
index c637dccf64..253dca4783 100644
--- a/cc3200/mods/modwlan.c
+++ b/cc3200/mods/modwlan.c
@@ -122,7 +122,7 @@ typedef struct _wlan_obj_t {
#define MODWLAN_TIMEOUT_MS 5000
#define MODWLAN_MAX_NETWORKS 20
#define MODWLAN_SCAN_PERIOD_S 300 // 5 minutes
-#define MODWLAN_WAIT_FOR_SCAN_MS 950
+#define MODWLAN_WAIT_FOR_SCAN_MS 1050
#define ASSERT_ON_ERROR( x ) ASSERT((x) >= 0 )
@@ -150,7 +150,22 @@ typedef struct _wlan_obj_t {
/******************************************************************************
DECLARE PRIVATE DATA
******************************************************************************/
-STATIC wlan_obj_t wlan_obj;
+STATIC wlan_obj_t wlan_obj = {
+ .callback = mp_const_none,
+ .mode = -1,
+ .status = 0,
+ .ip = 0,
+ .gateway = 0,
+ .dns = 0,
+ #if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
+ .servers_enabled = false,
+ #endif
+ .security = SL_SEC_TYPE_OPEN,
+ .ssid = {0},
+ .bssid = {0},
+ .mac = {0},
+};
+
STATIC const mp_cb_methods_t wlan_cb_methods;
/******************************************************************************
@@ -356,12 +371,21 @@ void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
//*****************************************************************************
void wlan_init0 (void) {
- // Set the mode to an invalid one
- wlan_obj.mode = -1;
- wlan_obj.base.type = NULL;
- memset (wlan_obj.mac, 0, SL_MAC_ADDR_LEN);
+ // create the wlan lock
ASSERT(OSI_OK == sl_LockObjCreate(&wlan_LockObj, "WlanLock"));
- wlan_initialize_data ();
+}
+
+void wlan_first_start (void) {
+ // clear wlan data after checking any of the status flags
+ wlan_initialize_data();
+
+ if (wlan_obj.mode < 0) {
+ wlan_obj.mode = sl_Start(0, 0, 0);
+ sl_LockObjUnlock (&wlan_LockObj);
+ }
+
+ // get the mac address
+ wlan_get_sl_mac();
}
modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ssid_len, uint8_t sec,
@@ -374,31 +398,9 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
wlan_stop_servers();
}
#endif
- if (wlan_obj.mode < 0) {
- wlan_obj.mode = sl_Start(0, 0, 0);
- sl_LockObjUnlock (&wlan_LockObj);
- }
- // get the mac address
- wlan_get_sl_mac();
-
- // stop the device if it's not in station mode
- if (wlan_obj.mode != ROLE_STA) {
- if (ROLE_AP == wlan_obj.mode) {
- // if the device is in AP mode, we need to wait for this event
- // before doing anything
- while (!IS_IP_ACQUIRED(wlan_obj.status)) {
- #ifndef SL_PLATFORM_MULTI_THREADED
- _SlTaskEntry();
- #endif
- HAL_Delay (5);
- }
- }
- // switch to STA mode
- ASSERT_ON_ERROR(sl_WlanSetMode(ROLE_STA));
- // stop and start again
- wlan_reenable(ROLE_STA);
- }
+ // do a basic start fisrt
+ wlan_first_start();
// Device in station-mode. Disconnect previous connection if any
// The function returns 0 if 'Disconnected done', negative number if already
@@ -413,13 +415,6 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
}
}
- // clear wlan data after checking any of the status flags
- wlan_initialize_data ();
- wlan_obj.security = sec;
-
- // Set connection policy to Auto + SmartConfig (Device's default connection policy)
- ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_CONNECTION, SL_CONNECTION_POLICY(1, 0, 0, 0, 1), NULL, 0));
-
// Remove all profiles
ASSERT_ON_ERROR(sl_WlanProfileDel(0xFF));
@@ -443,9 +438,6 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
// Number between 0-15, as dB offset from max power - 0 will set max power
uint8_t ucPower = 0;
if (mode == ROLE_AP) {
- // Disable the scanning
- ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_SCAN, MODWLAN_SL_SCAN_DISABLE, NULL, 0));
-
// Switch to AP mode
ASSERT_ON_ERROR(sl_WlanSetMode(mode));
ASSERT (ssid != NULL && key != NULL);
@@ -482,17 +474,18 @@ modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ss
// Stop and start again
wlan_reenable(mode);
+ // save the security type
+ wlan_obj.security = sec;
}
// STA and P2P modes
else {
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER,
sizeof(ucPower), (unsigned char *)&ucPower));
- if (mode == ROLE_P2P) {
- // Switch to P2P mode
- ASSERT_ON_ERROR(sl_WlanSetMode(mode));
- // Stop and start again
- wlan_reenable(mode);
- }
+ ASSERT_ON_ERROR(sl_WlanSetMode(mode));
+ // stop and start again
+ wlan_reenable(mode);
+ // set connection policy to Auto + SmartConfig (Device's default connection policy)
+ ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_CONNECTION, SL_CONNECTION_POLICY(1, 0, 0, 0, 1), NULL, 0));
}
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
// Start the servers again
@@ -511,7 +504,7 @@ void wlan_update(void) {
#endif
}
-// call this function to disable the complete WLAN subsystem in order to save power
+// call this function to disable the complete WLAN subsystem before a system reset
void wlan_stop (void) {
if (wlan_obj.mode >= 0) {
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
@@ -526,25 +519,6 @@ void wlan_stop (void) {
}
}
-// cal this function to reenable the WLAN susbsystem after a previous call to wlan_sl_disable()
-// WLAN will remain configured as it was before being disabled
-void wlan_start (void) {
- if (wlan_obj.mode < 0) {
- wlan_obj.mode = sl_Start(0, 0, 0);
- sl_LockObjUnlock (&wlan_LockObj);
-#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
- // Start the servers again
- if (wlan_obj.servers_enabled) {
- servers_enable();
- }
-#endif
- }
-}
-
-SlWlanMode_t wlan_get_mode (void) {
- return wlan_obj.mode;
-}
-
void wlan_get_mac (uint8_t *macAddress) {
if (macAddress) {
memcpy (macAddress, wlan_obj.mac, SL_MAC_ADDR_LEN);
@@ -939,14 +913,14 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_scan_obj, wlan_scan);
/// \method callback(method, intmode, value, priority, pwrmode)
/// Creates a callback object associated with WLAN
-/// min num of arguments is 1 (intmode)
+/// min num of arguments is 1 (pwrmode)
STATIC mp_obj_t wlan_callback (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
mp_arg_val_t args[mpcallback_INIT_NUM_ARGS];
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, mpcallback_INIT_NUM_ARGS, mpcallback_init_args, args);
wlan_obj_t *self = pos_args[0];
// check if any parameters were passed
- if (kw_args->used > 0 || self->callback == mp_const_none) {
+ if (kw_args->used > 0) {
// check the power mode
if (args[4].u_int != PYB_PWR_MODE_LPDS) {
// throw an exception since WLAN only supports LPDS mode
diff --git a/cc3200/mods/modwlan.h b/cc3200/mods/modwlan.h
index da60d2690f..0ad29d855d 100644
--- a/cc3200/mods/modwlan.h
+++ b/cc3200/mods/modwlan.h
@@ -55,9 +55,8 @@ extern _SlLockObj_t wlan_LockObj;
extern void wlan_init0 (void);
extern modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ssid_len, uint8_t sec,
const char *key, uint8_t key_len, uint8_t channel);
+extern void wlan_first_start (void);
extern void wlan_stop (void);
-extern void wlan_start (void);
-extern SlWlanMode_t wlan_get_mode (void);
extern void wlan_get_mac (uint8_t *macAddress);
extern void wlan_get_ip (uint32_t *ip);
extern void wlan_stop_servers (void);
diff --git a/cc3200/mptask.c b/cc3200/mptask.c
index 6f0a3a0540..90576b8e74 100644
--- a/cc3200/mptask.c
+++ b/cc3200/mptask.c
@@ -35,7 +35,11 @@
#include "py/gc.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
+#include "inc/hw_ints.h"
+#include "inc/hw_memmap.h"
+#include "rom_map.h"
#include "pin.h"
+#include "prcm.h"
#include "pybuart.h"
#include "pybpin.h"
#include "pybrtc.h"
@@ -97,16 +101,10 @@ void TASK_Micropython (void *pvParameters) {
// Initialize the garbage collector with the top of our stack
uint32_t sp = gc_helper_get_sp();
gc_collect_init (sp);
- bool safeboot;
+ bool safeboot = false;
FRESULT res;
-#ifdef DEBUG
- safeboot = false;
-#else
- safeboot = mperror_safe_boot_requested();
-#endif
-
- mptask_pre_init ();
+ mptask_pre_init();
soft_reset:
@@ -146,14 +144,26 @@ soft_reset:
mperror_enable_heartbeat();
- mptask_enter_ap_mode();
-
- // enable telnet and ftp servers
- servers_enable();
+ if (MAP_PRCMSysResetCauseGet() != PRCM_HIB_EXIT) {
+ // only if not comming out of hibernate
+ mptask_enter_ap_mode();
+ // don't check for safeboot when comming out of hibernate
+ #ifndef DEBUG
+ safeboot = mperror_safe_boot_requested();
+ #endif
+ }
+ else {
+ // when waking up from hibernate we just want
+ // to enable simplelink and leave it as is
+ wlan_first_start();
+ }
// initialize the serial flash file system
mptask_init_sflash_filesystem();
+ // enable telnet and ftp servers
+ servers_enable();
+
// append the SFLASH paths to the system path
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_SFLASH));
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_SFLASH_slash_LIB));