Skip to content

Commit 37cd0dc

Browse files
robbycandraLCh-77
authored andcommitted
🩹 Adjust manage_media for slow/late media init (USB FD) (MarlinFirmware#24015)
1 parent 7c4050c commit 37cd0dc

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

Marlin/src/sd/cardreader.cpp

+25-13
Original file line numberDiff line numberDiff line change
@@ -472,29 +472,32 @@ void CardReader::mount() {
472472
#endif
473473

474474
void CardReader::manage_media() {
475-
static uint8_t prev_stat = 2; // First call, no prior state
475+
static uint8_t prev_stat = 2; // At boot we don't know if media is present or not
476476
uint8_t stat = uint8_t(IS_SD_INSERTED());
477-
if (stat == prev_stat) return;
477+
if (stat == prev_stat) return; // Already checked and still no change?
478478

479-
DEBUG_SECTION(mm, "CardReader::manage_media", true);
480-
DEBUG_ECHOLNPGM("SD Status ", prev_stat, " -> ", stat);
481-
482-
flag.workDirIsRoot = true; // Return to root on mount/release
479+
DEBUG_SECTION(cmm, "CardReader::manage_media()", true);
480+
DEBUG_ECHOLNPGM("Media present: ", prev_stat, " -> ", stat);
483481

484482
if (!ui.detected()) {
485483
DEBUG_ECHOLNPGM("SD: No UI Detected.");
486484
return;
487485
}
488486

489-
uint8_t old_stat = prev_stat;
490-
prev_stat = stat; // Change now to prevent re-entry
487+
flag.workDirIsRoot = true; // Return to root on mount/release/init
488+
489+
const uint8_t old_stat = prev_stat;
490+
prev_stat = stat; // Change now to prevent re-entry in safe_delay
491491

492492
if (stat) { // Media Inserted
493493
safe_delay(500); // Some boards need a delay to get settled
494494

495495
// Try to mount the media (only later with SD_IGNORE_AT_STARTUP)
496496
if (TERN1(SD_IGNORE_AT_STARTUP, old_stat != 2)) mount();
497-
if (!isMounted()) stat = 0; // Not mounted?
497+
if (!isMounted()) { // Not mounted?
498+
stat = 0;
499+
IF_DISABLED(SD_IGNORE_AT_STARTUP, prev_stat = 0);
500+
}
498501

499502
TERN_(RESET_STEPPERS_ON_MEDIA_INSERT, reset_stepper_drivers()); // Workaround for Cheetah bug
500503
}
@@ -504,16 +507,25 @@ void CardReader::manage_media() {
504507
#endif
505508
}
506509

507-
ui.media_changed(old_stat, stat); // Update the UI
510+
ui.media_changed(old_stat, stat); // Update the UI or flag an error
508511

509512
if (!stat) return; // Exit if no media is present
510513

511-
TERN_(SDCARD_EEPROM_EMULATION, settings.first_load());
512-
513-
if (old_stat != 2) return; // First mount?
514+
static bool did_first_insert = false;
515+
if (did_first_insert) return; // Did a media insert already happen?
516+
did_first_insert = true; // Definitely handling this media insert...
514517

515518
DEBUG_ECHOLNPGM("First mount.");
516519

520+
// Load settings the first time media is inserted (not just during init)
521+
TERN_(SDCARD_EEPROM_EMULATION, settings.first_load());
522+
523+
#if HAS_USB_FLASH_DRIVE
524+
const millis_t ms = millis();
525+
DEBUG_ECHOLNPGM("USB mount waiting time = ", ms);
526+
if (ms > 5000) return; // Too late to be considered "already inserted"?
527+
#endif
528+
517529
bool do_auto = true; UNUSED(do_auto);
518530

519531
// Check for PLR file.

0 commit comments

Comments
 (0)