浏览代码

[DeviceDriver][wlan] 已知问题修复
1.Kconfig添加DEBUG选项
2.函数入参检查
3.修复拼写错误及逻辑错误
4.低功耗可以设定等级
5.移除残留中文注释

tangyuxin 6 年之前
父节点
当前提交
f7423741f2

+ 34 - 4
components/drivers/Kconfig

@@ -205,11 +205,11 @@ menu "Using WiFi"
 
     if RT_USING_WIFI
         config RT_WLAN_DEVICE_STA_NAME
-            string "the WiFi device name for station"
+            string "The WiFi device name for station"
             default "wlan0"
 
         config RT_WLAN_DEVICE_AP_NAME
-            string "the WiFi device name for ap"
+            string "The WiFi device name for ap"
             default "wlan1"
 
         config RT_WLAN_DEFAULT_PROT
@@ -217,11 +217,11 @@ menu "Using WiFi"
             default "lwip"
 
         config RT_WLAN_SCAN_WAIT_MS
-            int "Scan timeout time"
+            int "Set scan timeout time(ms)"
             default 10000;
 
         config RT_WLAN_CONNECT_WAIT_MS
-            int "connect timeout time"
+            int "Set connect timeout time(ms)"
             default 10000;
 
         config RT_WLAN_SSID_MAX_LENGTH
@@ -259,6 +259,36 @@ menu "Using WiFi"
         config RT_WLAN_PROT_LWIP_PBUF_FORCE
             bool "Forced use of PBUF transmission"
             default n
+
+        menuconfig RT_WLAN_DEBUG
+            bool "Enable WLAN Debugging Options"
+            default n
+
+        if RT_WLAN_DEBUG
+            config RT_WLAN_CMD_DEBUG
+                bool "Enable Debugging of wlan_cmd.c"
+                default n
+
+            config RT_WLAN_MGNT_DEBUG
+                bool "Enable Debugging of wlan_mgnt.c"
+                default n
+
+            config RT_WLAN_DEV_DEBUG
+                bool "Enable Debugging of wlan_dev.c"
+                default n
+
+            config RT_WLAN_PROT_DEBUG
+                bool "Enable Debugging of wlan_prot.c"
+                default n
+
+            config RT_WLAN_CFG_DEBUG
+                bool "Enable Debugging of wlan_cfg.c"
+                default n
+
+            config RT_WLAN_LWIP_DEBUG
+                bool "Enable Debugging of wlan_lwip.c"
+                default n
+        endif
     endif
 endmenu
 

+ 13 - 5
components/drivers/wlan/wlan_cfg.c

@@ -12,11 +12,22 @@
 #include <wlan_cfg.h>
 
 #define DBG_ENABLE
+#ifdef RT_WLAN_CFG_DEBUG
+#define DBG_LEVEL DBG_LOG
+#else
 #define DBG_LEVEL DBG_INFO
+#endif
 #define DBG_SECTION_NAME  "WLAN.cfg"
 #define DBG_COLOR
 #include <rtdbg.h>
 
+#define WLAN_CFG_LOCK()      (rt_mutex_take(&cfg_mutex, RT_WAITING_FOREVER))
+#define WLAN_CFG_UNLOCK()    (rt_mutex_release(&cfg_mutex))
+
+#if RT_WLAN_CFG_INFO_MAX < 1
+#error "The minimum configuration is 1"
+#endif
+
 struct cfg_save_info_head
 {
     rt_uint32_t magic;
@@ -31,9 +42,6 @@ struct rt_wlan_cfg_des
     struct rt_wlan_cfg_info *cfg_info;
 };
 
-#define WLAN_CFG_LOCK()      (rt_mutex_take(&cfg_mutex, RT_WAITING_FOREVER))
-#define WLAN_CFG_UNLOCK()    (rt_mutex_release(&cfg_mutex))
-
 static struct rt_wlan_cfg_des *cfg_cache;
 static const struct rt_wlan_cfg_ops *cfg_ops;
 static struct rt_mutex cfg_mutex;
