Revised to support ability to have both SD and USB drives mounted.

Dependents:   Multi-FileSystem Multi-FileSystem

Fork of FATFileSystem by mbed official

Committer:
WiredHome
Date:
Sat Jul 29 12:39:03 2017 +0000
Revision:
12:d816f503fc6f
Parent:
11:2f7ad4af3ec1
Reduce the number of sectors definition

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 3:e960e2b81a3c 1 /* mbed Microcontroller Library - MemFileSystem
screamer 3:e960e2b81a3c 2 * Copyright (c) 2008, sford
screamer 3:e960e2b81a3c 3 */
screamer 3:e960e2b81a3c 4
screamer 3:e960e2b81a3c 5
screamer 3:e960e2b81a3c 6 #ifndef MBED_MEMFILESYSTEM_H
screamer 3:e960e2b81a3c 7 #define MBED_MEMFILESYSTEM_H
screamer 3:e960e2b81a3c 8
screamer 3:e960e2b81a3c 9 #include "FATFileSystem.h"
screamer 3:e960e2b81a3c 10
WiredHome 11:2f7ad4af3ec1 11 // 4 Bytes / Sector, each 512 Bytes - malloc'd as required
WiredHome 11:2f7ad4af3ec1 12 // Value was 2000 (8K)
WiredHome 12:d816f503fc6f 13 #define NUM_SECTORS 100
WiredHome 11:2f7ad4af3ec1 14 #define SECTOR_SIZE 512
WiredHome 11:2f7ad4af3ec1 15
WiredHome 11:2f7ad4af3ec1 16 // moved the zeroed RAM buffer to flash,
WiredHome 11:2f7ad4af3ec1 17 // so it doesn't waste precious RAM
WiredHome 11:2f7ad4af3ec1 18 static const char zero[SECTOR_SIZE] = {0};
WiredHome 11:2f7ad4af3ec1 19
screamer 3:e960e2b81a3c 20 namespace mbed
screamer 3:e960e2b81a3c 21 {
screamer 3:e960e2b81a3c 22 class MemFileSystem : public FATFileSystem
screamer 3:e960e2b81a3c 23 {
screamer 3:e960e2b81a3c 24 public:
WiredHome 11:2f7ad4af3ec1 25 // NUM_SECTORS sectors, each 512 bytes (malloced as required)
WiredHome 11:2f7ad4af3ec1 26 char *sectors[NUM_SECTORS];
screamer 3:e960e2b81a3c 27
screamer 3:e960e2b81a3c 28 MemFileSystem(const char* name) : FATFileSystem(name) {
screamer 3:e960e2b81a3c 29 memset(sectors, 0, sizeof(sectors));
screamer 3:e960e2b81a3c 30 }
WiredHome 11:2f7ad4af3ec1 31
screamer 3:e960e2b81a3c 32 virtual ~MemFileSystem() {
WiredHome 11:2f7ad4af3ec1 33 for(int i = 0; i < NUM_SECTORS; i++) {
screamer 3:e960e2b81a3c 34 if(sectors[i]) {
screamer 3:e960e2b81a3c 35 free(sectors[i]);
screamer 3:e960e2b81a3c 36 }
screamer 3:e960e2b81a3c 37 }
screamer 3:e960e2b81a3c 38 }
WiredHome 11:2f7ad4af3ec1 39
screamer 3:e960e2b81a3c 40 // read a sector in to the buffer, return 0 if ok
screamer 3:e960e2b81a3c 41 virtual int disk_read(char *buffer, int sector) {
screamer 3:e960e2b81a3c 42 if(sectors[sector] == 0) {
screamer 3:e960e2b81a3c 43 // nothing allocated means sector is empty
WiredHome 11:2f7ad4af3ec1 44 memset(buffer, 0, SECTOR_SIZE);
screamer 3:e960e2b81a3c 45 } else {
WiredHome 11:2f7ad4af3ec1 46 memcpy(buffer, sectors[sector], SECTOR_SIZE);
screamer 3:e960e2b81a3c 47 }
screamer 3:e960e2b81a3c 48 return 0;
screamer 3:e960e2b81a3c 49 }
WiredHome 11:2f7ad4af3ec1 50
screamer 3:e960e2b81a3c 51 // write a sector from the buffer, return 0 if ok
screamer 3:e960e2b81a3c 52 virtual int disk_write(const char *buffer, int sector) {
screamer 3:e960e2b81a3c 53 // if buffer is zero deallocate sector
WiredHome 11:2f7ad4af3ec1 54 //char zero[SECTOR_SIZE] = {0}; // DS this used to be a ram buffer
WiredHome 11:2f7ad4af3ec1 55 //memset(zero, 0, SECTOR_SIZE);
WiredHome 11:2f7ad4af3ec1 56 if(memcmp(zero, buffer, SECTOR_SIZE)==0) {
screamer 3:e960e2b81a3c 57 if(sectors[sector] != 0) {
screamer 3:e960e2b81a3c 58 free(sectors[sector]);
screamer 3:e960e2b81a3c 59 sectors[sector] = 0;
screamer 3:e960e2b81a3c 60 }
screamer 3:e960e2b81a3c 61 return 0;
screamer 3:e960e2b81a3c 62 }
screamer 3:e960e2b81a3c 63 // else allocate a sector if needed, and write
screamer 3:e960e2b81a3c 64 if(sectors[sector] == 0) {
WiredHome 11:2f7ad4af3ec1 65 char *sec = (char*)malloc(SECTOR_SIZE);
screamer 3:e960e2b81a3c 66 if(sec==0) {
screamer 3:e960e2b81a3c 67 return 1; // out of memory
screamer 3:e960e2b81a3c 68 }
screamer 3:e960e2b81a3c 69 sectors[sector] = sec;
screamer 3:e960e2b81a3c 70 }
WiredHome 11:2f7ad4af3ec1 71 memcpy(sectors[sector], buffer, SECTOR_SIZE);
screamer 3:e960e2b81a3c 72 return 0;
screamer 3:e960e2b81a3c 73 }
WiredHome 11:2f7ad4af3ec1 74
screamer 3:e960e2b81a3c 75 // return the number of sectors
screamer 3:e960e2b81a3c 76 virtual int disk_sectors() {
screamer 3:e960e2b81a3c 77 return sizeof(sectors)/sizeof(sectors[0]);
screamer 3:e960e2b81a3c 78 }
screamer 3:e960e2b81a3c 79 };
screamer 3:e960e2b81a3c 80 }
screamer 3:e960e2b81a3c 81
screamer 3:e960e2b81a3c 82 #endif