You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/03/13 15:31:57 UTC

[incubator-nuttx] branch master updated: Revert "arch/arm/src/stm32f7/stm32_flash.c: Add flash block mapping support for progmem."

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

gnutt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new ea81924  Revert "arch/arm/src/stm32f7/stm32_flash.c: Add flash block mapping support for progmem."
ea81924 is described below

commit ea81924fce81c69f8060f523e474e921a959dae9
Author: David Sidrane <Da...@NscDg.com>
AuthorDate: Fri Mar 13 06:53:50 2020 -0700

    Revert "arch/arm/src/stm32f7/stm32_flash.c: Add flash block mapping support for progmem."
    
    This reverts commit 29164c5706490b74a84d44ba0f79cd588fd3e910.
---
 arch/arm/src/stm32f7/Kconfig       |  14 ----
 arch/arm/src/stm32f7/stm32_flash.c | 161 +++++++++++++------------------------
 2 files changed, 57 insertions(+), 118 deletions(-)

diff --git a/arch/arm/src/stm32f7/Kconfig b/arch/arm/src/stm32f7/Kconfig
index 806a820..a4b4b0b 100644
--- a/arch/arm/src/stm32f7/Kconfig
+++ b/arch/arm/src/stm32f7/Kconfig
@@ -1127,20 +1127,6 @@ config STM32F7_PROGMEM
 		Add progmem support, start block and end block options are provided to
 		obtain an uniform flash memory mapping.
 
-if STM32F7_PROGMEM
-
-config STM32F7_PROGMEM_STARTBLOCK
-	int "First mapped progmem block"
-	default 0
-	range 0 64
-
-config STM32F7_PROGMEM_LASTBLOCK
-	int "Last mapped progmem block"
-	default -1
-	range -1 64
-
-endif # STM32F7_PROGMEM
-
 menu "STM32 Peripheral Support"
 
 # These "hidden" settings determine is a peripheral option is available for the
diff --git a/arch/arm/src/stm32f7/stm32_flash.c b/arch/arm/src/stm32f7/stm32_flash.c
index 68f583d..d83e3fe 100644
--- a/arch/arm/src/stm32f7/stm32_flash.c
+++ b/arch/arm/src/stm32f7/stm32_flash.c
@@ -73,33 +73,20 @@
 #define FLASH_OPTKEY2      0x4c5d6e7f
 #define FLASH_ERASEDVALUE  0xff
 
-#if CONFIG_STM32F7_PROGMEM_STARTBLOCK < 0 || \
-    CONFIG_STM32F7_PROGMEM_STARTBLOCK >= STM32_FLASH_NPAGES
-#  error "Invalid CONFIG_STM32F7_PROGMEM_STARTBLOCK"
-#endif
-
-#if CONFIG_STM32F7_PROGMEM_LASTBLOCK < 0
-#  undef CONFIG_STM32F7_PROGMEM_LASTBLOCK
-#  define CONFIG_STM32F7_PROGMEM_LASTBLOCK (STM32_FLASH_NPAGES-1)
-#endif
-
-#define PROGMEM_NBLOCKS \
-  (CONFIG_STM32F7_PROGMEM_LASTBLOCK - CONFIG_STM32F7_PROGMEM_STARTBLOCK + 1)
-
-#define PAGESIZE 256
-
 /****************************************************************************
  * Private Data
  ****************************************************************************/
 
 static sem_t g_sem = SEM_INITIALIZER(1);
 
-static const size_t page_sizes[STM32_FLASH_NPAGES] = STM32_FLASH_SIZES;
-
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
 
+static void up_waste(void)
+{
+}
+
 static void sem_lock(void)
 {
   nxsem_wait_uninterruptible(&g_sem);
@@ -114,6 +101,7 @@ static void flash_unlock(void)
 {
   while (getreg32(STM32_FLASH_SR) & FLASH_SR_BSY)
     {
+      up_waste();
     }
 
   if (getreg32(STM32_FLASH_CR) & FLASH_CR_LOCK)
@@ -130,39 +118,6 @@ static void flash_lock(void)
   modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_LOCK);
 }
 
