174 lines
5.2 KiB
C++
174 lines
5.2 KiB
C++
|
/**
|
||
|
* 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
|