L VD / Mbed OS mbed-os-example-filesystem-sdio

Dependencies:   sdio-glue

Committer:
elelthvd
Date:
Wed Nov 11 02:58:32 2020 +0000
Revision:
0:5db1517e0856
Child:
2:e7bbec3296d5
initial commit

Who changed what in which revision?

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