cc3200: Remove unneeded code from modwlan and optimize startup time.

These changes also help reduce the hibernate wake-up time to 1s.
This commit is contained in:
danicampora 2015-03-12 20:59:15 +01:00
parent ac4f6b804f
commit c7fabe1f3e
3 changed files with 66 additions and 83 deletions

View File

@ -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
// 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

View File

@ -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);

View File

@ -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();
if (MAP_PRCMSysResetCauseGet() != PRCM_HIB_EXIT) {
// only if not comming out of hibernate
mptask_enter_ap_mode();
// enable telnet and ftp servers
servers_enable();
// 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));