Skip to content

Commit 9a4cf32

Browse files
nxf58150mmahadevan108
authored andcommitted
drivers: wifi: Add WLAN wakeup for MIMXRT1060-EVK
Added wlan wakeup pin in IW610 overlay file. This WLAN wakeup support is for IW610 and MIMXRT1060-EVK acts as host. Add wakeup pin configuration when doing device related initialization. Signed-off-by: Hui Bai <[email protected]>
1 parent ca85e76 commit 9a4cf32

File tree

6 files changed

+92
-8
lines changed

6 files changed

+92
-8
lines changed

boards/shields/nxp_m2_wifi_bt/nxp_m2_2ll_wifi_bt.overlay

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
&m2_wifi_sdio {
3333
nxp_wifi {
3434
compatible = "nxp,wifi";
35+
wakeup-gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;
3536
status = "okay";
3637
};
3738
};

drivers/wifi/nxp/Kconfig.nxp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ menu "Wi-Fi driver Stack configurations"
402402

403403
config NXP_WIFI_MON_TASK_STACK_SIZE
404404
int "Mon thread stack size"
405-
depends on NXP_RW610
405+
depends on NXP_RW610 || NXP_IW610
406406
default 3072
407407
help
408408
This option specifies the size of the stack used by the mon task.
@@ -444,7 +444,7 @@ menu "Wi-Fi thread priority configurations"
444444

445445
config NXP_WIFI_MON_TASK_PRIO
446446
int "Mon task priority"
447-
depends on NXP_RW610
447+
depends on NXP_RW610 || NXP_IW610
448448
default 4
449449
help
450450
This option specifies the priority of the mon task.

drivers/wifi/nxp/nxp_wifi_drv.c

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
#include <zephyr/net/wifi_mgmt.h>
2121
#ifdef CONFIG_PM_DEVICE
2222
#include <zephyr/pm/device.h>
23+
#ifdef CONFIG_NXP_IW610
24+
#include <fsl_gpc.h>
25+
#endif
2326
#endif
2427
#ifdef CONFIG_WIFI_NM
2528
#include <zephyr/net/wifi_nm.h>
@@ -73,7 +76,7 @@ extern struct interface g_uap;
7376
extern const rtos_wpa_supp_dev_ops wpa_supp_ops;
7477
#endif
7578

76-
#if defined(CONFIG_PM_DEVICE) && defined(CONFIG_NXP_RW610)
79+
#ifdef CONFIG_PM_DEVICE
7780
extern int is_hs_handshake_done;
7881
extern int wlan_host_sleep_state;
7982
extern bool skip_hs_handshake;
@@ -2014,6 +2017,18 @@ extern void WL_MCI_WAKEUP0_DriverIRQHandler(void);
20142017
extern void WL_MCI_WAKEUP_DONE0_DriverIRQHandler(void);
20152018
#endif
20162019

2020+
#ifdef CONFIG_PM_DEVICE
2021+
#ifdef CONFIG_NXP_IW610
2022+
struct gpio_callback wakeup_callback;
2023+
2024+
static void gpio_wakeup_callback(const struct device *port, struct gpio_callback *cb,
2025+
gpio_port_pins_t pins)
2026+
{
2027+
/* TODO: Reserved for future use. */
2028+
}
2029+
#endif
2030+
#endif
2031+
20172032
static int nxp_wifi_dev_init(const struct device *dev)
20182033
{
20192034
struct nxp_wifi_dev *nxp_wifi = &nxp_wifi0;
@@ -2028,8 +2043,46 @@ static int nxp_wifi_dev_init(const struct device *dev)
20282043
#if (DT_INST_PROP(0, wakeup_source))
20292044
NXP_ENABLE_WAKEUP_SIGNAL(IMU_IRQ_N);
20302045
#endif /* DT_INST_PROP */
2031-
#endif /* CONFIG_NXP_RW610 */
2046+
#elif defined(CONFIG_NXP_IW610)
2047+
#ifdef CONFIG_PM_DEVICE
2048+
#if DT_NODE_HAS_PROP(DT_DRV_INST(0), wakeup_gpios)
2049+
int err = 0;
2050+
struct gpio_dt_spec wakeup = GPIO_DT_SPEC_GET(DT_DRV_INST(0), wakeup_gpios);
20322051

2052+
if (!gpio_is_ready_dt(&wakeup)) {
2053+
LOG_ERR("Error: failed to configure wakeup %s pin %d", wakeup.port->name,
2054+
wakeup.pin);
2055+
return -EIO;
2056+
}
2057+
2058+
/* Configure wakeup gpio as input */
2059+
err = gpio_pin_configure_dt(&wakeup, GPIO_INPUT);
2060+
if (err) {
2061+
LOG_ERR("Error %d: failed to configure wakeup %s pin %d", err,
2062+
wakeup.port->name, wakeup.pin);
2063+
return err;
2064+
}
2065+
2066+
err = gpio_pin_set_dt(&wakeup, 0);
2067+
if (err) {
2068+
return err;
2069+
}
2070+
2071+
/* Configure wakeup gpio interrupt */
2072+
err = gpio_pin_interrupt_configure_dt(&wakeup, GPIO_INT_EDGE_FALLING);
2073+
if (err) {
2074+
return err;
2075+
}
2076+
2077+
/* Set wakeup gpio callback function */
2078+
gpio_init_callback(&wakeup_callback, gpio_wakeup_callback, BIT(wakeup.pin));
2079+
err = gpio_add_callback_dt(&wakeup, &wakeup_callback);
2080+
if (err) {
2081+
return err;
2082+
}
2083+
#endif
2084+
#endif
2085+
#endif
20332086
return 0;
20342087
}
20352088

