QSPI external flash block device for file system on external flash for DISCO_L475VG_IOT01

Dependencies:   BSP_B-L475E-IOT01

Committer:
DoronRaifman
Date:
Thu Apr 26 09:27:12 2018 +0000
Revision:
1:2baccc030920
Parent:
0:0ca082ff5da6
QSPI external flash block device for file system on external flash;  for DISCO_L475VG_IOT01

Who changed what in which revision?

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