Nordic stack and drivers for the mbed BLE API

Dependents:   idd_hw5_bleFanProto

Fork of nRF51822 by Nordic Semiconductor

Committer:
Rohit Grover
Date:
Tue Sep 02 15:50:05 2014 +0100
Revision:
56:a1071b629aa3
Parent:
52:120bd37b9d0d
Release 0.1.0
=============

We've achieved significant gains in power consumption: the BLE_Beacon demo now
runs at around 35uA of average current broadcasting once a second at 0dB; when
not using the radio, this demo consumes around 7uA.

Features
~~~~~~~~

- Replace initialization of high-frequency external crystal clock-source with
the use of low-frequency clock. This brings in significant gains in power
consumption.

- Re-implement the micro-second timer on nRF51 using the app_timer module
(which internally uses RTC). This limits the precision of the us_Timer to
30uS; but brings in significant gains in power consumption.

- Reduce the number of available app_timers and the event depths for app-timer
events; this will reduce memory consumption for zero-initialized data by
around 1K.

- Remove the call to conn_params_init() at startup. This is not mandatory; and
was causing an unnecessary re-negotiation of connection parameters a few
seconds into every connection.

- Reduce default transmission power level to 0dbB (was 4dbB before).

- Reduce min connection interval to 50ms and max to 500ms (previous values
were much larger).

- Replace a few instances of use of wait() with nrf_delay_us().

- onConnection() callback now receives connection-parameters applicable to the
new connection.

- onDataSent() callback now receives a count parameter containing the number of
times notifications were sent out since the last callback.

- A 'reason' parameter has been added to Gap::disconnect() to indicate the
reason for disconnection; and also to the onDisconnection callback to
receive a reason from the remote host.

- disable the app_gpiote module by default.

Bugfixes
~~~~~~~~

- onDataWritten() callback now passes an additional parameter
(GattServer::WriteEventCallback_t) encapsulating the update. This avoids
having to re-fetch the updated characteristic's value attribute. It also
fixes a bug where multiple updates to the characteristic's value-attribute
could get clobbered if they occurred in quick succession before the
callbacks could be processed.


Compatibility
~~~~~~~~~~~~~

