瀏覽代碼

[wlan] add get_info api for more new sta information

Evlers 4 月之前
父節點
當前提交
c75e095a27
共有 3 個文件被更改,包括 45 次插入1 次删除
  1. 31 0
      components/drivers/wlan/dev_wlan.c
  2. 6 0
      components/drivers/wlan/dev_wlan.h
  3. 8 1
      components/drivers/wlan/dev_wlan_mgnt.c

+ 31 - 0
components/drivers/wlan/dev_wlan.c

@@ -6,6 +6,7 @@
  * Change Logs:
  * Date           Author       Notes
  * 2018-08-03     tyx          the first version
+ * 2024-12-25     Evlers       add get_info api for more new sta information
  */
 
 #include <rthw.h>
@@ -249,6 +250,25 @@ int rt_wlan_dev_get_rssi(struct rt_wlan_device *device)
     return rssi;
 }
 
+rt_err_t rt_wlan_dev_get_info(struct rt_wlan_device *device, struct rt_wlan_info *info)
+{
+    rt_err_t result = RT_EOK;
+
+    if (device == RT_NULL)
+    {
+        return -RT_EIO;
+    }
+
+    result = rt_device_control(RT_DEVICE(device), RT_WLAN_CMD_GET_INFO, info);
+    if (result != RT_EOK)
+    {
+        rt_set_errno(result);
+        return 0;
+    }
+
+    return result;
+}
+
 rt_err_t rt_wlan_dev_get_mac(struct rt_wlan_device *device, rt_uint8_t mac[6])
 {
     rt_err_t result = RT_EOK;
@@ -784,6 +804,17 @@ 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_GET_INFO:
+    {
+        struct rt_wlan_info *info = args;
+
+        LOG_D("%s %d cmd[%d]:%s  run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_INFO, "RT_WLAN_CMD_GET_INFO");
+        if (wlan->ops->wlan_get_info)
+            err = wlan->ops->wlan_get_info(wlan, info);
+        else
+            err = -RT_ERROR;
+        break;
+    }
     case RT_WLAN_CMD_SET_POWERSAVE:
     {
         int level = *((int *)args);

+ 6 - 0
components/drivers/wlan/dev_wlan.h

@@ -6,6 +6,7 @@
  * Change Logs:
  * Date           Author       Notes
  * 2018-08-03     tyx          the first version
+ * 2024-12-25     Evlers       add get_info api for more new sta information
  */
 
 #ifndef __DEV_WLAN_DEVICE_H__
@@ -15,6 +16,8 @@
 extern "C" {
 #endif
 
+#define RT_WLAN_DEV_VERSION   0x10000   /* 1.0.0 */
+
 typedef enum
 {
     RT_WLAN_NONE,
@@ -34,6 +37,7 @@ typedef enum
     RT_WLAN_CMD_AP_DEAUTH,
     RT_WLAN_CMD_SCAN_STOP,
     RT_WLAN_CMD_GET_RSSI,          /* get sensitivity (dBm) */
+    RT_WLAN_CMD_GET_INFO,          /* get information (rssi, channel, datarate.) */
     RT_WLAN_CMD_SET_POWERSAVE,
     RT_WLAN_CMD_GET_POWERSAVE,
     RT_WLAN_CMD_CFG_PROMISC,       /* start/stop minitor */
@@ -497,6 +501,7 @@ 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);
+    int (*wlan_get_info)(struct rt_wlan_device *wlan, struct rt_wlan_info *info);
     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);
@@ -527,6 +532,7 @@ rt_err_t rt_wlan_dev_connect(struct rt_wlan_device *device, struct rt_wlan_info
 rt_err_t rt_wlan_dev_fast_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);
+rt_err_t rt_wlan_dev_get_info(struct rt_wlan_device *device, struct rt_wlan_info *info);
 
 /*
  * wlan device ap interface

+ 8 - 1
components/drivers/wlan/dev_wlan_mgnt.c

@@ -7,6 +7,7 @@
  * Date           Author       Notes
  * 2018-08-06     tyx          the first version
  * 2023-12-12     Evlers       add the wlan join scan function
+ * 2024-12-25     Evlers       add get_info api for more new sta information
  */
 
 #include <rthw.h>
@@ -1185,8 +1186,14 @@ rt_err_t rt_wlan_get_info(struct rt_wlan_info *info)
 
     if (rt_wlan_is_connected() == RT_TRUE)
     {
+        /* Initialize the information to the scan first */
         *info = _sta_mgnt.info;
-        info->rssi = rt_wlan_get_rssi();
+        /* Try using get_info's API for more new information */
+        if (rt_wlan_dev_get_info(STA_DEVICE(), info) != RT_EOK)
+        {
+            /* The get_info returns an error and gets the rssi value separately */
+            info->rssi = rt_wlan_get_rssi();
+        }
         return RT_EOK;
     }
     return -RT_ERROR;