NVM: consideration of SoftDevice memory layout (#977)

This commit is contained in:
d00616
2017-11-07 21:54:00 +01:00
committed by Henrik Ekblad
parent 2d5404de97
commit 0042cd4bee
3 changed files with 21 additions and 10 deletions

View File

@@ -17,6 +17,7 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "drivers/NVM/Flash.h"
#include <nrf.h>
FlashClass Flash;
@@ -49,6 +50,19 @@ uint32_t *FlashClass::page_address(size_t page)
return (uint32_t *)(page << page_size_bits());
}
uint32_t *FlashClass::top_app_page_address()
{
// Bootcode at the top of the flash memory?
// https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.0.0%2Flib_bootloader.html
if (NRF_UICR->NRFFW[0]<0xFFFFFFFF) {
// Return pointer calculated by SoftDevice/bootloader
return (uint32_t *)NRF_UICR->NRFFW[0];
}
// Return flash length
return (uint32_t *)(Flash.page_count() << Flash.page_size_bits());
}
void FlashClass::erase(uint32_t *address, size_t size)
{
size_t end_address = (size_t)address + size;

View File

@@ -30,12 +30,6 @@
#include <Arduino.h>
#include <stdio.h> // for size_t
#ifdef __RFduino__
#include <chip.h>
#else
#include <nrf.h>
#endif
/*
* Define characteristics of Flash
*
@@ -133,6 +127,10 @@ public:
* @return address of given page
*/
uint32_t *page_address(size_t page);
/** Get top of available flash for application data
* @return Last available address + 1
*/
uint32_t *top_app_page_address();
//----------------------------------------------------------------------------
/*
* Accessing flash memory

View File

@@ -300,7 +300,7 @@ void VirtualPageClass::format()
uint32_t *VirtualPageClass::get_page_address(uint16_t page)
{
return (uint32_t *)((Flash.page_count() << Flash.page_size_bits()) -
return (uint32_t *)(Flash.top_app_page_address() -
((page + VNM_VIRTUAL_PAGE_SKIP_FROM_TOP)
<< VNM_VIRTUAL_PAGE_SIZE_BITS));
}
@@ -336,7 +336,6 @@ void VirtualPageClass::build_page(uint32_t *address, uint32_t magic)
uint32_t VirtualPageClass::get_page_erase_cycles(uint32_t *address)
{
// Return number of cycles
return ((uint32_t)address[OFFSET_ERASE_COUNTER] &
(uint32_t)MASK_ERASE_COUNTER) +
1;
return ((((uint32_t)address[OFFSET_ERASE_COUNTER])+1) &
(uint32_t)MASK_ERASE_COUNTER);
}