modules: hal_nordic: Enable support for DPPI on nRF54H20
Include into compilation the nrfx_gppi_dppi_ppib helper and related interconnect layers when DPPIC nodes are enabled in DTS. Provide macro definitions required by those interconnect layers based on information from devicetree (the nrf_grtc_timer is only modified because a macro that it uses became more generic). Signed-off-by: Andrzej Głąbek <andrzej.glabek@nordicsemi.no>
This commit is contained in:
parent
54014f503c
commit
6692d880e9
|
@ -21,8 +21,8 @@
|
|||
#if !DT_NODE_HAS_PROP(GRTC_NODE, owned_channels)
|
||||
#error GRTC owned-channels DT property is not defined
|
||||
#endif
|
||||
#define OWNED_CHANNELS_MASK NRFX_CONFIG_GRTC_MASK_DT(owned_channels)
|
||||
#define CHILD_OWNED_CHANNELS_MASK NRFX_CONFIG_GRTC_MASK_DT(child_owned_channels)
|
||||
#define OWNED_CHANNELS_MASK NRFX_CONFIG_MASK_DT(GRTC_NODE, owned_channels)
|
||||
#define CHILD_OWNED_CHANNELS_MASK NRFX_CONFIG_MASK_DT(GRTC_NODE, child_owned_channels)
|
||||
#if ((OWNED_CHANNELS_MASK | CHILD_OWNED_CHANNELS_MASK) != OWNED_CHANNELS_MASK)
|
||||
#error GRTC child-owned-channels DT property must be a subset of owned-channels
|
||||
#endif
|
||||
|
|
|
@ -163,6 +163,14 @@ if(CONFIG_SOC_SERIES_NRF54LX AND CONFIG_NRFX_DPPI)
|
|||
zephyr_library_sources(${NRFX_DIR}/soc/interconnect/dppic_ppib/nrfx_interconnect_dppic_ppib.c)
|
||||
endif()
|
||||
|
||||
if(CONFIG_SOC_SERIES_NRF54HX AND
|
||||
(CONFIG_DT_HAS_NORDIC_NRF_DPPIC_LOCAL_ENABLED OR
|
||||
CONFIG_DT_HAS_NORDIC_NRF_DPPIC_GLOBAL_ENABLED))
|
||||
zephyr_library_sources(${HELPERS_DIR}/nrfx_gppi_dppi_ppib.c)
|
||||
zephyr_library_sources(${NRFX_DIR}/soc/interconnect/apb/nrfx_interconnect_apb.c)
|
||||
zephyr_library_sources(${NRFX_DIR}/soc/interconnect/ipct/nrfx_interconnect_ipct.c)
|
||||
endif()
|
||||
|
||||
# Get the SVD file for the current SoC
|
||||
macro(mdk_svd_ifdef feature_toggle filename)
|
||||
if(${feature_toggle})
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define NRFX_CONFIG_H__
|
||||
|
||||
#include <zephyr/devicetree.h>
|
||||
#include <zephyr/sys/util_macro.h>
|
||||
|
||||
/*
|
||||
* These are mappings of Kconfig options enabling nrfx drivers and particular
|
||||
|
@ -798,27 +799,127 @@
|
|||
#define NRF_PERIPH(P) P##_S
|
||||
#endif
|
||||
|
||||
#define NRFX_CONFIG_BIT_DT(node_id, prop, idx) BIT(DT_PROP_BY_IDX(node_id, prop, idx))
|
||||
#define NRFX_CONFIG_MASK_DT(node_id, prop) \
|
||||
(COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \
|
||||
(DT_FOREACH_PROP_ELEM_SEP(node_id, prop, NRFX_CONFIG_BIT_DT, (|))), \
|
||||
(0)))
|
||||
|
||||
/* If the GRTC system timer driver is to be used, prepare definitions required
|
||||
* by the nrfx_grtc driver (NRFX_GRTC_CONFIG_ALLOWED_CC_CHANNELS_MASK and
|
||||
* NRFX_GRTC_CONFIG_NUM_OF_CC_CHANNELS) based on information from devicetree.
|
||||
*/
|
||||
#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_grtc)
|
||||
#define NRFX_CONFIG_BIT_DT(node_id, prop, idx) \
|
||||
BIT(DT_PROP_BY_IDX(node_id, prop, idx))
|
||||
#define NRFX_CONFIG_GRTC_MASK_DT(prop) \
|
||||
(COND_CODE_1(DT_NODE_HAS_PROP(DT_INST(0, nordic_nrf_grtc), prop), \
|
||||
(DT_FOREACH_PROP_ELEM_SEP(DT_INST(0, nordic_nrf_grtc), prop, \
|
||||
NRFX_CONFIG_BIT_DT, (|))), \
|
||||
(0)))
|
||||
|
||||
#define NRFX_GRTC_CONFIG_ALLOWED_CC_CHANNELS_MASK \
|
||||
(NRFX_CONFIG_GRTC_MASK_DT(owned_channels) & \
|
||||
~NRFX_CONFIG_GRTC_MASK_DT(child_owned_channels))
|
||||
(NRFX_CONFIG_MASK_DT(DT_INST(0, nordic_nrf_grtc), owned_channels) & \
|
||||
~NRFX_CONFIG_MASK_DT(DT_INST(0, nordic_nrf_grtc), child_owned_channels))
|
||||
#define NRFX_GRTC_CONFIG_NUM_OF_CC_CHANNELS \
|
||||
(DT_PROP_LEN_OR(DT_INST(0, nordic_nrf_grtc), owned_channels, 0) - \
|
||||
DT_PROP_LEN_OR(DT_INST(0, nordic_nrf_grtc), child_owned_channels, 0))
|
||||
#endif /* DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_grtc) */
|
||||
|
||||
/* If global of local DPPIC peripherals are used, provide the following macro
|
||||
* definitions required by the interconnect/apb layer:
|
||||
* - NRFX_DPPI_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num)
|
||||
* - NRFX_DPPI_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num)
|
||||
* - NRFX_DPPI_PUB_OR_SUB_MASK(inst_num)
|
||||
* - NRFX_DPPI_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num)
|
||||
* - NRFX_INTERCONNECT_APB_GLOBAL_DPPI_DEFINE
|
||||
* - NRFX_INTERCONNECT_APB_LOCAL_DPPI_DEFINE
|
||||
* based on information from devicetree.
|
||||
*/
|
||||
#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_dppic_global) || \
|
||||
DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_dppic_local)
|
||||
#ifndef NRFX_DPPI_ENABLED
|
||||
#define NRFX_DPPI_ENABLED 1
|
||||
#endif
|
||||
/* Source (publish) channels masks generation. */
|
||||
#define NRFX_DPPI_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \
|
||||
NRFX_CONFIG_MASK_DT(DT_NODELABEL(_CONCAT(dppic, inst_num)), source_channels)
|
||||
|
||||
/* Sink (subscribe) channels masks generation. */
|
||||
#define NRFX_DPPI_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \
|
||||
NRFX_CONFIG_MASK_DT(DT_NODELABEL(_CONCAT(dppic, inst_num)), sink_channels)
|
||||
|
||||
#define NRFX_DPPI_PUB_OR_SUB_MASK(inst_num) \
|
||||
UTIL_OR(DT_NODE_HAS_PROP(DT_NODELABEL(_CONCAT(dppic, inst_num)), source_channels), \
|
||||
DT_NODE_HAS_PROP(DT_NODELABEL(_CONCAT(dppic, inst_num)), sink_channels))
|
||||
|
||||
/* Variables names generation. */
|
||||
#define NRFX_CONFIG_DPPI_CHANNELS_ENTRY_NAME(node_id) _CONCAT(_CONCAT(m_, node_id), _channels)
|
||||
#define NRFX_DPPI_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num) \
|
||||
NRFX_CONFIG_DPPI_CHANNELS_ENTRY_NAME(DT_NODELABEL(_CONCAT(dppic, inst_num)))
|
||||
|
||||
/* Variables entries generation. */
|
||||
#define NRFX_CONFIG_DPPI_CHANNELS_ENTRY(node_id) \
|
||||
static nrfx_atomic_t NRFX_CONFIG_DPPI_CHANNELS_ENTRY_NAME(node_id) \
|
||||
__attribute__((used)) = \
|
||||
NRFX_CONFIG_MASK_DT(node_id, source_channels) | \
|
||||
NRFX_CONFIG_MASK_DT(node_id, sink_channels);
|
||||
#define NRFX_INTERCONNECT_APB_GLOBAL_DPPI_DEFINE \
|
||||
DT_FOREACH_STATUS_OKAY(nordic_nrf_dppic_global, NRFX_CONFIG_DPPI_CHANNELS_ENTRY)
|
||||
#define NRFX_INTERCONNECT_APB_LOCAL_DPPI_DEFINE \
|
||||
DT_FOREACH_STATUS_OKAY(nordic_nrf_dppic_local, NRFX_CONFIG_DPPI_CHANNELS_ENTRY)
|
||||
#endif /* DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_dppic_global) || ... */
|
||||
|
||||
/* If local or global DPPIC peripherals are used, provide the following macro
|
||||
* definitions required by the interconnect/ipct layer:
|
||||
* - NRFX_IPCTx_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num)
|
||||
* - NRFX_IPCTx_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num)
|
||||
* - NRFX_IPCT_PUB_OR_SUB_MASK(inst_num)
|
||||
* - NRFX_IPCTx_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num)
|
||||
* - NRFX_INTERCONNECT_IPCT_GLOBAL_DEFINE
|
||||
* - NRFX_INTERCONNECT_IPCT_LOCAL_DEFINE
|
||||
* based on information from devicetree.
|
||||
*/
|
||||
#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_ipct_global) || \
|
||||
DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_ipct_local)
|
||||
/* Channels masks generation. */
|
||||
#define NRFX_CONFIG_IPCT_MASK_DT(node_id) \
|
||||
COND_CODE_1(DT_NODE_HAS_PROP(node_id, owned_channels), \
|
||||
(NRFX_CONFIG_MASK_DT(node_id, owned_channels)), \
|
||||
(COND_CODE_1(DT_NODE_HAS_COMPAT(node_id, nordic_nrf_ipct_local), \
|
||||
(BIT_MASK(DT_PROP(node_id, channels))), (0))))
|
||||
|
||||
#if defined(NRF_APPLICATION)
|
||||
#define NRFX_CONFIG_IPCT_LOCAL_NODE DT_NODELABEL(cpuapp_ipct)
|
||||
#elif defined(NRF_RADIOCORE)
|
||||
#define NRFX_CONFIG_IPCT_LOCAL_NODE DT_NODELABEL(cpurad_ipct)
|
||||
#endif
|
||||
#define NRFX_CONFIG_IPCT_NODE_BY_INST_NUM(inst_num) \
|
||||
COND_CODE_1(IS_EMPTY(inst_num), \
|
||||
(NRFX_CONFIG_IPCT_LOCAL_NODE), \
|
||||
(DT_NODELABEL(_CONCAT(ipct, inst_num))))
|
||||
|
||||
#define NRFX_IPCTx_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \
|
||||
NRFX_CONFIG_IPCT_MASK_DT(NRFX_CONFIG_IPCT_NODE_BY_INST_NUM(inst_num))
|
||||
|
||||
#define NRFX_IPCTx_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \
|
||||
NRFX_CONFIG_IPCT_MASK_DT(NRFX_CONFIG_IPCT_NODE_BY_INST_NUM(inst_num))
|
||||
|
||||
#define NRFX_IPCT_PUB_OR_SUB_MASK(inst_num) \
|
||||
COND_CODE_1(IS_EMPTY(inst_num), \
|
||||
(DT_NODE_HAS_STATUS(NRFX_CONFIG_IPCT_LOCAL_NODE, okay)), \
|
||||
(DT_NODE_HAS_PROP(DT_NODELABEL(_CONCAT(ipct, inst_num)), owned_channels)))
|
||||
|
||||
/* Variables names generation. */
|
||||
#define NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(node_id) _CONCAT(_CONCAT(m_, node_id), _channels)
|
||||
#define NRFX_IPCTx_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num) \
|
||||
COND_CODE_1(IS_EMPTY(inst_num), \
|
||||
(NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(NRFX_CONFIG_IPCT_LOCAL_NODE)), \
|
||||
(NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(DT_NODELABEL(_CONCAT(ipct, inst_num)))))
|
||||
|
||||
/* Variables entries generation. */
|
||||
#define NRFX_CONFIG_IPCT_CHANNELS_ENTRY(node_id) \
|
||||
static nrfx_atomic_t NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(node_id) \
|
||||
__attribute__((used)) = \
|
||||
NRFX_CONFIG_IPCT_MASK_DT(node_id);
|
||||
#define NRFX_INTERCONNECT_IPCT_LOCAL_DEFINE \
|
||||
DT_FOREACH_STATUS_OKAY(nordic_nrf_ipct_local, NRFX_CONFIG_IPCT_CHANNELS_ENTRY)
|
||||
#define NRFX_INTERCONNECT_IPCT_GLOBAL_DEFINE \
|
||||
DT_FOREACH_STATUS_OKAY(nordic_nrf_ipct_global, NRFX_CONFIG_IPCT_CHANNELS_ENTRY)
|
||||
#endif /* DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_ipct_global) || ... */
|
||||
|
||||
#include <nrfx_config_common.h>
|
||||
#if defined(NRF51)
|
||||
#include <nrfx_config_nrf51.h>
|
||||
|
|
Loading…
Reference in a new issue