@@ -230,7 +238,7 @@ int rt_wlan_cfg_read(struct rt_wlan_cfg_info *cfg_info, int num)
 {
     rt_wlan_cfg_init();
 
-    if (num <= 0)
+    if ((cfg_info == RT_NULL) || (num <= 0))
         return 0;
     /* copy data */
     WLAN_CFG_LOCK();
@@ -308,7 +316,7 @@ int rt_wlan_cfg_read_index(struct rt_wlan_cfg_info *cfg_info, int index)
 {
     rt_wlan_cfg_init();
 
-    if (index < 0)
+    if ((cfg_info == RT_NULL) || (index < 0))
         return 0;
 
     WLAN_CFG_LOCK();

+ 0 - 4
components/drivers/wlan/wlan_cfg.h

@@ -21,10 +21,6 @@ extern "C" {
 #define RT_WLAN_CFG_INFO_MAX    (3) /* min is 1 */
 #endif
 
-#if RT_WLAN_CFG_INFO_MAX < 1
-#error "The minimum configuration is 1"
-#endif
-
 #define RT_WLAN_CFG_MAGIC       (0x426f6d62)
 
 struct rt_wlan_cfg_info

+ 16 - 4
components/drivers/wlan/wlan_cmd.c

@@ -24,12 +24,13 @@ static int wifi_scan(int argc, char *argv[]);
 static int wifi_status(int argc, char *argv[]);
 static int wifi_join(int argc, char *argv[]);
 static int wifi_ap(int argc, char *argv[]);
-static int list_sta(int argc, char *argv[]);
+static int wifi_list_sta(int argc, char *argv[]);
 static int wifi_disconnect(int argc, char *argv[]);
 static int wifi_ap_stop(int argc, char *argv[]);
-static int wifi_debug(int argc, char *argv[]);
 
+#ifdef RT_WLAN_CMD_DEBUG
 /* just for debug  */
+static int wifi_debug(int argc, char *argv[]);
 static int wifi_debug_save_cfg(int argc, char *argv[]);
 static int wifi_debug_dump_cfg(int argc, char *argv[]);
 static int wifi_debug_clear_cfg(int argc, char *argv[]);
@@ -37,6 +38,7 @@ static int wifi_debug_dump_prot(int argc, char *argv[]);
 static int wifi_debug_set_mode(int argc, char *argv[]);
 static int wifi_debug_set_prot(int argc, char *argv[]);
 static int wifi_debug_set_autoconnect(int argc, char *argv[]);
+#endif
 
 /* cmd table */
 static const struct wifi_cmd_des cmd_tab[] =
@@ -46,13 +48,16 @@ static const struct wifi_cmd_des cmd_tab[] =
     {"status", wifi_status},
     {"join", wifi_join},
     {"ap", wifi_ap},
-    {"list_sta", list_sta},
+    {"list_sta", wifi_list_sta},
     {"disc", wifi_disconnect},
     {"ap_stop", wifi_ap_stop},
     {"smartconfig", RT_NULL},
+#ifdef RT_WLAN_CMD_DEBUG
     {"-d", wifi_debug},
+#endif
 };
 
+#ifdef RT_WLAN_CMD_DEBUG
 /* debug cmd table */
 static const struct wifi_cmd_des debug_tab[] =
 {
@@ -64,6 +69,7 @@ static const struct wifi_cmd_des debug_tab[] =
     {"prot", wifi_debug_set_prot},
     {"auto", wifi_debug_set_autoconnect},
 };
+#endif
 
 static int wifi_help(int argc, char *argv[])
 {
@@ -76,7 +82,9 @@ static int wifi_help(int argc, char *argv[])
     rt_kprintf("wifi ap_stop\n");
     rt_kprintf("wifi status\n");
     rt_kprintf("wifi smartconfig\n");
+#ifdef RT_WLAN_CMD_DEBUG
     rt_kprintf("wifi -d debug command\n");
+#endif
     return 0;
 }
 
@@ -272,7 +280,7 @@ static int wifi_ap(int argc, char *argv[])
     return 0;
 }
 
-static int list_sta(int argc, char *argv[])
+static int wifi_list_sta(int argc, char *argv[])
 {
     struct rt_wlan_info *sta_info;
     int num, i;
@@ -320,6 +328,7 @@ static int wifi_ap_stop(int argc, char *argv[])
     return 0;
 }
 
+#ifdef RT_WLAN_CMD_DEBUG
 /* just for debug */
 static int wifi_debug_help(int argc, char *argv[])
 {
@@ -509,6 +518,7 @@ static int wifi_debug(int argc, char *argv[])
     }
     return 0;
 }
+#endif
 
 static int wifi_msh(int argc, char *argv[])
 {
@@ -551,4 +561,6 @@ static int wifi_msh(int argc, char *argv[])
     return 0;
 }
 
+#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
 FINSH_FUNCTION_EXPORT_ALIAS(wifi_msh, __cmd_wifi, wifi command.);
+#endif

+ 50 - 22
components/drivers/wlan/wlan_dev.c

@@ -14,7 +14,11 @@
 #include <wlan_prot.h>
 
 #define DBG_ENABLE
+#ifdef RT_WLAN_DEV_DEBUG
+#define DBG_LEVEL DBG_LOG
+#else
 #define DBG_LEVEL DBG_INFO
+#endif
 #define DBG_SECTION_NAME  "WLAN.dev"
 #define DBG_COLOR
 #include <rtdbg.h>
@@ -26,6 +30,22 @@
 #define WLAN_DEV_LOCK(_wlan)      (rt_mutex_take(&(_wlan)->lock, RT_WAITING_FOREVER))
 #define WLAN_DEV_UNLOCK(_wlan)    (rt_mutex_release(&(_wlan)->lock))
 
