|
| 1 | +/* |
| 2 | + * Copyright (c) 2024, Nordic Semiconductor ASA |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | + |
| 7 | +#ifndef NRFX_ZEPHYR_UTILS_H__ |
| 8 | +#define NRFX_ZEPHYR_UTILS_H__ |
| 9 | + |
| 10 | +#include <zephyr/devicetree.h> |
| 11 | +#include <zephyr/sys/util_macro.h> |
| 12 | + |
| 13 | +/* |
| 14 | + * For chips with TrustZone support, MDK provides CMSIS-Core peripheral |
| 15 | + * accessing symbols in two flavors, with secure and non-secure base address |
| 16 | + * mappings. Their names contain the suffix _S or _NS, respectively. |
| 17 | + * Because nrfx HALs and drivers require these peripheral accessing symbols |
| 18 | + * without any suffixes, the following macro is provided that will translate |
| 19 | + * their names according to the kind of the target that is built. |
| 20 | + */ |
| 21 | +#if defined(NRF_TRUSTZONE_NONSECURE) |
| 22 | +#define NRF_PERIPH(P) P##_NS |
| 23 | +#else |
| 24 | +#define NRF_PERIPH(P) P##_S |
| 25 | +#endif |
| 26 | + |
| 27 | +#define NRFX_CONFIG_BIT_DT(node_id, prop, idx) BIT(DT_PROP_BY_IDX(node_id, prop, idx)) |
| 28 | +#define NRFX_CONFIG_MASK_DT(node_id, prop) \ |
| 29 | + (COND_CODE_1(DT_NODE_HAS_PROP(node_id, prop), \ |
| 30 | + (DT_FOREACH_PROP_ELEM_SEP(node_id, prop, NRFX_CONFIG_BIT_DT, (|))), \ |
| 31 | + (0))) |
| 32 | + |
| 33 | +/* If global of local DPPIC peripherals are used, provide the following macro |
| 34 | + * definitions required by the interconnect/apb layer: |
| 35 | + * - NRFX_DPPI_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) |
| 36 | + * - NRFX_DPPI_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) |
| 37 | + * - NRFX_DPPI_PUB_OR_SUB_MASK(inst_num) |
| 38 | + * - NRFX_DPPI_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num) |
| 39 | + * - NRFX_INTERCONNECT_APB_GLOBAL_DPPI_DEFINE |
| 40 | + * - NRFX_INTERCONNECT_APB_LOCAL_DPPI_DEFINE |
| 41 | + * based on information from devicetree. |
| 42 | + */ |
| 43 | +#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_dppic_global) || \ |
| 44 | + DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_dppic_local) |
| 45 | +/* Source (publish) channels masks generation. */ |
| 46 | +#define NRFX_DPPI_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \ |
| 47 | + NRFX_CONFIG_MASK_DT(DT_NODELABEL(_CONCAT(dppic, inst_num)), source_channels) |
| 48 | + |
| 49 | +/* Sink (subscribe) channels masks generation. */ |
| 50 | +#define NRFX_DPPI_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \ |
| 51 | + NRFX_CONFIG_MASK_DT(DT_NODELABEL(_CONCAT(dppic, inst_num)), sink_channels) |
| 52 | + |
| 53 | +#define NRFX_DPPI_PUB_OR_SUB_MASK(inst_num) \ |
| 54 | + UTIL_OR(DT_NODE_HAS_PROP(DT_NODELABEL(_CONCAT(dppic, inst_num)), source_channels), \ |
| 55 | + DT_NODE_HAS_PROP(DT_NODELABEL(_CONCAT(dppic, inst_num)), sink_channels)) |
| 56 | + |
| 57 | +/* Variables names generation. */ |
| 58 | +#define NRFX_CONFIG_DPPI_CHANNELS_ENTRY_NAME(node_id) _CONCAT(_CONCAT(m_, node_id), _channels) |
| 59 | +#define NRFX_DPPI_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num) \ |
| 60 | + NRFX_CONFIG_DPPI_CHANNELS_ENTRY_NAME(DT_NODELABEL(_CONCAT(dppic, inst_num))) |
| 61 | + |
| 62 | +/* Variables entries generation. */ |
| 63 | +#define NRFX_CONFIG_DPPI_CHANNELS_ENTRY(node_id) \ |
| 64 | + static nrfx_atomic_t NRFX_CONFIG_DPPI_CHANNELS_ENTRY_NAME(node_id) \ |
| 65 | + __attribute__((used)) = \ |
| 66 | + NRFX_CONFIG_MASK_DT(node_id, source_channels) | \ |
| 67 | + NRFX_CONFIG_MASK_DT(node_id, sink_channels); |
| 68 | +#define NRFX_INTERCONNECT_APB_GLOBAL_DPPI_DEFINE \ |
| 69 | + DT_FOREACH_STATUS_OKAY(nordic_nrf_dppic_global, NRFX_CONFIG_DPPI_CHANNELS_ENTRY) |
| 70 | +#define NRFX_INTERCONNECT_APB_LOCAL_DPPI_DEFINE \ |
| 71 | + DT_FOREACH_STATUS_OKAY(nordic_nrf_dppic_local, NRFX_CONFIG_DPPI_CHANNELS_ENTRY) |
| 72 | +#endif /* DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_dppic_global) || ... */ |
| 73 | + |
| 74 | +/* If local or global DPPIC peripherals are used, provide the following macro |
| 75 | + * definitions required by the interconnect/ipct layer: |
| 76 | + * - NRFX_IPCTx_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) |
| 77 | + * - NRFX_IPCTx_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) |
| 78 | + * - NRFX_IPCT_PUB_OR_SUB_MASK(inst_num) |
| 79 | + * - NRFX_IPCTx_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num) |
| 80 | + * - NRFX_INTERCONNECT_IPCT_GLOBAL_DEFINE |
| 81 | + * - NRFX_INTERCONNECT_IPCT_LOCAL_DEFINE |
| 82 | + * based on information from devicetree. |
| 83 | + */ |
| 84 | +#if DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_ipct_global) || \ |
| 85 | + DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_ipct_local) |
| 86 | +/* Channels masks generation. */ |
| 87 | +#define NRFX_CONFIG_IPCT_MASK_DT(node_id) \ |
| 88 | + COND_CODE_1(DT_NODE_HAS_PROP(node_id, owned_channels), \ |
| 89 | + (NRFX_CONFIG_MASK_DT(node_id, owned_channels)), \ |
| 90 | + (COND_CODE_1(DT_NODE_HAS_COMPAT(node_id, nordic_nrf_ipct_local), \ |
| 91 | + (BIT_MASK(DT_PROP(node_id, channels))), (0)))) |
| 92 | + |
| 93 | +#if defined(NRF_APPLICATION) |
| 94 | +#define NRFX_CONFIG_IPCT_LOCAL_NODE DT_NODELABEL(cpuapp_ipct) |
| 95 | +#elif defined(NRF_RADIOCORE) |
| 96 | +#define NRFX_CONFIG_IPCT_LOCAL_NODE DT_NODELABEL(cpurad_ipct) |
| 97 | +#endif |
| 98 | +#define NRFX_CONFIG_IPCT_NODE_BY_INST_NUM(inst_num) \ |
| 99 | + COND_CODE_1(IS_EMPTY(inst_num), \ |
| 100 | + (NRFX_CONFIG_IPCT_LOCAL_NODE), \ |
| 101 | + (DT_NODELABEL(_CONCAT(ipct, inst_num)))) |
| 102 | + |
| 103 | +#define NRFX_IPCTx_PUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \ |
| 104 | + NRFX_CONFIG_IPCT_MASK_DT(NRFX_CONFIG_IPCT_NODE_BY_INST_NUM(inst_num)) |
| 105 | + |
| 106 | +#define NRFX_IPCTx_SUB_CONFIG_ALLOWED_CHANNELS_MASK_BY_INST_NUM(inst_num) \ |
| 107 | + NRFX_CONFIG_IPCT_MASK_DT(NRFX_CONFIG_IPCT_NODE_BY_INST_NUM(inst_num)) |
| 108 | + |
| 109 | +#define NRFX_IPCT_PUB_OR_SUB_MASK(inst_num) \ |
| 110 | + COND_CODE_1(IS_EMPTY(inst_num), \ |
| 111 | + (DT_NODE_HAS_STATUS_OKAY(NRFX_CONFIG_IPCT_LOCAL_NODE)), \ |
| 112 | + (DT_NODE_HAS_PROP(DT_NODELABEL(_CONCAT(ipct, inst_num)), owned_channels))) |
| 113 | + |
| 114 | +/* Variables names generation. */ |
| 115 | +#define NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(node_id) _CONCAT(_CONCAT(m_, node_id), _channels) |
| 116 | +#define NRFX_IPCTx_CHANNELS_SINGLE_VAR_NAME_BY_INST_NUM(inst_num) \ |
| 117 | + COND_CODE_1(IS_EMPTY(inst_num), \ |
| 118 | + (NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(NRFX_CONFIG_IPCT_LOCAL_NODE)), \ |
| 119 | + (NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(DT_NODELABEL(_CONCAT(ipct, inst_num))))) |
| 120 | + |
| 121 | +/* Variables entries generation. */ |
| 122 | +#define NRFX_CONFIG_IPCT_CHANNELS_ENTRY(node_id) \ |
| 123 | + static nrfx_atomic_t NRFX_CONFIG_IPCT_CHANNELS_ENTRY_NAME(node_id) \ |
| 124 | + __attribute__((used)) = \ |
| 125 | + NRFX_CONFIG_IPCT_MASK_DT(node_id); |
| 126 | +#define NRFX_INTERCONNECT_IPCT_LOCAL_DEFINE \ |
| 127 | + DT_FOREACH_STATUS_OKAY(nordic_nrf_ipct_local, NRFX_CONFIG_IPCT_CHANNELS_ENTRY) |
| 128 | +#define NRFX_INTERCONNECT_IPCT_GLOBAL_DEFINE \ |
| 129 | + DT_FOREACH_STATUS_OKAY(nordic_nrf_ipct_global, NRFX_CONFIG_IPCT_CHANNELS_ENTRY) |
| 130 | +#endif /* DT_HAS_COMPAT_STATUS_OKAY(nordic_nrf_ipct_global) || ... */ |
| 131 | + |
| 132 | +#endif /* NRFX_ZEPHYR_UTILS_H__ */ |
0 commit comments