diff --git a/components/drivers/wlan/dev_wlan.c b/components/drivers/wlan/dev_wlan.c index a7029e62332..ff5b0fb3916 100644 --- a/components/drivers/wlan/dev_wlan.c +++ b/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 @@ -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); diff --git a/components/drivers/wlan/dev_wlan.h b/components/drivers/wlan/dev_wlan.h index d20487394eb..7b188d684a3 100644 --- a/components/drivers/wlan/dev_wlan.h +++ b/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 diff --git a/components/drivers/wlan/dev_wlan_mgnt.c b/components/drivers/wlan/dev_wlan_mgnt.c index 124496aae26..bc43980357f 100644 --- a/components/drivers/wlan/dev_wlan_mgnt.c +++ b/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 @@ -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;