Pedro Correia / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_NORDIC/TARGET_NRF5/sdk/drivers_nrf/common/nrf_drv_common.c@144:ef7eb2e8f9f7
Child:
150:02e0a0aed4ec
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /*
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2015 Nordic Semiconductor ASA
<> 144:ef7eb2e8f9f7 3 * All rights reserved.
<> 144:ef7eb2e8f9f7 4 *
<> 144:ef7eb2e8f9f7 5 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 6 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * 1. Redistributions of source code must retain the above copyright notice, this list
<> 144:ef7eb2e8f9f7 9 * of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
<> 144:ef7eb2e8f9f7 12 * integrated circuit in a product or a software update for such product, must reproduce
<> 144:ef7eb2e8f9f7 13 * the above copyright notice, this list of conditions and the following disclaimer in
<> 144:ef7eb2e8f9f7 14 * the documentation and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 15 *
<> 144:ef7eb2e8f9f7 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
<> 144:ef7eb2e8f9f7 17 * used to endorse or promote products derived from this software without specific prior
<> 144:ef7eb2e8f9f7 18 * written permission.
<> 144:ef7eb2e8f9f7 19 *
<> 144:ef7eb2e8f9f7 20 * 4. This software, with or without modification, must only be used with a
<> 144:ef7eb2e8f9f7 21 * Nordic Semiconductor ASA integrated circuit.
<> 144:ef7eb2e8f9f7 22 *
<> 144:ef7eb2e8f9f7 23 * 5. Any software provided in binary or object form under this license must not be reverse
<> 144:ef7eb2e8f9f7 24 * engineered, decompiled, modified and/or disassembled.
<> 144:ef7eb2e8f9f7 25 *
<> 144:ef7eb2e8f9f7 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
<> 144:ef7eb2e8f9f7 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
<> 144:ef7eb2e8f9f7 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
<> 144:ef7eb2e8f9f7 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
<> 144:ef7eb2e8f9f7 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
<> 144:ef7eb2e8f9f7 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
<> 144:ef7eb2e8f9f7 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
<> 144:ef7eb2e8f9f7 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
<> 144:ef7eb2e8f9f7 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 36 *
<> 144:ef7eb2e8f9f7 37 */
<> 144:ef7eb2e8f9f7 38
<> 144:ef7eb2e8f9f7 39
<> 144:ef7eb2e8f9f7 40 #include <stddef.h>
<> 144:ef7eb2e8f9f7 41 #include "nrf_drv_common.h"
<> 144:ef7eb2e8f9f7 42 #include "nrf_assert.h"
<> 144:ef7eb2e8f9f7 43 #include "app_util_platform.h"
<> 144:ef7eb2e8f9f7 44
<> 144:ef7eb2e8f9f7 45 #ifdef SOFTDEVICE_PRESENT
<> 144:ef7eb2e8f9f7 46 #include "nrf_soc.h"
<> 144:ef7eb2e8f9f7 47 #endif
<> 144:ef7eb2e8f9f7 48
<> 144:ef7eb2e8f9f7 49
<> 144:ef7eb2e8f9f7 50 #if PERIPHERAL_RESOURCE_SHARING_ENABLED
<> 144:ef7eb2e8f9f7 51
<> 144:ef7eb2e8f9f7 52 typedef struct {
<> 144:ef7eb2e8f9f7 53 nrf_drv_irq_handler_t handler;
<> 144:ef7eb2e8f9f7 54 bool acquired;
<> 144:ef7eb2e8f9f7 55 } shared_resource_t;
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 // SPIM0, SPIS0, SPI0, TWIM0, TWIS0, TWI0
<> 144:ef7eb2e8f9f7 58 #if (SPI0_ENABLED || SPIS0_ENABLED || TWI0_ENABLED || TWIS0_ENABLED)
<> 144:ef7eb2e8f9f7 59 #define SERIAL_BOX_0_IN_USE
<> 144:ef7eb2e8f9f7 60 // [this checking may need a different form in unit tests, hence macro]
<> 144:ef7eb2e8f9f7 61 #ifndef IS_SERIAL_BOX_0
<> 144:ef7eb2e8f9f7 62 #define IS_SERIAL_BOX_0(p_per_base) (p_per_base == NRF_SPI0)
<> 144:ef7eb2e8f9f7 63 #endif
<> 144:ef7eb2e8f9f7 64
<> 144:ef7eb2e8f9f7 65 static shared_resource_t m_serial_box_0 = { .acquired = false };
<> 144:ef7eb2e8f9f7 66 void SPI0_TWI0_IRQHandler(void)
<> 144:ef7eb2e8f9f7 67 {
<> 144:ef7eb2e8f9f7 68 ASSERT(m_serial_box_0.handler);
<> 144:ef7eb2e8f9f7 69 m_serial_box_0.handler();
<> 144:ef7eb2e8f9f7 70 }
<> 144:ef7eb2e8f9f7 71 #endif // (SPI0_ENABLED || SPIS0_ENABLED || TWI0_ENABLED || TWIS0_ENABLED)
<> 144:ef7eb2e8f9f7 72
<> 144:ef7eb2e8f9f7 73 // SPIM1, SPIS1, SPI1, TWIM1, TWIS1, TWI1
<> 144:ef7eb2e8f9f7 74 #if (SPI1_ENABLED || SPIS1_ENABLED || TWI1_ENABLED || TWIS1_ENABLED)
<> 144:ef7eb2e8f9f7 75 #define SERIAL_BOX_1_IN_USE
<> 144:ef7eb2e8f9f7 76 // [this checking may need a different form in unit tests, hence macro]
<> 144:ef7eb2e8f9f7 77 #ifndef IS_SERIAL_BOX_1
<> 144:ef7eb2e8f9f7 78 #define IS_SERIAL_BOX_1(p_per_base) (p_per_base == NRF_SPI1)
<> 144:ef7eb2e8f9f7 79 #endif
<> 144:ef7eb2e8f9f7 80
<> 144:ef7eb2e8f9f7 81 static shared_resource_t m_serial_box_1 = { .acquired = false };
<> 144:ef7eb2e8f9f7 82 void SPI1_TWI1_IRQHandler(void)
<> 144:ef7eb2e8f9f7 83 {
<> 144:ef7eb2e8f9f7 84 ASSERT(m_serial_box_1.handler);
<> 144:ef7eb2e8f9f7 85 m_serial_box_1.handler();
<> 144:ef7eb2e8f9f7 86 }
<> 144:ef7eb2e8f9f7 87 #endif // (SPI1_ENABLED || SPIS1_ENABLED || TWI1_ENABLED || TWIS1_ENABLED)
<> 144:ef7eb2e8f9f7 88
<> 144:ef7eb2e8f9f7 89 // SPIM2, SPIS2, SPI2
<> 144:ef7eb2e8f9f7 90 #if (SPI2_ENABLED || SPIS2_ENABLED)
<> 144:ef7eb2e8f9f7 91 #define SERIAL_BOX_2_IN_USE
<> 144:ef7eb2e8f9f7 92 // [this checking may need a different form in unit tests, hence macro]
<> 144:ef7eb2e8f9f7 93 #ifndef IS_SERIAL_BOX_2
<> 144:ef7eb2e8f9f7 94 #define IS_SERIAL_BOX_2(p_per_base) (p_per_base == NRF_SPI2)
<> 144:ef7eb2e8f9f7 95 #endif
<> 144:ef7eb2e8f9f7 96
<> 144:ef7eb2e8f9f7 97 static shared_resource_t m_serial_box_2 = { .acquired = false };
<> 144:ef7eb2e8f9f7 98 void SPIM2_SPIS2_SPI2_IRQHandler(void)
<> 144:ef7eb2e8f9f7 99 {
<> 144:ef7eb2e8f9f7 100 ASSERT(m_serial_box_2.handler);
<> 144:ef7eb2e8f9f7 101 m_serial_box_2.handler();
<> 144:ef7eb2e8f9f7 102 }
<> 144:ef7eb2e8f9f7 103 #endif // (SPI2_ENABLED || SPIS2_ENABLED)
<> 144:ef7eb2e8f9f7 104
<> 144:ef7eb2e8f9f7 105 // COMP, LPCOMP
<> 144:ef7eb2e8f9f7 106 #if (COMP_ENABLED || LPCOMP_ENABLED)
<> 144:ef7eb2e8f9f7 107 #define COMP_LPCOMP_IN_USE
<> 144:ef7eb2e8f9f7 108
<> 144:ef7eb2e8f9f7 109 #ifndef IS_COMP_LPCOMP
<> 144:ef7eb2e8f9f7 110 #define IS_COMP_LPCOMP(p_per_base) ((p_per_base) == NRF_LPCOMP)
<> 144:ef7eb2e8f9f7 111 #endif
<> 144:ef7eb2e8f9f7 112
<> 144:ef7eb2e8f9f7 113 static shared_resource_t m_comp_lpcomp = { .acquired = false };
<> 144:ef7eb2e8f9f7 114 void LPCOMP_IRQHandler(void)
<> 144:ef7eb2e8f9f7 115 {
<> 144:ef7eb2e8f9f7 116 ASSERT(m_comp_lpcomp.handler);
<> 144:ef7eb2e8f9f7 117 m_comp_lpcomp.handler();
<> 144:ef7eb2e8f9f7 118 }
<> 144:ef7eb2e8f9f7 119 #endif // (COMP_ENABLED || LPCOMP_ENABLED)
<> 144:ef7eb2e8f9f7 120
<> 144:ef7eb2e8f9f7 121 #if defined(SERIAL_BOX_0_IN_USE) || \
<> 144:ef7eb2e8f9f7 122 defined(SERIAL_BOX_1_IN_USE) || \
<> 144:ef7eb2e8f9f7 123 defined(SERIAL_BOX_2_IN_USE) || \
<> 144:ef7eb2e8f9f7 124 defined(COMP_LPCOMP_IN_USE)
<> 144:ef7eb2e8f9f7 125 static ret_code_t acquire_shared_resource(shared_resource_t * p_resource,
<> 144:ef7eb2e8f9f7 126 nrf_drv_irq_handler_t handler)
<> 144:ef7eb2e8f9f7 127 {
<> 144:ef7eb2e8f9f7 128 bool busy = false;
<> 144:ef7eb2e8f9f7 129
<> 144:ef7eb2e8f9f7 130 CRITICAL_REGION_ENTER();
<> 144:ef7eb2e8f9f7 131 if (p_resource->acquired)
<> 144:ef7eb2e8f9f7 132 {
<> 144:ef7eb2e8f9f7 133 busy = true;
<> 144:ef7eb2e8f9f7 134 }
<> 144:ef7eb2e8f9f7 135 else
<> 144:ef7eb2e8f9f7 136 {
<> 144:ef7eb2e8f9f7 137 p_resource->acquired = true;
<> 144:ef7eb2e8f9f7 138 }
<> 144:ef7eb2e8f9f7 139 CRITICAL_REGION_EXIT();
<> 144:ef7eb2e8f9f7 140
<> 144:ef7eb2e8f9f7 141 if (busy)
<> 144:ef7eb2e8f9f7 142 {
<> 144:ef7eb2e8f9f7 143 return NRF_ERROR_BUSY;
<> 144:ef7eb2e8f9f7 144 }
<> 144:ef7eb2e8f9f7 145
<> 144:ef7eb2e8f9f7 146 p_resource->handler = handler;
<> 144:ef7eb2e8f9f7 147 return NRF_SUCCESS;
<> 144:ef7eb2e8f9f7 148 }
<> 144:ef7eb2e8f9f7 149 #endif
<> 144:ef7eb2e8f9f7 150
<> 144:ef7eb2e8f9f7 151 ret_code_t nrf_drv_common_per_res_acquire(void const * p_per_base,
<> 144:ef7eb2e8f9f7 152 nrf_drv_irq_handler_t handler)
<> 144:ef7eb2e8f9f7 153 {
<> 144:ef7eb2e8f9f7 154 #ifdef SERIAL_BOX_0_IN_USE
<> 144:ef7eb2e8f9f7 155 if (IS_SERIAL_BOX_0(p_per_base))
<> 144:ef7eb2e8f9f7 156 {
<> 144:ef7eb2e8f9f7 157 return acquire_shared_resource(&m_serial_box_0, handler);
<> 144:ef7eb2e8f9f7 158 }
<> 144:ef7eb2e8f9f7 159 #endif
<> 144:ef7eb2e8f9f7 160
<> 144:ef7eb2e8f9f7 161 #ifdef SERIAL_BOX_1_IN_USE
<> 144:ef7eb2e8f9f7 162 if (IS_SERIAL_BOX_1(p_per_base))
<> 144:ef7eb2e8f9f7 163 {
<> 144:ef7eb2e8f9f7 164 return acquire_shared_resource(&m_serial_box_1, handler);
<> 144:ef7eb2e8f9f7 165 }
<> 144:ef7eb2e8f9f7 166 #endif
<> 144:ef7eb2e8f9f7 167
<> 144:ef7eb2e8f9f7 168 #ifdef SERIAL_BOX_2_IN_USE
<> 144:ef7eb2e8f9f7 169 if (IS_SERIAL_BOX_2(p_per_base))
<> 144:ef7eb2e8f9f7 170 {
<> 144:ef7eb2e8f9f7 171 return acquire_shared_resource(&m_serial_box_2, handler);
<> 144:ef7eb2e8f9f7 172 }
<> 144:ef7eb2e8f9f7 173 #endif
<> 144:ef7eb2e8f9f7 174
<> 144:ef7eb2e8f9f7 175 #ifdef COMP_LPCOMP_IN_USE
<> 144:ef7eb2e8f9f7 176 if (IS_COMP_LPCOMP(p_per_base))
<> 144:ef7eb2e8f9f7 177 {
<> 144:ef7eb2e8f9f7 178 return acquire_shared_resource(&m_comp_lpcomp, handler);
<> 144:ef7eb2e8f9f7 179 }
<> 144:ef7eb2e8f9f7 180 #endif
<> 144:ef7eb2e8f9f7 181
<> 144:ef7eb2e8f9f7 182 return NRF_ERROR_INVALID_PARAM;
<> 144:ef7eb2e8f9f7 183 }
<> 144:ef7eb2e8f9f7 184
<> 144:ef7eb2e8f9f7 185 void nrf_drv_common_per_res_release(void const * p_per_base)
<> 144:ef7eb2e8f9f7 186 {
<> 144:ef7eb2e8f9f7 187 #ifdef SERIAL_BOX_0_IN_USE
<> 144:ef7eb2e8f9f7 188 if (IS_SERIAL_BOX_0(p_per_base))
<> 144:ef7eb2e8f9f7 189 {
<> 144:ef7eb2e8f9f7 190 m_serial_box_0.acquired = false;
<> 144:ef7eb2e8f9f7 191 }
<> 144:ef7eb2e8f9f7 192 else
<> 144:ef7eb2e8f9f7 193 #endif
<> 144:ef7eb2e8f9f7 194
<> 144:ef7eb2e8f9f7 195 #ifdef SERIAL_BOX_1_IN_USE
<> 144:ef7eb2e8f9f7 196 if (IS_SERIAL_BOX_1(p_per_base))
<> 144:ef7eb2e8f9f7 197 {
<> 144:ef7eb2e8f9f7 198 m_serial_box_1.acquired = false;
<> 144:ef7eb2e8f9f7 199 }
<> 144:ef7eb2e8f9f7 200 else
<> 144:ef7eb2e8f9f7 201 #endif
<> 144:ef7eb2e8f9f7 202
<> 144:ef7eb2e8f9f7 203 #ifdef SERIAL_BOX_2_IN_USE
<> 144:ef7eb2e8f9f7 204 if (IS_SERIAL_BOX_2(p_per_base))
<> 144:ef7eb2e8f9f7 205 {
<> 144:ef7eb2e8f9f7 206 m_serial_box_2.acquired = false;
<> 144:ef7eb2e8f9f7 207 }
<> 144:ef7eb2e8f9f7 208 else
<> 144:ef7eb2e8f9f7 209 #endif
<> 144:ef7eb2e8f9f7 210
<> 144:ef7eb2e8f9f7 211 #ifdef COMP_LPCOMP_IN_USE
<> 144:ef7eb2e8f9f7 212 if (IS_COMP_LPCOMP(p_per_base))
<> 144:ef7eb2e8f9f7 213 {
<> 144:ef7eb2e8f9f7 214 m_comp_lpcomp.acquired = false;
<> 144:ef7eb2e8f9f7 215 }
<> 144:ef7eb2e8f9f7 216 else
<> 144:ef7eb2e8f9f7 217 #endif
<> 144:ef7eb2e8f9f7 218
<> 144:ef7eb2e8f9f7 219 {}
<> 144:ef7eb2e8f9f7 220 }
<> 144:ef7eb2e8f9f7 221
<> 144:ef7eb2e8f9f7 222 #endif // PERIPHERAL_RESOURCE_SHARING_ENABLED
<> 144:ef7eb2e8f9f7 223
<> 144:ef7eb2e8f9f7 224
<> 144:ef7eb2e8f9f7 225 void nrf_drv_common_irq_enable(IRQn_Type IRQn, uint8_t priority)
<> 144:ef7eb2e8f9f7 226 {
<> 144:ef7eb2e8f9f7 227
<> 144:ef7eb2e8f9f7 228 #ifdef SOFTDEVICE_PRESENT
<> 144:ef7eb2e8f9f7 229 ASSERT((priority == APP_IRQ_PRIORITY_LOW) || (priority == APP_IRQ_PRIORITY_HIGH));
<> 144:ef7eb2e8f9f7 230 #endif
<> 144:ef7eb2e8f9f7 231
<> 144:ef7eb2e8f9f7 232 NVIC_SetPriority(IRQn, priority);
<> 144:ef7eb2e8f9f7 233 NVIC_ClearPendingIRQ(IRQn);
<> 144:ef7eb2e8f9f7 234 NVIC_EnableIRQ(IRQn);
<> 144:ef7eb2e8f9f7 235 }