diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp index 0df8bb6fee..fea3661f04 100644 --- a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/RdaWiFiInterface.cpp @@ -159,8 +159,12 @@ nsapi_error_t RDAWiFiInterface::disconnect() if(sta_state < 2) { return NSAPI_ERROR_NO_CONNECTION; } + void* wifi_disconnect_sem = rda_sem_create(0); msg.type = WLAND_DISCONNECT; + msg.arg1 = (unsigned int)wifi_disconnect_sem; rda_mail_put(wland_msgQ, (void*)&msg, osWaitForever); + rda_sem_wait(wifi_disconnect_sem, osWaitForever); + rda_sem_delete(wifi_disconnect_sem); if (_interface) { return _interface->bringdown(); } diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/csl_mbed.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/csl_mbed.h index 966141ae38..52464fffef 100644 --- a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/csl_mbed.h +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/csl_mbed.h @@ -88,6 +88,7 @@ typedef struct { void (*mbed_critical_sec_end)(void); /* Create interrupt in mbed, input param: vector/priority/isr(function), */ + unsigned int (*mbed_critical_sec_counter_get)(void); /* return: interrupt handle, non-zero is valid */ void * (*mbed_create_interrupt)(unsigned int vec, unsigned int pri, void *isr); diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h index 25ec00acbc..38df3e8ca6 100644 --- a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/inc/rda5991h_wland.h @@ -52,6 +52,7 @@ typedef enum { WLAND_STAJOINED, WLAND_STAEXITED, WLAND_STADEAUTH, + WLAND_STADELETETIMER, WLAND_MAC_CONNECTED, WLAND_MAC_AP_CONNECTED, WLAND_ADD_GTK, diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar index 3c5307cd77..907d7668f9 100644 Binary files a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar and b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_ARM_STD/libwifi_sta_ap.ar differ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a index 58685c8562..4d2ed200dc 100644 Binary files a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a and b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_GCC_ARM/libwifi_sta_ap.a differ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libwifi_sta_ap.a b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libwifi_sta_ap.a index a55e385361..a98ce3c558 100644 Binary files a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libwifi_sta_ap.a and b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/lib/TOOLCHAIN_IAR/libwifi_sta_ap.a differ diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c index bd31ff81d2..251133ef46 100644 --- a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/maclib_task.c @@ -45,7 +45,7 @@ * Variables */ static int maclib_task_run = 0; -static sys_mbox_t maclib_mbox; +static void* maclib_mbox; static int g_event_num = 0; static int g_event_proc_done = 1; static sys_sem_t g_maclib_sem_sleep; @@ -56,55 +56,13 @@ extern maclib_func_t *maclib_func_p; extern void rda_critical_sec_start(void); extern void rda_critical_sec_end(void); extern void wland_set_sta_sleep(unsigned char is_sleep); - -#define MAX_MSG_POOL_NUM (64) -maclib_msg_t msg_str_pool[MAX_MSG_POOL_NUM]; -int msg_str_pool_inited = 0; - -void init_msg_str_pool(void) -{ - int idx; - for(idx = 0; idx < MAX_MSG_POOL_NUM; idx++) { - msg_str_pool[idx].is_free = 1; - } -} - -maclib_msg_t *alloc_msg_str(void) -{ - int idx; - maclib_msg_t *ret = NULL; - rda_critical_sec_start(); - if (0 == msg_str_pool_inited) { - init_msg_str_pool(); - msg_str_pool_inited = 1; - } - rda_critical_sec_end(); - for (idx = 0; idx < MAX_MSG_POOL_NUM; idx++) { - rda_critical_sec_start(); - ret = &msg_str_pool[idx]; - if (1 == ret->is_free) { - ret->is_free = 0; - rda_critical_sec_end(); - break; - } - rda_critical_sec_end(); - } - return ret; -} - -void free_msg_str(maclib_msg_t *p_msg) -{ - rda_critical_sec_start(); - p_msg->is_free = 1; - rda_critical_sec_end(); -} - /** * Functions */ /* maybe called in isr, should not use "printf", "malloc" */ void mbed_event_handle_cb(unsigned int event) { + static unsigned int sec_cnt = 0; MACLIB_EVENT_HANDLE_T type = (MACLIB_EVENT_HANDLE_T)event; if ((maclib_task_run == 0) && (MACLIB_EVENT_CLEANUP != type)) { mbed_error_printf("evntHndlCb_nulldata\r\n"); @@ -115,18 +73,13 @@ void mbed_event_handle_cb(unsigned int event) rda_critical_sec_start(); g_event_num++; if((1 == g_event_num) && (1 == g_event_proc_done)) { - maclib_msg_t *msg; + maclib_msg_t msg; #if MACLIB_TASK_DEBUG mbed_error_printf("#1-1,%d(%08X)\r\n", g_event_num, __get_xPSR()); #endif - msg = alloc_msg_str(); - if(NULL == msg) { - mbed_error_printf("malloc err\r\n"); - return; - } - msg->type = MACLIB_MSG_EVNT_HNDL; - msg->msg = NULL; - sys_mbox_trypost(&(maclib_mbox), msg); + msg.type = MACLIB_MSG_EVNT_HNDL; + msg.msg = NULL; + rda_mail_put(maclib_mbox, (void*)&msg, 0); #if MACLIB_TASK_DEBUG mbed_error_printf("#1-2\r\n"); #endif @@ -205,9 +158,9 @@ void maclib_task(void *pvParameters) sys_sem_new(&g_maclib_sem_sleep, 0); //sleep_entry_register(&maclib_sleep_entry); - ret = sys_mbox_new(&(maclib_mbox), 8); - if(0 != ret) { - LWIP_DEBUGF(NETIF_DEBUG,"msgbox init err!\r\n"); + maclib_mbox = (void *)rda_mail_create(8, sizeof(maclib_msg_t));//ret = sys_mbox_new(&(maclib_mbox), 8); + if(NULL == maclib_mbox) { + mbed_error_printf("msgbox init err!\r\n"); goto mac_lib_err; } #if MACLIB_TASK_DEBUG @@ -215,14 +168,13 @@ void maclib_task(void *pvParameters) #endif maclib_task_run = 1; while(1) { - int mem_free = 1; - maclib_msg_t *msg = NULL; - unsigned int time = sys_arch_mbox_fetch(&(maclib_mbox), (void **)&msg, 0); - if ((SYS_ARCH_TIMEOUT == time) || (NULL == msg)) { - LWIP_DEBUGF(NETIF_DEBUG, "ml_task: invalid msg\r\n"); + maclib_msg_t msg; + osStatus_t status = rda_mail_get(maclib_mbox, (void *)&msg, osWaitForever); + if(osOK != status) { + mbed_error_printf("ml_task: invalid msg ret=%08X\r\n", status); continue; } - switch(msg->type) { + switch(msg.type) { case MACLIB_MSG_EVNT_HNDL: { rda_critical_sec_start(); g_event_proc_done = 0; @@ -246,11 +198,10 @@ void maclib_task(void *pvParameters) #if MACLIB_TASK_DEBUG mbed_error_printf("#2-1\r\n"); #endif - sys_mbox_trypost(&(maclib_mbox), msg); + rda_mail_put(maclib_mbox, (void*)&msg, 0); #if MACLIB_TASK_DEBUG mbed_error_printf("#2-2\r\n"); #endif - mem_free = 0; } rda_critical_sec_end(); #if MACLIB_TASK_DEBUG @@ -261,12 +212,9 @@ void maclib_task(void *pvParameters) default: break; } - if (mem_free) { - free_msg_str(msg); #if MACLIB_TASK_DEBUG mbed_error_printf("#4\r\n"); #endif - } } mac_lib_err: diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c index 4c6febce9d..d51064e582 100644 --- a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/lwip-wifi/arch/TARGET_RDA/TARGET_UNO_91H/src/rda5991h_wland.c @@ -110,7 +110,7 @@ void rda_netif_link_down(int netif) rda_msg msg; msg.type = 1; msg.arg1 = 0; - rda_mail_put(packet_rx_queue, (void*)&msg, osWaitForever); + rda_mail_put(packet_rx_queue, (void*)&msg, 0); } void rda_netif_up(int netif) @@ -127,7 +127,7 @@ void rda_netif_link_up(int netif) rda_msg msg; msg.type = 1; msg.arg1 = 1; - rda_mail_put(packet_rx_queue, (void*)&msg, osWaitForever); + rda_mail_put(packet_rx_queue, (void*)&msg, 0); return; } @@ -181,6 +181,32 @@ void rda_critical_sec_end(void) } } +unsigned int rda_critical_sec_counter_get(void) +{ + if (__get_IPSR() == 0U) { + return g_critical_sec_counter; + } else { + return 0xFFFFFFFF; + } +} + +void rda_critical_sec_start_resume(unsigned int cnt) +{ + unsigned int i = 0; + for(i=0; istate == osRtxTimerRunning){ + osStatus retval = osTimerStop(timer_id); + if(osOK != retval) { + RDA_SYS_PRINT("Stop alarm error: %d\r\n", retval); + return ERR; + } } return NO_ERR; } diff --git a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp index 9305f0daeb..9ab35571e1 100644 --- a/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp +++ b/features/netsocket/emac-drivers/TARGET_RDA_EMAC/rda5981x_emac.cpp @@ -172,10 +172,8 @@ void RDA5981x_EMAC::packet_rx() case 0: p = low_level_input((unsigned char*)msg.arg1, msg.arg2); if (p == NULL) { - rda_sem_release((void*)msg.arg3); break; } - rda_sem_release((void*)msg.arg3); if (p) { emac_link_input_cb(p); }