Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 | /* * Copyright (c) 2018, Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #ifndef NRFX_GLUE_H__ #define NRFX_GLUE_H__ #include <sys/__assert.h> #include <sys/atomic.h> #include <irq.h> #ifdef __cplusplus extern "C" { #endif /** * @defgroup nrfx_glue nrfx_glue.h * @{ * @ingroup nrfx * * @brief This file contains macros that should be implemented according to * the needs of the host environment into which @em nrfx is integrated. */ //------------------------------------------------------------------------------ /** * @brief Macro for placing a runtime assertion. * * @param expression Expression to be evaluated. */ #ifndef NRFX_ASSERT #define NRFX_ASSERT(expression) __ASSERT_NO_MSG(expression) #endif /** * @brief Macro for placing a compile time assertion. * * @param expression Expression to be evaluated. */ #define NRFX_STATIC_ASSERT(expression) \ BUILD_ASSERT(expression, "assertion failed") //------------------------------------------------------------------------------ /** * @brief Macro for setting the priority of a specific IRQ. * * @param irq_number IRQ number. * @param priority Priority to be set. */ #define NRFX_IRQ_PRIORITY_SET(irq_number, priority) // Intentionally empty. // Priorities of IRQs are // set through IRQ_CONNECT. /** * @brief Macro for enabling a specific IRQ. * * @param irq_number IRQ number. */ #define NRFX_IRQ_ENABLE(irq_number) irq_enable(irq_number) /** * @brief Macro for checking if a specific IRQ is enabled. * * @param irq_number IRQ number. * * @retval true If the IRQ is enabled. * @retval false Otherwise. */ #define NRFX_IRQ_IS_ENABLED(irq_number) irq_is_enabled(irq_number) /** * @brief Macro for disabling a specific IRQ. * * @param irq_number IRQ number. */ #define NRFX_IRQ_DISABLE(irq_number) irq_disable(irq_number) /** * @brief Macro for setting a specific IRQ as pending. * * @param irq_number IRQ number. */ #define NRFX_IRQ_PENDING_SET(irq_number) NVIC_SetPendingIRQ(irq_number) /** * @brief Macro for clearing the pending status of a specific IRQ. * * @param irq_number IRQ number. */ #define NRFX_IRQ_PENDING_CLEAR(irq_number) NVIC_ClearPendingIRQ(irq_number) /** * @brief Macro for checking the pending status of a specific IRQ. * * @retval true If the IRQ is pending. * @retval false Otherwise. */ #define NRFX_IRQ_IS_PENDING(irq_number) (NVIC_GetPendingIRQ(irq_number) == 1) /** @brief Macro for entering into a critical section. */ #define NRFX_CRITICAL_SECTION_ENTER() { unsigned int irq_lock_key = irq_lock(); /** @brief Macro for exiting from a critical section. */ #define NRFX_CRITICAL_SECTION_EXIT() irq_unlock(irq_lock_key); } //------------------------------------------------------------------------------ /** * @brief When set to a non-zero value, this macro specifies that * @ref nrfx_coredep_delay_us uses a precise DWT-based solution. * A compilation error is generated if the DWT unit is not present * in the SoC used. */ #define NRFX_DELAY_DWT_BASED 0 /** * @brief Macro for delaying the code execution for at least the specified time. * * @param us_time Number of microseconds to wait. */ #define NRFX_DELAY_US(us_time) nrfx_busy_wait(us_time) /* This is a k_busy_wait wrapper, added to avoid the inclusion of kernel.h */ void nrfx_busy_wait(uint32_t usec_to_wait); //------------------------------------------------------------------------------ /** @brief Atomic 32-bit unsigned type. */ #define nrfx_atomic_t atomic_t /** * @brief Macro for storing a value to an atomic object and returning its previous value. * * @param[in] p_data Atomic memory pointer. * @param[in] value Value to store. * * @return Previous value of the atomic object. */ #define NRFX_ATOMIC_FETCH_STORE(p_data, value) atomic_set(p_data, value) /** * @brief Macro for running a bitwise OR operation on an atomic object and returning its previous value. * * @param[in] p_data Atomic memory pointer. * @param[in] value Value of the second operand in the OR operation. * * @return Previous value of the atomic object. */ #define NRFX_ATOMIC_FETCH_OR(p_data, value) atomic_or(p_data, value) /** * @brief Macro for running a bitwise AND operation on an atomic object * and returning its previous value. * * @param[in] p_data Atomic memory pointer. * @param[in] value Value of the second operand in the AND operation. * * @return Previous value of the atomic object. */ #define NRFX_ATOMIC_FETCH_AND(p_data, value) atomic_and(p_data, value) /** * @brief Macro for running a bitwise XOR operation on an atomic object * and returning its previous value. * * @param[in] p_data Atomic memory pointer. * @param[in] value Value of the second operand in the XOR operation. * * @return Previous value of the atomic object. */ #define NRFX_ATOMIC_FETCH_XOR(p_data, value) atomic_xor(p_data, value) /** * @brief Macro for running an addition operation on an atomic object * and returning its previous value. * * @param[in] p_data Atomic memory pointer. * @param[in] value Value of the second operand in the ADD operation. * * @return Previous value of the atomic object. */ #define NRFX_ATOMIC_FETCH_ADD(p_data, value) atomic_add(p_data, value) /** * @brief Macro for running a subtraction operation on an atomic object * and returning its previous value. * * @param[in] p_data Atomic memory pointer. * @param[in] value Value of the second operand in the SUB operation. * * @return Previous value of the atomic object. */ #define NRFX_ATOMIC_FETCH_SUB(p_data, value) atomic_sub(p_data, value) //------------------------------------------------------------------------------ /** * @brief When set to a non-zero value, this macro specifies that the * @ref nrfx_error_codes and the @ref nrfx_err_t type itself are defined * in a customized way and the default definitions from @c <nrfx_error.h> * should not be used. */ #define NRFX_CUSTOM_ERROR_CODES 0 //------------------------------------------------------------------------------ /** * @brief When set to a non-zero value, this macro specifies that inside HALs * the event registers are read back after clearing, on devices that * otherwise could defer the actual register modification. */ #define NRFX_EVENT_READBACK_ENABLED 1 //------------------------------------------------------------------------------ /** @brief Bitmask that defines DPPI channels that are reserved for use outside of the nrfx library. */ #define NRFX_DPPI_CHANNELS_USED NRFX_PPI_CHANNELS_USED_BY_BT_CTLR /** @brief Bitmask that defines DPPI groups that are reserved for use outside of the nrfx library. */ #define NRFX_DPPI_GROUPS_USED NRFX_PPI_GROUPS_USED_BY_BT_CTLR /** @brief Bitmask that defines PPI channels that are reserved for use outside of the nrfx library. */ #define NRFX_PPI_CHANNELS_USED (NRFX_PPI_CHANNELS_USED_BY_BT_CTLR | \ NRFX_PPI_CHANNELS_USED_BY_PWM_SW) /** @brief Bitmask that defines PPI groups that are reserved for use outside of the nrfx library. */ #define NRFX_PPI_GROUPS_USED NRFX_PPI_GROUPS_USED_BY_BT_CTLR /** @brief Bitmask that defines GPIOTE channels that are reserved for use outside of the nrfx library. */ #define NRFX_GPIOTE_CHANNELS_USED NRFX_GPIOTE_CHANNELS_USED_BY_PWM_SW #if defined(CONFIG_BT_CTLR) extern const uint32_t z_bt_ctlr_used_nrf_ppi_channels; extern const uint32_t z_bt_ctlr_used_nrf_ppi_groups; #define NRFX_PPI_CHANNELS_USED_BY_BT_CTLR z_bt_ctlr_used_nrf_ppi_channels #define NRFX_PPI_GROUPS_USED_BY_BT_CTLR z_bt_ctlr_used_nrf_ppi_groups #else #define NRFX_PPI_CHANNELS_USED_BY_BT_CTLR 0 #define NRFX_PPI_GROUPS_USED_BY_BT_CTLR 0 #endif #if defined(CONFIG_PWM_NRF5_SW) #define PWM_NRF5_SW_NODE DT_INST(0, nordic_nrf_sw_pwm) #define PWM_NRF5_SW_GENERATOR_NODE DT_PHANDLE(PWM_NRF5_SW_NODE, generator) #if DT_NODE_HAS_COMPAT(PWM_NRF5_SW_GENERATOR_NODE, nordic_nrf_rtc) #define PWM_NRF5_SW_PPI_CHANNELS_PER_PIN 3 #else #define PWM_NRF5_SW_PPI_CHANNELS_PER_PIN 2 #endif /* DT_NODE_HAS_COMPAT(PWM_NRF5_SW_GENERATOR_NODE, nordic_nrf_rtc) */ #define NRFX_PPI_CHANNELS_USED_BY_PWM_SW \ (BIT_MASK(DT_PROP(PWM_NRF5_SW_NODE, channel_count) * \ PWM_NRF5_SW_PPI_CHANNELS_PER_PIN) \ << DT_PROP(PWM_NRF5_SW_NODE, ppi_base)) #define NRFX_GPIOTE_CHANNELS_USED_BY_PWM_SW \ DT_PROP(PWM_NRF5_SW_NODE, channel_count) #else #define NRFX_PPI_CHANNELS_USED_BY_PWM_SW 0 #define NRFX_GPIOTE_CHANNELS_USED_BY_PWM_SW 0 #endif /** @brief Bitmask that defines EGU instances that are reserved for use outside of the nrfx library. */ #define NRFX_EGUS_USED 0 /** @brief Bitmask that defines TIMER instances that are reserved for use outside of the nrfx library. */ #define NRFX_TIMERS_USED 0 //------------------------------------------------------------------------------ /** * @brief Function helping to integrate nrfx IRQ handlers with IRQ_CONNECT. * * This function simply calls the nrfx IRQ handler supplied as the parameter. * It is intended to be used in the following way: * IRQ_CONNECT(IRQ_NUM, IRQ_PRI, nrfx_isr, nrfx_..._irq_handler, 0); * * @param[in] irq_handler Pointer to the nrfx IRQ handler to be called. */ void nrfx_isr(const void *irq_handler); #if defined(CONFIG_SOC_SERIES_BSIM_NRFXX) #include "nrfx_glue_bsim.h" #endif /** @} */ #ifdef __cplusplus } #endif #endif // NRFX_GLUE_H__ |