The Mbed OS file system example with sdio-driver for LPC55S69_NS and DISCO_F746NG targets

Dependencies:   sdio-glue

Committer:
elelthvd
Date:
Wed Nov 11 11:22:02 2020 +0800
Revision:
3:ebff5971c078
Parent:
0:5db1517e0856
Add sdio-glue

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