hw: Add initial support for Nordic nRF54L15
This adds initial support for Nordic nRF54L15.
GPIO, timers, GRTC and UART is implemented.
diff --git a/hw/bsp/nordic_pca10156/bsp.yml b/hw/bsp/nordic_pca10156/bsp.yml
new file mode 100644
index 0000000..c323504
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/bsp.yml
@@ -0,0 +1,59 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+bsp.name: "nRF54L15 PDK"
+bsp.url:
+bsp.maker: "Nordic Semiconductor"
+bsp.arch: cortex_m33
+bsp.compiler: "@apache-mynewt-core/compiler/arm-none-eabi-m33"
+bsp.linkerscript: autogenerated
+bsp.downloadscript: "hw/scripts/download.sh"
+bsp.debugscript: "hw/bsp/nordic_pca10156/nordic_pca10156_debug.sh"
+
+bsp.flash_map:
+ areas:
+ # System areas.
+ FLASH_AREA_BOOTLOADER:
+ device: 0
+ offset: 0x00000000
+ size: 32kB
+ FLASH_AREA_IMAGE_0:
+ device: 0
+ offset: 0x0000c000
+ size: 722kB
+ FLASH_AREA_IMAGE_1:
+ device: 0
+ offset: 0x000C0800
+ size: 722kB
+ FLASH_AREA_IMAGE_SCRATCH:
+ device: 0
+ offset: 0x00175000
+ size: 16kB
+
+ # User areas.
+ FLASH_AREA_REBOOT_LOG:
+ user_id: 0
+ device: 0
+ offset: 0x00008000
+ size: 16kB
+ FLASH_AREA_NFFS:
+ user_id: 1
+ device: 0
+ offset: 0x00179000
+ size: 16kB
diff --git a/hw/bsp/nordic_pca10156/include/bsp/bsp.h b/hw/bsp/nordic_pca10156/include/bsp/bsp.h
new file mode 100644
index 0000000..10bdbf7
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/include/bsp/bsp.h
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef _BSP_H_
+#define _BSP_H_
+
+#include <inttypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Define special stackos sections */
+#define sec_data_core __attribute__((section(".data.core")))
+#define sec_bss_core __attribute__((section(".bss.core")))
+#define sec_bss_nz_core __attribute__((section(".bss.core.nz")))
+
+/* More convenient section placement macros. */
+#define bssnz_t sec_bss_nz_core
+
+extern uint8_t _ram_start;
+#define RAM_SIZE 0x40000
+
+/* LED pins */
+#define LED_1 (73)
+#define LED_2 (42)
+#define LED_3 (71)
+#define LED_4 (46)
+#define LED_BLINK_PIN (LED_1)
+
+/* Buttons */
+#define BUTTON_1 (45)
+#define BUTTON_2 (41)
+#define BUTTON_3 (40)
+#define BUTTON_4 (4)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _BSP_H_ */
diff --git a/hw/bsp/nordic_pca10156/nordic_pca10156_debug.sh b/hw/bsp/nordic_pca10156/nordic_pca10156_debug.sh
new file mode 100755
index 0000000..a521c89
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/nordic_pca10156_debug.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# Called with following variables set:
+# - CORE_PATH is absolute path to @apache-mynewt-core
+# - BSP_PATH is absolute path to hw/bsp/bsp_name
+# - BIN_BASENAME is the path to prefix to target binary,
+# .elf appended to name is the ELF file
+# - FEATURES holds the target features string
+# - EXTRA_JTAG_CMD holds extra parameters to pass to jtag software
+# - RESET set if target should be reset when attaching
+# - NO_GDB set if we should not start gdb to debug
+#
+
+. $CORE_PATH/hw/scripts/jlink.sh
+
+FILE_NAME=$BIN_BASENAME.elf
+JLINK_DEV="Cortex-M33"
+
+jlink_debug
+
diff --git a/hw/bsp/nordic_pca10156/pkg.yml b/hw/bsp/nordic_pca10156/pkg.yml
new file mode 100644
index 0000000..de94b7e
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/pkg.yml
@@ -0,0 +1,42 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: hw/bsp/nordic_pca10156
+pkg.type: bsp
+pkg.description: BSP definition for the Nordic PCA10156 (nRF54L15-PDK)
+pkg.author: "Apache Mynewt <dev@mynewt.apache.org>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+ - nrf54
+ - nordic
+ - pca10156
+
+pkg.cflags:
+ - '-DNRF54L15_XXAA'
+ - '-DNRF_APPLICATION'
+
+pkg.cflags.HARDFLOAT:
+ - -mfloat-abi=hard -mfpu=fpv4-sp-d16
+
+pkg.deps:
+ - "@apache-mynewt-core/hw/scripts"
+ - "@apache-mynewt-core/hw/mcu/nordic/nrf54lxx"
+ - "@apache-mynewt-core/libc/baselibc"
+ - "@apache-mynewt-core/sys/flash_map"
+ - "@apache-mynewt-core/boot/startup"
diff --git a/hw/bsp/nordic_pca10156/src/hal_bsp.c b/hw/bsp/nordic_pca10156/src/hal_bsp.c
new file mode 100644
index 0000000..a61c809
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/src/hal_bsp.c
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+#include <assert.h>
+#include <os/mynewt.h>
+#include <nrfx.h>
+#include <flash_map/flash_map.h>
+#include <hal/hal_bsp.h>
+#include <hal/hal_flash.h>
+#include <hal/hal_system.h>
+#include <mcu/nrf54l_hal.h>
+#include <mcu/nrf54l_periph.h>
+#include <bsp/bsp.h>
+
+/*
+ * What memory to include in coredump.
+ */
+static const struct hal_bsp_mem_dump dump_cfg[] = {
+ [0] = { .hbmd_start = &_ram_start, .hbmd_size = RAM_SIZE }
+};
+
+const struct hal_flash *
+hal_bsp_flash_dev(uint8_t id)
+{
+ /*
+ * Internal flash mapped to id 0.
+ */
+ if (id == 0) {
+ return &nrf54l_flash_dev;
+ }
+
+ return NULL;
+}
+
+const struct hal_bsp_mem_dump *
+hal_bsp_core_dump(int *area_cnt)
+{
+ *area_cnt = sizeof(dump_cfg) / sizeof(dump_cfg[0]);
+ return dump_cfg;
+}
+
+int
+hal_bsp_power_state(int state)
+{
+ return 0;
+}
+
+void
+hal_bsp_init(void)
+{
+ /* Make sure system clocks have started */
+ hal_system_clock_start();
+
+ /* Create all available nRF54 peripherals */
+ nrf54l_periph_create();
+}
+
+void
+hal_bsp_deinit(void)
+{}
diff --git a/hw/bsp/nordic_pca10156/src/sbrk.c b/hw/bsp/nordic_pca10156/src/sbrk.c
new file mode 100644
index 0000000..38be573
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/src/sbrk.c
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <hal/hal_bsp.h>
+
+/* put these in the data section so they are not cleared by _start */
+static char *sbrkBase __attribute__((section(".data")));
+static char *sbrkLimit __attribute__((section(".data")));
+static char *brk __attribute__((section(".data")));
+
+void
+_sbrkInit(char *base, char *limit)
+{
+ sbrkBase = base;
+ sbrkLimit = limit;
+ brk = base;
+}
+
+void *
+_sbrk(int incr)
+{
+ void *prev_brk;
+
+ if (incr < 0) {
+ /* Returning memory to the heap. */
+ incr = -incr;
+ if (brk - incr < sbrkBase) {
+ prev_brk = (void *)-1;
+ } else {
+ prev_brk = brk;
+ brk -= incr;
+ }
+ } else {
+ /* Allocating memory from the heap. */
+ if (sbrkLimit - brk >= incr) {
+ prev_brk = brk;
+ brk += incr;
+ } else {
+ prev_brk = (void *)-1;
+ }
+ }
+
+ return prev_brk;
+}
diff --git a/hw/bsp/nordic_pca10156/syscfg.yml b/hw/bsp/nordic_pca10156/syscfg.yml
new file mode 100644
index 0000000..28c25c6
--- /dev/null
+++ b/hw/bsp/nordic_pca10156/syscfg.yml
@@ -0,0 +1,40 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+syscfg.defs:
+ BSP_NRF54:
+ description: 'Set to indicate that BSP has NRF54'
+ value: 1
+
+syscfg.vals:
+ # Set default pins for peripherals
+ UART_0_PIN_TX: 36
+ UART_0_PIN_RX: 37
+ UART_0_PIN_RTS: 38
+ UART_0_PIN_CTS: 39
+
+ MCU_RAM_SIZE: 256K
+ MCU_RAM_START: 0x20000000
+
+ COREDUMP_FLASH_AREA: FLASH_AREA_IMAGE_1
+ MCU_DCDC_ENABLED: 1
+ MCU_LFCLK_SOURCE: LFXO
+
+ MYNEWT_DOWNLOADER: nrfutil
+ JLINK_TARGET: CORTEX-M33
+ MYNEWT_DOWNLOADER_MFG_IMAGE_FLASH_OFFSET: 0x0
diff --git a/hw/mcu/nordic/include/nrfx_config.h b/hw/mcu/nordic/include/nrfx_config.h
index 17dacac..4c6c0e6 100644
--- a/hw/mcu/nordic/include/nrfx_config.h
+++ b/hw/mcu/nordic/include/nrfx_config.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019 - 2023, Nordic Semiconductor ASA
+ * Copyright (c) 2019 - 2024, Nordic Semiconductor ASA
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -36,25 +36,33 @@
#include <nrfx_config_common.h>
#if defined(NRF51)
- #include <nrfx_config_nrf51.h>
+#include <nrfx_config_nrf51.h>
#elif defined(NRF52805_XXAA)
- #include <nrfx_config_nrf52805.h>
+#include <nrfx_config_nrf52805.h>
#elif defined(NRF52810_XXAA)
- #include <nrfx_config_nrf52810.h>
+#include <nrfx_config_nrf52810.h>
#elif defined(NRF52811_XXAA)
- #include <nrfx_config_nrf52811.h>
+#include <nrfx_config_nrf52811.h>
#elif defined(NRF52820_XXAA)
- #include <nrfx_config_nrf52820.h>
+#include <nrfx_config_nrf52820.h>
#elif defined(NRF52832_XXAA) || defined (NRF52832_XXAB)
- #include <nrfx_config_nrf52832.h>
+#include <nrfx_config_nrf52832.h>
#elif defined(NRF52833_XXAA)
- #include <nrfx_config_nrf52833.h>
+#include <nrfx_config_nrf52833.h>
#elif defined(NRF52840_XXAA)
- #include <nrfx_config_nrf52840.h>
+#include <nrfx_config_nrf52840.h>
#elif defined(NRF5340_XXAA_APPLICATION)
- #include <nrfx_config_nrf5340_application.h>
+#include <nrfx_config_nrf5340_application.h>
#elif defined(NRF5340_XXAA_NETWORK)
- #include <nrfx_config_nrf5340_network.h>
+#include <nrfx_config_nrf5340_network.h>
+#elif defined(NRF54H20_XXAA) && defined(NRF_APPLICATION)
+#include <nrfx_config_nrf54h20_application.h>
+#elif defined(NRF54H20_XXAA) && defined(NRF_RADIOCORE)
+#include <nrfx_config_nrf54h20_radiocore.h>
+#elif defined(NRF54H20_XXAA) && defined(NRF_PPR)
+ #include <nrfx_config_nrf54h20_ppr.h>
+#elif defined(NRF54H20_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54h20_flpr.h>
#elif defined(NRF54H20_ENGA_XXAA) && defined(NRF_APPLICATION)
#include <nrfx_config_nrf54h20_enga_application.h>
#elif defined(NRF54H20_ENGA_XXAA) && defined(NRF_RADIOCORE)
@@ -63,12 +71,50 @@
#include <nrfx_config_nrf54h20_enga_ppr.h>
#elif defined(NRF54H20_ENGA_XXAA) && defined(NRF_FLPR)
#include <nrfx_config_nrf54h20_enga_flpr.h>
+#elif defined(NRF54H20_ENGB_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf54h20_engb_application.h>
+#elif defined(NRF54H20_ENGB_XXAA) && defined(NRF_RADIOCORE)
+ #include <nrfx_config_nrf54h20_engb_radiocore.h>
+#elif defined(NRF54H20_ENGB_XXAA) && defined(NRF_PPR)
+ #include <nrfx_config_nrf54h20_engb_ppr.h>
+#elif defined(NRF54H20_ENGB_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54h20_engb_flpr.h>
+#elif defined(NRF54L05_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf54l05_application.h>
+#elif defined(NRF54L05_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54l05_flpr.h>
+#elif defined(NRF54L09_ENGA_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf54l09_enga_application.h>
+#elif defined(NRF54L09_ENGA_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54l09_enga_flpr.h>
+#elif defined(NRF54L10_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf54l10_application.h>
+#elif defined(NRF54L10_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54l10_flpr.h>
+#elif defined(NRF54L15_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf54l15_application.h>
+#elif defined(NRF54L15_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54l15_flpr.h>
#elif defined(NRF54L15_ENGA_XXAA) && defined(NRF_APPLICATION)
#include <nrfx_config_nrf54l15_enga_application.h>
+#elif defined(NRF54L15_ENGA_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54l15_enga_flpr.h>
+#elif defined(NRF54L20_ENGA_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf54l20_enga_application.h>
+#elif defined(NRF54L20_ENGA_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf54l20_enga_flpr.h>
#elif defined(NRF9120_XXAA) || defined(NRF9160_XXAA)
#include <nrfx_config_nrf91.h>
+#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_APPLICATION)
+ #include <nrfx_config_nrf9230_engb_application.h>
+#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_RADIOCORE)
+ #include <nrfx_config_nrf9230_engb_radiocore.h>
+#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_PPR)
+ #include <nrfx_config_nrf9230_engb_ppr.h>
+#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_FLPR)
+ #include <nrfx_config_nrf9230_engb_flpr.h>
#else
- #error "Unknown device."
+ #include "nrfx_config_ext.h"
#endif
#endif // NRFX_CONFIG_H__
diff --git a/hw/mcu/nordic/nrf54lxx/include/mcu/cmsis_nvic.h b/hw/mcu/nordic/nrf54lxx/include/mcu/cmsis_nvic.h
new file mode 100644
index 0000000..a75189c
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/mcu/cmsis_nvic.h
@@ -0,0 +1,28 @@
+/* mbed Microcontroller Library - cmsis_nvic
+ * Copyright (c) 2009-2011 ARM Limited. All rights reserved.
+ *
+ * CMSIS-style functionality to support dynamic vectors
+ */
+
+#ifndef _CMSIS_NVIC_H_
+#define _CMSIS_NVIC_H_
+
+#include <stdint.h>
+#include <nrf.h>
+
+#define NVIC_NUM_VECTORS (16 + 270) /* CORE + MCU Peripherals */
+#define NVIC_USER_IRQ_OFFSET 16
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void NVIC_Relocate(void);
+void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
+uint32_t NVIC_GetVector(IRQn_Type IRQn);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/hw/mcu/nordic/nrf54lxx/include/mcu/cortex_m33.h b/hw/mcu/nordic/nrf54lxx/include/mcu/cortex_m33.h
new file mode 100644
index 0000000..7421ae7
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/mcu/cortex_m33.h
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef _CORTEX_M33_H_
+#define _CORTEX_M33_H_
+
+#include <nrf.h>
+#include <core_cm33.h>
+#include <syscfg/syscfg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static inline void
+hal_debug_break(void)
+{
+#if !MYNEWT_VAL(MCU_DEBUG_IGNORE_BKPT)
+ __BKPT(1);
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CORTEX_M33_H_ */
diff --git a/hw/mcu/nordic/nrf54lxx/include/mcu/mcu_vectors.h b/hw/mcu/nordic/nrf54lxx/include/mcu/mcu_vectors.h
new file mode 100644
index 0000000..b9185f9
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/mcu/mcu_vectors.h
@@ -0,0 +1,307 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+INT_VECTOR_STACK_TOP(__StackTop)
+INT_VECTOR_RESET_HANDLER(Reset_Handler)
+INT_VECTOR_NMI_HANDLER(NMI_Handler)
+INT_VECTOR_HARDFAULT_HANDLER(HardFault_Handler)
+INT_VECTOR_MEMMANAGE_HANDLER(MemoryManagement_Handler)
+INT_VECTOR_BUSFAULT_HANDLER(BusFault_Handler)
+INT_VECTOR_USAGEFAULT_HANDLER(UsageFault_Handler)
+INT_VECTOR_SECUREFAULT_HANDLER(SecureFault_Handler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_SVC_HANDLER(SVC_Handler)
+INT_VECTOR_DEBUGMON_HANDLER(DebugMon_Handler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_PENDSV_HANDLER(PendSV_Handler)
+INT_VECTOR_SYSTICK_HANDLER(SysTick_Handler)
+
+/* External Interrupts */
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SWI00_IRQHandler)
+INT_VECTOR(SWI01_IRQHandler)
+INT_VECTOR(SWI02_IRQHandler)
+INT_VECTOR(SWI03_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SPU00_IRQHandler)
+INT_VECTOR(MPC00_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(AAR00_CCM00_IRQHandler)
+INT_VECTOR(ECB00_IRQHandler)
+INT_VECTOR(CRACEN_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SERIAL00_IRQHandler)
+INT_VECTOR(RRAMC_IRQHandler)
+INT_VECTOR(VPR00_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(CTRLAP_IRQHandler)
+INT_VECTOR(CM33SS_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(TIMER00_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SPU10_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(TIMER10_IRQHandler)
+INT_VECTOR(RTC10_IRQHandler)
+INT_VECTOR(EGU10_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(RADIO_0_IRQHandler)
+INT_VECTOR(RADIO_1_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SPU20_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SERIAL20_IRQHandler)
+INT_VECTOR(SERIAL21_IRQHandler)
+INT_VECTOR(SERIAL22_IRQHandler)
+INT_VECTOR(EGU20_IRQHandler)
+INT_VECTOR(TIMER20_IRQHandler)
+INT_VECTOR(TIMER21_IRQHandler)
+INT_VECTOR(TIMER22_IRQHandler)
+INT_VECTOR(TIMER23_IRQHandler)
+INT_VECTOR(TIMER24_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(PDM20_IRQHandler)
+INT_VECTOR(PDM21_IRQHandler)
+INT_VECTOR(PWM20_IRQHandler)
+INT_VECTOR(PWM21_IRQHandler)
+INT_VECTOR(PWM22_IRQHandler)
+INT_VECTOR(SAADC_IRQHandler)
+INT_VECTOR(NFCT_IRQHandler)
+INT_VECTOR(TEMP_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(GPIOTE20_0_IRQHandler)
+INT_VECTOR(GPIOTE20_1_IRQHandler)
+INT_VECTOR(TAMPC_IRQHandler)
+INT_VECTOR(I2S20_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(QDEC20_IRQHandler)
+INT_VECTOR(QDEC21_IRQHandler)
+INT_VECTOR(GRTC_0_IRQHandler)
+INT_VECTOR(GRTC_1_IRQHandler)
+INT_VECTOR(GRTC_2_IRQHandler)
+INT_VECTOR(GRTC_3_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SPU30_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(SERIAL30_IRQHandler)
+INT_VECTOR(CLOCK_POWER_IRQHandler)
+INT_VECTOR(COMP_LPCOMP_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(WDT30_IRQHandler)
+INT_VECTOR(WDT31_IRQHandler)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR_UNUSED(0)
+INT_VECTOR(GPIOTE30_0_IRQHandler)
+INT_VECTOR(GPIOTE30_1_IRQHandler)
diff --git a/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_clock.h b/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_clock.h
new file mode 100644
index 0000000..da3dc6b
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_clock.h
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef H_NRF54L_CLOCK_
+#define H_NRF54L_CLOCK_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Request HFXO clock be turned on. Note that each request must have a
+ * corresponding release.
+ *
+ * @return int 0: hfxo was already on. 1: hfxo was turned on.
+ */
+int nrf54l_clock_hfxo_request(void);
+
+/**
+ * Release the HFXO; caller no longer needs the HFXO to be turned on. Each call
+ * to release should have been preceeded by a corresponding call to request the
+ * HFXO
+ *
+ *
+ * @return int 0: HFXO not stopped by this call (others using it) 1: HFXO
+ * stopped.
+ */
+int nrf54l_clock_hfxo_release(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* H_NRF54L_CLOCK_ */
diff --git a/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_hal.h b/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_hal.h
new file mode 100644
index 0000000..2ca522d
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_hal.h
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef _NRF54L_HAL_H_
+#define _NRF54L_HAL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Helper functions to enable/disable interrupts. */
+#define __HAL_DISABLE_INTERRUPTS(x) \
+ do { \
+ x = __get_PRIMASK(); \
+ __disable_irq(); \
+ } while (0)
+
+#define __HAL_ENABLE_INTERRUPTS(x) \
+ do { \
+ if (!x) { \
+ __enable_irq(); \
+ } \
+ } while (0)
+
+struct nrf54l_uart_cfg {
+ int8_t suc_pin_tx; /* pins for IO */
+ int8_t suc_pin_rx;
+ int8_t suc_pin_rts;
+ int8_t suc_pin_cts;
+};
+const struct nrf54l_uart_cfg *bsp_uart_config(void);
+struct hal_flash;
+extern const struct hal_flash nrf54l_flash_dev;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NRF54L_HAL_H_ */
diff --git a/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_periph.h b/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_periph.h
new file mode 100644
index 0000000..0322a23
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/mcu/nrf54l_periph.h
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef _NRF54L_PERIPH_H_
+#define _NRF54L_PERIPH_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void nrf54l_periph_create(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NRF54L_PERIPH_H_ */
diff --git a/hw/mcu/nordic/nrf54lxx/include/nrfx_config_nrf54l15_application.h b/hw/mcu/nordic/nrf54lxx/include/nrfx_config_nrf54l15_application.h
new file mode 100644
index 0000000..13f9457
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/include/nrfx_config_nrf54l15_application.h
@@ -0,0 +1,1800 @@
+/*
+ * Copyright (c) 2024, Nordic Semiconductor ASA
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NRFX_CONFIG_NRF54L15_APPLICATION_H__
+#define NRFX_CONFIG_NRF54L15_APPLICATION_H__
+
+#ifndef NRFX_CONFIG_H__
+#error "This file should not be included directly. Include nrfx_config.h instead."
+#endif
+
+#include "syscfg/syscfg.h"
+
+/**
+ * @brief NRFX_DEFAULT_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_DEFAULT_IRQ_PRIORITY
+#define NRFX_DEFAULT_IRQ_PRIORITY 7
+#endif
+
+/**
+ * @brief NRFX_CLOCK_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_CLOCK_ENABLED
+#define NRFX_CLOCK_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_CLOCK_CONFIG_LF_SRC
+ *
+ * Integer value.
+ * Supported values:
+ * - RC = 0
+ * - XTAL = 1
+ * - Synth = 2
+ */
+#ifndef NRFX_CLOCK_CONFIG_LF_SRC
+#define NRFX_CLOCK_CONFIG_LF_SRC 1
+#endif
+
+/**
+ * @brief NRFX_CLOCK_CONFIG_LF_CAL_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_CLOCK_CONFIG_LF_CAL_ENABLED
+#define NRFX_CLOCK_CONFIG_LF_CAL_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_CLOCK_CONFIG_LFXO_TWO_STAGE_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_CLOCK_CONFIG_LFXO_TWO_STAGE_ENABLED
+#define NRFX_CLOCK_CONFIG_LFXO_TWO_STAGE_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_CLOCK_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_CLOCK_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_CLOCK_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_CLOCK_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_CLOCK_CONFIG_LOG_ENABLED
+#define NRFX_CLOCK_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_CLOCK_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_CLOCK_CONFIG_LOG_LEVEL
+#define NRFX_CLOCK_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_COMP_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_COMP_ENABLED
+#define NRFX_COMP_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_COMP_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_COMP_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_COMP_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_COMP_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_COMP_CONFIG_LOG_ENABLED
+#define NRFX_COMP_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_COMP_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_COMP_CONFIG_LOG_LEVEL
+#define NRFX_COMP_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_DPPI_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_DPPI_ENABLED
+#define NRFX_DPPI_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_DPPI_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_DPPI_CONFIG_LOG_ENABLED
+#define NRFX_DPPI_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_DPPI_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_DPPI_CONFIG_LOG_LEVEL
+#define NRFX_DPPI_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_DPPI00_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_DPPI00_ENABLED
+#define NRFX_DPPI00_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_DPPI10_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_DPPI10_ENABLED
+#define NRFX_DPPI10_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_DPPI20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_DPPI20_ENABLED
+#define NRFX_DPPI20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_DPPI30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_DPPI30_ENABLED
+#define NRFX_DPPI30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_EGU_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_EGU_ENABLED
+#define NRFX_EGU_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_EGU_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_EGU_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_EGU_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_EGU10_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_EGU10_ENABLED
+#define NRFX_EGU10_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_EGU20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_EGU20_ENABLED
+#define NRFX_EGU20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GPIOTE_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GPIOTE_ENABLED
+#define NRFX_GPIOTE_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GPIOTE_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_GPIOTE_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_GPIOTE_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_GPIOTE_CONFIG_NUM_OF_EVT_HANDLERS
+ *
+ * Integer value. Minimum: 0. Maximum: 15.
+ */
+#ifndef NRFX_GPIOTE_CONFIG_NUM_OF_EVT_HANDLERS
+#define NRFX_GPIOTE_CONFIG_NUM_OF_EVT_HANDLERS 2
+#endif
+
+/**
+ * @brief NRFX_GPIOTE_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GPIOTE_CONFIG_LOG_ENABLED
+#define NRFX_GPIOTE_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GPIOTE_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_GPIOTE_CONFIG_LOG_LEVEL
+#define NRFX_GPIOTE_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_GPIOTE20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GPIOTE20_ENABLED
+#define NRFX_GPIOTE20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GPIOTE30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GPIOTE30_ENABLED
+#define NRFX_GPIOTE30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GRTC_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GRTC_ENABLED
+#define NRFX_GRTC_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_AUTOEN
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GRTC_CONFIG_AUTOEN
+#define NRFX_GRTC_CONFIG_AUTOEN 1
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_AUTOSTART
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GRTC_CONFIG_AUTOSTART
+#define NRFX_GRTC_CONFIG_AUTOSTART 1
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_CLEAR_AT_INIT
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GRTC_CONFIG_CLEAR_AT_INIT
+#define NRFX_GRTC_CONFIG_CLEAR_AT_INIT 0
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_NUM_OF_CC_CHANNELS
+ *
+ * Integer value.
+ */
+#ifndef NRFX_GRTC_CONFIG_NUM_OF_CC_CHANNELS
+#define NRFX_GRTC_CONFIG_NUM_OF_CC_CHANNELS 8
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_ALLOWED_CC_CHANNELS_MASK
+ */
+#ifndef NRFX_GRTC_CONFIG_ALLOWED_CC_CHANNELS_MASK
+#define NRFX_GRTC_CONFIG_ALLOWED_CC_CHANNELS_MASK 0x00000f0f
+#endif
+
+/**
+ * @brief NRFX_GRTC_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_GRTC_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_GRTC_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_GRTC_CONFIG_LOG_ENABLED
+#define NRFX_GRTC_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_GRTC_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_GRTC_CONFIG_LOG_LEVEL
+#define NRFX_GRTC_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_I2S_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_I2S_ENABLED
+#define NRFX_I2S_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_I2S_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_I2S_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_I2S_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_I2S_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_I2S_CONFIG_LOG_ENABLED
+#define NRFX_I2S_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_I2S_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_I2S_CONFIG_LOG_LEVEL
+#define NRFX_I2S_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_I2S20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_I2S20_ENABLED
+#define NRFX_I2S20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_LPCOMP_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_LPCOMP_ENABLED
+#define NRFX_LPCOMP_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_LPCOMP_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_LPCOMP_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_LPCOMP_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_LPCOMP_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_LPCOMP_CONFIG_LOG_ENABLED
+#define NRFX_LPCOMP_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_LPCOMP_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_LPCOMP_CONFIG_LOG_LEVEL
+#define NRFX_LPCOMP_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_NFCT_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_NFCT_ENABLED
+#define NRFX_NFCT_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_NFCT_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_NFCT_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_NFCT_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_NFCT_CONFIG_TIMER_INSTANCE_ID - Timer instance used for workarounds in the driver.
+ *
+ * Integer value. Minimum: 0. Maximum: 5.
+ */
+#ifndef NRFX_NFCT_CONFIG_TIMER_INSTANCE_ID
+#define NRFX_NFCT_CONFIG_TIMER_INSTANCE_ID 0
+#endif
+
+/**
+ * @brief NRFX_NFCT_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_NFCT_CONFIG_LOG_ENABLED
+#define NRFX_NFCT_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_NFCT_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_NFCT_CONFIG_LOG_LEVEL
+#define NRFX_NFCT_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_PDM_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PDM_ENABLED
+#define NRFX_PDM_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PDM_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_PDM_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_PDM_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_PDM_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PDM_CONFIG_LOG_ENABLED
+#define NRFX_PDM_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PDM_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_PDM_CONFIG_LOG_LEVEL
+#define NRFX_PDM_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_PDM20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PDM20_ENABLED
+#define NRFX_PDM20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PDM21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PDM21_ENABLED
+#define NRFX_PDM21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_POWER_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_POWER_ENABLED
+#define NRFX_POWER_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_POWER_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_POWER_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_POWER_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_PPIB_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB_ENABLED
+#define NRFX_PPIB_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB_CONFIG_LOG_ENABLED
+#define NRFX_PPIB_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_PPIB_CONFIG_LOG_LEVEL
+#define NRFX_PPIB_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_PPIB00_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB00_ENABLED
+#define NRFX_PPIB00_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB01_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB01_ENABLED
+#define NRFX_PPIB01_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB10_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB10_ENABLED
+#define NRFX_PPIB10_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB11_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB11_ENABLED
+#define NRFX_PPIB11_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB20_ENABLED
+#define NRFX_PPIB20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB21_ENABLED
+#define NRFX_PPIB21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB22_ENABLED
+#define NRFX_PPIB22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PPIB30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PPIB30_ENABLED
+#define NRFX_PPIB30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_ENABLED
+#define NRFX_PRS_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_CONFIG_LOG_ENABLED
+#define NRFX_PRS_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_PRS_CONFIG_LOG_LEVEL
+#define NRFX_PRS_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_PRS_BOX_0_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_BOX_0_ENABLED
+#define NRFX_PRS_BOX_0_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_BOX_1_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_BOX_1_ENABLED
+#define NRFX_PRS_BOX_1_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_BOX_2_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_BOX_2_ENABLED
+#define NRFX_PRS_BOX_2_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_BOX_3_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_BOX_3_ENABLED
+#define NRFX_PRS_BOX_3_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_BOX_4_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_BOX_4_ENABLED
+#define NRFX_PRS_BOX_4_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PRS_BOX_5_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PRS_BOX_5_ENABLED
+#define NRFX_PRS_BOX_5_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PWM_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PWM_ENABLED
+#define NRFX_PWM_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_PWM_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PWM_CONFIG_LOG_ENABLED
+#define NRFX_PWM_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PWM_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_PWM_CONFIG_LOG_LEVEL
+#define NRFX_PWM_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_PWM20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PWM20_ENABLED
+#define NRFX_PWM20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PWM21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PWM21_ENABLED
+#define NRFX_PWM21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_PWM22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_PWM22_ENABLED
+#define NRFX_PWM22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_QDEC_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_QDEC_ENABLED
+#define NRFX_QDEC_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_QDEC_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_QDEC_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_QDEC_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_QDEC_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_QDEC_CONFIG_LOG_ENABLED
+#define NRFX_QDEC_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_QDEC_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_QDEC_CONFIG_LOG_LEVEL
+#define NRFX_QDEC_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_QDEC20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_QDEC20_ENABLED
+#define NRFX_QDEC20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_QDEC21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_QDEC21_ENABLED
+#define NRFX_QDEC21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_RRAMC_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_RRAMC_ENABLED
+#define NRFX_RRAMC_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_RRAMC_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_RRAMC_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_RRAMC_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_RRAMC_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_RRAMC_CONFIG_LOG_ENABLED
+#define NRFX_RRAMC_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_RRAMC_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_RRAMC_CONFIG_LOG_LEVEL
+#define NRFX_RRAMC_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_RTC_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_RTC_ENABLED
+#define NRFX_RTC_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_RTC_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_RTC_CONFIG_LOG_ENABLED
+#define NRFX_RTC_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_RTC_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_RTC_CONFIG_LOG_LEVEL
+#define NRFX_RTC_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_RTC10_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_RTC10_ENABLED
+#define NRFX_RTC10_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_RTC30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_RTC30_ENABLED
+#define NRFX_RTC30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SAADC_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SAADC_ENABLED
+#define NRFX_SAADC_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SAADC_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_SAADC_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_SAADC_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_SAADC_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SAADC_CONFIG_LOG_ENABLED
+#define NRFX_SAADC_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SAADC_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_SAADC_CONFIG_LOG_LEVEL
+#define NRFX_SAADC_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_SPIM_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM_ENABLED
+#define NRFX_SPIM_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_SPIM_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM_CONFIG_LOG_ENABLED
+#define NRFX_SPIM_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIM_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_SPIM_CONFIG_LOG_LEVEL
+#define NRFX_SPIM_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_SPIM00_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM00_ENABLED
+#define NRFX_SPIM00_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIM20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM20_ENABLED
+#define NRFX_SPIM20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIM21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM21_ENABLED
+#define NRFX_SPIM21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIM22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM22_ENABLED
+#define NRFX_SPIM22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIM30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIM30_ENABLED
+#define NRFX_SPIM30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS_ENABLED
+#define NRFX_SPIS_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_SPIS_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS_CONFIG_LOG_ENABLED
+#define NRFX_SPIS_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_SPIS_CONFIG_LOG_LEVEL
+#define NRFX_SPIS_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_SPIS00_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS00_ENABLED
+#define NRFX_SPIS00_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS20_ENABLED
+#define NRFX_SPIS20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS21_ENABLED
+#define NRFX_SPIS21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS22_ENABLED
+#define NRFX_SPIS22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SPIS30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SPIS30_ENABLED
+#define NRFX_SPIS30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_SYSTICK_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_SYSTICK_ENABLED
+#define NRFX_SYSTICK_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TEMP_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TEMP_ENABLED
+#define NRFX_TEMP_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TEMP_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_TEMP_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_TEMP_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_TEMP_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TEMP_CONFIG_LOG_ENABLED
+#define NRFX_TEMP_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TEMP_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_TEMP_CONFIG_LOG_LEVEL
+#define NRFX_TEMP_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_TIMER_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER_ENABLED
+#define NRFX_TIMER_ENABLED 1
+#endif
+
+/**
+ * @brief NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_TIMER_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER_CONFIG_LOG_ENABLED
+#define NRFX_TIMER_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TIMER_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_TIMER_CONFIG_LOG_LEVEL
+#define NRFX_TIMER_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_TIMER00_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER00_ENABLED
+#define NRFX_TIMER00_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TIMER10_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER10_ENABLED
+#define NRFX_TIMER10_ENABLED 1
+#endif
+
+/**
+ * @brief NRFX_TIMER20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER20_ENABLED
+#define NRFX_TIMER20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TIMER21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER21_ENABLED
+#define NRFX_TIMER21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TIMER22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER22_ENABLED
+#define NRFX_TIMER22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TIMER23_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER23_ENABLED
+#define NRFX_TIMER23_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TIMER24_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TIMER24_ENABLED
+#define NRFX_TIMER24_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIM_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIM_ENABLED
+#define NRFX_TWIM_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_TWIM_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIM_CONFIG_LOG_ENABLED
+#define NRFX_TWIM_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIM_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_TWIM_CONFIG_LOG_LEVEL
+#define NRFX_TWIM_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_TWIM20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIM20_ENABLED
+#define NRFX_TWIM20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIM21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIM21_ENABLED
+#define NRFX_TWIM21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIM22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIM22_ENABLED
+#define NRFX_TWIM22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIM30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIM30_ENABLED
+#define NRFX_TWIM30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIS_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS_ENABLED
+#define NRFX_TWIS_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_TWIS_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS_CONFIG_LOG_ENABLED
+#define NRFX_TWIS_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once.
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY
+#define NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0
+#endif
+
+/**
+ * @brief NRFX_TWIS_NO_SYNC_MODE - Remove support for synchronous mode.
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS_NO_SYNC_MODE
+#define NRFX_TWIS_NO_SYNC_MODE 0
+#endif
+
+/**
+ * @brief NRFX_TWIS_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_TWIS_CONFIG_LOG_LEVEL
+#define NRFX_TWIS_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_TWIS20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS20_ENABLED
+#define NRFX_TWIS20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIS21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS21_ENABLED
+#define NRFX_TWIS21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIS22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS22_ENABLED
+#define NRFX_TWIS22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_TWIS30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_TWIS30_ENABLED
+#define NRFX_TWIS30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE_ENABLED
+#define NRFX_UARTE_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE_CONFIG_SKIP_GPIO_CONFIG - If enabled, support for configuring GPIO pins is removed from the driver
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE_CONFIG_SKIP_GPIO_CONFIG
+#define NRFX_UARTE_CONFIG_SKIP_GPIO_CONFIG 0
+#endif
+
+/**
+ * @brief NRFX_UARTE_CONFIG_SKIP_PSEL_CONFIG - If enabled, support for configuring PSEL registers is removed from the driver
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE_CONFIG_SKIP_PSEL_CONFIG
+#define NRFX_UARTE_CONFIG_SKIP_PSEL_CONFIG 0
+#endif
+
+/**
+ * @brief NRFX_UARTE_CONFIG_TX_LINK - If enabled, driver supports linking of TX transfers.
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE_CONFIG_TX_LINK
+#define NRFX_UARTE_CONFIG_TX_LINK 1
+#endif
+
+/**
+ * @brief NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_UARTE_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE_CONFIG_LOG_ENABLED
+#define NRFX_UARTE_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_UARTE_CONFIG_LOG_LEVEL
+#define NRFX_UARTE_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_UARTE00_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE00_ENABLED
+#define NRFX_UARTE00_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE20_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE20_ENABLED
+#define NRFX_UARTE20_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE21_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE21_ENABLED
+#define NRFX_UARTE21_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE22_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE22_ENABLED
+#define NRFX_UARTE22_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_UARTE30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_UARTE30_ENABLED
+#define NRFX_UARTE30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_WDT_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_WDT_ENABLED
+#define NRFX_WDT_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY
+ *
+ * Integer value. Minimum: 0. Maximum: 7.
+ */
+#ifndef NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY
+#define NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY NRFX_DEFAULT_IRQ_PRIORITY
+#endif
+
+/**
+ * @brief NRFX_WDT_CONFIG_NO_IRQ - Remove WDT IRQ handling from WDT driver
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_WDT_CONFIG_NO_IRQ
+#define NRFX_WDT_CONFIG_NO_IRQ 0
+#endif
+
+/**
+ * @brief NRFX_WDT_CONFIG_LOG_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_WDT_CONFIG_LOG_ENABLED
+#define NRFX_WDT_CONFIG_LOG_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_WDT_CONFIG_LOG_LEVEL
+ *
+ * Integer value.
+ * Supported values:
+ * - Off = 0
+ * - Error = 1
+ * - Warning = 2
+ * - Info = 3
+ * - Debug = 4
+ */
+#ifndef NRFX_WDT_CONFIG_LOG_LEVEL
+#define NRFX_WDT_CONFIG_LOG_LEVEL 3
+#endif
+
+/**
+ * @brief NRFX_WDT30_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_WDT30_ENABLED
+#define NRFX_WDT30_ENABLED 0
+#endif
+
+/**
+ * @brief NRFX_WDT31_ENABLED
+ *
+ * Boolean. Accepted values: 0 and 1.
+ */
+#ifndef NRFX_WDT31_ENABLED
+#define NRFX_WDT31_ENABLED 0
+#endif
+
+#endif /* NRFX_CONFIG_NRF54L15_APPLICATION_H__ */
diff --git a/hw/mcu/nordic/nrf54lxx/pkg.yml b/hw/mcu/nordic/nrf54lxx/pkg.yml
new file mode 100644
index 0000000..80d09c0
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/pkg.yml
@@ -0,0 +1,52 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: hw/mcu/nordic/nrf54lxx
+pkg.description: MCU definition for Nordic nRF54Lxx ARM Cortex-M33 chip.
+pkg.author: "Apache Mynewt <dev@mynewt.apache.org>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+ - nrf54lxx
+ - nrf54
+ - nrfx
+
+#TODO: should be removed when dereferencing type-punned pointer is removed from nrfx's nrf_grtc.h
+pkg.cflags:
+ - -Wno-error=strict-aliasing
+
+pkg.deps:
+ - "@apache-mynewt-core/hw/mcu/nordic"
+ - "@apache-mynewt-core/hw/cmsis-core"
+ - "@apache-mynewt-core/hw/hal"
+ - "@apache-mynewt-core/hw/mcu/nordic/nrf_common"
+
+pkg.deps.UART_0:
+ - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
+
+pkg.deps.UART_1:
+ - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
+
+pkg.deps.UART_2:
+ - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
+
+pkg.deps.UART_3:
+ - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
+
+pkg.deps.BLE_CONTROLLER:
+ - "@apache-mynewt-nimble/nimble/drivers/nrf5x"
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_flash.c b/hw/mcu/nordic/nrf54lxx/src/hal_flash.c
new file mode 100644
index 0000000..0ce4870
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_flash.c
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <string.h>
+#include <assert.h>
+#include <mcu/nrf54l_hal.h>
+#include <hal/hal_flash_int.h>
+#include <nrf_mem.h>
+
+#define NRF54L_FLASH_SECTOR_SZ 4096
+
+static int
+nrf54l_flash_wait_ready(void)
+{
+ int i;
+
+ for (i = 0; i < 100000; i++) {
+ if (NRF_RRAMC->READY == RRAMC_READY_READY_Ready) {
+ return 0;
+ }
+ }
+ return -1;
+}
+
+static int
+nrf54l_flash_read(const struct hal_flash *dev, uint32_t address, void *dst,
+ uint32_t num_bytes)
+{
+ memcpy(dst, (void *)address, num_bytes);
+ return 0;
+}
+
+/*
+ * Flash write is done by writing 4 bytes at a time at a word boundary.
+ */
+static int
+nrf54l_flash_write(const struct hal_flash *dev, uint32_t address,
+ const void *src, uint32_t num_bytes)
+{
+ int sr;
+ int rc = -1;
+ uint32_t val;
+ int cnt;
+ uint32_t tmp;
+
+ if (nrf54l_flash_wait_ready()) {
+ return -1;
+ }
+ __HAL_DISABLE_INTERRUPTS(sr);
+
+ NRF_RRAMC->CONFIG = RRAMC_CONFIG_WEN_Enabled; /* Enable erase OP */
+
+ tmp = address & 0x3;
+ if (tmp) {
+ if (nrf54l_flash_wait_ready()) {
+ goto out;
+ }
+ /*
+ * Starts at a non-word boundary. Read 4 bytes which were there
+ * before, update with new data, and write back.
+ */
+ val = *(uint32_t *)(address & ~0x3);
+ cnt = 4 - tmp;
+ if (cnt > num_bytes) {
+ cnt = num_bytes;
+ }
+ memcpy((uint8_t *)&val + tmp, src, cnt);
+ *(uint32_t *)(address & ~0x3) = val;
+ address += cnt;
+ num_bytes -= cnt;
+ src += cnt;
+ }
+
+ while (num_bytes >= sizeof(uint32_t)) {
+ /*
+ * Write data 4 bytes at a time.
+ */
+ if (nrf54l_flash_wait_ready()) {
+ goto out;
+ }
+ *(uint32_t *)address = *(uint32_t *)src;
+ address += sizeof(uint32_t);
+ src += sizeof(uint32_t);
+ num_bytes -= sizeof(uint32_t);
+ }
+ if (num_bytes) {
+ /*
+ * Deal with the trailing bytes.
+ */
+ val = *(uint32_t *)address;
+ memcpy(&val, src, num_bytes);
+ if (nrf54l_flash_wait_ready()) {
+ goto out;
+ }
+ *(uint32_t *)address = val;
+ }
+
+ rc = nrf54l_flash_wait_ready();
+out:
+ NRF_RRAMC->CONFIG = RRAMC_CONFIG_WEN_Disabled;
+ __HAL_ENABLE_INTERRUPTS(sr);
+ return rc;
+}
+
+static int
+nrf54l_flash_erase_sector(const struct hal_flash *dev, uint32_t sector_address)
+{
+ uint32_t val = 0xffffffff;
+
+ return nrf54l_flash_write(dev, sector_address, &val, sizeof(val));
+}
+
+static int
+nrf54l_flash_sector_info(const struct hal_flash *dev, int idx,
+ uint32_t *address, uint32_t *sz)
+{
+ assert(idx < nrf54l_flash_dev.hf_sector_cnt);
+ *address = idx * NRF54L_FLASH_SECTOR_SZ;
+ *sz = NRF54L_FLASH_SECTOR_SZ;
+ return 0;
+}
+
+static int
+nrf54l_flash_init(const struct hal_flash *dev)
+{
+ return 0;
+}
+
+static const struct hal_flash_funcs nrf54l_flash_funcs = {
+ .hff_read = nrf54l_flash_read,
+ .hff_write = nrf54l_flash_write,
+ .hff_erase_sector = nrf54l_flash_erase_sector,
+ .hff_sector_info = nrf54l_flash_sector_info,
+ .hff_init = nrf54l_flash_init
+};
+
+const struct hal_flash nrf54l_flash_dev = {
+ .hf_itf = &nrf54l_flash_funcs,
+ .hf_base_addr = NRF_MEMORY_FLASH_BASE,
+ .hf_size = NRF_MEMORY_FLASH_SIZE,
+ .hf_sector_cnt = NRF54L_FLASH_SECTOR_SZ,
+ .hf_align = MYNEWT_VAL(MCU_FLASH_MIN_WRITE_SIZE),
+ .hf_erased_val = 0xff,
+};
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_nvreg.c b/hw/mcu/nordic/nrf54lxx/src/hal_nvreg.c
new file mode 100644
index 0000000..03f0033
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_nvreg.c
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include <mcu/cortex_m33.h>
+#include <hal/hal_nvreg.h>
+#include <nrf.h>
+
+/* There are two GPREGRET registers on the NRF54 */
+#define HAL_NVREG_MAX (2)
+
+/* GPREGRET registers only save the 8 lsbits */
+#define HAL_NVREG_WIDTH_BYTES (1)
+
+void
+hal_nvreg_write(unsigned int reg, uint32_t val)
+{
+ if (reg < HAL_NVREG_MAX) {
+ NRF_POWER_S->GPREGRET[reg] = val;
+ }
+}
+
+uint32_t
+hal_nvreg_read(unsigned int reg)
+{
+ uint32_t val = 0;
+
+ if (reg < HAL_NVREG_MAX) {
+ val = NRF_POWER_S->GPREGRET[reg];
+ }
+
+ return val;
+}
+
+unsigned int
+hal_nvreg_get_num_regs(void)
+{
+ return HAL_NVREG_MAX;
+}
+
+unsigned int
+hal_nvreg_get_reg_width(void)
+{
+ return HAL_NVREG_WIDTH_BYTES;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_os_tick.c b/hw/mcu/nordic/nrf54lxx/src/hal_os_tick.c
new file mode 100644
index 0000000..c1ecc6d
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_os_tick.c
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <assert.h>
+#include <os/mynewt.h>
+#include <hal/hal_os_tick.h>
+#include <nrf.h>
+#include <nrf_grtc.h>
+
+/* The OS scheduler requires a low-frequency timer. */
+#if MYNEWT_VAL(OS_SCHEDULING) && !MYNEWT_VAL(MCU_LFCLK_SOURCE)
+#error The OS scheduler requires a low-frequency timer; configure MCU_LFCLK_SOURCE
+#endif
+
+#define GRTC_FREQ 1000000 /* in Hz */
+#define GRTC_COMPARE_INT_MASK(ccreg) (1UL << (ccreg))
+
+/*
+ * Use two compare channels - one for os_tick and one to wake up from idle
+ * state. This way we can utilize INTERVAL register used with CC[0] for
+ * OS ticks. To wake up from idle state CC[1] channel is used.
+ */
+#define OS_TICK_CMPREG 0
+#define OS_TICK_CMPEV NRF_GRTC_EVENT_COMPARE_0
+#define OS_IDLE_CMPREG 1
+#define OS_IDLE_CMPEV NRF_GRTC_EVENT_COMPARE_1
+
+struct hal_os_tick {
+ int ticks_per_ostick;
+ os_time_t max_idle_ticks;
+ uint64_t lastocmp;
+};
+struct hal_os_tick g_hal_os_tick;
+
+static inline uint64_t
+nrf54l_os_tick_counter(void)
+{
+ uint32_t counterl_val, counterh_val, counterh;
+ uint64_t counter;
+
+ do {
+ counterl_val = nrf_grtc_sys_counter_low_get(NRF_GRTC);
+ counterh = nrf_grtc_sys_counter_high_get(NRF_GRTC);
+ counterh_val = counterh & NRF_GRTC_SYSCOUNTERH_VALUE_MASK;
+ } while (counterh & NRF_GRTC_SYSCOUNTERH_BUSY_MASK);
+
+ if (counterh & NRF_GRTC_SYSCOUNTERH_OVERFLOW_MASK) {
+ --counterh_val;
+ }
+
+ counter = ((uint64_t)counterh_val << 32) | counterl_val;
+ return counter;
+}
+
+static inline void
+nrf54l_os_idle_set_ocmp(uint64_t ocmp)
+{
+ int delta;
+ uint64_t counter;
+
+ OS_ASSERT_CRITICAL();
+ while (1) {
+ nrf_grtc_sys_counter_cc_set(NRF_GRTC, OS_IDLE_CMPREG, ocmp);
+ counter = nrf54l_os_tick_counter();
+
+ delta = ocmp - counter;
+ if (delta > 0) {
+ break;
+ }
+ ocmp += g_hal_os_tick.ticks_per_ostick;
+ }
+}
+
+static void
+nrf54l_timer_handler(void)
+{
+ int delta;
+ int ticks;
+ os_sr_t sr;
+ uint64_t counter;
+
+ os_trace_isr_enter();
+ OS_ENTER_CRITICAL(sr);
+
+ /* Calculate elapsed ticks and advance OS time. */
+ counter = nrf54l_os_tick_counter();
+ delta = counter - g_hal_os_tick.lastocmp;
+ ticks = delta / g_hal_os_tick.ticks_per_ostick;
+ os_time_advance(ticks);
+
+ /* Clear timer interrupt */
+ nrf_grtc_event_clear(NRF_GRTC, OS_TICK_CMPEV);
+ nrf_grtc_event_clear(NRF_GRTC, OS_IDLE_CMPEV);
+
+ /* Update the time associated with the most recent tick */
+ g_hal_os_tick.lastocmp =
+ g_hal_os_tick.lastocmp + ticks * g_hal_os_tick.ticks_per_ostick;
+
+ OS_EXIT_CRITICAL(sr);
+ os_trace_isr_exit();
+}
+
+void
+os_tick_idle(os_time_t ticks)
+{
+ uint64_t ocmp;
+
+ OS_ASSERT_CRITICAL();
+
+ if (ticks > 0) {
+ /*
+ * Enter tickless regime during long idle durations.
+ */
+ if (ticks > g_hal_os_tick.max_idle_ticks) {
+ ticks = g_hal_os_tick.max_idle_ticks;
+ }
+
+ /* Disable OS tick interrupt */
+ nrf_grtc_int_disable(NRF_GRTC, GRTC_COMPARE_INT_MASK(OS_TICK_CMPREG));
+
+ /* Set ocmp for wake up */
+ ocmp = g_hal_os_tick.lastocmp + (ticks * g_hal_os_tick.ticks_per_ostick);
+ nrf54l_os_idle_set_ocmp(ocmp);
+ }
+
+ __DSB();
+ __WFI();
+
+ if (ticks > 0) {
+ /*
+ * Update OS time and re-enable OS tick interrupt before anything else
+ * when coming out of the tickless regime.
+ */
+ nrf_grtc_int_enable(NRF_GRTC, GRTC_COMPARE_INT_MASK(OS_TICK_CMPREG));
+ nrf54l_timer_handler();
+ }
+}
+
+void
+os_tick_init(uint32_t os_ticks_per_sec, int prio)
+{
+ uint32_t sr;
+
+ assert(GRTC_FREQ % os_ticks_per_sec == 0);
+
+ g_hal_os_tick.lastocmp = 0;
+ g_hal_os_tick.ticks_per_ostick = GRTC_FREQ / os_ticks_per_sec;
+
+ /* XXX: selected this value by intuition, trying to make it roughly appropriate */
+ g_hal_os_tick.max_idle_ticks = (1UL << 27) / g_hal_os_tick.ticks_per_ostick;
+
+ /* disable interrupts */
+ OS_ENTER_CRITICAL(sr);
+
+ /* Set isr in vector table and enable interrupt */
+ NVIC_SetPriority(GRTC_IRQn, prio);
+ NVIC_SetVector(GRTC_IRQn, (uint32_t)nrf54l_timer_handler);
+ NVIC_EnableIRQ(GRTC_IRQn);
+
+ /*
+ * Program the NRF_GRTC to trigger an interrupt
+ * at an interval of 'ticks_per_ostick' and initialize CC channel
+ * for waking up from idle state.
+ */
+ nrf_grtc_task_trigger(NRF_GRTC, NRF_GRTC_TASK_STOP);
+ nrf_grtc_task_trigger(NRF_GRTC, NRF_GRTC_TASK_CLEAR);
+
+ nrf_grtc_event_disable(NRF_GRTC, 0xffffffff);
+
+ nrf_grtc_int_disable(NRF_GRTC, 0xffffffff);
+ nrf_grtc_int_enable(NRF_GRTC, GRTC_COMPARE_INT_MASK(OS_TICK_CMPREG));
+ nrf_grtc_int_enable(NRF_GRTC, GRTC_COMPARE_INT_MASK(OS_IDLE_CMPREG));
+
+ nrf_grtc_clksel_set(NRF_GRTC, NRF_GRTC_CLKSEL_LFXO);
+
+ nrf_grtc_event_clear(NRF_GRTC, OS_TICK_CMPEV);
+ nrf_grtc_event_clear(NRF_GRTC, OS_IDLE_CMPEV);
+ nrf_grtc_sys_counter_compare_event_enable(NRF_GRTC, OS_TICK_CMPREG);
+ nrf_grtc_sys_counter_compare_event_enable(NRF_GRTC, OS_IDLE_CMPREG);
+
+ nrf_grtc_sys_counter_interval_set(NRF_GRTC, g_hal_os_tick.ticks_per_ostick);
+ nrf_grtc_sys_counter_set(NRF_GRTC, true);
+ nrf_grtc_task_trigger(NRF_GRTC, NRF_GRTC_TASK_START);
+
+ OS_EXIT_CRITICAL(sr);
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_reset_cause.c b/hw/mcu/nordic/nrf54lxx/src/hal_reset_cause.c
new file mode 100644
index 0000000..b730de8
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_reset_cause.c
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <nrf.h>
+#include <hal/hal_system.h>
+
+enum hal_reset_reason
+hal_reset_cause(void)
+{
+ static enum hal_reset_reason reason;
+ uint32_t reg;
+
+ if (reason) {
+ return reason;
+ }
+
+ reg = NRF_RESET->RESETREAS;
+
+ if (reg & (RESET_RESETREAS_DOG0_Msk | RESET_RESETREAS_DOG1_Msk |
+ RESET_RESETREAS_LOCKUP_Msk)) {
+ reason = HAL_RESET_WATCHDOG;
+ } else if (reg & RESET_RESETREAS_SREQ_Msk) {
+ reason = HAL_RESET_SOFT;
+ } else if (reg & RESET_RESETREAS_RESETPIN_Msk) {
+ reason = HAL_RESET_PIN;
+ } else if (reg & RESET_RESETREAS_OFF_Msk) {
+ reason = HAL_RESET_SYS_OFF_INT;
+ } else {
+ reason = HAL_RESET_POR; /* could also be brownout */
+ }
+
+ NRF_RESET->RESETREAS = reg;
+ return reason;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_system.c b/hw/mcu/nordic/nrf54lxx/src/hal_system.c
new file mode 100644
index 0000000..4c5123b
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_system.c
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <syscfg/syscfg.h>
+#include <mcu/cortex_m33.h>
+#include <hal/hal_system.h>
+#include <hal/hal_debug.h>
+#include <mynewt_cm.h>
+#include <nrf.h>
+
+/**
+ * Function called at startup. Called after BSS and .data initialized but
+ * prior to the _start function.
+ *
+ * NOTE: this function is called by both the bootloader and the application.
+ * If you add code here that you do not want executed in either case you need
+ * to conditionally compile it using the config variable BOOT_LOADER (will
+ * be set to 1 in case of bootloader build)
+ *
+ */
+void
+hal_system_init(void)
+{
+ NVIC_Relocate();
+
+#if MYNEWT_VAL(MCU_DCDC_ENABLED)
+ NRF_REGULATORS->VREGMAIN.DCDCEN = 1;
+#endif
+}
+
+void
+hal_system_reset(void)
+{
+#if MYNEWT_VAL(HAL_SYSTEM_RESET_CB)
+ hal_system_reset_cb();
+#endif
+
+ while (1) {
+ HAL_DEBUG_BREAK();
+ NVIC_SystemReset();
+ }
+}
+
+int
+hal_debugger_connected(void)
+{
+ return CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk;
+}
+
+/**
+ * hal system clock start
+ *
+ * Makes sure the LFCLK and/or HFCLK is started.
+ */
+void
+hal_system_clock_start(void)
+{
+#if MYNEWT_VAL(MCU_LFCLK_SOURCE)
+ uint32_t regmsk;
+ uint32_t regval;
+ uint32_t clksrc;
+
+ regmsk = CLOCK_LFCLK_STAT_STATE_Msk | CLOCK_LFCLK_STAT_SRC_Msk;
+ regval = CLOCK_LFCLK_STAT_STATE_Running << CLOCK_LFCLK_STAT_STATE_Pos;
+
+#if MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFXO)
+ regval |= CLOCK_LFCLK_STAT_SRC_LFXO << CLOCK_LFCLK_STAT_SRC_Pos;
+ clksrc = CLOCK_LFCLK_STAT_SRC_LFXO;
+#elif MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFSYNTH)
+ regval |= CLOCK_LFCLK_STAT_SRC_LFSYNT << CLOCK_LFCLK_STAT_SRC_Pos;
+ clksrc = CLOCK_LFCLK_STAT_SRC_LFSYNT;
+#elif MYNEWT_VAL_CHOICE(MCU_LFCLK_SOURCE, LFRC)
+ regval |= CLOCK_LFCLK_STAT_SRC_LFRC << CLOCK_LFCLK_STAT_SRC_Pos;
+ clksrc = CLOCK_LFCLK_STAT_SRC_LFRC;
+#else
+#error Unknown LFCLK source selected
+#endif
+
+ NRF_CLOCK_S->TASKS_XOSTOP = 1;
+
+ /* Check if this clock source is already running */
+ if ((NRF_CLOCK_S->LFCLK.STAT & regmsk) != regval) {
+ NRF_CLOCK_S->TASKS_LFCLKSTOP = 1;
+ NRF_CLOCK_S->EVENTS_LFCLKSTARTED = 0;
+ NRF_CLOCK_S->LFCLK.SRC = clksrc;
+ NRF_CLOCK_S->TASKS_LFCLKSTART = 1;
+
+ /* Wait here till started! */
+ while (1) {
+ if (NRF_CLOCK_S->EVENTS_LFCLKSTARTED) {
+ if ((NRF_CLOCK_S->LFCLK.STAT & regmsk) == regval) {
+ break;
+ }
+ }
+ }
+ }
+#endif
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_system_start.c b/hw/mcu/nordic/nrf54lxx/src/hal_system_start.c
new file mode 100644
index 0000000..c00221c
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_system_start.c
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <stddef.h>
+#include <inttypes.h>
+#include <mcu/cortex_m33.h>
+#include <mcu/nrf54l_hal.h>
+
+/**
+ * Boots the image described by the supplied image header.
+ *
+ * @param hdr The header for the image to boot.
+ */
+void __attribute__((naked))
+hal_system_start(void *img_start)
+{
+ uint32_t *img_data = img_start;
+
+ asm volatile(".syntax unified \n"
+ /* 1st word is stack pointer */
+ " msr msp, %0 \n"
+ /* 2nd word is a reset handler (image entry) */
+ " bx %1 \n"
+ : /* no output */
+ : "r"(img_data[0]), "r"(img_data[1]));
+}
+
+/**
+ * Boots the image described by the supplied image header.
+ * This routine is used in split-app scenario when loader decides
+ * that it wants to run the app instead.
+ *
+ * @param hdr The header for the image to boot.
+ */
+void
+hal_system_restart(void *img_start)
+{
+ int i;
+ int sr;
+
+ /*
+ * Disable interrupts, and leave the disabled.
+ * They get re-enabled when system starts coming back again.
+ */
+ __HAL_DISABLE_INTERRUPTS(sr);
+ for (i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++) {
+ NVIC->ICER[i] = 0xffffffff;
+ }
+ (void)sr;
+
+ hal_system_start(img_start);
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_timer.c b/hw/mcu/nordic/nrf54lxx/src/hal_timer.c
new file mode 100644
index 0000000..549238a
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_timer.c
@@ -0,0 +1,698 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <string.h>
+#include <stdint.h>
+#include <assert.h>
+#include <errno.h>
+#include <os/mynewt.h>
+#include <mcu/cmsis_nvic.h>
+#include <hal/hal_timer.h>
+#include <nrf.h>
+#include <mcu/nrf54l_hal.h>
+
+/* IRQ prototype */
+typedef void (*hal_timer_irq_handler_t)(void);
+
+/* User CC 2 for reading counter, CC 3 for timer isr */
+#define NRF_TIMER_CC_READ (2)
+#define NRF_TIMER_CC_INT (3)
+
+/* Output compare 2 used for RTC timers */
+#define NRF_RTC_TIMER_CC_INT (2)
+
+/* Maximum number of hal timers used */
+#define nrf54l_hal_timer_MAX (6)
+
+/* Maximum timer frequency */
+#define NRF54L_MAX_TIMER_FREQ (16000000)
+
+struct nrf54l_hal_timer {
+ uint8_t tmr_enabled;
+ uint16_t tmr_irq_num;
+ uint8_t tmr_pad;
+ uint32_t tmr_cntr;
+ uint32_t timer_isrs;
+ uint32_t tmr_freq;
+ void *tmr_reg;
+ TAILQ_HEAD(hal_timer_qhead, hal_timer) hal_timer_q;
+};
+
+#if MYNEWT_VAL(TIMER_0)
+struct nrf54l_hal_timer nrf54l_hal_timer0;
+#endif
+#if MYNEWT_VAL(TIMER_1)
+struct nrf54l_hal_timer nrf54l_hal_timer1;
+#endif
+#if MYNEWT_VAL(TIMER_2)
+struct nrf54l_hal_timer nrf54l_hal_timer2;
+#endif
+#if MYNEWT_VAL(TIMER_3)
+struct nrf54l_hal_timer nrf54l_hal_timer3;
+#endif
+#if MYNEWT_VAL(TIMER_4)
+struct nrf54l_hal_timer nrf54l_hal_timer4;
+#endif
+
+static const struct nrf54l_hal_timer *nrf54l_hal_timers[nrf54l_hal_timer_MAX] = {
+#if MYNEWT_VAL(TIMER_0)
+ &nrf54l_hal_timer0,
+#else
+ NULL,
+#endif
+#if MYNEWT_VAL(TIMER_1)
+ &nrf54l_hal_timer1,
+#else
+ NULL,
+#endif
+#if MYNEWT_VAL(TIMER_2)
+ &nrf54l_hal_timer2,
+#else
+ NULL,
+#endif
+#if MYNEWT_VAL(TIMER_3)
+ &nrf54l_hal_timer3,
+#else
+ NULL,
+#endif
+#if MYNEWT_VAL(TIMER_4)
+ &nrf54l_hal_timer4,
+#else
+ NULL,
+#endif
+};
+
+/* Resolve timer number into timer structure */
+#define nrf54l_hal_timer_RESOLVE(__n, __v) \
+ if ((__n) >= nrf54l_hal_timer_MAX) { \
+ rc = EINVAL; \
+ goto err; \
+ } \
+ (__v) = (struct nrf54l_hal_timer *)nrf54l_hal_timers[(__n)]; \
+ if ((__v) == NULL) { \
+ rc = EINVAL; \
+ goto err; \
+ }
+
+/* Interrupt mask for interrupt enable/clear */
+#define NRF_TIMER_INT_MASK(x) \
+ ((1 << (uint32_t)(x)) << TIMER_INTENCLR_COMPARE0_Pos)
+
+static uint32_t
+nrf_read_timer_cntr(NRF_TIMER_Type *hwtimer)
+{
+ uint32_t tcntr;
+
+ /* Force a capture of the timer into 'cntr' capture channel; read it */
+ hwtimer->TASKS_CAPTURE[NRF_TIMER_CC_READ] = 1;
+ tcntr = hwtimer->CC[NRF_TIMER_CC_READ];
+
+ return tcntr;
+}
+
+/**
+ * Set the OCMP used by the timer to the desired expiration tick
+ *
+ * NOTE: Must be called with interrupts disabled.
+ *
+ * @param bsptimer Pointer to timer.
+ * @param expiry Expiration tick
+ */
+static void
+nrf_timer_set_ocmp(struct nrf54l_hal_timer *bsptimer, uint32_t expiry)
+{
+ NRF_TIMER_Type *hwtimer;
+
+ hwtimer = bsptimer->tmr_reg;
+
+ /* Disable ocmp interrupt and set new value */
+ hwtimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
+
+ /* Set output compare register to timer expiration */
+ hwtimer->CC[NRF_TIMER_CC_INT] = expiry;
+
+ /* Clear interrupt flag */
+ hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT] = 0;
+
+ /* Enable the output compare interrupt */
+ hwtimer->INTENSET = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
+
+ /* Force interrupt to occur as we may have missed it */
+ if ((int32_t)(nrf_read_timer_cntr(hwtimer) - expiry) >= 0) {
+ NVIC_SetPendingIRQ(bsptimer->tmr_irq_num);
+ }
+}
+
+/* Disable output compare used for timer */
+static void
+nrf_timer_disable_ocmp(NRF_TIMER_Type *hwtimer)
+{
+ hwtimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
+}
+
+#if (MYNEWT_VAL(TIMER_0) || MYNEWT_VAL(TIMER_1) || MYNEWT_VAL(TIMER_2) || \
+ MYNEWT_VAL(TIMER_3) || MYNEWT_VAL(TIMER_4))
+static void
+hal_timer_chk_queue(struct nrf54l_hal_timer *bsptimer)
+{
+ uint32_t tcntr;
+ uint32_t ctx;
+ struct hal_timer *timer;
+
+ /* disable interrupts */
+ __HAL_DISABLE_INTERRUPTS(ctx);
+ while ((timer = TAILQ_FIRST(&bsptimer->hal_timer_q)) != NULL) {
+ tcntr = nrf_read_timer_cntr(bsptimer->tmr_reg);
+ if ((int32_t)(tcntr - timer->expiry) >= 0) {
+ TAILQ_REMOVE(&bsptimer->hal_timer_q, timer, link);
+ timer->link.tqe_prev = NULL;
+ timer->cb_func(timer->cb_arg);
+ } else {
+ break;
+ }
+ }
+
+ /* Any timers left on queue? If so, we need to set OCMP */
+ timer = TAILQ_FIRST(&bsptimer->hal_timer_q);
+ if (timer) {
+ nrf_timer_set_ocmp(bsptimer, timer->expiry);
+ } else {
+ nrf_timer_disable_ocmp(bsptimer->tmr_reg);
+ }
+ __HAL_ENABLE_INTERRUPTS(ctx);
+}
+#endif
+
+/**
+ * Generic HAL timer irq handler.
+ *
+ * @param bsptimer Pointer to timer.
+ */
+#if (MYNEWT_VAL(TIMER_0) || MYNEWT_VAL(TIMER_1) || MYNEWT_VAL(TIMER_2) || \
+ MYNEWT_VAL(TIMER_3) || MYNEWT_VAL(TIMER_4))
+static void
+hal_timer_irq_handler(struct nrf54l_hal_timer *bsptimer)
+{
+ uint32_t compare;
+ NRF_TIMER_Type *hwtimer;
+
+ os_trace_isr_enter();
+
+ /* Check interrupt source. If set, clear them */
+ hwtimer = bsptimer->tmr_reg;
+ compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
+ if (compare) {
+ hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT] = 0;
+ }
+
+ /* Count # of timer isrs */
+ ++bsptimer->timer_isrs;
+
+ /*
+ * NOTE: we dont check the 'compare' variable here due to how the timer
+ * is implemented on this chip. There is no way to force an output
+ * compare, so if we are late setting the output compare (i.e. the timer
+ * counter is already passed the output compare value), we use the NVIC
+ * to set a pending interrupt. This means that there will be no compare
+ * flag set, so all we do is check to see if the compare interrupt is
+ * enabled.
+ */
+ if (hwtimer->INTENCLR & NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT)) {
+ hal_timer_chk_queue(bsptimer);
+ /* XXX: Recommended by nordic to make sure interrupts are cleared */
+ compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
+ }
+
+ os_trace_isr_exit();
+}
+#endif
+
+#if MYNEWT_VAL(TIMER_0)
+void
+nrf54l_timer0_irq_handler(void)
+{
+ hal_timer_irq_handler(&nrf54l_hal_timer0);
+}
+#endif
+
+#if MYNEWT_VAL(TIMER_1)
+void
+nrf54l_timer1_irq_handler(void)
+{
+ hal_timer_irq_handler(&nrf54l_hal_timer1);
+}
+#endif
+
+#if MYNEWT_VAL(TIMER_2)
+void
+nrf54l_timer2_irq_handler(void)
+{
+ hal_timer_irq_handler(&nrf54l_hal_timer2);
+}
+#endif
+
+#if MYNEWT_VAL(TIMER_3)
+void
+nrf54l_timer3_irq_handler(void)
+{
+ hal_timer_irq_handler(&nrf54l_hal_timer3);
+}
+#endif
+
+#if MYNEWT_VAL(TIMER_4)
+void
+nrf54l_timer4_irq_handler(void)
+{
+ hal_timer_irq_handler(&nrf54l_hal_timer4);
+}
+#endif
+
+/**
+ * Initialize platform specific timer items
+ *
+ * @param timer_num Timer number to initialize
+ * @param cfg Pointer to platform specific configuration
+ *
+ * @return int 0: success; error code otherwise
+ */
+int
+hal_timer_init(int timer_num, void *cfg)
+{
+ int rc;
+ uint16_t irq_num;
+ struct nrf54l_hal_timer *bsptimer;
+ void *hwtimer;
+ hal_timer_irq_handler_t irq_isr;
+
+ nrf54l_hal_timer_RESOLVE(timer_num, bsptimer);
+
+ /* If timer is enabled do not allow init */
+ if (bsptimer->tmr_enabled) {
+ rc = EINVAL;
+ goto err;
+ }
+
+ switch (timer_num) {
+#if MYNEWT_VAL(TIMER_0)
+ case 0:
+ irq_num = TIMER20_IRQn;
+ hwtimer = NRF_TIMER20;
+ irq_isr = nrf54l_timer0_irq_handler;
+ break;
+#endif
+#if MYNEWT_VAL(TIMER_1)
+ case 1:
+ irq_num = TIMER21_IRQn;
+ hwtimer = NRF_TIMER21;
+ irq_isr = nrf54l_timer1_irq_handler;
+ break;
+#endif
+#if MYNEWT_VAL(TIMER_2)
+ case 2:
+ irq_num = TIMER22_IRQn;
+ hwtimer = NRF_TIMER22;
+ irq_isr = nrf54l_timer2_irq_handler;
+ break;
+#endif
+#if MYNEWT_VAL(TIMER_3)
+ case 3:
+ irq_num = TIMER23_IRQn;
+ hwtimer = NRF_TIMER23;
+ irq_isr = nrf54l_timer3_irq_handler;
+ break;
+#endif
+#if MYNEWT_VAL(TIMER_4)
+ case 4:
+ irq_num = TIMER24_IRQn;
+ hwtimer = NRF_TIMER24;
+ irq_isr = nrf54l_timer4_irq_handler;
+ break;
+#endif
+ default:
+ hwtimer = NULL;
+ break;
+ }
+
+ if (hwtimer == NULL) {
+ rc = EINVAL;
+ goto err;
+ }
+
+ bsptimer->tmr_reg = hwtimer;
+ bsptimer->tmr_irq_num = irq_num;
+
+ /* Disable IRQ, set priority and set vector in table */
+ NVIC_DisableIRQ(irq_num);
+ NVIC_SetPriority(irq_num, (1 << __NVIC_PRIO_BITS) - 1);
+ NVIC_SetVector(irq_num, (uint32_t)irq_isr);
+
+ return 0;
+
+err:
+ return rc;
+}
+
+/**
+ * Configure a timer to run at the desired frequency. This starts the timer.
+ *
+ * @param timer_num
+ * @param freq_hz
+ *
+ * @return int
+ */
+int
+hal_timer_config(int timer_num, uint32_t freq_hz)
+{
+ int rc;
+ uint8_t prescaler;
+ uint32_t ctx;
+ uint32_t div;
+ uint32_t min_delta;
+ uint32_t max_delta;
+ struct nrf54l_hal_timer *bsptimer;
+ NRF_TIMER_Type *hwtimer;
+
+ nrf54l_hal_timer_RESOLVE(timer_num, bsptimer);
+
+ /* Set timer to desired frequency */
+ div = NRF54L_MAX_TIMER_FREQ / freq_hz;
+
+ /*
+ * Largest prescaler is 2^9 and must make sure frequency not too high.
+ * If hwtimer is NULL it means that the timer was not initialized prior
+ * to call.
+ */
+ if (bsptimer->tmr_enabled || (div == 0) || (div > 512) ||
+ (bsptimer->tmr_reg == NULL)) {
+ rc = EINVAL;
+ goto err;
+ }
+
+ if (div == 1) {
+ prescaler = 0;
+ } else {
+ /* Find closest prescaler */
+ for (prescaler = 1; prescaler < 10; ++prescaler) {
+ if (div <= (1 << prescaler)) {
+ min_delta = div - (1 << (prescaler - 1));
+ max_delta = (1 << prescaler) - div;
+ if (min_delta < max_delta) {
+ prescaler -= 1;
+ }
+ break;
+ }
+ }
+ }
+
+ /* Now set the actual frequency */
+ bsptimer->tmr_freq = NRF54L_MAX_TIMER_FREQ / (1 << prescaler);
+ bsptimer->tmr_enabled = 1;
+
+ /* disable interrupts */
+ __HAL_DISABLE_INTERRUPTS(ctx);
+
+ /* Make sure XO (HFXO) is started */
+ if ((NRF_CLOCK_S->XO.STAT & CLOCK_XO_STAT_STATE_Msk) !=
+ (CLOCK_XO_STAT_STATE_Running << CLOCK_XO_STAT_STATE_Pos)) {
+ NRF_CLOCK_S->EVENTS_XOSTARTED = 0;
+ NRF_CLOCK_S->TASKS_XOSTART = 1;
+ while (1) {
+ if ((NRF_CLOCK_S->EVENTS_XOSTARTED != 0)) {
+ break;
+ }
+ }
+ }
+
+ hwtimer = bsptimer->tmr_reg;
+
+ /* Stop the timer first */
+ hwtimer->TASKS_STOP = 1;
+ hwtimer->TASKS_CLEAR = 1;
+
+ /* Put the timer in timer mode using 32 bits. */
+ hwtimer->MODE = TIMER_MODE_MODE_Timer;
+ hwtimer->BITMODE = TIMER_BITMODE_BITMODE_32Bit;
+
+ /* Set the pre-scalar */
+ hwtimer->PRESCALER = prescaler;
+
+ /* Start the timer */
+ hwtimer->TASKS_START = 1;
+
+ NVIC_EnableIRQ(bsptimer->tmr_irq_num);
+
+ __HAL_ENABLE_INTERRUPTS(ctx);
+
+ return 0;
+
+err:
+ return rc;
+}
+
+/**
+ * De-initialize a HW timer.
+ *
+ * @param timer_num
+ *
+ * @return int
+ */
+int
+hal_timer_deinit(int timer_num)
+{
+ int rc;
+ uint32_t ctx;
+ struct nrf54l_hal_timer *bsptimer;
+ NRF_TIMER_Type *hwtimer;
+
+ rc = 0;
+ nrf54l_hal_timer_RESOLVE(timer_num, bsptimer);
+
+ __HAL_DISABLE_INTERRUPTS(ctx);
+ hwtimer = (NRF_TIMER_Type *)bsptimer->tmr_reg;
+ hwtimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
+ hwtimer->TASKS_STOP = 1;
+ hwtimer->TASKS_CLEAR = 1;
+
+ bsptimer->tmr_enabled = 0;
+ bsptimer->tmr_reg = NULL;
+ __HAL_ENABLE_INTERRUPTS(ctx);
+
+err:
+ return rc;
+}
+
+/**
+ * Get the resolution of the timer. This is the timer period, in nanoseconds
+ *
+ * @param timer_num
+ *
+ * @return uint32_t The
+ */
+uint32_t
+hal_timer_get_resolution(int timer_num)
+{
+ int rc;
+ uint32_t resolution;
+ struct nrf54l_hal_timer *bsptimer;
+
+ nrf54l_hal_timer_RESOLVE(timer_num, bsptimer);
+
+ resolution = 1000000000 / bsptimer->tmr_freq;
+ return resolution;
+
+err:
+ rc = 0;
+ return rc;
+}
+
+/**
+ * Returns the timer counter. NOTE: if the timer is a 16-bit timer, only
+ * the lower 16 bits are valid. If the timer is a 64-bit timer, only the
+ * low 32-bits are returned.
+ *
+ * @return uint32_t The timer counter register.
+ */
+uint32_t
+hal_timer_read(int timer_num)
+{
+ int rc;
+ uint32_t tcntr;
+ struct nrf54l_hal_timer *bsptimer;
+
+ nrf54l_hal_timer_RESOLVE(timer_num, bsptimer);
+
+ tcntr = nrf_read_timer_cntr(bsptimer->tmr_reg);
+
+ return tcntr;
+
+ /* Assert here since there is no invalid return code */
+err:
+ assert(0);
+ rc = 0;
+ return rc;
+}
+
+/**
+ * Blocking delay for n ticks
+ *
+ * @param timer_num
+ * @param ticks
+ *
+ * @return int 0 on success; error code otherwise.
+ */
+int
+hal_timer_delay(int timer_num, uint32_t ticks)
+{
+ uint32_t until;
+
+ until = hal_timer_read(timer_num) + ticks;
+ while ((int32_t)(hal_timer_read(timer_num) - until) <= 0) {
+ /* Loop here till finished */
+ }
+
+ return 0;
+}
+
+/**
+ * Initialize the HAL timer structure with the callback and the callback
+ * argument. Also initializes the HW specific timer pointer.
+ *
+ * @param cb_func
+ *
+ * @return int
+ */
+int
+hal_timer_set_cb(int timer_num, struct hal_timer *timer, hal_timer_cb cb_func,
+ void *arg)
+{
+ int rc;
+ struct nrf54l_hal_timer *bsptimer;
+
+ nrf54l_hal_timer_RESOLVE(timer_num, bsptimer);
+
+ timer->cb_func = cb_func;
+ timer->cb_arg = arg;
+ timer->link.tqe_prev = NULL;
+ timer->bsp_timer = bsptimer;
+
+ rc = 0;
+
+err:
+ return rc;
+}
+
+int
+hal_timer_start(struct hal_timer *timer, uint32_t ticks)
+{
+ int rc;
+ uint32_t tick;
+ struct nrf54l_hal_timer *bsptimer;
+
+ /* Set the tick value at which the timer should expire */
+ bsptimer = (struct nrf54l_hal_timer *)timer->bsp_timer;
+ tick = nrf_read_timer_cntr(bsptimer->tmr_reg) + ticks;
+ rc = hal_timer_start_at(timer, tick);
+ return rc;
+}
+
+int
+hal_timer_start_at(struct hal_timer *timer, uint32_t tick)
+{
+ uint32_t ctx;
+ struct hal_timer *entry;
+ struct nrf54l_hal_timer *bsptimer;
+
+ if (timer == NULL || timer->link.tqe_prev != NULL || timer->cb_func == NULL) {
+ return EINVAL;
+ }
+ bsptimer = (struct nrf54l_hal_timer *)timer->bsp_timer;
+ timer->expiry = tick;
+
+ __HAL_DISABLE_INTERRUPTS(ctx);
+
+ if (TAILQ_EMPTY(&bsptimer->hal_timer_q)) {
+ TAILQ_INSERT_HEAD(&bsptimer->hal_timer_q, timer, link);
+ } else {
+ TAILQ_FOREACH(entry, &bsptimer->hal_timer_q, link) {
+ if ((int32_t)(timer->expiry - entry->expiry) < 0) {
+ TAILQ_INSERT_BEFORE(entry, timer, link);
+ break;
+ }
+ }
+ if (!entry) {
+ TAILQ_INSERT_TAIL(&bsptimer->hal_timer_q, timer, link);
+ }
+ }
+
+ /* If this is the head, we need to set new OCMP */
+ if (timer == TAILQ_FIRST(&bsptimer->hal_timer_q)) {
+ nrf_timer_set_ocmp(bsptimer, timer->expiry);
+ }
+
+ __HAL_ENABLE_INTERRUPTS(ctx);
+
+ return 0;
+}
+
+/**
+ * Stop a timer.
+ *
+ * @param timer
+ *
+ * @return int
+ */
+int
+hal_timer_stop(struct hal_timer *timer)
+{
+ uint32_t ctx;
+ int reset_ocmp;
+ struct hal_timer *entry = NULL;
+ struct nrf54l_hal_timer *bsptimer;
+
+ if (timer == NULL) {
+ return EINVAL;
+ }
+
+ bsptimer = (struct nrf54l_hal_timer *)timer->bsp_timer;
+
+ __HAL_DISABLE_INTERRUPTS(ctx);
+
+ if (timer->link.tqe_prev != NULL) {
+ reset_ocmp = 0;
+ if (timer == TAILQ_FIRST(&bsptimer->hal_timer_q)) {
+ /* If first on queue, we will need to reset OCMP */
+ entry = TAILQ_NEXT(timer, link);
+ reset_ocmp = 1;
+ }
+ TAILQ_REMOVE(&bsptimer->hal_timer_q, timer, link);
+ timer->link.tqe_prev = NULL;
+ if (reset_ocmp) {
+ if (entry) {
+ nrf_timer_set_ocmp((struct nrf54l_hal_timer *)entry->bsp_timer,
+ entry->expiry);
+ } else {
+ nrf_timer_disable_ocmp(bsptimer->tmr_reg);
+ }
+ }
+ }
+
+ __HAL_ENABLE_INTERRUPTS(ctx);
+
+ return 0;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_uart.c b/hw/mcu/nordic/nrf54lxx/src/hal_uart.c
new file mode 100644
index 0000000..6bc1683
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_uart.c
@@ -0,0 +1,449 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <assert.h>
+#include <os/mynewt.h>
+#include <hal/hal_uart.h>
+#include <mcu/cmsis_nvic.h>
+#include <bsp/bsp.h>
+#include <nrf.h>
+#include <mcu/nrf54l_hal.h>
+
+#define UARTE_INT_ENDTX UARTE_INTEN_DMATXEND_Msk
+#define UARTE_INT_ENDRX UARTE_INTEN_DMARXEND_Msk
+#define UARTE_CONFIG_PARITY UARTE_CONFIG_PARITY_Msk
+#define UARTE_CONFIG_PARITY_ODD UARTE_CONFIG_PARITYTYPE_Msk
+#define UARTE_CONFIG_HWFC UARTE_CONFIG_HWFC_Msk
+#define UARTE_ENABLE UARTE_ENABLE_ENABLE_Enabled
+#define UARTE_DISABLE UARTE_ENABLE_ENABLE_Disabled
+
+struct hal_uart {
+ uint8_t u_open : 1;
+ uint8_t u_rx_stall : 1;
+ uint8_t u_tx_started : 1;
+ uint8_t u_rx_buf;
+ uint8_t u_tx_buf[8];
+ hal_uart_rx_char u_rx_func;
+ hal_uart_tx_char u_tx_func;
+ hal_uart_tx_done u_tx_done;
+ void *u_func_arg;
+
+ NRF_UARTE_Type *nrf_uart;
+ uint32_t handler;
+ IRQn_Type irqn;
+};
+
+#if MYNEWT_VAL(UART_0)
+static struct hal_uart uart0;
+#endif
+#if MYNEWT_VAL(UART_1)
+static struct hal_uart uart1;
+#endif
+#if MYNEWT_VAL(UART_2)
+static struct hal_uart uart2;
+#endif
+#if MYNEWT_VAL(UART_3)
+static struct hal_uart uart3;
+#endif
+
+static struct hal_uart *
+hal_uart_get(int port)
+{
+ switch (port) {
+#if MYNEWT_VAL(UART_0)
+ case 0:
+ return &uart0;
+#endif
+#if MYNEWT_VAL(UART_1)
+ case 1:
+ return &uart1;
+#endif
+#if MYNEWT_VAL(UART_2)
+ case 2:
+ return &uart2;
+#endif
+ default:
+ return NULL;
+ }
+}
+
+int
+hal_uart_init_cbs(int port, hal_uart_tx_char tx_func, hal_uart_tx_done tx_done,
+ hal_uart_rx_char rx_func, void *arg)
+{
+ struct hal_uart *u = hal_uart_get(port);
+
+ if (!u || u->u_open) {
+ return -1;
+ }
+ u->u_rx_func = rx_func;
+ u->u_tx_func = tx_func;
+ u->u_tx_done = tx_done;
+ u->u_func_arg = arg;
+
+ return 0;
+}
+
+static int
+hal_uart_tx_fill_buf(struct hal_uart *u)
+{
+ int data;
+ int i;
+
+ for (i = 0; i < sizeof(u->u_tx_buf); i++) {
+ data = u->u_tx_func(u->u_func_arg);
+ if (data < 0) {
+ break;
+ }
+ u->u_tx_buf[i] = data;
+ }
+ return i;
+}
+
+void
+hal_uart_start_tx(int port)
+{
+ struct hal_uart *u = hal_uart_get(port);
+ int sr;
+ int rc;
+
+ if (!u) {
+ return;
+ }
+
+ __HAL_DISABLE_INTERRUPTS(sr);
+ if (u->u_tx_started == 0) {
+ rc = hal_uart_tx_fill_buf(u);
+ if (rc > 0) {
+ u->nrf_uart->INTENSET = UARTE_INT_ENDTX;
+ u->nrf_uart->DMA.TX.PTR = (uint32_t)&u->u_tx_buf;
+ u->nrf_uart->DMA.TX.MAXCNT = rc;
+ u->nrf_uart->TASKS_DMA.TX.START = 1;
+ u->u_tx_started = 1;
+ }
+ }
+ __HAL_ENABLE_INTERRUPTS(sr);
+}
+
+void
+hal_uart_start_rx(int port)
+{
+ struct hal_uart *u = hal_uart_get(port);
+ int sr;
+ int rc;
+
+ if (!u) {
+ return;
+ }
+
+ if (u->u_rx_stall) {
+ __HAL_DISABLE_INTERRUPTS(sr);
+ rc = u->u_rx_func(u->u_func_arg, u->u_rx_buf);
+ if (rc == 0) {
+ u->u_rx_stall = 0;
+ u->nrf_uart->TASKS_DMA.RX.START = 1;
+ }
+
+ __HAL_ENABLE_INTERRUPTS(sr);
+ }
+}
+
+void
+hal_uart_blocking_tx(int port, uint8_t data)
+{
+ struct hal_uart *u = hal_uart_get(port);
+
+ if (!u || !u->u_open) {
+ return;
+ }
+
+ /* If we have started, wait until the current uart dma buffer is done */
+ if (u->u_tx_started) {
+ while (u->nrf_uart->EVENTS_DMA.TX.END == 0) {
+ /* Wait here until the dma is finished */
+ }
+ }
+
+ u->nrf_uart->EVENTS_DMA.TX.END = 0;
+ u->nrf_uart->DMA.TX.PTR = (uint32_t)&data;
+ u->nrf_uart->DMA.TX.MAXCNT = 1;
+ u->nrf_uart->TASKS_DMA.TX.START = 1;
+
+ while (u->nrf_uart->EVENTS_DMA.TX.END == 0) {
+ /* Wait till done */
+ }
+
+ /* Stop the uart */
+ u->nrf_uart->TASKS_DMA.TX.STOP = 1;
+}
+
+#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1) || MYNEWT_VAL(UART_2) || \
+ MYNEWT_VAL(UART_3)
+static void
+uart_irq_handler(struct hal_uart *u)
+{
+ NRF_UARTE_Type *nrf_uart = u->nrf_uart;
+ int rc;
+
+ os_trace_isr_enter();
+
+ if (nrf_uart->EVENTS_DMA.TX.END) {
+ nrf_uart->EVENTS_DMA.TX.END = 0;
+ rc = hal_uart_tx_fill_buf(u);
+ if (rc > 0) {
+ nrf_uart->DMA.TX.PTR = (uint32_t)&u->u_tx_buf;
+ nrf_uart->DMA.TX.MAXCNT = rc;
+ nrf_uart->TASKS_DMA.TX.START = 1;
+ } else {
+ if (u->u_tx_done) {
+ u->u_tx_done(u->u_func_arg);
+ }
+ nrf_uart->INTENCLR = UARTE_INT_ENDTX;
+ nrf_uart->TASKS_DMA.TX.STOP = 1;
+ u->u_tx_started = 0;
+ }
+ }
+ if (nrf_uart->EVENTS_DMA.RX.END) {
+ nrf_uart->EVENTS_DMA.RX.END = 0;
+ rc = u->u_rx_func(u->u_func_arg, u->u_rx_buf);
+ if (rc < 0) {
+ u->u_rx_stall = 1;
+ } else {
+ nrf_uart->TASKS_DMA.RX.START = 1;
+ }
+ }
+ os_trace_isr_exit();
+}
+#endif
+
+#if MYNEWT_VAL(UART_0)
+static void
+uart0_irq_handler(void)
+{
+ uart_irq_handler(&uart0);
+}
+#endif
+
+#if MYNEWT_VAL(UART_1)
+static void
+uart1_irq_handler(void)
+{
+ uart_irq_handler(&uart1);
+}
+#endif
+
+#if MYNEWT_VAL(UART_2)
+static void
+uart2_irq_handler(void)
+{
+ uart_irq_handler(&uart2);
+}
+#endif
+
+#if MYNEWT_VAL(UART_3)
+static void
+uart3_irq_handler(void)
+{
+ uart_irq_handler(&uart3);
+}
+#endif
+
+static uint32_t
+hal_uart_baudrate(int baudrate)
+{
+ switch (baudrate) {
+ case 1200:
+ return UARTE_BAUDRATE_BAUDRATE_Baud1200;
+ case 2400:
+ return UARTE_BAUDRATE_BAUDRATE_Baud2400;
+ case 4800:
+ return UARTE_BAUDRATE_BAUDRATE_Baud4800;
+ case 9600:
+ return UARTE_BAUDRATE_BAUDRATE_Baud9600;
+ case 14400:
+ return UARTE_BAUDRATE_BAUDRATE_Baud14400;
+ case 19200:
+ return UARTE_BAUDRATE_BAUDRATE_Baud19200;
+ case 28800:
+ return UARTE_BAUDRATE_BAUDRATE_Baud28800;
+ case 38400:
+ return UARTE_BAUDRATE_BAUDRATE_Baud38400;
+ case 56000:
+ return UARTE_BAUDRATE_BAUDRATE_Baud56000;
+ case 57600:
+ return UARTE_BAUDRATE_BAUDRATE_Baud57600;
+ case 76800:
+ return UARTE_BAUDRATE_BAUDRATE_Baud76800;
+ case 115200:
+ return UARTE_BAUDRATE_BAUDRATE_Baud115200;
+ case 230400:
+ return UARTE_BAUDRATE_BAUDRATE_Baud230400;
+ case 250000:
+ return UARTE_BAUDRATE_BAUDRATE_Baud250000;
+ case 460800:
+ return UARTE_BAUDRATE_BAUDRATE_Baud460800;
+ case 921600:
+ return UARTE_BAUDRATE_BAUDRATE_Baud921600;
+ case 1000000:
+ return UARTE_BAUDRATE_BAUDRATE_Baud1M;
+ default:
+ return 0;
+ }
+}
+
+int
+hal_uart_init(int port, void *arg)
+{
+ struct hal_uart *u = hal_uart_get(port);
+ struct nrf54l_uart_cfg *cfg = arg;
+
+ if (!u) {
+ return -1;
+ }
+
+ switch (port) {
+#if MYNEWT_VAL(UART_0)
+ case 0:
+ u->nrf_uart = NRF_UARTE20;
+ u->handler = (uint32_t)uart0_irq_handler;
+ u->irqn = UARTE20_IRQn;
+ break;
+#endif
+#if MYNEWT_VAL(UART_1)
+ case 1:
+ u->nrf_uart = NRF_UARTE21;
+ u->handler = (uint32_t)uart1_irq_handler;
+ u->irqn = UARTE21_IRQn;
+ break;
+#endif
+#if MYNEWT_VAL(UART_2)
+ case 2:
+ u->nrf_uart = NRF_UARTE22;
+ u->handler = (uint32_t)uart2_irq_handler;
+ u->irqn = UARTE22_IRQn;
+ break;
+#endif
+ default:
+ assert(false);
+ }
+
+ u->nrf_uart->PSEL.TXD = cfg->suc_pin_tx;
+ u->nrf_uart->PSEL.RXD = cfg->suc_pin_rx;
+ u->nrf_uart->PSEL.RTS = cfg->suc_pin_rts;
+ u->nrf_uart->PSEL.CTS = cfg->suc_pin_cts;
+
+ NVIC_SetVector(u->irqn, u->handler);
+
+ return 0;
+}
+
+int
+hal_uart_config(int port, int32_t baudrate, uint8_t databits, uint8_t stopbits,
+ enum hal_uart_parity parity, enum hal_uart_flow_ctl flow_ctl)
+{
+ struct hal_uart *u = hal_uart_get(port);
+ uint32_t cfg_reg = 0;
+ uint32_t baud_reg;
+
+ if (!u || u->u_open) {
+ return -1;
+ }
+
+ /*
+ * pin config
+ * UART config
+ * nvic config
+ * enable uart
+ */
+ if (databits != 8) {
+ return -1;
+ }
+ if (stopbits != 1) {
+ return -1;
+ }
+
+ switch (parity) {
+ case HAL_UART_PARITY_NONE:
+ break;
+ case HAL_UART_PARITY_ODD:
+ cfg_reg |= UARTE_CONFIG_PARITY | UARTE_CONFIG_PARITY_ODD;
+ break;
+ case HAL_UART_PARITY_EVEN:
+ cfg_reg |= UARTE_CONFIG_PARITY;
+ break;
+ }
+
+ switch (flow_ctl) {
+ case HAL_UART_FLOW_CTL_NONE:
+ break;
+ case HAL_UART_FLOW_CTL_RTS_CTS:
+ cfg_reg |= UARTE_CONFIG_HWFC;
+ if (u->nrf_uart->PSEL.RTS == 0xffffffff || u->nrf_uart->PSEL.CTS == 0xffffffff) {
+ /*
+ * Can't turn on HW flow control if pins to do that are not
+ * defined.
+ */
+ assert(0);
+ return -1;
+ }
+ break;
+ }
+ baud_reg = hal_uart_baudrate(baudrate);
+ if (baud_reg == 0) {
+ return -1;
+ }
+ u->nrf_uart->ENABLE = 0;
+ u->nrf_uart->INTENCLR = 0xffffffff;
+ u->nrf_uart->BAUDRATE = baud_reg;
+ u->nrf_uart->CONFIG = cfg_reg;
+
+ NVIC_EnableIRQ(u->irqn);
+
+ u->nrf_uart->ENABLE = UARTE_ENABLE;
+
+ u->nrf_uart->INTENSET = UARTE_INT_ENDRX;
+ u->nrf_uart->DMA.RX.PTR = (uint32_t)&u->u_rx_buf;
+ u->nrf_uart->DMA.RX.MAXCNT = sizeof(u->u_rx_buf);
+ u->nrf_uart->TASKS_DMA.RX.START = 1;
+
+ u->u_rx_stall = 0;
+ u->u_tx_started = 0;
+ u->u_open = 1;
+
+ return 0;
+}
+
+int
+hal_uart_close(int port)
+{
+ volatile struct hal_uart *u = hal_uart_get(port);
+
+ if (!u) {
+ return -1;
+ }
+
+ u->u_open = 0;
+ while (u->u_tx_started) {
+ /* Wait here until the dma is finished */
+ }
+ u->nrf_uart->ENABLE = 0;
+ u->nrf_uart->INTENCLR = 0xffffffff;
+
+ return 0;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/hal_watchdog.c b/hw/mcu/nordic/nrf54lxx/src/hal_watchdog.c
new file mode 100644
index 0000000..2090787
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/hal_watchdog.c
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <assert.h>
+#include <os/mynewt.h>
+#include <hal/hal_watchdog.h>
+#include <mcu/cmsis_nvic.h>
+#include <nrf.h>
+
+static void
+nrf54l_hal_wdt_default_handler(void)
+{
+ assert(0);
+}
+
+/**@brief WDT interrupt handler. */
+static void
+nrf54l_wdt_irq_handler(void)
+{
+ os_trace_isr_enter();
+ if (NRF_WDT30->INTENSET & WDT_INTENSET_TIMEOUT_Msk) {
+ NRF_WDT30->EVENTS_TIMEOUT = 0;
+ nrf54l_hal_wdt_default_handler();
+ }
+ os_trace_isr_exit();
+}
+
+int
+hal_watchdog_init(uint32_t expire_msecs)
+{
+ uint64_t expiration;
+ NRF_WDT30->CONFIG = WDT_CONFIG_SLEEP_Msk;
+
+ /* Convert msec timeout to counts of a 32768 crystal */
+ expiration = ((uint64_t)expire_msecs * 32768) / 1000;
+ NRF_WDT30->CRV = (uint32_t)expiration;
+
+ NRF_WDT30->CRV = (expire_msecs * 32) + ((expire_msecs * 96) / 125);
+
+ NVIC_SetVector(WDT30_IRQn, (uint32_t)nrf54l_wdt_irq_handler);
+ NVIC_SetPriority(WDT30_IRQn, (1 << __NVIC_PRIO_BITS) - 1);
+ NVIC_ClearPendingIRQ(WDT30_IRQn);
+ NVIC_EnableIRQ(WDT30_IRQn);
+ NRF_WDT30->RREN |= 0x1;
+
+ return 0;
+}
+
+void
+hal_watchdog_enable(void)
+{
+ NRF_WDT30->INTENSET = WDT_INTENSET_TIMEOUT_Msk;
+ NRF_WDT30->TASKS_START = 1;
+}
+
+void
+hal_watchdog_tickle(void)
+{
+ NRF_WDT30->RR[0] = WDT_RR_RR_Reload;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/nrf54l_clock.c b/hw/mcu/nordic/nrf54lxx/src/nrf54l_clock.c
new file mode 100644
index 0000000..8a83b37
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/nrf54l_clock.c
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include <assert.h>
+#include <stdint.h>
+#include "mcu/nrf54l_hal.h"
+#include "nrfx.h"
+
+static uint8_t nrf54l_clock_hfxo_refcnt;
+
+/**
+ * Request HFXO clock be turned on. Note that each request must have a
+ * corresponding release.
+ *
+ * @return int 0: hfxo was already on. 1: hfxo was turned on.
+ */
+int
+nrf54l_clock_hfxo_request(void)
+{
+ int started;
+ uint32_t ctx;
+
+ started = 0;
+ __HAL_DISABLE_INTERRUPTS(ctx);
+ assert(nrf54l_clock_hfxo_refcnt < 0xff);
+ if (nrf54l_clock_hfxo_refcnt == 0) {
+ if ((NRF_CLOCK->XO.STAT & CLOCK_XO_STAT_STATE_Msk) !=
+ (CLOCK_XO_STAT_STATE_Running << CLOCK_XO_STAT_STATE_Pos)) {
+ NRF_CLOCK->EVENTS_XOSTARTED = 0;
+ NRF_CLOCK->TASKS_XOSTART = 1;
+ while (1) {
+ if ((NRF_CLOCK->EVENTS_XOSTARTED != 0)) {
+ break;
+ }
+ }
+ }
+ started = 1;
+ }
+ ++nrf54l_clock_hfxo_refcnt;
+ __HAL_ENABLE_INTERRUPTS(ctx);
+
+ return started;
+}
+
+/**
+ * Release the HFXO. This means that the caller no longer needs the HFXO to be
+ * turned on. Each call to release should have been preceeded by a
+ * corresponding call to request the HFXO
+ *
+ *
+ * @return int 0: HFXO not stopped by this call (others using it) 1: HFXO
+ * stopped.
+ */
+int
+nrf54l_clock_hfxo_release(void)
+{
+ int stopped;
+ uint32_t ctx;
+
+ stopped = 0;
+ __HAL_DISABLE_INTERRUPTS(ctx);
+ assert(nrf54l_clock_hfxo_refcnt != 0);
+ --nrf54l_clock_hfxo_refcnt;
+ if (nrf54l_clock_hfxo_refcnt == 0) {
+ NRF_CLOCK_S->TASKS_XOSTOP = 1;
+ stopped = 1;
+ }
+ __HAL_ENABLE_INTERRUPTS(ctx);
+
+ return stopped;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/nrf54l_hw_id.c b/hw/mcu/nordic/nrf54lxx/src/nrf54l_hw_id.c
new file mode 100644
index 0000000..af026a1
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/nrf54l_hw_id.c
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <string.h>
+#include <hal/hal_bsp.h>
+#include <nrf.h>
+#include <os/os.h>
+
+int
+hal_bsp_hw_id_len(void)
+{
+ return sizeof(NRF_FICR->INFO.DEVICEID);
+}
+
+/*
+ * These values are generated at random.
+ * DEVICEID
+ */
+int
+hal_bsp_hw_id(uint8_t *id, int max_len)
+{
+ max_len = min(sizeof(NRF_FICR->INFO.DEVICEID), max_len);
+
+ memcpy(id, (void *)&NRF_FICR->INFO.DEVICEID, max_len);
+
+ return max_len;
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/nrf54l_periph.c b/hw/mcu/nordic/nrf54lxx/src/nrf54l_periph.c
new file mode 100644
index 0000000..7d5e28b
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/nrf54l_periph.c
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <assert.h>
+#include <stdint.h>
+#include <syscfg/syscfg.h>
+#include <mcu/nrf54l_hal.h>
+#include <bsp/bsp.h>
+
+#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1) || MYNEWT_VAL(UART_2)
+#include <uart/uart.h>
+#include <uart_hal/uart_hal.h>
+#endif
+
+#if MYNEWT_VAL(UART_0)
+static struct uart_dev os_bsp_uart0;
+static const struct nrf54l_uart_cfg os_bsp_uart0_cfg = {
+ .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
+ .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
+ .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
+ .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
+};
+#endif
+#if MYNEWT_VAL(UART_1)
+static struct uart_dev os_bsp_uart1;
+static const struct nrf54l_uart_cfg os_bsp_uart1_cfg = {
+ .suc_pin_tx = MYNEWT_VAL(UART_1_PIN_TX),
+ .suc_pin_rx = MYNEWT_VAL(UART_1_PIN_RX),
+ .suc_pin_rts = MYNEWT_VAL(UART_1_PIN_RTS),
+ .suc_pin_cts = MYNEWT_VAL(UART_1_PIN_CTS),
+};
+#endif
+#if MYNEWT_VAL(UART_2)
+static struct uart_dev os_bsp_uart2;
+static const struct nrf54l_uart_cfg os_bsp_uart2_cfg = {
+ .suc_pin_tx = MYNEWT_VAL(UART_2_PIN_TX),
+ .suc_pin_rx = MYNEWT_VAL(UART_2_PIN_RX),
+ .suc_pin_rts = MYNEWT_VAL(UART_2_PIN_RTS),
+ .suc_pin_cts = MYNEWT_VAL(UART_2_PIN_CTS),
+};
+#endif
+
+static void
+nrf54l_periph_create_timers(void)
+{
+ int rc;
+
+ (void)rc;
+
+#if MYNEWT_VAL(TIMER_0)
+ rc = hal_timer_init(0, NULL);
+ assert(rc == 0);
+#endif
+#if MYNEWT_VAL(TIMER_1)
+ rc = hal_timer_init(1, NULL);
+ assert(rc == 0);
+#endif
+#if MYNEWT_VAL(TIMER_2)
+ rc = hal_timer_init(2, NULL);
+ assert(rc == 0);
+#endif
+#if MYNEWT_VAL(TIMER_3)
+ rc = hal_timer_init(3, NULL);
+ assert(rc == 0);
+#endif
+#if MYNEWT_VAL(TIMER_4)
+ rc = hal_timer_init(4, NULL);
+ assert(rc == 0);
+#endif
+
+#if MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0
+ rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
+ assert(rc == 0);
+#endif
+}
+
+static void
+nrf54l_periph_create_uart(void)
+{
+ int rc;
+
+ (void)rc;
+
+#if MYNEWT_VAL(UART_0)
+ rc = os_dev_create(&os_bsp_uart0.ud_dev, "uart0", OS_DEV_INIT_PRIMARY, 0,
+ uart_hal_init, (void *)&os_bsp_uart0_cfg);
+ assert(rc == 0);
+#endif
+#if MYNEWT_VAL(UART_1)
+ rc = os_dev_create(&os_bsp_uart1.ud_dev, "uart1", OS_DEV_INIT_PRIMARY, 1,
+ uart_hal_init, (void *)&os_bsp_uart1_cfg);
+ assert(rc == 0);
+#endif
+#if MYNEWT_VAL(UART_2)
+ rc = os_dev_create(&os_bsp_uart2.ud_dev, "uart2", OS_DEV_INIT_PRIMARY, 2,
+ uart_hal_init, (void *)&os_bsp_uart2_cfg);
+ assert(rc == 0);
+#endif
+}
+
+void
+nrf54l_periph_create(void)
+{
+ nrf54l_periph_create_timers();
+ nrf54l_periph_create_uart();
+}
diff --git a/hw/mcu/nordic/nrf54lxx/src/system_nrf54.c b/hw/mcu/nordic/nrf54lxx/src/system_nrf54.c
new file mode 100644
index 0000000..bb43db4
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/src/system_nrf54.c
@@ -0,0 +1,205 @@
+/*
+
+Copyright (c) 2009-2024 ARM Limited. All rights reserved.
+
+ SPDX-License-Identifier: Apache-2.0
+
+Licensed under the Apache License, Version 2.0 (the License); you may
+not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an AS IS BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+NOTICE: This file has been modified by Nordic Semiconductor ASA.
+
+*/
+
+/* NOTE: Template files (including this one) are application specific and therefore expected to
+ be copied into the application project folder prior to its use! */
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "nrf.h"
+#include "nrf54l_erratas.h"
+#include "system_nrf54l.h"
+#include "system_nrf54l_approtect.h"
+#include "system_config_sau.h"
+
+/*lint ++flb "Enter library region" */
+
+#define __SYSTEM_CLOCK_DEFAULT (64000000ul)
+
+/* Trace configuration */
+#define TRACE_TRACECLK_PIN (6ul)
+#define TRACE_TRACEDATA0_PIN (7ul)
+#define TRACE_TRACEDATA1_PIN (8ul)
+#define TRACE_TRACEDATA2_PIN (9ul)
+#define TRACE_TRACEDATA3_PIN (10ul)
+
+#define TRACE_PIN_CLEAR (~(GPIO_PIN_CNF_CTRLSEL_Msk | GPIO_PIN_CNF_DRIVE0_Msk | GPIO_PIN_CNF_DRIVE1_Msk))
+
+#define TRACE_PIN_CONFIG ((GPIO_PIN_CNF_DRIVE0_E0 << GPIO_PIN_CNF_DRIVE0_Pos) \
+ | (GPIO_PIN_CNF_DRIVE1_E1 << GPIO_PIN_CNF_DRIVE1_Pos))
+
+
+#if defined ( __CC_ARM ) || defined ( __GNUC__ )
+uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_DEFAULT;
+#elif defined ( __ICCARM__ )
+__root uint32_t SystemCoreClock = __SYSTEM_CLOCK_DEFAULT;
+#endif
+
+void SystemCoreClockUpdate(void)
+{
+ switch(NRF_OSCILLATORS->PLL.CURRENTFREQ)
+ {
+ case OSCILLATORS_PLL_CURRENTFREQ_CURRENTFREQ_CK64M:
+ SystemCoreClock = 64000000ul;
+ break;
+ case OSCILLATORS_PLL_CURRENTFREQ_CURRENTFREQ_CK128M:
+ SystemCoreClock = 128000000ul;
+ break;
+ }
+}
+
+void SystemInit(void)
+{
+#ifdef __CORTEX_M
+#ifndef NRF_SKIP_CLOCK_CONFIGURATION
+#if defined(NRF_CONFIG_CPU_FREQ_MHZ) && (NRF_CONFIG_CPU_FREQ_MHZ==64)
+ NRF_OSCILLATORS->PLL.FREQ = OSCILLATORS_PLL_FREQ_FREQ_CK64M;
+#elif defined(NRF_CONFIG_CPU_FREQ_MHZ) && (NRF_CONFIG_CPU_FREQ_MHZ==128)
+ NRF_OSCILLATORS->PLL.FREQ = OSCILLATORS_PLL_FREQ_FREQ_CK128M;
+#elif defined(NRF_CONFIG_CPU_FREQ_MHZ)
+#error "Illegal CPU frequency set"
+#else
+ NRF_OSCILLATORS->PLL.FREQ = OSCILLATORS_PLL_FREQ_FREQ_CK128M;
+#endif
+#endif
+
+#if !defined(NRF_TRUSTZONE_NONSECURE) && defined(__ARM_FEATURE_CMSE)
+#ifndef NRF_SKIP_TAMPC_SETUP
+ nrf54l_handle_approtect();
+#endif
+#if defined(__FPU_PRESENT) && __FPU_PRESENT
+ /* Allow Non-Secure code to run FPU instructions.
+ * If only the secure code should control FPU power state these registers should be configured accordingly in the secure application code. */
+ SCB->NSACR |= (3UL << 10ul);
+#endif
+
+#ifndef NRF_SKIP_SAU_CONFIGURATION
+ configure_default_sau();
+#endif
+
+#if !defined (NRF_DISABLE_FICR_TRIMCNF)
+ /* Trimming of the device. Copy all the trimming values from FICR into the target addresses. Trim
+ until one ADDR is not initialized. */
+ uint32_t index = 0ul;
+ for (index = 0ul; index < FICR_TRIMCNF_MaxCount && NRF_FICR_NS->TRIMCNF[index].ADDR != 0xFFFFFFFFul && NRF_FICR_NS->TRIMCNF[index].ADDR != 0x00000000ul; index++) {
+#if defined ( __ICCARM__ )
+ /* IAR will complain about the order of volatile pointer accesses. */
+ #pragma diag_suppress=Pa082
+#endif
+ * ((volatile uint32_t*)NRF_FICR_NS->TRIMCNF[index].ADDR) = NRF_FICR_NS->TRIMCNF[index].DATA;
+#if defined ( __ICCARM__ )
+#pragma diag_default=Pa082
+#endif
+ }
+#endif
+
+ /* Device configuration for ES PDK */
+#if defined (NRF54L15_XXAA)
+ if (*((volatile uint32_t *)0x50120440) == 0x00ul) {
+ *((volatile uint32_t *)0x50120440) = 0xC8ul;
+ }
+#endif
+
+#if NRF54L_ERRATA_32_ENABLE_WORKAROUND
+ /* Workaround for Errata 32 */
+ if (nrf54l_errata_32())
+ {
+ if (*((volatile uint32_t *)0x00FFC334ul) <= 0x180A1D00ul){
+ *((volatile uint32_t *)0x50120640ul) = 0x1EA9E040ul;
+ }
+ }
+#endif
+
+#endif
+
+ /* Enable the FPU if the compiler used floating point unit instructions. __FPU_USED is a MACRO defined by the
+ * compiler. Since the FPU consumes energy, remember to disable FPU use in the compiler if floating point unit
+ * operations are not used in your code. */
+
+ /* Allow Non-Secure code to run FPU instructions.
+ * If only the secure code should control FPU power state these registers should be configured accordingly in the secure application code. */
+ SCB->NSACR |= (3UL << 10ul);
+
+#if (__FPU_USED == 1ul)
+ SCB->CPACR |= (3UL << 20ul) | (3UL << 22ul);
+ __DSB();
+ __ISB();
+#endif
+
+#if !defined(NRF_TRUSTZONE_NONSECURE) && defined(__ARM_FEATURE_CMSE)
+#if defined(NRF_CONFIG_NFCT_PINS_AS_GPIOS)
+ NRF_NFCT_S->PADCONFIG = (NFCT_PADCONFIG_ENABLE_Disabled << NFCT_PADCONFIG_ENABLE_Pos);
+#endif
+
+ /* Enable SWO trace functionality. If ENABLE_SWO is not defined, SWO pin will be used as GPIO (see Product
+ Specification to see which one). */
+#if defined (ENABLE_SWO)
+ // Enable trace and debug
+ NRF_TAD_S->ENABLE = TAD_ENABLE_ENABLE_Msk;
+
+ // Configure trace port pads
+ NRF_P2_S->PIN_CNF[TRACE_TRACECLK_PIN] &= TRACE_PIN_CLEAR;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA0_PIN] &= TRACE_PIN_CLEAR;
+
+ NRF_P2_S->PIN_CNF[TRACE_TRACECLK_PIN] |= TRACE_PIN_CONFIG;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA0_PIN] |= TRACE_PIN_CONFIG;
+
+ // Configure trace port speed
+ NRF_TAD_S->TRACEPORTSPEED = TAD_TRACEPORTSPEED_TRACEPORTSPEED_DIV2;
+#endif
+
+ /* Enable Trace functionality. If ENABLE_TRACE is not defined, TRACE pins will be used as GPIOs (see Product
+ Specification to see which ones). */
+#if defined (ENABLE_TRACE)
+ // Enable trace and debug
+ NRF_TAD_S->ENABLE = TAD_ENABLE_ENABLE_Msk;
+
+ // Configure trace port pads
+ NRF_P2_S->PIN_CNF[TRACE_TRACECLK_PIN] &= TRACE_PIN_CLEAR;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA0_PIN] &= TRACE_PIN_CLEAR;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA1_PIN] &= TRACE_PIN_CLEAR;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA2_PIN] &= TRACE_PIN_CLEAR;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA3_PIN] &= TRACE_PIN_CLEAR;
+
+ NRF_P2_S->PIN_CNF[TRACE_TRACECLK_PIN] |= TRACE_PIN_CONFIG;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA0_PIN] |= TRACE_PIN_CONFIG;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA1_PIN] |= TRACE_PIN_CONFIG;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA2_PIN] |= TRACE_PIN_CONFIG;
+ NRF_P2_S->PIN_CNF[TRACE_TRACEDATA3_PIN] |= TRACE_PIN_CONFIG;
+
+ // Configure trace port speed
+ NRF_TAD_S->TRACEPORTSPEED = TAD_TRACEPORTSPEED_TRACEPORTSPEED_DIV2;
+#endif
+#endif
+
+#if !defined(NRF_TRUSTZONE_NONSECURE) && !defined (NRF_SKIP_GLITCHDETECTOR_DISABLE)
+ /* Disable glitch detector */
+#if defined (GLITCHDET_GLITCHDETECTORS)
+ NRF_GLITCHDET_S->GLITCHDETECTOR.CONFIG = (GLITCHDET_GLITCHDETECTOR_CONFIG_ENABLE_Disable << GLITCHDET_GLITCHDETECTOR_CONFIG_ENABLE_Pos);
+#else
+ NRF_GLITCHDET_S->CONFIG = (GLITCHDET_CONFIG_ENABLE_Disable << GLITCHDET_CONFIG_ENABLE_Pos);
+#endif
+#endif
+#endif
+}
+
+/*lint --flb "Leave library region" */
diff --git a/hw/mcu/nordic/nrf54lxx/syscfg.yml b/hw/mcu/nordic/nrf54lxx/syscfg.yml
new file mode 100644
index 0000000..43a5e8e
--- /dev/null
+++ b/hw/mcu/nordic/nrf54lxx/syscfg.yml
@@ -0,0 +1,137 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+syscfg.defs:
+ MCU_TARGET:
+ description: >
+ Specifies target MCU.
+ value: nRF54L15
+ restrictions:
+ - $notnull
+ choices:
+ - nRF54L15
+
+ MCU_FLASH_MIN_WRITE_SIZE:
+ description: >
+ Specifies the required alignment for internal flash writes.
+ Used internally by the newt tool.
+ value: 1
+
+ MCU_DCDC_ENABLED:
+ description: >
+ Specifies whether or not to enable DC/DC regulator. This requires
+ external circuitry so is defined to be zero by default and
+ expected to be overridden by the BSP.
+ value: 0
+
+ MCU_LFCLK_SOURCE:
+ description: >
+ Selected source for low frequency clock (LFCLK).
+ value:
+ choices:
+ - LFRC # 32.768 kHz RC oscillator
+ - LFXO # 32.768 kHz crystal oscillator
+ - LFSYNTH # 32.768 kHz synthesized from HFCLK
+
+ MCU_GPIO_USE_PORT_EVENT:
+ description: >
+ When enabled, hal_gpio will use GPIOTE PORT event instead of PIN
+ events for interrupts. This mode may be less accurate (i.e. pulse
+ length needs to be longer in order to be detected) but it reduces
+ power consumption since it does not require HFCLK to be running.
+ Refer to nRF54lxx Product Specification document for more details.
+ value: 0
+
+ MCU_DEBUG_IGNORE_BKPT:
+ description: >
+ When enabled, asm(bkpt) will be ignored. If not set, it will hit
+ the breakpoint wherever it gets called, For example, reset and crash
+ value: 0
+
+# MCU peripherals definitions
+ UART_0:
+ description: 'Enable nRF54Lxx UART20'
+ value: 1
+ UART_0_PIN_TX:
+ description: 'TX pin for UART20'
+ value: ''
+ UART_0_PIN_RX:
+ description: 'RX pin for UART20'
+ value: ''
+ UART_0_PIN_RTS:
+ description: 'RTS pin for UART20'
+ value: -1
+ UART_0_PIN_CTS:
+ description: 'CTS pin for UART20'
+ value: -1
+
+ UART_1:
+ description: 'Enable nRF54Lxx UART21'
+ value: 0
+ UART_1_PIN_TX:
+ description: 'TX pin for UART21'
+ value: ''
+ UART_1_PIN_RX:
+ description: 'RX pin for UART21'
+ value: ''
+ UART_1_PIN_RTS:
+ description: 'RTS pin for UART21'
+ value: -1
+ UART_1_PIN_CTS:
+ description: 'CTS pin for UART21'
+ value: -1
+
+ UART_2:
+ description: 'Enable nRF54Lxx UART22'
+ value: 0
+ UART_2_PIN_TX:
+ description: 'TX pin for UART22'
+ value: ''
+ UART_2_PIN_RX:
+ description: 'RX pin for UART22'
+ value: ''
+ UART_2_PIN_RTS:
+ description: 'RTS pin for UART22'
+ value: -1
+ UART_2_PIN_CTS:
+ description: 'CTS pin for UART22'
+ value: -1
+
+ TIMER_0:
+ description: 'Enable nRF54Lxx Timer 20'
+ value: 1
+ TIMER_1:
+ description: 'Enable nRF54Lxx Timer 21'
+ value: 0
+ TIMER_2:
+ description: 'Enable nRF54Lxx Timer 22'
+ value: 0
+ TIMER_3:
+ description: 'Enable nRF54Lxx Timer 23'
+ value: 0
+ TIMER_4:
+ description: 'Enable nRF54Lxx Timer 24'
+ value: 0
+
+syscfg.vals:
+ OS_TICKS_PER_SEC: 1000
+
+syscfg.restrictions:
+ - "!UART_0 || (UART_0_PIN_TX != -1 && UART_0_PIN_RX != -1)"
+ - "!UART_1 || (UART_1_PIN_TX != -1 && UART_1_PIN_RX != -1)"
+ - "!UART_2 || (UART_2_PIN_TX != -1 && UART_2_PIN_RX != -1)"
diff --git a/hw/mcu/nordic/nrf_common/src/hal_flash.c b/hw/mcu/nordic/nrf_common/src/hal_flash.c
index be65f2b..1397e63 100644
--- a/hw/mcu/nordic/nrf_common/src/hal_flash.c
+++ b/hw/mcu/nordic/nrf_common/src/hal_flash.c
@@ -17,6 +17,8 @@
* under the License.
*/
+/* XXX: nrfx nvmc driver does not support NRF54 devices yet */
+#ifndef NRF54L15_XXAA
#include <string.h>
#include <assert.h>
#include <hal/hal_flash_int.h>
@@ -114,3 +116,4 @@
{
return 0;
}
+#endif
diff --git a/hw/mcu/nordic/nrf_common/src/hal_gpio.c b/hw/mcu/nordic/nrf_common/src/hal_gpio.c
index 2cc633f..9d1e266 100644
--- a/hw/mcu/nordic/nrf_common/src/hal_gpio.c
+++ b/hw/mcu/nordic/nrf_common/src/hal_gpio.c
@@ -47,6 +47,9 @@
#define GPIOTE_IRQn GPIOTE1_IRQn
#define GPIOTE GPIOTE1
#endif
+#elif defined(NRF54L15_XXAA)
+#define GPIOTE_IRQn GPIOTE20_IRQn
+#define NRF_GPIOTE NRF_GPIOTE20
#endif
/* Storage for GPIO callbacks. */