Support for Debug Codes - Dnnn (#19225)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>2.0.x
parent
6d9709e20d
commit
59b6b32e6e
@ -0,0 +1,173 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
|
#if ENABLED(MARLIN_DEV_MODE)
|
||||||
|
|
||||||
|
#include "gcode.h"
|
||||||
|
#include "../module/settings.h"
|
||||||
|
#include "../libs/hex_print.h"
|
||||||
|
#include "../HAL/shared/eeprom_if.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dn: G-code for development and testing
|
||||||
|
*
|
||||||
|
* See https://reprap.org/wiki/G-code#D:_Debug_codes
|
||||||
|
*
|
||||||
|
* Put whatever else you need here to test ongoing development.
|
||||||
|
*/
|
||||||
|
void GcodeSuite::D(const int16_t dcode) {
|
||||||
|
switch (dcode) {
|
||||||
|
|
||||||
|
case -1:
|
||||||
|
for (;;); // forever
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
HAL_reboot();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: {
|
||||||
|
// Zero or pattern-fill the EEPROM data
|
||||||
|
#if ENABLED(EEPROM_SETTINGS)
|
||||||
|
persistentStore.access_start();
|
||||||
|
size_t total = persistentStore.capacity();
|
||||||
|
int pos = 0;
|
||||||
|
const uint8_t value = 0x0;
|
||||||
|
while(total--) {
|
||||||
|
persistentStore.write_data(pos, &value, 1);
|
||||||
|
}
|
||||||
|
persistentStore.access_finish();
|
||||||
|
#else
|
||||||
|
settings.reset();
|
||||||
|
settings.save();
|
||||||
|
#endif
|
||||||
|
HAL_reboot();
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case 2: { // D2 Read / Write SRAM
|
||||||
|
#define SRAM_SIZE 8192
|
||||||
|
uint8_t *pointer = parser.hex_adr_val('A');
|
||||||
|
uint16_t len = parser.ushortval('C', 1);
|
||||||
|
uintptr_t addr = (uintptr_t)pointer;
|
||||||
|
NOMORE(addr, (size_t)(SRAM_SIZE - 1));
|
||||||
|
NOMORE(len, SRAM_SIZE - addr);
|
||||||
|
if (parser.seenval('X')) {
|
||||||
|
// Write the hex bytes after the X
|
||||||
|
uint16_t val = parser.hex_val('X');
|
||||||
|
while (len--) {
|
||||||
|
*pointer = val;
|
||||||
|
pointer++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (len--) print_hex_byte(*(pointer++));
|
||||||
|
SERIAL_EOL();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case 3: { // D3 Read / Write EEPROM
|
||||||
|
uint8_t *pointer = parser.hex_adr_val('A');
|
||||||
|
uint16_t len = parser.ushortval('C', 1);
|
||||||
|
uintptr_t addr = (uintptr_t)pointer;
|
||||||
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
|
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
||||||
|
#endif
|
||||||
|
NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1));
|
||||||
|
NOMORE(len, MARLIN_EEPROM_SIZE - addr);
|
||||||
|
if (parser.seenval('X')) {
|
||||||
|
uint16_t val = parser.hex_val('X');
|
||||||
|
#if ENABLED(EEPROM_SETTINGS)
|
||||||
|
persistentStore.access_start();
|
||||||
|
while(len--) {
|
||||||
|
int pos = 0;
|
||||||
|
persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val));
|
||||||
|
}
|
||||||
|
SERIAL_EOL();
|
||||||
|
persistentStore.access_finish();
|
||||||
|
#else
|
||||||
|
SERIAL_ECHOLN("NO EEPROM");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (len--) {
|
||||||
|
// Read bytes from EEPROM
|
||||||
|
#if ENABLED(EEPROM_SETTINGS)
|
||||||
|
persistentStore.access_start();
|
||||||
|
uint8_t val;
|
||||||
|
while(len--) {
|
||||||
|
int pos = 0;
|
||||||
|
if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) {
|
||||||
|
print_hex_byte(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SERIAL_EOL();
|
||||||
|
persistentStore.access_finish();
|
||||||
|
#else
|
||||||
|
SERIAL_ECHOLN("NO EEPROM");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
SERIAL_EOL();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case 4: { // D4 Read / Write PIN
|
||||||
|
// const uint8_t pin = parser.byteval('P');
|
||||||
|
// const bool is_out = parser.boolval('F'),
|
||||||
|
// val = parser.byteval('V', LOW);
|
||||||
|
if (parser.seenval('X')) {
|
||||||
|
// TODO: Write the hex bytes after the X
|
||||||
|
//while (len--) {
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// while (len--) {
|
||||||
|
// TODO: Read bytes from EEPROM
|
||||||
|
// print_hex_byte(eeprom_read_byte(*(adr++));
|
||||||
|
// }
|
||||||
|
SERIAL_EOL();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case 5: { // D4 Read / Write onboard Flash
|
||||||
|
#define FLASH_SIZE 1024
|
||||||
|
uint8_t *pointer = parser.hex_adr_val('A');
|
||||||
|
uint16_t len = parser.ushortval('C', 1);
|
||||||
|
uintptr_t addr = (uintptr_t)pointer;
|
||||||
|
NOMORE(addr, (size_t)(FLASH_SIZE - 1));
|
||||||
|
NOMORE(len, FLASH_SIZE - addr);
|
||||||
|
if (parser.seenval('X')) {
|
||||||
|
// TODO: Write the hex bytes after the X
|
||||||
|
//while (len--) {
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// while (len--) {
|
||||||
|
// TODO: Read bytes from EEPROM
|
||||||
|
// print_hex_byte(eeprom_read_byte(adr++));
|
||||||
|
// }
|
||||||
|
SERIAL_EOL();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue