A file system which can mount, read, and enumerate a file system image which has been appended to the compiled .bin code file before being uploaded to the mbed device.

FLASH File System

This file system can mount, read, and enumerate a file system image which has been appended to the compiled .bin code file before being uploaded to the mbed device. I wrote a utility called fsbld to create images that can be used with this file system. This GitHub repository contains the sources for that utility.

To get the file system image onto the mbed device, you need to concatenate your binary from the compiler with the file system image binary.

  • On *nix this can be done with the cat command. For example:
    cat Test_LPC1768.bin FileImage.bin >/Volumes/MBED/test.bin
  • On Windows this can be done with the copy command. For example:
    copy Test_LPC1768.bin + FileImage.bin e:\test.bin
Revision:
2:ca35ecd2fae6
Parent:
1:a3cb118c4f6e
--- a/FlashFileSystem.cpp	Wed Aug 03 22:29:40 2011 +0000
+++ b/FlashFileSystem.cpp	Sun Apr 05 10:04:44 2015 +0000
@@ -402,12 +402,17 @@
    Parameters:
     pName is the root name to be used for this file system in fopen()
         pathnames.
+    pFlashDrive (optional) is a pointer to the read-only file system (const char array).
+        When pFlashDrive is not specified, it is up to the user to append the
+        read-only file system file to the compiled binary.
+    FlashSize (optional) is the size of the FLASH (KB) on the device to
+        search through for the file system signature (default = 512).
 */
-FlashFileSystem::FlashFileSystem(const char* pName) : FileSystemLike(pName)
+FlashFileSystem::FlashFileSystem(const char* pName, const uint8_t *pFlashDrive, const uint32_t FlashSize) : FileSystemLike(pName)
 {
     static const char   FileSystemSignature[] = FILE_SYSTEM_SIGNATURE;
     SFileSystemHeader*  pHeader = NULL;
-    char*               pCurr = (char*)FILE_SYSTEM_FLASH_SIZE - sizeof(pHeader->FileSystemSignature);
+    char*               pCurr = (char*)(FlashSize * 1024) - sizeof(pHeader->FileSystemSignature);
     
     // Initialize the members
     m_pFLASHBase = NULL;
@@ -417,18 +422,25 @@
     // Scan backwards through 512k FLASH looking for the file system signature
     // NOTE: The file system image should be located after this code itself
     //       so stop the search.
-    while (pCurr > FileSystemSignature)
+    if(pFlashDrive == NULL)
     {
-        if (0 == memcmp(pCurr, FileSystemSignature, sizeof(pHeader->FileSystemSignature)))
+        while (pCurr > FileSystemSignature)
         {
-            break;
+            if (0 == memcmp(pCurr, FileSystemSignature, sizeof(pHeader->FileSystemSignature)))
+            {
+                break;
+            }
+            pCurr--;
         }
-        pCurr--;
+        if (pCurr <= FileSystemSignature)
+        {
+            TRACE("FlashFileSystem: Failed to find file system image in ROM.\n");
+            return;
+        }
     }
-    if (pCurr <= FileSystemSignature)
+    else
     {
-        TRACE("FlashFileSystem: Failed to find file system image in RAM.\n");
-        return;
+        pCurr = (char *)pFlashDrive;
     }
     if (((unsigned int)pCurr & 0x3) != 0)
     {