Skip to content

Commit 1bdf446

Browse files
⛙ Merge w/Marlin
2 parents 79e97f7 + d0dc3b6 commit 1bdf446

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+596
-468
lines changed

Marlin/Configuration_adv.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,16 +1156,18 @@
11561156
#if ENABLED(FT_MOTION)
11571157
//#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default?
11581158
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
1159-
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
1160-
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
1161-
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
1162-
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
1159+
11631160
#define FTM_LINEAR_ADV_DEFAULT_ENA false // Default linear advance enable (true) or disable (false)
11641161
#define FTM_LINEAR_ADV_DEFAULT_K 0.0f // Default linear advance gain. (Acceleration-based scaling factor.)
1165-
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
1166-
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
11671162

1163+
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
1164+
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
1165+
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
11681166
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
1167+
1168+
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
1169+
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
1170+
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
11691171
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
11701172

11711173
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 parameters
@@ -1198,7 +1200,6 @@
11981200
#endif
11991201

12001202
#define FTM_STEPS_PER_UNIT_TIME (FTM_STEPPER_FS / FTM_FS) // Interpolated stepper commands per unit time
1201-
#define FTM_CTS_COMPARE_VAL (FTM_STEPS_PER_UNIT_TIME / 2) // Comparison value used in interpolation algorithm
12021203
#define FTM_MIN_TICKS ((STEPPER_TIMER_RATE) / (FTM_STEPPER_FS)) // Minimum stepper ticks between steps
12031204

12041205
#define FTM_MIN_SHAPE_FREQ 10 // Minimum shaping frequency
@@ -3529,6 +3530,7 @@
35293530
//#define W_STALL_SENSITIVITY 8
35303531
//#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
35313532
//#define IMPROVE_HOMING_RELIABILITY
3533+
//#define SENSORLESS_STALLGUARD_DELAY 0 // (ms) Delay to allow drivers to settle
35323534
#endif
35333535

35343536
// @section tmc/config

Marlin/Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
* here we define this default string as the date where the latest release
4242
* version was tagged.
4343
*/
44-
//#define STRING_DISTRIBUTION_DATE "2025-09-07"
44+
//#define STRING_DISTRIBUTION_DATE "2025-09-15"
4545

4646
#define STRING_DISTRIBUTION_DATE __DATE__
4747
#define STRING_DISTRIBUTION_TIME __TIME__

Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_st7920_sw_spi.cpp

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,33 +71,33 @@ static uint8_t SPI_speed = 0;
7171

7272
static uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) {
7373
for (uint8_t i = 0; i < 8; i++) {
74-
WRITE_PIN(mosi_pin, !!(b & 0x80));
74+
WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, LOW, HIGH));
7575
DELAY_CYCLES(SPI_SPEED);
76-
WRITE_PIN(sck_pin, HIGH);
76+
WRITE_PIN(mosi_pin, !!(b & 0x80));
7777
DELAY_CYCLES(SPI_SPEED);
7878
b <<= 1;
7979
if (miso_pin >= 0 && READ_PIN(miso_pin)) b |= 1;
80-
WRITE_PIN(sck_pin, LOW);
80+
WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, HIGH, LOW));
8181
DELAY_CYCLES(SPI_SPEED);
8282
}
8383
return b;
8484
}
8585

8686
static uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) {
8787
WRITE_PIN(mosi_pin, HIGH);
88-
WRITE_PIN(sck_pin, LOW);
88+
WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, HIGH, LOW));
8989
return spiRate;
9090
}
9191

