Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of nRF51822 by
nordic-sdk/components/drivers_nrf/ble_flash/ble_flash.c@370:295f76db798e, 2015-07-06 (annotated)
- Committer:
- rgrover1
- Date:
- Mon Jul 06 10:13:26 2015 +0100
- Revision:
- 370:295f76db798e
- Parent:
- 362:6fa0d4d555f6
- Child:
- 371:8f7d2137727a
Synchronized with git rev 9f72c4ba
Author: Rohit Grover
Release 0.3.7
=============
This is a minor set of enhancements mostly around reduce our global static
memory footprint.
Enhancements
~~~~~~~~~~~~
* Reduce the maximum number of CHARACTERISTICS and DESCRIPTORS that can be
handled. This has memory implications for static global memory. It should
be possible to re-architect our solution for add_characteristic() to not
require these limits; hopefully we'll get there soon.
* Move nRF51GattServer::getInstance() into a .cpp file; same for nRF51Gap::getInstance().
* Reduce max bonds to managed by device-manager to 4; this has memory implications for static global memory.
* Reduce pStorage command queue size to 2; this has memory implications for static global memory.
* Replace uses of deprecated Gap::addr_type_t with Gap::AddressType_t.
* Some UUID-related types have moved into UUID class. Minor changes were needed to work around build errors.
Bugfixes
~~~~~~~~
* None.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rgrover1 | 370:295f76db798e | 1 | /* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. |
rgrover1 | 370:295f76db798e | 2 | * |
rgrover1 | 370:295f76db798e | 3 | * The information contained herein is property of Nordic Semiconductor ASA. |
rgrover1 | 370:295f76db798e | 4 | * Terms and conditions of usage are described in detail in NORDIC |
rgrover1 | 370:295f76db798e | 5 | * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. |
rgrover1 | 370:295f76db798e | 6 | * |
rgrover1 | 370:295f76db798e | 7 | * Licensees are granted free, non-transferable use of the information. NO |
rgrover1 | 370:295f76db798e | 8 | * WARRANTY of ANY KIND is provided. This heading must NOT be removed from |
rgrover1 | 370:295f76db798e | 9 | * the file. |
rgrover1 | 370:295f76db798e | 10 | * |
rgrover1 | 370:295f76db798e | 11 | */ |
rgrover1 | 370:295f76db798e | 12 | |
rgrover1 | 370:295f76db798e | 13 | #include "ble_flash.h" |
rgrover1 | 370:295f76db798e | 14 | #include <stdlib.h> |
rgrover1 | 370:295f76db798e | 15 | #include <stdint.h> |
rgrover1 | 370:295f76db798e | 16 | #include <string.h> |
rgrover1 | 370:295f76db798e | 17 | #include "nrf_soc.h" |
rgrover1 | 370:295f76db798e | 18 | #include "nordic_common.h" |
rgrover1 | 370:295f76db798e | 19 | #include "nrf_error.h" |
rgrover1 | 370:295f76db798e | 20 | #include "nrf.h" |
rgrover1 | 370:295f76db798e | 21 | #include "nrf51_bitfields.h" |
rgrover1 | 370:295f76db798e | 22 | #include "app_util.h" |
rgrover1 | 370:295f76db798e | 23 | |
rgrover1 | 370:295f76db798e | 24 | |
rgrover1 | 370:295f76db798e | 25 | static volatile bool m_radio_active = false; /**< TRUE if radio is active (or about to become active), FALSE otherwise. */ |
rgrover1 | 370:295f76db798e | 26 | |
rgrover1 | 370:295f76db798e | 27 | |
rgrover1 | 370:295f76db798e | 28 | uint16_t ble_flash_crc16_compute(uint8_t * p_data, uint16_t size, uint16_t * p_crc) |
rgrover1 | 370:295f76db798e | 29 | { |
rgrover1 | 370:295f76db798e | 30 | uint16_t i; |
rgrover1 | 370:295f76db798e | 31 | uint16_t crc = (p_crc == NULL) ? 0xffff : *p_crc; |
rgrover1 | 370:295f76db798e | 32 | |
rgrover1 | 370:295f76db798e | 33 | for (i = 0; i < size; i++) |
rgrover1 | 370:295f76db798e | 34 | { |
rgrover1 | 370:295f76db798e | 35 | crc = (unsigned char)(crc >> 8) | (crc << 8); |
rgrover1 | 370:295f76db798e | 36 | crc ^= p_data[i]; |
rgrover1 | 370:295f76db798e | 37 | crc ^= (unsigned char)(crc & 0xff) >> 4; |
rgrover1 | 370:295f76db798e | 38 | crc ^= (crc << 8) << 4; |
rgrover1 | 370:295f76db798e | 39 | crc ^= ((crc & 0xff) << 4) << 1; |
rgrover1 | 370:295f76db798e | 40 | } |
rgrover1 | 370:295f76db798e | 41 | return crc; |
rgrover1 | 370:295f76db798e | 42 | } |
rgrover1 | 370:295f76db798e | 43 | |
rgrover1 | 370:295f76db798e | 44 | |
rgrover1 | 370:295f76db798e | 45 | /**@brief Function for erasing a page in flash. |
rgrover1 | 370:295f76db798e | 46 | * |
rgrover1 | 370:295f76db798e | 47 | * @param[in] p_page Pointer to first word in page to be erased. |
rgrover1 | 370:295f76db798e | 48 | */ |
rgrover1 | 370:295f76db798e | 49 | static void flash_page_erase(uint32_t * p_page) |
rgrover1 | 370:295f76db798e | 50 | { |
rgrover1 | 370:295f76db798e | 51 | // Turn on flash erase enable and wait until the NVMC is ready. |
rgrover1 | 370:295f76db798e | 52 | NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos); |
rgrover1 | 370:295f76db798e | 53 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 54 | { |
rgrover1 | 370:295f76db798e | 55 | // Do nothing. |
rgrover1 | 370:295f76db798e | 56 | } |
rgrover1 | 370:295f76db798e | 57 | |
rgrover1 | 370:295f76db798e | 58 | // Erase page. |
rgrover1 | 370:295f76db798e | 59 | NRF_NVMC->ERASEPAGE = (uint32_t)p_page; |
rgrover1 | 370:295f76db798e | 60 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 61 | { |
rgrover1 | 370:295f76db798e | 62 | // Do nothing. |
rgrover1 | 370:295f76db798e | 63 | } |
rgrover1 | 370:295f76db798e | 64 | |
rgrover1 | 370:295f76db798e | 65 | // Turn off flash erase enable and wait until the NVMC is ready. |
rgrover1 | 370:295f76db798e | 66 | NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); |
rgrover1 | 370:295f76db798e | 67 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 68 | { |
rgrover1 | 370:295f76db798e | 69 | // Do nothing |
rgrover1 | 370:295f76db798e | 70 | } |
rgrover1 | 370:295f76db798e | 71 | } |
rgrover1 | 370:295f76db798e | 72 | |
rgrover1 | 370:295f76db798e | 73 | |
rgrover1 | 370:295f76db798e | 74 | /**@brief Function for writing one word to flash. Unprotected write, which can interfere with radio communication. |
rgrover1 | 370:295f76db798e | 75 | * |
rgrover1 | 370:295f76db798e | 76 | * @details This function DOES NOT use the m_radio_active variable, but will force the write even |
rgrover1 | 370:295f76db798e | 77 | * when the radio is active. To be used only from @ref ble_flash_page_write. |
rgrover1 | 370:295f76db798e | 78 | * |
rgrover1 | 370:295f76db798e | 79 | * @note Flash location to be written must have been erased previously. |
rgrover1 | 370:295f76db798e | 80 | * |
rgrover1 | 370:295f76db798e | 81 | * @param[in] p_address Pointer to flash location to be written. |
rgrover1 | 370:295f76db798e | 82 | * @param[in] value Value to write to flash. |
rgrover1 | 370:295f76db798e | 83 | */ |
rgrover1 | 370:295f76db798e | 84 | static void flash_word_unprotected_write(uint32_t * p_address, uint32_t value) |
rgrover1 | 370:295f76db798e | 85 | { |
rgrover1 | 370:295f76db798e | 86 | // Turn on flash write enable and wait until the NVMC is ready. |
rgrover1 | 370:295f76db798e | 87 | NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos); |
rgrover1 | 370:295f76db798e | 88 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 89 | { |
rgrover1 | 370:295f76db798e | 90 | // Do nothing. |
rgrover1 | 370:295f76db798e | 91 | } |
rgrover1 | 370:295f76db798e | 92 | *p_address = value; |
rgrover1 | 370:295f76db798e | 93 | |
rgrover1 | 370:295f76db798e | 94 | // Wait flash write to finish |
rgrover1 | 370:295f76db798e | 95 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 96 | { |
rgrover1 | 370:295f76db798e | 97 | // Do nothing. |
rgrover1 | 370:295f76db798e | 98 | } |
rgrover1 | 370:295f76db798e | 99 | |
rgrover1 | 370:295f76db798e | 100 | // Turn off flash write enable and wait until the NVMC is ready. |
rgrover1 | 370:295f76db798e | 101 | NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); |
rgrover1 | 370:295f76db798e | 102 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 103 | { |
rgrover1 | 370:295f76db798e | 104 | // Do nothing. |
rgrover1 | 370:295f76db798e | 105 | } |
rgrover1 | 370:295f76db798e | 106 | } |
rgrover1 | 370:295f76db798e | 107 | |
rgrover1 | 370:295f76db798e | 108 | |
rgrover1 | 370:295f76db798e | 109 | /**@brief Function for writing one word to flash. |
rgrover1 | 370:295f76db798e | 110 | * |
rgrover1 | 370:295f76db798e | 111 | * @note Flash location to be written must have been erased previously. |
rgrover1 | 370:295f76db798e | 112 | * |
rgrover1 | 370:295f76db798e | 113 | * @param[in] p_address Pointer to flash location to be written. |
rgrover1 | 370:295f76db798e | 114 | * @param[in] value Value to write to flash. |
rgrover1 | 370:295f76db798e | 115 | */ |
rgrover1 | 370:295f76db798e | 116 | static void flash_word_write(uint32_t * p_address, uint32_t value) |
rgrover1 | 370:295f76db798e | 117 | { |
rgrover1 | 370:295f76db798e | 118 | // If radio is active, wait for it to become inactive. |
rgrover1 | 370:295f76db798e | 119 | while (m_radio_active) |
rgrover1 | 370:295f76db798e | 120 | { |
rgrover1 | 370:295f76db798e | 121 | // Do nothing (just wait for radio to become inactive). |
rgrover1 | 370:295f76db798e | 122 | (void) sd_app_evt_wait(); |
rgrover1 | 370:295f76db798e | 123 | } |
rgrover1 | 370:295f76db798e | 124 | |
rgrover1 | 370:295f76db798e | 125 | // Turn on flash write enable and wait until the NVMC is ready. |
rgrover1 | 370:295f76db798e | 126 | NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos); |
rgrover1 | 370:295f76db798e | 127 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 128 | { |
rgrover1 | 370:295f76db798e | 129 | // Do nothing. |
rgrover1 | 370:295f76db798e | 130 | } |
rgrover1 | 370:295f76db798e | 131 | |
rgrover1 | 370:295f76db798e | 132 | *p_address = value; |
rgrover1 | 370:295f76db798e | 133 | // Wait flash write to finish |
rgrover1 | 370:295f76db798e | 134 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 135 | { |
rgrover1 | 370:295f76db798e | 136 | // Do nothing. |
rgrover1 | 370:295f76db798e | 137 | } |
rgrover1 | 370:295f76db798e | 138 | // Turn off flash write enable and wait until the NVMC is ready. |
rgrover1 | 370:295f76db798e | 139 | NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); |
rgrover1 | 370:295f76db798e | 140 | while (NRF_NVMC->READY == NVMC_READY_READY_Busy) |
rgrover1 | 370:295f76db798e | 141 | { |
rgrover1 | 370:295f76db798e | 142 | // Do nothing |
rgrover1 | 370:295f76db798e | 143 | } |
rgrover1 | 370:295f76db798e | 144 | } |
rgrover1 | 370:295f76db798e | 145 | |
rgrover1 | 370:295f76db798e | 146 | |
rgrover1 | 370:295f76db798e | 147 | uint32_t ble_flash_word_write(uint32_t * p_address, uint32_t value) |
rgrover1 | 370:295f76db798e | 148 | { |
rgrover1 | 370:295f76db798e | 149 | flash_word_write(p_address, value); |
rgrover1 | 370:295f76db798e | 150 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 151 | } |
rgrover1 | 370:295f76db798e | 152 | |
rgrover1 | 370:295f76db798e | 153 | |
rgrover1 | 370:295f76db798e | 154 | uint32_t ble_flash_block_write(uint32_t * p_address, uint32_t * p_in_array, uint16_t word_count) |
rgrover1 | 370:295f76db798e | 155 | { |
rgrover1 | 370:295f76db798e | 156 | uint16_t i; |
rgrover1 | 370:295f76db798e | 157 | |
rgrover1 | 370:295f76db798e | 158 | for (i = 0; i < word_count; i++) |
rgrover1 | 370:295f76db798e | 159 | { |
rgrover1 | 370:295f76db798e | 160 | flash_word_write(p_address, p_in_array[i]); |
rgrover1 | 370:295f76db798e | 161 | p_address++; |
rgrover1 | 370:295f76db798e | 162 | } |
rgrover1 | 370:295f76db798e | 163 | |
rgrover1 | 370:295f76db798e | 164 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 165 | } |
rgrover1 | 370:295f76db798e | 166 | |
rgrover1 | 370:295f76db798e | 167 | |
rgrover1 | 370:295f76db798e | 168 | uint32_t ble_flash_page_erase(uint8_t page_num) |
rgrover1 | 370:295f76db798e | 169 | { |
rgrover1 | 370:295f76db798e | 170 | uint32_t * p_page = (uint32_t *)(BLE_FLASH_PAGE_SIZE * page_num); |
rgrover1 | 370:295f76db798e | 171 | flash_page_erase(p_page); |
rgrover1 | 370:295f76db798e | 172 | |
rgrover1 | 370:295f76db798e | 173 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 174 | } |
rgrover1 | 370:295f76db798e | 175 | |
rgrover1 | 370:295f76db798e | 176 | |
rgrover1 | 370:295f76db798e | 177 | uint32_t ble_flash_page_write(uint8_t page_num, uint32_t * p_in_array, uint8_t word_count) |
rgrover1 | 370:295f76db798e | 178 | { |
rgrover1 | 370:295f76db798e | 179 | int i; |
rgrover1 | 370:295f76db798e | 180 | uint32_t * p_page; |
rgrover1 | 370:295f76db798e | 181 | uint32_t * p_curr_addr; |
rgrover1 | 370:295f76db798e | 182 | uint16_t in_data_crc; |
rgrover1 | 370:295f76db798e | 183 | uint16_t flash_crc; |
rgrover1 | 370:295f76db798e | 184 | uint32_t flash_header; |
rgrover1 | 370:295f76db798e | 185 | |
rgrover1 | 370:295f76db798e | 186 | p_page = (uint32_t *)(BLE_FLASH_PAGE_SIZE * page_num); |
rgrover1 | 370:295f76db798e | 187 | p_curr_addr = p_page; |
rgrover1 | 370:295f76db798e | 188 | |
rgrover1 | 370:295f76db798e | 189 | // Calculate CRC of the data to write. |
rgrover1 | 370:295f76db798e | 190 | in_data_crc = ble_flash_crc16_compute((uint8_t *)p_in_array, |
rgrover1 | 370:295f76db798e | 191 | word_count * sizeof(uint32_t), |
rgrover1 | 370:295f76db798e | 192 | NULL); |
rgrover1 | 370:295f76db798e | 193 | |
rgrover1 | 370:295f76db798e | 194 | // Compare the calculated to the one in flash. |
rgrover1 | 370:295f76db798e | 195 | flash_header = *p_curr_addr; |
rgrover1 | 370:295f76db798e | 196 | flash_crc = (uint16_t)flash_header; |
rgrover1 | 370:295f76db798e | 197 | |
rgrover1 | 370:295f76db798e | 198 | if (flash_crc == in_data_crc) |
rgrover1 | 370:295f76db798e | 199 | { |
rgrover1 | 370:295f76db798e | 200 | // Data is the same as the data already stored in flash, return without modifying flash. |
rgrover1 | 370:295f76db798e | 201 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 202 | } |
rgrover1 | 370:295f76db798e | 203 | |
rgrover1 | 370:295f76db798e | 204 | // Erase flash page |
rgrover1 | 370:295f76db798e | 205 | flash_page_erase(p_page); |
rgrover1 | 370:295f76db798e | 206 | |
rgrover1 | 370:295f76db798e | 207 | // Reserve space for magic number (for detecting if flash content is valid). |
rgrover1 | 370:295f76db798e | 208 | p_curr_addr++; |
rgrover1 | 370:295f76db798e | 209 | |
rgrover1 | 370:295f76db798e | 210 | // Reserve space for saving word_count. |
rgrover1 | 370:295f76db798e | 211 | p_curr_addr++; |
rgrover1 | 370:295f76db798e | 212 | |
rgrover1 | 370:295f76db798e | 213 | // Write data |
rgrover1 | 370:295f76db798e | 214 | for (i = 0; i < word_count; i++) |
rgrover1 | 370:295f76db798e | 215 | { |
rgrover1 | 370:295f76db798e | 216 | flash_word_unprotected_write(p_curr_addr, p_in_array[i]); |
rgrover1 | 370:295f76db798e | 217 | p_curr_addr++; |
rgrover1 | 370:295f76db798e | 218 | } |
rgrover1 | 370:295f76db798e | 219 | |
rgrover1 | 370:295f76db798e | 220 | // Write number of elements. |
rgrover1 | 370:295f76db798e | 221 | flash_word_write(p_page + 1, (uint32_t)(word_count)); |
rgrover1 | 370:295f76db798e | 222 | |
rgrover1 | 370:295f76db798e | 223 | // Write magic number and CRC to indicate that flash content is valid. |
rgrover1 | 370:295f76db798e | 224 | flash_header = BLE_FLASH_MAGIC_NUMBER | (uint32_t)in_data_crc; |
rgrover1 | 370:295f76db798e | 225 | flash_word_write(p_page, flash_header); |
rgrover1 | 370:295f76db798e | 226 | |
rgrover1 | 370:295f76db798e | 227 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 228 | } |
rgrover1 | 370:295f76db798e | 229 | |
rgrover1 | 370:295f76db798e | 230 | |
rgrover1 | 370:295f76db798e | 231 | uint32_t ble_flash_page_read(uint8_t page_num, uint32_t * p_out_array, uint8_t * p_word_count) |
rgrover1 | 370:295f76db798e | 232 | { |
rgrover1 | 370:295f76db798e | 233 | int byte_count; |
rgrover1 | 370:295f76db798e | 234 | uint32_t * p_page; |
rgrover1 | 370:295f76db798e | 235 | uint32_t * p_curr_addr; |
rgrover1 | 370:295f76db798e | 236 | uint32_t flash_header; |
rgrover1 | 370:295f76db798e | 237 | uint32_t calc_header; |
rgrover1 | 370:295f76db798e | 238 | uint16_t calc_crc; |
rgrover1 | 370:295f76db798e | 239 | uint32_t tmp; |
rgrover1 | 370:295f76db798e | 240 | |
rgrover1 | 370:295f76db798e | 241 | p_page = (uint32_t *)(BLE_FLASH_PAGE_SIZE * page_num); |
rgrover1 | 370:295f76db798e | 242 | p_curr_addr = p_page; |
rgrover1 | 370:295f76db798e | 243 | |
rgrover1 | 370:295f76db798e | 244 | // Check if block is valid |
rgrover1 | 370:295f76db798e | 245 | flash_header = *p_curr_addr; |
rgrover1 | 370:295f76db798e | 246 | tmp = flash_header & 0xFFFF0000; |
rgrover1 | 370:295f76db798e | 247 | if (tmp != BLE_FLASH_MAGIC_NUMBER) |
rgrover1 | 370:295f76db798e | 248 | { |
rgrover1 | 370:295f76db798e | 249 | *p_word_count = 0; |
rgrover1 | 370:295f76db798e | 250 | return NRF_ERROR_NOT_FOUND; |
rgrover1 | 370:295f76db798e | 251 | } |
rgrover1 | 370:295f76db798e | 252 | p_curr_addr++; |
rgrover1 | 370:295f76db798e | 253 | |
rgrover1 | 370:295f76db798e | 254 | // Read number of elements |
rgrover1 | 370:295f76db798e | 255 | *p_word_count = (uint8_t)(*(p_curr_addr)); |
rgrover1 | 370:295f76db798e | 256 | p_curr_addr++; |
rgrover1 | 370:295f76db798e | 257 | |
rgrover1 | 370:295f76db798e | 258 | // Read data |
rgrover1 | 370:295f76db798e | 259 | byte_count = (*p_word_count) * sizeof(uint32_t); |
rgrover1 | 370:295f76db798e | 260 | memcpy(p_out_array, p_curr_addr, byte_count); |
rgrover1 | 370:295f76db798e | 261 | |
rgrover1 | 370:295f76db798e | 262 | // Check CRC |
rgrover1 | 370:295f76db798e | 263 | calc_crc = ble_flash_crc16_compute((uint8_t *)p_out_array, |
rgrover1 | 370:295f76db798e | 264 | (*p_word_count) * sizeof(uint32_t), |
rgrover1 | 370:295f76db798e | 265 | NULL); |
rgrover1 | 370:295f76db798e | 266 | calc_header = BLE_FLASH_MAGIC_NUMBER | (uint32_t)calc_crc; |
rgrover1 | 370:295f76db798e | 267 | |
rgrover1 | 370:295f76db798e | 268 | if (calc_header != flash_header) |
rgrover1 | 370:295f76db798e | 269 | { |
rgrover1 | 370:295f76db798e | 270 | return NRF_ERROR_NOT_FOUND; |
rgrover1 | 370:295f76db798e | 271 | } |
rgrover1 | 370:295f76db798e | 272 | |
rgrover1 | 370:295f76db798e | 273 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 274 | } |
rgrover1 | 370:295f76db798e | 275 | |
rgrover1 | 370:295f76db798e | 276 | |
rgrover1 | 370:295f76db798e | 277 | uint32_t ble_flash_page_addr(uint8_t page_num, uint32_t ** pp_page_addr) |
rgrover1 | 370:295f76db798e | 278 | { |
rgrover1 | 370:295f76db798e | 279 | *pp_page_addr = (uint32_t *)(BLE_FLASH_PAGE_SIZE * page_num); |
rgrover1 | 370:295f76db798e | 280 | return NRF_SUCCESS; |
rgrover1 | 370:295f76db798e | 281 | } |
rgrover1 | 370:295f76db798e | 282 | |
rgrover1 | 370:295f76db798e | 283 | |
rgrover1 | 370:295f76db798e | 284 | void ble_flash_on_radio_active_evt(bool radio_active) |
rgrover1 | 370:295f76db798e | 285 | { |
rgrover1 | 370:295f76db798e | 286 | m_radio_active = radio_active; |
rgrover1 | 370:295f76db798e | 287 | } |