You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by je...@apache.org on 2021/04/12 09:16:00 UTC

[mynewt-core] branch master updated: mcu/nrf5340: Fix flash erase

This is an automated email from the ASF dual-hosted git repository.

jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 4c5550d  mcu/nrf5340: Fix flash erase
4c5550d is described below

commit 4c5550dbac6da3058ea65530f9ae3f2c08616f4b
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Fri Apr 9 11:05:38 2021 +0200

    mcu/nrf5340: Fix flash erase
    
    Flash erase was settings wrong value to CONFIG register so
    erase procedure never started on both cores.
    
    Now nrf5340_[net_]flash_erase_sector() is not sharing code with
    write any more.
    
    Additionally nrf5340_[net_]flash_erase() was added to that can
    speed up erase a little bit.
---
 hw/mcu/nordic/nrf5340/src/hal_flash.c     | 51 +++++++++++++++++++++++++++++--
 hw/mcu/nordic/nrf5340_net/src/hal_flash.c | 51 +++++++++++++++++++++++++++++--
 2 files changed, 96 insertions(+), 6 deletions(-)

diff --git a/hw/mcu/nordic/nrf5340/src/hal_flash.c b/hw/mcu/nordic/nrf5340/src/hal_flash.c
index cb25451..659dda1 100644
--- a/hw/mcu/nordic/nrf5340/src/hal_flash.c
+++ b/hw/mcu/nordic/nrf5340/src/hal_flash.c
@@ -121,9 +121,53 @@ out:
 static int
 nrf5340_flash_erase_sector(const struct hal_flash *dev, uint32_t sector_address)
 {
-    uint32_t val = 0xffffffff;
+    int sr;
+    int rc;
+
+    sector_address &= ~(NRF5340_FLASH_SECTOR_SZ - 1);
+
+    if (nrf5340_flash_wait_ready()) {
+        return -1;
+    }
+    __HAL_DISABLE_INTERRUPTS(sr);
 
-    return nrf5340_flash_write(dev, sector_address, &val, sizeof(val));
+    NRF_NVMC_S->CONFIG = NVMC_CONFIG_WEN_Een; /* Enable erase OP */
+    *(uint32_t *)sector_address = 0xFFFFFFFF;
+
+    rc = nrf5340_flash_wait_ready();
+
+    NRF_NVMC_S->CONFIG = NVMC_CONFIG_WEN_Ren;
+    __HAL_ENABLE_INTERRUPTS(sr);
+
+    return rc;
+}
+
+static int
+nrf5340_flash_erase(const struct hal_flash *dev, uint32_t address,
+                    uint32_t num_bytes)
+{
+    uint32_t sector_address;
+
+    if (address + num_bytes < dev->hf_base_addr ||
+        address > dev->hf_base_addr + dev->hf_size) {
+        return -1;
+    }
+
+    sector_address = address & ~(NRF5340_FLASH_SECTOR_SZ - 1);
+    num_bytes += address - sector_address;
+    num_bytes = (num_bytes + NRF5340_FLASH_SECTOR_SZ - 1) & ~(NRF5340_FLASH_SECTOR_SZ - 1);
+    if (sector_address < dev->hf_base_addr) {
+        num_bytes -= dev->hf_base_addr - sector_address;
+        sector_address = dev->hf_base_addr;
+    }
+
+    while (num_bytes > 0 && sector_address < dev->hf_base_addr + dev->hf_size) {
+        nrf5340_flash_erase_sector(dev, sector_address);
+        num_bytes -= NRF5340_FLASH_SECTOR_SZ;
+        sector_address += NRF5340_FLASH_SECTOR_SZ;
+    }
+
+    return 0;
 }
 
 static int
@@ -147,7 +191,8 @@ static const struct hal_flash_funcs nrf5340_flash_funcs = {
     .hff_write = nrf5340_flash_write,
     .hff_erase_sector = nrf5340_flash_erase_sector,
     .hff_sector_info = nrf5340_flash_sector_info,
-    .hff_init = nrf5340_flash_init
+    .hff_init = nrf5340_flash_init,
+    .hff_erase = nrf5340_flash_erase,
 };
 
 const struct hal_flash nrf5340_flash_dev = {
diff --git a/hw/mcu/nordic/nrf5340_net/src/hal_flash.c b/hw/mcu/nordic/nrf5340_net/src/hal_flash.c
index ccc771c..dfbe38b 100644
--- a/hw/mcu/nordic/nrf5340_net/src/hal_flash.c
+++ b/hw/mcu/nordic/nrf5340_net/src/hal_flash.c
@@ -121,9 +121,53 @@ out:
 static int
 nrf5340_net_flash_erase_sector(const struct hal_flash *dev, uint32_t sector_address)
 {
-    uint32_t val = 0xffffffff;
+    int sr;
+    int rc;
+
+    sector_address &= ~(NRF5340_NET_FLASH_SECTOR_SZ - 1);
+
+    if (nrf5340_net_flash_wait_ready()) {
+        return -1;
+    }
+    __HAL_DISABLE_INTERRUPTS(sr);
 
-    return nrf5340_net_flash_write(dev, sector_address, &val, sizeof(val));
+    NRF_NVMC_NS->CONFIG = NVMC_CONFIG_WEN_Een; /* Enable erase OP */
+    *(uint32_t *)sector_address = 0xFFFFFFFF;
+
+    rc = nrf5340_net_flash_wait_ready();
+
+    NRF_NVMC_NS->CONFIG = NVMC_CONFIG_WEN_Ren;
+    __HAL_ENABLE_INTERRUPTS(sr);
+
+    return rc;
+}
+
+static int
+nrf5340_net_flash_erase(const struct hal_flash *dev, uint32_t address,
+                        uint32_t num_bytes)
+{
+    uint32_t sector_address;
+
+    if (address + num_bytes < dev->hf_base_addr ||
+        address > dev->hf_base_addr + dev->hf_size) {
+        return -1;
+    }
+
+    sector_address = address & ~(NRF5340_NET_FLASH_SECTOR_SZ - 1);
+    num_bytes += address - sector_address;
+    num_bytes = (num_bytes + NRF5340_NET_FLASH_SECTOR_SZ - 1) & ~(NRF5340_NET_FLASH_SECTOR_SZ - 1);
+    if (sector_address < dev->hf_base_addr) {
+        num_bytes -= dev->hf_base_addr - sector_address;
+        sector_address = dev->hf_base_addr;
+    }
+
+    while (num_bytes > 0 && sector_address < dev->hf_base_addr + dev->hf_size) {
+        nrf5340_net_flash_erase_sector(dev, sector_address);
+        num_bytes -= NRF5340_NET_FLASH_SECTOR_SZ;
+        sector_address += NRF5340_NET_FLASH_SECTOR_SZ;
+    }
+
+    return 0;
 }
 
 static int
@@ -147,7 +191,8 @@ static const struct hal_flash_funcs nrf5340_net_flash_funcs = {
     .hff_write = nrf5340_net_flash_write,
     .hff_erase_sector = nrf5340_net_flash_erase_sector,
     .hff_sector_info = nrf5340_net_flash_sector_info,
-    .hff_init = nrf5340_net_flash_init
+    .hff_init = nrf5340_net_flash_init,
+    .hff_erase = nrf5340_net_flash_erase,
 };
 
 const struct hal_flash nrf5340_net_flash_dev = {