+#if RT_WLAN_SSID_MAX_LENGTH < 1
+#error "SSID length is too short"
+#endif
+
+#if RT_WLAN_BSSID_MAX_LENGTH < 1
+#error "BSSID length is too short"
+#endif
+
+#if RT_WLAN_PASSWORD_MAX_LENGTH < 1
+#error "password length is too short"
+#endif
+
+#if RT_WLAN_DEV_EVENT_NUM < 2
+#error "dev num Too little"
+#endif
+
 rt_err_t rt_wlan_dev_init(struct rt_wlan_device *device, rt_wlan_mode_t mode)
 {
     rt_err_t result = RT_EOK;
@@ -137,7 +157,7 @@ rt_err_t rt_wlan_dev_ap_start(struct rt_wlan_device *device, struct rt_wlan_info
 
 rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device)
 {
-    rt_err_t result = 0;
+    rt_err_t result = RT_EOK;
 
     if (device == RT_NULL)
     {
@@ -150,7 +170,7 @@ rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device)
 
 rt_err_t rt_wlan_dev_ap_deauth(struct rt_wlan_device *device, rt_uint8_t mac[6])
 {
-    rt_err_t result = 0;
+    rt_err_t result = RT_EOK;
 
     if (device == RT_NULL)
     {
@@ -176,7 +196,7 @@ int rt_wlan_dev_get_rssi(struct rt_wlan_device *device)
 
 rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
 {
-    rt_err_t result = 0;
+    rt_err_t result = RT_EOK;
 
     if (device == RT_NULL)
     {
@@ -200,32 +220,31 @@ rt_err_t rt_wlan_dev_set_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
     return result;
 }
 
-rt_err_t rt_wlan_dev_enable_powersave(struct rt_wlan_device *device)
+rt_err_t rt_wlan_dev_set_powersave(struct rt_wlan_device *device, int level)
 {
     rt_err_t result = RT_EOK;
-    int enable = 1;
 
     if (device == RT_NULL)
     {
         return -RT_EIO;
     }
 
-    result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_POWERSAVE, &enable);
+    result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_SET_POWERSAVE, &level);
     return result;
 }
 
-rt_err_t rt_wlan_dev_disable_powersave(struct rt_wlan_device *device)
+int rt_wlan_dev_get_powersave(struct rt_wlan_device *device)
 {
-    rt_err_t result = RT_EOK;
-    int enable = 0;
+    int level = 0;
 
     if (device == RT_NULL)
     {
-        return -RT_EIO;
+        return -1;
     }
 
-    result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_POWERSAVE, &enable);
-    return result;
+    rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_POWERSAVE, &level);
+
+    return level;
 }
 
 rt_err_t rt_wlan_dev_register_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler, void *parameter)
@@ -279,7 +298,7 @@ rt_err_t rt_wlan_dev_unregister_event_handler(struct rt_wlan_device *device, rt_
         if (device->handler_table[event][i].handler == handler)
         {
             rt_memset(&device->handler_table[event][i], 0, sizeof(struct rt_wlan_dev_event_desc));
-            rt_exit_critical();
+            rt_hw_interrupt_enable(level);
             return RT_EOK;
         }
     }
@@ -323,7 +342,7 @@ void rt_wlan_dev_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_de
     }
 }
 
-rt_err_t rt_wlan_dev_enter_pormisc(struct rt_wlan_device *device)
+rt_err_t rt_wlan_dev_enter_promisc(struct rt_wlan_device *device)
 {
     rt_err_t result = RT_EOK;
     int enable = 1;
@@ -337,7 +356,7 @@ rt_err_t rt_wlan_dev_enter_pormisc(struct rt_wlan_device *device)
     return result;
 }
 
-rt_err_t rt_wlan_dev_exit_pormisc(struct rt_wlan_device *device)
+rt_err_t rt_wlan_dev_exit_promisc(struct rt_wlan_device *device)
 {
     rt_err_t result = RT_EOK;
     int enable = 0;
@@ -351,7 +370,7 @@ rt_err_t rt_wlan_dev_exit_pormisc(struct rt_wlan_device *device)
     return result;
 }
 
-rt_err_t rt_wlan_dev_set_pormisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback)
+rt_err_t rt_wlan_dev_set_promisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback)
 {
     if (device == RT_NULL)
     {
@@ -362,7 +381,7 @@ rt_err_t rt_wlan_dev_set_pormisc_callback(struct rt_wlan_device *device, rt_wlan
     return RT_EOK;
 }
 
-void rt_wlan_dev_pormisc_handler(struct rt_wlan_device *device, void *data, int len)
+void rt_wlan_dev_promisc_handler(struct rt_wlan_device *device, void *data, int len)
 {
     rt_wlan_pormisc_callback_t callback;
 
@@ -616,13 +635,22 @@ static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args)
             *rssi = wlan->ops->wlan_get_rssi(wlan);
         break;
     }
-    case RT_WLAN_CMD_POWERSAVE:
+    case RT_WLAN_CMD_SET_POWERSAVE:
+    {
+        int level = *((int *)args);
+
+        LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_POWERSAVE, "RT_WLAN_CMD_SET_POWERSAVE");
+        if (wlan->ops->wlan_set_powersave)
+            wlan->ops->wlan_set_powersave(wlan, level);
+        break;
+    }
+    case RT_WLAN_CMD_GET_POWERSAVE:
     {
-        rt_bool_t enable = *((rt_bool_t *)args);
+        int *level = args;
 
-        LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_POWERSAVE, "RT_WLAN_CMD_POWERSAVE");
-        if (wlan->ops->wlan_powersave)
-            wlan->ops->wlan_powersave(wlan, enable);
+        LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_POWERSAVE, "RT_WLAN_CMD_GET_POWERSAVE");
+        if (wlan->ops->wlan_get_powersave)
+            *level = wlan->ops->wlan_get_powersave(wlan);
         break;
     }
     case RT_WLAN_CMD_CFG_PROMISC:

