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
Committer:
frankvnk
Date:
Sun Apr 05 10:04:44 2015 +0000
Revision:
2:ca35ecd2fae6
Parent:
1:a3cb118c4f6e
2 options added: The ability to include a header file containing the binary file system image built with fsbld and the ability to set the system flash size.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdamGreen 1:a3cb118c4f6e 1 /* Copyright 2011 Adam Green (http://mbed.org/users/AdamGreen/)
AdamGreen 1:a3cb118c4f6e 2
AdamGreen 1:a3cb118c4f6e 3 Licensed under the Apache License, Version 2.0 (the "License");
AdamGreen 1:a3cb118c4f6e 4 you may not use this file except in compliance with the License.
AdamGreen 1:a3cb118c4f6e 5 You may obtain a copy of the License at
AdamGreen 1:a3cb118c4f6e 6
AdamGreen 1:a3cb118c4f6e 7 http://www.apache.org/licenses/LICENSE-2.0
AdamGreen 1:a3cb118c4f6e 8
AdamGreen 1:a3cb118c4f6e 9 Unless required by applicable law or agreed to in writing, software
AdamGreen 1:a3cb118c4f6e 10 distributed under the License is distributed on an "AS IS" BASIS,
AdamGreen 1:a3cb118c4f6e 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AdamGreen 1:a3cb118c4f6e 12 See the License for the specific language governing permissions and
AdamGreen 1:a3cb118c4f6e 13 limitations under the License.
AdamGreen 0:5ea6e74c35f7 14 */
AdamGreen 0:5ea6e74c35f7 15 /* Specifies the classes used to implement the FlashFileSystem which is a
AdamGreen 0:5ea6e74c35f7 16 read-only file system that exists in the internal FLASH of the mbed
AdamGreen 0:5ea6e74c35f7 17 device.
AdamGreen 0:5ea6e74c35f7 18 */
AdamGreen 0:5ea6e74c35f7 19 #ifndef _FLASHFILESYSTEM_H_
AdamGreen 0:5ea6e74c35f7 20 #define _FLASHFILESYSTEM_H_
AdamGreen 0:5ea6e74c35f7 21
AdamGreen 0:5ea6e74c35f7 22 #include "FileSystemLike.h"
AdamGreen 0:5ea6e74c35f7 23
AdamGreen 0:5ea6e74c35f7 24
AdamGreen 0:5ea6e74c35f7 25 // Forward declare file system entry structure used internally in
AdamGreen 0:5ea6e74c35f7 26 // FlashFileSystem.
AdamGreen 0:5ea6e74c35f7 27 struct _SFileSystemEntry;
AdamGreen 0:5ea6e74c35f7 28
AdamGreen 0:5ea6e74c35f7 29
AdamGreen 0:5ea6e74c35f7 30
AdamGreen 0:5ea6e74c35f7 31 // Represents an opened file object in the FlashFileSystem.
AdamGreen 0:5ea6e74c35f7 32 class FlashFileSystemFileHandle : public FileHandle
AdamGreen 0:5ea6e74c35f7 33 {
AdamGreen 0:5ea6e74c35f7 34 public:
AdamGreen 0:5ea6e74c35f7 35 FlashFileSystemFileHandle();
AdamGreen 0:5ea6e74c35f7 36 FlashFileSystemFileHandle(const char* pFileStart, const char* pFileEnd);
AdamGreen 0:5ea6e74c35f7 37
AdamGreen 0:5ea6e74c35f7 38 // FileHandle interface methods.
AdamGreen 0:5ea6e74c35f7 39 virtual ssize_t write(const void* buffer, size_t length);
AdamGreen 0:5ea6e74c35f7 40 virtual int close();
AdamGreen 0:5ea6e74c35f7 41 virtual ssize_t read(void* buffer, size_t length);
AdamGreen 0:5ea6e74c35f7 42 virtual int isatty();
AdamGreen 0:5ea6e74c35f7 43 virtual off_t lseek(off_t offset, int whence);
AdamGreen 0:5ea6e74c35f7 44 virtual int fsync();
AdamGreen 0:5ea6e74c35f7 45 virtual off_t flen();
AdamGreen 0:5ea6e74c35f7 46
AdamGreen 0:5ea6e74c35f7 47 // Used by FlashFileSystem to maintain entries in its handle table.
AdamGreen 0:5ea6e74c35f7 48 void SetEntry(const char* pFileStart, const char* pFileEnd)
AdamGreen 0:5ea6e74c35f7 49 {
AdamGreen 0:5ea6e74c35f7 50 m_pFileStart = pFileStart;
AdamGreen 0:5ea6e74c35f7 51 m_pFileEnd = pFileEnd;
AdamGreen 0:5ea6e74c35f7 52 m_pCurr = pFileStart;
AdamGreen 0:5ea6e74c35f7 53 }
AdamGreen 0:5ea6e74c35f7 54 int IsClosed()
AdamGreen 0:5ea6e74c35f7 55 {
AdamGreen 0:5ea6e74c35f7 56 return (NULL == m_pFileStart);
AdamGreen 0:5ea6e74c35f7 57 }
AdamGreen 0:5ea6e74c35f7 58
AdamGreen 0:5ea6e74c35f7 59 protected:
AdamGreen 0:5ea6e74c35f7 60 // Beginning offset of file in FLASH memory.
AdamGreen 0:5ea6e74c35f7 61 const char* m_pFileStart;
AdamGreen 0:5ea6e74c35f7 62 // Ending offset of file in FLASH memory.
AdamGreen 0:5ea6e74c35f7 63 const char* m_pFileEnd;
AdamGreen 0:5ea6e74c35f7 64 // Current position in file to be updated by read and seek operations.
AdamGreen 0:5ea6e74c35f7 65 const char* m_pCurr;
AdamGreen 0:5ea6e74c35f7 66 };
AdamGreen 0:5ea6e74c35f7 67
AdamGreen 0:5ea6e74c35f7 68
AdamGreen 0:5ea6e74c35f7 69 // Represents an open directory in the FlashFileSystem.
AdamGreen 0:5ea6e74c35f7 70 class FlashFileSystemDirHandle : public DirHandle
AdamGreen 0:5ea6e74c35f7 71 {
AdamGreen 0:5ea6e74c35f7 72 public:
AdamGreen 0:5ea6e74c35f7 73 // Constructors
AdamGreen 0:5ea6e74c35f7 74 FlashFileSystemDirHandle();
AdamGreen 0:5ea6e74c35f7 75 FlashFileSystemDirHandle(const char* pFLASHBase,
AdamGreen 0:5ea6e74c35f7 76 const _SFileSystemEntry* pFirstFileEntry,
AdamGreen 0:5ea6e74c35f7 77 unsigned int FileEntriesLeft,
AdamGreen 0:5ea6e74c35f7 78 unsigned int DirectoryNameLength);
AdamGreen 0:5ea6e74c35f7 79
AdamGreen 0:5ea6e74c35f7 80 // Used by FlashFileSystem to maintain DirHandle entries in its cache.
AdamGreen 0:5ea6e74c35f7 81 void SetEntry(const char* pFLASHBase,
AdamGreen 0:5ea6e74c35f7 82 const _SFileSystemEntry* pFirstFileEntry,
AdamGreen 0:5ea6e74c35f7 83 unsigned int FileEntriesLeft,
AdamGreen 0:5ea6e74c35f7 84 unsigned int DirectoryNameLength)
AdamGreen 0:5ea6e74c35f7 85 {
AdamGreen 0:5ea6e74c35f7 86 m_pFLASHBase = pFLASHBase;
AdamGreen 0:5ea6e74c35f7 87 m_pFirstFileEntry = pFirstFileEntry;
AdamGreen 0:5ea6e74c35f7 88 m_pCurrentFileEntry = pFirstFileEntry;
AdamGreen 0:5ea6e74c35f7 89 m_FileEntriesLeft = FileEntriesLeft;
AdamGreen 0:5ea6e74c35f7 90 m_DirectoryNameLength = DirectoryNameLength;
AdamGreen 0:5ea6e74c35f7 91 }
AdamGreen 0:5ea6e74c35f7 92 int IsClosed()
AdamGreen 0:5ea6e74c35f7 93 {
AdamGreen 0:5ea6e74c35f7 94 return (NULL == m_pFirstFileEntry);
AdamGreen 0:5ea6e74c35f7 95 }
AdamGreen 0:5ea6e74c35f7 96
AdamGreen 0:5ea6e74c35f7 97 // Methods defined by DirHandle interface.
AdamGreen 0:5ea6e74c35f7 98 virtual int closedir();
AdamGreen 0:5ea6e74c35f7 99 virtual struct dirent *readdir();
AdamGreen 0:5ea6e74c35f7 100 virtual void rewinddir();
AdamGreen 0:5ea6e74c35f7 101 virtual off_t telldir();
AdamGreen 0:5ea6e74c35f7 102 virtual void seekdir(off_t location);
AdamGreen 0:5ea6e74c35f7 103
AdamGreen 0:5ea6e74c35f7 104 protected:
AdamGreen 0:5ea6e74c35f7 105 // The first file entry for this directory. rewinddir() takes the
AdamGreen 0:5ea6e74c35f7 106 // iterator back to here.
AdamGreen 0:5ea6e74c35f7 107 const _SFileSystemEntry* m_pFirstFileEntry;
AdamGreen 0:5ea6e74c35f7 108 // The next file entry to be returned for this directory enumeration.
AdamGreen 0:5ea6e74c35f7 109 const _SFileSystemEntry* m_pCurrentFileEntry;
AdamGreen 0:5ea6e74c35f7 110 // Pointer to where the file system image is located in the device's FLASH.
AdamGreen 0:5ea6e74c35f7 111 const char* m_pFLASHBase;
AdamGreen 0:5ea6e74c35f7 112 // Contents of previously return directory entry structure.
AdamGreen 0:5ea6e74c35f7 113 struct dirent m_DirectoryEntry;
AdamGreen 0:5ea6e74c35f7 114 // This is the length of the directory name which was opened. When the
AdamGreen 0:5ea6e74c35f7 115 // first m_DirectoryNameLength characters change then we have iterated
AdamGreen 0:5ea6e74c35f7 116 // through to a different directory.
AdamGreen 0:5ea6e74c35f7 117 unsigned int m_DirectoryNameLength;
AdamGreen 0:5ea6e74c35f7 118 // The number of entries left in the file system file entries array.
AdamGreen 0:5ea6e74c35f7 119 unsigned int m_FileEntriesLeft;
AdamGreen 0:5ea6e74c35f7 120 };
AdamGreen 0:5ea6e74c35f7 121
AdamGreen 0:5ea6e74c35f7 122
AdamGreen 0:5ea6e74c35f7 123
frankvnk 2:ca35ecd2fae6 124 /** A filesystem for accessing a read-only file system placed in the internal\n
frankvnk 2:ca35ecd2fae6 125 * FLASH memory of the mbed board.
frankvnk 2:ca35ecd2fae6 126 *\n
frankvnk 2:ca35ecd2fae6 127 * The file system to be mounted by this file system should be created through\n
frankvnk 2:ca35ecd2fae6 128 * the use of the fsbld utility on the PC.\n
frankvnk 2:ca35ecd2fae6 129 *\n
frankvnk 2:ca35ecd2fae6 130 * As fsbld creates two output files (a binary and a header file), there are two\n
frankvnk 2:ca35ecd2fae6 131 * ways to add the resulting file system image:\n
frankvnk 2:ca35ecd2fae6 132 * -# Concatenate the binary file system to the end of the .bin file created\n
frankvnk 2:ca35ecd2fae6 133 * by the mbed online compiler before uploading to the mbed device.\n
frankvnk 2:ca35ecd2fae6 134 * -# Import the header file into your project, include this file in your main\n
frankvnk 2:ca35ecd2fae6 135 * file and add 'roFlashDrive' to the FlashfileSystem constructor call.\n
frankvnk 2:ca35ecd2fae6 136 * eg : static FlashFileSystem flash("flash", roFlashDrive);\n
AdamGreen 0:5ea6e74c35f7 137 *
frankvnk 2:ca35ecd2fae6 138 * A third (optional) parameter in the FlashfileSystem constructor call allows\n
frankvnk 2:ca35ecd2fae6 139 * you to specify the size of the FLASH (KB) on the device (default = 512).\n
frankvnk 2:ca35ecd2fae6 140 * eg (for a KL25Z device) : static FlashFileSystem flash("flash", NULL, 128);\n
frankvnk 2:ca35ecd2fae6 141 * Note that in this example, the pointer to the header file has been omitted,\n
frankvnk 2:ca35ecd2fae6 142 * so we need to append the binary file system ourselves (see above).\n
frankvnk 2:ca35ecd2fae6 143 * When you use the binary file system header in your main file, you can\n
frankvnk 2:ca35ecd2fae6 144 * use the roFlashDrive pointer.\n
frankvnk 2:ca35ecd2fae6 145 * eg (for a KL25Z device) : static FlashFileSystem flash("flash", roFlashDrive, 128);\n
frankvnk 2:ca35ecd2fae6 146 *\n
frankvnk 2:ca35ecd2fae6 147 * NOTE: This file system is case-sensitive. Calling fopen("/flash/INDEX.html")\n
frankvnk 2:ca35ecd2fae6 148 * won't successfully open a file named index.html in the root directory\n
frankvnk 2:ca35ecd2fae6 149 * of the flash file system.\n
AdamGreen 0:5ea6e74c35f7 150 *
AdamGreen 0:5ea6e74c35f7 151 * Example:
AdamGreen 0:5ea6e74c35f7 152 * @code
AdamGreen 0:5ea6e74c35f7 153 #include <mbed.h>
AdamGreen 0:5ea6e74c35f7 154 #include "FlashFileSystem.h"
frankvnk 2:ca35ecd2fae6 155 // Uncomment the line below when you imported the header file built with fsbld
frankvnk 2:ca35ecd2fae6 156 // and replace <Flashdrive> with its correct filename
frankvnk 2:ca35ecd2fae6 157 //#include "<FlashDrive>.h"
AdamGreen 0:5ea6e74c35f7 158
AdamGreen 0:5ea6e74c35f7 159 static void _RecursiveDir(const char* pDirectoryName, DIR* pDirectory = NULL)
AdamGreen 0:5ea6e74c35f7 160 {
AdamGreen 0:5ea6e74c35f7 161 DIR* pFreeDirectory = NULL;
AdamGreen 0:5ea6e74c35f7 162
AdamGreen 0:5ea6e74c35f7 163 size_t DirectoryNameLength = strlen(pDirectoryName);
AdamGreen 0:5ea6e74c35f7 164
AdamGreen 0:5ea6e74c35f7 165 // Open the specified directory.
AdamGreen 0:5ea6e74c35f7 166 if (!pDirectory)
AdamGreen 0:5ea6e74c35f7 167 {
AdamGreen 0:5ea6e74c35f7 168 pDirectory = opendir(pDirectoryName);
AdamGreen 0:5ea6e74c35f7 169 if (!pDirectory)
AdamGreen 0:5ea6e74c35f7 170 {
AdamGreen 0:5ea6e74c35f7 171 error("Failed to open directory '%s' for enumeration.\r\n",
AdamGreen 0:5ea6e74c35f7 172 pDirectoryName);
AdamGreen 0:5ea6e74c35f7 173 }
AdamGreen 0:5ea6e74c35f7 174
AdamGreen 0:5ea6e74c35f7 175 // Remember to free this directory enumerator.
AdamGreen 0:5ea6e74c35f7 176 pFreeDirectory = pDirectory;
AdamGreen 0:5ea6e74c35f7 177 }
AdamGreen 0:5ea6e74c35f7 178
AdamGreen 0:5ea6e74c35f7 179 // Determine if we should remove a trailing slash from future *printf()
AdamGreen 0:5ea6e74c35f7 180 // calls.
AdamGreen 0:5ea6e74c35f7 181 if (DirectoryNameLength && '/' == pDirectoryName[DirectoryNameLength-1])
AdamGreen 0:5ea6e74c35f7 182 {
AdamGreen 0:5ea6e74c35f7 183 DirectoryNameLength--;
AdamGreen 0:5ea6e74c35f7 184 }
AdamGreen 0:5ea6e74c35f7 185
AdamGreen 0:5ea6e74c35f7 186 // Iterate though each item contained within this directory and display
AdamGreen 0:5ea6e74c35f7 187 // it to the console.
AdamGreen 0:5ea6e74c35f7 188 struct dirent* DirEntry;
AdamGreen 0:5ea6e74c35f7 189 while((DirEntry = readdir(pDirectory)) != NULL)
AdamGreen 0:5ea6e74c35f7 190 {
AdamGreen 0:5ea6e74c35f7 191 char RecurseDirectoryName[256];
AdamGreen 0:5ea6e74c35f7 192 DIR* pSubdirectory;
AdamGreen 0:5ea6e74c35f7 193
AdamGreen 0:5ea6e74c35f7 194 // Try opening this file as a directory to see if it succeeds or not.
AdamGreen 0:5ea6e74c35f7 195 snprintf(RecurseDirectoryName, sizeof(RecurseDirectoryName),
AdamGreen 0:5ea6e74c35f7 196 "%.*s/%s",
AdamGreen 0:5ea6e74c35f7 197 DirectoryNameLength,
AdamGreen 0:5ea6e74c35f7 198 pDirectoryName,
AdamGreen 0:5ea6e74c35f7 199 DirEntry->d_name);
AdamGreen 0:5ea6e74c35f7 200 pSubdirectory = opendir(RecurseDirectoryName);
AdamGreen 0:5ea6e74c35f7 201
AdamGreen 0:5ea6e74c35f7 202 if (pSubdirectory)
AdamGreen 0:5ea6e74c35f7 203 {
AdamGreen 0:5ea6e74c35f7 204 _RecursiveDir(RecurseDirectoryName, pSubdirectory);
AdamGreen 0:5ea6e74c35f7 205 closedir(pSubdirectory);
AdamGreen 0:5ea6e74c35f7 206 }
AdamGreen 0:5ea6e74c35f7 207 else
AdamGreen 0:5ea6e74c35f7 208 {
AdamGreen 0:5ea6e74c35f7 209 printf(" %.*s/%s\n",
AdamGreen 0:5ea6e74c35f7 210 DirectoryNameLength,
AdamGreen 0:5ea6e74c35f7 211 pDirectoryName,
AdamGreen 0:5ea6e74c35f7 212 DirEntry->d_name);
AdamGreen 0:5ea6e74c35f7 213 }
AdamGreen 0:5ea6e74c35f7 214 }
AdamGreen 0:5ea6e74c35f7 215
AdamGreen 0:5ea6e74c35f7 216 // Close the directory enumerator if it was opened by this call.
AdamGreen 0:5ea6e74c35f7 217 if (pFreeDirectory)
AdamGreen 0:5ea6e74c35f7 218 {
AdamGreen 0:5ea6e74c35f7 219 closedir(pFreeDirectory);
AdamGreen 0:5ea6e74c35f7 220 }
AdamGreen 0:5ea6e74c35f7 221 }
AdamGreen 0:5ea6e74c35f7 222
AdamGreen 0:5ea6e74c35f7 223 int main()
AdamGreen 0:5ea6e74c35f7 224 {
AdamGreen 0:5ea6e74c35f7 225 static const char* Filename = "/flash/index.html";
AdamGreen 0:5ea6e74c35f7 226 char* ReadResult = NULL;
AdamGreen 0:5ea6e74c35f7 227 int SeekResult = -1;
AdamGreen 0:5ea6e74c35f7 228 char Buffer[128];
AdamGreen 0:5ea6e74c35f7 229
AdamGreen 0:5ea6e74c35f7 230 // Create the file system under the name "flash".
frankvnk 2:ca35ecd2fae6 231 // NOTE : When you include the the header file built with fsbld,
frankvnk 2:ca35ecd2fae6 232 // disable the first static FlashFileSystem... line
frankvnk 2:ca35ecd2fae6 233 // and enable the second static FlashFileSystem... line.
AdamGreen 0:5ea6e74c35f7 234 static FlashFileSystem flash("flash");
frankvnk 2:ca35ecd2fae6 235 // static FlashFileSystem flash("flash, roFlashDrive");
AdamGreen 0:5ea6e74c35f7 236 if (!flash.IsMounted())
AdamGreen 0:5ea6e74c35f7 237 {
AdamGreen 0:5ea6e74c35f7 238 error("Failed to mount FlashFileSystem.\r\n");
AdamGreen 0:5ea6e74c35f7 239 }
AdamGreen 0:5ea6e74c35f7 240
AdamGreen 0:5ea6e74c35f7 241 // Open "index.html" on the file system for reading.
AdamGreen 0:5ea6e74c35f7 242 FILE *fp = fopen(Filename, "r");
AdamGreen 0:5ea6e74c35f7 243 if (NULL == fp)
AdamGreen 0:5ea6e74c35f7 244 {
AdamGreen 0:5ea6e74c35f7 245 error("Failed to open %s\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 246 }
AdamGreen 0:5ea6e74c35f7 247
AdamGreen 0:5ea6e74c35f7 248 // Use seek to determine the length of the file
AdamGreen 0:5ea6e74c35f7 249 SeekResult = fseek(fp, 0, SEEK_END);
AdamGreen 0:5ea6e74c35f7 250 if (SeekResult)
AdamGreen 0:5ea6e74c35f7 251 {
AdamGreen 0:5ea6e74c35f7 252 error("Failed to seek to end of %s.\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 253 }
AdamGreen 0:5ea6e74c35f7 254 long FileLength = ftell(fp);
AdamGreen 0:5ea6e74c35f7 255 printf("%s is %ld bytes in length.\r\n", Filename, FileLength);
AdamGreen 0:5ea6e74c35f7 256
AdamGreen 0:5ea6e74c35f7 257 // Reset the file pointer to the beginning of the file
AdamGreen 0:5ea6e74c35f7 258 SeekResult = fseek(fp, 0, SEEK_SET);
AdamGreen 0:5ea6e74c35f7 259 if (SeekResult)
AdamGreen 0:5ea6e74c35f7 260 {
AdamGreen 0:5ea6e74c35f7 261 error("Failed to seek to beginning of %s.\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 262 }
AdamGreen 0:5ea6e74c35f7 263
AdamGreen 0:5ea6e74c35f7 264 // Read the first line into Buffer and then display to user.
AdamGreen 0:5ea6e74c35f7 265 ReadResult = fgets(Buffer, sizeof(Buffer)/sizeof(Buffer[0]), fp);
AdamGreen 0:5ea6e74c35f7 266 if (NULL == ReadResult)
AdamGreen 0:5ea6e74c35f7 267 {
AdamGreen 0:5ea6e74c35f7 268 error("Failed to read first line of %s.\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 269 }
AdamGreen 0:5ea6e74c35f7 270 printf("%s:1 %s", Filename, Buffer);
AdamGreen 0:5ea6e74c35f7 271
AdamGreen 0:5ea6e74c35f7 272 // Done with the file so close it.
AdamGreen 0:5ea6e74c35f7 273 fclose(fp);
AdamGreen 0:5ea6e74c35f7 274
AdamGreen 0:5ea6e74c35f7 275 // Enumerate all content on mounted file systems.
AdamGreen 0:5ea6e74c35f7 276 printf("\r\nList all files in /flash...\r\n");
AdamGreen 0:5ea6e74c35f7 277 _RecursiveDir("/flash");
AdamGreen 0:5ea6e74c35f7 278
AdamGreen 0:5ea6e74c35f7 279 printf("\r\nFlashFileSystem example has completed.\r\n");
AdamGreen 0:5ea6e74c35f7 280 }
AdamGreen 0:5ea6e74c35f7 281 * @endcode
AdamGreen 0:5ea6e74c35f7 282 */
AdamGreen 0:5ea6e74c35f7 283 class FlashFileSystem : public FileSystemLike
AdamGreen 0:5ea6e74c35f7 284 {
AdamGreen 0:5ea6e74c35f7 285 public:
frankvnk 2:ca35ecd2fae6 286 FlashFileSystem(const char* pName, const uint8_t *pFlashDrive = NULL, const uint32_t FlashSize = 512);
AdamGreen 0:5ea6e74c35f7 287
AdamGreen 0:5ea6e74c35f7 288 virtual FileHandle* open(const char* pFilename, int Flags);
AdamGreen 0:5ea6e74c35f7 289 virtual DirHandle* opendir(const char *pDirectoryName);
AdamGreen 0:5ea6e74c35f7 290
AdamGreen 0:5ea6e74c35f7 291 virtual int IsMounted() { return (m_FileCount != 0); }
AdamGreen 0:5ea6e74c35f7 292
AdamGreen 0:5ea6e74c35f7 293 protected:
AdamGreen 0:5ea6e74c35f7 294 FlashFileSystemFileHandle* FindFreeFileHandle();
AdamGreen 0:5ea6e74c35f7 295 FlashFileSystemDirHandle* FindFreeDirHandle();
AdamGreen 0:5ea6e74c35f7 296
AdamGreen 0:5ea6e74c35f7 297 // File handle table used by this file system so that it doesn't need
AdamGreen 0:5ea6e74c35f7 298 // to dynamically allocate file handles at runtime.
AdamGreen 0:5ea6e74c35f7 299 FlashFileSystemFileHandle m_FileHandles[16];
AdamGreen 0:5ea6e74c35f7 300 // Directory handle table used by this file system so that it doesn't need
AdamGreen 0:5ea6e74c35f7 301 // to dynamically allocate file handles at runtime.
AdamGreen 0:5ea6e74c35f7 302 FlashFileSystemDirHandle m_DirHandles[16];
AdamGreen 0:5ea6e74c35f7 303 // Pointer to where the file system image is located in the device's FLASH.
AdamGreen 0:5ea6e74c35f7 304 const char* m_pFLASHBase;
AdamGreen 0:5ea6e74c35f7 305 // Pointer to where the file entries are located in the device's FLASH.
AdamGreen 0:5ea6e74c35f7 306 const _SFileSystemEntry* m_pFileEntries;
AdamGreen 0:5ea6e74c35f7 307 // The number of files in the file system image.
AdamGreen 0:5ea6e74c35f7 308 unsigned int m_FileCount;
AdamGreen 0:5ea6e74c35f7 309 };
AdamGreen 0:5ea6e74c35f7 310
AdamGreen 0:5ea6e74c35f7 311 #endif // _FLASHFILESYSTEM_H_