You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/07/10 04:49:26 UTC

[incubator-nuttx] branch master updated: lpc17_40: Fixed progmem driver.

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

xiaoxiang 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 61cb524  lpc17_40: Fixed progmem driver.
61cb524 is described below

commit 61cb524fa2cdee86345f72adce0b6195a9b073d6
Author: Fotis Panagiotopoulos <f....@gmail.com>
AuthorDate: Fri Jul 9 17:53:36 2021 +0300

    lpc17_40: Fixed progmem driver.
---
 arch/arm/src/lpc17xx_40xx/Kconfig            | 15 -----
 arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.c | 94 ++++++++++++++++++++--------
 arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.h | 47 +++-----------
 3 files changed, 76 insertions(+), 80 deletions(-)

diff --git a/arch/arm/src/lpc17xx_40xx/Kconfig b/arch/arm/src/lpc17xx_40xx/Kconfig
index efc617e..e41961a 100644
--- a/arch/arm/src/lpc17xx_40xx/Kconfig
+++ b/arch/arm/src/lpc17xx_40xx/Kconfig
@@ -1070,18 +1070,3 @@ config LPC17_40_USBHOST_REGDEBUG
 		also CONFIG_DEBUG_USB_INFO.
 
 endmenu
-
-menu "Memory-Technolgy-Device Options (PROGMEM)"
-	depends on LPC17_40_PROGMEM
-
-config LPC17_40_PROGMEM_NSECTORS
-	int "Size in 32 kB sectors"
-	default 2
-	---help---
-		Number of 32 kB sectors to use as an MTD-device.  This driver
-		will allocate the last n sectors.  Only 32 kB sectors are
-		supported, so this works only on devices with 128 kB, 256 kB and
-		512 kB of flash.  The maximum number of sectors for these
-		devices is 2, 6 and 14, respectively.  Default is 2.
-
-endmenu
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.c b/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.c
index 2c4edc1..7ad7930 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.c
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.c
@@ -27,13 +27,12 @@
  * Included Files
  ****************************************************************************/
 
-#include <nuttx/config.h>
-
 #include <errno.h>
 #include <stdint.h>
-#include <debug.h>
-#include <assert.h>
+#include <stdbool.h>
+#include <limits.h>
 
+#include <arch/chip/chip.h>
 #include <arch/board/board.h>
 #include <nuttx/progmem.h>
 #include <nuttx/irq.h>