+ 52 - 42
components/drivers/wlan/wlan_dev.h

@@ -34,7 +34,8 @@ typedef enum
     RT_WLAN_CMD_AP_DEAUTH,
     RT_WLAN_CMD_SCAN_STOP,
     RT_WLAN_CMD_GET_RSSI,          /* get sensitivity (dBm) */
-    RT_WLAN_CMD_POWERSAVE,
+    RT_WLAN_CMD_SET_POWERSAVE,
+    RT_WLAN_CMD_GET_POWERSAVE,
     RT_WLAN_CMD_CFG_PROMISC,       /* start/stop minitor */
     RT_WLAN_CMD_CFG_FILTER,
     RT_WLAN_CMD_SET_CHANNEL,
@@ -89,22 +90,6 @@ typedef enum
 #define RT_WLAN_DEV_EVENT_NUM  (2)   /* EVENT GROUP MAX NUM */
 #endif
 
-#if RT_WLAN_SSID_MAX_LENGTH < 1
-#error "SSID length is too short"
-#endif
-
-#if RT_WLAN_BSSID_MAX_LENGTH < 1
-#error "BSSID length is too short"
-#endif
-
-#if RT_WLAN_PASSWORD_MAX_LENGTH < 1
-#error "password length is too short"
-#endif
-
-#if RT_WLAN_DEV_EVENT_NUM < 2
-#error "dev num Too little"
-#endif
-
 /**
  * Enumeration of Wi-Fi security modes
  */
@@ -499,7 +484,8 @@ struct rt_wlan_dev_ops
     rt_err_t (*wlan_ap_deauth)(struct rt_wlan_device *wlan, rt_uint8_t mac[]);
     rt_err_t (*wlan_scan_stop)(struct rt_wlan_device *wlan);
     int (*wlan_get_rssi)(struct rt_wlan_device *wlan);
-    rt_err_t (*wlan_powersave)(struct rt_wlan_device *wlan, rt_bool_t enable);
+    rt_err_t (*wlan_set_powersave)(struct rt_wlan_device *wlan, int level);
+    int (*wlan_get_powersave)(struct rt_wlan_device *wlan);
     rt_err_t (*wlan_cfg_promisc)(struct rt_wlan_device *wlan, rt_bool_t start);
     rt_err_t (*wlan_cfg_filter)(struct rt_wlan_device *wlan, struct rt_wlan_filter *filter);
     rt_err_t (*wlan_set_channel)(struct rt_wlan_device *wlan, int channel);
@@ -512,60 +498,84 @@ struct rt_wlan_dev_ops
     int (*wlan_send)(struct rt_wlan_device *wlan, void *buff, int len);
 };
 
+/*
+ * wlan device init
+ */
 rt_err_t rt_wlan_dev_init(struct rt_wlan_device *device, rt_wlan_mode_t mode);
 
+/*
+ * wlan device station interface
+ */
 rt_err_t rt_wlan_dev_connect(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len);
-
 rt_err_t rt_wlan_dev_disconnect(struct rt_wlan_device *device);
+int rt_wlan_dev_get_rssi(struct rt_wlan_device *device);
 
+/*
+ * wlan device ap interface
+ */
 rt_err_t rt_wlan_dev_ap_start(struct rt_wlan_device *device, struct rt_wlan_info *info, const char *password, int password_len);
-
 rt_err_t rt_wlan_dev_ap_stop(struct rt_wlan_device *device);
-
 rt_err_t rt_wlan_dev_ap_deauth(struct rt_wlan_device *device, rt_uint8_t mac[6]);
 
-int rt_wlan_dev_get_rssi(struct rt_wlan_device *device);
+/*
+ * wlan device scan interface
+ */
+rt_err_t rt_wlan_dev_scan(struct rt_wlan_device *device, struct rt_wlan_info *info);
+rt_err_t rt_wlan_dev_scan_stop(struct rt_wlan_device *device);
 
+/*
+ * wlan device mac interface
+ */
 rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6]);
-
 rt_err_t rt_wlan_dev_set_mac(struct rt_wlan_device *device, rt_uint8_t mac[6]);
 
-rt_err_t rt_wlan_dev_enable_powersave(struct rt_wlan_device *device);
-
-rt_err_t rt_wlan_dev_disable_powersave(struct rt_wlan_device *device);
+/*
+ * wlan device powersave interface
+ */
+rt_err_t rt_wlan_dev_set_powersave(struct rt_wlan_device *device, int level);
+int rt_wlan_dev_get_powersave(struct rt_wlan_device *device);
 
