NVM: consideration of SoftDevice memory layout (#977)
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
#include "drivers/NVM/Flash.h"
|
#include "drivers/NVM/Flash.h"
|
||||||
|
#include <nrf.h>
|
||||||
|
|
||||||
FlashClass Flash;
|
FlashClass Flash;
|
||||||
|
|
||||||
@@ -49,6 +50,19 @@ uint32_t *FlashClass::page_address(size_t page)
|
|||||||
return (uint32_t *)(page << page_size_bits());
|
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)
|
void FlashClass::erase(uint32_t *address, size_t size)
|
||||||
{
|
{
|
||||||
size_t end_address = (size_t)address + size;
|
size_t end_address = (size_t)address + size;
|
||||||
|
|||||||
+4
-6
@@ -30,12 +30,6 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <stdio.h> // for size_t
|
#include <stdio.h> // for size_t
|
||||||
|
|
||||||
#ifdef __RFduino__
|
|
||||||
#include <chip.h>
|
|
||||||
#else
|
|
||||||
#include <nrf.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define characteristics of Flash
|
* Define characteristics of Flash
|
||||||
*
|
*
|
||||||
@@ -133,6 +127,10 @@ public:
|
|||||||
* @return address of given page
|
* @return address of given page
|
||||||
*/
|
*/
|
||||||
uint32_t *page_address(size_t 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
|
* Accessing flash memory
|
||||||
|
|||||||
@@ -300,7 +300,7 @@ void VirtualPageClass::format()
|
|||||||
|
|
||||||
uint32_t *VirtualPageClass::get_page_address(uint16_t page)
|
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)
|
((page + VNM_VIRTUAL_PAGE_SKIP_FROM_TOP)
|
||||||
<< VNM_VIRTUAL_PAGE_SIZE_BITS));
|
<< 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)
|
uint32_t VirtualPageClass::get_page_erase_cycles(uint32_t *address)
|
||||||
{
|
{
|
||||||
// Return number of cycles
|
// Return number of cycles
|
||||||
return ((uint32_t)address[OFFSET_ERASE_COUNTER] &
|
return ((((uint32_t)address[OFFSET_ERASE_COUNTER])+1) &
|
||||||
(uint32_t)MASK_ERASE_COUNTER) +
|
(uint32_t)MASK_ERASE_COUNTER);
|
||||||
1;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user