platform-espressif32: LittleFS fails on LOLIN_S3 board if you set board = lolin_s3

What kind of issue is this?

I have a LOLIN S3 board. In platformio.ini file, when I compile below code using board = lolin_s3 and it fails to run/mount LittleFS. If I simply change board = lolin_s3_mini all works perferctly.

  • PlatformIO IDE. VSC on Windows 11

  • Development Platform or Board. LOLIN S3

  • PlatformIO Core. PlatformIO Core: 6.1.11


Configuration

Windows 11

PlatformIO Version (platformio --version):

Description of problem

Fails when board = lolin_s3 but works perfectly when board = lolin_s3_mini in platformio.ini file My actual board is LOLIN_S3 for all tests.

platformio.ini file:

[env:lolin_s3]
platform = espressif32@6.4.0
board = lolin_s3
framework = arduino
board_build.filesystem = littlefs
upload_port = COM8
monitor_speed = 115200

Serial Output when board = lolin_s3 in platformio.ini file

---- Opened the serial port COM8 ----
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x44c
load:0x403c9700,len:0xbe4
load:0x403cc700,len:0x2a68
entry 0x403c98d4
[   138][E][vfs_api.cpp:332] VFSFileImpl(): fopen(/littlefs/mydir/newdir2/newdir3/hello3.txt) failed
[   140][E][vfs_api.cpp:105] open(): /littlefs/mydir/newdir2/newdir3/hello3.txt does not exist, no permits for creation
[   227][E][vfs_api.cpp:29] open(): mydir does not start with /
[   254][E][vfs_api.cpp:182] remove(): /mydir/newdir2/newdir3/hello3.txt does not exists or is directory
[   283][E][vfs_api.cpp:250] rmdir(): /mydir does not exists or is a file

Serial Output when board = lolin_s3_mini in platformio.ini file

---- Opened the serial port COM8 ----
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x44c
load:0x403c9700,len:0xbe4
load:0x403cc700,len:0x2a68
entry 0x403c98d4
E (93) psram: PSRAM ID read error: 0x00ffffff, PSRAM chip not found or not���LittleFS Mount OK!
Listing directory: /
Creating Dir: /mydir
Dir created
Writing file: /mydir/hello2.txt
- file written
Writing file: /mydir/newdir2/newdir3/hello3.txt
[   158][E][vfs_api.cpp:332] VFSFileImpl(): fopen(/littlefs/mydir/newdir2/newdir3/hello3.txt) failed
- failed to open file for writing
[   172][E][vfs_api.cpp:105] open(): /littlefs/mydir/newdir2/newdir3/hello3.txt does not exist, no permits for creation
Create missing folders of: /mydir/newdir2/newdir3/hello3.txt
Writing file to: /mydir/newdir2/newdir3/hello3.txt
- file written
Listing directory: /
  DIR : mydir  LAST WRITE: 1969-12-31 23:59:59
Listing directory: mydir
[   286][E][vfs_api.cpp:29] open(): mydir does not start with /
- failed to open directory
Deleting file: /mydir/hello2.txt
- file deleted
Deleting file: /mydir/newdir2/newdir3/hello3.txt
- file deleted
Deleting file and empty folders on path: /mydir/newdir2/newdir3/hello3.txt
[   328][E][vfs_api.cpp:182] remove(): /mydir/newdir2/newdir3/hello3.txt does not exists or is directory
- delete failed
Removing all empty folders on path: /mydir/newdir2/newdir3/hello3.txt
Removing Dir: /mydir
[   380][E][vfs_api.cpp:250] rmdir(): /mydir does not exists or is a file
rmdir failed
Listing directory: /
Writing file: /hello.txt
- file written
Appending to file: /hello.txt
- message appended
Reading file: /hello.txt
- read from file:
Hello World!
Renaming file /hello.txt to /foo.txt
- file renamed
Reading file: /foo.txt
- read from file:
Hello World!
Deleting file: /foo.txt
- file deleted
Testing file I/O with /test.txt
- writing................................................................
 - 1048576 bytes written in 11928 ms
- reading................................................................
- 1048576 bytes read in 349 ms
Deleting file: /test.txt
- file deleted
Test complete

Source code: main.cpp

#include <Arduino.h>

#include "FS.h"
#include "LittleFS.h"


#include <time.h>

/* You only need to format LittleFS the first time you run a
   test or else use the LITTLEFS plugin to create a partition
   https://github.com/lorol/arduino-esp32littlefs-plugin */
   
#define FORMAT_LITTLEFS_IF_FAILED true

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\r\n", dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println("- failed to open directory");
        return;
    }
    if(!root.isDirectory()){
        Serial.println(" - not a directory");
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print("  DIR : ");

            Serial.print(file.name());
            time_t t= file.getLastWrite();
            struct tm * tmstruct = localtime(&t);
            Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);

            if(levels){
                listDir(fs, file.name(), levels -1);
            }
        } else {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("  SIZE: ");

            Serial.print(file.size());
            time_t t= file.getLastWrite();
            struct tm * tmstruct = localtime(&t);
            Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);
        }
        file = root.openNextFile();
    }
}

