This example demonstrates how to use the Mbed OS file system on target RHOMBIO_L476DMW1K together with a Rhombio uSD Holder module. The example is based on mbed official mbed-os-example-filesystem with minor modifications.

You can find more information about the Mbed OS file system and other related pieces of the Mbed OS storage stack in the storage overview: https://os.mbed.com/docs/latest/reference/storage.html

Committer:
galonso@rhomb.io
Date:
Thu Sep 19 13:29:36 2019 +0200
Revision:
5:37e9573e91f6
Parent:
0:91eeaf1003ac
changes in README.md

Who changed what in which revision?

UserRevisionLine numberNew contents of line
galonso@rhomb.io 0:91eeaf1003ac 1 /* mbed Microcontroller Library
galonso@rhomb.io 0:91eeaf1003ac 2 * Copyright (c) 2006-2013 ARM Limited
galonso@rhomb.io 0:91eeaf1003ac 3 *
galonso@rhomb.io 0:91eeaf1003ac 4 * Licensed under the Apache License, Version 2.0 (the "License");
galonso@rhomb.io 0:91eeaf1003ac 5 * you may not use this file except in compliance with the License.
galonso@rhomb.io 0:91eeaf1003ac 6 * You may obtain a copy of the License at
galonso@rhomb.io 0:91eeaf1003ac 7 *
galonso@rhomb.io 0:91eeaf1003ac 8 * http://www.apache.org/licenses/LICENSE-2.0
galonso@rhomb.io 0:91eeaf1003ac 9 *
galonso@rhomb.io 0:91eeaf1003ac 10 * Unless required by applicable law or agreed to in writing, software
galonso@rhomb.io 0:91eeaf1003ac 11 * distributed under the License is distributed on an "AS IS" BASIS,
galonso@rhomb.io 0:91eeaf1003ac 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
galonso@rhomb.io 0:91eeaf1003ac 13 * See the License for the specific language governing permissions and
galonso@rhomb.io 0:91eeaf1003ac 14 * limitations under the License.
galonso@rhomb.io 0:91eeaf1003ac 15 */
galonso@rhomb.io 0:91eeaf1003ac 16 #include "mbed.h"
galonso@rhomb.io 0:91eeaf1003ac 17 #include <stdio.h>
galonso@rhomb.io 0:91eeaf1003ac 18 #include <errno.h>
galonso@rhomb.io 0:91eeaf1003ac 19
galonso@rhomb.io 0:91eeaf1003ac 20 // Block devices
galonso@rhomb.io 0:91eeaf1003ac 21 //#include "SPIFBlockDevice.h"
galonso@rhomb.io 0:91eeaf1003ac 22 //#include "DataFlashBlockDevice.h"
galonso@rhomb.io 0:91eeaf1003ac 23 #include "SDBlockDevice.h"
galonso@rhomb.io 0:91eeaf1003ac 24 //#include "HeapBlockDevice.h"
galonso@rhomb.io 0:91eeaf1003ac 25
galonso@rhomb.io 0:91eeaf1003ac 26 // File systems
galonso@rhomb.io 0:91eeaf1003ac 27 //#include "LittleFileSystem.h"
galonso@rhomb.io 0:91eeaf1003ac 28 #include "FATFileSystem.h"
galonso@rhomb.io 0:91eeaf1003ac 29
galonso@rhomb.io 0:91eeaf1003ac 30 //-----------------------------------------------------------------------
galonso@rhomb.io 0:91eeaf1003ac 31 // RHOMB.IO CARRIER BOARDS
galonso@rhomb.io 0:91eeaf1003ac 32 // INDICATE THE CORRECT "CHIP SELECT" PIN TO BE USED:
galonso@rhomb.io 0:91eeaf1003ac 33 // SPI_A_CS0 if Rhombio uSD Holder module is assembled on Slave_socket_1
galonso@rhomb.io 0:91eeaf1003ac 34 // SPI_A_CS1 if Rhombio uSD Holder module is assembled on Slave_socket_2
galonso@rhomb.io 0:91eeaf1003ac 35 // uncommnt here the proper one:
galonso@rhomb.io 0:91eeaf1003ac 36 //#define SD_CS SPI_A_CS0
galonso@rhomb.io 0:91eeaf1003ac 37 #define SD_CS SPI_A_CS1
galonso@rhomb.io 0:91eeaf1003ac 38 //-----------------------------------------------------------------------
galonso@rhomb.io 0:91eeaf1003ac 39
galonso@rhomb.io 0:91eeaf1003ac 40 // Physical block device, can be any device that supports the BlockDevice API
galonso@rhomb.io 0:91eeaf1003ac 41 SDBlockDevice blockDevice(SPI_MOSI, SPI_MISO, SPI_SCK, SD_CS); // mosi, miso, sck, cs
galonso@rhomb.io 0:91eeaf1003ac 42
galonso@rhomb.io 0:91eeaf1003ac 43 // File system declaration
galonso@rhomb.io 0:91eeaf1003ac 44 FATFileSystem fileSystem("fs");
galonso@rhomb.io 0:91eeaf1003ac 45
galonso@rhomb.io 0:91eeaf1003ac 46 // Entry point for the example
galonso@rhomb.io 0:91eeaf1003ac 47 int main()
galonso@rhomb.io 0:91eeaf1003ac 48 {
galonso@rhomb.io 0:91eeaf1003ac 49 printf("--- Mbed OS filesystem example ---\n");
galonso@rhomb.io 0:91eeaf1003ac 50
galonso@rhomb.io 0:91eeaf1003ac 51 // Try to mount the filesystem
galonso@rhomb.io 0:91eeaf1003ac 52 printf("Mounting the filesystem... ");
galonso@rhomb.io 0:91eeaf1003ac 53 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 54
galonso@rhomb.io 0:91eeaf1003ac 55 int err = fileSystem.mount(&blockDevice);
galonso@rhomb.io 0:91eeaf1003ac 56 printf("%s\n", (err ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 57 if (err) {
galonso@rhomb.io 0:91eeaf1003ac 58 // Reformat if we can't mount the filesystem
galonso@rhomb.io 0:91eeaf1003ac 59 // this should only happen on the first boot
galonso@rhomb.io 0:91eeaf1003ac 60 printf("No filesystem found, formatting... ");
galonso@rhomb.io 0:91eeaf1003ac 61 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 62 err = fileSystem.reformat(&blockDevice);
galonso@rhomb.io 0:91eeaf1003ac 63 printf("%s\n", (err ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 64 if (err) {
galonso@rhomb.io 0:91eeaf1003ac 65 error("error: %s (%d)\n", strerror(-err), err);
galonso@rhomb.io 0:91eeaf1003ac 66 }
galonso@rhomb.io 0:91eeaf1003ac 67 }
galonso@rhomb.io 0:91eeaf1003ac 68
galonso@rhomb.io 0:91eeaf1003ac 69 // Open the numbers file
galonso@rhomb.io 0:91eeaf1003ac 70 printf("Opening \"/fs/numbers.txt\"... ");
galonso@rhomb.io 0:91eeaf1003ac 71 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 72
galonso@rhomb.io 0:91eeaf1003ac 73 FILE* f = fopen("/fs/numbers.txt", "r+");
galonso@rhomb.io 0:91eeaf1003ac 74 printf("%s\n", (!f ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 75 if (!f) {
galonso@rhomb.io 0:91eeaf1003ac 76 // Create the numbers file if it doesn't exist
galonso@rhomb.io 0:91eeaf1003ac 77 printf("No file found, creating a new file... ");
galonso@rhomb.io 0:91eeaf1003ac 78 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 79 f = fopen("/fs/numbers.txt", "w+");
galonso@rhomb.io 0:91eeaf1003ac 80 printf("%s\n", (!f ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 81 if (!f) {
galonso@rhomb.io 0:91eeaf1003ac 82 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 83 }
galonso@rhomb.io 0:91eeaf1003ac 84
galonso@rhomb.io 0:91eeaf1003ac 85 for (int i = 0; i < 10; i++) {
galonso@rhomb.io 0:91eeaf1003ac 86 printf("\rWriting numbers (%d/%d)... ", i, 10);
galonso@rhomb.io 0:91eeaf1003ac 87 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 88 err = fprintf(f, " %d\n", i);
galonso@rhomb.io 0:91eeaf1003ac 89 if (err < 0) {
galonso@rhomb.io 0:91eeaf1003ac 90 printf("Fail :(\n");
galonso@rhomb.io 0:91eeaf1003ac 91 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 92 }
galonso@rhomb.io 0:91eeaf1003ac 93 }
galonso@rhomb.io 0:91eeaf1003ac 94
galonso@rhomb.io 0:91eeaf1003ac 95 printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
galonso@rhomb.io 0:91eeaf1003ac 96
galonso@rhomb.io 0:91eeaf1003ac 97 printf("Seeking file... ");
galonso@rhomb.io 0:91eeaf1003ac 98 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 99 err = fseek(f, 0, SEEK_SET);
galonso@rhomb.io 0:91eeaf1003ac 100 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 101 if (err < 0) {
galonso@rhomb.io 0:91eeaf1003ac 102 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 103 }
galonso@rhomb.io 0:91eeaf1003ac 104 }
galonso@rhomb.io 0:91eeaf1003ac 105
galonso@rhomb.io 0:91eeaf1003ac 106 // Go through and increment the numbers
galonso@rhomb.io 0:91eeaf1003ac 107 for (int i = 0; i < 10; i++) {
galonso@rhomb.io 0:91eeaf1003ac 108 printf("\rIncrementing numbers (%d/%d)... ", i, 10);
galonso@rhomb.io 0:91eeaf1003ac 109 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 110
galonso@rhomb.io 0:91eeaf1003ac 111 // Get current stream position
galonso@rhomb.io 0:91eeaf1003ac 112 long pos = ftell(f);
galonso@rhomb.io 0:91eeaf1003ac 113
galonso@rhomb.io 0:91eeaf1003ac 114 // Parse out the number and increment
galonso@rhomb.io 0:91eeaf1003ac 115 int32_t number;
galonso@rhomb.io 0:91eeaf1003ac 116 fscanf(f, "%ld", &number);
galonso@rhomb.io 0:91eeaf1003ac 117 number += 1;
galonso@rhomb.io 0:91eeaf1003ac 118
galonso@rhomb.io 0:91eeaf1003ac 119 // Seek to beginning of number
galonso@rhomb.io 0:91eeaf1003ac 120 fseek(f, pos, SEEK_SET);
galonso@rhomb.io 0:91eeaf1003ac 121
galonso@rhomb.io 0:91eeaf1003ac 122 // Store number
galonso@rhomb.io 0:91eeaf1003ac 123 fprintf(f, " %ld\n", number);
galonso@rhomb.io 0:91eeaf1003ac 124
galonso@rhomb.io 0:91eeaf1003ac 125 // Flush between write and read on same file
galonso@rhomb.io 0:91eeaf1003ac 126 fflush(f);
galonso@rhomb.io 0:91eeaf1003ac 127 }
galonso@rhomb.io 0:91eeaf1003ac 128
galonso@rhomb.io 0:91eeaf1003ac 129 printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
galonso@rhomb.io 0:91eeaf1003ac 130
galonso@rhomb.io 0:91eeaf1003ac 131 // Close the file which also flushes any cached writes
galonso@rhomb.io 0:91eeaf1003ac 132 printf("Closing \"/fs/numbers.txt\"... ");
galonso@rhomb.io 0:91eeaf1003ac 133 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 134 err = fclose(f);
galonso@rhomb.io 0:91eeaf1003ac 135 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 136 if (err < 0) {
galonso@rhomb.io 0:91eeaf1003ac 137 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 138 }
galonso@rhomb.io 0:91eeaf1003ac 139
galonso@rhomb.io 0:91eeaf1003ac 140 // Display the root directory
galonso@rhomb.io 0:91eeaf1003ac 141 printf("Opening the root directory... ");
galonso@rhomb.io 0:91eeaf1003ac 142 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 143
galonso@rhomb.io 0:91eeaf1003ac 144 DIR* d = opendir("/fs/");
galonso@rhomb.io 0:91eeaf1003ac 145 printf("%s\n", (!d ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 146 if (!d) {
galonso@rhomb.io 0:91eeaf1003ac 147 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 148 }
galonso@rhomb.io 0:91eeaf1003ac 149
galonso@rhomb.io 0:91eeaf1003ac 150 printf("root directory:\n");
galonso@rhomb.io 0:91eeaf1003ac 151 while (true) {
galonso@rhomb.io 0:91eeaf1003ac 152 struct dirent* e = readdir(d);
galonso@rhomb.io 0:91eeaf1003ac 153 if (!e) {
galonso@rhomb.io 0:91eeaf1003ac 154 break;
galonso@rhomb.io 0:91eeaf1003ac 155 }
galonso@rhomb.io 0:91eeaf1003ac 156
galonso@rhomb.io 0:91eeaf1003ac 157 printf(" %s\n", e->d_name);
galonso@rhomb.io 0:91eeaf1003ac 158 }
galonso@rhomb.io 0:91eeaf1003ac 159
galonso@rhomb.io 0:91eeaf1003ac 160 printf("Closing the root directory... ");
galonso@rhomb.io 0:91eeaf1003ac 161 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 162 err = closedir(d);
galonso@rhomb.io 0:91eeaf1003ac 163 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 164 if (err < 0) {
galonso@rhomb.io 0:91eeaf1003ac 165 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 166 }
galonso@rhomb.io 0:91eeaf1003ac 167
galonso@rhomb.io 0:91eeaf1003ac 168 // Display the numbers file
galonso@rhomb.io 0:91eeaf1003ac 169 printf("Opening \"/fs/numbers.txt\"... ");
galonso@rhomb.io 0:91eeaf1003ac 170 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 171 f = fopen("/fs/numbers.txt", "r");
galonso@rhomb.io 0:91eeaf1003ac 172 printf("%s\n", (!f ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 173 if (!f) {
galonso@rhomb.io 0:91eeaf1003ac 174 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 175 }
galonso@rhomb.io 0:91eeaf1003ac 176
galonso@rhomb.io 0:91eeaf1003ac 177 printf("numbers:\n");
galonso@rhomb.io 0:91eeaf1003ac 178 while (!feof(f)) {
galonso@rhomb.io 0:91eeaf1003ac 179 int c = fgetc(f);
galonso@rhomb.io 0:91eeaf1003ac 180 printf("%c", c);
galonso@rhomb.io 0:91eeaf1003ac 181 }
galonso@rhomb.io 0:91eeaf1003ac 182
galonso@rhomb.io 0:91eeaf1003ac 183 printf("\rClosing \"/fs/numbers.txt\"... ");
galonso@rhomb.io 0:91eeaf1003ac 184 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 185 err = fclose(f);
galonso@rhomb.io 0:91eeaf1003ac 186 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 187 if (err < 0) {
galonso@rhomb.io 0:91eeaf1003ac 188 error("error: %s (%d)\n", strerror(errno), -errno);
galonso@rhomb.io 0:91eeaf1003ac 189 }
galonso@rhomb.io 0:91eeaf1003ac 190
galonso@rhomb.io 0:91eeaf1003ac 191 // Tidy up
galonso@rhomb.io 0:91eeaf1003ac 192 printf("Unmounting... ");
galonso@rhomb.io 0:91eeaf1003ac 193 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 194 err = fileSystem.unmount();
galonso@rhomb.io 0:91eeaf1003ac 195 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 196 if (err < 0) {
galonso@rhomb.io 0:91eeaf1003ac 197 error("error: %s (%d)\n", strerror(-err), err);
galonso@rhomb.io 0:91eeaf1003ac 198 }
galonso@rhomb.io 0:91eeaf1003ac 199
galonso@rhomb.io 0:91eeaf1003ac 200 printf("Initializing the block device... ");
galonso@rhomb.io 0:91eeaf1003ac 201 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 202
galonso@rhomb.io 0:91eeaf1003ac 203 err = blockDevice.init();
galonso@rhomb.io 0:91eeaf1003ac 204 printf("%s\n", (err ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 205 if (err) {
galonso@rhomb.io 0:91eeaf1003ac 206 error("error: %s (%d)\n", strerror(-err), err);
galonso@rhomb.io 0:91eeaf1003ac 207 }
galonso@rhomb.io 0:91eeaf1003ac 208
galonso@rhomb.io 0:91eeaf1003ac 209 printf("Erasing the block device... ");
galonso@rhomb.io 0:91eeaf1003ac 210 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 211 err = blockDevice.erase(0, blockDevice.size());
galonso@rhomb.io 0:91eeaf1003ac 212 printf("%s\n", (err ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 213 if (err) {
galonso@rhomb.io 0:91eeaf1003ac 214 error("error: %s (%d)\n", strerror(-err), err);
galonso@rhomb.io 0:91eeaf1003ac 215 }
galonso@rhomb.io 0:91eeaf1003ac 216
galonso@rhomb.io 0:91eeaf1003ac 217 printf("Deinitializing the block device... ");
galonso@rhomb.io 0:91eeaf1003ac 218 fflush(stdout);
galonso@rhomb.io 0:91eeaf1003ac 219 err = blockDevice.deinit();
galonso@rhomb.io 0:91eeaf1003ac 220 printf("%s\n", (err ? "Fail :(" : "OK"));
galonso@rhomb.io 0:91eeaf1003ac 221 if (err) {
galonso@rhomb.io 0:91eeaf1003ac 222 error("error: %s (%d)\n", strerror(-err), err);
galonso@rhomb.io 0:91eeaf1003ac 223 }
galonso@rhomb.io 0:91eeaf1003ac 224
galonso@rhomb.io 0:91eeaf1003ac 225 printf("\r\n");
galonso@rhomb.io 0:91eeaf1003ac 226
galonso@rhomb.io 0:91eeaf1003ac 227 printf("Mbed OS filesystem example done!\n");
galonso@rhomb.io 0:91eeaf1003ac 228 }