summaryrefslogtreecommitdiff
path: root/ports/nrf
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2019-12-12 15:51:13 -0500
committerDan Halbert <halbert@halwitz.org>2019-12-12 15:51:13 -0500
commitef2ef7a6b8c30dd64753e2ceca7587d9ead90e44 (patch)
treeada3663598b60f30a1ba53b3a8ff5b8143af8e76 /ports/nrf
parente11fabd5e0979fa257a81d6025a0df0b6652b600 (diff)
parentbcd03ed7ee6cfbf0f3be926c2f7912201c5a7ca6 (diff)
merge from master
Diffstat (limited to 'ports/nrf')
-rw-r--r--ports/nrf/bluetooth/ble_drv.c2
-rw-r--r--ports/nrf/bluetooth/ble_drv.h2
-rw-r--r--ports/nrf/common-hal/nvm/ByteArray.c9
-rw-r--r--ports/nrf/peripherals/nrf/nvm.c15
-rw-r--r--ports/nrf/peripherals/nrf/nvm.h2
-rw-r--r--ports/nrf/supervisor/internal_flash.c5
6 files changed, 22 insertions, 13 deletions
diff --git a/ports/nrf/bluetooth/ble_drv.c b/ports/nrf/bluetooth/ble_drv.c
index 63d67a7f4..7dbb31582 100644
--- a/ports/nrf/bluetooth/ble_drv.c
+++ b/ports/nrf/bluetooth/ble_drv.c
@@ -43,7 +43,7 @@
nrf_nvic_state_t nrf_nvic_state = { 0 };
// Flag indicating progress of internal flash operation.
-sd_flash_operation_status_t sd_flash_operation_status;
+volatile sd_flash_operation_status_t sd_flash_operation_status;
__attribute__((aligned(4)))
static uint8_t m_ble_evt_buf[sizeof(ble_evt_t) + (BLE_GATT_ATT_MTU_DEFAULT)];
diff --git a/ports/nrf/bluetooth/ble_drv.h b/ports/nrf/bluetooth/ble_drv.h
index 7716cab8b..91990da6d 100644
--- a/ports/nrf/bluetooth/ble_drv.h
+++ b/ports/nrf/bluetooth/ble_drv.h
@@ -59,7 +59,7 @@ typedef enum {
} sd_flash_operation_status_t;
// Flag indicating progress of internal flash operation.
-extern sd_flash_operation_status_t sd_flash_operation_status;
+extern volatile sd_flash_operation_status_t sd_flash_operation_status;
typedef struct ble_drv_evt_handler_entry {
struct ble_drv_evt_handler_entry *next;
diff --git a/ports/nrf/common-hal/nvm/ByteArray.c b/ports/nrf/common-hal/nvm/ByteArray.c
index d4027a1b1..7d733ce7b 100644
--- a/ports/nrf/common-hal/nvm/ByteArray.c
+++ b/ports/nrf/common-hal/nvm/ByteArray.c
@@ -24,6 +24,7 @@
* THE SOFTWARE.
*/
+#include "py/runtime.h"
#include "common-hal/nvm/ByteArray.h"
#include <stdio.h>
@@ -39,13 +40,17 @@ static void write_page(uint32_t page_addr, uint32_t offset, uint32_t len, uint8_
// Write a whole page to flash, buffering it first and then erasing and rewriting
// it since we can only clear a whole page at a time.
+ bool status;
if (offset == 0 && len == FLASH_PAGE_SIZE) {
- nrf_nvm_safe_flash_page_write(page_addr, bytes);
+ status = nrf_nvm_safe_flash_page_write(page_addr, bytes);
} else {
uint8_t buffer[FLASH_PAGE_SIZE];
memcpy(buffer, (uint8_t *)page_addr, FLASH_PAGE_SIZE);
memcpy(buffer + offset, bytes, len);
- nrf_nvm_safe_flash_page_write(page_addr, buffer);
+ status = nrf_nvm_safe_flash_page_write(page_addr, buffer);
+ }
+ if (!status) {
+ mp_raise_OSError_msg(translate("Flash write failed"));
}
}
diff --git a/ports/nrf/peripherals/nrf/nvm.c b/ports/nrf/peripherals/nrf/nvm.c
index d8fddc4dc..7118b9c87 100644
--- a/ports/nrf/peripherals/nrf/nvm.c
+++ b/ports/nrf/peripherals/nrf/nvm.c
@@ -50,7 +50,7 @@ STATIC sd_flash_operation_status_t sd_flash_operation_wait_until_done(void) {
}
#endif
-void nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data) {
+bool nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data) {
#ifdef BLUETOOTH_SD
uint8_t sd_en = 0;
(void) sd_softdevice_is_enabled(&sd_en);
@@ -61,11 +61,11 @@ void nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data) {
sd_flash_operation_start();
err_code = sd_flash_page_erase(page_addr / FLASH_PAGE_SIZE);
if (err_code != NRF_SUCCESS) {
- mp_raise_OSError_msg_varg(translate("Flash erase failed to start, err 0x%04x"), err_code);
+ return false;
}
status = sd_flash_operation_wait_until_done();
if (status == SD_FLASH_OPERATION_ERROR) {
- mp_raise_OSError_msg(translate("Flash erase failed"));
+ return false;
}
// Divide a full page into parts, because writing a full page causes an assertion failure.
@@ -78,18 +78,19 @@ void nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data) {
(uint32_t *)data + i * words_to_write,
words_to_write);
if (err_code != NRF_SUCCESS) {
- mp_raise_OSError_msg_varg(translate("Flash write failed to start, err 0x%04x"), err_code);
+ return false;
}
status = sd_flash_operation_wait_until_done();
if (status == SD_FLASH_OPERATION_ERROR) {
- mp_raise_OSError_msg(translate("Flash write failed"));
+ return false;
}
}
- return;
+ return true;
}
#endif
nrf_nvmc_page_erase(page_addr);
nrf_nvmc_write_bytes(page_addr, data, FLASH_PAGE_SIZE);
-}
+ return true;
+}
diff --git a/ports/nrf/peripherals/nrf/nvm.h b/ports/nrf/peripherals/nrf/nvm.h
index 60a663e81..e54e953df 100644
--- a/ports/nrf/peripherals/nrf/nvm.h
+++ b/ports/nrf/peripherals/nrf/nvm.h
@@ -27,4 +27,4 @@
#define FLASH_PAGE_SIZE (4096)
-void nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data);
+bool nrf_nvm_safe_flash_page_write(uint32_t page_addr, uint8_t *data);
diff --git a/ports/nrf/supervisor/internal_flash.c b/ports/nrf/supervisor/internal_flash.c
index 07aa5079f..a44f047ff 100644
--- a/ports/nrf/supervisor/internal_flash.c
+++ b/ports/nrf/supervisor/internal_flash.c
@@ -34,6 +34,7 @@
#include "py/obj.h"
#include "py/runtime.h"
#include "lib/oofatfs/ff.h"
+#include "supervisor/shared/safe_mode.h"
#include "peripherals/nrf/nvm.h"
@@ -71,7 +72,9 @@ void supervisor_flash_flush(void) {
// Skip if data is the same
if (memcmp(_flash_cache, (void *)_flash_page_addr, FLASH_PAGE_SIZE) != 0) {
- nrf_nvm_safe_flash_page_write(_flash_page_addr, _flash_cache);
+ if (!nrf_nvm_safe_flash_page_write(_flash_page_addr, _flash_cache)) {
+ reset_into_safe_mode(FLASH_WRITE_FAIL);
+ }
}
}