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:
Thu Nov 26 14:33:46 2015 +0000
Revision:
476:a95a18ef5e9c
Parent:
475:fe3d08b3a8e9
Child:
478:b5b54bf15533
Synchronized with git rev dfb6ac29
Author: Liyou Zhou
Remove magic hash defines which are used in nrf51-sdk
nrf51-sdk files are modified to include these defines.

Who changed what in which revision?

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