From d2a5c1ca82f07b5a961206a58ffdd00a54e109c0 Mon Sep 17 00:00:00 2001 From: Tarang Patel Date: Wed, 21 May 2025 13:40:17 +0000 Subject: [PATCH] boards: nxp_rw612: Add support for u-blox EVK-IRIS-W1x Add basic board definition of the u-blox EVK-IRIS-W1-rw612 board. Adds maintainer info for u-blox boards. Signed-off-by: Tarang Patel --- MAINTAINERS.yml | 9 + boards/u-blox/ubx_evk_iris_w1/CMakeLists.txt | 24 ++ .../u-blox/ubx_evk_iris_w1/Kconfig.defconfig | 15 ++ .../ubx_evk_iris_w1/Kconfig.ubx_evk_iris_w1 | 6 + boards/u-blox/ubx_evk_iris_w1/board.cmake | 9 + boards/u-blox/ubx_evk_iris_w1/board.yml | 12 + boards/u-blox/ubx_evk_iris_w1/doc/index.rst | 132 ++++++++++ .../ubx_evk_iris_w1/doc/ubx_evk_iris_w1.webp | Bin 0 -> 70886 bytes .../ubx_evk_iris_w1/fidelex_flash_config.c | 84 +++++++ .../ubx_evk_iris_w1/macronix_flash_config.c | 118 +++++++++ .../u-blox/ubx_evk_iris_w1/pre_dt_board.cmake | 5 + boards/u-blox/ubx_evk_iris_w1/revision.cmake | 14 ++ .../ubx_evk_iris_w1_common.dtsi | 235 ++++++++++++++++++ .../ubx_evk_iris_w1_rw612-pinctrl.dtsi | 89 +++++++ .../ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.dts | 10 + .../ubx_evk_iris_w1_rw612.yaml | 24 ++ .../ubx_evk_iris_w1_rw612_fidelex_defconfig | 13 + .../ubx_evk_iris_w1_rw612_macronix_defconfig | 12 + 18 files changed, 811 insertions(+) create mode 100644 boards/u-blox/ubx_evk_iris_w1/CMakeLists.txt create mode 100644 boards/u-blox/ubx_evk_iris_w1/Kconfig.defconfig create mode 100644 boards/u-blox/ubx_evk_iris_w1/Kconfig.ubx_evk_iris_w1 create mode 100644 boards/u-blox/ubx_evk_iris_w1/board.cmake create mode 100644 boards/u-blox/ubx_evk_iris_w1/board.yml create mode 100644 boards/u-blox/ubx_evk_iris_w1/doc/index.rst create mode 100644 boards/u-blox/ubx_evk_iris_w1/doc/ubx_evk_iris_w1.webp create mode 100644 boards/u-blox/ubx_evk_iris_w1/fidelex_flash_config.c create mode 100644 boards/u-blox/ubx_evk_iris_w1/macronix_flash_config.c create mode 100644 boards/u-blox/ubx_evk_iris_w1/pre_dt_board.cmake create mode 100644 boards/u-blox/ubx_evk_iris_w1/revision.cmake create mode 100644 boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_common.dtsi create mode 100644 boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612-pinctrl.dtsi create mode 100644 boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.dts create mode 100644 boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.yaml create mode 100644 boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_fidelex_defconfig create mode 100644 boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_macronix_defconfig diff --git a/MAINTAINERS.yml b/MAINTAINERS.yml index 9d3e442c6cc..81a2b8d21ae 100644 --- a/MAINTAINERS.yml +++ b/MAINTAINERS.yml @@ -4669,6 +4669,15 @@ Tracing: tests: - tracing +u-blox Platforms: + status: maintained + maintainers: + - 3rang + files: + - boards/u-blox/ + labels: + - "platform: u-blox" + USB: status: maintained maintainers: diff --git a/boards/u-blox/ubx_evk_iris_w1/CMakeLists.txt b/boards/u-blox/ubx_evk_iris_w1/CMakeLists.txt new file mode 100644 index 00000000000..da0b52a94d5 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/CMakeLists.txt @@ -0,0 +1,24 @@ +# +#Copyright 2022-2025 NXP +#Copyright(c)2025 u-blox AG +#SPDX-License-Identifier:Apache-2.0 +# + +if(CONFIG_NXP_RW6XX_BOOT_HEADER) + zephyr_compile_definitions(BOARD_FLASH_SIZE=${CONFIG_FLASH_SIZE}*1024) + + if(BOARD_REVISION STREQUAL "macronix") + zephyr_library_sources(macronix_flash_config.c) + elseif(BOARD_REVISION STREQUAL "fidelex") + zephyr_library_sources(fidelex_flash_config.c) + else() + message(FATAL_ERROR "Unsupported board revision: ${BOARD_REVISION}") + endif() + + if(CONFIG_DT_HAS_NXP_ENET_MAC_ENABLED AND CONFIG_XTAL32K) + message(FATAL_ERROR + "Ethernet and external 32K clock source are " + "mutually exclusive on FRDM_RW612 due to shared PCB nets " + "between the ethernet PHY and the external oscillator") + endif() +endif() diff --git a/boards/u-blox/ubx_evk_iris_w1/Kconfig.defconfig b/boards/u-blox/ubx_evk_iris_w1/Kconfig.defconfig new file mode 100644 index 00000000000..3426ef9ff4c --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/Kconfig.defconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright 2022-2025 NXP +# Copyright (c) 2025 u-blox AG +# + +if BOARD_UBX_EVK_IRIS_W1 + +if COUNTER_MCUX_LPC_RTC_1HZ + +config XTAL32K + default y + +endif # COUNTER_MCUX_LPC_RTC_1HZ + +endif # BOARD_UBX_EVK_IRIS_W1 diff --git a/boards/u-blox/ubx_evk_iris_w1/Kconfig.ubx_evk_iris_w1 b/boards/u-blox/ubx_evk_iris_w1/Kconfig.ubx_evk_iris_w1 new file mode 100644 index 00000000000..a98cc286beb --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/Kconfig.ubx_evk_iris_w1 @@ -0,0 +1,6 @@ +# EVK-IRIS-W1 board configuration +# Copyright (c) 2025 u-blox AG +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_UBX_EVK_IRIS_W1 + select SOC_PART_NUMBER_RW612ETA2I diff --git a/boards/u-blox/ubx_evk_iris_w1/board.cmake b/boards/u-blox/ubx_evk_iris_w1/board.cmake new file mode 100644 index 00000000000..c7b1d7d51d4 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/board.cmake @@ -0,0 +1,9 @@ +# Copyright 2022-2023 NXP +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=RW612" "--reset-after-load") + +board_runner_args(linkserver "--device=RW612:RDRW612") + +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/linkserver.board.cmake) diff --git a/boards/u-blox/ubx_evk_iris_w1/board.yml b/boards/u-blox/ubx_evk_iris_w1/board.yml new file mode 100644 index 00000000000..2b3b54823f5 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/board.yml @@ -0,0 +1,12 @@ +board: + name: ubx_evk_iris_w1 + full_name: EVK-IRIS-W106-RW612 + vendor: u-blox + revision: + format: custom + default: fidelex + revisions: + - name: "macronix" + - name: "fidelex" + socs: + - name: rw612 diff --git a/boards/u-blox/ubx_evk_iris_w1/doc/index.rst b/boards/u-blox/ubx_evk_iris_w1/doc/index.rst new file mode 100644 index 00000000000..0b56718451d --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/doc/index.rst @@ -0,0 +1,132 @@ +.. zephyr:board:: ubx_evk_iris_w1 + +Overview +******** + +The EVK-IRIS-W10x evaluation kit enables stand-alone use of the IRIS-W10 series module. This guide +provides details about the hardware functionality of the EVK-IRIS-W10 board and includes setup +instructions for starting development. + +All pins and interfaces supported on IRIS-W10 series modules are easily accessible from the +evaluation board. Simple USB connections serve as the physical interfaces for power, programming +COM ports, debugging, and USB peripheral connectors. Additionally, the board features other +interfaces like Ethernet RJ45 and an SDIO header. The EVK-IRIS-W10 board is equipped with a Reset +button, Boot button, and two user-configurable buttons. Current sense resistors are incorporated for +accurate current measurement within the module. + +For flexible use, GPIO signals are accessible through headers and are complemented by four +mikroBUS™ standard slots for convenient utilization of Click boards™. Each Click board can be +seamlessly plugged into an available mikroBUS™ slot to facilitate effortless hardware expansion with +a variety of standardized compact add-on boards. Click boards are designed to accommodate a +diverse range of electronic modules, including sensors, transceivers, displays, encoders, motor +drivers, connection ports, and more. For further information about the Click boards, visit the MIKROE +website. + +Hardware +******** + +- 260 MHz ARM Cortex-M33, tri-radio cores for Wi-Fi 6 + BLE 5.3 + 802.15.4 +- 1.2 MB on-chip SRAM +- EVK-IRIS-W101 evaluation board with IRIS-W101 module. Dual-band PCB antenna for WLAN + with 100 mm coaxial cable and U.FL connector +- EVK-IRIS-W106 evaluation board with IRIS-W106 module. Dual-band integrated PCB trace + antenna (external antenna not supplied) + + +Flash Memory Configuration +========================== + +The IRIS-W1 board uses different flash vendors depending on revision: + +- ``@macronix``: Module build up to 2023 week 45 +- ``@fidelex``: Module build 2023 week 46 (2346) onward + +To build for a specific flash version: + +.. code-block:: bash + + west build -b ubx_evk_iris_w1@macronix + west build -b ubx_evk_iris_w1@fidelex + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Basic functionality like UART (default on FC3), GPIOs (I²C, SPI), and the on-board RGB LEDs is supported. + +Programming and Debugging +************************* + +.. zephyr:board-supported-runners:: + + +Configuring a Debug Probe +========================= + +A debug probe is used for both flashing and debugging the board. This board is +configured by default to use the J-Link firmware. + +Configuring a Console +===================== + +Connect a USB cable from your PC to USB3, and use the serial terminal of your choice +(minicom, PuTTY, etc.) with the following settings: + +- Speed: 115200 +- Data: 8 bits +- Parity: None +- Stop bits: 1 + +Flashing +======== + +Here is an example for the ``hello_world`` application. + +Open a serial terminal, reset the board (press the RESET button), and you should +see the following message in the terminal: + +.. code-block:: console + + **** Booting Zephyr OS build v4.1.0-2794-g6463c68bc394 **** + Hello World ! ubx_evk_iris_w1/rw612 + +Wireless Connectivity Support +***************************** + +Fetch Binary Blobs +================== + +To support Bluetooth or Wi-Fi, ``ubx_evk_iris_w1`` requires fetching binary blobs. This can be +achieved by running the following command: + +.. code-block:: console + + west blobs fetch hal_nxp + +Bluetooth +========= + +BLE functionality requires fetching binary blobs, so make sure to follow +the "Fetch Binary Blobs" section first. + +The required binary blob +``/modules/hal/nxp/zephyr/blobs/rw61x_sb_ble_a2.bin`` will be linked +with the application image directly, forming a single monolithic image. + +Wi-Fi +===== + +Wi-Fi functionality also requires fetching binary blobs, so make sure to follow +the "Fetch Binary Blobs" section first. + +The required binary blob +``/modules/hal/nxp/zephyr/blobs/rw61x_sb_wifi_a2.bin`` will be linked +with the application image directly, forming a single monolithic image. + +Resources +********* + +- `EVK-IRIS-W1 Website `_ +- `EVK-IRIS-W1 GitHub `_ +- `EVK-IRIS-W1 User Guide `_ diff --git a/boards/u-blox/ubx_evk_iris_w1/doc/ubx_evk_iris_w1.webp b/boards/u-blox/ubx_evk_iris_w1/doc/ubx_evk_iris_w1.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5ff9d47b77ef212196edb9b356babe51357b75d GIT binary patch literal 70886 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 literal 0 HcmV?d00001 diff --git a/boards/u-blox/ubx_evk_iris_w1/fidelex_flash_config.c b/boards/u-blox/ubx_evk_iris_w1/fidelex_flash_config.c new file mode 100644 index 00000000000..c605e295bac --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/fidelex_flash_config.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021-2024 NXP + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +__attribute__((section(".flash_conf"), used)) +const fc_flexspi_nor_config_t flexspi_config = { + .memConfig = { + .tag = FC_BLOCK_TAG, + .version = FC_BLOCK_VERSION, + .readSampleClkSrc = 1, + .csHoldTime = 3, + .csSetupTime = 3, + .deviceModeCfgEnable = 1, + .deviceModeSeq = { .seqNum = 1, .seqId = 2 }, + .deviceModeArg = 0x0200, + .configCmdEnable = 0, + .deviceType = 0x1, + .sflashPadType = kSerialFlash_4Pads, + .serialClkFreq = 7, + .sflashA1Size = 0x1000000U, + .sflashA2Size = 0, + .sflashB1Size = 0, + .sflashB2Size = 0, + .lookupTable = { + /* Read */ + [0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0xEB, + FC_RADDR_SDR, FC_FLEXSPI_4PAD, 0x18), + [1] = FC_FLEXSPI_LUT_SEQ( + FC_MODE8_SDR, FC_FLEXSPI_4PAD, 0x00, + FC_DUMMY_SDR, FC_FLEXSPI_4PAD, 0x04), + [2] = FC_FLEXSPI_LUT_SEQ( + FC_READ_SDR, FC_FLEXSPI_4PAD, 0x04, + FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00), + + /* Read Status */ + [4 * 1 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x05, + FC_READ_SDR, FC_FLEXSPI_1PAD, 0x04), + + /* Write Status */ + [4 * 2 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x01, + FC_WRITE_SDR, FC_FLEXSPI_1PAD, 0x02), + + /* Write Enable */ + [4 * 3 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x06, + FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00), + + /* Sector erase */ + [4 * 5 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x20, + FC_RADDR_SDR, FC_FLEXSPI_1PAD, 0x18), + + /* Block erase */ + [4 * 8 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x52, + FC_RADDR_SDR, FC_FLEXSPI_1PAD, 0x18), + + /* Page program */ + [4 * 9 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x02, + FC_RADDR_SDR, FC_FLEXSPI_1PAD, 0x18), + [4 * 9 + 1] = FC_FLEXSPI_LUT_SEQ( + FC_WRITE_SDR, FC_FLEXSPI_1PAD, 0x00, + FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00), + + /* Chip erase */ + [4 * 11 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x60, + FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00), + }, + }, + .pageSize = 0x100, + .sectorSize = 0x1000, + .ipcmdSerialClkFreq = 0, + .blockSize = 0x8000, + .fcb_fill[0] = 0xFFFFFFFFU, +}; diff --git a/boards/u-blox/ubx_evk_iris_w1/macronix_flash_config.c b/boards/u-blox/ubx_evk_iris_w1/macronix_flash_config.c new file mode 100644 index 00000000000..44e11b5e2c1 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/macronix_flash_config.c @@ -0,0 +1,118 @@ +/* + * Copyright 2021-2024 NXP + * All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +__attribute__((section(".flash_conf"), used)) +const fc_flexspi_nor_config_t flexspi_config = { + .memConfig = { + .tag = FC_BLOCK_TAG, + .version = FC_BLOCK_VERSION, + .readSampleClkSrc = 1, + .csHoldTime = 3, + .csSetupTime = 3, + .deviceModeCfgEnable = 1, + .deviceModeSeq = { + .seqNum = 1, + .seqId = 2, + }, + .deviceModeArg = 0x0200, + .configCmdEnable = 0, + .deviceType = 0x1, + .sflashPadType = kSerialFlash_4Pads, + .serialClkFreq = 7, + .sflashA1Size = 0x1000000U, + .sflashA2Size = 0, + .sflashB1Size = 0, + .sflashB2Size = 0, + .lookupTable = { + /* Read */ + [0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, FC_FLEXSPI_1PAD, + 0xEB, FC_RADDR_SDR, + FC_FLEXSPI_4PAD, 0x18), + [1] = FC_FLEXSPI_LUT_SEQ( + FC_MODE8_SDR, + FC_FLEXSPI_4PAD, 0x00, + FC_DUMMY_SDR, + FC_FLEXSPI_4PAD, 0x04), + [2] = FC_FLEXSPI_LUT_SEQ( + FC_READ_SDR, + FC_FLEXSPI_4PAD, 0x04, + FC_STOP_EXE, + FC_FLEXSPI_1PAD, 0x00), + + /* Read Status */ + [4 * 1 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x05, FC_READ_SDR, + FC_FLEXSPI_1PAD, + 0x04), + + /* Write Status */ + [4 * 2 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x01, FC_WRITE_SDR, + FC_FLEXSPI_1PAD, + 0x02), + + /* Write Enable */ + [4 * 3 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x06, FC_STOP_EXE, + FC_FLEXSPI_1PAD, + 0x00), + + /* Sector erase */ + [4 * 5 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x20, FC_RADDR_SDR, + FC_FLEXSPI_1PAD, + 0x18), + + /* Block erase */ + [4 * 8 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x52, FC_RADDR_SDR, + FC_FLEXSPI_1PAD, + 0x18), + + /* Page program */ + [4 * 9 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x02, FC_RADDR_SDR, + FC_FLEXSPI_1PAD, + 0x18), + [4 * 9 + 1] = FC_FLEXSPI_LUT_SEQ( + FC_WRITE_SDR, + FC_FLEXSPI_1PAD, + 0x00, + FC_STOP_EXE, + FC_FLEXSPI_1PAD, + 0x00), + + /* Chip erase */ + [4 * 11 + 0] = FC_FLEXSPI_LUT_SEQ( + FC_CMD_SDR, + FC_FLEXSPI_1PAD, + 0x60, FC_STOP_EXE, + FC_FLEXSPI_1PAD, + 0x00), + }, + }, + .pageSize = 0x100, + .sectorSize = 0x1000, + .ipcmdSerialClkFreq = 0, + .blockSize = 0x8000, + .fcb_fill = 0xFFFFFFFFU, +}; diff --git a/boards/u-blox/ubx_evk_iris_w1/pre_dt_board.cmake b/boards/u-blox/ubx_evk_iris_w1/pre_dt_board.cmake new file mode 100644 index 00000000000..5da215a0a3b --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/pre_dt_board.cmake @@ -0,0 +1,5 @@ +# Copyright 2023 NXP +# SPDX-License-Identifier: Apache-2.0 + +# Suppress "spi_bus_bridge" as flexcomm node can be used as a SPI device. +list(APPEND EXTRA_DTC_FLAGS "-Wno-spi_bus_bridge") diff --git a/boards/u-blox/ubx_evk_iris_w1/revision.cmake b/boards/u-blox/ubx_evk_iris_w1/revision.cmake new file mode 100644 index 00000000000..1fa646cfa17 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/revision.cmake @@ -0,0 +1,14 @@ +# Copyright (c) 2025 u-blox AG +# SPDX-License-Identifier: Apache-2.0 + +if(NOT BOARD_REVISION) + set(BOARD_REVISION fidelex CACHE STRING "Board revision") +endif() + +# Validate revision +if(NOT BOARD_REVISION STREQUAL "macronix" AND NOT BOARD_REVISION STREQUAL "fidelex") + message(FATAL_ERROR + "Invalid BOARD_REVISION: ${BOARD_REVISION}\n" + "Must be one of: macronix, fidelex" + ) +endif() diff --git a/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_common.dtsi b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_common.dtsi new file mode 100644 index 00000000000..b4acb0f00a5 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_common.dtsi @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2025 u-blox AG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ubx_evk_iris_w1_rw612-pinctrl.dtsi" +#include + +/ { + model = "u-blox evk_iris_w1 rw612"; + compatible = "u-blox,ubx_evk_iris_w1_rw612"; + + aliases { + led0 = &rgb_red; + led1 = &rgb_green; + led2 = &rgb_blue; + sw0 = &user_button_0; + sw1 = &user_button_1; + watchdog0 = &wwdt; + usart-0 = &flexcomm3; + i2c-0 = &flexcomm2; + pwm-0 = &sctimer; + }; + + chosen { + zephyr,sram = &sram_data; + zephyr,flash = &w25q512jvfiq; + zephyr,console = &flexcomm3; + zephyr,shell-uart = &flexcomm3; + zephyr,flash-controller = &w25q512jvfiq; + zephyr,code-partition = &slot0_partition; + zephyr,uart-mcumgr = &flexcomm3; + }; + + rgb_leds { + compatible = "gpio-leds"; + + rgb_blue: led_1 { + gpios = <&hsgpio1 0xa GPIO_ACTIVE_LOW>; + label = "IRIS RGB_BLUE"; + }; + + rgb_green: led_2 { + gpios = <&hsgpio1 0xb GPIO_ACTIVE_LOW>; + label = "IRIS RGB_GREEN"; + }; + + rgb_red: led_3 { + gpios = <&hsgpio1 0xc GPIO_ACTIVE_LOW>; + label = "IRIS RGB_RED"; + }; + }; + + sw { + compatible = "gpio-keys"; + + user_button_0: sw_1 { + label = "IRIS SWITCH_1"; /* GPIO45 */ + gpios = <&hsgpio1 0xd GPIO_ACTIVE_LOW>; + zephyr,code = <0x2>; + }; + + user_button_1: sw_2 { + label = "IRIS SWITCH_2"; /* GPIO51 */ + gpios = <&hsgpio1 0x13 GPIO_ACTIVE_LOW>; + zephyr,code = <0x3>; + }; + }; +}; + +&flexcomm3 { + compatible = "nxp,lpc-usart"; + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&pinmux_flexcomm3_usart>; + pinctrl-names = "default"; +}; + +&flexcomm0 { + compatible = "nxp,lpc-usart"; + status = "disabled"; + current-speed = <115200>; + pinctrl-0 = <&pinmux_flexcomm0_usart>; + pinctrl-names = "default"; +}; + +&hsgpio0 { + status = "okay"; + pinctrl-0 = <&pinmux_hsgpio0>; + pinctrl-names = "default"; +}; + +&hsgpio1 { + status = "okay"; + pinctrl-0 = <&pinmux_hsgpio1>; + pinctrl-names = "default"; +}; + +&flexspi { + status = "okay"; + ahb-bufferable; + ahb-prefetch; + ahb-cacheable; + ahb-read-addr-opt; + ahb-boundary = "1024"; + rx-clock-source = <1>; + rx-clock-source-b = <1>; + + /* external flash */ + w25q512jvfiq: w25q512jvfiq@0 { + compatible = "nxp,imx-flexspi-nor"; + reg = <0>; + size = ; + status = "okay"; + erase-block-size = <4096>; + write-block-size = <1>; + spi-max-frequency = <104000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* + * Partition sizes must be aligned + * to the flash memory sector size of 4KB. + */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 DT_SIZE_K(128)>; + }; + + slot0_partition: partition@20000 { + label = "image-0"; + reg = <0x00020000 DT_SIZE_M(3)>; + }; + + slot1_partition: partition@320000 { + label = "image-1"; + reg = <0x00320000 DT_SIZE_M(3)>; + }; + + storage_partition: partition@620000 { + label = "storage"; + reg = <0x00620000 (DT_SIZE_M(58) - DT_SIZE_K(128))>; + }; + }; + }; + + aps6404l: aps6404l@2 { + compatible = "nxp,imx-flexspi-aps6404l"; + /* APS6404L is 8MB, 64MBit pSRAM */ + size = ; + reg = <2>; + spi-max-frequency = <109000000>; + + /* PSRAM cannot be enabled while board is in default XIP + * configuration, as it will conflict with flash chip. + */ + status = "disabled"; + cs-interval-unit = <1>; + cs-interval = <2>; + cs-hold-time = <3>; + cs-setup-time = <3>; + data-valid-time = <6>; + column-space = <0>; + ahb-write-wait-unit = <2>; + ahb-write-wait-interval = <0>; + }; +}; + +&hci { + status = "okay"; + wakeup-source; +}; + +&wwdt { + status = "okay"; +}; + +&dma0 { + status = "okay"; +}; + +&mrt0_channel0 { + status = "okay"; +}; + +&ctimer0 { + status = "okay"; +}; + +/* OS Timer is the wakeup source for PM mode 2 */ +&os_timer { + status = "okay"; + wakeup-source; + deep-sleep-counter = <&rtc_highres>; +}; + +&systick { + status = "disabled"; +}; + +&sctimer { + status = "okay"; + pinctrl-0 = <&pinmux_pwm0>; + pinctrl-names = "default"; +}; + +/* RTC is the wakeup source for PM modes 3,4 */ +&rtc_highres { + status = "okay"; + wakeup-source; +}; + +&nbu { + status = "okay"; + wakeup-source; +}; + +/* + * the default resistors on the board breaks out the MOSI/MISO + * pins to the nets labelled "UART" which go to J1 2 and 4, + * but we are using it for spi mosi and miso here. + * SCK is on J2 6 as labelled. + */ +&flexcomm1 { + compatible = "nxp,lpc-spi"; + pinctrl-0 = <&pinmux_flexcomm1_spi>; + pinctrl-names = "default"; + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; +}; diff --git a/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612-pinctrl.dtsi b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612-pinctrl.dtsi new file mode 100644 index 00000000000..03311de255d --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612-pinctrl.dtsi @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2025 u-blox AG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + + // default-UART + pinmux_flexcomm3_usart: pinmux_flexcomm3_usart { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; + + // FCx all default configure as a UART + pinmux_flexcomm0_usart: pinmux_flexcomm0_usart { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; + + pinmux_flexcomm2_usart: pinmux_flexcomm2_usart { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; + + pinmux_flexcomm14_usart: pinmux_flexcomm14_usart { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; + + // i2c + pinmux_flexcomm2_i2c: pinmux_flexcomm2_i2c { + group0 { + pinmux = ; + slew-rate = "normal"; + bias-pull-up; + }; + }; + + // spi + pinmux_flexcomm0_spi: pinmux_flexcomm0_spi { + group0 { + pinmux = ; + slew-rate = "ultra"; + }; + }; + + pinmux_flexcomm1_spi: pinmux_flexcomm1_spi { + group0 { + pinmux = ; + slew-rate = "ultra"; + }; + }; + + pinmux_pwm0: pinmux_pwm0 { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; + + pinmux_hsgpio0: pinmux_hsgpio0 { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; + + pinmux_hsgpio1: pinmux_hsgpio1 { + group0 { + pinmux = ; + slew-rate = "normal"; + }; + }; +}; diff --git a/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.dts b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.dts new file mode 100644 index 00000000000..55c50fd1eda --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.dts @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2025 u-blox AG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include "ubx_evk_iris_w1_common.dtsi" diff --git a/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.yaml b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.yaml new file mode 100644 index 00000000000..0217666c15f --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612.yaml @@ -0,0 +1,24 @@ +# +# Copyright 2022-2025 NXP +# Copyright (c) 2025 u-blox AG +# SPDX-License-Identifier: Apache-2.0 +# + +identifier: ubx_evk_iris_w1/rw612 +name: EVK-IRIS-W1-RW612 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb +ram: 960 +flash: 65536 +supported: + - gpio + - i2c + - spi + - dma + - watchdog + - pwm + - hwinfo +vendor: u-blox diff --git a/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_fidelex_defconfig b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_fidelex_defconfig new file mode 100644 index 00000000000..aa807fc8cc4 --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_fidelex_defconfig @@ -0,0 +1,13 @@ +# +# Copyright (c) 2025 u-blox AG +# SPDX-License-Identifier: Apache-2.0 +# + +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_GPIO=y +CONFIG_ARM_MPU=y +CONFIG_HW_STACK_PROTECTION=y +CONFIG_TRUSTED_EXECUTION_SECURE=y diff --git a/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_macronix_defconfig b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_macronix_defconfig new file mode 100644 index 00000000000..dab38c62f8f --- /dev/null +++ b/boards/u-blox/ubx_evk_iris_w1/ubx_evk_iris_w1_rw612_macronix_defconfig @@ -0,0 +1,12 @@ +# +# Copyright (c) 2025 u-blox AG +# SPDX-License-Identifier: Apache-2.0 +# +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_GPIO=y +CONFIG_ARM_MPU=y +CONFIG_HW_STACK_PROTECTION=y +CONFIG_TRUSTED_EXECUTION_SECURE=y