9292
static void u8g_com_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
9393
static uint8_t rs_last_state = 255;
9494
if (rs != rs_last_state) {
9595
// Transfer Data (FA) or Command (F8)
96-
swSpiTransfer(rs ? 0x0FA : 0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
96+
swSpiTransfer(rs ? 0xFA : 0xF8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
9797
rs_last_state = rs;
9898
DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe
9999
}
100-
swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
100+
swSpiTransfer(val & 0xF0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
101101
swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
102102
}
103103

@@ -170,5 +170,32 @@ uint8_t u8g_com_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
170170
}
171171
#endif
172172

173+
#if ENABLED(LIGHTWEIGHT_UI)
174+
175+
#define ST7920_CS() { WRITE(LCD_PINS_RS, HIGH); }
176+
#define ST7920_NCS() { WRITE(LCD_PINS_RS, LOW); }
177+
#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); }
178+
#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); }
179+
#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); }
180+
181+
#define ST7920_DAT(V) !!((V) & 0x80)
182+
183+
#define ST7920_SND_BIT(...) do{ \
184+
WRITE(LCD_PINS_D4, LOW); \
185+
WRITE(LCD_PINS_EN, ST7920_DAT(val)); \
186+
WRITE(LCD_PINS_D4, HIGH); \
187+
val <<= 1; }while(0);
188+
189+
void ST7920_SWSPI_SND_8BIT(uint8_t val) {
190+
REPEAT(8, ST7920_SND_BIT);
191+
}
192+
193+
void ST7920_cs() { ST7920_CS(); }
194+
void ST7920_ncs() { ST7920_NCS(); }
195+
void ST7920_set_cmd() { ST7920_SET_CMD(); }
196+
void ST7920_set_dat() { ST7920_SET_DAT(); }
197+
void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); }
198+
#endif // LIGHTWEIGHT_UI
199+
173200
#endif // IS_U8GLIB_ST7920
174201
#endif // __PLAT_NATIVE_SIM__

Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck
127127
static uint8_t SPI_speed = 0;
128128

129129
static uint8_t swSpiInit(const uint8_t spi_speed, const uint8_t clk_pin, const uint8_t mosi_pin) {
130-
return spi_speed;
130+
return spi_speed;
131131
}
132132

133133
static void u8g_sw_spi_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) {

Marlin/src/feature/tmc_util.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@
8989

9090
#if HAS_TMCX1X0
9191

92-
static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); }
92+
#if ENABLED(TMC_DEBUG)
93+
static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); }
94+
#endif
9395

9496
static TMC_driver_data get_driver_data(TMC2130Stepper &st) {
9597
constexpr uint8_t OT_bp = 25, OTPW_bp = 26;
@@ -148,7 +150,9 @@
148150

149151
#if HAS_DRIVER(TMC2240)
150152

151-
static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); }
153+
#if ENABLED(TMC_DEBUG)
154+
static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); }
155+
#endif
152156

153157
static TMC_driver_data get_driver_data(TMC2240Stepper &st) {
154158
constexpr uint8_t OT_bp = 25, OTPW_bp = 26;
@@ -207,7 +211,9 @@
207211

208212
#if HAS_TMC220x
209213

210-
static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); }
214+
#if ENABLED(TMC_DEBUG)
215+
static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); }
216+
#endif
211217

212218
static TMC_driver_data get_driver_data(TMC2208Stepper &st) {
213219
constexpr uint8_t OTPW_bp = 0, OT_bp = 1;
@@ -242,7 +248,9 @@
242248

243249
#if HAS_DRIVER(TMC2660)
244250

245-
static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; }
251+
#if ENABLED(TMC_DEBUG)
252+
static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; }
253+
#endif
246254

