esp-open-rtos/extras/spiffs
2016-07-15 15:44:22 +03:00
..
mkspiffs Create SPIFFS image and flash it. 2016-07-14 14:49:34 +03:00
spiffs@c6e94fdca5 Draft implementation of SPIFFS integration 2016-07-14 14:49:34 +03:00
component.mk SPIFFS: Fix SPIFFS rebuild if SIZE is changed. 2016-07-15 15:44:22 +03:00
esp_spiffs.c SPIFFS: Update example, README.md 2016-07-15 15:22:03 +03:00
esp_spiffs.h SPIFFS: Update example, README.md 2016-07-15 15:22:03 +03:00
README.md SPIFFS: Update example, README.md 2016-07-15 15:22:03 +03:00
spiffs_config.h Draft implementation of SPIFFS integration 2016-07-14 14:49:34 +03:00

SPIFFS ESP8266 File system

This component adds file system support for ESP8266. File system of choice for ESP8266 is 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