Example of using the SDFileSystem library on a K64F to write data to files and also read data into dynamically created arrays.

Dependencies:   mbed

Committer:
eencae
Date:
Mon Feb 03 12:06:21 2020 +0000
Revision:
1:caceb9d9d17a
Updated Mbed library. Removed serial. Confirmed working Jan 2020.

Who changed what in which revision?

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