void createDir(fs::FS &fs, const char * path){
    Serial.printf("Creating Dir: %s\n", path);
    if(fs.mkdir(path)){
        Serial.println("Dir created");
    } else {
        Serial.println("mkdir failed");
    }
}

void removeDir(fs::FS &fs, const char * path){
    Serial.printf("Removing Dir: %s\n", path);
    if(fs.rmdir(path)){
        Serial.println("Dir removed");
    } else {
        Serial.println("rmdir failed");
    }
}

void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\r\n", path);

    File file = fs.open(path);
    if(!file || file.isDirectory()){
        Serial.println("- failed to open file for reading");
        return;
    }

    Serial.println("- read from file:");
    while(file.available()){
        Serial.write(file.read());
    }
    file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\r\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\r\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("- failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("- message appended");
    } else {
        Serial.println("- append failed");
    }
    file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\r\n", path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println("- file renamed");
    } else {
        Serial.println("- rename failed");
    }
}

void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\r\n", path);
    if(fs.remove(path)){
        Serial.println("- file deleted");
    } else {
        Serial.println("- delete failed");
    }
}

// LittleFS-like write and delete file

// See: https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.cpp#L60
void writeFile2(fs::FS &fs, const char * path, const char * message){
    if(!fs.exists(path)){
		if (strchr(path, '/')) {
            Serial.printf("Create missing folders of: %s\r\n", path);
			char *pathStr = strdup(path);
			if (pathStr) {
				char *ptr = strchr(pathStr, '/');
				while (ptr) {
					*ptr = 0;
					fs.mkdir(pathStr);
					*ptr = '/';
					ptr = strchr(ptr+1, '/');
				}
			}
			free(pathStr);
		}
    }

    Serial.printf("Writing file to: %s\r\n", path);
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

// See:  https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.h#L149
void deleteFile2(fs::FS &fs, const char * path){
    Serial.printf("Deleting file and empty folders on path: %s\r\n", path);

    if(fs.remove(path)){
        Serial.println("- file deleted");
    } else {
        Serial.println("- delete failed");
    }

    char *pathStr = strdup(path);
    if (pathStr) {
        char *ptr = strrchr(pathStr, '/');
        if (ptr) {
            Serial.printf("Removing all empty folders on path: %s\r\n", path);
        }
        while (ptr) {
            *ptr = 0;
            fs.rmdir(pathStr);
            ptr = strrchr(pathStr, '/');
        }
        free(pathStr);
    }
}

void testFileIO(fs::FS &fs, const char * path){
    Serial.printf("Testing file I/O with %s\r\n", path);

    static uint8_t buf[512];
    size_t len = 0;
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }

    size_t i;
    Serial.print("- writing" );
    uint32_t start = millis();
    for(i=0; i<2048; i++){
        if ((i & 0x001F) == 0x001F){
          Serial.print(".");
        }
        file.write(buf, 512);
    }
    Serial.println("");
    uint32_t end = millis() - start;
    Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
    file.close();

    file = fs.open(path);
    start = millis();
    end = start;
    i = 0;
    if(file && !file.isDirectory()){
        len = file.size();
        size_t flen = len;
        start = millis();
        Serial.print("- reading" );
        while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            if ((i++ & 0x001F) == 0x001F){
              Serial.print(".");
            }
            len -= toRead;
        }
        Serial.println("");
        end = millis() - start;
        Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
        file.close();
    } else {
        Serial.println("- failed to open file for reading");
    }
}

void setup(){
    Serial.begin(115200);
    if (!LittleFS.begin(true)){
        Serial.println("LittleFS Mount Failed");
        return;
    } else {
        Serial.println("LittleFS Mount OK!");
    }
    
    listDir(LittleFS, "/", 0);
	createDir(LittleFS, "/mydir");
	writeFile(LittleFS, "/mydir/hello2.txt", "Hello2");
    writeFile(LittleFS, "/mydir/newdir2/newdir3/hello3.txt", "Hello3");
    writeFile2(LittleFS, "/mydir/newdir2/newdir3/hello3.txt", "Hello3");
	listDir(LittleFS, "/", 3);
	deleteFile(LittleFS, "/mydir/hello2.txt");
    deleteFile(LittleFS, "/mydir/newdir2/newdir3/hello3.txt");
    deleteFile2(LittleFS, "/mydir/newdir2/newdir3/hello3.txt");
	removeDir(LittleFS, "/mydir");
	listDir(LittleFS, "/", 3);
    writeFile(LittleFS, "/hello.txt", "Hello ");
    appendFile(LittleFS, "/hello.txt", "World!\r\n");
    readFile(LittleFS, "/hello.txt");
    renameFile(LittleFS, "/hello.txt", "/foo.txt");
    readFile(LittleFS, "/foo.txt");
    deleteFile(LittleFS, "/foo.txt");
    testFileIO(LittleFS, "/test.txt");
    deleteFile(LittleFS, "/test.txt");
	
    Serial.println( "Test complete" );
}

void loop(){

}

About this issue

  • Original URL
  • State: open
  • Created 8 months ago
  • Comments: 16 (5 by maintainers)

Most upvoted comments

thank you @robertlipe @ivankravets your thoughts on this would be greatly appreciated