Add driver for writing into the internal flash.

Write the OK flag for mcuboot using this driver.
This commit is contained in:
JF 2020-05-24 20:30:06 +02:00
parent 00451ef05b
commit 4717cf0a1d
4 changed files with 63 additions and 27 deletions

View file

@ -342,6 +342,7 @@ list(APPEND SOURCE_FILES
drivers/Spi.cpp drivers/Spi.cpp
drivers/Watchdog.cpp drivers/Watchdog.cpp
drivers/DebugPins.cpp drivers/DebugPins.cpp
drivers/InternalFlash.cpp
Components/Battery/BatteryController.cpp Components/Battery/BatteryController.cpp
Components/Ble/BleController.cpp Components/Ble/BleController.cpp
Components/Ble/NotificationManager.cpp Components/Ble/NotificationManager.cpp
@ -396,6 +397,7 @@ set(INCLUDE_FILES
drivers/Spi.h drivers/Spi.h
drivers/Watchdog.h drivers/Watchdog.h
drivers/DebugPins.h drivers/DebugPins.h
drivers/InternalFlash.h
Components/Battery/BatteryController.h Components/Battery/BatteryController.h
Components/Ble/BleController.h Components/Ble/BleController.h
Components/Ble/NotificationManager.h Components/Ble/NotificationManager.h

View file

@ -10,6 +10,7 @@
#include <nimble/hci_common.h> #include <nimble/hci_common.h>
#include <host/ble_gap.h> #include <host/ble_gap.h>
#include <host/util/util.h> #include <host/util/util.h>
#include <drivers/InternalFlash.h>
#include "../main.h" #include "../main.h"
using namespace Pinetime::System; using namespace Pinetime::System;
@ -38,27 +39,6 @@ void SystemTask::Process(void *instance) {
app->Work(); app->Work();
} }
static inline void nrf52_wait_for_flash_ready(void)
{
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {;}
}
void nrf52_nvmc_write_word(uint32_t address, uint32_t value) {
// Enable write.
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;
__ISB();
__DSB();
// Write word
*(uint32_t*)address = value;
nrf52_wait_for_flash_ready();
// Disable write
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
__ISB();
__DSB();
}
void SystemTask::Work() { void SystemTask::Work() {
watchdog.Setup(7); watchdog.Setup(7);
watchdog.Start(); watchdog.Start();
@ -68,12 +48,12 @@ void SystemTask::Work() {
spi.Init(); spi.Init();
spiNorFlash.Init(); spiNorFlash.Init();
uint32_t* magicptr = reinterpret_cast<uint32_t *>(0x7BFE8); // Write the 'image OK' flag if it's not already done
uint32_t magic = *magicptr; // TODO implement a better verification mecanism for the image (ask for user confirmation via UI/BLE ?)
if(magic != 1) uint32_t* imageOkPtr = reinterpret_cast<uint32_t *>(0x7BFE8);
nrf52_nvmc_write_word(0x7BFE8, 1); uint32_t imageOk = *imageOkPtr;
if(imageOk != 1)
NRF_LOG_INFO("MAGIC : %d", magic); Pinetime::Drivers::InternalFlash::WriteWord(0x7BFE8, 1);
nimbleController.Init(); nimbleController.Init();
nimbleController.StartAdvertising(); nimbleController.StartAdvertising();

View file

@ -0,0 +1,39 @@
#include <sdk/modules/nrfx/mdk/nrf.h>
#include "InternalFlash.h"
using namespace Pinetime::Drivers;
void InternalFlash::ErasePage(uint32_t address) {
// Enable erase.
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Een;
__ISB();
__DSB();
// Erase the page
NRF_NVMC->ERASEPAGE = address;
Wait();
// Disable erase
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
__ISB();
__DSB();
}
void InternalFlash::WriteWord(uint32_t address, uint32_t value) {
// Enable write.
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;
__ISB();
__DSB();
// Write word
*(uint32_t*)address = value;
Wait();
// Disable write
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
__ISB();
__DSB();
}
void InternalFlash::Wait() {
while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {;}
}

View file

@ -0,0 +1,15 @@
#pragma once
#include <cstdint>
namespace Pinetime {
namespace Drivers {
class InternalFlash {
public:
static void ErasePage(uint32_t address);
static void WriteWord(uint32_t address, uint32_t value);
private:
static inline void Wait();
};
}
}