Escritura SD USB

Dependencies:   mbed

Fork of FileSys-MultiFileSystem by David Smart

Committer:
WiredHome
Date:
Sun Mar 13 00:59:18 2016 +0000
Revision:
4:be096a44f789
Parent:
3:a72f30142261
Child:
6:ea80c5a132b6
Support longer filenames

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 4:be096a44f789 4 /// This supports both USB and SD File systems simultaneously.
WiredHome 4:be096a44f789 5 ///
WiredHome 4:be096a44f789 6 ///
chris 2:c887cf1c3ed9 7 #include "mbed.h"
chris 2:c887cf1c3ed9 8 #include "MSCFileSystem.h"
WiredHome 3:a72f30142261 9 #include "SDFileSystem.h"
WiredHome 3:a72f30142261 10
chris 2:c887cf1c3ed9 11
chris 2:c887cf1c3ed9 12 MSCFileSystem fs("fs");
WiredHome 3:a72f30142261 13 SDFileSystem sd(p5, p6, p7, p8, "sd", p11, SDFileSystem::SWITCH_NEG_NO, 15000000);
WiredHome 3:a72f30142261 14
chris 2:c887cf1c3ed9 15 DigitalOut led(LED1);
chris 2:c887cf1c3ed9 16 AnalogIn pot1(p19);
WiredHome 3:a72f30142261 17 Timer timer;
WiredHome 3:a72f30142261 18
WiredHome 3:a72f30142261 19 char buffer[4096];
WiredHome 3:a72f30142261 20 #define TESTSIZE 1048576
WiredHome 3:a72f30142261 21 //#define TESTSIZE 100
WiredHome 3:a72f30142261 22
WiredHome 3:a72f30142261 23 void sdwriteTest(const char * fname)
WiredHome 3:a72f30142261 24 {
WiredHome 3:a72f30142261 25 //Test write performance by creating a 1MB file
WiredHome 3:a72f30142261 26 printf("\r\nsdwriteTest %iB write performance on %s...\r\n", sizeof(buffer), fname);
WiredHome 3:a72f30142261 27 FileHandle* file = sd.open(fname, O_WRONLY | O_CREAT | O_TRUNC);
WiredHome 3:a72f30142261 28 if (file != NULL) {
WiredHome 3:a72f30142261 29 timer.start();
WiredHome 3:a72f30142261 30 for (int i = 0; i < (TESTSIZE / sizeof(buffer)); i++) {
WiredHome 3:a72f30142261 31 if (file->write(buffer, sizeof(buffer)) != sizeof(buffer)) {
WiredHome 3:a72f30142261 32 timer.stop();
WiredHome 3:a72f30142261 33 printf(" write error!\r\n");
WiredHome 3:a72f30142261 34 timer.reset();
WiredHome 3:a72f30142261 35 return;
WiredHome 3:a72f30142261 36 }
WiredHome 3:a72f30142261 37 }
WiredHome 3:a72f30142261 38 timer.stop();
WiredHome 3:a72f30142261 39 if (file->close())
WiredHome 3:a72f30142261 40 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 41 else
WiredHome 3:a72f30142261 42 printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 43 timer.reset();
WiredHome 3:a72f30142261 44 } else {
WiredHome 3:a72f30142261 45 printf(" failed to create file!\r\n");
WiredHome 3:a72f30142261 46 }
WiredHome 3:a72f30142261 47 }
WiredHome 3:a72f30142261 48
WiredHome 3:a72f30142261 49 void sdreadTest(const char * fname)
WiredHome 3:a72f30142261 50 {
WiredHome 3:a72f30142261 51 //Test read performance by reading the 1MB file created by writeTest()
WiredHome 3:a72f30142261 52 printf("\r\nsdreadTest %iB read performance...\r\n", sizeof(buffer));
WiredHome 3:a72f30142261 53 FileHandle* file = sd.open(fname, O_RDONLY);
WiredHome 3:a72f30142261 54 if (file != NULL) {
WiredHome 3:a72f30142261 55 timer.start();
WiredHome 3:a72f30142261 56 int iterations = 0;
WiredHome 3:a72f30142261 57 while (file->read(buffer, sizeof(buffer)) == sizeof(buffer))
WiredHome 3:a72f30142261 58 iterations++;
WiredHome 3:a72f30142261 59 timer.stop();
WiredHome 3:a72f30142261 60 printf(" fname: %s\r\n", fname);
WiredHome 3:a72f30142261 61 if (iterations != (TESTSIZE / sizeof(buffer)))
WiredHome 3:a72f30142261 62 printf(" read error!\r\n");
WiredHome 3:a72f30142261 63 else if (file->close())
WiredHome 3:a72f30142261 64 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 65 else if (sd.remove(fname))
WiredHome 3:a72f30142261 66 printf(" failed to delete file!\r\n");
WiredHome 3:a72f30142261 67 else
WiredHome 3:a72f30142261 68 printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 69 timer.reset();
WiredHome 3:a72f30142261 70 } else {
WiredHome 3:a72f30142261 71 printf(" failed to open file!\n");
WiredHome 3:a72f30142261 72 }
WiredHome 3:a72f30142261 73 }
WiredHome 3:a72f30142261 74
WiredHome 3:a72f30142261 75 // ====================================================
WiredHome 3:a72f30142261 76
WiredHome 3:a72f30142261 77 void writeTest2(const char * fqfname)
WiredHome 3:a72f30142261 78 {
WiredHome 3:a72f30142261 79 //Test write performance by creating a 1MB file
WiredHome 3:a72f30142261 80 printf("\r\nwriteTest2 %iB write performance on %s...\r\n", sizeof(buffer), fqfname);
WiredHome 3:a72f30142261 81 FILE * file = fopen(fqfname, "w");
WiredHome 3:a72f30142261 82 if (file != NULL) {
WiredHome 3:a72f30142261 83 timer.start();
WiredHome 3:a72f30142261 84 for (int i = 0; i < (TESTSIZE / sizeof(buffer)); i++) {
WiredHome 3:a72f30142261 85 if (fwrite(buffer, 1, sizeof(buffer), file) != sizeof(buffer)) {
WiredHome 3:a72f30142261 86 timer.stop();
WiredHome 3:a72f30142261 87 printf(" write error!\r\n");
WiredHome 3:a72f30142261 88 timer.reset();
WiredHome 3:a72f30142261 89 return;
WiredHome 3:a72f30142261 90 }
WiredHome 3:a72f30142261 91 }
WiredHome 3:a72f30142261 92 timer.stop();
WiredHome 3:a72f30142261 93 if (fclose(file))
WiredHome 3:a72f30142261 94 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 95 else
WiredHome 3:a72f30142261 96 printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 97 timer.reset();
WiredHome 3:a72f30142261 98 } else {
WiredHome 3:a72f30142261 99 printf(" failed to create file!\r\n");
WiredHome 3:a72f30142261 100 }
WiredHome 3:a72f30142261 101 }
WiredHome 3:a72f30142261 102
WiredHome 3:a72f30142261 103 void readTest2(const char * fqfname)
WiredHome 3:a72f30142261 104 {
WiredHome 3:a72f30142261 105 //Test read performance by reading the 1MB file created by writeTest()
WiredHome 3:a72f30142261 106 printf("\r\nreadTest2 %i B read performance on %s...\r\n", sizeof(buffer), fqfname);
WiredHome 3:a72f30142261 107 FILE * fh = fopen(fqfname, "r");
WiredHome 3:a72f30142261 108 if (fh) {
WiredHome 3:a72f30142261 109 timer.start();
WiredHome 3:a72f30142261 110 int iterations = 0;
WiredHome 3:a72f30142261 111 while (fread(buffer, 1, sizeof(buffer), fh) == sizeof(buffer))
WiredHome 3:a72f30142261 112 iterations++;
WiredHome 3:a72f30142261 113 timer.stop();
WiredHome 3:a72f30142261 114 if (iterations != (TESTSIZE / sizeof(buffer)))
WiredHome 3:a72f30142261 115 printf(" read error! on iteration %d\r\n", iterations);
WiredHome 3:a72f30142261 116 else if (fclose(fh))
WiredHome 3:a72f30142261 117 printf(" failed to close file!\r\n");
WiredHome 3:a72f30142261 118 else if (remove(fqfname))
WiredHome 3:a72f30142261 119 printf(" failed to delete file!\r\n");
WiredHome 3:a72f30142261 120 else
WiredHome 3:a72f30142261 121 printf(" done!\r\n Result: %.2fKB/s\r\n", 1024 / (timer.read_us() / 1000000.0));
WiredHome 3:a72f30142261 122 timer.reset();
WiredHome 3:a72f30142261 123 } else {
WiredHome 3:a72f30142261 124 printf(" failed to open file!\r\n");
WiredHome 3:a72f30142261 125 }
WiredHome 3:a72f30142261 126 }
WiredHome 3:a72f30142261 127
WiredHome 3:a72f30142261 128
WiredHome 3:a72f30142261 129 // ====================================================
WiredHome 3:a72f30142261 130
chris 2:c887cf1c3ed9 131
chris 2:c887cf1c3ed9 132 int main()
chris 2:c887cf1c3ed9 133 {
WiredHome 3:a72f30142261 134 printf("\r\n\r\n\r\n\r\n");
WiredHome 3:a72f30142261 135 printf("FileSys-Multi Test. Build " __DATE__ " " __TIME__ "\r\n");
WiredHome 3:a72f30142261 136
WiredHome 3:a72f30142261 137 //Configure CRC, large frames, and write validation
WiredHome 3:a72f30142261 138 sd.crc(true);
WiredHome 3:a72f30142261 139 sd.large_frames(true);
WiredHome 3:a72f30142261 140 sd.write_validation(true);
WiredHome 3:a72f30142261 141
WiredHome 3:a72f30142261 142 //Fill the buffer with random data for the write test
WiredHome 3:a72f30142261 143 srand(time(NULL));
WiredHome 3:a72f30142261 144 for (int i = 0; i < sizeof(buffer); i++)
WiredHome 3:a72f30142261 145 buffer[i] = rand();
WiredHome 3:a72f30142261 146
WiredHome 3:a72f30142261 147 bool success = false;
WiredHome 3:a72f30142261 148 do {
WiredHome 3:a72f30142261 149 wait(0.5);
WiredHome 3:a72f30142261 150
WiredHome 3:a72f30142261 151 if (!sd.card_present()) {
WiredHome 3:a72f30142261 152 printf("\r\nNo SD card present!\r\n");
WiredHome 3:a72f30142261 153 continue;
WiredHome 3:a72f30142261 154 }
chris 2:c887cf1c3ed9 155
WiredHome 3:a72f30142261 156 printf("\r\nMounting SD card...\r\n");
WiredHome 3:a72f30142261 157 if (sd.mount() != 0) {
WiredHome 3:a72f30142261 158 printf("failed to mount SD!\r\n");
WiredHome 3:a72f30142261 159 continue;
WiredHome 3:a72f30142261 160 }
WiredHome 3:a72f30142261 161 printf("success!\r\n");
WiredHome 3:a72f30142261 162 printf("\tCard type: ");
WiredHome 3:a72f30142261 163 SDFileSystem::CardType cardType = sd.card_type();
WiredHome 3:a72f30142261 164 if (cardType == SDFileSystem::CARD_NONE)
WiredHome 3:a72f30142261 165 printf("None\r\n");
WiredHome 3:a72f30142261 166 else if (cardType == SDFileSystem::CARD_MMC)
WiredHome 3:a72f30142261 167 printf("MMC\r\n");
WiredHome 3:a72f30142261 168 else if (cardType == SDFileSystem::CARD_SD)
WiredHome 3:a72f30142261 169 printf("SD\r\n");
WiredHome 3:a72f30142261 170 else if (cardType == SDFileSystem::CARD_SDHC)
WiredHome 3:a72f30142261 171 printf("SDHC\r\n");
WiredHome 3:a72f30142261 172 else
WiredHome 3:a72f30142261 173 printf("Unknown\r\n");
WiredHome 3:a72f30142261 174
WiredHome 3:a72f30142261 175 printf("\r\nMounting FS card...\r\n");
WiredHome 3:a72f30142261 176 if (fs.mount() != 0) {
WiredHome 3:a72f30142261 177 printf("failed to mount FS!\r\n");
WiredHome 3:a72f30142261 178 continue;
WiredHome 3:a72f30142261 179 }
WiredHome 3:a72f30142261 180 printf("success!\r\n");
chris 2:c887cf1c3ed9 181
WiredHome 3:a72f30142261 182 //Display the card capacity
WiredHome 3:a72f30142261 183 printf("\tSectors: %u\r\n", sd.disk_sectors());
WiredHome 3:a72f30142261 184 printf("\tCapacity: %.1fMB\r\n", sd.disk_sectors() / 2048.0);
WiredHome 3:a72f30142261 185
WiredHome 3:a72f30142261 186 writeTest2("/fs/fsfile1.bin");
WiredHome 3:a72f30142261 187 readTest2("/fs/fsfile1.bin");
WiredHome 3:a72f30142261 188
WiredHome 3:a72f30142261 189 writeTest2("/sd/sdfile1.bin");
WiredHome 3:a72f30142261 190 readTest2("/sd/sdfile1.bin");
WiredHome 3:a72f30142261 191
WiredHome 3:a72f30142261 192 sdwriteTest("sdfile2.bin");
WiredHome 3:a72f30142261 193 sdreadTest("sdfile2.bin");
WiredHome 3:a72f30142261 194
WiredHome 3:a72f30142261 195 writeTest2("/fs/fsfile2.bin");
WiredHome 3:a72f30142261 196 readTest2("/fs/fsfile2.bin");
WiredHome 3:a72f30142261 197
WiredHome 3:a72f30142261 198 writeTest2("/fs/fsfinal.txt");
WiredHome 3:a72f30142261 199 writeTest2("/sd/sdfinal.txt");
WiredHome 3:a72f30142261 200
WiredHome 3:a72f30142261 201 //Unmount the SD card
WiredHome 3:a72f30142261 202 printf("unmounting now...\r\n");
WiredHome 3:a72f30142261 203 sd.unmount();
WiredHome 3:a72f30142261 204 fs.unmount();
WiredHome 3:a72f30142261 205 success = true;
WiredHome 3:a72f30142261 206
WiredHome 3:a72f30142261 207 } while (!success);
chris 2:c887cf1c3ed9 208 }