-static uint32_t flash_size(void)
-{
-  static uint32_t size;
-  int i;
-
-  if (size == 0)
-    {
-      for (i = 0; i < PROGMEM_NBLOCKS; i++)
-        {
-          size += page_sizes[CONFIG_STM32F7_PROGMEM_STARTBLOCK + i];
-        }
-    }
-
-  return size;
-}
-
-static uint32_t flash_base(void)
-{
-  static uint32_t base;
-  int i;
-
-  if (base == 0)
-    {
-      base = STM32_FLASH_BASE;
-      for (i = 0; i < CONFIG_STM32F7_PROGMEM_STARTBLOCK; i++)
-        {
-          base += page_sizes[i];
-        }
-    }
-
-  return base;
-}
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -189,29 +144,27 @@ void stm32_flash_lock(void)
  *
  ****************************************************************************/
 
-int stm32_flash_writeprotect(size_t block, bool enabled)
+int stm32_flash_writeprotect(size_t page, bool enabled)
 {
   uint32_t reg;
   uint32_t val;
 
-  if (block >= PROGMEM_NBLOCKS)
+  if (page >= STM32_FLASH_NPAGES)
     {
       return -EFAULT;
     }
 
-  block = block + CONFIG_STM32F7_PROGMEM_STARTBLOCK;
-
   /* Select the register that contains the bit to be changed */
 
-  if (block < 12)
+  if (page < 12)
     {
       reg = STM32_FLASH_OPTCR;
     }
-#if defined(CONFIG_STM32F7_FLASH_CONFIG_I)
+#if defined(CONFIG_STM32_FLASH_CONFIG_I)
   else
     {
       reg = STM32_FLASH_OPTCR1;
-      block -= 12;
+      page -= 12;
     }
 #else
   else
@@ -228,11 +181,11 @@ int stm32_flash_writeprotect(size_t block, bool enabled)
 
   if (enabled)
     {
-      val &= ~(1 << (16 + block));
+      val &= ~(1 << (16 + page));
     }
   else
     {
-      val |=  (1 << (16 + block));
+      val |=  (1 << (16 + page));
     }
 
   /* Unlock options */
@@ -252,6 +205,7 @@ int stm32_flash_writeprotect(size_t block, bool enabled)
 
   while (getreg32(STM32_FLASH_SR) & FLASH_SR_BSY)
     {
+      up_waste();
     }
 
   /* Re-lock options */
@@ -262,57 +216,75 @@ int stm32_flash_writeprotect(size_t block, bool enabled)
 
 size_t up_progmem_pagesize(size_t page)
 {
-  return PAGESIZE;
+  static const size_t page_sizes[STM32_FLASH_NPAGES] = STM32_FLASH_SIZES;
+
+  if (page >= sizeof(page_sizes) / sizeof(*page_sizes))
+    {
+      return 0;
+    }
+  else
+    {
+      return page_sizes[page];
+    }
 }
 
 ssize_t up_progmem_getpage(size_t addr)
 {
-  if (addr >= flash_base())
+  size_t page_end = 0;
+  size_t i;
+
+  if (addr >= STM32_FLASH_BASE)
     {
-      addr -= flash_base();
+      addr -= STM32_FLASH_BASE;
     }
 
-  if (addr >= flash_size())
+  if (addr >= STM32_FLASH_SIZE)
     {
       return -EFAULT;
     }
 
-  return addr / PAGESIZE;
+  for (i = 0; i < STM32_FLASH_NPAGES; ++i)
+    {
+      page_end += up_progmem_pagesize(i);
+      if (page_end > addr)
+        {
+          return i;
+        }
+    }
+
+  return -EFAULT;
 }
 
 size_t up_progmem_getaddress(size_t page)
 {
-  size_t base_address = flash_base();
+  size_t base_address = STM32_FLASH_BASE;
+  size_t i;
 
-  if (page >= flash_size() / PAGESIZE)
+  if (page >= STM32_FLASH_NPAGES)
     {
       return SIZE_MAX;
     }
 
-  base_address += PAGESIZE * page;
+  for (i = 0; i < page; ++i)
+    {
+      base_address += up_progmem_pagesize(i);
+    }
 
   return base_address;
 }
 
 size_t up_progmem_neraseblocks(void)
 {
-  return PROGMEM_NBLOCKS;
+  return STM32_FLASH_NPAGES;
 }
 
 bool up_progmem_isuniform(void)
 {
-  size_t size = up_progmem_pagesize(0);
-  int i;
-
-  for (i = 1; i < PROGMEM_NBLOCKS; i++)
-    {
-      if (up_progmem_pagesize(i) != size)
-        {
-          return false;
-        }
-    }
-
+#ifdef STM32_FLASH_PAGESIZE
   return true;
+#else
+  return false;
+#endif
 }
 
 ssize_t up_progmem_ispageerased(size_t page)
@@ -321,7 +293,7 @@ ssize_t up_progmem_ispageerased(size_t page)
   size_t count;
   size_t bwritten = 0;
 
-  if (page >= flash_size() / PAGESIZE)
+  if (page >= STM32_FLASH_NPAGES)
     {
       return -EFAULT;
     }
@@ -342,7 +314,7 @@ ssize_t up_progmem_ispageerased(size_t page)
 
 ssize_t up_progmem_eraseblock(size_t block)
 {
-  if (block >= PROGMEM_NBLOCKS)
+  if (block >= STM32_FLASH_NPAGES)
     {
       return -EFAULT;
     }
@@ -354,13 +326,10 @@ ssize_t up_progmem_eraseblock(size_t block)
   flash_unlock();
 
   modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_SER);
-  modifyreg32(STM32_FLASH_CR, FLASH_CR_SNB_MASK,
-      FLASH_CR_SNB((block + CONFIG_STM32F7_PROGMEM_STARTBLOCK)));
+  modifyreg32(STM32_FLASH_CR, FLASH_CR_SNB_MASK, FLASH_CR_SNB(block));
   modifyreg32(STM32_FLASH_CR, 0, FLASH_CR_STRT);
 
-  while (getreg32(STM32_FLASH_SR) & FLASH_SR_BSY)
-    {
-    }
+  while (getreg32(STM32_FLASH_SR) & FLASH_SR_BSY) up_waste();
 
   modifyreg32(STM32_FLASH_CR, FLASH_CR_SER, 0);
   sem_unlock();
@@ -377,20 +346,6 @@ ssize_t up_progmem_eraseblock(size_t block)
     }
 }
 
-size_t up_progmem_erasesize(size_t block)
-{
-  block = block + CONFIG_STM32F7_PROGMEM_STARTBLOCK;
-
-  if (block >= sizeof(page_sizes) / sizeof(*page_sizes))
-    {
-      return 0;
-    }
-  else
-    {
-      return page_sizes[block];
-    }
-}
-
 ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
 {
   uint8_t *byte = (uint8_t *)buf;
@@ -402,7 +357,7 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
   if (addr >= STM32_FLASH_BASE &&
       addr + count <= STM32_FLASH_BASE + STM32_FLASH_SIZE)
     {
-      flash_base = up_progmem_getaddress(0);
+      flash_base = STM32_FLASH_BASE;
     }
   else if (addr >= STM32_OPT_BASE &&
            addr + count <= STM32_OPT_BASE + STM32_OPT_SIZE)
@@ -441,9 +396,7 @@ ssize_t up_progmem_write(size_t addr, const void *buf, size_t count)
 
       ARM_DSB();
 
-      while (getreg32(STM32_FLASH_SR) & FLASH_SR_BSY)
-        {
-        }
+      while (getreg32(STM32_FLASH_SR) & FLASH_SR_BSY) up_waste();
 
       /* Verify */