Skip to content

Commit b2cb1a3

Browse files
[nrf fromlist] soc: nordic: add IRONside SE compatible UICR support
Upstream PR #: 91005 Add support for generating UICR and associated artifacts in a format compatible with IRONside SE, to be used for nRF SoCs in the Haltium family. The main feature added with this is the ability to configure certain global domain peripherals that are managed by the secure domain through setting UICR.PERIPHCONF. This register points at a blob of (register address, register value) pairs which are loaded into the peripherals by IRONside SE ahead of the application boot. The added helper macros in uicr.h can be used to add register configurations to the PERIPHCONF. Entries added through these macros are then extracted by a script, post-processed and placed in a blob located at specific part of MRAM. A default PERIPHCONF configuration has been added for the nrf54h20 soc to support the standard BLE use case. Signed-off-by: Jonathan Nilsen <[email protected]>
1 parent 02161b9 commit b2cb1a3

File tree

11 files changed

+700
-0
lines changed

11 files changed

+700
-0
lines changed

boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20-memory_map_iron.dtsi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,9 @@
100100
storage_partition: partition@1a8000 {
101101
reg = <0x1a8000 DT_SIZE_K(40)>;
102102
};
103+
104+
periphconf_partition: partition@1b2000 {
105+
reg = <0x1b2000 DT_SIZE_K(8)>;
106+
};
103107
};
104108
};

boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuapp_iron.dts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,5 @@ slot0_partition: &cpuapp_slot0_partition {
3535
slot1_partition: &cpuapp_slot1_partition {
3636
label = "image-1";
3737
};
38+
39+
uicr: &cpuapp_uicr {};

soc/nordic/common/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
add_subdirectory_ifdef(CONFIG_RISCV_CORE_NORDIC_VPR vpr)
55

6+
if(CONFIG_NRF_PERIPHCONF_SECTION OR CONFIG_NRF_HALTIUM_GENERATE_UICR)
7+
add_subdirectory(uicr)
8+
endif()
9+
610
# Let SystemInit() be called in place of soc_reset_hook() by default.
711
zephyr_linker_symbol(SYMBOL soc_reset_hook EXPR "@SystemInit@")
812

soc/nordic/common/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ source "subsys/logging/Kconfig.template.log_config"
4949
endif # MRAM_LATENCY
5050

5151
rsource "vpr/Kconfig"
52+
rsource "uicr/Kconfig"
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright (c) 2025 Nordic Semiconductor ASA
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
if(CONFIG_NRF_PERIPHCONF_SECTION)
5+
zephyr_linker_sources(SECTIONS uicr.ld)
6+
endif()
7+
8+
if(CONFIG_NRF_HALTIUM_GENERATE_UICR)
9+
set(uicr_hex_file ${PROJECT_BINARY_DIR}/uicr.hex)
10+
set(periphconf_hex_file ${PROJECT_BINARY_DIR}/periphconf.hex)
11+
12+
if(CONFIG_NRF_HALTIUM_UICR_PERIPHCONF)
13+
set(in_periphconf_elf_arg
14+
--in-periphconf-elf $<TARGET_FILE:${ZEPHYR_LINK_STAGE_EXECUTABLE}>
15+
)
16+
endif()
17+
18+
set(uicrgen_command
19+
${CMAKE_COMMAND} -E env PYTHONPATH=${ZEPHYR_BASE}/scripts/dts/python-devicetree/src
20+
${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/uicrgen.py
21+
--in-config ${DOTCONFIG}
22+
--in-edt-pickle ${EDT_PICKLE}
23+
${in_periphconf_elf_arg}
24+
--out-uicr-hex ${uicr_hex_file}
25+
--out-periphconf-hex ${periphconf_hex_file}
26+
)
27+
28+
set_property(
29+
GLOBAL APPEND
30+
PROPERTY extra_post_build_commands COMMAND ${uicrgen_command}
31+
)
32+
set_property(
33+
GLOBAL APPEND
34+
PROPERTY extra_post_build_byproducts ${uicr_hex_file} ${periphconf_hex_file}
35+
)
36+
endif()

soc/nordic/common/uicr/Kconfig

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Copyright (c) 2025 Nordic Semiconductor ASA
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config NRF_HALTIUM_GENERATE_UICR
5+
bool "Generate UICR file"
6+
depends on SOC_NRF54H20_CPUAPP
7+
depends on SOC_NRF54H20_IRON
8+
default y
9+
help
10+
Generate UICR HEX file.
11+
12+
if NRF_HALTIUM_GENERATE_UICR
13+
14+
config NRF_HALTIUM_UICR_PERIPHCONF
15+
bool "Initialize global domain peripherals"
16+
default y
17+
depends on NRF_PERIPHCONF_SECTION
18+
help
19+
Generates a blob containing static global domain peripheral initialization
20+
values extracted from the build artifacts, and configures UICR.PERIPHCONF
21+
to point at the blob. The initialization values are then loaded ahead of
22+
ahead of the application boot.
23+
24+
endif
25+
26+
config NRF_PERIPHCONF_SECTION
27+
bool "Populate global peripheral initialization section"
28+
default y if SOC_NRF54H20_CPUAPP
29+
depends on SOC_NRF54H20_IRON
30+
depends on LINKER_DEVNULL_SUPPORT
31+
imply LINKER_DEVNULL_MEMORY
32+
help
33+
Include static global domain peripheral initialization values from the
34+
build in a dedicated section in the devnull region.

soc/nordic/common/uicr/uicr.h

Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#ifndef SOC_NORDIC_COMMON_UICR_UICR_H_
7+
#define SOC_NORDIC_COMMON_UICR_UICR_H_
8+
9+
#include <stdint.h>
10+
#include <nrfx.h>
11+
#include <zephyr/sys/iterable_sections.h>
12+
#include <zephyr/sys/util.h>
13+
#include <zephyr/toolchain.h>
14+
15+
/** Entry in the PERIPHCONF table. */
16+
struct uicr_periphconf_entry {
17+
/** Register pointer. */
18+
uint32_t regptr;
19+
/** Register value. */
20+
uint32_t value;
21+
} __packed;
22+
23+
/** @brief Add an entry to the PERIPHCONF table section.
24+
*
25+
* This should typically not be used directly.
26+
* Prefer to use one of the higher level macros.
27+
*/
28+
#define UICR_PERIPHCONF_ADD(_regptr, _value) \
29+
static STRUCT_SECTION_ITERABLE(uicr_periphconf_entry, \
30+
_UICR_PERIPHCONF_ENTRY_NAME(__COUNTER__)) = { \
31+
.regptr = (_regptr), \
32+
.value = (_value), \
33+
}
34+
35+
#define _UICR_PERIPHCONF_ENTRY_NAME(_id) __UICR_PERIPHCONF_ENTRY_NAME(_id)
36+
#define __UICR_PERIPHCONF_ENTRY_NAME(_id) _uicr_periphconf_entry_##_id
37+
38+
/** @brief Add a PERIPHCONF entry for configuring a SPU PERIPH[n].PERM register value.
39+
*
40+
* @param _spu Global domain SPU peripheral instance.
41+
* @param _index Register index.
42+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
43+
* @param _dmasec If true, set DMASEC to secure, otherwise set it to non-secure.
44+
* @param _ownerid OWNERID field value.
45+
*/
46+
#define UICR_SPU_PERIPH_PERM_SET(_spu, _index, _secattr, _dmasec, _ownerid) \
47+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_SPU_Type *)(_spu))->PERIPH[(_index)].PERM, \
48+
(uint32_t)((((_ownerid) << SPU_PERIPH_PERM_OWNERID_Pos) & \
49+
SPU_PERIPH_PERM_OWNERID_Msk) | \
50+
(((_secattr) ? SPU_PERIPH_PERM_SECATTR_Secure \
51+
: SPU_PERIPH_PERM_SECATTR_NonSecure) \
52+
<< SPU_PERIPH_PERM_SECATTR_Pos) | \
53+
(((_dmasec) ? SPU_PERIPH_PERM_DMASEC_Secure \
54+
: SPU_PERIPH_PERM_DMASEC_NonSecure) \
55+
<< SPU_PERIPH_PERM_DMASEC_Pos) | \
56+
(SPU_PERIPH_PERM_LOCK_Locked << SPU_PERIPH_PERM_LOCK_Pos)))
57+
58+
/** @brief Add a PERIPHCONF entry for a SPU FEATURE.IPCT.CH[n] register value.
59+
*
60+
* @param _spu Global domain SPU peripheral instance.
61+
* @param _index Feature index.
62+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
63+
* @param _ownerid OWNERID field value.
64+
*/
65+
#define UICR_SPU_FEATURE_IPCT_CH_SET(_spu, _index, _secattr, _ownerid) \
66+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.IPCT.CH[_index], \
67+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
68+
69+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.IPCT.INTERRUPT[n] register value.
70+
*
71+
* @param _spu Global domain SPU peripheral instance.
72+
* @param _index Feature index.
73+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
74+
* @param _ownerid OWNERID field value.
75+
*/
76+
#define UICR_SPU_FEATURE_IPCT_INTERRUPT_SET(_spu, _index, _secattr, _ownerid) \
77+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.IPCT.INTERRUPT[_index], \
78+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
79+
80+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.DPPIC.CH[n] register value.
81+
*
82+
* @param _spu Global domain SPU peripheral instance.
83+
* @param _index Feature index.
84+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
85+
* @param _ownerid OWNERID field value.
86+
*/
87+
#define UICR_SPU_FEATURE_DPPIC_CH_SET(_spu, _index, _secattr, _ownerid) \
88+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.DPPIC.CH[_index], \
89+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
90+
91+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.DPPIC.CHG[n] register value.
92+
*
93+
* @param _spu Global domain SPU peripheral instance.
94+
* @param _index Register index.
95+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
96+
* @param _ownerid OWNERID field value.
97+
*/
98+
#define UICR_SPU_FEATURE_DPPIC_CHG_SET(_spu, _index, _secattr, _ownerid) \
99+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.DPPIC.CHG[_index], \
100+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
101+
102+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.GPIOTE[n].CH[m] register value.
103+
*
104+
* @param _spu Global domain SPU peripheral instance.
105+
* @param _index Feature index.
106+
* @param _subindex Feature subindex.
107+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
108+
* @param _ownerid OWNERID field value.
109+
*/
110+
#define UICR_SPU_FEATURE_GPIOTE_CH_SET(_spu, _index, _subindex, _secattr, _ownerid) \
111+
UICR_PERIPHCONF_ADD( \
112+
(uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.GPIOTE[_index].CH[_subindex], \
113+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
114+
115+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.GPIOTE.INTERRUPT[n] register value.
116+
*
117+
* @param _spu Global domain SPU peripheral instance.
118+
* @param _index Feature index.
119+
* @param _subindex Feature subindex.
120+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
121+
* @param _ownerid OWNERID field value.
122+
*/
123+
#define UICR_SPU_FEATURE_GPIOTE_INTERRUPT_SET(_spu, _index, _subindex, _secattr, _ownerid) \
124+
UICR_PERIPHCONF_ADD( \
125+
(uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.GPIOTE[_index].INTERRUPT[_subindex], \
126+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
127+
128+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.GPIO[n].PIN[m] register value.
129+
*
130+
* @param _spu Global domain SPU peripheral instance.
131+
* @param _index Feature index.
132+
* @param _subindex Feature subindex.
133+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
134+
* @param _ownerid OWNERID field value.
135+
*/
136+
#define UICR_SPU_FEATURE_GPIO_PIN_SET(_spu, _index, _subindex, _secattr, _ownerid) \
137+
UICR_PERIPHCONF_ADD( \
138+
(uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.GPIO[_index].PIN[_subindex], \
139+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
140+
141+
/** @brief Add a PERIPHCONF entry for configuring a SPU FEATURE.GRTC.CC[n] register value.
142+
*
143+
* @param _spu Global domain SPU peripheral instance.
144+
* @param _index Feature index.
145+
* @param _secattr If true, set SECATTR to secure, otherwise set it to non-secure.
146+
* @param _ownerid OWNERID field value.
147+
*/
148+
#define UICR_SPU_FEATURE_GRTC_CC_SET(_spu, _index, _secattr, _ownerid) \
149+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_SPU_Type *)(_spu))->FEATURE.GRTC.CC[_index], \
150+
_UICR_SPU_FEATURE_VAL(_secattr, _ownerid))
151+
152+
/* Common macro for encoding a SPU FEATURE.* register value. */
153+
#define _UICR_SPU_FEATURE_VAL(_secattr, _ownerid) \
154+
(uint32_t)((((_ownerid) << SPU_FEATURE_IPCT_CH_OWNERID_Pos) & \
155+
SPU_FEATURE_IPCT_CH_OWNERID_Msk) | \
156+
(((_secattr) ? SPU_FEATURE_IPCT_CH_SECATTR_Secure \
157+
: SPU_FEATURE_IPCT_CH_SECATTR_NonSecure) \
158+
<< SPU_FEATURE_IPCT_CH_SECATTR_Pos) | \
159+
(SPU_FEATURE_IPCT_CH_LOCK_Locked << SPU_FEATURE_IPCT_CH_LOCK_Pos))
160+
161+
/** @brief Add PERIPHCONF entries for configuring IPCMAP CHANNEL.SOURCE[n] and CHANNEL.SINK[n].
162+
*
163+
* @param _index Register index into CHANNEL.SOURCE[n]/CHANNEL.SINK[n].
164+
* @param _source_domain DOMAIN field value in CHANNEL[n].SOURCE.
165+
* @param _source_ch SOURCE field value in CHANNEL[n].SOURCE.
166+
* @param _sink_domain DOMAIN field value in CHANNEL[n].SINK.
167+
* @param _sink_ch SINK field value in CHANNEL[n].SINK.
168+
*/
169+
#define UICR_IPCMAP_CHANNEL_CFG(_index, _source_domain, _source_ch, _sink_domain, _sink_ch) \
170+
UICR_IPCMAP_CHANNEL_SOURCE_SET(_index, _source_domain, _source_ch, 1); \
171+
UICR_IPCMAP_CHANNEL_SINK_SET(_index, _sink_domain, _sink_ch)
172+
173+
#define UICR_IPCMAP_CHANNEL_SOURCE_SET(_index, _domain, _ch, _enable) \
174+
UICR_PERIPHCONF_ADD((uint32_t)&NRF_IPCMAP->CHANNEL[(_index)].SOURCE, \
175+
(uint32_t)((((_domain) << IPCMAP_CHANNEL_SOURCE_DOMAIN_Pos) & \
176+
IPCMAP_CHANNEL_SOURCE_DOMAIN_Msk) | \
177+
(((_ch) << IPCMAP_CHANNEL_SOURCE_SOURCE_Pos) & \
178+
IPCMAP_CHANNEL_SOURCE_SOURCE_Msk) | \
179+
(((_enable) ? IPCMAP_CHANNEL_SOURCE_ENABLE_Enabled \
180+
: IPCMAP_CHANNEL_SOURCE_ENABLE_Disabled) \
181+
<< IPCMAP_CHANNEL_SOURCE_ENABLE_Pos)))
182+
183+
#define UICR_IPCMAP_CHANNEL_SINK_SET(_index, _domain, _ch) \
184+
UICR_PERIPHCONF_ADD((uint32_t)&NRF_IPCMAP->CHANNEL[(_index)].SINK, \
185+
(uint32_t)((((_domain) << IPCMAP_CHANNEL_SINK_DOMAIN_Pos) & \
186+
IPCMAP_CHANNEL_SINK_DOMAIN_Msk) | \
187+
(((_ch) << IPCMAP_CHANNEL_SINK_SINK_Pos) & \
188+
IPCMAP_CHANNEL_SINK_SINK_Msk)))
189+
190+
/** @brief Add a PERIPHCONF entry for configuring IRQMAP IRQ[n].SINK register value.
191+
*
192+
* @param _irqnum IRQ number - register index into IRQ[n].
193+
* @param _processor PROCESSORID field value.
194+
*/
195+
#define UICR_IRQMAP_IRQ_SINK_SET(_irqnum, _processor) \
196+
UICR_PERIPHCONF_ADD((uint32_t)&NRF_IRQMAP->IRQ[(_irqnum)].SINK, \
197+
(uint32_t)(((_processor) << IRQMAP_IRQ_SINK_PROCESSORID_Pos) & \
198+
IRQMAP_IRQ_SINK_PROCESSORID_Msk))
199+
200+
/** @brief Add a PERIPHCONF entry for configuring a GPIO PIN_CNF[n] CTRLSEL field value.
201+
*
202+
* @param _gpio GPIO instance.
203+
* @param _pin Pin number.
204+
* @param _ctrlsel CTRLSEL field value.
205+
*/
206+
#define UICR_GPIO_PIN_CNF_CTRLSEL_SET(_gpio, _pin, _ctrlsel) \
207+
UICR_PERIPHCONF_ADD( \
208+
(uint32_t)&((NRF_GPIO_Type *)(_gpio))->PIN_CNF[(_pin)], \
209+
((GPIO_PIN_CNF_ResetValue) | \
210+
(uint32_t)(((_ctrlsel) << GPIO_PIN_CNF_CTRLSEL_Pos) & GPIO_PIN_CNF_CTRLSEL_Msk)))
211+
212+
/** @brief Add a PERIPHCONF entry for configuring a PPIB SUBSCRIBE_SEND[n] register.
213+
*
214+
* @param _ppib Global domain PPIB instance.
215+
* @param _ppib_ch PPIB channel number.
216+
*/
217+
#define UICR_PPIB_SUBSCRIBE_SEND_ENABLE(_ppib, _ppib_ch) \
218+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_PPIB_Type *)(_ppib))->SUBSCRIBE_SEND[(_ppib_ch)], \
219+
(uint32_t)PPIB_SUBSCRIBE_SEND_EN_Msk)
220+
221+
/** @brief Add a PERIPHCONF entry for configuring a PPIB PUBLISH_RECEIVE[n] register.
222+
*
223+
* @param _ppib Global domain PPIB instance.
224+
* @param _ppib_ch PPIB channel number.
225+
*/
226+
#define UICR_PPIB_PUBLISH_RECEIVE_ENABLE(_ppib, _ppib_ch) \
227+
UICR_PERIPHCONF_ADD((uint32_t)&((NRF_PPIB_Type *)(_ppib))->PUBLISH_RECEIVE[(_ppib_ch)], \
228+
(uint32_t)PPIB_PUBLISH_RECEIVE_EN_Msk)
229+
230+
/* TODO: get everything below from the MDK */
231+
#ifndef IPCMAP_CHANNEL_SOURCE_SOURCE_Msk
232+
233+
typedef struct {
234+
__IOM uint32_t SOURCE;
235+
__IOM uint32_t SINK;
236+
} NRF_IPCMAP_CHANNEL_Type;
237+
238+
#define IPCMAP_CHANNEL_SOURCE_SOURCE_Pos (0UL)
239+
#define IPCMAP_CHANNEL_SOURCE_SOURCE_Msk (0xFUL << IPCMAP_CHANNEL_SOURCE_SOURCE_Pos)
240+
#define IPCMAP_CHANNEL_SOURCE_DOMAIN_Pos (8UL)
241+
#define IPCMAP_CHANNEL_SOURCE_DOMAIN_Msk (0xFUL << IPCMAP_CHANNEL_SOURCE_DOMAIN_Pos)
242+
#define IPCMAP_CHANNEL_SOURCE_ENABLE_Pos (31UL)
243+
#define IPCMAP_CHANNEL_SOURCE_ENABLE_Disabled (0x0UL)
244+
#define IPCMAP_CHANNEL_SOURCE_ENABLE_Enabled (0x1UL)
245+
#define IPCMAP_CHANNEL_SINK_SINK_Pos (0UL)
246+
#define IPCMAP_CHANNEL_SINK_SINK_Msk (0xFUL << IPCMAP_CHANNEL_SINK_SINK_Pos)
247+
#define IPCMAP_CHANNEL_SINK_DOMAIN_Pos (8UL)
248+
#define IPCMAP_CHANNEL_SINK_DOMAIN_Msk (0xFUL << IPCMAP_CHANNEL_SINK_DOMAIN_Pos)
249+
250+
typedef struct {
251+
__IM uint32_t RESERVED[256];
252+
__IOM NRF_IPCMAP_CHANNEL_Type CHANNEL[16];
253+
} NRF_IPCMAP_Type;
254+
255+
#endif /* IPCMAP_CHANNEL_SOURCE_SOURCE_Msk */
256+
257+
#ifndef NRF_IPCMAP
258+
#define NRF_IPCMAP ((NRF_IPCMAP_Type *)0x5F923000UL)
259+
#endif
260+
261+
#ifndef IRQMAP_IRQ_SINK_PROCESSORID_Msk
262+
263+
typedef struct {
264+
__IOM uint32_t SINK;
265+
} NRF_IRQMAP_IRQ_Type;
266+
267+
#define IRQMAP_IRQ_SINK_PROCESSORID_Pos (8UL)
268+
#define IRQMAP_IRQ_SINK_PROCESSORID_Msk (0xFUL << IRQMAP_IRQ_SINK_PROCESSORID_Pos)
269+
270+
typedef struct {
271+
__IM uint32_t RESERVED[256];
272+
__IOM NRF_IRQMAP_IRQ_Type IRQ[480];
273+
} NRF_IRQMAP_Type;
274+
275+
#endif /* IRQMAP_IRQ_SINK_PROCESSORID_Msk */
276+
277+
#ifndef NRF_IRQMAP
278+
#define NRF_IRQMAP ((NRF_IRQMAP_Type *)0x5F924000UL)
279+
#endif /* NRF_IRQMAP */
280+
281+
#ifndef NRF_GPIO_PIN_CNF_CTRLSEL_Pos
282+
283+
#define GPIO_PIN_CNF_CTRLSEL_Pos (28UL)
284+
#define GPIO_PIN_CNF_CTRLSEL_Msk (0x7UL << GPIO_PIN_CNF_CTRLSEL_Pos)
285+
286+
#endif /* NRF_GPIO_PIN_CNF_CTRLSEL_Pos */
287+
288+
#endif /* SOC_NORDIC_COMMON_UICR_UICR_H_ */

0 commit comments

Comments
 (0)