Merge branch 'bugfix-2.1.x' into ender3pro

This commit is contained in:
Brady Stanton 2025-06-28 21:17:16 -07:00
commit d171865d52
32 changed files with 272 additions and 193 deletions

View file

@ -21,6 +21,7 @@ on:
branches: branches:
- bugfix-2.1.x - bugfix-2.1.x
- 2.1.x - 2.1.x
- release-*
paths-ignore: paths-ignore:
- config/** - config/**
- data/** - data/**

View file

@ -41,7 +41,7 @@
* here we define this default string as the date where the latest release * here we define this default string as the date where the latest release
* version was tagged. * version was tagged.
*/ */
#define STRING_DISTRIBUTION_DATE "2025-06-20" //#define STRING_DISTRIBUTION_DATE "2025-06-29"
/** /**
* The protocol for communication to the host. Protocol indicates communication * The protocol for communication to the host. Protocol indicates communication

View file

@ -152,8 +152,8 @@
#include "feature/encoder_i2c.h" #include "feature/encoder_i2c.h"
#endif #endif
#if (HAS_TRINAMIC_CONFIG || HAS_TMC_SPI) && DISABLED(PSU_DEFAULT_OFF) #if HAS_TRINAMIC_CONFIG
#include "feature/tmc_util.h" #include "module/stepper/trinamic.h"
#endif #endif
#if HAS_CUTTER #if HAS_CUTTER

View file

@ -87,7 +87,13 @@ void DigipotI2C::init() {
Wire.begin(); Wire.begin();
#endif #endif
// Set up initial currents as defined in Configuration_adv.h // Set up initial currents as defined in Configuration_adv.h
static const float digipot_motor_current[] PROGMEM = TERN(DIGIPOT_USE_RAW_VALUES, DIGIPOT_MOTOR_CURRENT, DIGIPOT_I2C_MOTOR_CURRENTS); static const float digipot_motor_current[] PROGMEM =
#if ENABLED(DIGIPOT_USE_RAW_VALUES)
DIGIPOT_MOTOR_CURRENT
#else
DIGIPOT_I2C_MOTOR_CURRENTS
#endif
;
for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i) for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i)
set_current(i, pgm_read_float(&digipot_motor_current[i])); set_current(i, pgm_read_float(&digipot_motor_current[i]));
} }

View file

@ -420,8 +420,11 @@ void PrintJobRecovery::resume() {
#endif #endif
// Interpret the saved Z according to flags // Interpret the saved Z according to flags
const float z_print = resume_pos.z, const float z_print = resume_pos.z;
z_raised = z_print + info.zraise;
#if ANY(Z_HOME_TO_MAX, POWER_LOSS_RECOVER_ZHOME) || DISABLED(BELTPRINTER)
const float z_raised = z_print + info.zraise;
#endif
// //
// Home the axes that can safely be homed, and // Home the axes that can safely be homed, and

View file

@ -24,6 +24,12 @@
#if HAS_TRINAMIC_CONFIG #if HAS_TRINAMIC_CONFIG
/**
* feature/tmc_util.cpp - Functions for debugging Trinamic stepper drivers.
* The main entry point is `tmc_report_all` which is called by M122 to collect
* and report diagnostic information about each enabled TMC driver.
*/
#include "tmc_util.h" #include "tmc_util.h"
#include "../MarlinCore.h" #include "../MarlinCore.h"
@ -284,12 +290,13 @@
SString<50>(F(" driver overtemperature warning! ("), st.getMilliamps(), F("mA)")).echoln(); SString<50>(F(" driver overtemperature warning! ("), st.getMilliamps(), F("mA)")).echoln();
} }
#if ENABLED(TMC_DEBUG)
template<typename TMC> template<typename TMC>
void report_polled_driver_data(TMC &st, const TMC_driver_data &data) { void report_polled_driver_data(TMC &st, const TMC_driver_data &data) {
const uint32_t pwm_scale = get_pwm_scale(st); const uint32_t pwm_scale = get_pwm_scale(st);
st.printLabel(); st.printLabel();
SString<60> report(':', pwm_scale); SString<60> report(':', pwm_scale);
#if ENABLED(TMC_DEBUG)
#if HAS_TMCX1X0_OR_2240 || HAS_TMC220x #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
report.append('/', data.cs_actual); report.append('/', data.cs_actual);
#endif #endif
@ -300,16 +307,13 @@
else else
report += '-'; report += '-';
#endif #endif
#endif
report += '|'; report += '|';
if (st.error_count) report += 'E'; // Error if (st.error_count) report += 'E'; // Error
if (data.is_ot) report += 'O'; // Over-temperature if (data.is_ot) report += 'O'; // Over-temperature
if (data.is_otpw) report += 'W'; // over-temperature pre-Warning if (data.is_otpw) report += 'W'; // over-temperature pre-Warning
#if ENABLED(TMC_DEBUG)
if (data.is_stall) report += 'G'; // stallGuard if (data.is_stall) report += 'G'; // stallGuard
if (data.is_stealth) report += 'T'; // stealthChop if (data.is_stealth) report += 'T'; // stealthChop
if (data.is_standstill) report += 'I'; // standstIll if (data.is_standstill) report += 'I'; // standstIll
#endif
if (st.flag_otpw) report += 'F'; // otpw Flag if (st.flag_otpw) report += 'F'; // otpw Flag
report += '|'; report += '|';
if (st.otpw_count > 0) report += st.otpw_count; if (st.otpw_count > 0) report += st.otpw_count;
@ -317,6 +321,8 @@
report.echo(); report.echo();
} }
#endif // TMC_DEBUG
#if CURRENT_STEP_DOWN > 0 #if CURRENT_STEP_DOWN > 0
template<typename TMC> template<typename TMC>
@ -710,14 +716,8 @@
case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break; case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break;
case TMC_DRV_CS_ACTUAL: if (st.CS_ACTUAL()) SERIAL_CHAR('*'); break; case TMC_DRV_CS_ACTUAL: if (st.CS_ACTUAL()) SERIAL_CHAR('*'); break;
case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break; case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break;
//case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break;
case TMC_DEBUG_OTPW: print_true_or_false(st.otpw()); break;
//case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('*'); break;
//case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('*'); break;
//case TMC_OLA: if (st.ola()) SERIAL_CHAR('*'); break;
//case TMC_OLB: if (st.olb()) SERIAL_CHAR('*'); break;
case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break; case TMC_SG_RESULT: SERIAL_ECHO(st.SG_RESULT()); break;
case TMC_STST: if (!st.stst()) SERIAL_CHAR('*'); break;
default: break; // other... default: break; // other...
} }
} }
@ -844,7 +844,8 @@
case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break;
case TMC_DRV_STATUS_HEX: { case TMC_DRV_STATUS_HEX: {
const uint32_t drv_status = st.DRV_STATUS(); const uint32_t drv_status = st.DRV_STATUS();
SERIAL_CHAR('\t'); st.printLabel(); SERIAL_CHAR('\t'); print_hex_long(drv_status, ':', true); SERIAL_CHAR('\t'); st.printLabel();
SERIAL_CHAR('\t'); print_hex_long(drv_status, ':', true);
if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!"); if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!");
SERIAL_EOL(); SERIAL_EOL();
} break; } break;
@ -1167,6 +1168,9 @@
bool tmc_enable_stallguard(TMC2240Stepper &st) { bool tmc_enable_stallguard(TMC2240Stepper &st) {
const bool stealthchop_was_enabled = st.en_pwm_mode(); const bool stealthchop_was_enabled = st.en_pwm_mode();
// TODO: Use StallGuard4 when stealthChop is enabled
// and leave stealthChop state unchanged.
st.TCOOLTHRS(0xFFFFF); st.TCOOLTHRS(0xFFFFF);
st.en_pwm_mode(false); st.en_pwm_mode(false);
st.diag0_stall(true); st.diag0_stall(true);
@ -1250,75 +1254,3 @@ void test_tmc_connection(LOGICAL_AXIS_ARGS_LC(const bool)) {
} }
#endif // HAS_TRINAMIC_CONFIG #endif // HAS_TRINAMIC_CONFIG
#if HAS_TMC_SPI
#define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
void tmc_init_cs_pins() {
#if AXIS_HAS_SPI(X)
SET_CS_PIN(X);
#endif
#if AXIS_HAS_SPI(Y)
SET_CS_PIN(Y);
#endif
#if AXIS_HAS_SPI(Z)
SET_CS_PIN(Z);
#endif
#if AXIS_HAS_SPI(X2)
SET_CS_PIN(X2);
#endif
#if AXIS_HAS_SPI(Y2)
SET_CS_PIN(Y2);
#endif
#if AXIS_HAS_SPI(Z2)
SET_CS_PIN(Z2);
#endif
#if AXIS_HAS_SPI(Z3)
SET_CS_PIN(Z3);
#endif
#if AXIS_HAS_SPI(Z4)
SET_CS_PIN(Z4);
#endif
#if AXIS_HAS_SPI(I)
SET_CS_PIN(I);
#endif
#if AXIS_HAS_SPI(J)
SET_CS_PIN(J);
#endif
#if AXIS_HAS_SPI(K)
SET_CS_PIN(K);
#endif
#if AXIS_HAS_SPI(U)
SET_CS_PIN(U);
#endif
#if AXIS_HAS_SPI(V)
SET_CS_PIN(V);
#endif
#if AXIS_HAS_SPI(W)
SET_CS_PIN(W);
#endif
#if AXIS_HAS_SPI(E0)
SET_CS_PIN(E0);
#endif
#if AXIS_HAS_SPI(E1)
SET_CS_PIN(E1);
#endif
#if AXIS_HAS_SPI(E2)
SET_CS_PIN(E2);
#endif
#if AXIS_HAS_SPI(E3)
SET_CS_PIN(E3);
#endif
#if AXIS_HAS_SPI(E4)
SET_CS_PIN(E4);
#endif
#if AXIS_HAS_SPI(E5)
SET_CS_PIN(E5);
#endif
#if AXIS_HAS_SPI(E6)
SET_CS_PIN(E6);
#endif
#if AXIS_HAS_SPI(E7)
SET_CS_PIN(E7);
#endif
}
#endif // HAS_TMC_SPI

View file

@ -474,7 +474,3 @@ void test_tmc_connection(LOGICAL_AXIS_DECL_LC(const bool, true));
#endif // HAS_HOMING_CURRENT #endif // HAS_HOMING_CURRENT
#endif // HAS_TRINAMIC_CONFIG #endif // HAS_TRINAMIC_CONFIG
#if HAS_TMC_SPI
void tmc_init_cs_pins();
#endif

View file

@ -143,6 +143,11 @@ void GcodeSuite::G34() {
probe.use_probing_tool(); probe.use_probing_tool();
#ifdef EVENT_GCODE_BEFORE_G34
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Before G34 G-code: ", F(EVENT_GCODE_BEFORE_G34));
gcode.process_subcommands_now(F(EVENT_GCODE_BEFORE_G34));
#endif
TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false));
// Compute a worst-case clearance height to probe from. After the first // Compute a worst-case clearance height to probe from. After the first
@ -214,19 +219,20 @@ void GcodeSuite::G34() {
// Probing sanity check is disabled, as it would trigger even in normal cases because // Probing sanity check is disabled, as it would trigger even in normal cases because
// current_position.z has been manually altered in the "dirty trick" above. // current_position.z has been manually altered in the "dirty trick" above.
if (DEBUGGING(LEVELING)) const float minz = (Z_PROBE_LOW_POINT) - (z_probe * 0.5f);
DEBUG_ECHOLNPGM(
"Z_PROBE_LOW_POINT: ", p_float_t(Z_PROBE_LOW_POINT, 2), if (DEBUGGING(LEVELING)) {
"z_probe: ", p_float_t(z_probe, 2), DEBUG_ECHOPGM("Z_PROBE_LOW_POINT: " STRINGIFY(Z_PROBE_LOW_POINT));
"Probe Tgt: ", p_float_t((Z_PROBE_LOW_POINT) - z_probe * 0.5f, 2) DEBUG_ECHOLNPGM(" z_probe: ", p_float_t(z_probe, 3),
); " Probe Tgt: ", p_float_t(minz, 3));
}
const float z_probed_height = probe.probe_at_point( const float z_probed_height = probe.probe_at_point(
DIFF_TERN(HAS_HOME_OFFSET, ppos, xy_pos_t(home_offset)), // xy DIFF_TERN(HAS_HOME_OFFSET, ppos, xy_pos_t(home_offset)), // xy
raise_after, // raise_after raise_after, // raise_after
(DEBUGGING(LEVELING) || DEBUGGING(INFO)) ? 3 : 0, // verbose_level (DEBUGGING(LEVELING) || DEBUGGING(INFO)) ? 3 : 0, // verbose_level
true, false, // probe_relative, sanity_check true, false, // probe_relative, sanity_check
(Z_PROBE_LOW_POINT) - (z_probe * 0.5f), // z_min_point minz, // z_min_point
Z_TWEEN_SAFE_CLEARANCE // z_clearance Z_TWEEN_SAFE_CLEARANCE // z_clearance
); );
@ -303,7 +309,7 @@ void GcodeSuite::G34() {
SERIAL_EOL(); SERIAL_EOL();
SString<15 + TERN0(TRIPLE_Z, 30) + TERN0(QUAD_Z, 45)> msg(F("1:2="), p_float_t(ABS(z_measured[1] - z_measured[0]), 3)); SString<15 + TERN0(TRIPLE_Z, 30) + TERN0(QUAD_Z, 45)> msg(F("2-1="), p_float_t(ABS(z_measured[1] - z_measured[0]), 3));
#if TRIPLE_Z #if TRIPLE_Z
msg.append(F(" 3-2="), p_float_t(ABS(z_measured[2] - z_measured[1]), 3)) msg.append(F(" 3-2="), p_float_t(ABS(z_measured[2] - z_measured[1]), 3))
.append(F(" 3-1="), p_float_t(ABS(z_measured[2] - z_measured[0]), 3)); .append(F(" 3-1="), p_float_t(ABS(z_measured[2] - z_measured[0]), 3));
@ -414,7 +420,7 @@ void GcodeSuite::G34() {
SERIAL_ECHOLNPGM("G34 aborted."); SERIAL_ECHOLNPGM("G34 aborted.");
else { else {
SERIAL_ECHOLNPGM("Did ", iteration + (iteration != z_auto_align_iterations), " of ", z_auto_align_iterations); SERIAL_ECHOLNPGM("Did ", iteration + (iteration != z_auto_align_iterations), " of ", z_auto_align_iterations);
SERIAL_ECHOLNPGM("Accuracy: ", p_float_t(z_maxdiff, 2)); SERIAL_ECHOLNPGM("Accuracy: ", p_float_t(z_maxdiff, 3));
} }
// Stow the probe because the last call to probe.probe_at_point(...) // Stow the probe because the last call to probe.probe_at_point(...)
@ -430,9 +436,9 @@ void GcodeSuite::G34() {
// Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier. // Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier.
if (DEBUGGING(LEVELING)) if (DEBUGGING(LEVELING))
DEBUG_ECHOLNPGM( DEBUG_ECHOLNPGM(
"z_measured_min: ", p_float_t(z_measured_min, 2), "z_measured_min: ", p_float_t(z_measured_min, 3),
"Z_TWEEN_SAFE_CLEARANCE: ", p_float_t(Z_TWEEN_SAFE_CLEARANCE, 2), "Z_TWEEN_SAFE_CLEARANCE: ", p_float_t(Z_TWEEN_SAFE_CLEARANCE, 3),
"zoffs: ", p_float_t(zoffs, 2) "zoffs: ", p_float_t(zoffs, 3)
); );
if (!err_break) if (!err_break)
@ -440,6 +446,12 @@ void GcodeSuite::G34() {
sync_plan_position(); sync_plan_position();
#endif #endif
#ifdef EVENT_GCODE_AFTER_G34
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("After G34 G-code: ", F(EVENT_GCODE_AFTER_G34));
planner.synchronize();
process_subcommands_now(F(EVENT_GCODE_AFTER_G34));
#endif
probe.use_probing_tool(false); probe.use_probing_tool(false);
#if ALL(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) #if ALL(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34)

View file

@ -49,7 +49,8 @@ void GcodeSuite::M993() {
W25QXX.SPI_FLASH_BufferRead(buf, addr, COUNT(buf)); W25QXX.SPI_FLASH_BufferRead(buf, addr, COUNT(buf));
addr += COUNT(buf); addr += COUNT(buf);
card.write(buf, COUNT(buf)); card.write(buf, COUNT(buf));
if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); if (!(addr % (COUNT(buf) * 10))) SERIAL_CHAR('.');
if (!(addr % (COUNT(buf) * 32))) hal.watchdog_refresh();
} }
SERIAL_ECHOLNPGM(" done"); SERIAL_ECHOLNPGM(" done");
@ -78,7 +79,8 @@ void GcodeSuite::M994() {
card.read(buf, COUNT(buf)); card.read(buf, COUNT(buf));
W25QXX.SPI_FLASH_BufferWrite(buf, addr, COUNT(buf)); W25QXX.SPI_FLASH_BufferWrite(buf, addr, COUNT(buf));
addr += COUNT(buf); addr += COUNT(buf);
if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); if (!(addr % (COUNT(buf) * 10))) SERIAL_CHAR('.');
if (!(addr % (COUNT(buf) * 32))) hal.watchdog_refresh();
} }
SERIAL_ECHOLNPGM(" done"); SERIAL_ECHOLNPGM(" done");

View file

@ -36,8 +36,9 @@
* *
* With TMC_DEBUG: * With TMC_DEBUG:
* V - Report raw register data. Refer to the datasheet to decipher the report. * V - Report raw register data. Refer to the datasheet to decipher the report.
* S - Flag to enable/disable continuous debug reporting. * S0 - Disable continuous debug reporting.
* P<ms> - Interval between continuous debug reports, in milliseconds. * S1 - Enable continuous debug reporting with the default interval.
* P<ms> - Enable continuous debug reporting with the given interval in ms.
*/ */
void GcodeSuite::M122() { void GcodeSuite::M122() {
xyze_bool_t print_axis = ARRAY_N_1(LOGICAL_AXES, false); xyze_bool_t print_axis = ARRAY_N_1(LOGICAL_AXES, false);
@ -51,12 +52,12 @@ void GcodeSuite::M122() {
#if ENABLED(TMC_DEBUG) #if ENABLED(TMC_DEBUG)
#if ENABLED(MONITOR_DRIVER_STATUS) #if ENABLED(MONITOR_DRIVER_STATUS)
const bool sflag = parser.seen_test('S'), sval = sflag && parser.value_bool(); const bool sflag = parser.seen('S'), sval = sflag && parser.value_bool();
if (sflag && !sval) if (sflag && !sval) // "S0"
tmc_set_report_interval(0); tmc_set_report_interval(0);
else if (parser.seenval('P')) else if (parser.seenval('P')) // "P<ms>"
tmc_set_report_interval(_MAX(uint16_t(250), parser.value_ushort())); tmc_set_report_interval(_MAX(uint16_t(250), parser.value_ushort()));
else if (sval) else if (sval) // "S" or "S1"
tmc_set_report_interval(MONITOR_DRIVER_STATUS_INTERVAL_MS); tmc_set_report_interval(MONITOR_DRIVER_STATUS_INTERVAL_MS);
#endif #endif

View file

@ -40,44 +40,44 @@
* M920: Set Homing Current for one or more axes * M920: Set Homing Current for one or more axes
* *
* Parameters: * Parameters:
* X[current] - Homing Current to use for X axis stepper(s) * X<current> - Homing Current to use for X axis stepper(s)
* Y[current] - Homing Current to use for Y axis stepper(s) * Y<current> - Homing Current to use for Y axis stepper(s)
* Z[current] - Homing Current to use for Z axis stepper(s) * Z<current> - Homing Current to use for Z axis stepper(s)
* A[current] - Homing Current to use for A axis stepper(s) * A<current> - Homing Current to use for A axis stepper(s)
* B[current] - Homing Current to use for B axis stepper(s) * B<current> - Homing Current to use for B axis stepper(s)
* C[current] - Homing Current to use for C axis stepper(s) * C<current> - Homing Current to use for C axis stepper(s)
* U[current] - Homing Current to use for U axis stepper(s) * U<current> - Homing Current to use for U axis stepper(s)
* V[current] - Homing Current to use for V axis stepper(s) * V<current> - Homing Current to use for V axis stepper(s)
* W[current] - Homing Current to use for W axis stepper(s) * W<current> - Homing Current to use for W axis stepper(s)
* *
* I<index> - For multi-stepper axes, the zero-based index of the stepper to modify in each axis. * I<index> - For multi-stepper axes, the zero-based index of the stepper to modify in each axis.
* If omitted all steppers of each axis will be set to the given axis current. * If omitted all steppers of each axis will be set to the given axis current.
*/ */
void GcodeSuite::M920() { void GcodeSuite::M920() {
bool report = true; bool report = true;
const uint8_t index = parser.byteval(I_PARAM); const int8_t index = parser.intval(I_PARAM, -1);
LOOP_NUM_AXES(i) if (parser.seen(AXIS_CHAR(i))) { LOOP_NUM_AXES(i) if (parser.seen(AXIS_CHAR(i))) {
const int16_t value = parser.value_int(); const int16_t value = parser.value_int();
report = false; report = false;
switch (i) { switch (i) {
#if X_HAS_HOME_CURRENT #if X_HAS_HOME_CURRENT
case X_AXIS: case X_AXIS:
if (index < 1) homing_current_mA.X = value; if (index <= 0) homing_current_mA.X = value;
TERN_(X2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.X2 = value); TERN_(X2_HAS_HOME_CURRENT, if (index < 0 || index == 1) homing_current_mA.X2 = value);
break; break;
#endif #endif
#if Y_HAS_HOME_CURRENT #if Y_HAS_HOME_CURRENT
case Y_AXIS: case Y_AXIS:
if (index < 1) homing_current_mA.Y = value; if (index <= 0) homing_current_mA.Y = value;
TERN_(Y2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Y2 = value); TERN_(Y2_HAS_HOME_CURRENT, if (index < 0 || index == 1) homing_current_mA.Y2 = value);
break; break;
#endif #endif
#if Z_HAS_HOME_CURRENT #if Z_HAS_HOME_CURRENT
case Z_AXIS: case Z_AXIS:
if (index < 1) homing_current_mA.Z = value; if (index <= 0) homing_current_mA.Z = value;
TERN_(Z2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Z2 = value); TERN_(Z2_HAS_HOME_CURRENT, if (index < 0 || index == 1) homing_current_mA.Z2 = value);
TERN_(Z3_HAS_HOME_CURRENT, if (!index || index == 2) homing_current_mA.Z3 = value); TERN_(Z3_HAS_HOME_CURRENT, if (index < 0 || index == 2) homing_current_mA.Z3 = value);
TERN_(Z4_HAS_HOME_CURRENT, if (!index || index == 3) homing_current_mA.Z4 = value); TERN_(Z4_HAS_HOME_CURRENT, if (index < 0 || index == 3) homing_current_mA.Z4 = value);
break; break;
#endif #endif
OPTCODE(I_HAS_HOME_CURRENT, case I_AXIS: homing_current_mA.I = value; break) OPTCODE(I_HAS_HOME_CURRENT, case I_AXIS: homing_current_mA.I = value; break)
@ -97,7 +97,7 @@ void GcodeSuite::M920_report(const bool forReplay/*=true*/) {
report_heading(forReplay, F(STR_HOMING_CURRENT)); report_heading(forReplay, F(STR_HOMING_CURRENT));
auto say_M920 = [](const bool forReplay, int16_t index=-1) { auto say_M920 = [](const bool forReplay, int8_t index=-1) {
report_echo_start(forReplay); report_echo_start(forReplay);
SERIAL_ECHOPGM(" M920"); SERIAL_ECHOPGM(" M920");
if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index); if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index);
@ -113,6 +113,7 @@ void GcodeSuite::M920_report(const bool forReplay/*=true*/) {
TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y)); TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y));
TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z)); TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z));
#if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS
SERIAL_EOL();
say_M920(forReplay); say_M920(forReplay);
#endif #endif
TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, homing_current_mA.I)); TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, homing_current_mA.I));