247255
static TMC_driver_data get_driver_data(TMC2660Stepper &st) {
248256
constexpr uint8_t OT_bp = 1, OTPW_bp = 2;

Marlin/src/gcode/feature/ft_motion/M493.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ void say_shaping() {
6161

6262
// FT Shaping
6363
#if HAS_X_AXIS
64-
if (AXIS_HAS_SHAPER(X)) {
64+
if (AXIS_IS_SHAPING(X)) {
6565
SERIAL_ECHOPGM(" with " AXIS_0_NAME);
6666
say_shaper_type(X_AXIS);
6767
}
6868
#endif
6969
#if HAS_Y_AXIS
70-
if (AXIS_HAS_SHAPER(Y)) {
70+
if (AXIS_IS_SHAPING(Y)) {
7171
SERIAL_ECHOPGM(" and with " AXIS_1_NAME);
7272
say_shaper_type(Y_AXIS);
7373
}
@@ -80,7 +80,7 @@ void say_shaping() {
8080
dynamic = z_based || g_based;
8181

8282
// FT Dynamic Frequency Mode
83-
if (AXIS_HAS_SHAPER(X) || AXIS_HAS_SHAPER(Y)) {
83+
if (AXIS_IS_SHAPING(X) || AXIS_IS_SHAPING(Y)) {
8484
#if HAS_DYNAMIC_FREQ
8585
SERIAL_ECHOPGM("Dynamic Frequency Mode ");
8686
switch (ftMotion.cfg.dynFreqMode) {
@@ -263,7 +263,7 @@ void GcodeSuite::M493() {
263263

264264
// Dynamic frequency mode parameter.
265265
if (parser.seenval('D')) {
266-
if (AXIS_HAS_SHAPER(X) || AXIS_HAS_SHAPER(Y)) {
266+
if (AXIS_IS_SHAPING(X) || AXIS_IS_SHAPING(Y)) {
267267
const dynFreqMode_t val = dynFreqMode_t(parser.value_byte());
268268
switch (val) {
269269
#if HAS_DYNAMIC_FREQ_MM
@@ -297,7 +297,7 @@ void GcodeSuite::M493() {
297297

298298
// Parse frequency parameter (X axis).
299299
if (parser.seenval('A')) {
300-
if (AXIS_HAS_SHAPER(X)) {
300+
if (AXIS_IS_SHAPING(X)) {
301301
const float val = parser.value_float();
302302
/// TODO: Frequency minimum is dependent on the shaper used; the above check isn't always correct.
303303
if (WITHIN(val, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2)) {
@@ -326,7 +326,7 @@ void GcodeSuite::M493() {
326326
// Parse zeta parameter (X axis).
327327
if (parser.seenval('I')) {
328328
const float val = parser.value_float();
329-
if (AXIS_HAS_SHAPER(X)) {
329+
if (AXIS_IS_SHAPING(X)) {
330330
if (WITHIN(val, 0.01f, 1.0f)) {
331331
ftMotion.cfg.zeta[0] = val;
332332
flag.update = true;
@@ -341,7 +341,7 @@ void GcodeSuite::M493() {
341341
// Parse vtol parameter (X axis).
342342
if (parser.seenval('Q')) {
343343
const float val = parser.value_float();
344-
if (AXIS_HAS_EISHAPER(X)) {
344+
if (AXIS_IS_EISHAPING(X)) {
345345
if (WITHIN(val, 0.00f, 1.0f)) {
346346
ftMotion.cfg.vtol[0] = val;
347347
flag.update = true;
@@ -359,7 +359,7 @@ void GcodeSuite::M493() {
359359

360360
// Parse frequency parameter (Y axis).
361361
if (parser.seenval('B')) {
362-
if (AXIS_HAS_SHAPER(Y)) {
362+
if (AXIS_IS_SHAPING(Y)) {
363363
const float val = parser.value_float();
364364
if (WITHIN(val, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2)) {
365365
ftMotion.cfg.baseFreq.y = val;
@@ -387,7 +387,7 @@ void GcodeSuite::M493() {
387387
// Parse zeta parameter (Y axis).
388388
if (parser.seenval('J')) {
389389
const float val = parser.value_float();
390-
if (AXIS_HAS_SHAPER(Y)) {
390+
if (AXIS_IS_SHAPING(Y)) {
391391
if (WITHIN(val, 0.01f, 1.0f)) {
392392
ftMotion.cfg.zeta[1] = val;
393393
flag.update = true;
@@ -402,7 +402,7 @@ void GcodeSuite::M493() {
402402
// Parse vtol parameter (Y axis).
403403
if (parser.seenval('R')) {
404404
const float val = parser.value_float();
405-
if (AXIS_HAS_EISHAPER(Y)) {
405+
if (AXIS_IS_EISHAPING(Y)) {
406406
if (WITHIN(val, 0.00f, 1.0f)) {
407407
ftMotion.cfg.vtol[1] = val;
408408
flag.update = true;

Marlin/src/gcode/feature/trinamic/M920.cpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,16 @@ void GcodeSuite::M920() {
9595
void GcodeSuite::M920_report(const bool forReplay/*=true*/) {
9696
TERN_(MARLIN_SMALL_BUILD, return);
9797

98-
report_heading(forReplay, F(STR_HOMING_CURRENT));
98+
#if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS
9999

100-
auto say_M920 = [](const bool forReplay, int8_t index=-1) {
101-
report_echo_start(forReplay);
102-
SERIAL_ECHOPGM(" M920");
103-
if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index);
104-
};
100+
report_heading(forReplay, F(STR_HOMING_CURRENT));
101+
102+
auto say_M920 = [](const bool forReplay, int8_t index=-1) {
103+
report_echo_start(forReplay);
104+
SERIAL_ECHOPGM(" M920");
105+
if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index);
106+
};
105107

106-
#if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS
107108
#if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS
108109
say_M920(forReplay, 0);
109110
#else
@@ -123,23 +124,26 @@ void GcodeSuite::M920_report(const bool forReplay/*=true*/) {
123124
TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, homing_current_mA.V));
124125
TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, homing_current_mA.W));
125126
SERIAL_EOL();
126-
#endif
127127

128-
#if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS
129-
say_M920(forReplay, 1);
130-
TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X2));
131-
TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y2));
132-
TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z2));
133-
SERIAL_EOL();
134-
#endif
135-
#if Z3_SENSORLESS
136-
say_M920(forReplay, 2);
137-
SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z3);
138-
#endif
139-
#if Z4_SENSORLESS
140-
say_M920(forReplay, 3);
141-
SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z4);
142-
#endif
128+
#if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS
129+
say_M920(forReplay, 1);
130+
TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X2));
131+
TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y2));
132+
TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z2));
133+
SERIAL_EOL();
134+
#endif
135+
136+
#if Z3_SENSORLESS
137+
say_M920(forReplay, 2);
138+
SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z3);
139+
#endif
140+
141+
#if Z4_SENSORLESS
142+
say_M920(forReplay, 3);
143+
SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z4);
144+
#endif
145+
146+
#endif // X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS
143147
}
144148

145149
#endif // EDITABLE_HOMING_CURRENT

Marlin/src/inc/Conditionals-2-LCD.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,17 +309,17 @@
309309

310310
#endif
311311

312-
#if ANY(FYSETC_MINI_12864, MKS_MINI_12864)
313-
#define U8G_SPI_USE_MODE_3 1
314-
#endif
315-
316312
// ST7920-based graphical displays
317313
#if ANY(IS_RRD_FG_SC, LCD_FOR_MELZI, SILVER_GATE_GLCD_CONTROLLER)
318314
#define DOGLCD
319315
#define IS_U8GLIB_ST7920 1
320316
#define IS_RRD_SC 1
321317
#endif
322318

319+
#if ANY(FYSETC_MINI_12864, MKS_MINI_12864) || ALL(__PLAT_NATIVE_SIM__, IS_U8GLIB_ST7920)
320+
#define U8G_SPI_USE_MODE_3 1
321+
#endif
322+
323323
// ST7565 / 64128N graphical displays
324324
#if ANY(MAKRPANEL, MINIPANEL)
325325
#define IS_ULTIPANEL 1

Marlin/src/inc/Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* version was tagged.
4343
*/
4444
#ifndef STRING_DISTRIBUTION_DATE
45-
#define STRING_DISTRIBUTION_DATE "2025-09-07"
45+
#define STRING_DISTRIBUTION_DATE "2025-09-15"
4646
#endif
4747

4848
/**

Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -478,13 +478,7 @@ void ST7920_Lite_Status_Screen::draw_fan_icon(const bool whichIcon) {
478478
}
479479

480480
void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool heating) {
481-
set_ddram_address(
482-
#if HOTENDS == 1
483-
DDRAM_LINE_2
484-
#else
485-
DDRAM_LINE_3
486-
#endif
487-
);
481+
set_ddram_address((HOTENDS < 2) ? DDRAM_LINE_2 : DDRAM_LINE_3);
488482
begin_data();
489483
if (heating)
490484
write_word(whichIcon ? CGRAM_ICON_1_WORD : CGRAM_ICON_2_WORD);
@@ -920,7 +914,7 @@ void ST7920_Lite_Status_Screen::update(const bool forceUpdate) {
920914
cs();
921915
update_indicators(forceUpdate);
922916
update_status_or_position(forceUpdate);
923-
update_progress(forceUpdate);
917+
TERN_(HAS_PRINT_PROGRESS, update_progress(forceUpdate));
924918
ncs();
925919
}
926920

0 commit comments

Comments
 (0)