A re-written SDFileSystem library with improved compatibility, CRC support, and card removal/replacement support.

Dependencies:   FATFileSystem

Dependents:   xadow_m0_SD_Hello roam_v1 roam_v2 Polytech_tours ... more

Committer:
neilt6
Date:
Mon Aug 18 15:09:52 2014 +0000
Revision:
13:635147efa748
Parent:
11:67ddc53e3983
Significant performance improvements with better busy wait logic

Who changed what in which revision?

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