View file

@ -677,7 +677,3 @@
#if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG)
#define HAS_PID_DEBUG 1 #define HAS_PID_DEBUG 1
#endif #endif
#if ALL(SPI_FLASH, HAS_MEDIA, MARLIN_DEV_MODE)
#define SPI_FLASH_BACKUP 1
#endif

View file

@ -1591,3 +1591,8 @@
#undef AUTO_REPORT_SD_STATUS #undef AUTO_REPORT_SD_STATUS
#define AUTO_REPORT_SD_STATUS #define AUTO_REPORT_SD_STATUS
#endif #endif
// SPI Flash Backup
#if ALL(SPI_FLASH, HAS_MEDIA, MARLIN_DEV_MODE)
#define SPI_FLASH_BACKUP 1
#endif

View file

@ -3593,3 +3593,8 @@
#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, M20_TIMESTAMP_SUPPORT, HAS_STM32_UID) #if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, M20_TIMESTAMP_SUPPORT, HAS_STM32_UID)
#define NEED_HEX_PRINT 1 #define NEED_HEX_PRINT 1
#endif #endif
// SPI Flash Backup
#if ALL(SPI_FLASH, HAS_MEDIA, MARLIN_DEV_MODE)
#define SPI_FLASH_BACKUP 1
#endif

