Skip to content

LITTLEFS update - partition label and multiple partitions, idea copie… #5023

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,13 @@

/* 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 */
https://github.com/lorol/arduino-esp32littlefs-plugin

If you test two partitions, you need to use a custom
partition.csv file, see in the sketch folder */

//#define TWOPART

#define FORMAT_LITTLEFS_IF_FAILED true

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
Expand Down Expand Up @@ -123,9 +128,8 @@ void deleteFile(fs::FS &fs, const char * path){
}
}

// SPIFFS-like write and delete file
// SPIFFS-like write and delete file, better use #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1

// 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, '/')) {
Expand Down Expand Up @@ -158,7 +162,6 @@ void writeFile2(fs::FS &fs, const char * path, const char * message){
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);

Expand Down Expand Up @@ -239,6 +242,19 @@ void testFileIO(fs::FS &fs, const char * path){

void setup(){
Serial.begin(115200);

#ifdef TWOPART
if(!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED, "/lfs2", 5, "part2")){
Serial.println("part2 Mount Failed");
return;
}
appendFile(LITTLEFS, "/hello0.txt", "World0!\r\n");
readFile(LITTLEFS, "/hello0.txt");
LITTLEFS.end();

Serial.println( "Done with part2, work with the first lfs partition..." );
#endif

if(!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED)){
Serial.println("LITTLEFS Mount Failed");
return;
Expand All @@ -264,7 +280,7 @@ void setup(){
testFileIO(LITTLEFS, "/test.txt");
deleteFile(LITTLEFS, "/test.txt");

Serial.println( "Test complete" );
Serial.println( "Test complete" );
}

void loop(){
Expand Down
8 changes: 8 additions & 0 deletions libraries/LITTLEFS/examples/LITTLEFS_test/partitions.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x100000,
app1, app, ota_1, ,0x100000,
spiffs, data, spiffs, ,0x1D0000,
part2, data, spiffs, ,0x20000,
#1048576
59 changes: 46 additions & 13 deletions libraries/LITTLEFS/src/LITTLEFS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,38 +12,71 @@
// See the License for the specific language governing permissions and
// limitations under the License.

static constexpr const char LFS_NAME[] = "spiffs";


#include "vfs_api.h"

extern "C" {
#include <sys/unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#undef B110
#undef B1000000
#include "esp_littlefs.h"
#include "esp_littlefs.h"
}

#include "LITTLEFS.h"

using namespace fs;

LITTLEFSFS::LITTLEFSFS() : FS(FSImplPtr(new VFSImpl()))
class LITTLEFSImpl : public VFSImpl
{
public:
LITTLEFSImpl();
virtual ~LITTLEFSImpl() { }
virtual bool exists(const char* path);
};

LITTLEFSImpl::LITTLEFSImpl()
{
}

bool LITTLEFSImpl::exists(const char* path)
{
File f = open(path, "r");
return (f == true);
}

bool LITTLEFSFS::begin(bool formatOnFail, const char * basePath, uint8_t maxOpenFilesUnused)
LITTLEFSFS::LITTLEFSFS() : FS(FSImplPtr(new LITTLEFSImpl())), partitionLabel_(NULL)
{
if(esp_littlefs_mounted(LFS_NAME)){
}

LITTLEFSFS::~LITTLEFSFS()
{
if (partitionLabel_){
free(partitionLabel_);
partitionLabel_ = NULL;
}
}

bool LITTLEFSFS::begin(bool formatOnFail, const char * basePath, uint8_t maxOpenFiles, const char * partitionLabel)
{

if (partitionLabel_){
free(partitionLabel_);
partitionLabel_ = NULL;
}

if (partitionLabel){
partitionLabel_ = strdup(partitionLabel);
}

if(esp_littlefs_mounted(partitionLabel_)){
log_w("LITTLEFS Already Mounted!");
return true;
}

esp_vfs_littlefs_conf_t conf = {
.base_path = basePath,
.partition_label = LFS_NAME,
.partition_label = partitionLabel_,
.format_if_mount_failed = false
};

Expand All @@ -63,8 +96,8 @@ bool LITTLEFSFS::begin(bool formatOnFail, const char * basePath, uint8_t maxOpen

void LITTLEFSFS::end()
{
if(esp_littlefs_mounted(LFS_NAME)){
esp_err_t err = esp_vfs_littlefs_unregister(LFS_NAME);
if(esp_littlefs_mounted(partitionLabel_)){
esp_err_t err = esp_vfs_littlefs_unregister(partitionLabel_);
if(err){
log_e("Unmounting LITTLEFS failed! Error: %d", err);
return;
Expand All @@ -76,7 +109,7 @@ void LITTLEFSFS::end()
bool LITTLEFSFS::format()
{
disableCore0WDT();
esp_err_t err = esp_littlefs_format(LFS_NAME);
esp_err_t err = esp_littlefs_format(partitionLabel_);
enableCore0WDT();
if(err){
log_e("Formatting LITTLEFS failed! Error: %d", err);
Expand All @@ -88,7 +121,7 @@ bool LITTLEFSFS::format()
size_t LITTLEFSFS::totalBytes()
{
size_t total,used;
if(esp_littlefs_info(LFS_NAME, &total, &used)){
if(esp_littlefs_info(partitionLabel_, &total, &used)){
return 0;
}
return total;
Expand All @@ -97,7 +130,7 @@ size_t LITTLEFSFS::totalBytes()
size_t LITTLEFSFS::usedBytes()
{
size_t total,used;
if(esp_littlefs_info(LFS_NAME, &total, &used)){
if(esp_littlefs_info(partitionLabel_, &total, &used)){
return 0;
}
return used;
Expand Down
6 changes: 5 additions & 1 deletion libraries/LITTLEFS/src/LITTLEFS.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,15 @@ class LITTLEFSFS : public FS
{
public:
LITTLEFSFS();
bool begin(bool formatOnFail=false, const char * basePath="/littlefs", uint8_t maxOpenFiles=5);
~LITTLEFSFS();
bool begin(bool formatOnFail=false, const char * basePath="/littlefs", uint8_t maxOpenFiles=10, const char * partitionLabel="spiffs");
bool format();
size_t totalBytes();
size_t usedBytes();
void end();

private:
char * partitionLabel_;
};

}
Expand Down