Skip to content

Latest commit

 

History

History
224 lines (167 loc) · 4.84 KB

File metadata and controls

224 lines (167 loc) · 4.84 KB

ESP32 FAT Filesystem Test Project

This project tests the FAT filesystem implementation with ESP32 Wear Leveling support.

Overview

This project demonstrates:

  • Building FAT filesystem images with wear leveling layer
  • Uploading FAT images to ESP32
  • Mounting and reading FAT filesystem on ESP32
  • Downloading and extracting FAT images from ESP32

Requirements

  • PlatformIO
  • ESP32 development board
  • USB cable

Project Structure

arduino-fatfs/
├── data/                    # Files to be included in FAT image
│   ├── test.txt
│   ├── README.md
│   └── ...
├── src/
│   └── ffat.ino            # Main Arduino sketch
├── partitions.csv          # Partition table with FAT partition
├── platformio.ini          # PlatformIO configuration
└── unpacked_fs/            # Downloaded files (created by download_fatfs)

Usage

1. Build Firmware

pio run

2. Build FAT Filesystem Image

Place your files in the data/ directory, then:

pio run -t buildfs

This creates a FAT filesystem image with ESP32 wear leveling layer at: .pio/build/esp32dev/fatfs.bin

3. Upload Firmware and Filesystem

# Upload firmware
pio run -t upload

# Upload filesystem
pio run -t uploadfs

4. Monitor Serial Output

pio run -t monitor

Expected output:

FFat mounted successfully
Test begin
Total space:    1486848
Free space:     1482752
Listing directory: /
  FILE: test.txt    SIZE: 12
  FILE: README.md   SIZE: 1234
Test complete

5. Download Filesystem from Device

To download and extract the filesystem from the device:

pio run -t download_fatfs

Files will be extracted to unpacked_fs/ directory.

Partition Table

The partitions.csv defines the flash layout:

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
ffat,     data, fat,     0x290000,0x170000,

The ffat partition:

  • Type: data
  • SubType: fat (0x81)
  • Offset: 0x290000 (2,686,976 bytes)
  • Size: 0x170000 (1,507,328 bytes = ~1.44 MB)

Wear Leveling

The FAT filesystem is automatically wrapped with ESP32's wear leveling layer:

  • Total partition: 1,507,328 bytes (368 sectors × 4096 bytes)
  • WL overhead: 20,480 bytes (5 sectors)
  • FAT data: 1,486,848 bytes (363 sectors)

Structure:

[WL State 1][WL State 2][FAT Data][Temp][WL State 3][WL State 4]

See WEAR_LEVELING.md for details.

Troubleshooting

"FFat Mount Failed"

Possible causes:

  1. Filesystem not uploaded
  2. Wrong partition table
  3. Corrupted filesystem

Solutions:

# Rebuild and upload filesystem
pio run -t buildfs
pio run -t uploadfs

# Or erase flash and start fresh
pio run -t erase
pio run -t upload
pio run -t uploadfs

"No FAT filesystem partition found"

Cause: Partition table doesn't have a FAT partition

Solution: Check partitions.csv has a partition with SubType: fat

Files not appearing

Cause: Files not in data/ directory when building

Solution:

  1. Add files to data/ directory
  2. Rebuild filesystem: pio run -t buildfs
  3. Upload: pio run -t uploadfs

Code Example

#include "FFat.h"

void setup() {
    Serial.begin(115200);
    
    // Mount FAT filesystem
    if (!FFat.begin(false)) {
        Serial.println("FFat Mount Failed");
        return;
    }
    
    // List files
    File root = FFat.open("/");
    File file = root.openNextFile();
    while (file) {
        Serial.printf("File: %s, Size: %d\n", 
                     file.name(), file.size());
        file = root.openNextFile();
    }
    
    // Read file
    File f = FFat.open("/test.txt", "r");
    if (f) {
        String content = f.readString();
        Serial.println(content);
        f.close();
    }
    
    // Write file
    f = FFat.open("/output.txt", "w");
    if (f) {
        f.println("Hello from ESP32!");
        f.close();
    }
}

void loop() {
    // Your code here
}

Platform Configuration

This project uses a custom platform with FAT filesystem support:

[env:esp32dev]
platform = espressif32
framework = arduino
board = esp32dev
board_build.filesystem = fatfs
board_build.partitions = partitions.csv

References