QSPI Interface Connection issue with NRF7002EB + NRF52840

Hi all 

I’m having a horrible time trying to get an nRF7002EB Wi-Fi coprocessor working with a nRF52840 via QSPI interface in nRF Connect SDK 3.0.2 (Zephyr 4.0.99). I'm using a Seeed studio xiao NRF52840 board in the interim until my NRF5340 lands. I trusted this to be OK given the NRF52840 is allegedly a supported platform for the NRF7002, and as per other posts (1, 2, 3...).

Despite configuring the device tree overlay and Kconfig settings to what I believe are reasonable values, the nRF7002 is not detected in the device list shell command or in the scan example (below are the logs)

[00:00:00.287,200] <err> net_if: There is no network interface to work with!
*** Booting nRF Connect SDK v3.0.2-89ba1294ac9b ***
*** Using Zephyr OS v4.0.99-f791c49f492c ***
Wi-Fi Scan Example...
Initializing event callback...
Adding event callback...
Sleeping for 1 second...
[00:00:00.290,985] <inf> usb_cdc_acm: Device suspended
[00:00:00.390,350] <inf> usb_cdc_acm: Device resumed
[00:00:00.490,142] <inf> usb_cdc_acm: Device configured
Starting xiao_ble with CPU frequency: 64 MHz
[00:00:01.290,740] <inf> scan: Checking if MAC address is set...
[00:00:01.291,381] <wrn> net_if: No default interface found!
[00:00:01.292,297] <wrn> net_if: No default interface found!
[00:00:01.293,212] <inf> scan: Setting local MAC address...
[00:00:01.294,097] <inf> scan: Parsing MAC address... F6:CE:36:00:00:01
[00:00:01.294,860] <inf> scan: Setting MAC address... F6:CE:36:00:00:01
ASSERTION FAIL [iface] @ WEST_TOPDIR/zep%                                                                  
➜ scan (master) ✗ 

I’ve triple-checked hardware connections, including manual tests on SPI and GPIO pins, and tested with two nRF7002EB modules (surely both cannot have failed), so I believe the issue is a zephyr-specific configuration problem. I’m out of ideas and would appreciate any insights on what I’m missing.

One thing I was aware of is the QSPI port offering an optional flash chip on the Seeed studio platform, so I ensured I explicitly set that dt property as disabled. 

Can anyone point me in the right direction as it's reached a point where i'm going around in circles and I do want to get this working on an NRF52840 to support an existing board... Below is my device tree overlay, the compiled zephyr.dts and the main.c

Git repo to problematic wifi scan codebase: https://github.com/rsispal/nrf7002eb-nrf52840-scan

PINOUTS:

# Connection Table

| Colour | NRF52840 Pin | NRF52840 Pin Name | NRF7002EB Pin | NRF7002EB Pin Name | Function                                |
| :----: | :----------: | :---------------: | :-----------: | :----------------: | :-------------------------------------- |
| ORANGE |    P1.13     |        D8         |       1       |        CLK         | QSPI Clock / SPI Clock                  |
| GREEN  |    P1.12     |        D7         |       2       |         CS         | QSPI slave select / SPI slave select    |
|  BLUE  |    P1.15     |        D10        |       3       |         D0         | QSPI DATA0 / SPI_MOSI                   |
| YELLOW |    P1.14     |        D9         |       4       |         D1         | QSPI DATA1 / SPI_MISO                   |
| WHITE  |    P0.02     |        D0         |       5       |         D2         | QSPI DATA2                              |
| PURPLE |    P0.03     |        D1         |       6       |         D3         | QSPI DATA3                              |
|   -    |      -       |         -         |       7       |        CT0         | SW1_CTRL0 (not supported on nRF7002 EB) |
|   -    |              |         -         |       8       |        ST1         | Coexistence interface priority signal   |
|  RED   |      -       |         -         |      10       |        VBAT        | Supply voltage (3v3)                    |
| BLACK  |      -       |         -         |      11       |        GND         | Ground                                  |
|  RED   |      -       |         -         |      12       |        VIO         | IO Supply voltage (1.8v)                |
| ORANGE |    P0.28     |        D2         |      13       |        ST0         | Coexistence interface status signal     |
| BROWN  |    P0.29     |        D3         |      14       |         EN         | Power enable signal                     |
| YELLOW |    P0.04     |        D4         |      15       |        REQ         | Coexistence interface request signal    |
| GREEN  |    P0.05     |        D5         |      16       |        GRT         | Coexistence interface grant signal      |
|  GREY  |    P1.11     |        D6         |      17       |        IRQ         | Host interrupt signal                   |

NRF7002EB Pinouts:

| Pin | Signal name | Function                                                                                 |
| :-: | :---------: | :--------------------------------------------------------------------------------------- |
|  1  |     CLK     | QSPI Clock / SPI Clock                                                                   |
|  2  |     CS      | QSPI slave select / SPI slave select                                                     |
|  3  |     D0      | QSPI DATA0 / SPI_MOSI                                                                    |
|  4  |     D1      | QSPI DATA1 / SPI_MISO                                                                    |
|  5  |     D2      | QSPI DATA2                                                                               |
|  6  |     D3      | QSPI DATA3                                                                               |
|  7  |     CT0     | SW1_CTRL0 (not supported on nRF7002 EB)                                                  |
|  8  |     ST1     | Coexistence interface priority signal (only applicable for 4-wire coexistence interface) |
| 10  |    VBAT     | Supply voltage                                                                           |
| 11  |     GND     | Ground                                                                                   |
| 12  |     VIO     | IO Supply voltage                                                                        |
| 13  |     ST0     | Coexistence interface status signal                                                      |
| 14  |     EN      | Power enable signal                                                                      |
| 15  |     REQ     | Coexistence interface request signal                                                     |
| 16  |     GRT     | Coexistence interface grant signal                                                       |
| 17  |     IRQ     | Host interrupt signal                                                                    |

nrf/samples/wifi/scan/main.cpp (with some additional logging and minor changes to allow compilation):

/*
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

/** @file
 * @brief WiFi scan sample
 */

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(scan, CONFIG_LOG_DEFAULT_LEVEL);

#include <zephyr/kernel.h>
#include <stdio.h>
#include <stdlib.h>
#include <zephyr/shell/shell.h>
#include <zephyr/sys/printk.h>
#include <zephyr/init.h>

#include <zephyr/net/net_if.h>
#include <zephyr/net/wifi_mgmt.h>
#include <zephyr/net/wifi_utils.h>
#include <zephyr/net/net_event.h>
#include <zephyr/net/ethernet.h>
#include <zephyr/net/ethernet_mgmt.h>

