# SPIFFS ESP8266 File system This component adds file system support for ESP8266. File system of choice for ESP8266 is [SPIFFS](https://github.com/pellepl/spiffs). It was specifically designed to use with SPI NOR flash on embedded systems. The main advantage of SPIFFS is wear leveling, which prolongs life time of a flash memory. ## Features * SPIFFS - embedded file system for NOR flash memory. * POSIX file operations. * Static files upload to ESP8266 file system within build process. * SPIFFS singleton configuration. Only one instance of FS on a device. ## Usage In order to use file system in a project the following steps should be made: * Add SPIFFS component in a project Makefile `EXTRA_COMPONENTS = extras/spiffs` * Specify your flash size in the Makefile `FLASH_SIZE = 32` * Specify the start address of file system region on the flash memory `SPIFFS_BASE_ADDR = 0x200000` * If you want to upload files to a file system during flash process specify the directory with files `$(eval $(call make_spiffs_image,files))` In the end the Makefile should look like: ``` PROGRAM=spiffs_example EXTRA_COMPONENTS = extras/spiffs FLASH_SIZE = 32 SPIFFS_BASE_ADDR = 0x200000 SPIFFS_SIZE = 0x100000 include ../../common.mk $(eval $(call make_spiffs_image,files)) ``` Note: Macro call to prepare SPIFFS image for flashing should go after `include common.mk` ### Files upload To upload files to a file system during flash process the following macro is used: ``` $(eval $(call make_spiffs_image,files)) ``` It enables the build of a helper utility **mkspiffs**. This utility creates an SPIFFS image with files in the specified directory. The SPIFFS image is created during build stage, after `make` is run. The image is flashed into the device along with firmware during flash stage, after `make flash` is run. **mkspiffs** utility uses the same SPIFFS source code and the same configuration as ESP8266. So the created image should always be compatible with SPIFFS on a device. The build process will catch any changes in files directory and rebuild the image each time `make` is run. The build process will handle SPIFFS_SIZE change and rebuild **mkspiffs** utility and the image. ## Example ### Mount ``` esp_spiffs_init(); // allocate memory buffers if (esp_spiffs_mount() != SPIFFS_OK) { printf("Error mounting SPIFFS\n"); } ``` ### Format Formatting SPIFFS is a little bit awkward. Before formatting SPIFFS must be mounted and unmounted. ``` esp_spiffs_init(); if (esp_spiffs_mount() != SPIFFS_OK) { printf("Error mount SPIFFS\n"); } SPIFFS_unmount(&fs); // FS must be unmounted before formating if (SPIFFS_format(&fs) == SPIFFS_OK) { printf("Format complete\n"); } else { printf("Format failed\n"); } esp_spiffs_mount(); ``` ### POSIX read Nothing special here. ``` const int buf_size = 0xFF; uint8_t buf[buf_size]; int fd = open("test.txt", O_RDONLY); if (fd < 0) { printf("Error opening file\n"); } read(fd, buf, buf_size); printf("Data: %s\n", buf); close(fd); ``` ### SPIFFS read SPIFFS interface is intended to be as close to POSIX as possible. ``` const int buf_size = 0xFF; uint8_t buf[buf_size]; spiffs_file fd = SPIFFS_open(&fs, "other.txt", SPIFFS_RDONLY, 0); if (fd < 0) { printf("Error opening file\n"); } SPIFFS_read(&fs, fd, buf, buf_size); printf("Data: %s\n", buf); SPIFFS_close(&fs, fd); ``` ### POSIX write ``` uint8_t buf[] = "Example data, written by ESP8266"; int fd = open("other.txt", O_WRONLY|O_CREAT, 0); if (fd < 0) { printf("Error opening file\n"); } write(fd, buf, sizeof(buf)); close(fd); ``` ## Resources [SPIFFS](https://github.com/pellepl/spiffs)