Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DM_FATFileSystem EthernetInterface HTTPClient mbed-rtos mbed-src
Fork of DMSupport by
Diff: FileSystems/QSPIFileSystem.cpp
- Revision:
- 22:1a58a518435c
- Parent:
- 19:2efb6f5f69a4
- Child:
- 29:b1ec19000e15
--- a/FileSystems/QSPIFileSystem.cpp Mon Jan 12 10:37:57 2015 +0100
+++ b/FileSystems/QSPIFileSystem.cpp Fri Jan 16 11:13:39 2015 +0100
@@ -190,71 +190,30 @@
/* Make sure it is a tested flash module */
switch (SPIFI::instance().device()) {
case SPIFI::Spansion_S25FL032:
- /* For the Spansion memory the TOC occupies 256bytes and the TOC block will
- hold 256 TOCs. */
strcpy(memInfo.memName, "Spansion S25FL032");
- memInfo.memSize = obj->memSize;
- memInfo.eraseBlockSize = 64*1024;
- memInfo.numEraseBlocks = memInfo.memSize / memInfo.eraseBlockSize;
- memInfo.tocSizeInBytes = sizeof(toc_entry_t) * memInfo.numEraseBlocks;
- memInfo.numTocs = memInfo.eraseBlockSize / memInfo.tocSizeInBytes;
- memInfo.tocBlockAddr = SPIFI_MEM_BASE + (NUM_BLOCKS * ERASE_SIZE) - (memInfo.numTocs * memInfo.tocSizeInBytes);
break;
case SPIFI::Winbond_W25Q64FV:
- /* For the Winbond memory the TOC occupies 8192 bytes and that is bigger than
- one erase block (which is 4096 bytes). It is possible to either keep only
- one TOC or to create a couple to reduce wear on the memory. In this case
- the multiple TOCs option is used. */
strcpy(memInfo.memName, "Winbond W25Q64FV");
- memInfo.memSize = obj->memSize;
- memInfo.eraseBlockSize = 4*1024;
- memInfo.numEraseBlocks = memInfo.memSize / memInfo.eraseBlockSize;
- memInfo.tocSizeInBytes = sizeof(toc_entry_t) * memInfo.numEraseBlocks;
- memInfo.numTocs = 8;
- memInfo.tocBlockAddr = SPIFI_MEM_BASE + (NUM_BLOCKS * ERASE_SIZE) - (memInfo.numTocs * memInfo.tocSizeInBytes);
break;
case SPIFI::Macronix_MX25L6435E:
- /* For the Macronix memory the TOC occupies 8192 bytes and that is bigger than
- one erase block (which is 4096 bytes). It is possible to either keep only
- one TOC or to create a couple to reduce wear on the memory. In this case
- the multiple TOCs option is used. */
strcpy(memInfo.memName, "Macronix_MX25L6435E");
- memInfo.memSize = obj->memSize;
- memInfo.eraseBlockSize = 4*1024;
- memInfo.numEraseBlocks = memInfo.memSize / memInfo.eraseBlockSize;
- memInfo.tocSizeInBytes = sizeof(toc_entry_t) * memInfo.numEraseBlocks;
- memInfo.numTocs = 8;
- memInfo.tocBlockAddr = SPIFI_MEM_BASE + (NUM_BLOCKS * ERASE_SIZE) - (memInfo.numTocs * memInfo.tocSizeInBytes);
break;
case SPIFI::Macronix_MX25L12835F:
- /* For the Macronix memory the TOC occupies 16384 bytes and that is bigger than
- one erase block (which is 4096 bytes). It is possible to either keep only
- one TOC or to create a couple to reduce wear on the memory. In this case
- the multiple TOCs option is used. */
strcpy(memInfo.memName, "Macronix_MX25L12835F");
- memInfo.memSize = obj->memSize;
- memInfo.eraseBlockSize = 4*1024;
- memInfo.numEraseBlocks = memInfo.memSize / memInfo.eraseBlockSize;
- memInfo.tocSizeInBytes = sizeof(toc_entry_t) * memInfo.numEraseBlocks;
- memInfo.numTocs = 4;
- memInfo.tocBlockAddr = SPIFI_MEM_BASE + (NUM_BLOCKS * ERASE_SIZE) - (memInfo.numTocs * memInfo.tocSizeInBytes);
+ break;
+
+ case SPIFI::SpecifiedInBios:
+ strcpy(memInfo.memName, "Specified in BIOS");
break;
case SPIFI::UnknownDevice:
default:
debug("INIT: Memory is unknown and may not work as expected\n");
- // Asuming it has 64Kb erase blocks (i.e. same setup as the Spansion S25FL032
strcpy(memInfo.memName, "Unknown - check ID");
- memInfo.memSize = obj->memSize;
- memInfo.eraseBlockSize = 64*1024;
- memInfo.numEraseBlocks = memInfo.memSize / memInfo.eraseBlockSize;
- memInfo.tocSizeInBytes = sizeof(toc_entry_t) * memInfo.numEraseBlocks;
- memInfo.numTocs = memInfo.eraseBlockSize / memInfo.tocSizeInBytes;
- memInfo.tocBlockAddr = SPIFI_MEM_BASE + (NUM_BLOCKS * ERASE_SIZE) - (memInfo.numTocs * memInfo.tocSizeInBytes);
/*
* If this happens, check the manufacturer and device information
@@ -264,6 +223,35 @@
*/
break;
}
+
+ /*
+ * The size of the erase blocks gives the number of erase blocks on the
+ * flash which in turn dictates the size of each TOC. For a flash with
+ * a large erase block size (Spansion_S25FL032 has 64Kb blocks) the
+ * the number of blocks is low, resulting in a small TOC with many fitting
+ * inside a single erase block.
+ * For a large flash with small erase block size (Macronix_MX25L12835F is
+ * 16Mb with 4Kb erase blocks) the number of blocks is high, resulting in
+ * a large TOC which doesn't even fit in one erase block.
+ *
+ * 4Mb, 64Kb erase block => TOC size 256b => 256 TOC/erase block
+ * 8Mb, 4Kb erase block => TOC size 8192b => 0.5 TOC/erase block
+ * 16Mb, 4Kb erase block => TOC size 16384b => 0.25 TOC/erase block
+ *
+ * In all cases we select a number of TOCs so that we use 64Kb of the
+ * memory for them. This will reduce wear on the flash as the TOC can
+ * be moved around.
+ */
+ memInfo.memSize = obj->memSize;
+ memInfo.eraseBlockSize = SPIFI::instance().eraseBlockSize();
+ memInfo.numEraseBlocks = memInfo.memSize / memInfo.eraseBlockSize;
+ memInfo.tocSizeInBytes = sizeof(toc_entry_t) * memInfo.numEraseBlocks;
+ memInfo.numTocs = (64*1024) / memInfo.tocSizeInBytes;
+ if (memInfo.numTocs < 2) {
+ // just in case a unknown size combination appears
+ memInfo.numTocs = 2;
+ }
+ memInfo.tocBlockAddr = SPIFI_MEM_BASE + (NUM_BLOCKS * ERASE_SIZE) - (memInfo.numTocs * memInfo.tocSizeInBytes);
debug_if(QSPI_DBG, "INIT: Found %dMB %s\n", memInfo.memSize/0x100000, memInfo.memName);