@@ -171,7 +170,7 @@ static uint32_t lpc17_40_iap_copy_ram_to_flash(void *flash, const void *ram,
 
 size_t up_progmem_neraseblocks(void)
 {
-  return CONFIG_LPC17_40_PROGMEM_NSECTORS;
+  return LPC17_40_FLASH_NUM_SECTORS;
 }
 
 /****************************************************************************
@@ -184,7 +183,7 @@ size_t up_progmem_neraseblocks(void)
 
 bool up_progmem_isuniform(void)
 {
-  return true;
+  return false;
 }
 
 /****************************************************************************
@@ -197,7 +196,7 @@ bool up_progmem_isuniform(void)
 
 size_t up_progmem_pagesize(size_t page)
 {
-  return (size_t)LPC17_40_PROGMEM_PAGE_SIZE;
+  return up_progmem_erasesize(page);
 }
 
 /****************************************************************************
@@ -210,7 +209,19 @@ size_t up_progmem_pagesize(size_t page)
 
 size_t up_progmem_erasesize(size_t block)
 {
-  return (size_t)LPC17_40_PROGMEM_SECTOR_SIZE;
+  if (block >= LPC17_40_FLASH_NUM_SECTORS)
+    {
+      return 0;
+    }
+
+  if (block < LPC17_40_FLASH_NUM_4K_SECTORS)
+    {
+      return (size_t)(4 * 1024);
+    }
+  else
+    {
+      return (size_t)(32 * 1024);
+    }
 }
 
 /****************************************************************************
@@ -233,12 +244,25 @@ size_t up_progmem_erasesize(size_t block)
 
 ssize_t up_progmem_getpage(size_t addr)
 {
-  if (addr >= LPC17_40_PROGMEM_START_ADDR)
+  ssize_t page;
+
+  if (addr >= LPC17_40_FLASH_SIZE)
+    {
+      return -EFAULT;
+    }
+
+  if (addr < (LPC17_40_FLASH_NUM_4K_SECTORS * (4 * 1024)))
+    {
+      page = addr / (4 * 1024);
+    }
+  else
     {
-      addr -= LPC17_40_PROGMEM_START_ADDR;
+      page = LPC17_40_FLASH_NUM_4K_SECTORS +
+              ((addr - (LPC17_40_FLASH_NUM_4K_SECTORS *
+              (4 * 1024))) / (32 * 1024));
     }
 
-  return (size_t)(addr / LPC17_40_PROGMEM_PAGE_SIZE);
+  return page;
 }
 
 /****************************************************************************
@@ -257,8 +281,24 @@ ssize_t up_progmem_getpage(size_t addr)
 
 size_t up_progmem_getaddress(size_t page)
 {
-  return (size_t)(LPC17_40_PROGMEM_START_ADDR +
-           page * LPC17_40_PROGMEM_PAGE_SIZE);
+  size_t addr;
+
+  if (page >= LPC17_40_FLASH_NUM_SECTORS)
+    {
+      return SIZE_MAX;
+    }
+
+  if (page < LPC17_40_FLASH_NUM_4K_SECTORS)
+    {
+      addr = page * (4 * 1024);
+    }
+  else
+    {
+      addr = (LPC17_40_FLASH_NUM_4K_SECTORS * (4 * 1024)) +
+              ((page - LPC17_40_FLASH_NUM_4K_SECTORS) * (32 * 1024));
+    }
+
+  return addr;
 }
 
 /****************************************************************************
@@ -287,27 +327,25 @@ ssize_t up_progmem_eraseblock(size_t block)
 {
   uint32_t rc;
 
-  if (block >= CONFIG_LPC17_40_PROGMEM_NSECTORS)
+  if (block >= LPC17_40_FLASH_NUM_SECTORS)
     {
       return -EFAULT;
     }
 
-  rc = lpc17_40_iap_prepare_sector_for_write_operation((uint32_t)block +
-                                            LPC17_40_PROGMEM_START_SECTOR);
+  rc = lpc17_40_iap_prepare_sector_for_write_operation((uint32_t)block);
   if (rc != LPC17_40_IAP_RC_CMD_SUCCESS)
     {
       return -EIO;
     }
 
-  rc = lpc17_40_iap_erase_sector((uint32_t)block +
-                                            LPC17_40_PROGMEM_START_SECTOR);
+  rc = lpc17_40_iap_erase_sector((uint32_t)block);
 
   if (rc != LPC17_40_IAP_RC_CMD_SUCCESS)
     {
       return -EIO;
     }
 
-  return (ssize_t)LPC17_40_PROGMEM_SECTOR_SIZE;
+  return (ssize_t)up_progmem_erasesize(block);
 }
 
 /****************************************************************************
@@ -330,17 +368,19 @@ ssize_t up_progmem_eraseblock(size_t block)
 
 ssize_t up_progmem_ispageerased(size_t page)
 {
+  size_t page_size;
   const uint8_t *p;
   int i;
 
-  if (page >= CONFIG_LPC17_40_PROGMEM_NSECTORS)
+  if (page >= LPC17_40_FLASH_NUM_SECTORS)
     {
       return -EFAULT;
     }
 
+  page_size = up_progmem_pagesize(page);
   p = (const uint8_t *)up_progmem_getaddress(page);
 
-  for (i = 0; i < LPC17_40_PROGMEM_SECTOR_SIZE; i++)
+  for (i = 0; i < page_size; i++)
     {
       if (p[i] != 0xffu)
         {
@@ -348,7 +388,7 @@ ssize_t up_progmem_ispageerased(size_t page)
         }
     }
 
-  return (ssize_t)(LPC17_40_PROGMEM_SECTOR_SIZE - i);
+  return (ssize_t)(page_size - i);
 }
 
 /****************************************************************************
@@ -386,13 +426,17 @@ ssize_t up_progmem_write(size_t addr, FAR const void *buf, size_t count)
   size_t page;
   uint32_t rc;
 
-  if (count % LPC17_40_PROGMEM_PAGE_SIZE)
+  if (addr % LPC17_40_WRITE_SIZE)
+    {
+      return -EFAULT;
+    }
+
+  if (count % LPC17_40_WRITE_SIZE)
     {
       return -EINVAL;
     }
 
-  page = up_progmem_getpage(addr) / LPC17_40_PROGMEM_PAGES_PER_SECTOR +
-         LPC17_40_PROGMEM_START_SECTOR;
+  page = up_progmem_getpage(addr);
 
   rc = lpc17_40_iap_prepare_sector_for_write_operation((uint32_t)page);
 
diff --git a/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.h b/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.h
index a9fd303..18f766d 100644
--- a/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.h
+++ b/arch/arm/src/lpc17xx_40xx/lpc17_40_progmem.h
@@ -36,59 +36,26 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-/****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
 
-/* The first 16 sectors are 4kB in size and thus not supported as progmem. */
+/* The first 16 sectors are 4kB in size. */
 
 #define LPC17_40_FLASH_NUM_4K_SECTORS  16
 
-/* The number of 32kB sectors depends on the target device's flash size */
+/* The number of 32kB sectors depends on the target device's flash size. */
 
 #define LPC17_40_FLASH_NUM_32K_SECTORS \
   ((LPC17_40_FLASH_SIZE - LPC17_40_FLASH_NUM_4K_SECTORS * 4096) / 32768)
 
-/* The number of 32kB sectors to be used for progmem is configurable.
- * The sectors at the end of the flash are used for progmem, the rest is
- * left for code and data.
- */
-
-#define LPC17_40_PROGMEM_START_SECTOR \
-  (LPC17_40_FLASH_NUM_4K_SECTORS + LPC17_40_FLASH_NUM_32K_SECTORS - \
-   CONFIG_LPC17_40_PROGMEM_NSECTORS)
-
-/* Base address of the flash segment used for progmem. */
-
-#define LPC17_40_PROGMEM_START_ADDR \
-  (LPC17_40_FLASH_NUM_4K_SECTORS * 4096 + \
-   (LPC17_40_PROGMEM_START_SECTOR - LPC17_40_FLASH_NUM_4K_SECTORS) * 32768)
-
-/* Size of the flash segment used for progmem. */
-
-#define LPC17_40_PROGMEM_SIZE (CONFIG_LPC17_40_PROGMEM_NSECTORS * 32768)
-
-/* Size of a read/write page. */
-
-#define LPC17_40_PROGMEM_PAGE_SIZE 256
-
-/* Total number of read/write pages. */
-
-#define LPC17_40_PROGMEM_NUM_PAGES (LPC17_40_PROGMEM_SIZE / LPC17_40_PROGMEM_PAGE_SIZE)
-
-/* Size of an erase page.  This driver only supports the 32kB sectors. */
+/* The total number of sectors is the sum of the 4k and 32k sectors. */
 
-#define LPC17_40_PROGMEM_SECTOR_SIZE 32768
+#define LPC17_40_FLASH_NUM_SECTORS \
+  (LPC17_40_FLASH_NUM_4K_SECTORS + LPC17_40_FLASH_NUM_32K_SECTORS)
 
-/* Number of read/write pages per erase page. */
+/* Size of a write page. */
 
-#define LPC17_40_PROGMEM_PAGES_PER_SECTOR \
-  (LPC17_40_PROGMEM_SECTOR_SIZE / LPC17_40_PROGMEM_PAGE_SIZE)
+#define LPC17_40_WRITE_SIZE 256
 
 /* LPC17 entry point for In-Application-Programming boot rom service
  * function