#include "net_private.h"

#define WIFI_SHELL_MODULE "wifi"

#ifdef CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS_ONLY
#define WIFI_SHELL_MGMT_EVENTS (NET_EVENT_WIFI_RAW_SCAN_RESULT |                \
				NET_EVENT_WIFI_SCAN_DONE)
#else
#define WIFI_SHELL_MGMT_EVENTS (NET_EVENT_WIFI_SCAN_RESULT |		\
				NET_EVENT_WIFI_SCAN_DONE |		\
				NET_EVENT_WIFI_RAW_SCAN_RESULT)
#endif
#define SCAN_TIMEOUT_MS 10000

static uint32_t scan_result;

const struct wifi_scan_params tests[] = {
#ifdef CONFIG_WIFI_SCAN_PROFILE_DEFAULT
	{
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_ACTIVE
	{
	.scan_type = WIFI_SCAN_TYPE_ACTIVE,
	.dwell_time_active = CONFIG_WIFI_SCAN_DWELL_TIME_ACTIVE
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_PASSIVE
	{
	.scan_type = WIFI_SCAN_TYPE_PASSIVE,
	.dwell_time_passive = CONFIG_WIFI_SCAN_DWELL_TIME_PASSIVE
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_2_4GHz_ACTIVE
	{
	.scan_type = WIFI_SCAN_TYPE_ACTIVE,
	.bands = 0
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_2_4GHz_PASSIVE
	{
	.scan_type = WIFI_SCAN_TYPE_PASSIVE,
	.bands = 0
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_5GHz_ACTIVE
	{
	.scan_type = WIFI_SCAN_TYPE_ACTIVE,
	.bands = 0
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_5GHz_PASSIVE
	{
	.scan_type = WIFI_SCAN_TYPE_PASSIVE,
	.bands = 0
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_2_4GHz_NON_OVERLAP_CHAN
	{
	.bands = 0,
	.chan = { {0, 0} }
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_5GHz_NON_DFS_CHAN
	{
	.bands = 0,
	.chan = { {0, 0} }
	},
#endif
#ifdef CONFIG_WIFI_SCAN_PROFILE_2_4GHz_NON_OVERLAP_AND_5GHz_NON_DFS_CHAN
	{
	.bands = 0,
	.chan = { {0, 0} }
	},
#endif
};

static struct net_mgmt_event_callback wifi_shell_mgmt_cb;

K_SEM_DEFINE(scan_sem, 0, 1);

#if defined CONFIG_WIFI_NRF70_SKIP_LOCAL_ADMIN_MAC
static bool local_mac_check(const uint8_t *const mac)
{
return ((mac[0] & 0x02) ||
((mac[0] == 0x00) && (mac[1] == 0x00) && (mac[2] == 0x5E)));
}
#endif /* CONFIG_WIFI_NRF70_SKIP_LOCAL_ADMIN_MAC */

static void handle_wifi_scan_result(struct net_mgmt_event_callback *cb)
{
	const struct wifi_scan_result *entry =
		(const struct wifi_scan_result *)cb->info;
	uint8_t mac_string_buf[sizeof("xx:xx:xx:xx:xx:xx")];
	uint8_t ssid_print[WIFI_SSID_MAX_LEN + 1];

	scan_result++;

	if (scan_result == 1U) {
		printk("%-4s | %-32s %-5s | %-4s | %-4s | %-5s | %s\n",
		       "Num", "SSID", "(len)", "Chan", "RSSI", "Security", "BSSID");
	}

	strncpy(ssid_print, entry->ssid, sizeof(ssid_print) - 1);
	ssid_print[sizeof(ssid_print) - 1] = '\0';

#if defined CONFIG_WIFI_NRF70_SKIP_LOCAL_ADMIN_MAC
	__ASSERT(!local_mac_check(entry->mac), "Locally administered MAC found: %s\n", ssid_print);
#endif /* CONFIG_WIFI_NRF70_SKIP_LOCAL_ADMIN_MAC */

	printk("%-4d | %-32s %-5u | %-4u | %-4d | %-5s | %s\n",
	       scan_result, ssid_print, entry->ssid_length,
	       entry->channel, entry->rssi,
	       wifi_security_txt(entry->security),
	       ((entry->mac_length) ?
			net_sprint_ll_addr_buf(entry->mac, WIFI_MAC_ADDR_LEN, mac_string_buf,
						sizeof(mac_string_buf)) : ""));
}

#ifdef CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS
static int wifi_freq_to_channel(int frequency)
{
	int channel = 0;

	if (frequency == 2484) { /* channel 14 */
		channel = 14;
	} else if ((frequency <= 2472) && (frequency >= 2412)) {
		channel = ((frequency - 2412) / 5) + 1;
	} else if ((frequency <= 5895) && (frequency >= 5180)) {
		channel = ((frequency - 5000) / 5);
	} else {
		channel = frequency;
	}

	return channel;
}

static enum wifi_frequency_bands wifi_frequency_to_band(int frequency)
{
	enum wifi_frequency_bands band = WIFI_FREQ_BAND_2_4_GHZ;

	if ((frequency  >= 2401) && (frequency <= 2495)) {
		band = WIFI_FREQ_BAND_2_4_GHZ;
	} else if ((frequency  >= 5170) && (frequency <= 5895)) {
		band = WIFI_FREQ_BAND_5_GHZ;
	}

	return band;
}

static void handle_raw_scan_result(struct net_mgmt_event_callback *cb)
{
	struct wifi_raw_scan_result *raw =
		(struct wifi_raw_scan_result *)cb->info;
	int channel;
	int band;
	int rssi;
	int i = 0;
	int raw_scan_size = raw->frame_length;
	uint8_t mac_string_buf[sizeof("xx:xx:xx:xx:xx:xx")];

	scan_result++;

	if (scan_result == 1U) {
		printk("%-4s | %-13s | %-4s |  %-15s | %-15s | %-32s\n",
		      "Num", "Channel (Band)", "RSSI", "BSSID", "Frame length", "Frame Body");
	}

	rssi = raw->rssi;
	channel = wifi_freq_to_channel(raw->frequency);
	band = wifi_frequency_to_band(raw->frequency);

	printk("%-4d | %-4u (%-6s) | %-4d | %s |      %-4d        ",
	      scan_result, channel,
	      wifi_band_txt(band),
	      rssi,
	      net_sprint_ll_addr_buf(raw->data + 10, WIFI_MAC_ADDR_LEN, mac_string_buf,
				     sizeof(mac_string_buf)), raw_scan_size);

	if (raw->frame_length > CONFIG_WIFI_MGMT_RAW_SCAN_RESULT_LENGTH) {
		raw_scan_size = CONFIG_WIFI_MGMT_RAW_SCAN_RESULT_LENGTH;
	}

	if (raw_scan_size) {
		for (i = 0; i < 32; i++) {
			printk("%02X ", *(raw->data + i));
		}
	}

	printk("\n");
}
#endif

static void handle_wifi_scan_done(struct net_mgmt_event_callback *cb)
{
	const struct wifi_status *status =
		(const struct wifi_status *)cb->info;

	if (status->status) {
		LOG_ERR("Scan request failed (%d)", status->status);
	} else {
		printk("Scan request done\n");
	}

	scan_result = 0U;
	k_sem_give(&scan_sem);
}

static void wifi_mgmt_event_handler(struct net_mgmt_event_callback *cb,
				     uint32_t mgmt_event, struct net_if *iface)
{
	switch (mgmt_event) {
	case NET_EVENT_WIFI_SCAN_RESULT:
		handle_wifi_scan_result(cb);
		break;
#ifdef CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS
	case NET_EVENT_WIFI_RAW_SCAN_RESULT:
		handle_raw_scan_result(cb);
		break;
#endif
	case NET_EVENT_WIFI_SCAN_DONE:
		handle_wifi_scan_done(cb);
		break;
	default:
		break;
	}
}

static int wifi_scan(void)
{
	struct net_if *iface = net_if_get_default();
	int band_str_len;

	struct wifi_scan_params params = tests[0];

	band_str_len = sizeof(CONFIG_WIFI_SCAN_BANDS_LIST);
	if (band_str_len - 1) {
		char *buf = malloc(band_str_len);

		if (!buf) {
			LOG_ERR("Malloc Failed");
			return -EINVAL;
		}
		strcpy(buf, CONFIG_WIFI_SCAN_BANDS_LIST);
		if (wifi_utils_parse_scan_bands(buf, &params.bands)) {
			LOG_ERR("Incorrect value(s) in CONFIG_WIFI_SCAN_BANDS_LIST: %s",
					CONFIG_WIFI_SCAN_BANDS_LIST);
			free(buf);
			return -ENOEXEC;
		}
		free(buf);
	}

	if (sizeof(CONFIG_WIFI_SCAN_CHAN_LIST) - 1) {
		if (wifi_utils_parse_scan_chan(CONFIG_WIFI_SCAN_CHAN_LIST,
						params.band_chan, ARRAY_SIZE(params.band_chan))) {
			LOG_ERR("Incorrect value(s) in CONFIG_WIFI_SCAN_CHAN_LIST: %s",
					CONFIG_WIFI_SCAN_CHAN_LIST);
			return -ENOEXEC;
		}
	}

	if (net_mgmt(NET_REQUEST_WIFI_SCAN, iface, &params,
			sizeof(struct wifi_scan_params))) {
		LOG_ERR("Scan request failed");
		return -ENOEXEC;
	}

	printk("Scan requested\n");

	k_sem_take(&scan_sem, K_MSEC(SCAN_TIMEOUT_MS));

	return 0;
}

static bool is_mac_addr_set(struct net_if *iface)
{
	struct net_linkaddr *linkaddr = net_if_get_link_addr(iface);
	struct net_eth_addr wifi_addr;

	if (!linkaddr || linkaddr->len != WIFI_MAC_ADDR_LEN) {
		return false;
	}

	memcpy(wifi_addr.addr, linkaddr->addr, WIFI_MAC_ADDR_LEN);

	return net_eth_is_addr_valid(&wifi_addr);
}


int main(void)
{
	printk("Wi-Fi Scan Example...\n");
	scan_result = 0U;

	printk("Initializing event callback...\n");
	net_mgmt_init_event_callback(&wifi_shell_mgmt_cb,
				     wifi_mgmt_event_handler,
				     WIFI_SHELL_MGMT_EVENTS);

	printk("Adding event callback...\n");
	net_mgmt_add_event_callback(&wifi_shell_mgmt_cb);

	printk("Sleeping for 1 second...\n");
	k_sleep(K_SECONDS(1));
	printk("Starting %s with CPU frequency: %d MHz\n", CONFIG_BOARD, SystemCoreClock / MHZ(1));
	LOG_INF("Checking if MAC address is set...");
	if (!is_mac_addr_set(net_if_get_default())) {
		struct net_if *iface = net_if_get_default();
		int ret;
		struct ethernet_req_params params;

		/* Set a local MAC address with Nordic OUI */
		LOG_INF("Setting local MAC address...");
		if (net_if_is_admin_up(iface)) {
			LOG_INF("Bringing down iface...");
			ret = net_if_down(iface);
			if (ret < 0 && ret != -EALREADY) {
				LOG_ERR("Cannot bring down iface (%d)", ret);
				return ret;
			}
		}

		LOG_INF("Parsing MAC address... %s", CONFIG_WIFI_MAC_ADDRESS);
		ret = net_bytes_from_str(params.mac_address.addr, sizeof(CONFIG_WIFI_MAC_ADDRESS),
					 CONFIG_WIFI_MAC_ADDRESS);
		if (ret) {
			LOG_ERR("Failed to parse MAC address: %s (%d)",
				CONFIG_WIFI_MAC_ADDRESS, ret);
			return ret;
		}

		// wifi_set_mac_address();


		LOG_INF("Setting MAC address... %s", net_sprint_ll_addr(params.mac_address.addr, sizeof(params.mac_address.addr)));
		// This didn't work...
		// net_mgmt(NET_REQUEST_ETHERNET_SET_MAC_ADDRESS, iface,
		// 	 &params, sizeof(params));
		ret = net_if_set_link_addr(iface, params.mac_address.addr, 6, NET_LINK_IEEE802154);
		printk("ret: %d\n", ret);

		if (ret) {
			LOG_ERR("Failed to set MAC address: %d", ret);
			return ret;
		}
		LOG_INF("MAC address set: %s", net_sprint_ll_addr(params.mac_address.addr, sizeof(params.mac_address.addr)));

		LOG_INF("Bringing up iface...");
		ret = net_if_up(iface);
		if (ret < 0 && ret != -EALREADY) {
			LOG_ERR("Cannot bring up iface (%d)", ret);
			return ret;
		}

		LOG_INF("OTP not programmed, proceeding with local MAC: %s", net_sprint_ll_addr(
							net_if_get_link_addr(iface)->addr,
							net_if_get_link_addr(iface)->len));
	}
	LOG_INF("Bringing up iface...");
	while (1) {
		LOG_INF("Scanning for WiFi networks...");
		wifi_scan();
		LOG_INF("Sleeping for %d seconds...", CONFIG_WIFI_SCAN_INTERVAL_S);
		k_sleep(K_SECONDS(CONFIG_WIFI_SCAN_INTERVAL_S));
	}
	LOG_INF("Exiting...");
	return 0;
}

boards/xiao_ble overlay:

// /* seeed_xiao_ble.overlay */

// &spi2 {
//     compatible = "nordic,nrf-spim";
//     status = "okay";

//     pinctrl-0 = <&spi2_default>;
//     pinctrl-1 = <&spi2_sleep>;
//     pinctrl-names = "default", "sleep";

//     cs-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>; // P1.12 -> D7 -> Green (CS)
// };

/*
 * Device tree overlay for nRF7002EB on Seeed Studio XIAO nRF52840 via QSPI
 * nRF Connect SDK 3.0.2
 * Pinout based on user's physical connections
 */
#include <freq.h>

/ {
    // chosen {
    //     zephyr,wifi = &wlan0;
    // };
    
    // /* WLAN node that the nRF70 driver expects */
    // wlan0: wlan0 {
    //     compatible = "nordic,wlan";
    // };

    nrf_radio_coex: nrf7002-coex {
        status = "okay";
        compatible = "nordic,nrf700x-coex";
        req-gpios = <&gpio0 4 GPIO_ACTIVE_HIGH>;
        status0-gpios = <&gpio0 5 GPIO_ACTIVE_HIGH>;  /* Changed from P0.28 to avoid QSPI conflict */
        grant-gpios = <&gpio0 28 GPIO_ACTIVE_LOW>;   /* Changed from P0.5 to avoid QSPI conflict */
    };
};

&i2c1 {
    status = "disabled";
};

&spi2 {
    status = "disabled";
};

&pinctrl {
    /* Corrected QSPI pins to match connection table */
    qspi_default: qspi_default {
        group1 {
            psels = <NRF_PSEL(QSPI_SCK, 1, 13)>,  /* P1.13 (D8, orange) - CLK pin  */
                    <NRF_PSEL(QSPI_IO0, 1, 15)>,  /* P1.15 (D10, blue) - D0 pin  */
                    <NRF_PSEL(QSPI_IO1, 1, 14)>,  /* P1.14 (D9, yellow) - D1 pin  */
                    <NRF_PSEL(QSPI_IO2, 0, 2)>,   /* P0.02 (D0, white) - D2 pin  */
                    <NRF_PSEL(QSPI_IO3, 0, 3)>;   /* P0.03 (D1, purple) - D3 pin  */
        };
        group2 {
            psels = <NRF_PSEL(QSPI_CSN, 1, 12)>;  /* P1.12 (D7, green) - CS pin  */
        };
    };
    
    qspi_sleep: qspi_sleep {
        group1 {
            psels = <NRF_PSEL(QSPI_SCK, 1, 13)>,  /* P1.13 (D8, orange) - CLK pin  */
                    <NRF_PSEL(QSPI_IO0, 1, 15)>,  /* P1.15 (D10, blue) - D0 pin  */
                    <NRF_PSEL(QSPI_IO1, 1, 14)>,  /* P1.14 (D9, yellow) - D1 pin  */
                    <NRF_PSEL(QSPI_IO2, 0, 2)>,   /* P0.02 (D0, white) - D2 pin  */
                    <NRF_PSEL(QSPI_IO3, 0, 3)>;   /* P0.03 (D1, purple) - D3 pin  */
            low-power-enable;
        };
        group2 {
            psels = <NRF_PSEL(QSPI_CSN, 1, 12)>;
            low-power-enable;
            bias-pull-up;
        };
    };
};

&qspi {
    status = "okay";
    pinctrl-0 = <&qspi_default>;
    pinctrl-1 = <&qspi_sleep>;
    pinctrl-names = "default", "sleep";
    
    /* Disable flash chip option to free up QSPI bus for nRF7002 */
    /delete-node/ p25q16h@0;
    nrf700x: nrf7002@0 {
        status = "okay";
        compatible = "nordic,nrf700x-qspi";
        reg = <0>;
        sck-frequency = <24000000>;  /* Fixed: was qspi-frequency */
        quad-mode;                   /* Added: required for QSPI */
        
        /* Wi-Fi Pins used */
        host-irq-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>; /* P1.11 (D6, grey) - IRQ pin 15 */
        iovdd-ctrl-gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; /* P0.29 (D3, brown) - EN pin 14 */
        
        /* Remove bucken-gpios since it's preconnected on NRF7002EB */
        /delete-property/ bucken-gpios;
        
        /* Required WiFi power properties */
        wifi-max-tx-pwr-2g-dsss = <21>;
        wifi-max-tx-pwr-2g-mcs0 = <21>;
        wifi-max-tx-pwr-2g-mcs7 = <21>;
        wifi-max-tx-pwr-5g-low-mcs0 = <21>;
        wifi-max-tx-pwr-5g-low-mcs7 = <21>;
        wifi-max-tx-pwr-5g-mid-mcs0 = <21>;
        wifi-max-tx-pwr-5g-mid-mcs7 = <21>;
        wifi-max-tx-pwr-5g-high-mcs0 = <21>;
        wifi-max-tx-pwr-5g-high-mcs7 = <21>;
    };
};

boards/xiao_ble.conf

#
# Copyright (c) 2023 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

# Consumes more memory, so, disable for now
CONFIG_WIFI_CREDENTIALS=n
CONFIG_FLASH=n
CONFIG_NVS=n
CONFIG_SETTINGS=n
CONFIG_NRF_WIFI_CTRL_HEAP_SIZE=20000
CONFIG_NRF_WIFI_DATA_HEAP_SIZE=40000
CONFIG_LOG_BUFFER_SIZE=2048
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_OVERRIDE_LEVEL=3
CONFIG_LOG=y
CONFIG_PRINTK=y
CONFIG_LOG_PRINTK=y
CONFIG_LOG_MODE_IMMEDIATE=y

# Additional configurations for nRF70
CONFIG_NRF_WIFI_IF_AUTO_START=y

prj.conf:

#
# Copyright (c) 2022 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
CONFIG_WIFI=y
CONFIG_WIFI_NRF70=y
CONFIG_NET_L2_ETHERNET_MGMT=y
CONFIG_NET_L2_WIFI_MGMT=y
CONFIG_HEAP_MEM_POOL_SIZE=25000
CONFIG_HEAP_MEM_POOL_IGNORE_MIN=y

# System settings
CONFIG_ASSERT=y

# Networking
CONFIG_NETWORKING=y
CONFIG_NET_BUF_RX_COUNT=1
CONFIG_NET_BUF_TX_COUNT=1
CONFIG_NET_L2_ETHERNET=y
CONFIG_NET_NATIVE=y
CONFIG_NET_OFFLOAD=y

CONFIG_INIT_STACKS=y

# Memories
CONFIG_MAIN_STACK_SIZE=5200

# Debugging
CONFIG_STACK_SENTINEL=y
CONFIG_DEBUG_COREDUMP=y
CONFIG_DEBUG_COREDUMP_BACKEND_LOGGING=y
CONFIG_DEBUG_COREDUMP_MEMORY_DUMP_MIN=y

# Logging
CONFIG_LOG=y
CONFIG_PRINTK=y
# If below config is enabled, printk logs are
# buffered. For unbuffered messages, disable this.
# CONFIG_LOG_PRINTK=n

# printing of scan results puts pressure on queues in new locking
# design in net_mgmt. So, use a higher timeout for a crowded
# environment.
CONFIG_NET_MGMT_EVENT_QUEUE_TIMEOUT=5000

# Raw scan Options
CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS=n
CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS_ONLY=n

CONFIG_WIFI_SCAN_DWELL_TIME_ACTIVE=50
CONFIG_WIFI_SCAN_DWELL_TIME_PASSIVE=130

# Debug configurations for WiFi
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_WIFI_LOG_LEVEL_DBG=y
CONFIG_NET_LOG=y

Compiled zephyr.dts:

/dts-v1/;

/ {
	#address-cells = < 0x1 >;
	#size-cells = < 0x1 >;
	model = "Seeed XIAO BLE";
	compatible = "seeed,xiao-ble";
	chosen {
		zephyr,bt-hci = &bt_hci_sdc;
		zephyr,entropy = &cryptocell;
		zephyr,flash-controller = &flash_controller;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &code_partition;
		zephyr,ieee802154 = &ieee802154;
		zephyr,console = &board_cdc_acm_uart;
		zephyr,shell-uart = &board_cdc_acm_uart;
		zephyr,uart-mcumgr = &board_cdc_acm_uart;
		zephyr,bt-mon-uart = &board_cdc_acm_uart;
		zephyr,bt-c2h-uart = &board_cdc_acm_uart;
		zephyr,wifi = &wlan0;
	};
	aliases {
		led0 = &led0;
		led1 = &led1;
		led2 = &led2;
		pwm-led0 = &pwm_led0;
		bootloader-led0 = &led0;
		mcuboot-led0 = &led0;
		watchdog0 = &wdt0;
	};
	soc {
		#address-cells = < 0x1 >;
		#size-cells = < 0x1 >;
		compatible = "nordic,nrf52840-qiaa", "nordic,nrf52840", "nordic,nrf52", "simple-bus";
		interrupt-parent = < &nvic >;
		ranges;
		nvic: interrupt-controller@e000e100 {
			#address-cells = < 0x1 >;
			compatible = "arm,v7m-nvic";
			reg = < 0xe000e100 0xc00 >;
			interrupt-controller;
			#interrupt-cells = < 0x2 >;
			arm,num-irq-priority-bits = < 0x3 >;
			phandle = < 0x1 >;
		};
		systick: timer@e000e010 {
			compatible = "arm,armv7m-systick";
			reg = < 0xe000e010 0x10 >;
			status = "disabled";
		};
		ficr: ficr@10000000 {
			compatible = "nordic,nrf-ficr";
			reg = < 0x10000000 0x1000 >;
			#nordic,ficr-cells = < 0x1 >;
			status = "okay";
		};
		uicr: uicr@10001000 {
			compatible = "nordic,nrf-uicr";
			reg = < 0x10001000 0x1000 >;
			status = "okay";
			gpio-as-nreset;
		};
		sram0: memory@20000000 {
			compatible = "mmio-sram";
			reg = < 0x20000000 0x40000 >;
		};
		clock: clock@40000000 {
			compatible = "nordic,nrf-clock";
			reg = < 0x40000000 0x1000 >;
			interrupts = < 0x0 0x1 >;
			status = "okay";
		};
		power: power@40000000 {
			compatible = "nordic,nrf-power";
			reg = < 0x40000000 0x1000 >;
			interrupts = < 0x0 0x1 >;
			status = "okay";
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			gpregret1: gpregret1@4000051c {
				#address-cells = < 0x1 >;
				#size-cells = < 0x1 >;
				compatible = "nordic,nrf-gpregret";
				reg = < 0x4000051c 0x1 >;
				status = "okay";
			};
			gpregret2: gpregret2@40000520 {
				#address-cells = < 0x1 >;
				#size-cells = < 0x1 >;
				compatible = "nordic,nrf-gpregret";
				reg = < 0x40000520 0x1 >;
				status = "okay";
			};
			reg1: regulator@40000578 {
				compatible = "nordic,nrf5x-regulator";
				reg = < 0x40000578 0x1 >;
				regulator-name = "REG1";
				regulator-initial-mode = < 0x1 >;
			};
			reg0: regulator@40000580 {
				compatible = "nordic,nrf52x-regulator-hv";
				reg = < 0x40000580 0x1 >;
				regulator-name = "REG0";
				status = "okay";
			};
		};
		radio: radio@40001000 {
			compatible = "nordic,nrf-radio";
			reg = < 0x40001000 0x1000 >;
			interrupts = < 0x1 0x1 >;
			status = "okay";
			ieee802154-supported;
			ble-2mbps-supported;
			ble-coded-phy-supported;
			tx-high-power-supported;
			ieee802154: ieee802154 {
				compatible = "nordic,nrf-ieee802154";
				status = "okay";
			};
			bt_hci_sdc: bt_hci_sdc {
				compatible = "nordic,bt-hci-sdc";
				status = "okay";
			};
			bt_hci_controller: bt_hci_controller {
				compatible = "zephyr,bt-hci-ll-sw-split";
				status = "disabled";
			};
		};
		uart0: xiao_serial: uart@40002000 {
			compatible = "nordic,nrf-uarte";
			reg = < 0x40002000 0x1000 >;
			interrupts = < 0x2 0x1 >;
			status = "okay";
			current-speed = < 0x1c200 >;
			pinctrl-0 = < &uart0_default >;
			pinctrl-1 = < &uart0_sleep >;
			pinctrl-names = "default", "sleep";
		};
		i2c0: i2c@40003000 {
			compatible = "nordic,nrf-twim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40003000 0x1000 >;
			interrupts = < 0x3 0x1 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
			zephyr,pm-device-runtime-auto;
		};
		spi0: spi@40003000 {
			compatible = "nordic,nrf-spim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40003000 0x1000 >;
			interrupts = < 0x3 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
		};
		i2c1: xiao_i2c: i2c@40004000 {
			compatible = "nordic,nrf-twi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40004000 0x1000 >;
			interrupts = < 0x4 0x1 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
			zephyr,pm-device-runtime-auto;
			pinctrl-0 = < &i2c1_default >;
			pinctrl-1 = < &i2c1_sleep >;
			pinctrl-names = "default", "sleep";
		};
		spi1: spi@40004000 {
			compatible = "nordic,nrf-spim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40004000 0x1000 >;
			interrupts = < 0x4 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
		};
		nfct: nfct@40005000 {
			compatible = "nordic,nrf-nfct";
			reg = < 0x40005000 0x1000 >;
			interrupts = < 0x5 0x1 >;
			status = "disabled";
		};
		gpiote: gpiote0: gpiote@40006000 {
			compatible = "nordic,nrf-gpiote";
			reg = < 0x40006000 0x1000 >;
			interrupts = < 0x6 0x5 >;
			status = "okay";
			instance = < 0x0 >;
			phandle = < 0xe >;
		};
		adc: xiao_adc: adc@40007000 {
			compatible = "nordic,nrf-saadc";
			reg = < 0x40007000 0x1000 >;
			interrupts = < 0x7 0x1 >;
			status = "okay";
			#io-channel-cells = < 0x1 >;
			zephyr,pm-device-runtime-auto;
		};
		timer0: timer@40008000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x40008000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x8 0x1 >;
			prescaler = < 0x0 >;
		};
		timer1: timer@40009000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x40009000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x9 0x1 >;
			prescaler = < 0x0 >;
			phandle = < 0xf >;
		};
		timer2: timer@4000a000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4000a000 0x1000 >;
			cc-num = < 0x4 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0xa 0x1 >;
			prescaler = < 0x0 >;
		};
		rtc0: rtc@4000b000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x4000b000 0x1000 >;
			cc-num = < 0x3 >;
			interrupts = < 0xb 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		temp: temp@4000c000 {
			compatible = "nordic,nrf-temp";
			reg = < 0x4000c000 0x1000 >;
			interrupts = < 0xc 0x1 >;
			status = "okay";
		};
		rng: random@4000d000 {
			compatible = "nordic,nrf-rng";
			reg = < 0x4000d000 0x1000 >;
			interrupts = < 0xd 0x1 >;
			status = "okay";
		};
		ecb: ecb@4000e000 {
			compatible = "nordic,nrf-ecb";
			reg = < 0x4000e000 0x1000 >;
			interrupts = < 0xe 0x1 >;
			status = "okay";
		};
		ccm: ccm@4000f000 {
			compatible = "nordic,nrf-ccm";
			reg = < 0x4000f000 0x1000 >;
			interrupts = < 0xf 0x1 >;
			length-field-length-8-bits;
			status = "okay";
		};
		wdt: wdt0: watchdog@40010000 {
			compatible = "nordic,nrf-wdt";
			reg = < 0x40010000 0x1000 >;
			interrupts = < 0x10 0x1 >;
			status = "okay";
		};
		rtc1: rtc@40011000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x40011000 0x1000 >;
			cc-num = < 0x4 >;
			interrupts = < 0x11 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		qdec: qdec0: qdec@40012000 {
			compatible = "nordic,nrf-qdec";
			reg = < 0x40012000 0x1000 >;
			interrupts = < 0x12 0x1 >;
			status = "disabled";
		};
		comp: comparator@40013000 {
			compatible = "nordic,nrf-comp";
			reg = < 0x40013000 0x1000 >;
			interrupts = < 0x13 0x1 >;
			status = "disabled";
		};
		egu0: swi0: egu@40014000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40014000 0x1000 >;
			interrupts = < 0x14 0x1 >;
			status = "okay";
		};
		egu1: swi1: egu@40015000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40015000 0x1000 >;
			interrupts = < 0x15 0x1 >;
			status = "okay";
		};
		egu2: swi2: egu@40016000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40016000 0x1000 >;
			interrupts = < 0x16 0x1 >;
			status = "okay";
		};
		egu3: swi3: egu@40017000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40017000 0x1000 >;
			interrupts = < 0x17 0x1 >;
			status = "okay";
		};
		egu4: swi4: egu@40018000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40018000 0x1000 >;
			interrupts = < 0x18 0x1 >;
			status = "okay";
		};
		egu5: swi5: egu@40019000 {
			compatible = "nordic,nrf-egu", "nordic,nrf-swi";
			reg = < 0x40019000 0x1000 >;
			interrupts = < 0x19 0x1 >;
			status = "okay";
		};
		timer3: timer@4001a000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4001a000 0x1000 >;
			cc-num = < 0x6 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x1a 0x1 >;
			prescaler = < 0x0 >;
		};
		timer4: timer@4001b000 {
			compatible = "nordic,nrf-timer";
			status = "disabled";
			reg = < 0x4001b000 0x1000 >;
			cc-num = < 0x6 >;
			max-bit-width = < 0x20 >;
			interrupts = < 0x1b 0x1 >;
			prescaler = < 0x0 >;
		};
		pwm0: pwm@4001c000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x4001c000 0x1000 >;
			interrupts = < 0x1c 0x1 >;
			status = "okay";
			#pwm-cells = < 0x3 >;
			pinctrl-0 = < &pwm0_default >;
			pinctrl-1 = < &pwm0_sleep >;
			pinctrl-names = "default", "sleep";
			phandle = < 0x10 >;
		};
		pdm0: pdm@4001d000 {
			compatible = "nordic,nrf-pdm";
			reg = < 0x4001d000 0x1000 >;
			interrupts = < 0x1d 0x1 >;
			status = "disabled";
		};
		acl: acl@4001e000 {
			compatible = "nordic,nrf-acl";
			reg = < 0x4001e000 0x1000 >;
			status = "okay";
		};
		flash_controller: flash-controller@4001e000 {
			compatible = "nordic,nrf52-flash-controller";
			reg = < 0x4001e000 0x1000 >;
			partial-erase;
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			flash0: flash@0 {
				compatible = "soc-nv-flash";
				erase-block-size = < 0x1000 >;
				write-block-size = < 0x4 >;
				reg = < 0x0 0x100000 >;
				partitions {
					compatible = "fixed-partitions";
					#address-cells = < 0x1 >;
					#size-cells = < 0x1 >;
					reserved_partition_0: partition@0 {
						label = "SoftDevice";
						read-only;
						reg = < 0x0 0x27000 >;
					};
					code_partition: partition@27000 {
						label = "Application";
						reg = < 0x27000 0xc5000 >;
					};
					storage_partition: partition@ec000 {
						label = "Storage";
						reg = < 0xec000 0x8000 >;
					};
					boot_partition: partition@f4000 {
						label = "UF2";
						read-only;
						reg = < 0xf4000 0xc000 >;
					};
				};
			};
		};
		ppi: ppi@4001f000 {
			compatible = "nordic,nrf-ppi";
			reg = < 0x4001f000 0x1000 >;
			status = "okay";
		};
		mwu: mwu@40020000 {
			compatible = "nordic,nrf-mwu";
			reg = < 0x40020000 0x1000 >;
			status = "okay";
		};
		pwm1: pwm@40021000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x40021000 0x1000 >;
			interrupts = < 0x21 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		pwm2: pwm@40022000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x40022000 0x1000 >;
			interrupts = < 0x22 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		spi2: xiao_spi: spi@40023000 {
			compatible = "nordic,nrf-spi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40023000 0x1000 >;
			interrupts = < 0x23 0x1 >;
			max-frequency = < 0x7a1200 >;
			easydma-maxcnt-bits = < 0x10 >;
			status = "disabled";
			pinctrl-0 = < &spi2_default >;
			pinctrl-1 = < &spi2_sleep >;
			pinctrl-names = "default", "sleep";
		};
		rtc2: rtc@40024000 {
			compatible = "nordic,nrf-rtc";
			reg = < 0x40024000 0x1000 >;
			cc-num = < 0x4 >;
			interrupts = < 0x24 0x1 >;
			status = "disabled";
			clock-frequency = < 0x8000 >;
			prescaler = < 0x1 >;
		};
		i2s0: i2s@40025000 {
			compatible = "nordic,nrf-i2s";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40025000 0x1000 >;
			interrupts = < 0x25 0x1 >;
			status = "disabled";
		};
		usbd: zephyr_udc0: usbd@40027000 {
			compatible = "nordic,nrf-usbd";
			reg = < 0x40027000 0x1000 >;
			interrupts = < 0x27 0x1 >;
			num-bidir-endpoints = < 0x1 >;
			num-in-endpoints = < 0x7 >;
			num-out-endpoints = < 0x7 >;
			num-isoin-endpoints = < 0x1 >;
			num-isoout-endpoints = < 0x1 >;
			status = "okay";
			board_cdc_acm_uart: board_cdc_acm_uart {
				compatible = "zephyr,cdc-acm-uart";
			};
		};
		uart1: uart@40028000 {
			compatible = "nordic,nrf-uarte";
			reg = < 0x40028000 0x1000 >;
			interrupts = < 0x28 0x1 >;
			status = "disabled";
		};
		qspi: qspi@40029000 {
			compatible = "nordic,nrf-qspi";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x40029000 0x1000 >, < 0x12000000 0x8000000 >;
			reg-names = "qspi", "qspi_mm";
			interrupts = < 0x29 0x1 >;
			status = "okay";
			pinctrl-0 = < &qspi_default >;
			pinctrl-1 = < &qspi_sleep >;
			pinctrl-names = "default", "sleep";
			nrf70: nrf700x: nrf7002@0 {
				compatible = "nordic,nrf700x-qspi";
				status = "okay";
				reg = < 0x0 >;
				spi-max-frequency = < 0x7a1200 >;
				iovdd-ctrl-gpios = < &gpio0 0x1d 0x0 >;
				host-irq-gpios = < &gpio1 0xb 0x0 >;
				srrf-switch-gpios = < &gpio1 0xd 0x0 >;
				wifi-max-tx-pwr-2g-dsss = < 0x15 >;
				wifi-max-tx-pwr-2g-mcs0 = < 0x15 >;
				wifi-max-tx-pwr-2g-mcs7 = < 0x15 >;
				wifi-max-tx-pwr-5g-low-mcs0 = < 0x15 >;
				wifi-max-tx-pwr-5g-low-mcs7 = < 0x15 >;
				wifi-max-tx-pwr-5g-mid-mcs0 = < 0x15 >;
				wifi-max-tx-pwr-5g-mid-mcs7 = < 0x15 >;
				wifi-max-tx-pwr-5g-high-mcs0 = < 0x15 >;
				wifi-max-tx-pwr-5g-high-mcs7 = < 0x15 >;
				sck-frequency = < 0x16e3600 >;
				quad-mode;
				wlan0: wlan0 {
					compatible = "nordic,wlan";
				};
			};
		};
		pwm3: pwm@4002d000 {
			compatible = "nordic,nrf-pwm";
			reg = < 0x4002d000 0x1000 >;
			interrupts = < 0x2d 0x1 >;
			status = "disabled";
			#pwm-cells = < 0x3 >;
		};
		spi3: spi@4002f000 {
			compatible = "nordic,nrf-spim";
			#address-cells = < 0x1 >;
			#size-cells = < 0x0 >;
			reg = < 0x4002f000 0x1000 >;
			interrupts = < 0x2f 0x1 >;
			max-frequency = < 0x1e84800 >;
			easydma-maxcnt-bits = < 0x10 >;
			rx-delay-supported;
			rx-delay = < 0x2 >;
			status = "disabled";
		};
		gpio0: gpio@50000000 {
			compatible = "nordic,nrf-gpio";
			gpio-controller;
			reg = < 0x50000000 0x200 0x50000500 0x300 >;
			#gpio-cells = < 0x2 >;
			status = "okay";
			port = < 0x0 >;
			gpiote-instance = < &gpiote >;
			phandle = < 0xc >;
		};
		gpio1: gpio@50000300 {
			compatible = "nordic,nrf-gpio";
			gpio-controller;
			reg = < 0x50000300 0x200 0x50000800 0x300 >;
			#gpio-cells = < 0x2 >;
			ngpios = < 0x10 >;
			status = "okay";
			port = < 0x1 >;
			gpiote-instance = < &gpiote >;
			phandle = < 0xd >;
		};
		cryptocell: crypto@5002a000 {
			compatible = "nordic,cryptocell", "arm,cryptocell-310";
			reg = < 0x5002a000 0x1000 >, < 0x5002b000 0x1000 >;
			reg-names = "wrapper", "core";
			interrupts = < 0x2a 0x1 >;
			status = "okay";
		};
	};
	pinctrl: pin-controller {
		compatible = "nordic,nrf-pinctrl";
		uart0_default: uart0_default {
			phandle = < 0x2 >;
			group1 {
				psels = < 0x2b >;
			};
			group2 {
				psels = < 0x100002c >;
				bias-pull-up;
			};
		};
		uart0_sleep: uart0_sleep {
			phandle = < 0x3 >;
			group1 {
				psels = < 0x2b >, < 0x100002c >;
				low-power-enable;
			};
		};
		i2c0_default: i2c0_default {
			group1 {
				psels = < 0xc000007 >, < 0xb00001b >;
			};
		};
		i2c0_sleep: i2c0_sleep {
			group1 {
				psels = < 0xc000007 >, < 0xb00001b >;
				low-power-enable;
			};
		};
		i2c1_default: i2c1_default {
			phandle = < 0x4 >;
			group1 {
				psels = < 0xc000004 >, < 0xb000005 >;
			};
		};
		i2c1_sleep: i2c1_sleep {
			phandle = < 0x5 >;
			group1 {
				psels = < 0xc000004 >, < 0xb000005 >;
				low-power-enable;
			};
		};
		pdm0_default: pdm0_default {
			group1 {
				psels = < 0x14000020 >, < 0x15000010 >;
			};
		};
		pdm0_sleep: pdm0_sleep {
			group1 {
				psels = < 0x14000020 >, < 0x15000010 >;
				low-power-enable;
			};
		};
		pwm0_default: pwm0_default {
			phandle = < 0x6 >;
			group1 {
				psels = < 0x16000011 >;
				nordic,invert;
			};
		};
		pwm0_sleep: pwm0_sleep {
			phandle = < 0x7 >;
			group1 {
				psels = < 0x16000011 >;
				low-power-enable;
			};
		};
		spi2_default: spi2_default {
			phandle = < 0x8 >;
			group1 {
				psels = < 0x400002d >, < 0x500002f >, < 0x600002e >;
			};
		};
		spi2_sleep: spi2_sleep {
			phandle = < 0x9 >;
			group1 {
				psels = < 0x400002d >, < 0x500002f >, < 0x600002e >;
				low-power-enable;
			};
		};
		spi3_default: spi3_default {
			group1 {
				psels = < 0x4000015 >, < 0x5000014 >, < 0x6000018 >;
			};
		};
		spi3_sleep: spi3_sleep {
			group1 {
				psels = < 0x4000015 >, < 0x5000014 >, < 0x6000018 >;
				low-power-enable;
			};
		};
		qspi_default: qspi_default {
			phandle = < 0xa >;
			group1 {
				psels = < 0x1d00002d >, < 0x1f00002f >, < 0x2000002e >, < 0x21000002 >, < 0x22000003 >;
			};
			group2 {
				psels = < 0x1e00002c >;
			};
		};
		qspi_sleep: qspi_sleep {
			phandle = < 0xb >;
			group1 {
				psels = < 0x1d00002d >, < 0x1f00002f >, < 0x2000002e >, < 0x21000002 >, < 0x22000003 >;
				low-power-enable;
			};
			group2 {
				psels = < 0x1e00002c >;
				low-power-enable;
				bias-pull-up;
			};
		};
	};
	rng_hci: entropy_bt_hci {
		compatible = "zephyr,bt-hci-entropy";
		status = "okay";
	};
	sw_pwm: sw-pwm {
		compatible = "nordic,nrf-sw-pwm";
		status = "disabled";
		generator = < &timer1 >;
		clock-prescaler = < 0x0 >;
		#pwm-cells = < 0x3 >;
	};
	cpus {
		#address-cells = < 0x1 >;
		#size-cells = < 0x0 >;
		cpu@0 {
			device_type = "cpu";
			compatible = "arm,cortex-m4f";
			reg = < 0x0 >;
			#address-cells = < 0x1 >;
			#size-cells = < 0x1 >;
			itm: itm@e0000000 {
				compatible = "arm,armv7m-itm";
				reg = < 0xe0000000 0x1000 >;
				swo-ref-frequency = < 0x1e84800 >;
			};
		};
	};
	xiao_d: connector {
		compatible = "seeed,xiao-gpio";
		#gpio-cells = < 0x2 >;
		gpio-map-mask = < 0xffffffff 0xffffffc0 >;
		gpio-map-pass-thru = < 0x0 0x3f >;
		gpio-map = < 0x0 0x0 &gpio0 0x2 0x0 >, < 0x1 0x0 &gpio0 0x3 0x0 >, < 0x2 0x0 &gpio0 0x1c 0x0 >, < 0x3 0x0 &gpio0 0x1d 0x0 >, < 0x4 0x0 &gpio0 0x4 0x0 >, < 0x5 0x0 &gpio0 0x5 0x0 >, < 0x6 0x0 &gpio1 0xb 0x0 >, < 0x7 0x0 &gpio1 0xc 0x0 >, < 0x8 0x0 &gpio1 0xd 0x0 >, < 0x9 0x0 &gpio1 0xe 0x0 >, < 0xa 0x0 &gpio1 0xf 0x0 >;
	};
	leds {
		compatible = "gpio-leds";
		led0: led_0 {
			gpios = < &gpio0 0x1a 0x1 >;
			label = "Red LED";
		};
		led1: led_1 {
			gpios = < &gpio0 0x1e 0x1 >;
			label = "Green LED";
		};
		led2: led_2 {
			gpios = < &gpio0 0x6 0x1 >;
			label = "Blue LED";
		};
	};
	pwmleds {
		compatible = "pwm-leds";
		pwm_led0: pwm_led_0 {
			pwms = < &pwm0 0x0 0x1312d00 0x1 >;
		};
	};
	nrf_radio_coex: nrf7002-coex {
		status = "okay";
		compatible = "nordic,nrf700x-coex";
		req-gpios = < &gpio0 0x4 0x0 >;
		status0-gpios = < &gpio0 0x5 0x0 >;
		grant-gpios = < &gpio0 0x1c 0x1 >;
	};
};

Related