Skip to content

Commit e4087f6

Browse files
committed
drivers: wifi: Add WLAN wakeup for EVKC1060
Added wlan wakeup pin in EVKC1060 dts file. This WLAN wakeup support is for IW610 and EVKC1060 acts as host. Add wakeup pin configuration when doing device related initialization. Signed-off-by: Hui Bai <[email protected]>
1 parent f4a0beb commit e4087f6

File tree

6 files changed

+91
-8
lines changed

6 files changed

+91
-8
lines changed

boards/nxp/mimxrt1060_evk/mimxrt1060_evk.dtsi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,11 @@ zephyr_uhc1: &usbh2 {
256256
disk-name = "SD";
257257
status = "okay";
258258
};
259+
nxp_wifi {
260+
compatible = "nxp,wifi";
261+
wakeup-gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;
262+
status = "okay";
263+
};
259264
};
260265

261266
&edma0 {

drivers/wifi/nxp/Kconfig.nxp

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

397397
config NXP_WIFI_MON_TASK_STACK_SIZE
398398
int "Mon thread stack size"
399-
depends on NXP_RW610
399+
depends on NXP_RW610 || NXP_IW610
400400
default 3072
401401
help
402402
This option specifies the size of the stack used by the mon task.
@@ -438,7 +438,7 @@ menu "Wi-Fi thread priority configurations"
438438

439439
config NXP_WIFI_MON_TASK_PRIO
440440
int "Mon task priority"
441-
depends on NXP_RW610
441+
depends on NXP_RW610 || NXP_IW610
442442
default 4
443443
help
444444
This option specifies the priority of the mon task.

drivers/wifi/nxp/nxp_wifi_drv.c

Lines changed: 68 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;
@@ -1989,6 +1992,14 @@ extern void WL_MCI_WAKEUP0_DriverIRQHandler(void);
19891992
extern void WL_MCI_WAKEUP_DONE0_DriverIRQHandler(void);
19901993
#endif
19911994

1995+
struct gpio_callback wakeup_callback;
1996+
1997+
static void gpio_wakeup_callback(const struct device *port, struct gpio_callback *cb,
1998+
gpio_port_pins_t pins)
1999+
{
2000+
// TODO: Reserved for future use.
2001+
}
2002+
19922003
static int nxp_wifi_dev_init(const struct device *dev)
19932004
{
19942005
struct nxp_wifi_dev *nxp_wifi = &nxp_wifi0;
@@ -2000,11 +2011,49 @@ static int nxp_wifi_dev_init(const struct device *dev)
20002011
#ifdef CONFIG_NXP_RW610
20012012
IRQ_CONNECT(IMU_IRQ_N, IMU_IRQ_P, WL_MCI_WAKEUP0_DriverIRQHandler, 0, 0);
20022013
irq_enable(IMU_IRQ_N);
2003-
IRQ_CONNECT(IMU_WAKEUP_IRQ_N, IMU_WAKEUP_IRQ_P, WL_MCI_WAKEUP_DONE0_DriverIRQHandler, 0, 0);
2014+
IRQ_CONNECT(IMU_WAKEUP_IRQ_N, IMU_WAKEUP_IRQ_P,
2015+
WL_MCI_WAKEUP_DONE0_DriverIRQHandler, 0, 0);
20042016
irq_enable(IMU_WAKEUP_IRQ_N);
20052017
#if (DT_INST_PROP(0, wakeup_source))
20062018
EnableDeepSleepIRQ(IMU_IRQ_N);
20072019
#endif
2020+
#else
2021+
#if DT_NODE_HAS_PROP(DT_DRV_INST(0), wakeup_gpios)
2022+
int err = 0;
2023+
2024+
struct gpio_dt_spec wakeup = GPIO_DT_SPEC_GET(DT_DRV_INST(0), wakeup_gpios);
2025+
if (!gpio_is_ready_dt(&wakeup)) {
2026+
LOG_ERR("Error: failed to configure wakeup %s pin %d", wakeup.port->name,
2027+
wakeup.pin);
2028+
return -EIO;
2029+
}
2030+
2031+
/* Configure wakeup gpio as input */
2032+
err = gpio_pin_configure_dt(&wakeup, GPIO_INPUT);
2033+
if(err) {
2034+
LOG_ERR("Error %d: failed to configure wakeup %s pin %d", err,
2035+
wakeup.port->name, wakeup.pin);
2036+
return err;
2037+
}
2038+
2039+
err = gpio_pin_set_dt(&wakeup, 0);
2040+
if (err) {
2041+
return err;
2042+
}
2043+
2044+
/* Configure wakeup gpio interrupt */
2045+
err = gpio_pin_interrupt_configure_dt(&wakeup, GPIO_INT_EDGE_FALLING);
2046+
if (err) {
2047+
return err;
2048+
}
2049+
2050+
/* Set wakeup gpio callback function */
2051+
gpio_init_callback(&wakeup_callback, gpio_wakeup_callback, BIT(wakeup.pin));
2052+
err = gpio_add_callback_dt(&wakeup, &wakeup_callback);
2053+
if (err) {
2054+
return err;
2055+
}
2056+
#endif
20082057
#endif
20092058

20102059
return 0;
@@ -2045,7 +2094,8 @@ static int nxp_wifi_set_config(const struct device *dev, enum ethernet_config_ty
20452094
return 0;
20462095
}
20472096

2048-
#if defined(CONFIG_PM_DEVICE) && defined(CONFIG_NXP_RW610)
2097+
#ifdef CONFIG_PM_DEVICE
2098+
#ifdef CONFIG_NXP_RW610
20492099
void device_pm_dump_wakeup_source(void)
20502100
{
20512101
if (POWER_GetWakeupStatus(IMU_IRQ_N)) {
@@ -2059,6 +2109,18 @@ void device_pm_dump_wakeup_source(void)
20592109
POWER_ClearWakeupStatus(32);
20602110
}
20612111
}
2112+
#endif
2113+
2114+
static bool nxp_wifi_wlan_wakeup(void)
2115+
{
2116+
#ifdef CONFIG_NXP_RW610
2117+
return POWER_GetWakeupStatus(WL_MCI_WAKEUP0_IRQn);
2118+
#elif CONFIG_NXP_IW610
2119+
return GPC_GetIRQStatusFlag(GPC, GPIO1_Combined_0_15_IRQn);
2120+
#else
2121+
return false;
2122+
#endif
2123+
}
20622124

20632125
static int device_wlan_pm_action(const struct device *dev, enum pm_device_action pm_action)
20642126
{
@@ -2103,7 +2165,7 @@ static int device_wlan_pm_action(const struct device *dev, enum pm_device_action
21032165
/* If we are not woken up by WLAN, skip posting host sleep exit event.
21042166
* And skip host sleep handshake next time we are about to sleep.
21052167
*/
2106-
if (POWER_GetWakeupStatus(WL_MCI_WAKEUP0_IRQn)) {
2168+
if (nxp_wifi_wlan_wakeup()) {
21072169
ret = wlan_hs_send_event(HOST_SLEEP_EXIT, NULL);
21082170
if (ret != 0) {
21092171
return -EFAULT;
@@ -2112,8 +2174,9 @@ static int device_wlan_pm_action(const struct device *dev, enum pm_device_action
21122174
} else {
21132175
wlan_hs_hanshake_cfg(true);
21142176
}
2115-
2177+
#ifdef CONFIG_NXP_RW610
21162178
device_pm_dump_wakeup_source();
2179+
#endif
21172180
if (wlan_host_sleep_state == HOST_SLEEP_ONESHOT) {
21182181
wlan_host_sleep_state = HOST_SLEEP_DISABLE;
21192182
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/boards/mimxrt1060_evk_mimxrt1062_qspi_C.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,9 @@ CONFIG_SPEED_OPTIMIZATIONS=y
4444

4545
# comment out for -O0
4646
CONFIG_CODE_DATA_RELOCATION_SRAM=y
47+
48+
# power mgmt
49+
CONFIG_PM=y
50+
CONFIG_PM_DEVICE=y
51+
CONFIG_PM_LOG_LEVEL_OFF=y
52+
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: 111f568bda6f119cd896f38ae5843ecde92039bd
213+
revision: pull/566/head
214214
path: modules/hal/nxp
215215
groups:
216216
- hal

0 commit comments

Comments
 (0)