+/*
+ * wlan device event interface
+ */
 rt_err_t rt_wlan_dev_register_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler, void *parameter);
-
 rt_err_t rt_wlan_dev_unregister_event_handler(struct rt_wlan_device *device, rt_wlan_dev_event_t event, rt_wlan_dev_event_handler handler);
-
 void rt_wlan_dev_indicate_event_handle(struct rt_wlan_device *device, rt_wlan_dev_event_t event, struct rt_wlan_buff *buff);
 
-rt_err_t rt_wlan_dev_enter_pormisc(struct rt_wlan_device *device);
-
-rt_err_t rt_wlan_dev_exit_pormisc(struct rt_wlan_device *device);
-
-rt_err_t rt_wlan_dev_set_pormisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback);
-
-void rt_wlan_dev_pormisc_handler(struct rt_wlan_device *device, void *data, int len);
+/*
+ * wlan device promisc interface
+ */
+rt_err_t rt_wlan_dev_enter_promisc(struct rt_wlan_device *device);
+rt_err_t rt_wlan_dev_exit_promisc(struct rt_wlan_device *device);
+rt_err_t rt_wlan_dev_set_promisc_callback(struct rt_wlan_device *device, rt_wlan_pormisc_callback_t callback);
+void rt_wlan_dev_promisc_handler(struct rt_wlan_device *device, void *data, int len);
 
+/*
+ * wlan device filter interface
+ */
 rt_err_t rt_wlan_dev_cfg_filter(struct rt_wlan_device *device, struct rt_wlan_filter *filter);
 
+/*
+ * wlan device channel interface
+ */
 rt_err_t rt_wlan_dev_set_channel(struct rt_wlan_device *device, int channel);
-
 rt_err_t rt_wlan_dev_get_channel(struct rt_wlan_device *device);
 
+/*
+ * wlan device country interface
+ */
 rt_err_t rt_wlan_dev_set_country(struct rt_wlan_device *device, rt_country_code_t country_code);
-
 rt_country_code_t rt_wlan_dev_get_country(struct rt_wlan_device *device);
 
-rt_err_t rt_wlan_dev_scan(struct rt_wlan_device *device, struct rt_wlan_info *info);
-
-rt_err_t rt_wlan_dev_scan_stop(struct rt_wlan_device *device);
-
+/*
+ * wlan device datat transfer interface
+ */
 rt_err_t rt_wlan_dev_report_data(struct rt_wlan_device *device, void *buff, int len);
-
 // void rt_wlan_dev_data_ready(struct rt_wlan_device *device, int len);
 
+/*
+ * wlan device register interface
+ */
 struct rt_wlan_device *rt_wlan_dev_register(const char *name, const struct rt_wlan_dev_ops *ops, rt_uint32_t flag, void *user_data);
 
 #ifdef __cplusplus

+ 5 - 0
components/drivers/wlan/wlan_lwip.c

@@ -13,6 +13,7 @@
 #include <wlan_dev.h>
 #include <wlan_prot.h>
 #include <wlan_workqueue.h>
+
 #ifdef RT_USING_LWIP
 #include <netif/ethernetif.h>
 #include <lwip/netifapi.h>
@@ -21,7 +22,11 @@
 #endif
 
 #define DBG_ENABLE
+#ifdef RT_WLAN_LWIP_DEBUG
+#define DBG_LEVEL DBG_LOG
+#else
 #define DBG_LEVEL DBG_INFO
+#endif
 #define DBG_SECTION_NAME  "WLAN.lwip"
 #define DBG_COLOR
 #include <rtdbg.h>

+ 41 - 60
components/drivers/wlan/wlan_mgnt.c

@@ -17,7 +17,11 @@
 #include <wlan_workqueue.h>
 
 #define DBG_ENABLE
+#ifdef RT_WLAN_MGNT_DEBUG
+#define DBG_LEVEL DBG_LOG
+#else
 #define DBG_LEVEL DBG_INFO
+#endif
 #define DBG_SECTION_NAME  "WLAN.mgnt"
 #define DBG_COLOR
 #include <rtdbg.h>
@@ -51,6 +55,10 @@
 
 #define DISCONNECT_RESPONSE_TICK    (2000)
 
+#if RT_WLAN_EBOX_NUM < 1
+#error "event box num Too little"
+#endif
+
 struct rt_wlan_mgnt_des
 {
     struct rt_wlan_device *device;
@@ -108,8 +116,6 @@ static struct rt_wlan_event_desc event_tab[RT_WLAN_EVT_MAX];
 static struct rt_wlan_complete_des *complete_tab[5];
 static struct rt_mutex complete_mutex;
 
-static rt_mailbox_t event_box;
-
 static struct rt_timer reconnect_time;
 
 rt_inline int _sta_is_null(void)
@@ -153,7 +159,7 @@ static rt_err_t rt_wlan_send_msg(rt_wlan_dev_event_t event, void *buff, int len)
     msg = rt_malloc(sizeof(struct rt_wlan_msg) + len);
     if (msg == RT_NULL)
     {
-        RT_WLAN_LOG_E("No memory");
+        RT_WLAN_LOG_E("wlan mgnt send msg err! No memory");
         return -RT_ENOMEM;
     }
     rt_memset(msg, 0, sizeof(struct rt_wlan_msg) + len);
@@ -352,12 +358,12 @@ static rt_err_t rt_wlan_sta_info_del(struct rt_wlan_info *info, int timeout)
     return err;
 }
 
