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:
AdamGreen
Date:
Fri Jul 29 01:23:53 2011 +0000
Revision:
0:5ea6e74c35f7
Child:
1:a3cb118c4f6e
Initial version of FLASH File System

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdamGreen 0:5ea6e74c35f7 1 /*
AdamGreen 0:5ea6e74c35f7 2 Copyright (c) 2011 Adam Green http://mbed.org/users/AdamGreen/
AdamGreen 0:5ea6e74c35f7 3
AdamGreen 0:5ea6e74c35f7 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AdamGreen 0:5ea6e74c35f7 5 of this software and associated documentation files (the "Software"), to deal
AdamGreen 0:5ea6e74c35f7 6 in the Software without restriction, including without limitation the rights
AdamGreen 0:5ea6e74c35f7 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AdamGreen 0:5ea6e74c35f7 8 copies of the Software, and to permit persons to whom the Software is
AdamGreen 0:5ea6e74c35f7 9 furnished to do so, subject to the following conditions:
AdamGreen 0:5ea6e74c35f7 10
AdamGreen 0:5ea6e74c35f7 11 The above copyright notice and this permission notice shall be included in
AdamGreen 0:5ea6e74c35f7 12 all copies or substantial portions of the Software.
AdamGreen 0:5ea6e74c35f7 13
AdamGreen 0:5ea6e74c35f7 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AdamGreen 0:5ea6e74c35f7 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AdamGreen 0:5ea6e74c35f7 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AdamGreen 0:5ea6e74c35f7 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AdamGreen 0:5ea6e74c35f7 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AdamGreen 0:5ea6e74c35f7 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AdamGreen 0:5ea6e74c35f7 20 THE SOFTWARE.
AdamGreen 0:5ea6e74c35f7 21 */
AdamGreen 0:5ea6e74c35f7 22 /* Specifies the classes used to implement the FlashFileSystem which is a
AdamGreen 0:5ea6e74c35f7 23 read-only file system that exists in the internal FLASH of the mbed
AdamGreen 0:5ea6e74c35f7 24 device.
AdamGreen 0:5ea6e74c35f7 25 */
AdamGreen 0:5ea6e74c35f7 26 #ifndef _FLASHFILESYSTEM_H_
AdamGreen 0:5ea6e74c35f7 27 #define _FLASHFILESYSTEM_H_
AdamGreen 0:5ea6e74c35f7 28
AdamGreen 0:5ea6e74c35f7 29 #include "FileSystemLike.h"
AdamGreen 0:5ea6e74c35f7 30
AdamGreen 0:5ea6e74c35f7 31
AdamGreen 0:5ea6e74c35f7 32 // Forward declare file system entry structure used internally in
AdamGreen 0:5ea6e74c35f7 33 // FlashFileSystem.
AdamGreen 0:5ea6e74c35f7 34 struct _SFileSystemEntry;
AdamGreen 0:5ea6e74c35f7 35
AdamGreen 0:5ea6e74c35f7 36
AdamGreen 0:5ea6e74c35f7 37
AdamGreen 0:5ea6e74c35f7 38 // Represents an opened file object in the FlashFileSystem.
AdamGreen 0:5ea6e74c35f7 39 class FlashFileSystemFileHandle : public FileHandle
AdamGreen 0:5ea6e74c35f7 40 {
AdamGreen 0:5ea6e74c35f7 41 public:
AdamGreen 0:5ea6e74c35f7 42 FlashFileSystemFileHandle();
AdamGreen 0:5ea6e74c35f7 43 FlashFileSystemFileHandle(const char* pFileStart, const char* pFileEnd);
AdamGreen 0:5ea6e74c35f7 44
AdamGreen 0:5ea6e74c35f7 45 // FileHandle interface methods.
AdamGreen 0:5ea6e74c35f7 46 virtual ssize_t write(const void* buffer, size_t length);
AdamGreen 0:5ea6e74c35f7 47 virtual int close();
AdamGreen 0:5ea6e74c35f7 48 virtual ssize_t read(void* buffer, size_t length);
AdamGreen 0:5ea6e74c35f7 49 virtual int isatty();
AdamGreen 0:5ea6e74c35f7 50 virtual off_t lseek(off_t offset, int whence);
AdamGreen 0:5ea6e74c35f7 51 virtual int fsync();
AdamGreen 0:5ea6e74c35f7 52 virtual off_t flen();
AdamGreen 0:5ea6e74c35f7 53
AdamGreen 0:5ea6e74c35f7 54 // Used by FlashFileSystem to maintain entries in its handle table.
AdamGreen 0:5ea6e74c35f7 55 void SetEntry(const char* pFileStart, const char* pFileEnd)
AdamGreen 0:5ea6e74c35f7 56 {
AdamGreen 0:5ea6e74c35f7 57 m_pFileStart = pFileStart;
AdamGreen 0:5ea6e74c35f7 58 m_pFileEnd = pFileEnd;
AdamGreen 0:5ea6e74c35f7 59 m_pCurr = pFileStart;
AdamGreen 0:5ea6e74c35f7 60 }
AdamGreen 0:5ea6e74c35f7 61 int IsClosed()
AdamGreen 0:5ea6e74c35f7 62 {
AdamGreen 0:5ea6e74c35f7 63 return (NULL == m_pFileStart);
AdamGreen 0:5ea6e74c35f7 64 }
AdamGreen 0:5ea6e74c35f7 65
AdamGreen 0:5ea6e74c35f7 66 protected:
AdamGreen 0:5ea6e74c35f7 67 // Beginning offset of file in FLASH memory.
AdamGreen 0:5ea6e74c35f7 68 const char* m_pFileStart;
AdamGreen 0:5ea6e74c35f7 69 // Ending offset of file in FLASH memory.
AdamGreen 0:5ea6e74c35f7 70 const char* m_pFileEnd;
AdamGreen 0:5ea6e74c35f7 71 // Current position in file to be updated by read and seek operations.
AdamGreen 0:5ea6e74c35f7 72 const char* m_pCurr;
AdamGreen 0:5ea6e74c35f7 73 };
AdamGreen 0:5ea6e74c35f7 74
AdamGreen 0:5ea6e74c35f7 75
AdamGreen 0:5ea6e74c35f7 76 // Represents an open directory in the FlashFileSystem.
AdamGreen 0:5ea6e74c35f7 77 class FlashFileSystemDirHandle : public DirHandle
AdamGreen 0:5ea6e74c35f7 78 {
AdamGreen 0:5ea6e74c35f7 79 public:
AdamGreen 0:5ea6e74c35f7 80 // Constructors
AdamGreen 0:5ea6e74c35f7 81 FlashFileSystemDirHandle();
AdamGreen 0:5ea6e74c35f7 82 FlashFileSystemDirHandle(const char* pFLASHBase,
AdamGreen 0:5ea6e74c35f7 83 const _SFileSystemEntry* pFirstFileEntry,
AdamGreen 0:5ea6e74c35f7 84 unsigned int FileEntriesLeft,
AdamGreen 0:5ea6e74c35f7 85 unsigned int DirectoryNameLength);
AdamGreen 0:5ea6e74c35f7 86
AdamGreen 0:5ea6e74c35f7 87 // Used by FlashFileSystem to maintain DirHandle entries in its cache.
AdamGreen 0:5ea6e74c35f7 88 void SetEntry(const char* pFLASHBase,
AdamGreen 0:5ea6e74c35f7 89 const _SFileSystemEntry* pFirstFileEntry,
AdamGreen 0:5ea6e74c35f7 90 unsigned int FileEntriesLeft,
AdamGreen 0:5ea6e74c35f7 91 unsigned int DirectoryNameLength)
AdamGreen 0:5ea6e74c35f7 92 {
AdamGreen 0:5ea6e74c35f7 93 m_pFLASHBase = pFLASHBase;
AdamGreen 0:5ea6e74c35f7 94 m_pFirstFileEntry = pFirstFileEntry;
AdamGreen 0:5ea6e74c35f7 95 m_pCurrentFileEntry = pFirstFileEntry;
AdamGreen 0:5ea6e74c35f7 96 m_FileEntriesLeft = FileEntriesLeft;
AdamGreen 0:5ea6e74c35f7 97 m_DirectoryNameLength = DirectoryNameLength;
AdamGreen 0:5ea6e74c35f7 98 }
AdamGreen 0:5ea6e74c35f7 99 int IsClosed()
AdamGreen 0:5ea6e74c35f7 100 {
AdamGreen 0:5ea6e74c35f7 101 return (NULL == m_pFirstFileEntry);
AdamGreen 0:5ea6e74c35f7 102 }
AdamGreen 0:5ea6e74c35f7 103
AdamGreen 0:5ea6e74c35f7 104 // Methods defined by DirHandle interface.
AdamGreen 0:5ea6e74c35f7 105 virtual int closedir();
AdamGreen 0:5ea6e74c35f7 106 virtual struct dirent *readdir();
AdamGreen 0:5ea6e74c35f7 107 virtual void rewinddir();
AdamGreen 0:5ea6e74c35f7 108 virtual off_t telldir();
AdamGreen 0:5ea6e74c35f7 109 virtual void seekdir(off_t location);
AdamGreen 0:5ea6e74c35f7 110
AdamGreen 0:5ea6e74c35f7 111 protected:
AdamGreen 0:5ea6e74c35f7 112 // The first file entry for this directory. rewinddir() takes the
AdamGreen 0:5ea6e74c35f7 113 // iterator back to here.
AdamGreen 0:5ea6e74c35f7 114 const _SFileSystemEntry* m_pFirstFileEntry;
AdamGreen 0:5ea6e74c35f7 115 // The next file entry to be returned for this directory enumeration.
AdamGreen 0:5ea6e74c35f7 116 const _SFileSystemEntry* m_pCurrentFileEntry;
AdamGreen 0:5ea6e74c35f7 117 // Pointer to where the file system image is located in the device's FLASH.
AdamGreen 0:5ea6e74c35f7 118 const char* m_pFLASHBase;
AdamGreen 0:5ea6e74c35f7 119 // Contents of previously return directory entry structure.
AdamGreen 0:5ea6e74c35f7 120 struct dirent m_DirectoryEntry;
AdamGreen 0:5ea6e74c35f7 121 // This is the length of the directory name which was opened. When the
AdamGreen 0:5ea6e74c35f7 122 // first m_DirectoryNameLength characters change then we have iterated
AdamGreen 0:5ea6e74c35f7 123 // through to a different directory.
AdamGreen 0:5ea6e74c35f7 124 unsigned int m_DirectoryNameLength;
AdamGreen 0:5ea6e74c35f7 125 // The number of entries left in the file system file entries array.
AdamGreen 0:5ea6e74c35f7 126 unsigned int m_FileEntriesLeft;
AdamGreen 0:5ea6e74c35f7 127 };
AdamGreen 0:5ea6e74c35f7 128
AdamGreen 0:5ea6e74c35f7 129
AdamGreen 0:5ea6e74c35f7 130
AdamGreen 0:5ea6e74c35f7 131 /** A filesystem for accessing a read-only file system placed in the internal
AdamGreen 0:5ea6e74c35f7 132 * FLASH memory of the NXP chip on the mbed board.
AdamGreen 0:5ea6e74c35f7 133 *
AdamGreen 0:5ea6e74c35f7 134 * The file system to be mounted by this file system should be created through
AdamGreen 0:5ea6e74c35f7 135 * the use of the fsbld utility on the PC and the resulting file system image
AdamGreen 0:5ea6e74c35f7 136 * concatentated to the end of the .bin file created by the mbed online
AdamGreen 0:5ea6e74c35f7 137 * compiler before uploading to the mbed device.
AdamGreen 0:5ea6e74c35f7 138 *
AdamGreen 0:5ea6e74c35f7 139 * NOTE: This file system is case-sensitive. Calling fopen("/flash/INDEX.html")
AdamGreen 0:5ea6e74c35f7 140 * won't successfully open a file named index.html in the root directory
AdamGreen 0:5ea6e74c35f7 141 * of the flash file system.
AdamGreen 0:5ea6e74c35f7 142 *
AdamGreen 0:5ea6e74c35f7 143 * Example:
AdamGreen 0:5ea6e74c35f7 144 * @code
AdamGreen 0:5ea6e74c35f7 145 #include <mbed.h>
AdamGreen 0:5ea6e74c35f7 146 #include "FlashFileSystem.h"
AdamGreen 0:5ea6e74c35f7 147
AdamGreen 0:5ea6e74c35f7 148 static void _RecursiveDir(const char* pDirectoryName, DIR* pDirectory = NULL)
AdamGreen 0:5ea6e74c35f7 149 {
AdamGreen 0:5ea6e74c35f7 150 DIR* pFreeDirectory = NULL;
AdamGreen 0:5ea6e74c35f7 151
AdamGreen 0:5ea6e74c35f7 152 size_t DirectoryNameLength = strlen(pDirectoryName);
AdamGreen 0:5ea6e74c35f7 153
AdamGreen 0:5ea6e74c35f7 154 // Open the specified directory.
AdamGreen 0:5ea6e74c35f7 155 if (!pDirectory)
AdamGreen 0:5ea6e74c35f7 156 {
AdamGreen 0:5ea6e74c35f7 157 pDirectory = opendir(pDirectoryName);
AdamGreen 0:5ea6e74c35f7 158 if (!pDirectory)
AdamGreen 0:5ea6e74c35f7 159 {
AdamGreen 0:5ea6e74c35f7 160 error("Failed to open directory '%s' for enumeration.\r\n",
AdamGreen 0:5ea6e74c35f7 161 pDirectoryName);
AdamGreen 0:5ea6e74c35f7 162 }
AdamGreen 0:5ea6e74c35f7 163
AdamGreen 0:5ea6e74c35f7 164 // Remember to free this directory enumerator.
AdamGreen 0:5ea6e74c35f7 165 pFreeDirectory = pDirectory;
AdamGreen 0:5ea6e74c35f7 166 }
AdamGreen 0:5ea6e74c35f7 167
AdamGreen 0:5ea6e74c35f7 168 // Determine if we should remove a trailing slash from future *printf()
AdamGreen 0:5ea6e74c35f7 169 // calls.
AdamGreen 0:5ea6e74c35f7 170 if (DirectoryNameLength && '/' == pDirectoryName[DirectoryNameLength-1])
AdamGreen 0:5ea6e74c35f7 171 {
AdamGreen 0:5ea6e74c35f7 172 DirectoryNameLength--;
AdamGreen 0:5ea6e74c35f7 173 }
AdamGreen 0:5ea6e74c35f7 174
AdamGreen 0:5ea6e74c35f7 175 // Iterate though each item contained within this directory and display
AdamGreen 0:5ea6e74c35f7 176 // it to the console.
AdamGreen 0:5ea6e74c35f7 177 struct dirent* DirEntry;
AdamGreen 0:5ea6e74c35f7 178 while((DirEntry = readdir(pDirectory)) != NULL)
AdamGreen 0:5ea6e74c35f7 179 {
AdamGreen 0:5ea6e74c35f7 180 char RecurseDirectoryName[256];
AdamGreen 0:5ea6e74c35f7 181 DIR* pSubdirectory;
AdamGreen 0:5ea6e74c35f7 182
AdamGreen 0:5ea6e74c35f7 183 // Try opening this file as a directory to see if it succeeds or not.
AdamGreen 0:5ea6e74c35f7 184 snprintf(RecurseDirectoryName, sizeof(RecurseDirectoryName),
AdamGreen 0:5ea6e74c35f7 185 "%.*s/%s",
AdamGreen 0:5ea6e74c35f7 186 DirectoryNameLength,
AdamGreen 0:5ea6e74c35f7 187 pDirectoryName,
AdamGreen 0:5ea6e74c35f7 188 DirEntry->d_name);
AdamGreen 0:5ea6e74c35f7 189 pSubdirectory = opendir(RecurseDirectoryName);
AdamGreen 0:5ea6e74c35f7 190
AdamGreen 0:5ea6e74c35f7 191 if (pSubdirectory)
AdamGreen 0:5ea6e74c35f7 192 {
AdamGreen 0:5ea6e74c35f7 193 _RecursiveDir(RecurseDirectoryName, pSubdirectory);
AdamGreen 0:5ea6e74c35f7 194 closedir(pSubdirectory);
AdamGreen 0:5ea6e74c35f7 195 }
AdamGreen 0:5ea6e74c35f7 196 else
AdamGreen 0:5ea6e74c35f7 197 {
AdamGreen 0:5ea6e74c35f7 198 printf(" %.*s/%s\n",
AdamGreen 0:5ea6e74c35f7 199 DirectoryNameLength,
AdamGreen 0:5ea6e74c35f7 200 pDirectoryName,
AdamGreen 0:5ea6e74c35f7 201 DirEntry->d_name);
AdamGreen 0:5ea6e74c35f7 202 }
AdamGreen 0:5ea6e74c35f7 203 }
AdamGreen 0:5ea6e74c35f7 204
AdamGreen 0:5ea6e74c35f7 205 // Close the directory enumerator if it was opened by this call.
AdamGreen 0:5ea6e74c35f7 206 if (pFreeDirectory)
AdamGreen 0:5ea6e74c35f7 207 {
AdamGreen 0:5ea6e74c35f7 208 closedir(pFreeDirectory);
AdamGreen 0:5ea6e74c35f7 209 }
AdamGreen 0:5ea6e74c35f7 210 }
AdamGreen 0:5ea6e74c35f7 211
AdamGreen 0:5ea6e74c35f7 212 int main()
AdamGreen 0:5ea6e74c35f7 213 {
AdamGreen 0:5ea6e74c35f7 214 static const char* Filename = "/flash/index.html";
AdamGreen 0:5ea6e74c35f7 215 char* ReadResult = NULL;
AdamGreen 0:5ea6e74c35f7 216 int SeekResult = -1;
AdamGreen 0:5ea6e74c35f7 217 char Buffer[128];
AdamGreen 0:5ea6e74c35f7 218
AdamGreen 0:5ea6e74c35f7 219 // Create the file system under the name "flash".
AdamGreen 0:5ea6e74c35f7 220 static FlashFileSystem flash("flash");
AdamGreen 0:5ea6e74c35f7 221 if (!flash.IsMounted())
AdamGreen 0:5ea6e74c35f7 222 {
AdamGreen 0:5ea6e74c35f7 223 error("Failed to mount FlashFileSystem.\r\n");
AdamGreen 0:5ea6e74c35f7 224 }
AdamGreen 0:5ea6e74c35f7 225
AdamGreen 0:5ea6e74c35f7 226 // Open "index.html" on the file system for reading.
AdamGreen 0:5ea6e74c35f7 227 FILE *fp = fopen(Filename, "r");
AdamGreen 0:5ea6e74c35f7 228 if (NULL == fp)
AdamGreen 0:5ea6e74c35f7 229 {
AdamGreen 0:5ea6e74c35f7 230 error("Failed to open %s\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 231 }
AdamGreen 0:5ea6e74c35f7 232
AdamGreen 0:5ea6e74c35f7 233 // Use seek to determine the length of the file
AdamGreen 0:5ea6e74c35f7 234 SeekResult = fseek(fp, 0, SEEK_END);
AdamGreen 0:5ea6e74c35f7 235 if (SeekResult)
AdamGreen 0:5ea6e74c35f7 236 {
AdamGreen 0:5ea6e74c35f7 237 error("Failed to seek to end of %s.\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 238 }
AdamGreen 0:5ea6e74c35f7 239 long FileLength = ftell(fp);
AdamGreen 0:5ea6e74c35f7 240 printf("%s is %ld bytes in length.\r\n", Filename, FileLength);
AdamGreen 0:5ea6e74c35f7 241
AdamGreen 0:5ea6e74c35f7 242 // Reset the file pointer to the beginning of the file
AdamGreen 0:5ea6e74c35f7 243 SeekResult = fseek(fp, 0, SEEK_SET);
AdamGreen 0:5ea6e74c35f7 244 if (SeekResult)
AdamGreen 0:5ea6e74c35f7 245 {
AdamGreen 0:5ea6e74c35f7 246 error("Failed to seek to beginning of %s.\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 247 }
AdamGreen 0:5ea6e74c35f7 248
AdamGreen 0:5ea6e74c35f7 249 // Read the first line into Buffer and then display to user.
AdamGreen 0:5ea6e74c35f7 250 ReadResult = fgets(Buffer, sizeof(Buffer)/sizeof(Buffer[0]), fp);
AdamGreen 0:5ea6e74c35f7 251 if (NULL == ReadResult)
AdamGreen 0:5ea6e74c35f7 252 {
AdamGreen 0:5ea6e74c35f7 253 error("Failed to read first line of %s.\r\n", Filename);
AdamGreen 0:5ea6e74c35f7 254 }
AdamGreen 0:5ea6e74c35f7 255 printf("%s:1 %s", Filename, Buffer);
AdamGreen 0:5ea6e74c35f7 256
AdamGreen 0:5ea6e74c35f7 257 // Done with the file so close it.
AdamGreen 0:5ea6e74c35f7 258 fclose(fp);
AdamGreen 0:5ea6e74c35f7 259
AdamGreen 0:5ea6e74c35f7 260 // Enumerate all content on mounted file systems.
AdamGreen 0:5ea6e74c35f7 261 printf("\r\nList all files in /flash...\r\n");
AdamGreen 0:5ea6e74c35f7 262 _RecursiveDir("/flash");
AdamGreen 0:5ea6e74c35f7 263
AdamGreen 0:5ea6e74c35f7 264 printf("\r\nFlashFileSystem example has completed.\r\n");
AdamGreen 0:5ea6e74c35f7 265 }
AdamGreen 0:5ea6e74c35f7 266 * @endcode
AdamGreen 0:5ea6e74c35f7 267 */
AdamGreen 0:5ea6e74c35f7 268 class FlashFileSystem : public FileSystemLike
AdamGreen 0:5ea6e74c35f7 269 {
AdamGreen 0:5ea6e74c35f7 270 public:
AdamGreen 0:5ea6e74c35f7 271 FlashFileSystem(const char* pName);
AdamGreen 0:5ea6e74c35f7 272
AdamGreen 0:5ea6e74c35f7 273 virtual FileHandle* open(const char* pFilename, int Flags);
AdamGreen 0:5ea6e74c35f7 274 virtual DirHandle* opendir(const char *pDirectoryName);
AdamGreen 0:5ea6e74c35f7 275
AdamGreen 0:5ea6e74c35f7 276 virtual int IsMounted() { return (m_FileCount != 0); }
AdamGreen 0:5ea6e74c35f7 277
AdamGreen 0:5ea6e74c35f7 278 protected:
AdamGreen 0:5ea6e74c35f7 279 FlashFileSystemFileHandle* FindFreeFileHandle();
AdamGreen 0:5ea6e74c35f7 280 FlashFileSystemDirHandle* FindFreeDirHandle();
AdamGreen 0:5ea6e74c35f7 281
AdamGreen 0:5ea6e74c35f7 282 // File handle table used by this file system so that it doesn't need
AdamGreen 0:5ea6e74c35f7 283 // to dynamically allocate file handles at runtime.
AdamGreen 0:5ea6e74c35f7 284 FlashFileSystemFileHandle m_FileHandles[16];
AdamGreen 0:5ea6e74c35f7 285 // Directory handle table used by this file system so that it doesn't need
AdamGreen 0:5ea6e74c35f7 286 // to dynamically allocate file handles at runtime.
AdamGreen 0:5ea6e74c35f7 287 FlashFileSystemDirHandle m_DirHandles[16];
AdamGreen 0:5ea6e74c35f7 288 // Pointer to where the file system image is located in the device's FLASH.
AdamGreen 0:5ea6e74c35f7 289 const char* m_pFLASHBase;
AdamGreen 0:5ea6e74c35f7 290 // Pointer to where the file entries are located in the device's FLASH.
AdamGreen 0:5ea6e74c35f7 291 const _SFileSystemEntry* m_pFileEntries;
AdamGreen 0:5ea6e74c35f7 292 // The number of files in the file system image.
AdamGreen 0:5ea6e74c35f7 293 unsigned int m_FileCount;
AdamGreen 0:5ea6e74c35f7 294 };
AdamGreen 0:5ea6e74c35f7 295
AdamGreen 0:5ea6e74c35f7 296 #endif // _FLASHFILESYSTEM_H_