Compatible with revision 0.1.0 of the BLE_API.

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 22:c6ee8136847e 16
Rohit Grover 22:c6ee8136847e 17 #include "mbed.h"
Rohit Grover 22:c6ee8136847e 18 #include "nRF51822n.h"
Rohit Grover 23:cdab28442479 19 #include "nrf_soc.h"
Rohit Grover 22:c6ee8136847e 20
Rohit Grover 22:c6ee8136847e 21 #include "btle/btle.h"
Rohit Grover 56:a1071b629aa3 22 #include "nrf_delay.h"
Rohit Grover 22:c6ee8136847e 23
Rohit Grover 22:c6ee8136847e 24 /**
Rohit Grover 22:c6ee8136847e 25 * The singleton which represents the nRF51822 transport for the BLEDevice.
Rohit Grover 22:c6ee8136847e 26 */
Rohit Grover 25:a1c356620131 27 static nRF51822n deviceInstance;
Rohit Grover 22:c6ee8136847e 28
Rohit Grover 22:c6ee8136847e 29 /**
Rohit Grover 22:c6ee8136847e 30 * BLE-API requires an implementation of the following function in order to
Rohit Grover 22:c6ee8136847e 31 * obtain its transport handle.
Rohit Grover 22:c6ee8136847e 32 */
Rohit Grover 25:a1c356620131 33 BLEDeviceInstanceBase *
Rohit Grover 25:a1c356620131 34 createBLEDeviceInstance(void)
Rohit Grover 22:c6ee8136847e 35 {
Rohit Grover 25:a1c356620131 36 return (&deviceInstance);
Rohit Grover 22:c6ee8136847e 37 }
Rohit Grover 22:c6ee8136847e 38
Rohit Grover 22:c6ee8136847e 39 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 40 /*!
Rohit Grover 22:c6ee8136847e 41 @brief Constructor
Rohit Grover 22:c6ee8136847e 42 */
Rohit Grover 22:c6ee8136847e 43 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 44 nRF51822n::nRF51822n(void)
Rohit Grover 22:c6ee8136847e 45 {
Rohit Grover 22:c6ee8136847e 46 }
Rohit Grover 22:c6ee8136847e 47
Rohit Grover 22:c6ee8136847e 48 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 49 /*!
Rohit Grover 22:c6ee8136847e 50 @brief Destructor
Rohit Grover 22:c6ee8136847e 51 */
Rohit Grover 22:c6ee8136847e 52 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 53 nRF51822n::~nRF51822n(void)
Rohit Grover 22:c6ee8136847e 54 {
Rohit Grover 22:c6ee8136847e 55 }
Rohit Grover 22:c6ee8136847e 56
Rohit Grover 52:120bd37b9d0d 57 const char *nRF51822n::getVersion(void)
Rohit Grover 52:120bd37b9d0d 58 {
Rohit Grover 52:120bd37b9d0d 59 static char versionString[10];
Rohit Grover 52:120bd37b9d0d 60 static bool versionFetched = false;
Rohit Grover 52:120bd37b9d0d 61
Rohit Grover 52:120bd37b9d0d 62 if (!versionFetched) {
Rohit Grover 52:120bd37b9d0d 63 ble_version_t version;
Rohit Grover 52:120bd37b9d0d 64 if (sd_ble_version_get(&version) == NRF_SUCCESS) {
Rohit Grover 52:120bd37b9d0d 65 snprintf(versionString, sizeof(versionString), "%u.%u", version.version_number, version.subversion_number);
Rohit Grover 52:120bd37b9d0d 66 versionFetched = true;
Rohit Grover 52:120bd37b9d0d 67 } else {
Rohit Grover 52:120bd37b9d0d 68 strncpy(versionString, "unknown", sizeof(versionString));
Rohit Grover 52:120bd37b9d0d 69 }
Rohit Grover 52:120bd37b9d0d 70 }
Rohit Grover 52:120bd37b9d0d 71
Rohit Grover 52:120bd37b9d0d 72 return versionString;
Rohit Grover 52:120bd37b9d0d 73 }
Rohit Grover 52:120bd37b9d0d 74
Rohit Grover 52:120bd37b9d0d 75 /* (Valid values are -40, -20, -16, -12, -8, -4, 0, 4) */
Rohit Grover 52:120bd37b9d0d 76 ble_error_t nRF51822n::setTxPower(int8_t txPower)
Rohit Grover 52:120bd37b9d0d 77 {
Rohit Grover 52:120bd37b9d0d 78 unsigned rc;
Rohit Grover 52:120bd37b9d0d 79 if ((rc = sd_ble_gap_tx_power_set(txPower)) != NRF_SUCCESS) {
Rohit Grover 52:120bd37b9d0d 80 switch (rc) {
Rohit Grover 52:120bd37b9d0d 81 case NRF_ERROR_BUSY:
Rohit Grover 52:120bd37b9d0d 82 return BLE_STACK_BUSY;
Rohit Grover 52:120bd37b9d0d 83 case NRF_ERROR_INVALID_PARAM:
Rohit Grover 52:120bd37b9d0d 84 default:
Rohit Grover 52:120bd37b9d0d 85 return BLE_ERROR_PARAM_OUT_OF_RANGE;
Rohit Grover 52:120bd37b9d0d 86 }
Rohit Grover 52:120bd37b9d0d 87 }
Rohit Grover 52:120bd37b9d0d 88
Rohit Grover 52:120bd37b9d0d 89 return BLE_ERROR_NONE;
Rohit Grover 52:120bd37b9d0d 90 }
Rohit Grover 52:120bd37b9d0d 91
Rohit Grover 22:c6ee8136847e 92 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 93 /*!
Rohit Grover 22:c6ee8136847e 94 @brief Initialises anything required to start using BLE
Rohit Grover 22:c6ee8136847e 95
Rohit Grover 22:c6ee8136847e 96 @returns ble_error_t
Rohit Grover 22:c6ee8136847e 97
Rohit Grover 22:c6ee8136847e 98 @retval BLE_ERROR_NONE
Rohit Grover 22:c6ee8136847e 99 Everything executed properly
Rohit Grover 22:c6ee8136847e 100
Rohit Grover 22:c6ee8136847e 101 @section EXAMPLE
Rohit Grover 22:c6ee8136847e 102
Rohit Grover 22:c6ee8136847e 103 @code
Rohit Grover 22:c6ee8136847e 104
Rohit Grover 22:c6ee8136847e 105 @endcode
Rohit Grover 22:c6ee8136847e 106 */
Rohit Grover 22:c6ee8136847e 107 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 108 ble_error_t nRF51822n::init(void)
Rohit Grover 22:c6ee8136847e 109 {
Rohit Grover 22:c6ee8136847e 110 /* ToDo: Clear memory contents, reset the SD, etc. */
Rohit Grover 22:c6ee8136847e 111 btle_init();
Rohit Grover 22:c6ee8136847e 112
Rohit Grover 22:c6ee8136847e 113 reset();
Rohit Grover 22:c6ee8136847e 114
Rohit Grover 22:c6ee8136847e 115 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 116 }
Rohit Grover 22:c6ee8136847e 117
Rohit Grover 22:c6ee8136847e 118 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 119 /*!
Rohit Grover 22:c6ee8136847e 120 @brief Resets the BLE HW, removing any existing services and
Rohit Grover 22:c6ee8136847e 121 characteristics
Rohit Grover 22:c6ee8136847e 122
Rohit Grover 22:c6ee8136847e 123 @returns ble_error_t
Rohit Grover 22:c6ee8136847e 124
Rohit Grover 22:c6ee8136847e 125 @retval BLE_ERROR_NONE
Rohit Grover 22:c6ee8136847e 126 Everything executed properly
Rohit Grover 22:c6ee8136847e 127
Rohit Grover 22:c6ee8136847e 128 @section EXAMPLE
Rohit Grover 22:c6ee8136847e 129
Rohit Grover 22:c6ee8136847e 130 @code
Rohit Grover 22:c6ee8136847e 131
Rohit Grover 22:c6ee8136847e 132 @endcode
Rohit Grover 22:c6ee8136847e 133 */
Rohit Grover 22:c6ee8136847e 134 /**************************************************************************/
Rohit Grover 22:c6ee8136847e 135 ble_error_t nRF51822n::reset(void)
Rohit Grover 22:c6ee8136847e 136 {
Rohit Grover 56:a1071b629aa3 137 nrf_delay_us(500000);
Rohit Grover 22:c6ee8136847e 138
Rohit Grover 22:c6ee8136847e 139 /* Wait for the radio to come back up */
Rohit Grover 56:a1071b629aa3 140 nrf_delay_us(1000000);
Rohit Grover 22:c6ee8136847e 141
Rohit Grover 22:c6ee8136847e 142 return BLE_ERROR_NONE;
Rohit Grover 22:c6ee8136847e 143 }
Rohit Grover 23:cdab28442479 144
Rohit Grover 23:cdab28442479 145 void
Rohit Grover 23:cdab28442479 146 nRF51822n::waitForEvent(void)
Rohit Grover 23:cdab28442479 147 {
Rohit Grover 23:cdab28442479 148 sd_app_evt_wait();
Rohit Grover 23:cdab28442479 149 }