-static rt_err_t rt_wlan_sta_info_del_all(void)
+static rt_err_t rt_wlan_sta_info_del_all(int timeout)
 {
     struct rt_wlan_sta_list *sta_list, *sta_next;
     rt_err_t err = RT_EOK;
 
-    err = rt_mutex_take(&sta_info_mutex, rt_tick_from_millisecond(200));
+    err = rt_mutex_take(&sta_info_mutex, rt_tick_from_millisecond(timeout));
     if (err == RT_EOK)
     {
         /* traversing the list */
@@ -370,7 +376,9 @@ static rt_err_t rt_wlan_sta_info_del_all(void)
         rt_mutex_release(&sta_info_mutex);
     }
     if (sta_info.num != 0)
-        rt_kprintf("zha guo zha guo zha guo\n");
+    {
+        RT_WLAN_LOG_W("\n\n!!!Program runing exception!!!\n\n");
+    }
     sta_info.num = 0;
     sta_info.node = RT_NULL;
     return err;
@@ -414,7 +422,7 @@ static void rt_wlan_auto_connect_run(struct rt_work *work, void *parameter)
     }
     rt_wlan_connect_adv(&cfg_info.info, password);
 exit:
-    MGNT_UNLOCK();
+    rt_mutex_release(&mgnt_mutex);
     level = rt_hw_interrupt_disable();
     rt_memset(work, 0, sizeof(struct rt_work));
     rt_hw_interrupt_enable(level);
@@ -466,24 +474,6 @@ static void rt_wlan_mgnt_work(void *parameter)
         }
         break;
     }
-    case RT_WLAN_DEV_EVT_AP_ASSOCIATED:
-    {
-        /* save sta info */
-        if (msg->len > 0)
-        {
-            rt_wlan_sta_info_add(msg->buff, RT_WAITING_FOREVER);
-        }
-        break;
-    }
-    case RT_WLAN_DEV_EVT_AP_DISASSOCIATED:
-    {
-        /* delete sta info */
-        if (msg->len > 0)
-        {
-            rt_wlan_sta_info_del(msg->buff, RT_WAITING_FOREVER);
-        }
-        break;
-    }
     default :
         break;
     }
@@ -558,11 +548,10 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
         RT_WLAN_LOG_D("event: AP_STOP");
         _ap_mgnt.state &= ~RT_WLAN_STATE_ACTIVE;
         user_event = RT_WLAN_EVT_AP_STOP;
-        err = rt_wlan_sta_info_del_all();
+        err = rt_wlan_sta_info_del_all(RT_WAITING_FOREVER);
         if (err != RT_NULL)
         {
             RT_WLAN_LOG_W("AP_STOP event handle fail");
-            rt_wlan_send_msg(event, RT_NULL, 0);
         }
         user_buff.data = &_ap_mgnt.info;
         user_buff.len = sizeof(struct rt_wlan_info);
@@ -574,11 +563,10 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
         user_event = RT_WLAN_EVT_AP_ASSOCIATED;
         if (user_buff.len != sizeof(struct rt_wlan_info))
             break;
-        err = rt_wlan_sta_info_add(user_buff.data, 200);
+        err = rt_wlan_sta_info_add(user_buff.data, RT_WAITING_FOREVER);
         if (err != RT_EOK)
         {
             RT_WLAN_LOG_W("AP_ASSOCIATED event handle fail");
-            rt_wlan_send_msg(event, user_buff.data, sizeof(struct rt_wlan_info));
         }
         break;
     }
@@ -588,11 +576,10 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
         user_event = RT_WLAN_EVT_AP_DISASSOCIATED;
         if (user_buff.len != sizeof(struct rt_wlan_info))
             break;
-        err = rt_wlan_sta_info_del(user_buff.data, 200);
+        err = rt_wlan_sta_info_del(user_buff.data, RT_WAITING_FOREVER);
         if (err != RT_EOK)
         {
             RT_WLAN_LOG_W("AP_DISASSOCIATED event handle fail");
-            rt_wlan_send_msg(event, user_buff.data, sizeof(struct rt_wlan_info));
         }
         break;
     }
@@ -637,7 +624,7 @@ static void rt_wlan_event_dispatch(struct rt_wlan_device *device, rt_wlan_dev_ev
         }
     }
     COMPLETE_UNLOCK();
-    /* 取出用户回调 */
+    /* Get user callback */
     if (user_event < RT_WLAN_EVT_MAX)
     {
         level = rt_hw_interrupt_disable();
@@ -1147,28 +1134,28 @@ rt_err_t rt_wlan_disconnect(void)
     return err;
 }
 