@@ -2068,7 +2121,8 @@ static int nxp_wifi_set_config(const struct device *dev, enum ethernet_config_ty
20682121
return 0;
20692122
}
20702123

2071-
#if defined(CONFIG_PM_DEVICE) && defined(CONFIG_NXP_RW610)
2124+
#ifdef CONFIG_PM_DEVICE
2125+
#ifdef CONFIG_NXP_RW610
20722126
void device_pm_dump_wakeup_source(void)
20732127
{
20742128
if (POWER_GetWakeupStatus(IMU_IRQ_N)) {
@@ -2082,6 +2136,18 @@ void device_pm_dump_wakeup_source(void)
20822136
POWER_ClearWakeupStatus(32);
20832137
}
20842138
}
2139+
#endif
2140+
2141+
static bool nxp_wifi_wlan_wakeup(void)
2142+
{
2143+
#ifdef CONFIG_NXP_RW610
2144+
return POWER_GetWakeupStatus(WL_MCI_WAKEUP0_IRQn);
2145+
#elif CONFIG_NXP_IW610
2146+
return GPC_GetIRQStatusFlag(GPC, GPIO1_Combined_0_15_IRQn);
2147+
#else
2148+
return false;
2149+
#endif
2150+
}
20852151

20862152
static int device_wlan_pm_action(const struct device *dev, enum pm_device_action pm_action)
20872153
{
@@ -2126,17 +2192,19 @@ static int device_wlan_pm_action(const struct device *dev, enum pm_device_action
21262192
/* If we are not woken up by WLAN, skip posting host sleep exit event.
21272193
* And skip host sleep handshake next time we are about to sleep.
21282194
*/
2129-
if (POWER_GetWakeupStatus(WL_MCI_WAKEUP0_IRQn)) {
2195+
if (nxp_wifi_wlan_wakeup()) {
21302196
ret = wlan_hs_send_event(HOST_SLEEP_EXIT, NULL);
21312197
if (ret != 0) {
21322198
return -EFAULT;
21332199
}
21342200
wlan_hs_hanshake_cfg(false);
21352201
} else {
2202+
LOG_INF("Wakeup by other sources");
21362203
wlan_hs_hanshake_cfg(true);
21372204
}
2138-
2205+
#ifdef CONFIG_NXP_RW610
21392206
device_pm_dump_wakeup_source();
2207+
#endif
21402208
if (wlan_host_sleep_state == HOST_SLEEP_ONESHOT) {
21412209
wlan_host_sleep_state = HOST_SLEEP_DISABLE;
21422210
wlan_hs_hanshake_cfg(false);

dts/bindings/wifi/nxp,wifi.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,12 @@ description: |
88
compatible: "nxp,wifi"
99

1010
include: [base.yaml, pinctrl-device.yaml]
11+
12+
properties:
13+
wakeup-gpios:
14+
type: phandle-array
15+
description: |
16+
WLAN wakeup host pin
17+
This pin defaults to active low when consumed by the SDK card. The
18+
property value should ensure the flags properly describ the signal
19+
that is presendted to the driver.

samples/net/wifi/shell/nxp/overlay_iw610.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,9 @@ CONFIG_ETH_DRIVER=n
7070
CONFIG_NET_TC_TX_SKIP_FOR_HIGH_PRIO=y
7171
CONFIG_NET_MGMT_THREAD_PRIORITY=3
7272
CONFIG_NXP_WIFI_DRIVER_TASK_PRIO=2
73+
74+
# power mgmt
75+
CONFIG_PM=y
76+
CONFIG_PM_DEVICE=y
77+
CONFIG_PM_LOG_LEVEL_OFF=y
78+
CONFIG_PM_DEVICE_LOG_LEVEL_OFF=y

west.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ manifest:
210210
groups:
211211
- hal
212212
- name: hal_nxp
213-
revision: 59cf3dc87b41a0e89974d215174a1ca2ab6d4ac5
213+
revision: 870b2a59e85355616e7ddc52421d86f374d5486c
214214
path: modules/hal/nxp
215215
groups:
216216
- hal

0 commit comments

Comments
 (0)