Demo to read and write to both SD and USB File System
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"); ... }
main.cpp@6:ea80c5a132b6, 2016-03-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |