Demo to read and write to both SD and USB File System

Dependencies:   mbed

Example (more detailed example in the main.cpp file):

#include "mbed.h"
#include "MSCFileSystem.h"
#include "SDFileSystem.h"

MSCFileSystem fs("fs");
SDFileSystem sd(p5, p6, p7, p8, "sd", p11, SDFileSystem::SWITCH_NEG_NO, 15000000);


// CAUTION: Return values should ALWAYS be checked. Not shown here for brevity.

int main() {
...
    FileHandle * sdfile = sd.open("test.txt", O_WRONLY | O_CREAT | O_TRUNC);
    sdfile->write("hello", 6);
    sdfile->close();
...

    FILE * file = fopen("nextest.txt", "w");
    fwrite(buffer, 1, sizeof(buffer), file);
    fclose(file);
...
    mkdir("/sd/sd_dir", 0777);
    mkdir("/fs/fs_dir", 0777);

    remove("/sd/sdfinal.log");
    rename("/sd/sdfinal.txt", "/sd/sdfinal.log");
...
}
Committer:
WiredHome
Date:
Sun Mar 13 19:21:46 2016 +0000
Revision:
6:ea80c5a132b6
Parent:
4:be096a44f789
Example using Multi-FileSystem (which permits access to a USB Flash and an SD card from one application).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 4:be096a44f789 1 ///
WiredHome 4:be096a44f789 2 /// MultiFileSystem
WiredHome 4:be096a44f789 3 ///
WiredHome 6:ea80c5a132b6 4 /// This supports both USB and SD File systems both being mounted at the same time.
WiredHome 4:be096a44f789 5 ///
WiredHome 6:ea80c5a132b6 6 /// Untested:
WiredHome 6:ea80c5a132b6 7 /// * live plug/unplug of either/both
WiredHome 6:ea80c5a132b6 8 /// * Concurrent access (e.g. copy from one to the other).
WiredHome 4:be096a44f789 9 ///
chris 2:c887cf1c3ed9 10 #include "mbed.h"
chris 2:c887cf1c3ed9 11 #include "MSCFileSystem.h"
WiredHome 3:a72f30142261 12 #include "SDFileSystem.h"
WiredHome 3:a72f30142261 13
chris 2:c887cf1c3ed9 14 MSCFileSystem fs("fs");
WiredHome 3:a72f30142261 15 SDFileSystem sd(p5, p6, p7, p8, "sd", p11, SDFileSystem::SWITCH_NEG_NO, 15000000);
WiredHome 3:a72f30142261 16
WiredHome 3:a72f30142261 17 Timer timer;
WiredHome 3:a72f30142261 18
WiredHome 6:ea80c5a132b6 19 char buffer[4096]; // someplace to stuff random data.
WiredHome 3:a72f30142261 20 #define TESTSIZE 1048576
WiredHome 3:a72f30142261 21 //#define TESTSIZE 100
WiredHome 3:a72f30142261 22
WiredHome 6:ea80c5a132b6 23
WiredHome 6:ea80c5a132b6 24
WiredHome 6:ea80c5a132b6 25 void SDWriteTest(const char * fname)
WiredHome 3:a72f30142261 26 {
WiredHome 6:ea80c5a132b6 27 printf("\r\n");
WiredHome 6:ea80c5a132b6 28 printf("SDWriteTest : writing %d B using %d B buffer into %s...\r\n", TESTSIZE, sizeof(buffer), fname);
WiredHome 3:a72f30142261 29 FileHandle* file = sd.open(fname, O_WRONLY | O_CREAT | O_TRUNC);
WiredHome 3:a72f30142261 30 if (file != NULL) {
WiredHome 3:a72f30142261 31 timer.start();
WiredHome 3:a72f30142261 32 for (int i = 0; i < (TESTSIZE / sizeof(buffer)); i++) {
WiredHome 3:a72f30142261 33 if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
WiredHome 3:a72f30142261 34 timer.stop();
WiredHome 3:a72f30142261 35 printf(" write error!\r\n");
WiredHome 3:a72f30142261 36 timer.reset();
WiredHome 3:a72f30142261 37 return;
WiredHome 3:a72f30142261 38 }
WiredHome 3:a72f30142261 39 }
WiredHome 3:a72f30142261 40 timer.stop();
WiredHome 3:a72f30142261 41 if (file->close())
WiredHome 3:a72f30142261 42 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 43 else
WiredHome 6:ea80c5a132b6 44 printf(" Result: %.2f KB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 45 timer.reset();
WiredHome 3:a72f30142261 46 } else {
WiredHome 3:a72f30142261 47 printf(" failed to create file!\r\n");
WiredHome 3:a72f30142261 48 }
WiredHome 3:a72f30142261 49 }
WiredHome 3:a72f30142261 50
WiredHome 6:ea80c5a132b6 51 void SDReadTest(const char * fname)
WiredHome 3:a72f30142261 52 {
WiredHome 6:ea80c5a132b6 53 printf("\r\n");
WiredHome 6:ea80c5a132b6 54 printf("SDReadTest : reading %d B using %d B buffer from %s...\r\n", TESTSIZE, sizeof(buffer), fname);
WiredHome 3:a72f30142261 55 FileHandle* file = sd.open(fname, O_RDONLY);
WiredHome 3:a72f30142261 56 if (file != NULL) {
WiredHome 3:a72f30142261 57 timer.start();
WiredHome 3:a72f30142261 58 int iterations = 0;
WiredHome 3:a72f30142261 59 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer))
WiredHome 3:a72f30142261 60 iterations++;
WiredHome 3:a72f30142261 61 timer.stop();
WiredHome 3:a72f30142261 62 if (iterations != (TESTSIZE / sizeof(buffer)))
WiredHome 3:a72f30142261 63 printf(" read error!\r\n");
WiredHome 3:a72f30142261 64 else if (file->close())
WiredHome 3:a72f30142261 65 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 66 else if (sd.remove(fname))
WiredHome 3:a72f30142261 67 printf(" failed to delete file!\r\n");
WiredHome 3:a72f30142261 68 else
WiredHome 6:ea80c5a132b6 69 printf(" Result: %.2f KB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 70 timer.reset();
WiredHome 3:a72f30142261 71 } else {
WiredHome 3:a72f30142261 72 printf(" failed to open file!\n");
WiredHome 3:a72f30142261 73 }
WiredHome 3:a72f30142261 74 }
WiredHome 3:a72f30142261 75
WiredHome 3:a72f30142261 76 // ====================================================
WiredHome 3:a72f30142261 77
WiredHome 6:ea80c5a132b6 78 void STDIOWriteTest(const char * fqfname)
WiredHome 3:a72f30142261 79 {
WiredHome 6:ea80c5a132b6 80 printf("\r\n");
WiredHome 6:ea80c5a132b6 81 printf("STDIOWriteTest: writing %d B using %d B buffer into %s...\r\n", TESTSIZE, sizeof(buffer), fqfname);
WiredHome 3:a72f30142261 82 FILE * file = fopen(fqfname, "w");
WiredHome 3:a72f30142261 83 if (file != NULL) {
WiredHome 3:a72f30142261 84 timer.start();
WiredHome 3:a72f30142261 85 for (int i = 0; i < (TESTSIZE / sizeof(buffer)); i++) {
WiredHome 3:a72f30142261 86 if (fwrite(buffer, 1, sizeof(buffer), file) != sizeof(buffer)) {
WiredHome 3:a72f30142261 87 timer.stop();
WiredHome 3:a72f30142261 88 printf(" write error!\r\n");
WiredHome 3:a72f30142261 89 timer.reset();
WiredHome 3:a72f30142261 90 return;
WiredHome 3:a72f30142261 91 }
WiredHome 3:a72f30142261 92 }
WiredHome 3:a72f30142261 93 timer.stop();
WiredHome 3:a72f30142261 94 if (fclose(file))
WiredHome 3:a72f30142261 95 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 96 else
WiredHome 6:ea80c5a132b6 97 printf(" Result: %.2f KB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 98 timer.reset();
WiredHome 3:a72f30142261 99 } else {
WiredHome 3:a72f30142261 100 printf(" failed to create file!\r\n");
WiredHome 3:a72f30142261 101 }
WiredHome 3:a72f30142261 102 }
WiredHome 3:a72f30142261 103
WiredHome 6:ea80c5a132b6 104 void STDIOReadTest(const char * fqfname)
WiredHome 3:a72f30142261 105 {
WiredHome 6:ea80c5a132b6 106 printf("\r\n");
WiredHome 6:ea80c5a132b6 107 printf("STDIOReadTest : reading %d B using %d B buffer from %s...\r\n", TESTSIZE, sizeof(buffer), fqfname);
WiredHome 3:a72f30142261 108 FILE * fh = fopen(fqfname, "r");
WiredHome 3:a72f30142261 109 if (fh) {
WiredHome 3:a72f30142261 110 timer.start();
WiredHome 3:a72f30142261 111 int iterations = 0;
WiredHome 3:a72f30142261 112 while (fread(buffer, 1, sizeof(buffer), fh) == sizeof(buffer))
WiredHome 3:a72f30142261 113 iterations++;
WiredHome 3:a72f30142261 114 timer.stop();
WiredHome 3:a72f30142261 115 if (iterations != (TESTSIZE / sizeof(buffer)))
WiredHome 3:a72f30142261 116 printf(" read error! on iteration %d\r\n", iterations);
WiredHome 3:a72f30142261 117 else if (fclose(fh))
WiredHome 3:a72f30142261 118 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 119 else if (remove(fqfname))
WiredHome 3:a72f30142261 120 printf(" failed to delete file!\r\n");
WiredHome 3:a72f30142261 121 else
WiredHome 6:ea80c5a132b6 122 printf(" Result: %.2f KB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 123 timer.reset();
WiredHome 3:a72f30142261 124 } else {
WiredHome 3:a72f30142261 125 printf(" failed to open file!\r\n");
WiredHome 3:a72f30142261 126 }
WiredHome 3:a72f30142261 127 }
WiredHome 3:a72f30142261 128
WiredHome 3:a72f30142261 129
WiredHome 6:ea80c5a132b6 130 void ShowDir(char *dir, int depth = 0)
WiredHome 6:ea80c5a132b6 131 {
WiredHome 6:ea80c5a132b6 132 DIR *dp;
WiredHome 6:ea80c5a132b6 133 struct dirent *dirp;
WiredHome 6:ea80c5a132b6 134
WiredHome 6:ea80c5a132b6 135 dp = opendir(dir);
WiredHome 6:ea80c5a132b6 136 if (dp) {
WiredHome 6:ea80c5a132b6 137 printf("\r\nDirectory %s\r\n", dir);
WiredHome 6:ea80c5a132b6 138 ++depth;
WiredHome 6:ea80c5a132b6 139 while((dirp = readdir(dp)) != NULL) {
WiredHome 6:ea80c5a132b6 140 printf("%*s %s\r\n", (depth < 10) ? depth : 10, "", dirp->d_name);
WiredHome 6:ea80c5a132b6 141 ShowDir(dirp->d_name, depth);
WiredHome 6:ea80c5a132b6 142 }
WiredHome 6:ea80c5a132b6 143 closedir(dp);
WiredHome 6:ea80c5a132b6 144 }
WiredHome 6:ea80c5a132b6 145 }
WiredHome 6:ea80c5a132b6 146
WiredHome 6:ea80c5a132b6 147
WiredHome 6:ea80c5a132b6 148
WiredHome 3:a72f30142261 149 // ====================================================
WiredHome 3:a72f30142261 150
chris 2:c887cf1c3ed9 151
chris 2:c887cf1c3ed9 152 int main()
chris 2:c887cf1c3ed9 153 {
WiredHome 3:a72f30142261 154 printf("\r\n\r\n\r\n\r\n");
WiredHome 3:a72f30142261 155 printf("FileSys-Multi Test. Build " __DATE__ " " __TIME__ "\r\n");
WiredHome 3:a72f30142261 156
WiredHome 3:a72f30142261 157 //Configure CRC, large frames, and write validation
WiredHome 3:a72f30142261 158 sd.crc(true);
WiredHome 3:a72f30142261 159 sd.large_frames(true);
WiredHome 3:a72f30142261 160 sd.write_validation(true);
WiredHome 3:a72f30142261 161
WiredHome 3:a72f30142261 162 //Fill the buffer with random data for the write test
WiredHome 3:a72f30142261 163 srand(time(NULL));
WiredHome 3:a72f30142261 164 for (int i = 0; i < sizeof(buffer); i++)
WiredHome 3:a72f30142261 165 buffer[i] = rand();
WiredHome 3:a72f30142261 166
WiredHome 3:a72f30142261 167 bool success = false;
WiredHome 3:a72f30142261 168 do {
WiredHome 3:a72f30142261 169 wait(0.5);
WiredHome 3:a72f30142261 170
WiredHome 3:a72f30142261 171 if (!sd.card_present()) {
WiredHome 3:a72f30142261 172 printf("\r\nNo SD card present!\r\n");
WiredHome 3:a72f30142261 173 continue;
WiredHome 3:a72f30142261 174 }
chris 2:c887cf1c3ed9 175
WiredHome 3:a72f30142261 176 printf("\r\nMounting SD card...\r\n");
WiredHome 3:a72f30142261 177 if (sd.mount() != 0) {
WiredHome 3:a72f30142261 178 printf("failed to mount SD!\r\n");
WiredHome 3:a72f30142261 179 continue;
WiredHome 3:a72f30142261 180 }
WiredHome 6:ea80c5a132b6 181 printf(" success!\r\n");
WiredHome 3:a72f30142261 182 printf("\tCard type: ");
WiredHome 3:a72f30142261 183 SDFileSystem::CardType cardType = sd.card_type();
WiredHome 3:a72f30142261 184 if (cardType == SDFileSystem::CARD_NONE)
WiredHome 3:a72f30142261 185 printf("None\r\n");
WiredHome 3:a72f30142261 186 else if (cardType == SDFileSystem::CARD_MMC)
WiredHome 3:a72f30142261 187 printf("MMC\r\n");
WiredHome 3:a72f30142261 188 else if (cardType == SDFileSystem::CARD_SD)
WiredHome 3:a72f30142261 189 printf("SD\r\n");
WiredHome 3:a72f30142261 190 else if (cardType == SDFileSystem::CARD_SDHC)
WiredHome 3:a72f30142261 191 printf("SDHC\r\n");
WiredHome 3:a72f30142261 192 else
WiredHome 3:a72f30142261 193 printf("Unknown\r\n");
WiredHome 3:a72f30142261 194
WiredHome 3:a72f30142261 195 printf("\r\nMounting FS card...\r\n");
WiredHome 3:a72f30142261 196 if (fs.mount() != 0) {
WiredHome 3:a72f30142261 197 printf("failed to mount FS!\r\n");
WiredHome 3:a72f30142261 198 continue;
WiredHome 3:a72f30142261 199 }
WiredHome 6:ea80c5a132b6 200 printf(" success!\r\n");
chris 2:c887cf1c3ed9 201
WiredHome 3:a72f30142261 202 //Display the card capacity
WiredHome 3:a72f30142261 203 printf("\tSectors: %u\r\n", sd.disk_sectors());
WiredHome 3:a72f30142261 204 printf("\tCapacity: %.1fMB\r\n", sd.disk_sectors() / 2048.0);
WiredHome 3:a72f30142261 205
WiredHome 6:ea80c5a132b6 206 STDIOWriteTest("/fs/fsfile1.bin");
WiredHome 6:ea80c5a132b6 207 STDIOReadTest("/fs/fsfile1.bin");
WiredHome 6:ea80c5a132b6 208
WiredHome 6:ea80c5a132b6 209 STDIOWriteTest("/sd/sdfile1.bin");
WiredHome 6:ea80c5a132b6 210 STDIOReadTest("/sd/sdfile1.bin");
WiredHome 6:ea80c5a132b6 211
WiredHome 6:ea80c5a132b6 212 SDWriteTest("sdfile2.bin");
WiredHome 6:ea80c5a132b6 213 SDReadTest("sdfile2.bin");
WiredHome 3:a72f30142261 214
WiredHome 6:ea80c5a132b6 215 STDIOWriteTest("/fs/fsfile2.bin");
WiredHome 6:ea80c5a132b6 216 STDIOReadTest("/fs/fsfile2.bin");
WiredHome 6:ea80c5a132b6 217
WiredHome 6:ea80c5a132b6 218 STDIOWriteTest("/fs/fsfinal.txt");
WiredHome 6:ea80c5a132b6 219 STDIOWriteTest("/sd/sdfinal.txt");
WiredHome 3:a72f30142261 220
WiredHome 6:ea80c5a132b6 221 /// * mkdir
WiredHome 6:ea80c5a132b6 222 mkdir("/sd/sd_dir", 0777); // @TODO check the permissions mask. ignored?
WiredHome 6:ea80c5a132b6 223 mkdir("/fs/fs_dir", 0777); // @TODO check the permissions mask. ignored?
WiredHome 6:ea80c5a132b6 224 STDIOWriteTest("/sd/sd_dir/sdfile3.bin");
WiredHome 6:ea80c5a132b6 225 STDIOWriteTest("/fs/fs_dir/fsfile3.bin");
WiredHome 3:a72f30142261 226
WiredHome 6:ea80c5a132b6 227 /// * opendir
WiredHome 6:ea80c5a132b6 228 ShowDir("/sd");
WiredHome 6:ea80c5a132b6 229 ShowDir("/fs");
WiredHome 6:ea80c5a132b6 230
WiredHome 6:ea80c5a132b6 231 /// * rename starts with an unlink
WiredHome 6:ea80c5a132b6 232 printf("\r\nrename:\r\n");
WiredHome 6:ea80c5a132b6 233 remove("/sd/sdfinal.log");
WiredHome 6:ea80c5a132b6 234 int rn = rename("/sd/sdfinal.txt", "/sd/sdfinal.log");
WiredHome 6:ea80c5a132b6 235 printf(" rename(%s,%s) returned %d\r\n", "/sd/sdfinal.txt", "/sd/sdfinal.log", rn);
WiredHome 6:ea80c5a132b6 236 remove("/fs/fsfinal.log");
WiredHome 6:ea80c5a132b6 237 rn = rename("/fs/fsfinal.txt", "/fs/fsfinal.log");
WiredHome 6:ea80c5a132b6 238 printf(" rename(%s,%s) returned %d\r\n", "/fs/fsfinal.txt", "/fs/fsfinal.log", rn);
WiredHome 6:ea80c5a132b6 239
WiredHome 6:ea80c5a132b6 240 /// * live plug/unplug of either/both
WiredHome 6:ea80c5a132b6 241 /// * Concurrent access (e.g. copy from one to the other).
WiredHome 3:a72f30142261 242
WiredHome 6:ea80c5a132b6 243 #if 0
WiredHome 6:ea80c5a132b6 244 /// * fstat can be run against a specific object (e.g. sd.fstat)
WiredHome 6:ea80c5a132b6 245 /// but it will require deeper hooks into mbed library to get
WiredHome 6:ea80c5a132b6 246 /// the generalized form of fstat(file, &info);
WiredHome 6:ea80c5a132b6 247 printf("fstat(%s):\r\n", "sdfinal.txt");
WiredHome 6:ea80c5a132b6 248 FILINFO info;
WiredHome 6:ea80c5a132b6 249 if (sd.fstat("sdfinal.txt", &info) == 0) {
WiredHome 6:ea80c5a132b6 250 printf(" size: %d\r\n", info.fsize);
WiredHome 6:ea80c5a132b6 251 printf(" date: %d\r\n", info.fdate);
WiredHome 6:ea80c5a132b6 252 printf(" time: %d\r\n", info.ftime);
WiredHome 6:ea80c5a132b6 253 printf(" attr: %X\r\n", info.fattrib);
WiredHome 6:ea80c5a132b6 254 printf(" name: %s\r\n", info.fname);
WiredHome 6:ea80c5a132b6 255 }
WiredHome 6:ea80c5a132b6 256 // scraps that can have value...
WiredHome 6:ea80c5a132b6 257 printf("Timestamp: %u/%02u/%02u, %02u:%02u\n",
WiredHome 6:ea80c5a132b6 258 (info.fdate >> 9) + 1980, info.fdate >> 5 & 15, info.fdate & 31,
WiredHome 6:ea80c5a132b6 259 info.ftime >> 11, info.ftime >> 5 & 63);
WiredHome 6:ea80c5a132b6 260 printf("Attributes: %c%c%c%c%c\n",
WiredHome 6:ea80c5a132b6 261 (info.fattrib & AM_DIR) ? 'D' : '-',
WiredHome 6:ea80c5a132b6 262 (info.fattrib & AM_RDO) ? 'R' : '-',
WiredHome 6:ea80c5a132b6 263 (info.fattrib & AM_HID) ? 'H' : '-',
WiredHome 6:ea80c5a132b6 264 (info.fattrib & AM_SYS) ? 'S' : '-',
WiredHome 6:ea80c5a132b6 265 (info.fattrib & AM_ARC) ? 'A' : '-');
WiredHome 6:ea80c5a132b6 266 #endif
WiredHome 6:ea80c5a132b6 267
WiredHome 3:a72f30142261 268 //Unmount the SD card
WiredHome 6:ea80c5a132b6 269 printf("\r\nunmounting all now...\r\n");
WiredHome 3:a72f30142261 270 sd.unmount();
WiredHome 3:a72f30142261 271 fs.unmount();
WiredHome 3:a72f30142261 272 success = true;
WiredHome 3:a72f30142261 273
WiredHome 3:a72f30142261 274 } while (!success);
chris 2:c887cf1c3ed9 275 }