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
main.cpp@5:37e9573e91f6, 2019-09-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |