Run a file system on the Dragonfly's SPI Flash.

Dependencies:   SpiFlash25 flash-fs

Committer:
Leon Lindenfelser
Date:
Fri Jun 26 16:49:06 2020 -0500
Revision:
0:54ec26dc283f
Initial commit for mbed 5 version of this program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Leon Lindenfelser 0:54ec26dc283f 1 /** Dragonfly Filesystem Example
Leon Lindenfelser 0:54ec26dc283f 2 * Opens file in filesystem, prints contents of the file, and writes to the file.
Leon Lindenfelser 0:54ec26dc283f 3 *
Leon Lindenfelser 0:54ec26dc283f 4 * NOTE: This example changes the baud rate of the debug port to 115200 baud!
Leon Lindenfelser 0:54ec26dc283f 5 */
Leon Lindenfelser 0:54ec26dc283f 6 #include "mbed.h"
Leon Lindenfelser 0:54ec26dc283f 7 #include "SpiFlash25.h"
Leon Lindenfelser 0:54ec26dc283f 8 #include "spiffs.h"
Leon Lindenfelser 0:54ec26dc283f 9 #include <string>
Leon Lindenfelser 0:54ec26dc283f 10
Leon Lindenfelser 0:54ec26dc283f 11 // This line controls the regulator's battery charger.
Leon Lindenfelser 0:54ec26dc283f 12 // BC_NCE = 0 enables the battery charger
Leon Lindenfelser 0:54ec26dc283f 13 // BC_NCE = 1 disables the battery charger
Leon Lindenfelser 0:54ec26dc283f 14 DigitalOut bc_nce(PB_2);
Leon Lindenfelser 0:54ec26dc283f 15
Leon Lindenfelser 0:54ec26dc283f 16 // this value represents the number of files you can have open at the same time
Leon Lindenfelser 0:54ec26dc283f 17 // adjust it according to your requirements
Leon Lindenfelser 0:54ec26dc283f 18 #define MAX_CONCURRENT_FDS 4
Leon Lindenfelser 0:54ec26dc283f 19
Leon Lindenfelser 0:54ec26dc283f 20 #define PAGE_SIZE 256
Leon Lindenfelser 0:54ec26dc283f 21 #define SECTOR_SIZE 64*1024
Leon Lindenfelser 0:54ec26dc283f 22 #define MEM_SIZE 2*1024*1024
Leon Lindenfelser 0:54ec26dc283f 23
Leon Lindenfelser 0:54ec26dc283f 24 static u8_t spiffs_work_buf[PAGE_SIZE * 2];
Leon Lindenfelser 0:54ec26dc283f 25 static u8_t spiffs_fds[32 * MAX_CONCURRENT_FDS];
Leon Lindenfelser 0:54ec26dc283f 26 static u8_t spiffs_cache_buf[(PAGE_SIZE + 32) * 4];
Leon Lindenfelser 0:54ec26dc283f 27
Leon Lindenfelser 0:54ec26dc283f 28 static SpiFlash25 flash(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS1);
Leon Lindenfelser 0:54ec26dc283f 29 static spiffs fs;
Leon Lindenfelser 0:54ec26dc283f 30 static spiffs_config cfg;
Leon Lindenfelser 0:54ec26dc283f 31
Leon Lindenfelser 0:54ec26dc283f 32 // glue code between SPI driver and filesystem driver
Leon Lindenfelser 0:54ec26dc283f 33 int spi_read(unsigned int addr, unsigned int size, unsigned char* data) {
Leon Lindenfelser 0:54ec26dc283f 34 if (flash.read(addr, size, (char*)data))
Leon Lindenfelser 0:54ec26dc283f 35 return SPIFFS_OK;
Leon Lindenfelser 0:54ec26dc283f 36 return -1;
Leon Lindenfelser 0:54ec26dc283f 37 }
Leon Lindenfelser 0:54ec26dc283f 38 int spi_write(unsigned int addr, unsigned int size, unsigned char* data) {
Leon Lindenfelser 0:54ec26dc283f 39 if (flash.write(addr, size, (const char*)data))
Leon Lindenfelser 0:54ec26dc283f 40 return SPIFFS_OK;
Leon Lindenfelser 0:54ec26dc283f 41 return -1;
Leon Lindenfelser 0:54ec26dc283f 42 }
Leon Lindenfelser 0:54ec26dc283f 43 int spi_erase(unsigned int addr, unsigned int size) {
Leon Lindenfelser 0:54ec26dc283f 44 flash.clear_sector(addr);
Leon Lindenfelser 0:54ec26dc283f 45 return SPIFFS_OK;
Leon Lindenfelser 0:54ec26dc283f 46 }
Leon Lindenfelser 0:54ec26dc283f 47
Leon Lindenfelser 0:54ec26dc283f 48 int main(void) {
Leon Lindenfelser 0:54ec26dc283f 49 // Disable the battery charger unless a battery is attached.
Leon Lindenfelser 0:54ec26dc283f 50 bc_nce = 1;
Leon Lindenfelser 0:54ec26dc283f 51
Leon Lindenfelser 0:54ec26dc283f 52 int ret;
Leon Lindenfelser 0:54ec26dc283f 53 int handle;
Leon Lindenfelser 0:54ec26dc283f 54 char data[256];
Leon Lindenfelser 0:54ec26dc283f 55 char msg[] = "Hello World! The sneaky cat crept around the sleeping dog.\r\n";
Leon Lindenfelser 0:54ec26dc283f 56 char file[] = "test.txt";
Leon Lindenfelser 0:54ec26dc283f 57 string sdata;
Leon Lindenfelser 0:54ec26dc283f 58
Leon Lindenfelser 0:54ec26dc283f 59 // configure the filesystem
Leon Lindenfelser 0:54ec26dc283f 60 cfg.phys_size = MEM_SIZE;
Leon Lindenfelser 0:54ec26dc283f 61 cfg.phys_addr = 0;
Leon Lindenfelser 0:54ec26dc283f 62 cfg.phys_erase_block = SECTOR_SIZE;
Leon Lindenfelser 0:54ec26dc283f 63 cfg.log_block_size = SECTOR_SIZE;
Leon Lindenfelser 0:54ec26dc283f 64 cfg.log_page_size = PAGE_SIZE;
Leon Lindenfelser 0:54ec26dc283f 65
Leon Lindenfelser 0:54ec26dc283f 66 cfg.hal_read_f = &spi_read;
Leon Lindenfelser 0:54ec26dc283f 67 cfg.hal_write_f = &spi_write;
Leon Lindenfelser 0:54ec26dc283f 68 cfg.hal_erase_f = &spi_erase;
Leon Lindenfelser 0:54ec26dc283f 69
Leon Lindenfelser 0:54ec26dc283f 70 Serial pc(USBTX, USBRX);
Leon Lindenfelser 0:54ec26dc283f 71 pc.baud(115200);
Leon Lindenfelser 0:54ec26dc283f 72
Leon Lindenfelser 0:54ec26dc283f 73 printf("Dragonfly spi flash example started\r\n");
Leon Lindenfelser 0:54ec26dc283f 74
Leon Lindenfelser 0:54ec26dc283f 75 // erase entire flash
Leon Lindenfelser 0:54ec26dc283f 76 // THIS WILL ERASE THE ENTIRE FLASH! EVERYTHING ON IT WILL BE LOST AND CANNOT BE RECOVERED!
Leon Lindenfelser 0:54ec26dc283f 77 //flash.clear_mem();
Leon Lindenfelser 0:54ec26dc283f 78
Leon Lindenfelser 0:54ec26dc283f 79 // mount the filesystem
Leon Lindenfelser 0:54ec26dc283f 80 ret = SPIFFS_mount(&fs, &cfg, spiffs_work_buf, spiffs_fds, sizeof(spiffs_fds), spiffs_cache_buf, sizeof(spiffs_cache_buf), NULL);
Leon Lindenfelser 0:54ec26dc283f 81 if (ret) {
Leon Lindenfelser 0:54ec26dc283f 82 printf("SPIFFS_mount failed %d - can't continue\r\n", ret);
Leon Lindenfelser 0:54ec26dc283f 83 return 1;
Leon Lindenfelser 0:54ec26dc283f 84 }
Leon Lindenfelser 0:54ec26dc283f 85
Leon Lindenfelser 0:54ec26dc283f 86 // write to the file
Leon Lindenfelser 0:54ec26dc283f 87 handle = SPIFFS_open(&fs, file, SPIFFS_CREAT | SPIFFS_RDWR | SPIFFS_APPEND, 0);
Leon Lindenfelser 0:54ec26dc283f 88 if (handle < 0)
Leon Lindenfelser 0:54ec26dc283f 89 printf("SPIFFS_open failed %d\r\n", SPIFFS_errno(&fs));
Leon Lindenfelser 0:54ec26dc283f 90
Leon Lindenfelser 0:54ec26dc283f 91 if (handle) {
Leon Lindenfelser 0:54ec26dc283f 92 ret = SPIFFS_write(&fs, handle, msg, sizeof(msg));
Leon Lindenfelser 0:54ec26dc283f 93 if (ret < 0)
Leon Lindenfelser 0:54ec26dc283f 94 printf("SPIFFS_write failed %d\r\n", SPIFFS_errno(&fs));
Leon Lindenfelser 0:54ec26dc283f 95 else
Leon Lindenfelser 0:54ec26dc283f 96 printf("Wrote %d bytes\r\n", ret);
Leon Lindenfelser 0:54ec26dc283f 97 SPIFFS_close(&fs, handle);
Leon Lindenfelser 0:54ec26dc283f 98 }
Leon Lindenfelser 0:54ec26dc283f 99
Leon Lindenfelser 0:54ec26dc283f 100 // read the current file contents
Leon Lindenfelser 0:54ec26dc283f 101 spiffs_stat stat;
Leon Lindenfelser 0:54ec26dc283f 102 memset(&stat, 0, sizeof(stat));
Leon Lindenfelser 0:54ec26dc283f 103 ret = SPIFFS_stat(&fs, file, &stat);
Leon Lindenfelser 0:54ec26dc283f 104 if (ret)
Leon Lindenfelser 0:54ec26dc283f 105 printf("SPIFFS_stat failed %d\r\n", SPIFFS_errno(&fs));
Leon Lindenfelser 0:54ec26dc283f 106 else
Leon Lindenfelser 0:54ec26dc283f 107 printf("File size: %d bytes\r\n", stat.size);
Leon Lindenfelser 0:54ec26dc283f 108
Leon Lindenfelser 0:54ec26dc283f 109 handle = SPIFFS_open(&fs, file, SPIFFS_RDWR, 0);
Leon Lindenfelser 0:54ec26dc283f 110 if (handle < 0)
Leon Lindenfelser 0:54ec26dc283f 111 printf("SPIFFS_open failed %d\r\n", SPIFFS_errno(&fs));
Leon Lindenfelser 0:54ec26dc283f 112
Leon Lindenfelser 0:54ec26dc283f 113 if (handle) {
Leon Lindenfelser 0:54ec26dc283f 114 while (sdata.size() < stat.size) {
Leon Lindenfelser 0:54ec26dc283f 115 ret = SPIFFS_read(&fs, handle, data, stat.size - sdata.size() < sizeof(data) ? stat.size - sdata.size() : sizeof(data));
Leon Lindenfelser 0:54ec26dc283f 116 if (ret < 0) {
Leon Lindenfelser 0:54ec26dc283f 117 printf("SPIFFS_read failed %d\r\n", SPIFFS_errno(&fs));
Leon Lindenfelser 0:54ec26dc283f 118 continue;
Leon Lindenfelser 0:54ec26dc283f 119 }
Leon Lindenfelser 0:54ec26dc283f 120 printf("Read %d bytes\r\n", ret);
Leon Lindenfelser 0:54ec26dc283f 121 sdata.append(data, ret);
Leon Lindenfelser 0:54ec26dc283f 122 }
Leon Lindenfelser 0:54ec26dc283f 123
Leon Lindenfelser 0:54ec26dc283f 124 printf("Data [\r\n");
Leon Lindenfelser 0:54ec26dc283f 125 for (int i = 0; i < sdata.size(); i++)
Leon Lindenfelser 0:54ec26dc283f 126 printf("%c", sdata[i]);
Leon Lindenfelser 0:54ec26dc283f 127 printf("\r\n]\r\n");
Leon Lindenfelser 0:54ec26dc283f 128
Leon Lindenfelser 0:54ec26dc283f 129 SPIFFS_close(&fs, handle);
Leon Lindenfelser 0:54ec26dc283f 130 }
Leon Lindenfelser 0:54ec26dc283f 131
Leon Lindenfelser 0:54ec26dc283f 132 printf("Dragonfly spi flash example finished\r\n\r\n");
Leon Lindenfelser 0:54ec26dc283f 133
Leon Lindenfelser 0:54ec26dc283f 134 return 0;
Leon Lindenfelser 0:54ec26dc283f 135 }