-int rt_wlan_is_connected(void)
+rt_bool_t rt_wlan_is_connected(void)
 {
-    int _connect = 0;
+    rt_bool_t _connect;
 
     if (_sta_is_null())
     {
-        return 0;
+        return RT_FALSE;
     }
-    _connect = _sta_mgnt.state & RT_WLAN_STATE_CONNECT ? 1 : 0;
+    _connect = _sta_mgnt.state & RT_WLAN_STATE_CONNECT ? RT_TRUE : RT_FALSE;
     RT_WLAN_LOG_D("%s is run : %s", __FUNCTION__, _connect ? "connect" : "disconnect");
     return _connect;
 }
 
-int rt_wlan_is_ready(void)
+rt_bool_t rt_wlan_is_ready(void)
 {
-    int _ready = 0;
+    rt_bool_t _ready;
 
     if (_sta_is_null())
     {
-        return 0;
+        return RT_FALSE;
     }
-    _ready = _sta_mgnt.state & RT_WLAN_STATE_READY ? 1 : 0;
+    _ready = _sta_mgnt.state & RT_WLAN_STATE_READY ? RT_TRUE : RT_FALSE;
     RT_WLAN_LOG_D("%s is run : %s", __FUNCTION__, _ready ? "ready" : "not ready");
     return _ready;
 }
@@ -1392,7 +1379,6 @@ rt_err_t rt_wlan_ap_stop(void)
     }
     RT_WLAN_LOG_D("%s is run", __FUNCTION__);
 
-    /* 调用dev层接口 */
     MGNT_LOCK();
     /* create event wait complete */
     complete = rt_wlan_complete_create("stop_ap");
@@ -1435,12 +1421,11 @@ rt_err_t rt_wlan_ap_get_info(struct rt_wlan_info *info)
     }
     RT_WLAN_LOG_D("%s is run", __FUNCTION__);
 
-    /* 返回暂存的ap info */
     *info = _ap_mgnt.info;
     return RT_EOK;
 }
 
-/* 获得sta连接数量 */
+/* get sta number  */
 int rt_wlan_ap_get_sta_num(void)
 {
     int sta_num = 0;
@@ -1452,14 +1437,14 @@ int rt_wlan_ap_get_sta_num(void)
     return sta_num;
 }
 
-/* 获得sta信息 */
+/* get sta info */
 int rt_wlan_ap_get_sta_info(struct rt_wlan_info *info, int num)
 {
     int sta_num = 0, i = 0;
     struct rt_wlan_sta_list *sta_list;
 
     STAINFO_LOCK();
-    /* 找出 num 与 sta_info.num 中较小的那个 */
+    /* sta_num = min(sta_info.num, num) */
     sta_num = sta_info.num > num ? num : sta_info.num;
     for (sta_list = sta_info.node; sta_list != RT_NULL && i < sta_num; sta_list = sta_list->next)
     {
@@ -1471,7 +1456,7 @@ int rt_wlan_ap_get_sta_info(struct rt_wlan_info *info, int num)
     return i;
 }
 
-/* 踢掉某个sta */
+/* deauth sta */
 rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
 {
     rt_err_t err = RT_EOK;
@@ -1500,7 +1485,7 @@ rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
     }
 
     STAINFO_LOCK();
-    /* 重缓存中查询有没有这个sta */
+    /* Search for MAC address from sta list */
     for (sta_list = sta_info.node; sta_list != RT_NULL; sta_list = sta_list->next)
     {
         if (rt_memcmp(&sta_list->info.bssid[0], &mac[0], RT_WLAN_BSSID_MAX_LENGTH) == 0)
@@ -1511,7 +1496,7 @@ rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
     }
     STAINFO_UNLOCK();
 
-    /* 没有找个这个sta,退出 */
+    /* No MAC address was found. return */
     if (find_flag != RT_TRUE)
     {
         RT_WLAN_LOG_E("Not find mac addr");
@@ -1519,7 +1504,7 @@ rt_err_t rt_wlan_ap_deauth_sta(rt_uint8_t *mac)
         return -RT_ERROR;
     }
 
-    /* 调用dev层接口,提到sta */
+    /* Kill STA */
     err = rt_wlan_dev_ap_deauth(AP_DEVICE(), mac);
     if (err != RT_NULL)
     {
@@ -1767,7 +1752,7 @@ int rt_wlan_scan_find_cache(struct rt_wlan_info *info, struct rt_wlan_info *out_
     return count;
 }
 
-rt_err_t rt_wlan_enable_powersave(void)
+rt_err_t rt_wlan_set_powersave(int level)
 {
     rt_err_t err = RT_EOK;
 
@@ -1777,24 +1762,24 @@ rt_err_t rt_wlan_enable_powersave(void)
     }
     RT_WLAN_LOG_D("%s is run", __FUNCTION__);
     MGNT_LOCK();
-    err = rt_wlan_dev_enable_powersave(STA_DEVICE());
+    err = rt_wlan_dev_set_powersave(STA_DEVICE(), level);
     MGNT_UNLOCK();
     return err;
 }
 
-rt_err_t rt_wlan_disable_powersave(void)
+int rt_wlan_get_powersave(void)
 {
-    rt_err_t err = RT_EOK;
+    int level;
 
     if (_sta_is_null())
     {
-        return -RT_EIO;
+        return -1;
     }
     RT_WLAN_LOG_D("%s is run", __FUNCTION__);
     MGNT_LOCK();
-    err = rt_wlan_dev_disable_powersave(STA_DEVICE());
+    level = rt_wlan_dev_get_powersave(STA_DEVICE());
     MGNT_UNLOCK();
-    return err;
+    return level;
 }
 
 rt_err_t rt_wlan_register_event_handler(rt_wlan_event_t event, rt_wlan_event_handler handler, void *parameter)
@@ -1890,10 +1875,6 @@ int rt_wlan_init(void)
         rt_mutex_init(&complete_mutex, "complete", RT_IPC_FLAG_FIFO);
         rt_timer_init(&reconnect_time, "wifi_tim", rt_wlan_cyclic_check, RT_NULL, DISCONNECT_RESPONSE_TICK, RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
         rt_timer_start(&reconnect_time);
-        /* create event */
-        event_box = rt_mb_create("wlan", RT_WLAN_EBOX_NUM, RT_IPC_FLAG_FIFO);
-        if (event_box == RT_NULL)
-            RT_ASSERT(event_box != RT_NULL);
         _init_flag = 1;
     }
     return 0;

+ 10 - 14
components/drivers/wlan/wlan_mgnt.h

@@ -37,21 +37,17 @@ extern "C" {
 #define RT_WLAN_EBOX_NUM           (10)
 #endif
 
-#if RT_WLAN_EBOX_NUM < 1
-#error "event box num Too little"
-#endif
-
 /*state fot station*/
-#define RT_WLAN_STATE_CONNECT     (0x1 << 0)
-#define RT_WLAN_STATE_CONNECTING  (0x1 << 1)
-#define RT_WLAN_STATE_READY       (0x1 << 2)
-#define RT_WLAN_STATE_POWERSAVE   (0x1 << 3)
+#define RT_WLAN_STATE_CONNECT     (1UL << 0)
+#define RT_WLAN_STATE_CONNECTING  (1UL << 1)
+#define RT_WLAN_STATE_READY       (1UL << 2)
+#define RT_WLAN_STATE_POWERSAVE   (1UL << 3)
 
 /*flags fot station*/
-#define RT_WLAN_STATE_AUTOEN      (0x1 << 0)
+#define RT_WLAN_STATE_AUTOEN      (1UL << 0)
 
 /*state fot ap*/
-#define RT_WLAN_STATE_ACTIVE      (0x1 << 0)
+#define RT_WLAN_STATE_ACTIVE      (1UL << 0)
 
 typedef enum
 {
@@ -89,8 +85,8 @@ rt_wlan_mode_t rt_wlan_get_mode(const char *dev_name);
 rt_err_t rt_wlan_connect(const char *ssid, const char *password);
 rt_err_t rt_wlan_connect_adv(struct rt_wlan_info *info, const char *password);
 rt_err_t rt_wlan_disconnect(void);
-int rt_wlan_is_connected(void);
-int rt_wlan_is_ready(void);
+rt_bool_t rt_wlan_is_connected(void);
+rt_bool_t rt_wlan_is_ready(void);
 rt_err_t rt_wlan_set_mac(rt_uint8_t *mac);
 rt_err_t rt_wlan_get_mac(rt_uint8_t *mac);
 rt_err_t rt_wlan_get_info(struct rt_wlan_info *info);
@@ -132,8 +128,8 @@ rt_bool_t rt_wlan_get_autoreconnect_mode(void);
 /*
  * wifi power management interface
  */
-rt_err_t rt_wlan_enable_powersave(void);
-rt_err_t rt_wlan_disable_powersave(void);
+rt_err_t rt_wlan_set_powersave(int level);
+int rt_wlan_get_powersave(void);
 
 /*
  * wifi event management interface

+ 8 - 0
components/drivers/wlan/wlan_prot.c

@@ -14,11 +14,19 @@
 #include <wlan_prot.h>
 
 #define DBG_ENABLE
+#ifdef RT_WLAN_PROT_DEBUG
+#define DBG_LEVEL DBG_LOG
+#else
 #define DBG_LEVEL DBG_INFO
+#endif
 #define DBG_SECTION_NAME  "WLAN.prot"
 #define DBG_COLOR
 #include <rtdbg.h>
 
+#if RT_WLAN_PROT_NAME_LEN < 4
+#error "The name is too short"
+#endif
+
 struct rt_wlan_prot_event_des
 {
     rt_wlan_prot_event_handler handler;

+ 0 - 4
components/drivers/wlan/wlan_prot.h

@@ -25,10 +25,6 @@ extern "C" {
 
 #define RT_LWAN_ID_PREFIX      (0x5054)
 
-#if RT_WLAN_PROT_NAME_LEN < 4
-#error "The name is too short"
-#endif
-
 #define RT_WLAN_PROT_LWIP  ("lwip")
 
 typedef enum