Skip to content

Commit 0eeb664

Browse files
committed
Adds on-board flash filesystem support
Enables support for the on-board flash filesystem on the IoTNode LoRaWAN board. This change adds the ability to utilize the flash memory as a filesystem, allowing for storage of configuration files, sensor data, or other persistent data. Includes modifications to the build process to allocate space for filesystem, as well as code to initialize and check the filesystem's availability. Also, displays file system information in about output.
1 parent c44ce16 commit 0eeb664

File tree

5 files changed

+81
-16
lines changed

5 files changed

+81
-16
lines changed

.github/workflows/build-iotnode-lorawan.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,15 @@ jobs:
7676
# Note:
7777
# - The use of a full path to flux - this is needed or the build fails (relative paths get merged).
7878
# - ** Nov 25 - for build testing, using the pro micro board definition until new board added
79+
#
80+
# May 2025 -
81+
# Add filesystem params for the flash layout - 1MB+ for prefs, 4MB for filesystem, the rest (11MB) for firmware
7982

8083
- name: Compile DataLogger firmware binary
8184
run:
8285
arduino-cli compile --fqbn rp2040:rp2040:sparkfun_iotnode_lorawanrp2350 ./sfeIoTNodeLoRaWAN/sfeIoTNodeLoRaWAN.ino
8386
--build-property "compiler.cpp.extra_flags=\"-DIOT_NODE_LORAWAN_APP_KEY=$IOT_NODE_LORAWAN_APP_KEY\" \"-DFLX_SPARKFUN_LORAWAN_APP_EUI=$FLX_SPARKFUN_LORAWAN_APP_EUI\" \"-DBUILD_NUMBER=$GITHUB_RUN_NUMBER\""
87+
--build-property build.flash_length=11526144 --build-property upload.maximum_size=11526144 --build-property build.eeprom_start=284155904 --build-property build.fs_end=284155904 --build-property build.fs_start=279961600 --build-property build.flash_total=16777216
8488
--export-binaries --clean --library `pwd`/SparkFun_IoTNodeLoRaWAN
8589

8690
# Upload the build files - bootloader, partitions, firmware

sfeIoTNodeLoRaWAN/sfeIoTNodeLoRaWAN.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
*---------------------------------------------------------------------------------
1010
*/
1111
#include "sfeIoTNodeLoRaWAN.h"
12+
#include "sfeNLBoard.h"
1213
#include "sfeNLCommands.h"
1314
#include "sfeNLLed.h"
1415
#include "sfeNLVersion.h"
15-
#include "sfeNLBoard.h"
1616
#include <Arduino.h>
1717

