NuMaker SD-File-System with SD mode

Committer:
ccli8
Date:
Tue Mar 09 14:41:14 2021 +0800
Revision:
26:e9a48202e2e2
Parent:
25:1d348ccfc209
Child:
27:48b42429011a
Update NuMaker-mbed-SD-driver.lib back

NuMaker-mbed-SD-driver/default_bd.cpp is changed by mistake and update it back.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ccli8 21:dfd65207a645 1 /* mbed Microcontroller Library
ccli8 21:dfd65207a645 2 * Copyright (c) 2006-2019 ARM Limited
ccli8 21:dfd65207a645 3 *
ccli8 21:dfd65207a645 4 * Licensed under the Apache License, Version 2.0 (the "License");
ccli8 21:dfd65207a645 5 * you may not use this file except in compliance with the License.
ccli8 21:dfd65207a645 6 * You may obtain a copy of the License at
ccli8 21:dfd65207a645 7 *
ccli8 21:dfd65207a645 8 * http://www.apache.org/licenses/LICENSE-2.0
ccli8 21:dfd65207a645 9 *
ccli8 21:dfd65207a645 10 * Unless required by applicable law or agreed to in writing, software
ccli8 21:dfd65207a645 11 * distributed under the License is distributed on an "AS IS" BASIS,
ccli8 21:dfd65207a645 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ccli8 21:dfd65207a645 13 * See the License for the specific language governing permissions and
ccli8 21:dfd65207a645 14 * limitations under the License.
ccli8 21:dfd65207a645 15 */
ccli8 21:dfd65207a645 16 #include "mbed.h"
ccli8 21:dfd65207a645 17 #include <stdio.h>
ccli8 21:dfd65207a645 18 #include <errno.h>
ccli8 21:dfd65207a645 19
ccli8 21:dfd65207a645 20 #include "NuSDBlockDevice.h"
ccli8 21:dfd65207a645 21
shliu1 25:1d348ccfc209 22
ccli8 21:dfd65207a645 23 // Maximum number of elements in buffer
ccli8 21:dfd65207a645 24 #define BUFFER_MAX_LEN 10
ccli8 21:dfd65207a645 25
ccli8 21:dfd65207a645 26 // NUSD for block device
ccli8 21:dfd65207a645 27 NuSDBlockDevice *bd = new NuSDBlockDevice();
ccli8 21:dfd65207a645 28
ccli8 21:dfd65207a645 29 // Instead of the default block device, you can define your own block device.
ccli8 21:dfd65207a645 30 // For example: HeapBlockDevice with size of 2048 bytes, read size 1, write size 1 and erase size 512.
ccli8 21:dfd65207a645 31 // #include "HeapBlockDevice.h"
ccli8 21:dfd65207a645 32 // BlockDevice *bd = new HeapBlockDevice(2048, 1, 1, 512);
ccli8 21:dfd65207a645 33
ccli8 21:dfd65207a645 34
ccli8 23:036c20fd7064 35 // This example uses FAT file system as the default.
ccli8 23:036c20fd7064 36 #include "FATFileSystem.h"
ccli8 23:036c20fd7064 37 FATFileSystem fs("fs");
ccli8 21:dfd65207a645 38
ccli8 23:036c20fd7064 39 // Uncomment in the following two lines and comment out the previous two to use Little file system.
ccli8 23:036c20fd7064 40 //#include "LittleFileSystem.h"
ccli8 23:036c20fd7064 41 //LittleFileSystem fs("fs");
ccli8 21:dfd65207a645 42
ccli8 21:dfd65207a645 43
ccli8 21:dfd65207a645 44 // Set up the button to trigger an erase
ccli8 21:dfd65207a645 45 InterruptIn irq(BUTTON1);
shliu1 25:1d348ccfc209 46
ccli8 21:dfd65207a645 47 void erase() {
ccli8 21:dfd65207a645 48 printf("Initializing the block device... ");
ccli8 21:dfd65207a645 49 fflush(stdout);
ccli8 21:dfd65207a645 50 int err = bd->init();
ccli8 21:dfd65207a645 51 printf("%s\n", (err ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 52 if (err) {
ccli8 21:dfd65207a645 53 error("error: %s (%d)\n", strerror(-err), err);
ccli8 21:dfd65207a645 54 }
ccli8 21:dfd65207a645 55
ccli8 21:dfd65207a645 56 printf("Erasing the block device... ");
ccli8 21:dfd65207a645 57 fflush(stdout);
ccli8 21:dfd65207a645 58 err = bd->erase(0, bd->size());
ccli8 21:dfd65207a645 59 printf("%s\n", (err ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 60 if (err) {
ccli8 21:dfd65207a645 61 error("error: %s (%d)\n", strerror(-err), err);
ccli8 21:dfd65207a645 62 }
ccli8 21:dfd65207a645 63
ccli8 21:dfd65207a645 64 printf("Deinitializing the block device... ");
ccli8 21:dfd65207a645 65 fflush(stdout);
ccli8 21:dfd65207a645 66 err = bd->deinit();
ccli8 21:dfd65207a645 67 printf("%s\n", (err ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 68 if (err) {
ccli8 21:dfd65207a645 69 error("error: %s (%d)\n", strerror(-err), err);
ccli8 21:dfd65207a645 70 }
ccli8 21:dfd65207a645 71 }
ccli8 21:dfd65207a645 72
shliu1 25:1d348ccfc209 73 #if MBED_MAJOR_VERSION >= 6
shliu1 25:1d348ccfc209 74 static auto erase_event = mbed_event_queue()->make_user_allocated_event(erase);
shliu1 25:1d348ccfc209 75 #endif
ccli8 21:dfd65207a645 76
ccli8 21:dfd65207a645 77 // Entry point for the example
ccli8 21:dfd65207a645 78 int main() {
shliu1 25:1d348ccfc209 79 #ifdef MBED_MAJOR_VERSION
shliu1 25:1d348ccfc209 80 printf("Mbed OS version %d.%d.%d\r\n\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
shliu1 25:1d348ccfc209 81 #endif
ccli8 21:dfd65207a645 82 printf("--- Mbed OS filesystem example ---\n");
ccli8 21:dfd65207a645 83
ccli8 21:dfd65207a645 84 // Setup the erase event on button press, use the event queue
ccli8 21:dfd65207a645 85 // to avoid running in interrupt context
shliu1 25:1d348ccfc209 86 #if MBED_MAJOR_VERSION >= 6
shliu1 25:1d348ccfc209 87 irq.fall(std::ref(erase_event));
shliu1 25:1d348ccfc209 88 #else
ccli8 21:dfd65207a645 89 irq.fall(mbed_event_queue()->event(erase));
shliu1 25:1d348ccfc209 90 #endif
ccli8 21:dfd65207a645 91
ccli8 21:dfd65207a645 92 // Try to mount the filesystem
ccli8 21:dfd65207a645 93 printf("Mounting the filesystem... ");
ccli8 21:dfd65207a645 94 fflush(stdout);
ccli8 21:dfd65207a645 95 int err = fs.mount(bd);
ccli8 21:dfd65207a645 96 printf("%s\n", (err ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 97 if (err) {
ccli8 21:dfd65207a645 98 // Reformat if we can't mount the filesystem
ccli8 21:dfd65207a645 99 // this should only happen on the first boot
ccli8 21:dfd65207a645 100 printf("No filesystem found, formatting... ");
ccli8 21:dfd65207a645 101 fflush(stdout);
ccli8 21:dfd65207a645 102 err = fs.reformat(bd);
ccli8 21:dfd65207a645 103 printf("%s\n", (err ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 104 if (err) {
ccli8 21:dfd65207a645 105 error("error: %s (%d)\n", strerror(-err), err);
ccli8 21:dfd65207a645 106 }
ccli8 21:dfd65207a645 107 }
ccli8 21:dfd65207a645 108
ccli8 21:dfd65207a645 109 // Open the numbers file
ccli8 21:dfd65207a645 110 printf("Opening \"/fs/numbers.txt\"... ");
ccli8 21:dfd65207a645 111 fflush(stdout);
ccli8 21:dfd65207a645 112 FILE *f = fopen("/fs/numbers.txt", "r+");
ccli8 21:dfd65207a645 113 printf("%s\n", (!f ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 114 if (!f) {
ccli8 21:dfd65207a645 115 // Create the numbers file if it doesn't exist
ccli8 21:dfd65207a645 116 printf("No file found, creating a new file... ");
ccli8 21:dfd65207a645 117 fflush(stdout);
ccli8 21:dfd65207a645 118 f = fopen("/fs/numbers.txt", "w+");
ccli8 21:dfd65207a645 119 printf("%s\n", (!f ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 120 if (!f) {
ccli8 21:dfd65207a645 121 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 122 }
ccli8 21:dfd65207a645 123
ccli8 21:dfd65207a645 124 for (int i = 0; i < 10; i++) {
ccli8 21:dfd65207a645 125 printf("\rWriting numbers (%d/%d)... ", i, 10);
ccli8 21:dfd65207a645 126 fflush(stdout);
ccli8 21:dfd65207a645 127 err = fprintf(f, " %d\n", i);
ccli8 21:dfd65207a645 128 if (err < 0) {
ccli8 21:dfd65207a645 129 printf("Fail :(\n");
ccli8 21:dfd65207a645 130 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 131 }
ccli8 21:dfd65207a645 132 }
ccli8 21:dfd65207a645 133 printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
ccli8 21:dfd65207a645 134
ccli8 21:dfd65207a645 135 printf("Seeking file... ");
ccli8 21:dfd65207a645 136 fflush(stdout);
ccli8 21:dfd65207a645 137 err = fseek(f, 0, SEEK_SET);
ccli8 21:dfd65207a645 138 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 139 if (err < 0) {
ccli8 21:dfd65207a645 140 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 141 }
ccli8 21:dfd65207a645 142 }
ccli8 21:dfd65207a645 143
ccli8 21:dfd65207a645 144 // Go through and increment the numbers
ccli8 21:dfd65207a645 145 for (int i = 0; i < 10; i++) {
ccli8 21:dfd65207a645 146 printf("\rIncrementing numbers (%d/%d)... ", i, 10);
ccli8 21:dfd65207a645 147 fflush(stdout);
ccli8 21:dfd65207a645 148
ccli8 21:dfd65207a645 149 // Get current stream position
ccli8 21:dfd65207a645 150 long pos = ftell(f);
ccli8 21:dfd65207a645 151
ccli8 21:dfd65207a645 152 // Parse out the number and increment
ccli8 21:dfd65207a645 153 char buf[BUFFER_MAX_LEN];
ccli8 21:dfd65207a645 154 if (!fgets(buf, BUFFER_MAX_LEN, f)) {
ccli8 21:dfd65207a645 155 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 156 }
ccli8 21:dfd65207a645 157 char *endptr;
ccli8 21:dfd65207a645 158 int32_t number = strtol(buf, &endptr, 10);
ccli8 21:dfd65207a645 159 if (
ccli8 21:dfd65207a645 160 (errno == ERANGE) || // The number is too small/large
ccli8 21:dfd65207a645 161 (endptr == buf) || // No character was read
ccli8 21:dfd65207a645 162 (*endptr && *endptr != '\n') // The whole input was not converted
ccli8 21:dfd65207a645 163 ) {
ccli8 21:dfd65207a645 164 continue;
ccli8 21:dfd65207a645 165 }
ccli8 21:dfd65207a645 166 number += 1;
ccli8 21:dfd65207a645 167
ccli8 21:dfd65207a645 168 // Seek to beginning of number
ccli8 21:dfd65207a645 169 fseek(f, pos, SEEK_SET);
ccli8 21:dfd65207a645 170
ccli8 21:dfd65207a645 171 // Store number
shliu1 25:1d348ccfc209 172 fprintf(f, " %d\n", (int)number);
shliu1 25:1d348ccfc209 173
ccli8 21:dfd65207a645 174 // Flush between write and read on same file
ccli8 21:dfd65207a645 175 fflush(f);
ccli8 21:dfd65207a645 176 }
ccli8 21:dfd65207a645 177 printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
ccli8 21:dfd65207a645 178
ccli8 21:dfd65207a645 179 // Close the file which also flushes any cached writes
ccli8 21:dfd65207a645 180 printf("Closing \"/fs/numbers.txt\"... ");
ccli8 21:dfd65207a645 181 fflush(stdout);
ccli8 21:dfd65207a645 182 err = fclose(f);
ccli8 21:dfd65207a645 183 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 184 if (err < 0) {
ccli8 21:dfd65207a645 185 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 186 }
ccli8 21:dfd65207a645 187
ccli8 21:dfd65207a645 188 // Display the root directory
ccli8 21:dfd65207a645 189 printf("Opening the root directory... ");
ccli8 21:dfd65207a645 190 fflush(stdout);
ccli8 21:dfd65207a645 191 DIR *d = opendir("/fs/");
ccli8 21:dfd65207a645 192 printf("%s\n", (!d ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 193 if (!d) {
ccli8 21:dfd65207a645 194 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 195 }
ccli8 21:dfd65207a645 196
ccli8 21:dfd65207a645 197 printf("root directory:\n");
ccli8 21:dfd65207a645 198 while (true) {
ccli8 21:dfd65207a645 199 struct dirent *e = readdir(d);
ccli8 21:dfd65207a645 200 if (!e) {
ccli8 21:dfd65207a645 201 break;
ccli8 21:dfd65207a645 202 }
ccli8 21:dfd65207a645 203
ccli8 21:dfd65207a645 204 printf(" %s\n", e->d_name);
ccli8 21:dfd65207a645 205 }
ccli8 21:dfd65207a645 206
ccli8 21:dfd65207a645 207 printf("Closing the root directory... ");
ccli8 21:dfd65207a645 208 fflush(stdout);
ccli8 21:dfd65207a645 209 err = closedir(d);
ccli8 21:dfd65207a645 210 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 211 if (err < 0) {
ccli8 21:dfd65207a645 212 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 213 }
ccli8 21:dfd65207a645 214
ccli8 21:dfd65207a645 215 // Display the numbers file
ccli8 21:dfd65207a645 216 printf("Opening \"/fs/numbers.txt\"... ");
ccli8 21:dfd65207a645 217 fflush(stdout);
ccli8 21:dfd65207a645 218 f = fopen("/fs/numbers.txt", "r");
ccli8 21:dfd65207a645 219 printf("%s\n", (!f ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 220 if (!f) {
ccli8 21:dfd65207a645 221 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 222 }
ccli8 21:dfd65207a645 223
ccli8 21:dfd65207a645 224 printf("numbers:\n");
ccli8 21:dfd65207a645 225 while (!feof(f)) {
ccli8 21:dfd65207a645 226 int c = fgetc(f);
ccli8 21:dfd65207a645 227 printf("%c", c);
ccli8 21:dfd65207a645 228 }
ccli8 21:dfd65207a645 229
ccli8 21:dfd65207a645 230 printf("\rClosing \"/fs/numbers.txt\"... ");
ccli8 21:dfd65207a645 231 fflush(stdout);
ccli8 21:dfd65207a645 232 err = fclose(f);
ccli8 21:dfd65207a645 233 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 234 if (err < 0) {
ccli8 21:dfd65207a645 235 error("error: %s (%d)\n", strerror(errno), -errno);
ccli8 21:dfd65207a645 236 }
ccli8 21:dfd65207a645 237
ccli8 21:dfd65207a645 238 // Tidy up
ccli8 21:dfd65207a645 239 printf("Unmounting... ");
ccli8 21:dfd65207a645 240 fflush(stdout);
ccli8 21:dfd65207a645 241 err = fs.unmount();
ccli8 21:dfd65207a645 242 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
ccli8 21:dfd65207a645 243 if (err < 0) {
ccli8 21:dfd65207a645 244 error("error: %s (%d)\n", strerror(-err), err);
ccli8 21:dfd65207a645 245 }
ccli8 21:dfd65207a645 246
ccli8 21:dfd65207a645 247 printf("Mbed OS filesystem example done!\n");
ccli8 21:dfd65207a645 248 }
ccli8 21:dfd65207a645 249