From e84efc2e8c0870117f150b9620b8475e5c86493f Mon Sep 17 00:00:00 2001 From: Eduard Iten Date: Wed, 11 Feb 2026 14:16:52 +0100 Subject: [PATCH] Added lfs generation tool --- firmware/tools/littlefs_generator/.gitignore | 2 + .../littlefs_generator/generate_littlefs.py | 59 +++++++++++++++++++ .../tools/littlefs_generator/requirements.txt | 2 + 3 files changed, 63 insertions(+) create mode 100644 firmware/tools/littlefs_generator/.gitignore create mode 100644 firmware/tools/littlefs_generator/generate_littlefs.py create mode 100644 firmware/tools/littlefs_generator/requirements.txt diff --git a/firmware/tools/littlefs_generator/.gitignore b/firmware/tools/littlefs_generator/.gitignore new file mode 100644 index 0000000..52261c7 --- /dev/null +++ b/firmware/tools/littlefs_generator/.gitignore @@ -0,0 +1,2 @@ +*hex +source_folder/ diff --git a/firmware/tools/littlefs_generator/generate_littlefs.py b/firmware/tools/littlefs_generator/generate_littlefs.py new file mode 100644 index 0000000..d62220f --- /dev/null +++ b/firmware/tools/littlefs_generator/generate_littlefs.py @@ -0,0 +1,59 @@ +import os +from littlefs import LittleFS +from intelhex import IntelHex + +# Konfiguration basierend auf Ihren neuen Log-Daten +BLOCK_SIZE = 4096 # 0x1000 +BLOCK_COUNT = 2048 # 8 MB Gesamtgröße +START_ADDR = 0x12000000 + +fs = LittleFS( + block_size=BLOCK_SIZE, + block_count=BLOCK_COUNT, + read_size=16, + prog_size=16, + lookahead_size=32, + cache_size=64 +) + +def add_files_recursive(local_path, lfs_path='/'): + if not os.path.exists(local_path): + print(f"Warnung: {local_path} nicht gefunden.") + return + for item in os.listdir(local_path): + full_path = os.path.join(local_path, item) + target_path = os.path.join(lfs_path, item).replace("\\", "/") + + if os.path.isfile(full_path): + print(f"Adding {target_path}...") + with open(full_path, 'rb') as f: + with fs.open(target_path, 'wb') as lfs_file: + lfs_file.write(f.read()) + elif os.path.isdir(full_path): + fs.mkdir(target_path) + add_files_recursive(full_path, target_path) + +# 1. Image im RAM befüllen +add_files_recursive('./source_folder') + +# 2. "Löchriges" (Sparse) iHEX erstellen +ih = IntelHex() +lfs_buffer = fs.context.buffer + +print("Analysiere Blöcke für Sparse-Export...") +blocks_written = 0 + +for i in range(BLOCK_COUNT): + offset = i * BLOCK_SIZE + block_data = lfs_buffer[offset : offset + BLOCK_SIZE] + + # Ein Block wird nur in das HEX-File aufgenommen, wenn er nicht leer (0xFF) ist + # LittleFS markiert gelöschte/unbenutzte Blöcke mit 0xFF + if any(b != 0xFF for b in block_data): + ih.frombytes(block_data, offset=START_ADDR + offset) + blocks_written += 1 + +ih.tofile('lfs_external_flash.hex', format='hex') + +print(f"Fertig! {blocks_written}/{BLOCK_COUNT} Blöcke ins HEX geschrieben.") +print(f"Effektive Größe im HEX: {blocks_written * BLOCK_SIZE / 1024:.1f} KB") \ No newline at end of file diff --git a/firmware/tools/littlefs_generator/requirements.txt b/firmware/tools/littlefs_generator/requirements.txt new file mode 100644 index 0000000..d2481eb --- /dev/null +++ b/firmware/tools/littlefs_generator/requirements.txt @@ -0,0 +1,2 @@ +littlefs-python +intelhex \ No newline at end of file