View file

@ -42,7 +42,7 @@
* version was tagged. * version was tagged.
*/ */
#ifndef STRING_DISTRIBUTION_DATE #ifndef STRING_DISTRIBUTION_DATE
#define STRING_DISTRIBUTION_DATE "2025-06-17" #define STRING_DISTRIBUTION_DATE "2025-06-29"
#endif #endif
/** /**

View file

@ -853,9 +853,18 @@ void MarlinUI::draw_status_message(const bool blink) {
if (printJobOngoing()) { if (printJobOngoing()) {
char buffer[8]; char buffer[8];
const duration_t remaint = get_remaining_time(); const duration_t remaint = get_remaining_time();
#if LCD_INFO_SCREEN_STYLE == 0
const uint8_t timepos = TPOFFSET - remaint.toDigital(buffer); const uint8_t timepos = TPOFFSET - remaint.toDigital(buffer);
IF_DISABLED(LCD_INFO_SCREEN_STYLE, lcd_put_lchar(timepos - 1, 2, 0x20)); lcd_put_lchar(timepos - 1, 2, ' ');
lcd_put_lchar(TERN(LCD_INFO_SCREEN_STYLE, 11, timepos), 2, 'R'); #endif
lcd_put_lchar(
#if LCD_INFO_SCREEN_STYLE == 0
timepos
#else
11
#endif
, 2, 'R'
);
lcd_put_u8str(buffer); lcd_put_u8str(buffer);
} }
} }
@ -866,9 +875,18 @@ void MarlinUI::draw_status_message(const bool blink) {
const duration_t interactt = interaction_time; const duration_t interactt = interaction_time;
if (printingIsActive() && interactt.value) { if (printingIsActive() && interactt.value) {
char buffer[8]; char buffer[8];
#if LCD_INFO_SCREEN_STYLE == 0
const uint8_t timepos = TPOFFSET - interactt.toDigital(buffer); const uint8_t timepos = TPOFFSET - interactt.toDigital(buffer);
IF_DISABLED(LCD_INFO_SCREEN_STYLE, lcd_put_lchar(timepos - 1, 2, 0x20)); lcd_put_lchar(timepos - 1, 2, ' ');
lcd_put_lchar(TERN(LCD_INFO_SCREEN_STYLE, 11, timepos), 2, 'C'); #endif
lcd_put_lchar(
#if LCD_INFO_SCREEN_STYLE == 0
timepos
#else
11
#endif
, 2, 'C'
);
lcd_put_u8str(buffer); lcd_put_u8str(buffer);
} }
} }
@ -879,9 +897,18 @@ void MarlinUI::draw_status_message(const bool blink) {
if (printJobOngoing()) { if (printJobOngoing()) {
char buffer[8]; char buffer[8];
const duration_t elapsedt = print_job_timer.duration(); const duration_t elapsedt = print_job_timer.duration();
#if LCD_INFO_SCREEN_STYLE == 0
const uint8_t timepos = TPOFFSET - elapsedt.toDigital(buffer); const uint8_t timepos = TPOFFSET - elapsedt.toDigital(buffer);
IF_DISABLED(LCD_INFO_SCREEN_STYLE, lcd_put_lchar(timepos - 1, 2, 0x20)); lcd_put_lchar(timepos - 1, 2, ' ');
lcd_put_lchar(TERN(LCD_INFO_SCREEN_STYLE, 11, timepos), 2, 'E'); #endif
lcd_put_lchar(
#if LCD_INFO_SCREEN_STYLE == 0
timepos
#else
11
#endif
, 2, 'E'
);
lcd_put_u8str(buffer); lcd_put_u8str(buffer);
} }
} }

View file

@ -74,10 +74,13 @@ void lv_draw_advance_settings() {
scr = lv_screen_create(ADVANCED_UI, machine_menu.AdvancedConfTitle); scr = lv_screen_create(ADVANCED_UI, machine_menu.AdvancedConfTitle);
int index = 0; int index = 0;
lv_screen_menu_item(scr, machine_menu.PausePosition, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_POS, index++); lv_screen_menu_item(scr, machine_menu.PausePosition, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_PAUSE_POS, index);
lv_screen_menu_item(scr, machine_menu.FilamentConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SETTINGS, index++); index++;
lv_screen_menu_item(scr, machine_menu.FilamentConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_FILAMENT_SETTINGS, index);
index++;
#if ENABLED(MKS_WIFI_MODULE) #if ENABLED(MKS_WIFI_MODULE)
lv_screen_menu_item(scr, machine_menu.WifiSettings, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_WIFI_PARA, index++); lv_screen_menu_item(scr, machine_menu.WifiSettings, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_WIFI_PARA, index);
index++;
#endif #endif
#if HAS_ROTARY_ENCODER #if HAS_ROTARY_ENCODER
lv_screen_menu_item(scr, machine_menu.EncoderSettings, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_ENCODER_SETTINGS, index); lv_screen_menu_item(scr, machine_menu.EncoderSettings, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_ENCODER_SETTINGS, index);

View file

@ -69,17 +69,21 @@ void lv_draw_motor_settings() {
scr = lv_screen_create(MOTOR_SETTINGS_UI, machine_menu.MotorConfTitle); scr = lv_screen_create(MOTOR_SETTINGS_UI, machine_menu.MotorConfTitle);
#if ENABLED(EDITABLE_STEPS_PER_UNIT) #if ENABLED(EDITABLE_STEPS_PER_UNIT)
lv_screen_menu_item(scr, machine_menu.StepsConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MOTOR_STEPS, index++); lv_screen_menu_item(scr, machine_menu.StepsConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MOTOR_STEPS, index);
index++;
#endif #endif
#if USE_SENSORLESS #if USE_SENSORLESS
lv_screen_menu_item(scr, machine_menu.HomingSensitivityConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_HOME_SENSE, index++); lv_screen_menu_item(scr, machine_menu.HomingSensitivityConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_HOME_SENSE, index);
index++;
#endif #endif
#if HAS_TRINAMIC_CONFIG #if HAS_TRINAMIC_CONFIG
lv_screen_menu_item(scr, machine_menu.TMCcurrentConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_MOTOR_TMC_CURRENT, index++); lv_screen_menu_item(scr, machine_menu.TMCcurrentConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_MOTOR_TMC_CURRENT, index);
index++;
#if HAS_STEALTHCHOP #if HAS_STEALTHCHOP
lv_screen_menu_item(scr, machine_menu.TMCStepModeConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_MOTOR_STEP_MODE, index++); lv_screen_menu_item(scr, machine_menu.TMCStepModeConf, PARA_UI_POS_X, PARA_UI_POS_Y * (index + 1), event_handler, ID_MOTOR_STEP_MODE, index);
index++;
#endif #endif
#endif #endif
lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACK_POS_X + 10, PARA_UI_BACK_POS_Y, event_handler, ID_MOTOR_RETURN, true); lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACK_POS_X + 10, PARA_UI_BACK_POS_Y, event_handler, ID_MOTOR_RETURN, true);

View file

@ -887,8 +887,6 @@ uint8_t exploreDisk(const char * const path, const uint8_t recu_level, const boo
const int16_t fileCnt = card.get_num_items(); const int16_t fileCnt = card.get_num_items();
MediaFile file;
MediaFile *diveDir;
for (int16_t i = 0; i < fileCnt; i++) { for (int16_t i = 0; i < fileCnt; i++) {
card.selectFileByIndexSorted(i); card.selectFileByIndexSorted(i);
@ -913,7 +911,7 @@ uint8_t exploreDisk(const char * const path, const uint8_t recu_level, const boo
} }
static void wifi_gcode_exec(uint8_t * const cmd_line) { static void wifi_gcode_exec(uint8_t * const cmd_line) {
int8_t tempBuf[100] = { 0 }; char tempBuf[100] = { '\0' };
int cmd_value; int cmd_value;
volatile int print_rate; volatile int print_rate;
@ -961,7 +959,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
while (mStr[index] == ' ') index++; while (mStr[index] == ' ') index++;
if (gCfgItems.wifi_type == ESP_WIFI) { if (gCfgItems.wifi_type == ESP_WIFI) {
char * const path = (char *)tempBuf; char * const path = tempBuf;
if (strlen(&mStr[index]) < 80) { if (strlen(&mStr[index]) < 80) {
print_to_wifi(STR_BEGIN_FILE_LIST "\r\n"); print_to_wifi(STR_BEGIN_FILE_LIST "\r\n");
@ -1149,7 +1147,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
if (uiCfg.print_state == WORKING || uiCfg.print_state == PAUSED|| uiCfg.print_state == REPRINTING) { if (uiCfg.print_state == WORKING || uiCfg.print_state == PAUSED|| uiCfg.print_state == REPRINTING) {
print_rate = uiCfg.totalSend; print_rate = uiCfg.totalSend;
ZERO(tempBuf); ZERO(tempBuf);
sprintf_P((char *)tempBuf, PSTR("M27 %d\r\n"), print_rate); sprintf_P(tempBuf, PSTR("M27 %d\r\n"), print_rate);
print_to_wifi(tempBuf); print_to_wifi(tempBuf);
} }
break; break;
@ -1166,11 +1164,11 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
if (gCfgItems.fileSysType == FILE_SYS_SD) { if (gCfgItems.fileSysType == FILE_SYS_SD) {
ZERO(tempBuf); ZERO(tempBuf);
sprintf_P((char *)tempBuf, PSTR("%s"), file_writer.saveFileName); sprintf_P(tempBuf, PSTR("%s"), file_writer.saveFileName);
} }
else if (gCfgItems.fileSysType == FILE_SYS_USB) { else if (gCfgItems.fileSysType == FILE_SYS_USB) {
ZERO(tempBuf); ZERO(tempBuf);
sprintf_P((char *)tempBuf, PSTR("%s"), (char *)file_writer.saveFileName); sprintf_P(tempBuf, PSTR("%s"), (char *)file_writer.saveFileName);
} }
mount_file_sys(gCfgItems.fileSysType); mount_file_sys(gCfgItems.fileSysType);
@ -1181,7 +1179,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
ZERO(file_writer.saveFileName); ZERO(file_writer.saveFileName);
strcpy((char *)file_writer.saveFileName, &mStr[index]); strcpy((char *)file_writer.saveFileName, &mStr[index]);
ZERO(tempBuf); ZERO(tempBuf);
sprintf_P((char *)tempBuf, PSTR("Writing to file: %s\r\n"), (char *)file_writer.saveFileName); sprintf_P(tempBuf, PSTR("Writing to file: %s\r\n"), (char *)file_writer.saveFileName);
wifi_ret_ack(); wifi_ret_ack();
print_to_wifi(tempBuf); print_to_wifi(tempBuf);
wifi_link_state = WIFI_WAIT_TRANS_START; wifi_link_state = WIFI_WAIT_TRANS_START;
@ -1203,7 +1201,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
send_ok_to_wifi(); send_ok_to_wifi();
char *outBuf = (char *)tempBuf; char *outBuf = tempBuf;
char tbuf[34]; char tbuf[34];
sprintf_P(tbuf, PSTR("%d /%d"), thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0)); sprintf_P(tbuf, PSTR("%d /%d"), thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0));
@ -1237,7 +1235,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
strcat_P(outBuf, PSTR(" @:0 B@:0\r\n")); strcat_P(outBuf, PSTR(" @:0 B@:0\r\n"));
} }
else { else {
sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), sprintf_P(tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"),
thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0), thermalManager.wholeDegHotend(0), thermalManager.degTargetHotend(0),
TERN0(HAS_HEATED_BED, thermalManager.wholeDegBed()), TERN0(HAS_HEATED_BED, thermalManager.wholeDegBed()),
TERN0(HAS_HEATED_BED, thermalManager.degTargetBed()), TERN0(HAS_HEATED_BED, thermalManager.degTargetBed()),
@ -1254,7 +1252,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
case 992: case 992:
if (uiCfg.print_state == WORKING || uiCfg.print_state == PAUSED) { if (uiCfg.print_state == WORKING || uiCfg.print_state == PAUSED) {
ZERO(tempBuf); ZERO(tempBuf);
sprintf_P((char *)tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); sprintf_P(tempBuf, PSTR("M992 %d%d:%d%d:%d%d\r\n"), print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10);
wifi_ret_ack(); wifi_ret_ack();
print_to_wifi(tempBuf); print_to_wifi(tempBuf);
} }
@ -1264,7 +1262,7 @@ static void wifi_gcode_exec(uint8_t * const cmd_line) {
if (uiCfg.print_state == WORKING || uiCfg.print_state == PAUSED) { if (uiCfg.print_state == WORKING || uiCfg.print_state == PAUSED) {
ZERO(tempBuf); ZERO(tempBuf);
if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return; if (strlen((char *)list_file.file_name[sel_id]) > (100 - 1)) return;
sprintf_P((char *)tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize); sprintf_P(tempBuf, PSTR("M994 %s;%d\n"), list_file.file_name[sel_id], (int)gCfgItems.curFilesize);
wifi_ret_ack(); wifi_ret_ack();
print_to_wifi(tempBuf); print_to_wifi(tempBuf);
} }

View file

@ -656,7 +656,7 @@ public:
static FSTR_P get_preheat_label(const uint8_t m); static FSTR_P get_preheat_label(const uint8_t m);
static void apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e=active_extruder); static void apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e=active_extruder);
static void preheat_set_fan(const uint8_t m) { TERN_(HAS_FAN, apply_preheat(m, _BV(PT_FAN))); } static void preheat_set_fan(const uint8_t m) { TERN_(HAS_FAN, apply_preheat(m, _BV(PT_FAN))); }
static void preheat_hotend(const uint8_t m, const uint8_t e=active_extruder) { TERN_(HAS_HOTEND, apply_preheat(m, _BV(PT_HOTEND))); } static void preheat_hotend(const uint8_t m, const uint8_t e=active_extruder) { TERN_(HAS_HOTEND, apply_preheat(m, _BV(PT_HOTEND), e)); }
static void preheat_hotend_and_fan(const uint8_t m, const uint8_t e=active_extruder) { preheat_hotend(m, e); preheat_set_fan(m); } static void preheat_hotend_and_fan(const uint8_t m, const uint8_t e=active_extruder) { preheat_hotend(m, e); preheat_set_fan(m); }
static void preheat_bed(const uint8_t m) { TERN_(HAS_HEATED_BED, apply_preheat(m, _BV(PT_BED))); } static void preheat_bed(const uint8_t m) { TERN_(HAS_HEATED_BED, apply_preheat(m, _BV(PT_BED))); }
static void preheat_chamber(const uint8_t m) { TERN_(HAS_HEATED_CHAMBER, apply_preheat(m, _BV(PT_CHAMBER))); } static void preheat_chamber(const uint8_t m) { TERN_(HAS_HEATED_CHAMBER, apply_preheat(m, _BV(PT_CHAMBER))); }

View file

@ -107,6 +107,8 @@ xyz_pos_t Probe::offset; // Initialized by settings.load
#if HAS_PROBE_XY_OFFSET #if HAS_PROBE_XY_OFFSET
const xy_pos_t &Probe::offset_xy = Probe::offset; const xy_pos_t &Probe::offset_xy = Probe::offset;
#else
constexpr xy_pos_t Probe::offset_xy;
#endif #endif
#if ENABLED(SENSORLESS_PROBING) #if ENABLED(SENSORLESS_PROBING)

View file

@ -2882,7 +2882,7 @@ hal_timer_t Stepper::block_phase_isr() {
const bool forward_e = step_rate > 0; const bool forward_e = step_rate > 0;
#if ENABLED(NONLINEAR_EXTRUSION) #if ENABLED(NONLINEAR_EXTRUSION)
if (forward_e && ANY_AXIS_MOVES(current_block)) { if (ne.settings.enabled && forward_e && ANY_AXIS_MOVES(current_block)) {
// Maximum polynomial value is just above 1, like 1.05..1.2, less than 2 anyway, so we can use 30 bits for fractional part // Maximum polynomial value is just above 1, like 1.05..1.2, less than 2 anyway, so we can use 30 bits for fractional part
int32_t vd_q30 = ne.q30.A * sq(step_rate) + ne.q30.B * step_rate; int32_t vd_q30 = ne.q30.A * sq(step_rate) + ne.q30.B * step_rate;
NOLESS(vd_q30, 0); NOLESS(vd_q30, 0);

View file

@ -154,6 +154,82 @@ enum StealthIndex : uint8_t {
TMC_SPI_DEFINE_E(7); TMC_SPI_DEFINE_E(7);
#endif #endif
#if HAS_TMC_SPI
// Init CS pins (active-low) for TMC SPI drivers.
#define INIT_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
void tmc_init_cs_pins() {
#if AXIS_HAS_SPI(X)
INIT_CS_PIN(X);
#endif
#if AXIS_HAS_SPI(Y)
INIT_CS_PIN(Y);
#endif
#if AXIS_HAS_SPI(Z)
INIT_CS_PIN(Z);
#endif
#if AXIS_HAS_SPI(X2)
INIT_CS_PIN(X2);
#endif
#if AXIS_HAS_SPI(Y2)
INIT_CS_PIN(Y2);
#endif
#if AXIS_HAS_SPI(Z2)
INIT_CS_PIN(Z2);
#endif
#if AXIS_HAS_SPI(Z3)
INIT_CS_PIN(Z3);
#endif
#if AXIS_HAS_SPI(Z4)
INIT_CS_PIN(Z4);
#endif
#if AXIS_HAS_SPI(I)
INIT_CS_PIN(I);
#endif
#if AXIS_HAS_SPI(J)
INIT_CS_PIN(J);
#endif
#if AXIS_HAS_SPI(K)
INIT_CS_PIN(K);
#endif
#if AXIS_HAS_SPI(U)
INIT_CS_PIN(U);
#endif
#if AXIS_HAS_SPI(V)
INIT_CS_PIN(V);
#endif
#if AXIS_HAS_SPI(W)
INIT_CS_PIN(W);
#endif
#if AXIS_HAS_SPI(E0)
INIT_CS_PIN(E0);
#endif
#if AXIS_HAS_SPI(E1)
INIT_CS_PIN(E1);
#endif
#if AXIS_HAS_SPI(E2)
INIT_CS_PIN(E2);
#endif
#if AXIS_HAS_SPI(E3)
INIT_CS_PIN(E3);
#endif
#if AXIS_HAS_SPI(E4)
INIT_CS_PIN(E4);
#endif
#if AXIS_HAS_SPI(E5)
INIT_CS_PIN(E5);
#endif
#if AXIS_HAS_SPI(E6)
INIT_CS_PIN(E6);
#endif
#if AXIS_HAS_SPI(E7)
INIT_CS_PIN(E7);
#endif
}
#endif // HAS_TMC_SPI
#ifndef TMC_BAUD_RATE #ifndef TMC_BAUD_RATE
// Reduce baud rate for boards not already overriding TMC_BAUD_RATE for software serial. // Reduce baud rate for boards not already overriding TMC_BAUD_RATE for software serial.
// Testing has shown that 115200 is not 100% reliable on AVR platforms, occasionally // Testing has shown that 115200 is not 100% reliable on AVR platforms, occasionally
@ -313,6 +389,7 @@ enum StealthIndex : uint8_t {
// TMC2208/2209 Driver objects and inits // TMC2208/2209 Driver objects and inits
// //
#if HAS_TMC_UART #if HAS_TMC_UART
#if AXIS_HAS_UART(X) #if AXIS_HAS_UART(X)
#ifdef X_HARDWARE_SERIAL #ifdef X_HARDWARE_SERIAL
TMC_UART_DEFINE(HW, X, X); TMC_UART_DEFINE(HW, X, X);
@ -685,7 +762,8 @@ enum StealthIndex : uint8_t {
#endif #endif
#endif #endif
} }
#endif
#endif // HAS_TMC_UART
#if HAS_DRIVER(TMC2208) #if HAS_DRIVER(TMC2208)
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID> template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>

View file

@ -109,6 +109,10 @@
#define CHOPPER_TIMING_E CHOPPER_TIMING #define CHOPPER_TIMING_E CHOPPER_TIMING
#endif #endif
#if HAS_TMC_SPI
void tmc_init_cs_pins();
#endif
#if HAS_TMC_UART #if HAS_TMC_UART
void tmc_serial_begin(); void tmc_serial_begin();
#endif #endif

View file

@ -166,7 +166,7 @@
#if TEMP_SENSOR_IS_ANY_MAX_TC(2) && TEMP_SENSOR_2_HAS_SPI_PINS && DISABLED(TEMP_SENSOR_FORCE_HW_SPI) #if TEMP_SENSOR_IS_ANY_MAX_TC(2) && TEMP_SENSOR_2_HAS_SPI_PINS && DISABLED(TEMP_SENSOR_FORCE_HW_SPI)
#define TEMP_SENSOR_2_USES_SW_SPI 1 #define TEMP_SENSOR_2_USES_SW_SPI 1
#endif #endif
#if TEMP_SENSOR_IS_ANY_MAX_TC(BED) && TEMP_SENSOR_0_HAS_SPI_PINS && DISABLED(TEMP_SENSOR_FORCE_HW_SPI) #if TEMP_SENSOR_IS_ANY_MAX_TC(BED) && TEMP_SENSOR_BED_HAS_SPI_PINS && DISABLED(TEMP_SENSOR_FORCE_HW_SPI)
#define TEMP_SENSOR_BED_USES_SW_SPI 1 #define TEMP_SENSOR_BED_USES_SW_SPI 1
#endif #endif

View file

@ -226,7 +226,7 @@
#if ENABLED(SPI_FLASH) #if ENABLED(SPI_FLASH)
#define HAS_SPI_FLASH 1 #define HAS_SPI_FLASH 1
#define SPI_DEVICE 2 #define SPI_DEVICE 2
#define SPI_FLASH_SIZE 0x1000000 #define SPI_FLASH_SIZE 0x1000000 // 16MB
#define SPI_FLASH_CS_PIN PB12 #define SPI_FLASH_CS_PIN PB12
#define SPI_FLASH_MOSI_PIN PC3 #define SPI_FLASH_MOSI_PIN PC3
#define SPI_FLASH_MISO_PIN PC2 #define SPI_FLASH_MISO_PIN PC2

View file

@ -188,7 +188,7 @@ echo "Building example $CONFIG..."
# If doing many builds get a list of all environment names, # If doing many builds get a list of all environment names,
# which also gives us the number of environments. # which also gives us the number of environments.
if ((MANY)); then if ((MANY)); then
ENVLIST=$(mfenvs) # BOARD_NAME_STRING (1234): [ env1 env2 env3 ... ] ENVLIST=$(mfenvs -n) # BOARD_NAME_STRING (1234): [ env1 env2 env3 ... ]
ENVLIST=${ENVLIST##*: [ } ENVLIST=${ENVLIST##*: [ }
ENVARRAY=(${ENVLIST% ]}) ENVARRAY=(${ENVLIST% ]})
ENVCOUNT=${#ENVARRAY[*]} ENVCOUNT=${#ENVARRAY[*]}
@ -236,7 +236,7 @@ while ((1)); do
fi fi
# When building many, create sub-folders for each build env name # When building many, create sub-folders for each build env name
if [[ -n $MANY && $ENVCOUNT -gt 1 ]]; then if [[ -n $MANY ]]; then
ENV=${ENVARRAY[BUILDINDEX-1]} ENV=${ENVARRAY[BUILDINDEX-1]}
ARCENVSUB="$ARCSUB/$ENV" ARCENVSUB="$ARCSUB/$ENV"
else else

View file

@ -1,6 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# mfenvs Print the current board and environment information # mfenvs Print the current board and environment information
# Use -n to remove "*_xfer" environments from the list.
# Output -> "SHORT_NAME (###): [ env1 env2 env3 ... ]" # Output -> "SHORT_NAME (###): [ env1 env2 env3 ... ]"
# #
@ -27,6 +28,7 @@ BLINE=$( grep -E "define\s+BOARD_$MB\b" Marlin/src/core/boards.h )
BNUM=$( sed -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" ) BNUM=$( sed -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" )
[[ -z $BNUM ]] && { echo "Error - Can't find BOARD_$MB in core/boards.h." ; exit 1 ; } [[ -z $BNUM ]] && { echo "Error - Can't find BOARD_$MB in core/boards.h." ; exit 1 ; }
ENVS=( $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E "#include.+//.+(env|$SYS):[^ ]+" | grep -oE "(env|$SYS):[^ ]+" | sed -E "s/(env|$SYS)://" ) ) ENVS=( $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E "#include.+//.+(env|$SYS):[^ ]+" | grep -oE "(env|$SYS):[^ ]+" | sed -E "s/(env|$SYS)://" ) )
[[ "$1" = "-n" ]] && ENVS=( $(printf "%s\n" "${ENVS[@]}" | grep -v "_xfer$") )
[[ -z $ENVS ]] && { errout "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; } [[ -z $ENVS ]] && { errout "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; }
ECOUNT=${#ENVS[*]} ECOUNT=${#ENVS[*]}
[[ $ECOUNT == 1 ]] && EOUT=$ENVS || EOUT="${ENVS[@]}" [[ $ECOUNT == 1 ]] && EOUT=$ENVS || EOUT="${ENVS[@]}"

View file

@ -83,7 +83,8 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_V1_4_TURBO SERIAL_PORT -1 \
Z_MIN_ENDSTOP_HIT_STATE HIGH Z_MIN_ENDSTOP_HIT_STATE HIGH
opt_enable PIDTEMPBED \ opt_enable PIDTEMPBED \
FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE \
BLTOUCH BLTOUCH_FORCE_SW_MODE USE_PROBE_FOR_Z_HOMING Z_SAFE_HOMING QUICK_HOME Z_STEPPER_AUTO_ALIGN \ BLTOUCH BLTOUCH_FORCE_SW_MODE USE_PROBE_FOR_Z_HOMING Z_SAFE_HOMING QUICK_HOME \
Z_STEPPER_AUTO_ALIGN EVENT_GCODE_BEFORE_G34 EVENT_GCODE_AFTER_G34 \
AUTO_BED_LEVELING_BILINEAR EXTRAPOLATE_BEYOND_GRID RESTORE_LEVELING_AFTER_G28 LCD_BED_LEVELING MESH_EDIT_MENU \ AUTO_BED_LEVELING_BILINEAR EXTRAPOLATE_BEYOND_GRID RESTORE_LEVELING_AFTER_G28 LCD_BED_LEVELING MESH_EDIT_MENU \
EEPROM_SETTINGS EEPROM_AUTO_INIT \ EEPROM_SETTINGS EEPROM_AUTO_INIT \
SDSUPPORT CR10_STOCKDISPLAY SPEAKER LCD_INFO_MENU STATUS_MESSAGE_SCROLLING \ SDSUPPORT CR10_STOCKDISPLAY SPEAKER LCD_INFO_MENU STATUS_MESSAGE_SCROLLING \

View file

@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+<src/tests>
POSTMORTEM_DEBUGGING = build_src_filter=+<src/HAL/shared/cpu_exception> +<src/HAL/shared/backtrace> POSTMORTEM_DEBUGGING = build_src_filter=+<src/HAL/shared/cpu_exception> +<src/HAL/shared/backtrace>
build_flags=-funwind-tables build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.7.zip HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.8.zip
build_src_filter=+<src/module/stepper/trinamic.cpp> +<src/gcode/feature/trinamic/M122.cpp> +<src/gcode/feature/trinamic/M906.cpp> +<src/gcode/feature/trinamic/M911-M914.cpp> +<src/gcode/feature/trinamic/M919.cpp> build_src_filter=+<src/module/stepper/trinamic.cpp> +<src/gcode/feature/trinamic/M122.cpp> +<src/gcode/feature/trinamic/M906.cpp> +<src/gcode/feature/trinamic/M911-M914.cpp> +<src/gcode/feature/trinamic/M919.cpp>
HAS_STEPPER_CONTROL = build_src_filter=+<src/module/stepper/control.cpp> HAS_STEPPER_CONTROL = build_src_filter=+<src/module/stepper/control.cpp>
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+<src/feature/tmc_util.cpp> HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+<src/feature/tmc_util.cpp>

View file

@ -270,7 +270,7 @@ board_build.ldscript = mks_robin_pro.ld
# #
[env:trigorilla_pro_maple] [env:trigorilla_pro_maple]
extends = env:mks_robin_maple extends = env:mks_robin_maple
build_flags = ${env:mks_robin_maple} -DSTM32_FLASH_SIZE=512 build_flags = ${env:mks_robin_maple.build_flags} -DSTM32_FLASH_SIZE=512
# #
# MKS Robin E3D (STM32F103RCT6) and # MKS Robin E3D (STM32F103RCT6) and

View file

@ -320,7 +320,7 @@ build_unflags = ${env:STM32F407VG_btt.build_unflags} -DUSBD_USE_CDC
[env:STM32F407VG_btt_USB_debug] [env:STM32F407VG_btt_USB_debug]
extends = env:STM32F407VG_btt_USB extends = env:STM32F407VG_btt_USB
build_flags = ${env:STM32F407VG_btt_USB.build_flags} -O0 build_flags = ${env:STM32F407VG_btt_USB.build_flags} -O0
build_unflags = ${env:STM32F407VG_btt_USB.build_unflags} -Os -NDEBUG build_unflags = ${env:STM32F407VG_btt_USB.build_unflags} -Os -DNDEBUG
# #
# Bigtreetech SKR V2.0 (STM32F429VGT6 ARM Cortex-M4) with USB Flash Drive Support # Bigtreetech SKR V2.0 (STM32F429VGT6 ARM Cortex-M4) with USB Flash Drive Support
@ -340,7 +340,7 @@ build_unflags = ${env:STM32F429VG_btt.build_unflags} -DUSBD_USE_CDC
[env:STM32F429VG_btt_USB_debug] [env:STM32F429VG_btt_USB_debug]
extends = env:STM32F429VG_btt_USB extends = env:STM32F429VG_btt_USB
build_flags = ${env:STM32F429VG_btt_USB.build_flags} -O0 build_flags = ${env:STM32F429VG_btt_USB.build_flags} -O0
build_unflags = ${env:STM32F429VG_btt_USB.build_unflags} -Os -NDEBUG build_unflags = ${env:STM32F429VG_btt_USB.build_unflags} -Os -DNDEBUG
# #
# BigTreeTech Octopus V1.0/1.1 / Octopus Pro V1.0 (STM32F446ZET6 ARM Cortex-M4) # BigTreeTech Octopus V1.0/1.1 / Octopus Pro V1.0 (STM32F446ZET6 ARM Cortex-M4)