fix: sd card shares the radio SPI object

This commit is contained in:
Jared Dohrman
2026-04-21 16:01:19 +10:00
parent eb1a934849
commit 746396aee9
13 changed files with 273 additions and 13 deletions
+16 -6
View File
@@ -35,12 +35,16 @@ const char* cardTypeName(uint8_t type) {
} // namespace
#if defined(ESP32)
SPIClass* getBoardSharedArchiveSPI() __attribute__((weak));
#endif
ArchiveStorage::ArchiveStorage()
: _attempted(false), _mounted(false), _mount_failed(false), _supported(false), _card_type(0), _spi_bus(HSPI),
_cs_pin(0xFF), _sck_pin(0xFF),
_miso_pin(0xFF), _mosi_pin(0xFF), _card_size_bytes(0), _total_bytes(0), _used_bytes(0)
#if defined(ESP32)
, _spi(nullptr)
, _spi(nullptr), _owns_spi(false)
#endif
{
}
@@ -88,11 +92,15 @@ void ArchiveStorage::begin() {
static_cast<unsigned>(_miso_pin),
static_cast<unsigned>(_mosi_pin));
_spi = new SPIClass(_spi_bus);
_spi = getBoardSharedArchiveSPI();
_owns_spi = (_spi == nullptr);
if (_spi == nullptr) {
_mount_failed = true;
ARCHIVE_LOG("mount failed: SPI alloc failed");
return;
_spi = new SPIClass(_spi_bus);
if (_spi == nullptr) {
_mount_failed = true;
ARCHIVE_LOG("mount failed: SPI alloc failed");
return;
}
}
if (!mountArchiveSd(_spi, _spi_bus, _cs_pin, _sck_pin, _miso_pin, _mosi_pin)) {
@@ -130,7 +138,9 @@ bool ArchiveStorage::recover() {
ARCHIVE_LOG("recover begin bus=%u cs=%u", static_cast<unsigned>(_spi_bus), static_cast<unsigned>(_cs_pin));
SD.end();
_spi->end();
if (_owns_spi) {
_spi->end();
}
_mounted = false;
_mount_failed = false;
_card_size_bytes = 0;
+1
View File
@@ -55,5 +55,6 @@ private:
#if defined(ESP32)
SPIClass* _spi;
bool _owns_spi;
#endif
};
+12 -2
View File
@@ -93,7 +93,13 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
if (file.available() >= (int)sizeof(_prefs->rx_boosted_gain)) {
file.read((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 291
}
// next: 292
if (file.available() >= (int)sizeof(_prefs->fan_mode)) {
file.read((uint8_t *)&_prefs->fan_mode, sizeof(_prefs->fan_mode)); // 292
}
if (file.available() >= (int)sizeof(_prefs->fan_timeout_secs)) {
file.read((uint8_t *)&_prefs->fan_timeout_secs, sizeof(_prefs->fan_timeout_secs)); // 293
}
// next: 295
// sanitise bad pref values
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
@@ -124,6 +130,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
// sanitise settings
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
_prefs->fan_mode = constrain(_prefs->fan_mode, 0, 2);
_prefs->fan_timeout_secs = constrain(_prefs->fan_timeout_secs, 0, 600);
file.close();
}
@@ -186,7 +194,9 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
file.write((uint8_t *)&_prefs->battery_reporting_enabled, sizeof(_prefs->battery_reporting_enabled)); // 290
file.write((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 291
// next: 292
file.write((uint8_t *)&_prefs->fan_mode, sizeof(_prefs->fan_mode)); // 292
file.write((uint8_t *)&_prefs->fan_timeout_secs, sizeof(_prefs->fan_timeout_secs)); // 293
// next: 295
file.close();
}
+2
View File
@@ -62,6 +62,8 @@ struct NodePrefs { // persisted to file
uint8_t rx_boosted_gain; // power settings
uint8_t path_hash_mode; // which path mode to use when sending
uint8_t loop_detect;
uint8_t fan_mode;
uint16_t fan_timeout_secs;
};
class CommonCLICallbacks {