mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Mon Oct 02 15:33:19 2017 +0100
Revision:
174:b96e65c34a4d
Parent:
165:e614a9f1c9e2
This updates the lib to the mbed lib v 152

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 165:e614a9f1c9e2 1 /*
AnnaBridge 165:e614a9f1c9e2 2 * Copyright (c) 2012 Nordic Semiconductor ASA
AnnaBridge 165:e614a9f1c9e2 3 * All rights reserved.
AnnaBridge 165:e614a9f1c9e2 4 *
AnnaBridge 165:e614a9f1c9e2 5 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 165:e614a9f1c9e2 6 * are permitted provided that the following conditions are met:
AnnaBridge 165:e614a9f1c9e2 7 *
AnnaBridge 165:e614a9f1c9e2 8 * 1. Redistributions of source code must retain the above copyright notice, this list
AnnaBridge 165:e614a9f1c9e2 9 * of conditions and the following disclaimer.
AnnaBridge 165:e614a9f1c9e2 10 *
AnnaBridge 165:e614a9f1c9e2 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
AnnaBridge 165:e614a9f1c9e2 12 * integrated circuit in a product or a software update for such product, must reproduce
AnnaBridge 165:e614a9f1c9e2 13 * the above copyright notice, this list of conditions and the following disclaimer in
AnnaBridge 165:e614a9f1c9e2 14 * the documentation and/or other materials provided with the distribution.
AnnaBridge 165:e614a9f1c9e2 15 *
AnnaBridge 165:e614a9f1c9e2 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
AnnaBridge 165:e614a9f1c9e2 17 * used to endorse or promote products derived from this software without specific prior
AnnaBridge 165:e614a9f1c9e2 18 * written permission.
AnnaBridge 165:e614a9f1c9e2 19 *
AnnaBridge 165:e614a9f1c9e2 20 * 4. This software, with or without modification, must only be used with a
AnnaBridge 165:e614a9f1c9e2 21 * Nordic Semiconductor ASA integrated circuit.
AnnaBridge 165:e614a9f1c9e2 22 *
AnnaBridge 165:e614a9f1c9e2 23 * 5. Any software provided in binary or object form under this license must not be reverse
AnnaBridge 165:e614a9f1c9e2 24 * engineered, decompiled, modified and/or disassembled.
AnnaBridge 165:e614a9f1c9e2 25 *
AnnaBridge 165:e614a9f1c9e2 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
AnnaBridge 165:e614a9f1c9e2 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
AnnaBridge 165:e614a9f1c9e2 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 165:e614a9f1c9e2 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
AnnaBridge 165:e614a9f1c9e2 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
AnnaBridge 165:e614a9f1c9e2 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
AnnaBridge 165:e614a9f1c9e2 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
AnnaBridge 165:e614a9f1c9e2 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
AnnaBridge 165:e614a9f1c9e2 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
AnnaBridge 165:e614a9f1c9e2 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 165:e614a9f1c9e2 36 *
AnnaBridge 165:e614a9f1c9e2 37 */
AnnaBridge 165:e614a9f1c9e2 38 #include "softdevice_handler.h"
AnnaBridge 165:e614a9f1c9e2 39 #include <stdlib.h>
AnnaBridge 165:e614a9f1c9e2 40 #include <stdint.h>
AnnaBridge 165:e614a9f1c9e2 41 #include <stdio.h>
AnnaBridge 165:e614a9f1c9e2 42 #include <string.h>
AnnaBridge 165:e614a9f1c9e2 43 #include "nrf.h"
AnnaBridge 165:e614a9f1c9e2 44 #include "nrf_assert.h"
AnnaBridge 165:e614a9f1c9e2 45 #include "nrf_soc.h"
AnnaBridge 165:e614a9f1c9e2 46 #include "nrf_nvic.h"
AnnaBridge 165:e614a9f1c9e2 47 #include "sdk_common.h"
AnnaBridge 165:e614a9f1c9e2 48
AnnaBridge 165:e614a9f1c9e2 49 #if NRF_MODULE_ENABLED(CLOCK)
AnnaBridge 165:e614a9f1c9e2 50 #include "nrf_drv_clock.h"
AnnaBridge 165:e614a9f1c9e2 51 #endif // NRF_MODULE_ENABLED(CLOCK)
AnnaBridge 165:e614a9f1c9e2 52 #include "app_error.h"
AnnaBridge 165:e614a9f1c9e2 53
AnnaBridge 165:e614a9f1c9e2 54 #if NRF_MODULE_ENABLED(RNG)
AnnaBridge 165:e614a9f1c9e2 55 #include "nrf_drv_rng.h"
AnnaBridge 165:e614a9f1c9e2 56 #endif // NRF_MODULE_ENABLED(RNG)
AnnaBridge 165:e614a9f1c9e2 57
AnnaBridge 165:e614a9f1c9e2 58 #define NRF_LOG_MODULE_NAME "SDH"
AnnaBridge 165:e614a9f1c9e2 59 #include "nrf_log.h"
AnnaBridge 165:e614a9f1c9e2 60 #if defined(ANT_STACK_SUPPORT_REQD) && defined(BLE_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 61 #include "ant_interface.h"
AnnaBridge 165:e614a9f1c9e2 62 #elif defined(ANT_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 63 #include "ant_interface.h"
AnnaBridge 165:e614a9f1c9e2 64 #elif defined(BLE_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 65 #include "headers/nrf_ble.h"
AnnaBridge 165:e614a9f1c9e2 66 #endif
AnnaBridge 165:e614a9f1c9e2 67
AnnaBridge 165:e614a9f1c9e2 68 #define RAM_START_ADDRESS 0x20000000
AnnaBridge 165:e614a9f1c9e2 69 #define SOFTDEVICE_EVT_IRQ SD_EVT_IRQn /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */
AnnaBridge 165:e614a9f1c9e2 70 #define SOFTDEVICE_EVT_IRQHandler SD_EVT_IRQHandler
AnnaBridge 165:e614a9f1c9e2 71 #define RAM_TOTAL_SIZE ((NRF_FICR->INFO.RAM) * 1024)
AnnaBridge 165:e614a9f1c9e2 72 #define RAM_END_ADDRESS (RAM_START_ADDRESS + RAM_TOTAL_SIZE)
AnnaBridge 165:e614a9f1c9e2 73
AnnaBridge 165:e614a9f1c9e2 74
AnnaBridge 165:e614a9f1c9e2 75 #define SOFTDEVICE_VS_UUID_COUNT 0
AnnaBridge 165:e614a9f1c9e2 76 #define SOFTDEVICE_GATTS_ATTR_TAB_SIZE BLE_GATTS_ATTR_TAB_SIZE_DEFAULT
AnnaBridge 165:e614a9f1c9e2 77 #define SOFTDEVICE_GATTS_SRV_CHANGED 0
AnnaBridge 165:e614a9f1c9e2 78 #define SOFTDEVICE_PERIPH_CONN_COUNT 1
AnnaBridge 165:e614a9f1c9e2 79 #define SOFTDEVICE_CENTRAL_CONN_COUNT 4
AnnaBridge 165:e614a9f1c9e2 80 #define SOFTDEVICE_CENTRAL_SEC_COUNT 1
AnnaBridge 165:e614a9f1c9e2 81
AnnaBridge 165:e614a9f1c9e2 82 static softdevice_evt_schedule_func_t m_evt_schedule_func; /**< Pointer to function for propagating SoftDevice events to the scheduler. */
AnnaBridge 165:e614a9f1c9e2 83
AnnaBridge 165:e614a9f1c9e2 84 static volatile bool m_softdevice_enabled = false; /**< Variable to indicate whether the SoftDevice is enabled. */
AnnaBridge 165:e614a9f1c9e2 85 static volatile bool m_suspended; /**< Current state of the event handler. */
AnnaBridge 165:e614a9f1c9e2 86 #ifdef BLE_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 87 // The following three definitions is needed only if BLE events are needed to be pulled from the stack.
AnnaBridge 165:e614a9f1c9e2 88 static uint8_t * mp_ble_evt_buffer; /**< Buffer for receiving BLE events from the SoftDevice. */
AnnaBridge 165:e614a9f1c9e2 89 static uint16_t m_ble_evt_buffer_size; /**< Size of BLE event buffer. */
AnnaBridge 165:e614a9f1c9e2 90 static ble_evt_handler_t m_ble_evt_handler; /**< Application event handler for handling BLE events. */
AnnaBridge 165:e614a9f1c9e2 91 #endif
AnnaBridge 165:e614a9f1c9e2 92
AnnaBridge 165:e614a9f1c9e2 93 #ifdef ANT_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 94 // The following two definitions are needed only if ANT events are needed to be pulled from the stack.
AnnaBridge 165:e614a9f1c9e2 95 static ant_evt_t m_ant_evt_buffer; /**< Buffer for receiving ANT events from the SoftDevice. */
AnnaBridge 165:e614a9f1c9e2 96 static ant_evt_handler_t m_ant_evt_handler; /**< Application event handler for handling ANT events. */
AnnaBridge 165:e614a9f1c9e2 97 #endif
AnnaBridge 165:e614a9f1c9e2 98
AnnaBridge 165:e614a9f1c9e2 99 static sys_evt_handler_t m_sys_evt_handler; /**< Application event handler for handling System (SOC) events. */
AnnaBridge 165:e614a9f1c9e2 100
AnnaBridge 165:e614a9f1c9e2 101 /**@brief Callback function for asserts in the SoftDevice.
AnnaBridge 165:e614a9f1c9e2 102 *
AnnaBridge 165:e614a9f1c9e2 103 * @details A pointer to this function will be passed to the SoftDevice. This function will be
AnnaBridge 165:e614a9f1c9e2 104 * called by the SoftDevice if certain unrecoverable errors occur within the
AnnaBridge 165:e614a9f1c9e2 105 * application or SoftDevice.
AnnaBridge 165:e614a9f1c9e2 106 *
AnnaBridge 165:e614a9f1c9e2 107 * See @ref nrf_fault_handler_t for more details.
AnnaBridge 165:e614a9f1c9e2 108 *
AnnaBridge 165:e614a9f1c9e2 109 * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS.
AnnaBridge 165:e614a9f1c9e2 110 * @param[in] pc The program counter of the instruction that triggered the fault.
AnnaBridge 165:e614a9f1c9e2 111 * @param[in] info Optional additional information regarding the fault. Refer to each fault
AnnaBridge 165:e614a9f1c9e2 112 * identifier for details.
AnnaBridge 165:e614a9f1c9e2 113 */
AnnaBridge 165:e614a9f1c9e2 114 void softdevice_fault_handler(uint32_t id, uint32_t pc, uint32_t info)
AnnaBridge 165:e614a9f1c9e2 115 {
AnnaBridge 165:e614a9f1c9e2 116 app_error_fault_handler(id, pc, info);
AnnaBridge 165:e614a9f1c9e2 117 }
AnnaBridge 165:e614a9f1c9e2 118
AnnaBridge 165:e614a9f1c9e2 119 void intern_softdevice_events_execute(void)
AnnaBridge 165:e614a9f1c9e2 120 {
AnnaBridge 165:e614a9f1c9e2 121 if (!m_softdevice_enabled)
AnnaBridge 165:e614a9f1c9e2 122 {
AnnaBridge 165:e614a9f1c9e2 123 // SoftDevice not enabled. This can be possible if the SoftDevice was enabled by the
AnnaBridge 165:e614a9f1c9e2 124 // application without using this module's API (i.e softdevice_handler_init)
AnnaBridge 165:e614a9f1c9e2 125
AnnaBridge 165:e614a9f1c9e2 126 return;
AnnaBridge 165:e614a9f1c9e2 127 }
AnnaBridge 165:e614a9f1c9e2 128 #if NRF_MODULE_ENABLED(CLOCK)
AnnaBridge 165:e614a9f1c9e2 129 bool no_more_soc_evts = false;
AnnaBridge 165:e614a9f1c9e2 130 #else
AnnaBridge 165:e614a9f1c9e2 131 bool no_more_soc_evts = (m_sys_evt_handler == NULL);
AnnaBridge 165:e614a9f1c9e2 132 #endif
AnnaBridge 165:e614a9f1c9e2 133 #ifdef BLE_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 134 bool no_more_ble_evts = (m_ble_evt_handler == NULL);
AnnaBridge 165:e614a9f1c9e2 135 #endif
AnnaBridge 165:e614a9f1c9e2 136 #ifdef ANT_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 137 bool no_more_ant_evts = (m_ant_evt_handler == NULL);
AnnaBridge 165:e614a9f1c9e2 138 #endif
AnnaBridge 165:e614a9f1c9e2 139
AnnaBridge 165:e614a9f1c9e2 140 for (;;)
AnnaBridge 165:e614a9f1c9e2 141 {
AnnaBridge 165:e614a9f1c9e2 142 uint32_t err_code;
AnnaBridge 165:e614a9f1c9e2 143
AnnaBridge 165:e614a9f1c9e2 144 if (!no_more_soc_evts)
AnnaBridge 165:e614a9f1c9e2 145 {
AnnaBridge 165:e614a9f1c9e2 146 if (m_suspended)
AnnaBridge 165:e614a9f1c9e2 147 {
AnnaBridge 165:e614a9f1c9e2 148 // Cancel pulling next event if event handler was suspended by user.
AnnaBridge 165:e614a9f1c9e2 149 return;
AnnaBridge 165:e614a9f1c9e2 150 }
AnnaBridge 165:e614a9f1c9e2 151
AnnaBridge 165:e614a9f1c9e2 152 uint32_t evt_id;
AnnaBridge 165:e614a9f1c9e2 153
AnnaBridge 165:e614a9f1c9e2 154 // Pull event from SOC.
AnnaBridge 165:e614a9f1c9e2 155 err_code = sd_evt_get(&evt_id);
AnnaBridge 165:e614a9f1c9e2 156
AnnaBridge 165:e614a9f1c9e2 157 if (err_code == NRF_ERROR_NOT_FOUND)
AnnaBridge 165:e614a9f1c9e2 158 {
AnnaBridge 165:e614a9f1c9e2 159 no_more_soc_evts = true;
AnnaBridge 165:e614a9f1c9e2 160 }
AnnaBridge 165:e614a9f1c9e2 161 else if (err_code != NRF_SUCCESS)
AnnaBridge 165:e614a9f1c9e2 162 {
AnnaBridge 165:e614a9f1c9e2 163 APP_ERROR_HANDLER(err_code);
AnnaBridge 165:e614a9f1c9e2 164 }
AnnaBridge 165:e614a9f1c9e2 165 else
AnnaBridge 165:e614a9f1c9e2 166 {
AnnaBridge 165:e614a9f1c9e2 167 // Call application's SOC event handler.
AnnaBridge 165:e614a9f1c9e2 168 #if (NRF_MODULE_ENABLED(CLOCK) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 169 nrf_drv_clock_on_soc_event(evt_id);
AnnaBridge 165:e614a9f1c9e2 170 if (m_sys_evt_handler)
AnnaBridge 165:e614a9f1c9e2 171 {
AnnaBridge 165:e614a9f1c9e2 172 m_sys_evt_handler(evt_id);
AnnaBridge 165:e614a9f1c9e2 173 }
AnnaBridge 165:e614a9f1c9e2 174 #else
AnnaBridge 165:e614a9f1c9e2 175 m_sys_evt_handler(evt_id);
AnnaBridge 165:e614a9f1c9e2 176 #endif
AnnaBridge 165:e614a9f1c9e2 177 }
AnnaBridge 165:e614a9f1c9e2 178 }
AnnaBridge 165:e614a9f1c9e2 179
AnnaBridge 165:e614a9f1c9e2 180 #ifdef BLE_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 181 // Fetch BLE Events.
AnnaBridge 165:e614a9f1c9e2 182 if (!no_more_ble_evts)
AnnaBridge 165:e614a9f1c9e2 183 {
AnnaBridge 165:e614a9f1c9e2 184 if (m_suspended)
AnnaBridge 165:e614a9f1c9e2 185 {
AnnaBridge 165:e614a9f1c9e2 186 // Cancel pulling next event if event handler was suspended by user.
AnnaBridge 165:e614a9f1c9e2 187 return;
AnnaBridge 165:e614a9f1c9e2 188 }
AnnaBridge 165:e614a9f1c9e2 189
AnnaBridge 165:e614a9f1c9e2 190 // Pull event from stack
AnnaBridge 165:e614a9f1c9e2 191 uint16_t evt_len = m_ble_evt_buffer_size;
AnnaBridge 165:e614a9f1c9e2 192
AnnaBridge 165:e614a9f1c9e2 193 err_code = sd_ble_evt_get(mp_ble_evt_buffer, &evt_len);
AnnaBridge 165:e614a9f1c9e2 194 if (err_code == NRF_ERROR_NOT_FOUND)
AnnaBridge 165:e614a9f1c9e2 195 {
AnnaBridge 165:e614a9f1c9e2 196 no_more_ble_evts = true;
AnnaBridge 165:e614a9f1c9e2 197 }
AnnaBridge 165:e614a9f1c9e2 198 else if (err_code != NRF_SUCCESS)
AnnaBridge 165:e614a9f1c9e2 199 {
AnnaBridge 165:e614a9f1c9e2 200 APP_ERROR_HANDLER(err_code);
AnnaBridge 165:e614a9f1c9e2 201 }
AnnaBridge 165:e614a9f1c9e2 202 else
AnnaBridge 165:e614a9f1c9e2 203 {
AnnaBridge 165:e614a9f1c9e2 204 // Call application's BLE stack event handler.
AnnaBridge 165:e614a9f1c9e2 205 m_ble_evt_handler((ble_evt_t *)mp_ble_evt_buffer);
AnnaBridge 165:e614a9f1c9e2 206 }
AnnaBridge 165:e614a9f1c9e2 207 }
AnnaBridge 165:e614a9f1c9e2 208 #endif
AnnaBridge 165:e614a9f1c9e2 209
AnnaBridge 165:e614a9f1c9e2 210 #ifdef ANT_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 211 // Fetch ANT Events.
AnnaBridge 165:e614a9f1c9e2 212 if (!no_more_ant_evts)
AnnaBridge 165:e614a9f1c9e2 213 {
AnnaBridge 165:e614a9f1c9e2 214 if (m_suspended)
AnnaBridge 165:e614a9f1c9e2 215 {
AnnaBridge 165:e614a9f1c9e2 216 // Cancel pulling next event if event handler was suspended by user.
AnnaBridge 165:e614a9f1c9e2 217 return;
AnnaBridge 165:e614a9f1c9e2 218 }
AnnaBridge 165:e614a9f1c9e2 219
AnnaBridge 165:e614a9f1c9e2 220 // Pull event from stack
AnnaBridge 165:e614a9f1c9e2 221 err_code = sd_ant_event_get(&m_ant_evt_buffer.channel,
AnnaBridge 165:e614a9f1c9e2 222 &m_ant_evt_buffer.event,
AnnaBridge 165:e614a9f1c9e2 223 m_ant_evt_buffer.msg.evt_buffer);
AnnaBridge 165:e614a9f1c9e2 224 if (err_code == NRF_ERROR_NOT_FOUND)
AnnaBridge 165:e614a9f1c9e2 225 {
AnnaBridge 165:e614a9f1c9e2 226 no_more_ant_evts = true;
AnnaBridge 165:e614a9f1c9e2 227 }
AnnaBridge 165:e614a9f1c9e2 228 else if (err_code != NRF_SUCCESS)
AnnaBridge 165:e614a9f1c9e2 229 {
AnnaBridge 165:e614a9f1c9e2 230 APP_ERROR_HANDLER(err_code);
AnnaBridge 165:e614a9f1c9e2 231 }
AnnaBridge 165:e614a9f1c9e2 232 else
AnnaBridge 165:e614a9f1c9e2 233 {
AnnaBridge 165:e614a9f1c9e2 234 // Call application's ANT stack event handler.
AnnaBridge 165:e614a9f1c9e2 235 m_ant_evt_handler(&m_ant_evt_buffer);
AnnaBridge 165:e614a9f1c9e2 236 }
AnnaBridge 165:e614a9f1c9e2 237 }
AnnaBridge 165:e614a9f1c9e2 238 #endif
AnnaBridge 165:e614a9f1c9e2 239
AnnaBridge 165:e614a9f1c9e2 240 if (no_more_soc_evts)
AnnaBridge 165:e614a9f1c9e2 241 {
AnnaBridge 165:e614a9f1c9e2 242 // There are no remaining System (SOC) events to be fetched from the SoftDevice.
AnnaBridge 165:e614a9f1c9e2 243 #if defined(ANT_STACK_SUPPORT_REQD) && defined(BLE_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 244 // Check if there are any remaining BLE and ANT events.
AnnaBridge 165:e614a9f1c9e2 245 if (no_more_ble_evts && no_more_ant_evts)
AnnaBridge 165:e614a9f1c9e2 246 {
AnnaBridge 165:e614a9f1c9e2 247 break;
AnnaBridge 165:e614a9f1c9e2 248 }
AnnaBridge 165:e614a9f1c9e2 249 #elif defined(BLE_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 250 // Check if there are any remaining BLE events.
AnnaBridge 165:e614a9f1c9e2 251 if (no_more_ble_evts)
AnnaBridge 165:e614a9f1c9e2 252 {
AnnaBridge 165:e614a9f1c9e2 253 break;
AnnaBridge 165:e614a9f1c9e2 254 }
AnnaBridge 165:e614a9f1c9e2 255 #elif defined(ANT_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 256 // Check if there are any remaining ANT events.
AnnaBridge 165:e614a9f1c9e2 257 if (no_more_ant_evts)
AnnaBridge 165:e614a9f1c9e2 258 {
AnnaBridge 165:e614a9f1c9e2 259 break;
AnnaBridge 165:e614a9f1c9e2 260 }
AnnaBridge 165:e614a9f1c9e2 261 #else
AnnaBridge 165:e614a9f1c9e2 262 // No need to check for BLE or ANT events since there is no support for BLE and ANT
AnnaBridge 165:e614a9f1c9e2 263 // required.
AnnaBridge 165:e614a9f1c9e2 264 break;
AnnaBridge 165:e614a9f1c9e2 265 #endif
AnnaBridge 165:e614a9f1c9e2 266 }
AnnaBridge 165:e614a9f1c9e2 267 }
AnnaBridge 165:e614a9f1c9e2 268 }
AnnaBridge 165:e614a9f1c9e2 269
AnnaBridge 165:e614a9f1c9e2 270 bool softdevice_handler_is_enabled(void)
AnnaBridge 165:e614a9f1c9e2 271 {
AnnaBridge 165:e614a9f1c9e2 272 return m_softdevice_enabled;
AnnaBridge 165:e614a9f1c9e2 273 }
AnnaBridge 165:e614a9f1c9e2 274
AnnaBridge 165:e614a9f1c9e2 275 uint32_t softdevice_handler_init(nrf_clock_lf_cfg_t * p_clock_lf_cfg,
AnnaBridge 165:e614a9f1c9e2 276 void * p_ble_evt_buffer,
AnnaBridge 165:e614a9f1c9e2 277 uint16_t ble_evt_buffer_size,
AnnaBridge 165:e614a9f1c9e2 278 softdevice_evt_schedule_func_t evt_schedule_func)
AnnaBridge 165:e614a9f1c9e2 279 {
AnnaBridge 165:e614a9f1c9e2 280 uint32_t err_code;
AnnaBridge 165:e614a9f1c9e2 281
AnnaBridge 165:e614a9f1c9e2 282 // Save configuration.
AnnaBridge 165:e614a9f1c9e2 283 #if defined (BLE_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 284 // Check that buffer is not NULL.
AnnaBridge 165:e614a9f1c9e2 285 if (p_ble_evt_buffer == NULL)
AnnaBridge 165:e614a9f1c9e2 286 {
AnnaBridge 165:e614a9f1c9e2 287 return NRF_ERROR_INVALID_PARAM;
AnnaBridge 165:e614a9f1c9e2 288 }
AnnaBridge 165:e614a9f1c9e2 289
AnnaBridge 165:e614a9f1c9e2 290 // Check that buffer is correctly aligned.
AnnaBridge 165:e614a9f1c9e2 291 if (!is_word_aligned(p_ble_evt_buffer))
AnnaBridge 165:e614a9f1c9e2 292 {
AnnaBridge 165:e614a9f1c9e2 293 return NRF_ERROR_INVALID_PARAM;
AnnaBridge 165:e614a9f1c9e2 294 }
AnnaBridge 165:e614a9f1c9e2 295
AnnaBridge 165:e614a9f1c9e2 296 mp_ble_evt_buffer = (uint8_t *)p_ble_evt_buffer;
AnnaBridge 165:e614a9f1c9e2 297 m_ble_evt_buffer_size = ble_evt_buffer_size;
AnnaBridge 165:e614a9f1c9e2 298 #else
AnnaBridge 165:e614a9f1c9e2 299 // The variables p_ble_evt_buffer and ble_evt_buffer_size is not needed if BLE Stack support
AnnaBridge 165:e614a9f1c9e2 300 // is not required.
AnnaBridge 165:e614a9f1c9e2 301 UNUSED_PARAMETER(p_ble_evt_buffer);
AnnaBridge 165:e614a9f1c9e2 302 UNUSED_PARAMETER(ble_evt_buffer_size);
AnnaBridge 165:e614a9f1c9e2 303 #endif
AnnaBridge 165:e614a9f1c9e2 304
AnnaBridge 165:e614a9f1c9e2 305 m_evt_schedule_func = evt_schedule_func;
AnnaBridge 165:e614a9f1c9e2 306
AnnaBridge 165:e614a9f1c9e2 307 // Initialize SoftDevice.
AnnaBridge 165:e614a9f1c9e2 308 #if (NRF_MODULE_ENABLED(CLOCK) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 309 bool power_clock_isr_enabled = nrf_drv_common_irq_enable_check(POWER_CLOCK_IRQn);
AnnaBridge 165:e614a9f1c9e2 310 if (power_clock_isr_enabled)
AnnaBridge 165:e614a9f1c9e2 311 {
AnnaBridge 165:e614a9f1c9e2 312 NVIC_DisableIRQ(POWER_CLOCK_IRQn);
AnnaBridge 165:e614a9f1c9e2 313 }
AnnaBridge 165:e614a9f1c9e2 314 #endif
AnnaBridge 165:e614a9f1c9e2 315
AnnaBridge 165:e614a9f1c9e2 316 #if (NRF_MODULE_ENABLED(RNG) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 317 bool rng_isr_enabled = nrf_drv_common_irq_enable_check(RNG_IRQn);
AnnaBridge 165:e614a9f1c9e2 318 if (rng_isr_enabled)
AnnaBridge 165:e614a9f1c9e2 319 {
AnnaBridge 165:e614a9f1c9e2 320 NVIC_DisableIRQ(RNG_IRQn);
AnnaBridge 165:e614a9f1c9e2 321 }
AnnaBridge 165:e614a9f1c9e2 322 #endif
AnnaBridge 165:e614a9f1c9e2 323 #if defined(S212) || defined(S332)
AnnaBridge 165:e614a9f1c9e2 324 err_code = sd_softdevice_enable(p_clock_lf_cfg, softdevice_fault_handler, ANT_LICENSE_KEY);
AnnaBridge 165:e614a9f1c9e2 325 #else
AnnaBridge 165:e614a9f1c9e2 326 err_code = sd_softdevice_enable(p_clock_lf_cfg, softdevice_fault_handler);
AnnaBridge 165:e614a9f1c9e2 327 #endif
AnnaBridge 165:e614a9f1c9e2 328
AnnaBridge 165:e614a9f1c9e2 329 if (err_code != NRF_SUCCESS)
AnnaBridge 165:e614a9f1c9e2 330 {
AnnaBridge 165:e614a9f1c9e2 331 #if (NRF_MODULE_ENABLED(RNG) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 332 if (rng_isr_enabled)
AnnaBridge 165:e614a9f1c9e2 333 {
AnnaBridge 165:e614a9f1c9e2 334 NVIC_EnableIRQ(RNG_IRQn);
AnnaBridge 165:e614a9f1c9e2 335 }
AnnaBridge 165:e614a9f1c9e2 336 #endif
AnnaBridge 165:e614a9f1c9e2 337 #if (NRF_MODULE_ENABLED(CLOCK) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 338 if (power_clock_isr_enabled)
AnnaBridge 165:e614a9f1c9e2 339 {
AnnaBridge 165:e614a9f1c9e2 340 NVIC_EnableIRQ(POWER_CLOCK_IRQn);
AnnaBridge 165:e614a9f1c9e2 341 }
AnnaBridge 165:e614a9f1c9e2 342 #endif
AnnaBridge 165:e614a9f1c9e2 343 return err_code;
AnnaBridge 165:e614a9f1c9e2 344 }
AnnaBridge 165:e614a9f1c9e2 345
AnnaBridge 165:e614a9f1c9e2 346 m_softdevice_enabled = true;
AnnaBridge 165:e614a9f1c9e2 347 #if (NRF_MODULE_ENABLED(CLOCK) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 348 nrf_drv_clock_on_sd_enable();
AnnaBridge 165:e614a9f1c9e2 349 #endif
AnnaBridge 165:e614a9f1c9e2 350
AnnaBridge 165:e614a9f1c9e2 351 // Enable BLE event interrupt (interrupt priority has already been set by the stack).
AnnaBridge 165:e614a9f1c9e2 352 #ifdef SOFTDEVICE_PRESENT
AnnaBridge 165:e614a9f1c9e2 353 err_code = sd_nvic_EnableIRQ((IRQn_Type)SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 354 return err_code;
AnnaBridge 165:e614a9f1c9e2 355
AnnaBridge 165:e614a9f1c9e2 356 #else
AnnaBridge 165:e614a9f1c9e2 357 //In case of Serialization NVIC must be accessed directly.
AnnaBridge 165:e614a9f1c9e2 358 NVIC_EnableIRQ(SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 359 return NRF_SUCCESS;
AnnaBridge 165:e614a9f1c9e2 360 #endif
AnnaBridge 165:e614a9f1c9e2 361 }
AnnaBridge 165:e614a9f1c9e2 362
AnnaBridge 165:e614a9f1c9e2 363
AnnaBridge 165:e614a9f1c9e2 364 uint32_t softdevice_handler_sd_disable(void)
AnnaBridge 165:e614a9f1c9e2 365 {
AnnaBridge 165:e614a9f1c9e2 366 uint32_t err_code = sd_softdevice_disable();
AnnaBridge 165:e614a9f1c9e2 367 if (err_code == NRF_SUCCESS)
AnnaBridge 165:e614a9f1c9e2 368 {
AnnaBridge 165:e614a9f1c9e2 369 m_softdevice_enabled = false;
AnnaBridge 165:e614a9f1c9e2 370
AnnaBridge 165:e614a9f1c9e2 371 #if (NRF_MODULE_ENABLED(CLOCK) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 372 nrf_drv_clock_on_sd_disable();
AnnaBridge 165:e614a9f1c9e2 373 #endif
AnnaBridge 165:e614a9f1c9e2 374
AnnaBridge 165:e614a9f1c9e2 375 #if (NRF_MODULE_ENABLED(RNG) && defined(SOFTDEVICE_PRESENT))
AnnaBridge 165:e614a9f1c9e2 376 nrf_drv_rng_on_sd_disable();
AnnaBridge 165:e614a9f1c9e2 377 #endif
AnnaBridge 165:e614a9f1c9e2 378 }
AnnaBridge 165:e614a9f1c9e2 379 return err_code;
AnnaBridge 165:e614a9f1c9e2 380 }
AnnaBridge 165:e614a9f1c9e2 381
AnnaBridge 165:e614a9f1c9e2 382 #ifdef BLE_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 383 uint32_t softdevice_ble_evt_handler_set(ble_evt_handler_t ble_evt_handler)
AnnaBridge 165:e614a9f1c9e2 384 {
AnnaBridge 165:e614a9f1c9e2 385 VERIFY_PARAM_NOT_NULL(ble_evt_handler);
AnnaBridge 165:e614a9f1c9e2 386
AnnaBridge 165:e614a9f1c9e2 387 m_ble_evt_handler = ble_evt_handler;
AnnaBridge 165:e614a9f1c9e2 388
AnnaBridge 165:e614a9f1c9e2 389 return NRF_SUCCESS;
AnnaBridge 165:e614a9f1c9e2 390 }
AnnaBridge 165:e614a9f1c9e2 391 #endif
AnnaBridge 165:e614a9f1c9e2 392
AnnaBridge 165:e614a9f1c9e2 393
AnnaBridge 165:e614a9f1c9e2 394 #ifdef ANT_STACK_SUPPORT_REQD
AnnaBridge 165:e614a9f1c9e2 395 uint32_t softdevice_ant_evt_handler_set(ant_evt_handler_t ant_evt_handler)
AnnaBridge 165:e614a9f1c9e2 396 {
AnnaBridge 165:e614a9f1c9e2 397 VERIFY_PARAM_NOT_NULL(ant_evt_handler);
AnnaBridge 165:e614a9f1c9e2 398
AnnaBridge 165:e614a9f1c9e2 399 m_ant_evt_handler = ant_evt_handler;
AnnaBridge 165:e614a9f1c9e2 400
AnnaBridge 165:e614a9f1c9e2 401 return NRF_SUCCESS;
AnnaBridge 165:e614a9f1c9e2 402 }
AnnaBridge 165:e614a9f1c9e2 403 #endif
AnnaBridge 165:e614a9f1c9e2 404
AnnaBridge 165:e614a9f1c9e2 405
AnnaBridge 165:e614a9f1c9e2 406 uint32_t softdevice_sys_evt_handler_set(sys_evt_handler_t sys_evt_handler)
AnnaBridge 165:e614a9f1c9e2 407 {
AnnaBridge 165:e614a9f1c9e2 408 VERIFY_PARAM_NOT_NULL(sys_evt_handler);
AnnaBridge 165:e614a9f1c9e2 409
AnnaBridge 165:e614a9f1c9e2 410 m_sys_evt_handler = sys_evt_handler;
AnnaBridge 165:e614a9f1c9e2 411
AnnaBridge 165:e614a9f1c9e2 412 return NRF_SUCCESS;
AnnaBridge 165:e614a9f1c9e2 413 }
AnnaBridge 165:e614a9f1c9e2 414
AnnaBridge 165:e614a9f1c9e2 415
AnnaBridge 165:e614a9f1c9e2 416 /**@brief Function for handling the Application's BLE Stack events interrupt.
AnnaBridge 165:e614a9f1c9e2 417 *
AnnaBridge 165:e614a9f1c9e2 418 * @details This function is called whenever an event is ready to be pulled.
AnnaBridge 165:e614a9f1c9e2 419 */
AnnaBridge 165:e614a9f1c9e2 420 void SOFTDEVICE_EVT_IRQHandler(void)
AnnaBridge 165:e614a9f1c9e2 421 {
AnnaBridge 165:e614a9f1c9e2 422 if (m_evt_schedule_func != NULL)
AnnaBridge 165:e614a9f1c9e2 423 {
AnnaBridge 165:e614a9f1c9e2 424 uint32_t err_code = m_evt_schedule_func();
AnnaBridge 165:e614a9f1c9e2 425 APP_ERROR_CHECK(err_code);
AnnaBridge 165:e614a9f1c9e2 426 }
AnnaBridge 165:e614a9f1c9e2 427 else
AnnaBridge 165:e614a9f1c9e2 428 {
AnnaBridge 165:e614a9f1c9e2 429 intern_softdevice_events_execute();
AnnaBridge 165:e614a9f1c9e2 430 }
AnnaBridge 165:e614a9f1c9e2 431 }
AnnaBridge 165:e614a9f1c9e2 432
AnnaBridge 165:e614a9f1c9e2 433 void softdevice_handler_suspend()
AnnaBridge 165:e614a9f1c9e2 434 {
AnnaBridge 165:e614a9f1c9e2 435 #ifdef SOFTDEVICE_PRESENT
AnnaBridge 165:e614a9f1c9e2 436 ret_code_t err_code = sd_nvic_DisableIRQ((IRQn_Type)SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 437 APP_ERROR_CHECK(err_code);
AnnaBridge 165:e614a9f1c9e2 438 #else
AnnaBridge 165:e614a9f1c9e2 439 NVIC_DisableIRQ(SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 440 #endif
AnnaBridge 165:e614a9f1c9e2 441 m_suspended = true;
AnnaBridge 165:e614a9f1c9e2 442 return;
AnnaBridge 165:e614a9f1c9e2 443 }
AnnaBridge 165:e614a9f1c9e2 444
AnnaBridge 165:e614a9f1c9e2 445 void softdevice_handler_resume()
AnnaBridge 165:e614a9f1c9e2 446 {
AnnaBridge 165:e614a9f1c9e2 447 if (!m_suspended) return;
AnnaBridge 165:e614a9f1c9e2 448 m_suspended = false;
AnnaBridge 165:e614a9f1c9e2 449
AnnaBridge 165:e614a9f1c9e2 450 #ifdef SOFTDEVICE_PRESENT
AnnaBridge 165:e614a9f1c9e2 451 ret_code_t err_code;
AnnaBridge 165:e614a9f1c9e2 452
AnnaBridge 165:e614a9f1c9e2 453 // Force calling ISR again to make sure that events not pulled previously
AnnaBridge 165:e614a9f1c9e2 454 // has been processed.
AnnaBridge 165:e614a9f1c9e2 455 err_code = sd_nvic_SetPendingIRQ((IRQn_Type)SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 456 APP_ERROR_CHECK(err_code);
AnnaBridge 165:e614a9f1c9e2 457 err_code = sd_nvic_EnableIRQ((IRQn_Type)SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 458 APP_ERROR_CHECK(err_code);
AnnaBridge 165:e614a9f1c9e2 459 #else
AnnaBridge 165:e614a9f1c9e2 460 NVIC_SetPendingIRQ((IRQn_Type)SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 461 NVIC_EnableIRQ(SOFTDEVICE_EVT_IRQ);
AnnaBridge 165:e614a9f1c9e2 462 #endif
AnnaBridge 165:e614a9f1c9e2 463
AnnaBridge 165:e614a9f1c9e2 464 return;
AnnaBridge 165:e614a9f1c9e2 465 }
AnnaBridge 165:e614a9f1c9e2 466
AnnaBridge 165:e614a9f1c9e2 467 bool softdevice_handler_is_suspended()
AnnaBridge 165:e614a9f1c9e2 468 {
AnnaBridge 165:e614a9f1c9e2 469 return m_suspended;
AnnaBridge 165:e614a9f1c9e2 470 }
AnnaBridge 165:e614a9f1c9e2 471
AnnaBridge 165:e614a9f1c9e2 472 #if defined(BLE_STACK_SUPPORT_REQD)
AnnaBridge 165:e614a9f1c9e2 473 uint32_t softdevice_enable_get_default_config(uint8_t central_links_count,
AnnaBridge 165:e614a9f1c9e2 474 uint8_t periph_links_count,
AnnaBridge 165:e614a9f1c9e2 475 ble_enable_params_t * p_ble_enable_params)
AnnaBridge 165:e614a9f1c9e2 476 {
AnnaBridge 165:e614a9f1c9e2 477 memset(p_ble_enable_params, 0, sizeof(ble_enable_params_t));
AnnaBridge 165:e614a9f1c9e2 478 p_ble_enable_params->common_enable_params.vs_uuid_count = 1;
AnnaBridge 165:e614a9f1c9e2 479 p_ble_enable_params->gatts_enable_params.attr_tab_size = SOFTDEVICE_GATTS_ATTR_TAB_SIZE;
AnnaBridge 165:e614a9f1c9e2 480 p_ble_enable_params->gatts_enable_params.service_changed = SOFTDEVICE_GATTS_SRV_CHANGED;
AnnaBridge 165:e614a9f1c9e2 481 p_ble_enable_params->gap_enable_params.periph_conn_count = periph_links_count;
AnnaBridge 165:e614a9f1c9e2 482 p_ble_enable_params->gap_enable_params.central_conn_count = central_links_count;
AnnaBridge 165:e614a9f1c9e2 483 if (p_ble_enable_params->gap_enable_params.central_conn_count != 0)
AnnaBridge 165:e614a9f1c9e2 484 {
AnnaBridge 165:e614a9f1c9e2 485 p_ble_enable_params->gap_enable_params.central_sec_count = SOFTDEVICE_CENTRAL_SEC_COUNT;
AnnaBridge 165:e614a9f1c9e2 486 }
AnnaBridge 165:e614a9f1c9e2 487
AnnaBridge 165:e614a9f1c9e2 488 return NRF_SUCCESS;
AnnaBridge 165:e614a9f1c9e2 489 }
AnnaBridge 165:e614a9f1c9e2 490
AnnaBridge 165:e614a9f1c9e2 491
AnnaBridge 165:e614a9f1c9e2 492 static inline uint32_t ram_total_size_get(void)
AnnaBridge 165:e614a9f1c9e2 493 {
AnnaBridge 165:e614a9f1c9e2 494 #ifdef NRF51
AnnaBridge 165:e614a9f1c9e2 495 uint32_t size_ram_blocks = (uint32_t)NRF_FICR->SIZERAMBLOCKS;
AnnaBridge 165:e614a9f1c9e2 496 uint32_t total_ram_size = size_ram_blocks;
AnnaBridge 165:e614a9f1c9e2 497 total_ram_size = total_ram_size * (NRF_FICR->NUMRAMBLOCK);
AnnaBridge 165:e614a9f1c9e2 498 return total_ram_size;
AnnaBridge 165:e614a9f1c9e2 499 #elif (defined (NRF52) || defined(NRF52840_XXAA))
AnnaBridge 165:e614a9f1c9e2 500 return RAM_TOTAL_SIZE;
AnnaBridge 165:e614a9f1c9e2 501 #endif /* NRF51 */
AnnaBridge 165:e614a9f1c9e2 502 }
AnnaBridge 165:e614a9f1c9e2 503
AnnaBridge 165:e614a9f1c9e2 504
AnnaBridge 165:e614a9f1c9e2 505 /*lint --e{528} -save suppress 528: symbol not referenced */
AnnaBridge 165:e614a9f1c9e2 506 /**@brief Function for finding the end address of the RAM.
AnnaBridge 165:e614a9f1c9e2 507 *
AnnaBridge 165:e614a9f1c9e2 508 * @retval ram_end_address Address of the end of the RAM.
AnnaBridge 165:e614a9f1c9e2 509 */
AnnaBridge 165:e614a9f1c9e2 510 static inline uint32_t ram_end_address_get(void)
AnnaBridge 165:e614a9f1c9e2 511 {
AnnaBridge 165:e614a9f1c9e2 512 uint32_t ram_end_address = (uint32_t)RAM_START_ADDRESS;
AnnaBridge 165:e614a9f1c9e2 513 ram_end_address += ram_total_size_get();
AnnaBridge 165:e614a9f1c9e2 514 return ram_end_address;
AnnaBridge 165:e614a9f1c9e2 515 }
AnnaBridge 165:e614a9f1c9e2 516 /*lint -restore*/
AnnaBridge 165:e614a9f1c9e2 517
AnnaBridge 165:e614a9f1c9e2 518 /*lint --e{10} --e{27} --e{40} --e{529} -save */
AnnaBridge 165:e614a9f1c9e2 519 uint32_t softdevice_enable(ble_enable_params_t * p_ble_enable_params)
AnnaBridge 165:e614a9f1c9e2 520 {
AnnaBridge 165:e614a9f1c9e2 521 #if (defined(S130) || defined(S132) || defined(S332) || defined(S140))
AnnaBridge 165:e614a9f1c9e2 522 uint32_t err_code;
AnnaBridge 165:e614a9f1c9e2 523 uint32_t app_ram_base;
AnnaBridge 165:e614a9f1c9e2 524
AnnaBridge 174:b96e65c34a4d 525 #if defined ( __CC_ARM ) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
AnnaBridge 165:e614a9f1c9e2 526 extern uint32_t Image$$RW_IRAM1$$Base;
AnnaBridge 165:e614a9f1c9e2 527 const volatile uint32_t ram_start = (uint32_t) &Image$$RW_IRAM1$$Base;
AnnaBridge 165:e614a9f1c9e2 528 #elif defined ( __ICCARM__ )
AnnaBridge 165:e614a9f1c9e2 529 extern uint32_t __ICFEDIT_region_RAM_start__;
AnnaBridge 165:e614a9f1c9e2 530 volatile uint32_t ram_start = (uint32_t) &__ICFEDIT_region_RAM_start__;
AnnaBridge 165:e614a9f1c9e2 531 #elif defined ( __GNUC__ )
AnnaBridge 165:e614a9f1c9e2 532 extern uint32_t __data_start__;
AnnaBridge 165:e614a9f1c9e2 533 volatile uint32_t ram_start = (uint32_t) &__data_start__;
AnnaBridge 165:e614a9f1c9e2 534 #endif
AnnaBridge 165:e614a9f1c9e2 535
AnnaBridge 165:e614a9f1c9e2 536 app_ram_base = ram_start;
AnnaBridge 165:e614a9f1c9e2 537 NRF_LOG_DEBUG("sd_ble_enable: RAM start at 0x%x\r\n",
AnnaBridge 165:e614a9f1c9e2 538 app_ram_base);
AnnaBridge 165:e614a9f1c9e2 539 err_code = sd_ble_enable(p_ble_enable_params, &app_ram_base);
AnnaBridge 165:e614a9f1c9e2 540
AnnaBridge 165:e614a9f1c9e2 541 if (app_ram_base != ram_start)
AnnaBridge 165:e614a9f1c9e2 542 {
AnnaBridge 165:e614a9f1c9e2 543 NRF_LOG_WARNING("sd_ble_enable: RAM start should be adjusted to 0x%x\r\n",
AnnaBridge 165:e614a9f1c9e2 544 app_ram_base);
AnnaBridge 165:e614a9f1c9e2 545 NRF_LOG_WARNING("RAM size should be adjusted to 0x%x \r\n",
AnnaBridge 165:e614a9f1c9e2 546 ram_end_address_get() - app_ram_base);
AnnaBridge 165:e614a9f1c9e2 547 }
AnnaBridge 165:e614a9f1c9e2 548 else if (err_code != NRF_SUCCESS)
AnnaBridge 165:e614a9f1c9e2 549 {
AnnaBridge 165:e614a9f1c9e2 550 NRF_LOG_ERROR("sd_ble_enable: error 0x%x\r\n", err_code);
AnnaBridge 165:e614a9f1c9e2 551 }
AnnaBridge 165:e614a9f1c9e2 552 return err_code;
AnnaBridge 165:e614a9f1c9e2 553 #else
AnnaBridge 165:e614a9f1c9e2 554 return NRF_SUCCESS;
AnnaBridge 165:e614a9f1c9e2 555 #endif //defined(S130) || defined(S132) || defined(S332) || defined(S140)
AnnaBridge 165:e614a9f1c9e2 556 }
AnnaBridge 165:e614a9f1c9e2 557 /*lint -restore*/
AnnaBridge 165:e614a9f1c9e2 558
AnnaBridge 165:e614a9f1c9e2 559 #endif //BLE_STACK_SUPPORT_REQD