29#include "nrf_peripherals.h"
30#include "nrf53_erratas.h"
31#include "system_nrf53.h"
32#include "system_nrf53_approtect.h"
36void SystemStoreFICRNS();
39#define __SYSTEM_CLOCK_MAX (128000000UL)
40#define __SYSTEM_CLOCK_INITIAL ( 64000000UL)
42#define TRACE_PIN_CNF_VALUE ( (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) | \
43 (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | \
44 (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | \
45 (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | \
46 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | \
47 (GPIO_PIN_CNF_MCUSEL_TND << GPIO_PIN_CNF_MCUSEL_Pos))
49#define TRACE_TRACECLK_PIN TAD_PSEL_TRACECLK_PIN_Traceclk
50#define TRACE_TRACEDATA0_PIN TAD_PSEL_TRACEDATA0_PIN_Tracedata0
51#define TRACE_TRACEDATA1_PIN TAD_PSEL_TRACEDATA1_PIN_Tracedata1
52#define TRACE_TRACEDATA2_PIN TAD_PSEL_TRACEDATA2_PIN_Tracedata2
53#define TRACE_TRACEDATA3_PIN TAD_PSEL_TRACEDATA3_PIN_Tracedata3
55#if defined ( __CC_ARM )
56 uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_INITIAL;
57#elif defined ( __ICCARM__ )
58 __root uint32_t SystemCoreClock = __SYSTEM_CLOCK_INITIAL;
59#elif defined ( __GNUC__ )
60 uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_INITIAL;
63void SystemCoreClockUpdate(
void)
65#if defined(NRF_TRUSTZONE_NONSECURE)
66 SystemCoreClock = __SYSTEM_CLOCK_MAX >> (NRF_CLOCK_NS->HFCLKCTRL & (CLOCK_HFCLKCTRL_HCLK_Msk));
68 SystemCoreClock = __SYSTEM_CLOCK_MAX >> (NRF_CLOCK_S->HFCLKCTRL & (CLOCK_HFCLKCTRL_HCLK_Msk));
74 #if !defined(NRF_TRUSTZONE_NONSECURE)
79 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
80 SAU->CTRL |= (1 << SAU_CTRL_ALLNS_Pos);
85 if (nrf53_errata_97())
87 if (*((
volatile uint32_t *)0x50004A20ul) == 0)
89 *((
volatile uint32_t *)0x50004A20ul) = 0xDul;
90 *((
volatile uint32_t *)0x5000491Cul) = 0x1ul;
91 *((
volatile uint32_t *)0x5000491Cul) = 0x0ul;
99 for (index = 0; index < 32ul && NRF_FICR_S->TRIMCNF[index].ADDR != 0xFFFFFFFFul; index++){
100 #if defined ( __ICCARM__ )
102 #pragma diag_suppress=Pa082
104 *((
volatile uint32_t *)NRF_FICR_S->TRIMCNF[index].ADDR) = NRF_FICR_S->TRIMCNF[index].DATA;
105 #if defined ( __ICCARM__ )
106 #pragma diag_default=Pa082
113 if (nrf53_errata_64())
115 *((
volatile uint32_t *)0x5000470Cul) = 0x29ul;
116 *((
volatile uint32_t *)0x5000473Cul) = 0x3ul;
121 if (nrf53_errata_42())
123 *((
volatile uint32_t *)0x50039530ul) = 0xBEEF0044ul;
124 NRF_CLOCK_S->HFCLKCTRL = CLOCK_HFCLKCTRL_HCLK_Div2 << CLOCK_HFCLKCTRL_HCLK_Pos;
129 if (nrf53_errata_46())
131 *((
volatile uint32_t *)0x5003254Cul) = 0;
136 if (nrf53_errata_49())
138 if (NRF_RESET_S->RESETREAS & RESET_RESETREAS_RESETPIN_Msk)
140 NRF_POWER_S->EVENTS_SLEEPENTER = 0;
141 NRF_POWER_S->EVENTS_SLEEPEXIT = 0;
147 if (nrf53_errata_55())
149 if (NRF_RESET_S->RESETREAS & RESET_RESETREAS_RESETPIN_Msk){
150 NRF_RESET_S->RESETREAS = ~RESET_RESETREAS_RESETPIN_Msk;
156 if (nrf53_errata_69())
158 *((
volatile uint32_t *)0x5000470Cul) =0x65ul;
161 if (nrf53_errata_140())
163 if (*(
volatile uint32_t *)0x50032420 & 0x80000000)
166 NRF_CLOCK_S->LFCLKSRC = CLOCK_LFCLKSRC_SRC_LFSYNT;
167 NRF_CLOCK_S->TASKS_LFCLKSTART = 1;
168 while (NRF_CLOCK_S->EVENTS_LFCLKSTARTED == 0) {}
169 NRF_CLOCK_S->EVENTS_LFCLKSTARTED = 0;
170 NRF_CLOCK_S->TASKS_LFCLKSTOP = 1;
171 NRF_CLOCK_S->LFCLKSRC = CLOCK_LFCLKSRC_SRC_LFRC;
175 #if !defined(NRF_SKIP_FICR_NS_COPY_TO_RAM)
179 #if defined(CONFIG_NFCT_PINS_AS_GPIOS)
181 if ((NRF_UICR_S->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos))
183 NRF_NVMC_S->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
185 while (NRF_NVMC_S->READY == NVMC_READY_READY_Busy);
186 NRF_UICR_S->NFCPINS &= ~UICR_NFCPINS_PROTECT_Msk;
188 while (NRF_NVMC_S->READY == NVMC_READY_READY_Busy);
189 NRF_NVMC_S->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
191 while (NRF_NVMC_S->READY == NVMC_READY_READY_Busy);
199 #if defined (ENABLE_SWO)
201 NRF_TAD_S->ENABLE = TAD_ENABLE_ENABLE_Msk;
202 NRF_TAD_S->CLOCKSTART = TAD_CLOCKSTART_START_Msk;
205 NRF_SPU_S->GPIOPORT[0].PERM &= ~(1 << TRACE_TRACEDATA0_PIN);
208 NRF_P0_S->PIN_CNF[TRACE_TRACEDATA0_PIN] = TRACE_PIN_CNF_VALUE;
211 NRF_TAD_S->PSEL.TRACEDATA0 = TRACE_TRACEDATA0_PIN;
214 NRF_TAD_S->TRACEPORTSPEED = TAD_TRACEPORTSPEED_TRACEPORTSPEED_64MHz;
219 #if defined (ENABLE_TRACE)
221 NRF_TAD_S->ENABLE = TAD_ENABLE_ENABLE_Msk;
222 NRF_TAD_S->CLOCKSTART = TAD_CLOCKSTART_START_Msk;
225 NRF_SPU_S->GPIOPORT[0].PERM &= ~(1 << TRACE_TRACECLK_PIN);
226 NRF_SPU_S->GPIOPORT[0].PERM &= ~(1 << TRACE_TRACEDATA0_PIN);
227 NRF_SPU_S->GPIOPORT[0].PERM &= ~(1 << TRACE_TRACEDATA1_PIN);
228 NRF_SPU_S->GPIOPORT[0].PERM &= ~(1 << TRACE_TRACEDATA2_PIN);
229 NRF_SPU_S->GPIOPORT[0].PERM &= ~(1 << TRACE_TRACEDATA3_PIN);
232 NRF_P0_S->PIN_CNF[TRACE_TRACECLK_PIN] = TRACE_PIN_CNF_VALUE;
233 NRF_P0_S->PIN_CNF[TRACE_TRACEDATA0_PIN] = TRACE_PIN_CNF_VALUE;
234 NRF_P0_S->PIN_CNF[TRACE_TRACEDATA1_PIN] = TRACE_PIN_CNF_VALUE;
235 NRF_P0_S->PIN_CNF[TRACE_TRACEDATA2_PIN] = TRACE_PIN_CNF_VALUE;
236 NRF_P0_S->PIN_CNF[TRACE_TRACEDATA3_PIN] = TRACE_PIN_CNF_VALUE;
239 NRF_TAD_S->PSEL.TRACECLK = TRACE_TRACECLK_PIN;
240 NRF_TAD_S->PSEL.TRACEDATA0 = TRACE_TRACEDATA0_PIN;
241 NRF_TAD_S->PSEL.TRACEDATA1 = TRACE_TRACEDATA1_PIN;
242 NRF_TAD_S->PSEL.TRACEDATA2 = TRACE_TRACEDATA2_PIN;
243 NRF_TAD_S->PSEL.TRACEDATA3 = TRACE_TRACEDATA3_PIN;
246 NRF_TAD_S->TRACEPORTSPEED = TAD_TRACEPORTSPEED_TRACEPORTSPEED_64MHz;
252 SCB->NSACR |= (3UL << 10);
255 nrf53_handle_approtect();
262 #if (__FPU_USED == 1)
263 SCB->CPACR |= (3UL << 20) | (3UL << 22);
268 SystemCoreClockUpdate();
272#define FICR_SIZE 0x1000ul
273#define RAM_BASE 0x20000000ul
274#define RAM_END 0x2FFFFFFFul
277void SystemStoreFICRNS()
279 if ((uint32_t)NRF_FICR_NS < RAM_BASE || (uint32_t)NRF_FICR_NS + FICR_SIZE > RAM_END)
285 volatile uint32_t * from = (
volatile uint32_t *)((uint32_t)NRF_FICR_S + (FICR_SIZE -
sizeof(uint32_t)));
286 volatile uint32_t * to = (
volatile uint32_t *)((uint32_t)NRF_FICR_NS + (FICR_SIZE -
sizeof(uint32_t)));
287 volatile uint32_t * copy_from_end = (
volatile uint32_t *)NRF_FICR_S;
288 while (from >= copy_from_end)
294 uint32_t ram_region = ((uint32_t)NRF_FICR_NS - (uint32_t)RAM_BASE) / SPU_RAMREGION_SIZE;
295 NRF_SPU_S->RAMREGION[ram_region].PERM &= ~(1 << SPU_RAMREGION_PERM_SECATTR_Pos);
299void SystemLockFICRNS()
301 if ((uint32_t)NRF_FICR_NS < RAM_BASE || (uint32_t)NRF_FICR_NS + FICR_SIZE > RAM_END)
307 uint32_t ram_region = ((uint32_t)NRF_FICR_NS - (uint32_t)RAM_BASE) / SPU_RAMREGION_SIZE;
308 NRF_SPU_S->RAMREGION[ram_region].PERM &=
310 (1 << SPU_RAMREGION_PERM_WRITE_Pos) |
311 (1 << SPU_RAMREGION_PERM_EXECUTE_Pos)
313 NRF_SPU_S->RAMREGION[ram_region].PERM |= 1 << SPU_RAMREGION_PERM_LOCK_Pos;