Nordic stack and drivers for the mbed BLE API. Version to work around build bug.

Dependents:   microbit_rubber_ducky microbit_mouse_BLE microbit_mouse_BLE_daybreak_version microbit_presenter

Fork of nRF51822 by Nordic Semiconductor

Committer:
rgrover1
Date:
Fri Aug 07 15:57:07 2015 +0100
Revision:
402:448a564f5c9e
Parent:
399:a471c3da4806
Child:
404:fccbe137c4ac
Synchronized with git rev b22c2e82
Author: Jean-Philippe Brucker
Select the clock source dynamically on SoftDevice initialisation

Instead of relying on build macros to know which oscillator we're
supposedly using, check the value of LFCLKSRC register. This way, we can
trust mbed's init code to fallback on the internal clock if the user
specified a wrong target.
This change, along with the mbed patch that selects clock source
dynamically, will allow lots of application to still run and provide
FOTA, when the wrong Nordic platform is specified.

Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rohit Grover 22:c6ee8136847e 1 /* mbed Microcontroller Library
Rohit Grover 22:c6ee8136847e 2 * Copyright (c) 2006-2013 ARM Limited
Rohit Grover 22:c6ee8136847e 3 *
Rohit Grover 22:c6ee8136847e 4 * Licensed under the Apache License, Version 2.0 (the "License");
Rohit Grover 22:c6ee8136847e 5 * you may not use this file except in compliance with the License.
Rohit Grover 22:c6ee8136847e 6 * You may obtain a copy of the License at
Rohit Grover 22:c6ee8136847e 7 *
Rohit Grover 22:c6ee8136847e 8 * http://www.apache.org/licenses/LICENSE-2.0
Rohit Grover 22:c6ee8136847e 9 *
Rohit Grover 22:c6ee8136847e 10 * Unless required by applicable law or agreed to in writing, software
Rohit Grover 22:c6ee8136847e 11 * distributed under the License is distributed on an "AS IS" BASIS,
Rohit Grover 22:c6ee8136847e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Rohit Grover 22:c6ee8136847e 13 * See the License for the specific language governing permissions and
Rohit Grover 22:c6ee8136847e 14 * limitations under the License.
Rohit Grover 22:c6ee8136847e 15 */
Rohit Grover 52:120bd37b9d0d 16
Rohit Grover 22:c6ee8136847e 17 #include "common/common.h"
Rohit Grover 37:c29c330d942c 18 #include "nordic_common.h"
Rohit Grover 22:c6ee8136847e 19
Rohit Grover 22:c6ee8136847e 20 #include "btle.h"
Rohit Grover 22:c6ee8136847e 21
Rohit Grover 22:c6ee8136847e 22 #include "ble_stack_handler_types.h"
Rohit Grover 22:c6ee8136847e 23 #include "ble_flash.h"
Rohit Grover 22:c6ee8136847e 24 #include "ble_conn_params.h"
Rohit Grover 22:c6ee8136847e 25
Rohit Grover 22:c6ee8136847e 26 #include "btle_gap.h"
Rohit Grover 22:c6ee8136847e 27 #include "btle_advertising.h"
Rohit Grover 22:c6ee8136847e 28 #include "custom/custom_helper.h"
Rohit Grover 22:c6ee8136847e 29
Rohit Grover 22:c6ee8136847e 30 #include "softdevice_handler.h"
Rohit Grover 22:c6ee8136847e 31 #include "pstorage.h"
Rohit Grover 22:c6ee8136847e 32
rgrover1 371:8f7d2137727a 33 #include "ble/GapEvents.h"
rgrover1 393:0f7c5048efb3 34 #include "nRF5xGap.h"
rgrover1 393:0f7c5048efb3 35 #include "nRF5xGattServer.h"
rgrover1 393:0f7c5048efb3 36 #include "nRF5xSecurityManager.h"
rgrover1 371:8f7d2137727a 37
rgrover1 124:664d4257a9f8 38 #include "device_manager.h"
Rohit Grover 22:c6ee8136847e 39
Rohit Grover 56:a1071b629aa3 40 #include "ble_hci.h"
rgrover1 371:8f7d2137727a 41 #include "btle_discovery.h"
Rohit Grover 56:a1071b629aa3 42
Rohit Grover 56:a1071b629aa3 43 extern "C" void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name);
Rohit Grover 56:a1071b629aa3 44 void app_error_handler(uint32_t error_code, uint32_t line_num, const uint8_t *p_file_name);
Rohit Grover 22:c6ee8136847e 45
Rohit Grover 22:c6ee8136847e 46 static void btle_handler(ble_evt_t *p_ble_evt);
Rohit Grover 22:c6ee8136847e 47
Rohit Grover 22:c6ee8136847e 48 static void sys_evt_dispatch(uint32_t sys_evt)
Rohit Grover 22:c6ee8136847e 49 {
Rohit Grover 22:c6ee8136847e 50 pstorage_sys_event_handler(sys_evt);
Rohit Grover 22:c6ee8136847e 51 }
Rohit Grover 22:c6ee8136847e 52
Rohit Grover 22:c6ee8136847e 53 error_t btle_init(void)
Rohit Grover 22:c6ee8136847e 54 {
rgrover1 402:448a564f5c9e 55 if (NRF_CLOCK->LFCLKSRC & (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos))
rgrover1 402:448a564f5c9e 56 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, NULL);
rgrover1 402:448a564f5c9e 57 else
rgrover1 402:448a564f5c9e 58 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION, NULL);
Rohit Grover 56:a1071b629aa3 59
Rohit Grover 56:a1071b629aa3 60 // Enable BLE stack
Rohit Grover 56:a1071b629aa3 61 /**
Rohit Grover 56:a1071b629aa3 62 * Using this call, the application can select whether to include the
Rohit Grover 56:a1071b629aa3 63 * Service Changed characteristic in the GATT Server. The default in all
Rohit Grover 56:a1071b629aa3 64 * previous releases has been to include the Service Changed characteristic,
Rohit Grover 56:a1071b629aa3 65 * but this affects how GATT clients behave. Specifically, it requires
Rohit Grover 56:a1071b629aa3 66 * clients to subscribe to this attribute and not to cache attribute handles
Rohit Grover 56:a1071b629aa3 67 * between connections unless the devices are bonded. If the application
Rohit Grover 56:a1071b629aa3 68 * does not need to change the structure of the GATT server attributes at
Rohit Grover 56:a1071b629aa3 69 * runtime this adds unnecessary complexity to the interaction with peer
Rohit Grover 56:a1071b629aa3 70 * clients. If the SoftDevice is enabled with the Service Changed
Rohit Grover 56:a1071b629aa3 71 * Characteristics turned off, then clients are allowed to cache attribute
Rohit Grover 56:a1071b629aa3 72 * handles making applications simpler on both sides.
Rohit Grover 56:a1071b629aa3 73 */
Rohit Grover 68:936d81c963fe 74 static const bool IS_SRVC_CHANGED_CHARACT_PRESENT = true;
Rohit Grover 56:a1071b629aa3 75 ble_enable_params_t enableParams = {
Rohit Grover 56:a1071b629aa3 76 .gatts_enable_params = {
Rohit Grover 56:a1071b629aa3 77 .service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT
Rohit Grover 56:a1071b629aa3 78 }
Rohit Grover 56:a1071b629aa3 79 };
Rohit Grover 56:a1071b629aa3 80 if (sd_ble_enable(&enableParams) != NRF_SUCCESS) {
Rohit Grover 56:a1071b629aa3 81 return ERROR_INVALID_PARAM;
Rohit Grover 56:a1071b629aa3 82 }
Rohit Grover 56:a1071b629aa3 83
Rohit Grover 56:a1071b629aa3 84 ble_gap_addr_t addr;
Rohit Grover 56:a1071b629aa3 85 if (sd_ble_gap_address_get(&addr) != NRF_SUCCESS) {
Rohit Grover 56:a1071b629aa3 86 return ERROR_INVALID_PARAM;
Rohit Grover 56:a1071b629aa3 87 }
Rohit Grover 56:a1071b629aa3 88 if (sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &addr) != NRF_SUCCESS) {
Rohit Grover 56:a1071b629aa3 89 return ERROR_INVALID_PARAM;
Rohit Grover 56:a1071b629aa3 90 }
Rohit Grover 22:c6ee8136847e 91
Rohit Grover 22:c6ee8136847e 92 ASSERT_STATUS( softdevice_ble_evt_handler_set(btle_handler));
Rohit Grover 22:c6ee8136847e 93 ASSERT_STATUS( softdevice_sys_evt_handler_set(sys_evt_dispatch));
Rohit Grover 22:c6ee8136847e 94
rgrover1 127:bd1e1fe607e0 95 btle_gap_init();
rgrover1 127:bd1e1fe607e0 96
rgrover1 127:bd1e1fe607e0 97 return ERROR_NONE;
rgrover1 127:bd1e1fe607e0 98 }
rgrover1 127:bd1e1fe607e0 99
Rohit Grover 22:c6ee8136847e 100 static void btle_handler(ble_evt_t *p_ble_evt)
Rohit Grover 22:c6ee8136847e 101 {
Rohit Grover 22:c6ee8136847e 102 /* Library service handlers */
Rohit Grover 56:a1071b629aa3 103 #if SDK_CONN_PARAMS_MODULE_ENABLE
Rohit Grover 22:c6ee8136847e 104 ble_conn_params_on_ble_evt(p_ble_evt);
Rohit Grover 56:a1071b629aa3 105 #endif
Rohit Grover 22:c6ee8136847e 106
rgrover1 125:35e4f65364bc 107 dm_ble_evt_handler(p_ble_evt);
rgrover1 125:35e4f65364bc 108
rgrover1 371:8f7d2137727a 109 bleGattcEventHandler(p_ble_evt);
rgrover1 371:8f7d2137727a 110
Rohit Grover 22:c6ee8136847e 111 /* Custom event handler */
Rohit Grover 22:c6ee8136847e 112 switch (p_ble_evt->header.evt_id) {
Rohit Grover 41:6e66cd970659 113 case BLE_GAP_EVT_CONNECTED: {
Rohit Grover 41:6e66cd970659 114 Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle;
rgrover1 399:a471c3da4806 115 #if defined(MCU_NORDIC_16K_S110) || defined(MCU_NORDIC_32K_S110)
rgrover1 399:a471c3da4806 116 /* Only peripheral role is supported by S110 */
rgrover1 399:a471c3da4806 117 Gap::Role_t role = Gap::PERIPHERAL;
rgrover1 399:a471c3da4806 118 #else
rgrover1 399:a471c3da4806 119 Gap::Role_t role = static_cast<Gap::Role_t>(p_ble_evt->evt.gap_evt.params.connected.role);
rgrover1 399:a471c3da4806 120 #endif
rgrover1 393:0f7c5048efb3 121 nRF5xGap::getInstance().setConnectionHandle(handle);
Rohit Grover 56:a1071b629aa3 122 const Gap::ConnectionParams_t *params = reinterpret_cast<Gap::ConnectionParams_t *>(&(p_ble_evt->evt.gap_evt.params.connected.conn_params));
rgrover1 77:9886b2865631 123 const ble_gap_addr_t *peer = &p_ble_evt->evt.gap_evt.params.connected.peer_addr;
rgrover1 112:737b08b3b995 124 const ble_gap_addr_t *own = &p_ble_evt->evt.gap_evt.params.connected.own_addr;
rgrover1 393:0f7c5048efb3 125 nRF5xGap::getInstance().processConnectionEvent(handle,
rgrover1 399:a471c3da4806 126 role,
rgrover1 179:10e4c13360d9 127 static_cast<Gap::AddressType_t>(peer->addr_type), peer->addr,
rgrover1 179:10e4c13360d9 128 static_cast<Gap::AddressType_t>(own->addr_type), own->addr,
rgrover1 112:737b08b3b995 129 params);
Rohit Grover 22:c6ee8136847e 130 break;
Rohit Grover 41:6e66cd970659 131 }
Rohit Grover 22:c6ee8136847e 132
Rohit Grover 41:6e66cd970659 133 case BLE_GAP_EVT_DISCONNECTED: {
Rohit Grover 41:6e66cd970659 134 Gap::Handle_t handle = p_ble_evt->evt.gap_evt.conn_handle;
Rohit Grover 22:c6ee8136847e 135 // Since we are not in a connection and have not started advertising,
Rohit Grover 22:c6ee8136847e 136 // store bonds
rgrover1 393:0f7c5048efb3 137 nRF5xGap::getInstance().setConnectionHandle (BLE_CONN_HANDLE_INVALID);
Rohit Grover 56:a1071b629aa3 138
Rohit Grover 65:98215c4f3a25 139 Gap::DisconnectionReason_t reason;
Rohit Grover 65:98215c4f3a25 140 switch (p_ble_evt->evt.gap_evt.params.disconnected.reason) {
Rohit Grover 65:98215c4f3a25 141 case BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION:
Rohit Grover 65:98215c4f3a25 142 reason = Gap::LOCAL_HOST_TERMINATED_CONNECTION;
Rohit Grover 65:98215c4f3a25 143 break;
Rohit Grover 65:98215c4f3a25 144 case BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION:
Rohit Grover 65:98215c4f3a25 145 reason = Gap::REMOTE_USER_TERMINATED_CONNECTION;
Rohit Grover 65:98215c4f3a25 146 break;
Rohit Grover 65:98215c4f3a25 147 case BLE_HCI_CONN_INTERVAL_UNACCEPTABLE:
Rohit Grover 65:98215c4f3a25 148 reason = Gap::CONN_INTERVAL_UNACCEPTABLE;
Rohit Grover 65:98215c4f3a25 149 break;
Rohit Grover 65:98215c4f3a25 150 default:
Rohit Grover 65:98215c4f3a25 151 /* Please refer to the underlying transport library for an
Rohit Grover 65:98215c4f3a25 152 * interpretion of this reason's value. */
Rohit Grover 65:98215c4f3a25 153 reason = static_cast<Gap::DisconnectionReason_t>(p_ble_evt->evt.gap_evt.params.disconnected.reason);
Rohit Grover 65:98215c4f3a25 154 break;
Rohit Grover 56:a1071b629aa3 155 }
rgrover1 393:0f7c5048efb3 156 nRF5xGap::getInstance().processDisconnectionEvent(handle, reason);
Rohit Grover 22:c6ee8136847e 157 break;
Rohit Grover 41:6e66cd970659 158 }
Rohit Grover 22:c6ee8136847e 159
rgrover1 161:6712855a0107 160 case BLE_GAP_EVT_PASSKEY_DISPLAY:
rgrover1 393:0f7c5048efb3 161 nRF5xSecurityManager::getInstance().processPasskeyDisplayEvent(p_ble_evt->evt.gap_evt.conn_handle, p_ble_evt->evt.gap_evt.params.passkey_display.passkey);
rgrover1 161:6712855a0107 162 break;
rgrover1 161:6712855a0107 163
Rohit Grover 22:c6ee8136847e 164 case BLE_GAP_EVT_TIMEOUT:
rgrover1 393:0f7c5048efb3 165 nRF5xGap::getInstance().processTimeoutEvent(static_cast<Gap::TimeoutSource_t>(p_ble_evt->evt.gap_evt.params.timeout.src));
Rohit Grover 22:c6ee8136847e 166 break;
Rohit Grover 22:c6ee8136847e 167
Rohit Grover 22:c6ee8136847e 168 case BLE_GATTC_EVT_TIMEOUT:
Rohit Grover 22:c6ee8136847e 169 case BLE_GATTS_EVT_TIMEOUT:
Rohit Grover 22:c6ee8136847e 170 // Disconnect on GATT Server and Client timeout events.
Rohit Grover 22:c6ee8136847e 171 // ASSERT_STATUS_RET_VOID (sd_ble_gap_disconnect(m_conn_handle,
Rohit Grover 22:c6ee8136847e 172 // BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION));
Rohit Grover 22:c6ee8136847e 173 break;
Rohit Grover 22:c6ee8136847e 174
rgrover1 165:67fcad70785a 175 case BLE_GAP_EVT_ADV_REPORT: {
rgrover1 165:67fcad70785a 176 const ble_gap_evt_adv_report_t *advReport = &p_ble_evt->evt.gap_evt.params.adv_report;
rgrover1 393:0f7c5048efb3 177 nRF5xGap::getInstance().processAdvertisementReport(advReport->peer_addr.addr,
rgrover1 167:66ee4f876396 178 advReport->rssi,
rgrover1 167:66ee4f876396 179 advReport->scan_rsp,
rgrover1 371:8f7d2137727a 180 static_cast<GapAdvertisingParams::AdvertisingType_t>(advReport->type),
rgrover1 167:66ee4f876396 181 advReport->dlen,
rgrover1 167:66ee4f876396 182 advReport->data);
rgrover1 167:66ee4f876396 183 break;
rgrover1 165:67fcad70785a 184 }
rgrover1 165:67fcad70785a 185
Rohit Grover 22:c6ee8136847e 186 default:
Rohit Grover 22:c6ee8136847e 187 break;
Rohit Grover 22:c6ee8136847e 188 }
Rohit Grover 22:c6ee8136847e 189
rgrover1 393:0f7c5048efb3 190 nRF5xGattServer::getInstance().hwCallback(p_ble_evt);
Rohit Grover 22:c6ee8136847e 191 }
Rohit Grover 22:c6ee8136847e 192
rgrover1 160:7d04579fdb2a 193 /*! @brief Callback when an error occurs inside the SoftDevice */
Rohit Grover 22:c6ee8136847e 194 void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name)
Rohit Grover 22:c6ee8136847e 195 {
Rohit Grover 22:c6ee8136847e 196 ASSERT(false, (void) 0);
Rohit Grover 22:c6ee8136847e 197 }
Rohit Grover 22:c6ee8136847e 198
Rohit Grover 22:c6ee8136847e 199 /*!
Rohit Grover 22:c6ee8136847e 200 @brief Handler for general errors above the SoftDevice layer.
Rohit Grover 22:c6ee8136847e 201 Typically we can' recover from this so we do a reset.
Rohit Grover 22:c6ee8136847e 202 */
rgrover1 160:7d04579fdb2a 203 void app_error_handler(uint32_t error_code, uint32_t line_num, const uint8_t *p_file_name)
Rohit Grover 22:c6ee8136847e 204 {
Rohit Grover 22:c6ee8136847e 205 ASSERT_STATUS_RET_VOID( error_code );
Rohit Grover 22:c6ee8136847e 206 NVIC_SystemReset();
rgrover1 77:9886b2865631 207 }