1818
#include <Flux/flxDevButton.h>
@@ -75,7 +75,8 @@ static const uint8_t _app_jump[] = {104, 72, 67, 51, 74, 67, 108, 99, 104, 11
7575
#define kAppClassPrefix "INLW"
7676
//---------------------------------------------------------------------------
7777
//
78-
sfeIoTNodeLoRaWAN::sfeIoTNodeLoRaWAN() : _logTypeSD{kAppLogTypeNone}, _logTypeSer{kAppLogTypeNone}, _opFlags{0}
78+
sfeIoTNodeLoRaWAN::sfeIoTNodeLoRaWAN()
79+
: _logTypeSD{kAppLogTypeNone}, _logTypeSer{kAppLogTypeNone}, _opFlags{0}, _hasOnBoardFlashFS{false}
7980
{
8081
// Constructor
8182
}
@@ -332,12 +333,15 @@ bool sfeIoTNodeLoRaWAN::onSetup()
332333
// was list device divers set by startup commands?
333334
if (inOpMode(kAppOpStartListDevices))
334335
flux.dumpDeviceAutoLoadTable();
335-
// setup SD card. Do this before calling start - so prefs can be read off SD if needed
336+
// setup SD card. Do this before calling start - so prefs can be read off SD if needed
336337
if (!setupSDCard())
337338
{
338339
flxLog_W(F("Unable to initialize the SD Card. Is an SD card installed on the board?"));
339340
}
340341

342+
// check our on-board flash file system
343+
_hasOnBoardFlashFS = checkOnBoardFS();
344+
341345
// Button events we're listening on
342346
_boardButton.on_momentaryPress.call(this, &sfeIoTNodeLoRaWAN::onLogEvent);
343347

sfeIoTNodeLoRaWAN/sfeIoTNodeLoRaWAN.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919

2020
#include <Flux/flxDevMAX17048.h>
2121
#include <Flux/flxDevSoilMoisture.h>
22+
#include <Flux/flxFSSDCard.h>
23+
#include <Flux/flxFileRotate.h>
2224
#include <Flux/flxKVPStoreDeviceRP2.h>
2325
#include <Flux/flxSettings.h>
2426
#include <Flux/flxSettingsSerial.h>
27+
#include <Flux/flxStorageJSONPref.h>
2528
#include <Flux/flxStorageKVPPref.h>
2629
#include <Flux/flxSystem.h>
27-
#include <Flux/flxFSSDCard.h>
28-
#include <Flux/flxFileRotate.h>
29-
#include <Flux/flxStorageJSONPref.h>
3030

3131
#include "flxLoRaWANDigi.h"
3232
#include "flxLoRaWANLogger.h"
@@ -82,7 +82,6 @@ class sfeIoTNodeLoRaWAN : public flxApplication
8282

8383
static constexpr const char *kLogFormatNames[] = {"Disabled", "CSV Format", "JSON Format"};
8484

85-
8685
//---------------------------------------------------------------------------
8786
uint8_t get_logTypeSD(void);
8887

@@ -168,12 +167,12 @@ class sfeIoTNodeLoRaWAN : public flxApplication
168167
&sfeIoTNodeLoRaWAN::set_verbose_dev_name>
169168
verboseDevNames;
170169

171-
flxPropertyRWUInt8<sfeIoTNodeLoRaWAN, &sfeIoTNodeLoRaWAN::get_logTypeSD, &sfeIoTNodeLoRaWAN::set_logTypeSD> sdCardLogType = {
172-
kAppLogTypeCSV,
173-
{{kLogFormatNames[kAppLogTypeNone], kAppLogTypeNone},
174-
{kLogFormatNames[kAppLogTypeCSV], kAppLogTypeCSV},
175-
{kLogFormatNames[kAppLogTypeJSON], kAppLogTypeJSON}}};
176-
170+
flxPropertyRWUInt8<sfeIoTNodeLoRaWAN, &sfeIoTNodeLoRaWAN::get_logTypeSD, &sfeIoTNodeLoRaWAN::set_logTypeSD>
171+
sdCardLogType = {kAppLogTypeCSV,
172+
{{kLogFormatNames[kAppLogTypeNone], kAppLogTypeNone},
173+
{kLogFormatNames[kAppLogTypeCSV], kAppLogTypeCSV},
174+
{kLogFormatNames[kAppLogTypeJSON], kAppLogTypeJSON}}};
175+
177176
flxPropertyRWUInt8<sfeIoTNodeLoRaWAN, &sfeIoTNodeLoRaWAN::get_logTypeSer, &sfeIoTNodeLoRaWAN::set_logTypeSer>
178177
serialLogType = {kAppLogTypeCSV,
179178
{{kLogFormatNames[kAppLogTypeNone], kAppLogTypeNone},
@@ -222,6 +221,7 @@ class sfeIoTNodeLoRaWAN : public flxApplication
222221
bool setupTime();
223222
void setupENS160(void);
224223
bool setupSDCard(void);
224+
bool checkOnBoardFS(void);
225225

226226
// Our LoRaWAN network/connection object
227227
flxLoRaWANDigi _loraWANConnection;
@@ -265,4 +265,7 @@ class sfeIoTNodeLoRaWAN : public flxApplication
265265
std::unique_ptr<flxJob> _batteryJob;
266266

267267
uint32_t _opFlags;
268+
269+
// flag for the on-board flash file system (RP2350)
270+
bool _hasOnBoardFlashFS = false;
268271
};

sfeIoTNodeLoRaWAN/sfeIoTNodeLoRaWANAbout.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <Flux/flxPlatform.h>
1818
#include <Flux/flxSerial.h>
1919

20+
#include <LittleFS.h>
21+
2022
void sfeIoTNodeLoRaWAN::_displayAboutObjHelper(char pre_ch, const char *szName, bool enabled)
2123
{
2224
flxLog_N_("%c %-20s : ", pre_ch, szName);
@@ -122,7 +124,6 @@ void sfeIoTNodeLoRaWAN::displayAppStatus(bool useInfo)
122124

123125
char szSize[32];
124126
char szCap[32];
125-
char szAvail[32];
126127

127128
uint64_t sd_size = _theSDCard.size();
128129
uint64_t sd_total = _theSDCard.total();
@@ -137,16 +138,40 @@ void sfeIoTNodeLoRaWAN::displayAppStatus(bool useInfo)
137138
{
138139
flxLog_N_("...");
139140
flxSerial.flush();
141+
char szAvail[32];
140142
// This call can take some time .. .so
141143
uint64_t sd_used = _theSDCard.used();
142144
flx_utils::formatByteString(sd_total - sd_used, 2, szAvail, sizeof(szAvail));
143145
flxLog_N("Free: %s (%.1f%%)", szAvail, 100. - (sd_used / (float)sd_total * 100.));
144-
}else
146+
}
147+
else
145148
flxLog_N("");
146149
}
147150
else
148151
flxLog__(logLevel, "%cSD card not available", pre_ch);
149152

153+
flxLog___(logLevel, "%cSystem File System - ");
154+
155+
if (_hasOnBoardFlashFS)
156+
{
157+
FSInfo fs_info;
158+
if (LittleFS.info(fs_info))
159+
{
160+
char szSize[32];
161+
char szUsed[32];
162+
char szAvail[32];
163+
flx_utils::formatByteString(fs_info.totalBytes, 2, szSize, sizeof(szSize));
164+
flx_utils::formatByteString(fs_info.usedBytes, 2, szUsed, sizeof(szUsed));
165+
flx_utils::formatByteString(fs_info.totalBytes - fs_info.usedBytes, 2, szAvail, sizeof(szAvail));
166+
167+
flxLog_N("size: %s, used: %s, free: %s", szSize, szUsed, szAvail);
168+
}
169+
else
170+
flxLog_N(F("unable to access info"));
171+
}
172+
else
173+
flxLog_N(F("not available"));
174+
150175
// show heap level
151176
flxLog__(logLevel, "%cSystem Heap - Total: %dB Free: %dB (%.1f%%)", pre_ch, flxPlatform::heap_size(),
152177
flxPlatform::heap_free(), (float)flxPlatform::heap_free() / (float)flxPlatform::heap_size() * 100.);

sfeIoTNodeLoRaWAN/sfeIoTNodeLoRaWANSetup.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
#include <Flux/flxDevRV8803.h>
2222
#include <Flux/flxDevSHTC3.h>
2323

24+
#include <LittleFS.h>
25+
26+
// on board flash file system bounds
27+
28+
extern uint8_t _FS_start;
29+
extern uint8_t _FS_end;
30+
2431
//---------------------------------------------------------------------------
2532
// setupTime()
2633
//
@@ -96,7 +103,7 @@ void sfeIoTNodeLoRaWAN::setupENS160(void)
96103
// Set's up the SD card subsystem and the objects/systems that use it.
97104
bool sfeIoTNodeLoRaWAN::setupSDCard(void)
98105
{
99-
106+
100107
// setup output to the SD card
101108
if (_theSDCard.initialize())
102109
{
@@ -122,4 +129,26 @@ bool sfeIoTNodeLoRaWAN::setupSDCard(void)
122129
return true;
123130
}
124131
return false;
132+
}
133+
//---------------------------------------------------------------------------
134+
// checkOnBoardFS()
135+
//
136+
// Do we have an onboard FS?
137+
138+
bool sfeIoTNodeLoRaWAN::checkOnBoardFS(void)
139+
{
140+
141+
// Was a filesystem set for the on-board flash?
142+
if (&_FS_end - &_FS_start <= 0)
143+
{
144+
flxLog_W(F("No onboard flash file system detected"));
145+
return false;
146+
}
147+
// Startup little fs
148+
if (LittleFS.begin() == false)
149+
{
150+
flxLog_W(F("Unable to mount flash file system"));
151+
return false;
152+
}
153+
return true;
125154
}

0 commit comments

Comments
 (0)