No changes

Fork of nRF51822 by Nordic Semiconductor

Committer:
vcoubard
Date:
Mon Jan 11 10:19:06 2016 +0000
Revision:
549:3f782c64d014
Parent:
541:884f95bf5351
Child:
561:613dbbdeed27
Synchronized with git rev a5a46f2f
Author: Rohit Grover
Release 2.0.7
=============

* Fix a bug in the assembly sequence that starts the Nordic bootloader. With
GCC, a MOV instruction was getting converted into an ADDS, which came with
an unwanted side-effect of updating the XPSR. We relocated the offending MOV
instruction such that it would not affect a conditional branch statement.
This would show only with GCC, and when jumping to the bootloader while in
handler mode.

* Fix hardfaults generated from the handling of Radio Notification events.
Radio notification events are interrupts generated at very high priority.
They have the potential to pre-empt other interrupt handling, causing race
conditions when interrupted handlers were involved in calling into BLE_API.
Radio-notification events should defer their callback handling to low-
priority handlers through the use of Tickers or Timeouts.

* Introduce watchdog header file from Nordic SDK 8.1.

* Update license headers to reflect the latest licenses from Nordic.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 541:884f95bf5351 1 /* mbed Microcontroller Library
vcoubard 541:884f95bf5351 2 * Copyright (c) 2006-2013 ARM Limited
vcoubard 541:884f95bf5351 3 *
vcoubard 541:884f95bf5351 4 * Licensed under the Apache License, Version 2.0 (the "License");
vcoubard 541:884f95bf5351 5 * you may not use this file except in compliance with the License.
vcoubard 541:884f95bf5351 6 * You may obtain a copy of the License at
vcoubard 541:884f95bf5351 7 *
vcoubard 541:884f95bf5351 8 * http://www.apache.org/licenses/LICENSE-2.0
vcoubard 541:884f95bf5351 9 *
vcoubard 541:884f95bf5351 10 * Unless required by applicable law or agreed to in writing, software
vcoubard 541:884f95bf5351 11 * distributed under the License is distributed on an "AS IS" BASIS,
vcoubard 541:884f95bf5351 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vcoubard 541:884f95bf5351 13 * See the License for the specific language governing permissions and
vcoubard 541:884f95bf5351 14 * limitations under the License.
vcoubard 541:884f95bf5351 15 */
vcoubard 541:884f95bf5351 16
vcoubard 541:884f95bf5351 17 #include "mbed.h"
vcoubard 541:884f95bf5351 18 #include "nRF5xn.h"
vcoubard 541:884f95bf5351 19 #include "ble/blecommon.h"
vcoubard 541:884f95bf5351 20 #include "nrf_soc.h"
vcoubard 541:884f95bf5351 21
vcoubard 541:884f95bf5351 22 #include "btle/btle.h"
vcoubard 541:884f95bf5351 23 #include "nrf_delay.h"
vcoubard 541:884f95bf5351 24
vcoubard 549:3f782c64d014 25 extern "C" {
vcoubard 541:884f95bf5351 26 #include "softdevice_handler.h"
vcoubard 549:3f782c64d014 27 }
vcoubard 541:884f95bf5351 28
vcoubard 541:884f95bf5351 29 /**
vcoubard 541:884f95bf5351 30 * The singleton which represents the nRF51822 transport for the BLE.
vcoubard 541:884f95bf5351 31 */
vcoubard 541:884f95bf5351 32 static nRF5xn deviceInstance;
vcoubard 541:884f95bf5351 33
vcoubard 541:884f95bf5351 34 /**
vcoubard 541:884f95bf5351 35 * BLE-API requires an implementation of the following function in order to
vcoubard 541:884f95bf5351 36 * obtain its transport handle.
vcoubard 541:884f95bf5351 37 */
vcoubard 541:884f95bf5351 38 BLEInstanceBase *
vcoubard 541:884f95bf5351 39 createBLEInstance(void)
vcoubard 541:884f95bf5351 40 {
vcoubard 541:884f95bf5351 41 return (&deviceInstance);
vcoubard 541:884f95bf5351 42 }
vcoubard 541:884f95bf5351 43
vcoubard 541:884f95bf5351 44 nRF5xn::nRF5xn(void) : initialized(false), instanceID(BLE::DEFAULT_INSTANCE)
vcoubard 541:884f95bf5351 45 {
vcoubard 541:884f95bf5351 46 }
vcoubard 541:884f95bf5351 47
vcoubard 541:884f95bf5351 48 nRF5xn::~nRF5xn(void)
vcoubard 541:884f95bf5351 49 {
vcoubard 541:884f95bf5351 50 }
vcoubard 541:884f95bf5351 51
vcoubard 541:884f95bf5351 52 const char *nRF5xn::getVersion(void)
vcoubard 541:884f95bf5351 53 {
vcoubard 541:884f95bf5351 54 if (!initialized) {
vcoubard 541:884f95bf5351 55 return "INITIALIZATION_INCOMPLETE";
vcoubard 541:884f95bf5351 56 }
vcoubard 541:884f95bf5351 57
vcoubard 541:884f95bf5351 58 static char versionString[32];
vcoubard 541:884f95bf5351 59 static bool versionFetched = false;
vcoubard 541:884f95bf5351 60
vcoubard 541:884f95bf5351 61 if (!versionFetched) {
vcoubard 541:884f95bf5351 62 ble_version_t version;
vcoubard 541:884f95bf5351 63 if ((sd_ble_version_get(&version) == NRF_SUCCESS) && (version.company_id == 0x0059)) {
vcoubard 541:884f95bf5351 64 switch (version.version_number) {
vcoubard 541:884f95bf5351 65 case 0x07:
vcoubard 541:884f95bf5351 66 case 0x08:
vcoubard 541:884f95bf5351 67 snprintf(versionString, sizeof(versionString), "Nordic BLE4.1 ver:%u fw:%04x", version.version_number, version.subversion_number);
vcoubard 541:884f95bf5351 68 break;
vcoubard 541:884f95bf5351 69 default:
vcoubard 541:884f95bf5351 70 snprintf(versionString, sizeof(versionString), "Nordic (spec unknown) ver:%u fw:%04x", version.version_number, version.subversion_number);
vcoubard 541:884f95bf5351 71 break;
vcoubard 541:884f95bf5351 72 }
vcoubard 541:884f95bf5351 73 versionFetched = true;
vcoubard 541:884f95bf5351 74 } else {
vcoubard 541:884f95bf5351 75 strncpy(versionString, "unknown", sizeof(versionString));
vcoubard 541:884f95bf5351 76 }
vcoubard 541:884f95bf5351 77 }
vcoubard 541:884f95bf5351 78
vcoubard 541:884f95bf5351 79 return versionString;
vcoubard 541:884f95bf5351 80 }
vcoubard 541:884f95bf5351 81
vcoubard 541:884f95bf5351 82 ble_error_t nRF5xn::init(BLE::InstanceID_t instanceID, FunctionPointerWithContext<BLE::InitializationCompleteCallbackContext *> callback)
vcoubard 541:884f95bf5351 83 {
vcoubard 541:884f95bf5351 84 if (initialized) {
vcoubard 541:884f95bf5351 85 BLE::InitializationCompleteCallbackContext context = {
vcoubard 541:884f95bf5351 86 BLE::Instance(instanceID),
vcoubard 541:884f95bf5351 87 BLE_ERROR_ALREADY_INITIALIZED
vcoubard 541:884f95bf5351 88 };
vcoubard 541:884f95bf5351 89 callback.call(&context);
vcoubard 541:884f95bf5351 90 return BLE_ERROR_ALREADY_INITIALIZED;
vcoubard 541:884f95bf5351 91 }
vcoubard 541:884f95bf5351 92
vcoubard 541:884f95bf5351 93 instanceID = instanceID;
vcoubard 541:884f95bf5351 94
vcoubard 541:884f95bf5351 95 /* ToDo: Clear memory contents, reset the SD, etc. */
vcoubard 541:884f95bf5351 96 btle_init();
vcoubard 541:884f95bf5351 97
vcoubard 541:884f95bf5351 98 initialized = true;
vcoubard 541:884f95bf5351 99 BLE::InitializationCompleteCallbackContext context = {
vcoubard 541:884f95bf5351 100 BLE::Instance(instanceID),
vcoubard 541:884f95bf5351 101 BLE_ERROR_NONE
vcoubard 541:884f95bf5351 102 };
vcoubard 541:884f95bf5351 103 callback.call(&context);
vcoubard 541:884f95bf5351 104 return BLE_ERROR_NONE;
vcoubard 541:884f95bf5351 105 }
vcoubard 541:884f95bf5351 106
vcoubard 541:884f95bf5351 107 ble_error_t nRF5xn::shutdown(void)
vcoubard 541:884f95bf5351 108 {
vcoubard 541:884f95bf5351 109 if (!initialized) {
vcoubard 541:884f95bf5351 110 return BLE_ERROR_INITIALIZATION_INCOMPLETE;
vcoubard 541:884f95bf5351 111 }
vcoubard 541:884f95bf5351 112
vcoubard 541:884f95bf5351 113 if(softdevice_handler_sd_disable() != NRF_SUCCESS) {
vcoubard 541:884f95bf5351 114 return BLE_STACK_BUSY;
vcoubard 541:884f95bf5351 115 }
vcoubard 541:884f95bf5351 116
vcoubard 541:884f95bf5351 117 initialized = false;
vcoubard 541:884f95bf5351 118 return BLE_ERROR_NONE;
vcoubard 541:884f95bf5351 119 }
vcoubard 541:884f95bf5351 120
vcoubard 541:884f95bf5351 121 void
vcoubard 541:884f95bf5351 122 nRF5xn::waitForEvent(void)
vcoubard 541:884f95bf5351 123 {
vcoubard 541:884f95bf5351 124 sd_app_evt_wait();
rgrover1 388:db85a09c27ef 125 }