diff --git a/Firmware/Dcodes.cpp b/Firmware/Dcodes.cpp index 475714c2a..bbe397759 100644 --- a/Firmware/Dcodes.cpp +++ b/Firmware/Dcodes.cpp @@ -924,5 +924,45 @@ void dcode_9125() } #endif //PAT9125 - #endif //DEBUG_DCODES + +#ifdef XFLASH_DUMP +#include "xflash_dump.h" + +void dcode_20() +{ + if(code_seen('E')) + xfdump_full_dump_and_reset(); + else + { + unsigned long ts = millis(); + xfdump_dump(); + ts = millis() - ts; + DBG(_N("dump completed in %lums\n"), ts); + } +} + +void dcode_21() +{ + if(!xfdump_check_state()) + DBG(_N("no dump available\n")); + else + { + KEEPALIVE_STATE(NOT_BUSY); + DBG(_N("D21 - read crash dump\n")); + print_mem(DUMP_OFFSET + offsetof(dump_t, data), + DUMP_SIZE, dcode_mem_t::xflash); + } +} + +void dcode_22() +{ + if(!xfdump_check_state()) + DBG(_N("no dump available\n")); + else + { + xfdump_reset(); + DBG(_N("dump cleared\n")); + } +} +#endif diff --git a/Firmware/Dcodes.h b/Firmware/Dcodes.h index c019c9817..4e37cc243 100644 --- a/Firmware/Dcodes.h +++ b/Firmware/Dcodes.h @@ -29,6 +29,12 @@ extern void dcode_9(); //D9 - Read/Write ADC (Write=enable simulated, Read=disab extern void dcode_10(); //D10 - XYZ calibration = OK extern void dcode_12(); //D12 - Log time. Writes the current time in the log file. +#ifdef XFLASH_DUMP +extern void dcode_20(); //D20 - Generate an offline crash dump +extern void dcode_21(); //D21 - Print crash dump to serial +extern void dcode_22(); //D22 - Clear crash dump state +#endif + #ifdef HEATBED_ANALYSIS extern void dcode_80(); //D80 - Bed check. This command will log data to SD card file "mesh.txt". extern void dcode_81(); //D81 - Bed analysis. This command will log data to SD card file "wldsd.txt". diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 01ef1ef9e..4f95ed7ac 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -9205,8 +9205,56 @@ Sigma_Exit: ### D12 - Time D12: Time Writes the current time in the log file. */ - #endif //DEBUG_DCODES + +#ifdef XFLASH_DUMP + /*! + ### D20 - Generate an offline crash dump + Generate a crash dump for later retrival. + #### Usage + + D20 [E] + + ### Parameters + - `E` - Perform an emergency crash dump (resets the printer). + ### Notes + - A crash dump can be later recovered with D21, or cleared with D22. + - An emergency crash dump includes register data, but will cause the printer to reset after the dump + is completed. + */ + case 20: { + dcode_20(); + break; + }; + + /*! + ### D21 - Print crash dump to serial + Output the complete crash dump (if present) to the serial. + #### Usage + + D21 + + ### Notes + - The starting address can vary between builds, but it's always at the beginning of the data section. + */ + case 21: { + dcode_21(); + break; + }; + + /*! + ### D22 - Clear crash dump state + Clear an existing internal crash dump. + #### Usage + + D22 + */ + case 22: { + dcode_22(); + break; + }; +#endif + #ifdef HEATBED_ANALYSIS /*!