From abcde111b84d2c2808fa71acb0f5a76c8871178b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karol=20Laso=C5=84czyk?= Date: Wed, 21 Aug 2024 13:45:55 +0200 Subject: [PATCH] boards: nrf: Add nRF54L15 DK board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add board with production version of the nRF54L15 SoC. Signed-off-by: Karol Lasończyk --- boards/nordic/nrf54l15dk/Kconfig.defconfig | 12 ++ boards/nordic/nrf54l15dk/Kconfig.nrf54l15dk | 7 + boards/nordic/nrf54l15dk/board.cmake | 11 ++ boards/nordic/nrf54l15dk/board.yml | 8 + .../doc/img/nrf54l15dk_nrf54l15.webp | Bin 0 -> 41406 bytes boards/nordic/nrf54l15dk/doc/index.rst | 145 ++++++++++++++++ .../nrf54l15dk/nrf54l15_cpuapp_common.dtsi | 156 ++++++++++++++++++ .../nrf54l15dk_nrf54l15-common.dtsi | 100 +++++++++++ .../nrf54l15dk_nrf54l15-pinctrl.dtsi | 80 +++++++++ .../nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.dts | 19 +++ .../nrf54l15dk_nrf54l15_cpuapp.yaml | 24 +++ .../nrf54l15dk_nrf54l15_cpuapp_defconfig | 29 ++++ .../nrf54l15dk_nrf54l15_cpuflpr.dts | 71 ++++++++ .../nrf54l15dk_nrf54l15_cpuflpr.yaml | 18 ++ .../nrf54l15dk_nrf54l15_cpuflpr_defconfig | 17 ++ .../nrf54l15dk_nrf54l15_cpuflpr_xip.dts | 12 ++ .../nrf54l15dk_nrf54l15_cpuflpr_xip.yaml | 18 ++ .../nrf54l15dk_nrf54l15_cpuflpr_xip_defconfig | 15 ++ 18 files changed, 742 insertions(+) create mode 100644 boards/nordic/nrf54l15dk/Kconfig.defconfig create mode 100644 boards/nordic/nrf54l15dk/Kconfig.nrf54l15dk create mode 100644 boards/nordic/nrf54l15dk/board.cmake create mode 100644 boards/nordic/nrf54l15dk/board.yml create mode 100644 boards/nordic/nrf54l15dk/doc/img/nrf54l15dk_nrf54l15.webp create mode 100644 boards/nordic/nrf54l15dk/doc/index.rst create mode 100644 boards/nordic/nrf54l15dk/nrf54l15_cpuapp_common.dtsi create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-common.dtsi create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-pinctrl.dtsi create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.dts create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.yaml create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp_defconfig create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.dts create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.yaml create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_defconfig create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.dts create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.yaml create mode 100644 boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip_defconfig diff --git a/boards/nordic/nrf54l15dk/Kconfig.defconfig b/boards/nordic/nrf54l15dk/Kconfig.defconfig new file mode 100644 index 00000000000..2b753df3515 --- /dev/null +++ b/boards/nordic/nrf54l15dk/Kconfig.defconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_NRF54L15DK_NRF54L15_CPUAPP + +config BT_CTLR + default BT + +config ROM_START_OFFSET + default 0x800 if BOOTLOADER_MCUBOOT + +endif # BOARD_NRF54L15DK_NRF54L15_CPUAPP diff --git a/boards/nordic/nrf54l15dk/Kconfig.nrf54l15dk b/boards/nordic/nrf54l15dk/Kconfig.nrf54l15dk new file mode 100644 index 00000000000..e385ef84f89 --- /dev/null +++ b/boards/nordic/nrf54l15dk/Kconfig.nrf54l15dk @@ -0,0 +1,7 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_NRF54L15DK + select SOC_NRF54L15_CPUAPP if BOARD_NRF54L15DK_NRF54L15_CPUAPP + select SOC_NRF54L15_CPUFLPR if BOARD_NRF54L15DK_NRF54L15_CPUFLPR || \ + BOARD_NRF54L15DK_NRF54L15_CPUFLPR_XIP diff --git a/boards/nordic/nrf54l15dk/board.cmake b/boards/nordic/nrf54l15dk/board.cmake new file mode 100644 index 00000000000..1fd92b7fced --- /dev/null +++ b/boards/nordic/nrf54l15dk/board.cmake @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +if(CONFIG_SOC_NRF54L15_CPUAPP) + board_runner_args(jlink "--device=cortex-m33" "--speed=4000") +elseif(CONFIG_SOC_NRF54L15_CPUFLPR) + board_runner_args(jlink "--speed=4000") +endif() + +include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/nordic/nrf54l15dk/board.yml b/boards/nordic/nrf54l15dk/board.yml new file mode 100644 index 00000000000..7a8bf2f5cf1 --- /dev/null +++ b/boards/nordic/nrf54l15dk/board.yml @@ -0,0 +1,8 @@ +board: + name: nrf54l15dk + vendor: nordic + socs: + - name: nrf54l15 + variants: + - name: xip + cpucluster: cpuflpr diff --git a/boards/nordic/nrf54l15dk/doc/img/nrf54l15dk_nrf54l15.webp b/boards/nordic/nrf54l15dk/doc/img/nrf54l15dk_nrf54l15.webp new file mode 100644 index 0000000000000000000000000000000000000000..bac57d69e625bf664adeae76abe293f559e74634 GIT binary patch literal 41406 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 z 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 ios-5w90T2nevpLe*?<550000000000000000001UWc?8U literal 0 HcmV?d00001 diff --git a/boards/nordic/nrf54l15dk/doc/index.rst b/boards/nordic/nrf54l15dk/doc/index.rst new file mode 100644 index 00000000000..6980076d954 --- /dev/null +++ b/boards/nordic/nrf54l15dk/doc/index.rst @@ -0,0 +1,145 @@ +.. _nrf54l15dk_nrf54l15: + +nRF54L15 DK +############ + +Overview +******** + +.. note:: + + All software for the nRF54L15 SoC is experimental and hardware availability + is restricted to the participants in the limited sampling program. + +The nRF54L15 Development Kit hardware provides support for the Nordic Semiconductor +nRF54L15 Arm Cortex-M33 CPU and the following devices: + +* :abbr:`SAADC (Successive Approximation Analog to Digital Converter)` +* CLOCK +* RRAM +* :abbr:`GPIO (General Purpose Input Output)` +* :abbr:`TWIM (I2C-compatible two-wire interface master with EasyDMA)` +* :abbr:`MPU (Memory Protection Unit)` +* :abbr:`NVIC (Nested Vectored Interrupt Controller)` +* :abbr:`PWM (Pulse Width Modulation)` +* :abbr:`GRTC (Global real-time counter)` +* Segger RTT (RTT Console) +* :abbr:`SPI (Serial Peripheral Interface)` +* :abbr:`UARTE (Universal asynchronous receiver-transmitter)` +* :abbr:`WDT (Watchdog Timer)` + +.. figure:: img/nrf54l15dk_nrf54l15.webp + :align: center + :alt: nRF54L15 DK + + nRF54L15 DK (Credit: Nordic Semiconductor) + +Hardware +******** + +nRF54L15 DK has two crystal oscillators: + +* High-frequency 32 MHz crystal oscillator (HFXO) +* Low-frequency 32.768 kHz crystal oscillator (LFXO) + +The crystal oscillators can be configured to use either +internal or external capacitors. + +Supported Features +================== + +The ``nrf54l15dk/nrf54l15/cpuapp`` board target configuration supports the following +hardware features: + ++-----------+------------+----------------------+ +| Interface | Controller | Driver/Component | ++===========+============+======================+ +| CLOCK | on-chip | clock_control | ++-----------+------------+----------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+----------------------+ +| GRTC | on-chip | counter | ++-----------+------------+----------------------+ +| MPU | on-chip | arch/arm | ++-----------+------------+----------------------+ +| NVIC | on-chip | arch/arm | ++-----------+------------+----------------------+ +| PWM | on-chip | pwm | ++-----------+------------+----------------------+ +| RRAM | on-chip | flash | ++-----------+------------+----------------------+ +| RTT | Segger | console | ++-----------+------------+----------------------+ +| SAADC | on-chip | adc | ++-----------+------------+----------------------+ +| SPI(M/S) | on-chip | spi | ++-----------+------------+----------------------+ +| SPU | on-chip | system protection | ++-----------+------------+----------------------+ +| TWIM | on-chip | i2c | ++-----------+------------+----------------------+ +| UARTE | on-chip | serial | ++-----------+------------+----------------------+ +| WDT | on-chip | watchdog | ++-----------+------------+----------------------+ + +Other hardware features have not been enabled yet for this board. + +Programming and Debugging +************************* + +Applications for the ``nrf54l15dk/nrf54l15/cpuapp`` board target can be +built, flashed, and debugged in the usual way. See +:ref:`build_an_application` and :ref:`application_run` for more details on +building and running. + +Applications for the ``nrf54l15dk/nrf54l15/cpuflpr`` board target need +to be build as multicore configuration with code snippet called ``vpr_launcher`` +for the application core. + +Enter the following command to compile ``hello_world`` for the FLPR core:: + west build -p -b nrf54l15pdk/nrf54l15/cpuflpr --sysbuild -- -DSB_VPR_LAUNCHER=y + +Flashing +======== + +As an example, this section shows how to build and flash the :ref:`hello_world` +application. + +.. warning:: + + When programming the device, you might get an error similar to the following message:: + + ERROR: The operation attempted is unavailable due to readback protection in + ERROR: your device. Please use --recover to unlock the device. + + This error occurs when readback protection is enabled. + To disable the readback protection, you must *recover* your device. + + Enter the following command to recover the core:: + + west flash --recover + + The ``--recover`` command erases the flash memory and then writes a small binary into + the recovered flash memory. + This binary prevents the readback protection from enabling itself again after a pin + reset or power cycle. + +Follow the instructions in the :ref:`nordic_segger` page to install +and configure all the necessary software. Further information can be +found in :ref:`nordic_segger_flashing`. + +To build and program the sample to the nRF54L15 DK, complete the following steps: + +First, connect the nRF54L15 DK to you computer using the IMCU USB port on the DK. +Next, build the sample by running the following command: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: nrf54l15dk/nrf54l15/cpuapp + :goals: build flash + +Testing the LEDs and buttons in the nRF54L15 DK +************************************************ + +Test the nRF54L15 DK with a :zephyr:code-sample:`blinky` sample. diff --git a/boards/nordic/nrf54l15dk/nrf54l15_cpuapp_common.dtsi b/boards/nordic/nrf54l15dk/nrf54l15_cpuapp_common.dtsi new file mode 100644 index 00000000000..191babb632f --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15_cpuapp_common.dtsi @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* This file is common to the secure and non-secure domain */ + +#include +#include "nrf54l15dk_nrf54l15-common.dtsi" + +/ { + chosen { + zephyr,console = &uart20; + zephyr,shell-uart = &uart20; + zephyr,uart-mcumgr = &uart20; + zephyr,bt-mon-uart = &uart20; + zephyr,bt-c2h-uart = &uart20; + zephyr,flash-controller = &rram_controller; + zephyr,flash = &cpuapp_rram; + zephyr,ieee802154 = &ieee802154; + }; +}; + +&cpuapp_sram { + status = "okay"; +}; + +&lfxo { + load-capacitors = "internal"; + load-capacitance-femtofarad = <15500>; +}; + +&hfxo { + load-capacitors = "internal"; + load-capacitance-femtofarad = <15000>; +}; + +®ulators { + status = "okay"; +}; + +&vregmain { + status = "okay"; + regulator-initial-mode = ; +}; + +&grtc { + owned-channels = <0 1 2 3 4 5 6 7 8 9 10 11>; + /* Channels 7-11 reserved for Zero Latency IRQs, 3-4 for FLPR */ + child-owned-channels = <3 4 7 8 9 10 11>; + status = "okay"; +}; + +&cpuapp_rram { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x0 DT_SIZE_K(64)>; + }; + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x10000 DT_SIZE_K(324)>; + }; + slot0_ns_partition: partition@61000 { + label = "image-0-nonsecure"; + reg = <0x61000 DT_SIZE_K(324)>; + }; + slot1_partition: partition@b2000 { + label = "image-1"; + reg = <0xb2000 DT_SIZE_K(324)>; + }; + slot1_ns_partition: partition@103000 { + label = "image-1-nonsecure"; + reg = <0x103000 DT_SIZE_K(324)>; + }; + /* 32k from 0x154000 to 0x15bfff reserved for TF-M partitions */ + storage_partition: partition@15c000 { + label = "storage"; + reg = <0x15c000 DT_SIZE_K(36)>; + }; + }; +}; + +&uart20 { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&gpio2 { + status = "okay"; +}; + +&gpiote20 { + status = "okay"; +}; + +&gpiote30 { + status = "okay"; +}; + +&radio { + status = "okay"; +}; + +&ieee802154 { + status = "okay"; +}; + +&temp { + status = "okay"; +}; + +&clock { + status = "okay"; +}; + +&spi00 { + status = "okay"; + cs-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; + pinctrl-0 = <&spi00_default>; + pinctrl-1 = <&spi00_sleep>; + pinctrl-names = "default", "sleep"; + + mx25r64: mx25r6435f@0 { + compatible = "jedec,spi-nor"; + status = "okay"; + reg = <0>; + spi-max-frequency = <8000000>; + jedec-id = [c2 28 17]; + sfdp-bfp = [ + e5 20 f1 ff ff ff ff 03 44 eb 08 6b 08 3b 04 bb + ee ff ff ff ff ff 00 ff ff ff 00 ff 0c 20 0f 52 + 10 d8 00 ff 23 72 f5 00 82 ed 04 cc 44 83 48 44 + 30 b0 30 b0 f7 c4 d5 5c 00 be 29 ff f0 d0 ff ff + ]; + size = <67108864>; + has-dpd; + t-enter-dpd = <10000>; + t-exit-dpd = <35000>; + }; +}; + +&adc { + status = "okay"; +}; diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-common.dtsi b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-common.dtsi new file mode 100644 index 00000000000..02170276476 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-common.dtsi @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "nrf54l15dk_nrf54l15-pinctrl.dtsi" + +/ { + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio2 9 GPIO_ACTIVE_HIGH>; + label = "Green LED 0"; + }; + led1: led_1 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Green LED 1"; + }; + led2: led_2 { + gpios = <&gpio2 7 GPIO_ACTIVE_HIGH>; + label = "Green LED 2"; + }; + led3: led_3 { + gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; + label = "Green LED 3"; + }; + }; + + pwmleds { + compatible = "pwm-leds"; + /* + * PWM signal can be exposed on GPIO pin only within same domain. + * There is only one domain which contains both PWM and GPIO: + * PWM20/21/22 and GPIO Port P1. + * Only LEDs connected to P1 can work with PWM, for example LED1. + */ + pwm_led1: pwm_led_1 { + pwms = <&pwm20 0 PWM_MSEC(20) PWM_POLARITY_NORMAL>; + }; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio1 13 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button 0"; + zephyr,code = ; + }; + button1: button_1 { + gpios = <&gpio1 9 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button 1"; + zephyr,code = ; + }; + button2: button_2 { + gpios = <&gpio1 8 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button 2"; + zephyr,code = ; + }; + button3: button_3 { + gpios = <&gpio0 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button 3"; + zephyr,code = ; + }; + }; + + aliases { + led0 = &led0; + led1 = &led1; + led2 = &led2; + led3 = &led3; + pwm-led0 = &pwm_led1; + sw0 = &button0; + sw1 = &button1; + sw2 = &button2; + sw3 = &button3; + watchdog0 = &wdt31; + }; +}; + +&uart20 { + current-speed = <115200>; + pinctrl-0 = <&uart20_default>; + pinctrl-1 = <&uart20_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&uart30 { + current-speed = <115200>; + pinctrl-0 = <&uart30_default>; + pinctrl-1 = <&uart30_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&pwm20 { + status = "okay"; + pinctrl-0 = <&pwm20_default>; + pinctrl-1 = <&pwm20_sleep>; + pinctrl-names = "default", "sleep"; +}; diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-pinctrl.dtsi b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-pinctrl.dtsi new file mode 100644 index 00000000000..0b6e2056a82 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15-pinctrl.dtsi @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + /omit-if-no-ref/ uart20_default: uart20_default { + group1 { + psels = , + ; + }; + group2 { + psels = , + ; + bias-pull-up; + }; + }; + + /omit-if-no-ref/ uart20_sleep: uart20_sleep { + group1 { + psels = , + , + , + ; + low-power-enable; + }; + }; + + /omit-if-no-ref/ uart30_default: uart30_default { + group1 { + psels = , + ; + }; + group2 { + psels = , + ; + bias-pull-up; + }; + }; + + /omit-if-no-ref/ uart30_sleep: uart30_sleep { + group1 { + psels = , + , + , + ; + low-power-enable; + }; + }; + + /omit-if-no-ref/ spi00_default: spi00_default { + group1 { + psels = , + , + ; + }; + }; + + /omit-if-no-ref/ spi00_sleep: spi00_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + /omit-if-no-ref/ pwm20_default: pwm20_default { + group1 { + psels = ; + }; + }; + + /omit-if-no-ref/ pwm20_sleep: pwm20_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.dts b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.dts new file mode 100644 index 00000000000..b71f55c5fb4 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.dts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include "nrf54l15_cpuapp_common.dtsi" + +/ { + compatible = "nordic,nrf54l15dk_nrf54l15-cpuapp"; + model = "Nordic nRF54L15 DK nRF54L15 Application MCU"; + + chosen { + zephyr,code-partition = &slot0_partition; + zephyr,sram = &cpuapp_sram; + }; +}; diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.yaml b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.yaml new file mode 100644 index 00000000000..a3ddb5db1c6 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp.yaml @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +identifier: nrf54l15dk/nrf54l15/cpuapp +name: nRF54l15-DK-nRF54l15-Application +type: mcu +arch: arm +toolchain: + - gnuarmemb + - xtools + - zephyr +sysbuild: true +ram: 188 +flash: 324 +supported: + - adc + - counter + - gpio + - i2c + - pwm + - retained_mem + - spi + - watchdog + - i2s diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp_defconfig b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp_defconfig new file mode 100644 index 00000000000..02796a1361e --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuapp_defconfig @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable GPIO +CONFIG_GPIO=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable hardware stack protection +CONFIG_HW_STACK_PROTECTION=y + +# MPU-based null-pointer dereferencing detection cannot +# be applied as the (0x0 - 0x400) is unmapped for this target. +CONFIG_NULL_POINTER_EXCEPTION_DETECTION_NONE=y + +# Enable Cache +CONFIG_CACHE_MANAGEMENT=y +CONFIG_EXTERNAL_CACHE=y + +# Start SYSCOUNTER on driver init +CONFIG_NRF_GRTC_START_SYSCOUNTER=y diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.dts b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.dts new file mode 100644 index 00000000000..472e3f2b8d3 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.dts @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "nrf54l15dk_nrf54l15-common.dtsi" + +/ { + model = "Nordic nRF54L15 DK nRF54L15 FLPR MCU"; + compatible = "nordic,nrf54l15dk_nrf54l15-cpuflpr"; + + chosen { + zephyr,console = &uart30; + zephyr,shell-uart = &uart30; + zephyr,code-partition = &cpuflpr_code_partition; + zephyr,flash = &cpuflpr_rram; + zephyr,sram = &cpuflpr_sram; + }; +}; + +&cpuflpr_sram { + status = "okay"; + /* size must be increased due to booting from SRAM */ + reg = <0x20028000 DT_SIZE_K(96)>; + ranges = <0x0 0x20028000 0x18000>; +}; + +&cpuflpr_rram { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + cpuflpr_code_partition: partition@0 { + label = "image-0"; + reg = <0x0 DT_SIZE_K(96)>; + }; + }; +}; + +&grtc { + owned-channels = <3 4>; + status = "okay"; +}; + +&uart30 { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&gpio2 { + status = "okay"; +}; + +&gpiote20 { + status = "okay"; +}; + +&gpiote30 { + status = "okay"; +}; diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.yaml b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.yaml new file mode 100644 index 00000000000..927773e0d5a --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr.yaml @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +identifier: nrf54l15dk/nrf54l15/cpuflpr +name: nRF54L15-DK-nRF54L15-Fast-Lightweight-Peripheral-Processor +type: mcu +arch: riscv +toolchain: + - zephyr +sysbuild: true +ram: 96 +flash: 96 +supported: + - counter + - gpio + - i2c + - spi + - watchdog diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_defconfig b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_defconfig new file mode 100644 index 00000000000..256ac9103b4 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_defconfig @@ -0,0 +1,17 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable GPIO +CONFIG_GPIO=y + +CONFIG_USE_DT_CODE_PARTITION=y + +# Execute from SRAM +CONFIG_XIP=n diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.dts b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.dts new file mode 100644 index 00000000000..6855e091d3c --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.dts @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "nrf54l15dk_nrf54l15_cpuflpr.dts" + +&cpuflpr_sram { + reg = <0x2002f000 DT_SIZE_K(68)>; + ranges = <0x0 0x2002f000 0x11000>; +}; diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.yaml b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.yaml new file mode 100644 index 00000000000..d82dea6491f --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip.yaml @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +identifier: nrf54l15dk/nrf54l15/cpuflpr/xip +name: nRF54L15-DK-nRF54L15-Fast-Lightweight-Peripheral-Processor (RRAM XIP) +type: mcu +arch: riscv +toolchain: + - zephyr +sysbuild: true +ram: 68 +flash: 96 +supported: + - counter + - gpio + - i2c + - spi + - watchdog diff --git a/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip_defconfig b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip_defconfig new file mode 100644 index 00000000000..0a436a648b4 --- /dev/null +++ b/boards/nordic/nrf54l15dk/nrf54l15dk_nrf54l15_cpuflpr_xip_defconfig @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable GPIO +CONFIG_GPIO=y + +# Execute from RRAM +CONFIG_XIP=y