|
|
@ -275,6 +275,8 @@ |
|
|
|
#error "HAVE_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." |
|
|
|
#elif defined(HAVE_TMC2130) |
|
|
|
#error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." |
|
|
|
#elif defined(HAVE_TMC2208) |
|
|
|
#error "HAVE_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." |
|
|
|
#elif defined(HAVE_L6470DRIVER) |
|
|
|
#error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." |
|
|
|
#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \ |
|
|
@ -1070,10 +1072,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS |
|
|
|
* Require pin options and pins to be defined |
|
|
|
*/ |
|
|
|
#if ENABLED(SENSORLESS_PROBING) |
|
|
|
#if ENABLED(DELTA) && (!AXIS_DRIVER_TYPE_X(TMC2130) || !AXIS_DRIVER_TYPE_Y(TMC2130) || !AXIS_DRIVER_TYPE_Z(TMC2130)) |
|
|
|
#error "SENSORLESS_PROBING requires TMC2130 drivers on X, Y, and Z." |
|
|
|
#elif !AXIS_DRIVER_TYPE_Z(TMC2130) |
|
|
|
#error "SENSORLESS_PROBING requires a TMC2130 driver on Z." |
|
|
|
#if ENABLED(DELTA) && !(AXIS_HAS_STALLGUARD(X) && AXIS_HAS_STALLGUARD(Y) && AXIS_HAS_STALLGUARD(Z)) |
|
|
|
#error "SENSORLESS_PROBING requires TMC2130/2160/2209/5130/5160 drivers on X, Y, and Z." |
|
|
|
#elif !AXIS_HAS_STALLGUARD(Z) |
|
|
|
#error "SENSORLESS_PROBING requires a TMC2130/2160/2209/5130/5160 driver on Z." |
|
|
|
#endif |
|
|
|
#elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) |
|
|
|
#if DISABLED(USE_ZMIN_PLUG) |
|
|
@ -1876,73 +1878,106 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS |
|
|
|
/**
|
|
|
|
* Check existing CS pins against enabled TMC SPI drivers. |
|
|
|
*/ |
|
|
|
#define INVALID_TMC2130(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) && !PIN_EXISTS(ST##_CS)) |
|
|
|
#if INVALID_TMC2130(X) |
|
|
|
#error "TMC2130 on X requires X_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(X2) |
|
|
|
#error "TMC2130 on X2 requires X2_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(Y) |
|
|
|
#error "TMC2130 on Y requires Y_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(Y2) |
|
|
|
#error "TMC2130 on Y2 requires Y2_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(Z) |
|
|
|
#error "TMC2130 on Z requires Z_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(Z2) |
|
|
|
#error "TMC2130 on Z2 requires Z2_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(Z3) |
|
|
|
#error "TMC2130 on Z3 requires Z3_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(E0) |
|
|
|
#error "TMC2130 on E0 requires E0_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(E1) |
|
|
|
#error "TMC2130 on E1 requires E1_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(E2) |
|
|
|
#error "TMC2130 on E2 requires E2_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(E3) |
|
|
|
#error "TMC2130 on E3 requires E3_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(E4) |
|
|
|
#error "TMC2130 on E4 requires E4_CS_PIN." |
|
|
|
#elif INVALID_TMC2130(E5) |
|
|
|
#error "TMC2130 on E5 requires E5_CS_PIN." |
|
|
|
#endif |
|
|
|
#undef INVALID_TMC2130 |
|
|
|
#define INVALID_TMC_SPI(ST) (AXIS_HAS_SPI && !PIN_EXISTS(ST##_CS)) |
|
|
|
#if INVALID_TMC_SPI(X) |
|
|
|
#error "An SPI driven TMC driver on X requires X_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(X2) |
|
|
|
#error "An SPI driven TMC driver on X2 requires X2_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(Y) |
|
|
|
#error "An SPI driven TMC driver on Y requires Y_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(Y2) |
|
|
|
#error "An SPI driven TMC driver on Y2 requires Y2_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(Z) |
|
|
|
#error "An SPI driven TMC driver on Z requires Z_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(Z2) |
|
|
|
#error "An SPI driven TMC driver on Z2 requires Z2_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(Z3) |
|
|
|
#error "An SPI driven TMC driver on Z3 requires Z3_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(E0) |
|
|
|
#error "An SPI driven TMC driver on E0 requires E0_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(E1) |
|
|
|
#error "An SPI driven TMC driver on E1 requires E1_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(E2) |
|
|
|
#error "An SPI driven TMC driver on E2 requires E2_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(E3) |
|
|
|
#error "An SPI driven TMC driver on E3 requires E3_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(E4) |
|
|
|
#error "An SPI driven TMC driver on E4 requires E4_CS_PIN." |
|
|
|
#elif INVALID_TMC_SPI(E5) |
|
|
|
#error "An SPI driven TMC driver on E5 requires E5_CS_PIN." |
|
|
|
#endif |
|
|
|
#undef INVALID_TMC_SPI |
|
|
|
|
|
|
|
/**
|
|
|
|
* Check existing RX/TX pins against enable TMC UART drivers. |
|
|
|
*/ |
|
|
|
#define INVALID_TMC2208(ST) (AXIS_DRIVER_TYPE(ST, TMC2208) && !(defined(ST##_HARDWARE_SERIAL) || (PIN_EXISTS(ST##_SERIAL_RX, ST##_SERIAL_TX)))) |
|
|
|
#if INVALID_TMC2208(X) |
|
|
|
#error "TMC2208 on X requires X_HARDWARE_SERIAL or X_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(X2) |
|
|
|
#error "TMC2208 on X2 requires X2_HARDWARE_SERIAL or X2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(Y) |
|
|
|
#error "TMC2208 on Y requires Y_HARDWARE_SERIAL or Y_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(Y2) |
|
|
|
#error "TMC2208 on Y2 requires Y2_HARDWARE_SERIAL or Y2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(Z) |
|
|
|
#error "TMC2208 on Z requires Z_HARDWARE_SERIAL or Z_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(Z2) |
|
|
|
#error "TMC2208 on Z2 requires Z2_HARDWARE_SERIAL or Z2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(Z3) |
|
|
|
#error "TMC2208 on Z3 requires Z3_HARDWARE_SERIAL or Z3_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(E0) |
|
|
|
#error "TMC2208 on E0 requires E0_HARDWARE_SERIAL or E0_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(E1) |
|
|
|
#error "TMC2208 on E1 requires E1_HARDWARE_SERIAL or E1_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(E2) |
|
|
|
#error "TMC2208 on E2 requires E2_HARDWARE_SERIAL or E2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(E3) |
|
|
|
#error "TMC2208 on E3 requires E3_HARDWARE_SERIAL or E3_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(E4) |
|
|
|
#error "TMC2208 on E4 requires E4_HARDWARE_SERIAL or E4_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC2208(E5) |
|
|
|
#error "TMC2208 on E5 requires E5_HARDWARE_SERIAL or E5_SERIAL_(RX|TX)_PIN." |
|
|
|
#endif |
|
|
|
#undef INVALID_TMC2208 |
|
|
|
|
|
|
|
/**
|
|
|
|
* TMC2208 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI) |
|
|
|
*/ |
|
|
|
#if HAS_DRIVER(TMC2208) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \ |
|
|
|
#define INVALID_TMC_UART(ST) (AXIS_HAS_UART(ST) && !(defined(ST##_HARDWARE_SERIAL) || (PIN_EXISTS(ST##_SERIAL_RX, ST##_SERIAL_TX)))) |
|
|
|
#if INVALID_TMC_UART(X) |
|
|
|
#error "TMC2208 or TMC2209 on X requires X_HARDWARE_SERIAL or X_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(X2) |
|
|
|
#error "TMC2208 or TMC2209 on X2 requires X2_HARDWARE_SERIAL or X2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(Y) |
|
|
|
#error "TMC2208 or TMC2209 on Y requires Y_HARDWARE_SERIAL or Y_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(Y2) |
|
|
|
#error "TMC2208 or TMC2209 on Y2 requires Y2_HARDWARE_SERIAL or Y2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(Z) |
|
|
|
#error "TMC2208 or TMC2209 on Z requires Z_HARDWARE_SERIAL or Z_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(Z2) |
|
|
|
#error "TMC2208 or TMC2209 on Z2 requires Z2_HARDWARE_SERIAL or Z2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(Z3) |
|
|
|
#error "TMC2208 or TMC2209 on Z3 requires Z3_HARDWARE_SERIAL or Z3_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(E0) |
|
|
|
#error "TMC2208 or TMC2209 on E0 requires E0_HARDWARE_SERIAL or E0_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(E1) |
|
|
|
#error "TMC2208 or TMC2209 on E1 requires E1_HARDWARE_SERIAL or E1_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(E2) |
|
|
|
#error "TMC2208 or TMC2209 on E2 requires E2_HARDWARE_SERIAL or E2_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(E3) |
|
|
|
#error "TMC2208 or TMC2209 on E3 requires E3_HARDWARE_SERIAL or E3_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(E4) |
|
|
|
#error "TMC2208 or TMC2209 on E4 requires E4_HARDWARE_SERIAL or E4_SERIAL_(RX|TX)_PIN." |
|
|
|
#elif INVALID_TMC_UART(E5) |
|
|
|
#error "TMC2208 or TMC2209 on E5 requires E5_HARDWARE_SERIAL or E5_SERIAL_(RX|TX)_PIN." |
|
|
|
#endif |
|
|
|
#undef INVALID_TMC_UART |
|
|
|
|
|
|
|
/**
|
|
|
|
* TMC2209 slave address values |
|
|
|
*/ |
|
|
|
#define INVALID_TMC_ADDRESS(ST) static_assert(0 <= ST##_SLAVE_ADDRESS && ST##_SLAVE_ADDRESS <= 3, "TMC2209 slave address must be 0, 1, 2 or 3") |
|
|
|
#if AXIS_DRIVER_TYPE_X(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(X); |
|
|
|
#elif AXIS_DRIVER_TYPE_X2(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(X2); |
|
|
|
#elif AXIS_DRIVER_TYPE_Y(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(Y); |
|
|
|
#elif AXIS_DRIVER_TYPE_Y2(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(Y2); |
|
|
|
#elif AXIS_DRIVER_TYPE_Z(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(Z); |
|
|
|
#elif AXIS_DRIVER_TYPE_Z2(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(Z2); |
|
|
|
#elif AXIS_DRIVER_TYPE_Z3(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(Z3); |
|
|
|
#elif AXIS_DRIVER_TYPE_E0(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(E0); |
|
|
|
#elif AXIS_DRIVER_TYPE_E1(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(E1); |
|
|
|
#elif AXIS_DRIVER_TYPE_E2(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(E2); |
|
|
|
#elif AXIS_DRIVER_TYPE_E3(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(E3); |
|
|
|
#elif AXIS_DRIVER_TYPE_E4(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(E4); |
|
|
|
#elif AXIS_DRIVER_TYPE_E5(TMC2209) |
|
|
|
INVALID_TMC_ADDRESS(E5); |
|
|
|
#endif |
|
|
|
#undef INVALID_TMC_ADDRESS |
|
|
|
|
|
|
|
/**
|
|
|
|
* TMC2208/2209 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI) |
|
|
|
*/ |
|
|
|
#if (HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \ |
|
|
|
defined(X_HARDWARE_SERIAL ) \ |
|
|
|
|| defined(X2_HARDWARE_SERIAL) \ |
|
|
|
|| defined(Y_HARDWARE_SERIAL ) \ |
|
|
@ -1960,9 +1995,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS |
|
|
|
#endif |
|
|
|
|
|
|
|
/**
|
|
|
|
* TMC2208 software UART is only supported on AVR |
|
|
|
* TMC2208/2209 software UART is only supported on AVR and LPC |
|
|
|
*/ |
|
|
|
#if HAS_DRIVER(TMC2208) && !defined(__AVR__) && !defined(TARGET_LPC1768) && !( \ |
|
|
|
#if (HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)) && !defined(__AVR__) && !defined(TARGET_LPC1768) && !( \ |
|
|
|
defined(X_HARDWARE_SERIAL ) \ |
|
|
|
|| defined(X2_HARDWARE_SERIAL) \ |
|
|
|
|| defined(Y_HARDWARE_SERIAL ) \ |
|
|
@ -1983,25 +2018,36 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS |
|
|
|
// is necessary in order to reset the stallGuard indication between the initial movement of all three
|
|
|
|
// towers to +Z and the individual homing of each tower. This restriction can be removed once a means of
|
|
|
|
// clearing the stallGuard activated status is found.
|
|
|
|
|
|
|
|
// Stall detection DIAG = HIGH : TMC2209
|
|
|
|
// Stall detection DIAG = LOW : TMC2130/TMC2160/TMC2660/TMC5130/TMC5160
|
|
|
|
#define X_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(X,TMC2209) |
|
|
|
#define Y_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Y,TMC2209) |
|
|
|
#define Z_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Z,TMC2209) |
|
|
|
|
|
|
|
#if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z) |
|
|
|
#error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z." |
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == -1 && (!X_MIN_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMIN)) |
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == -1 && (X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMIN)) |
|
|
|
#error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMIN when homing to X_MIN." |
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == 1 && (!X_MAX_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMAX)) |
|
|
|
#elif X_SENSORLESS && X_HOME_DIR == 1 && (X_MAX_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_XMAX)) |
|
|
|
#error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMAX when homing to X_MAX." |
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == -1 && (!Y_MIN_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMIN)) |
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == -1 && (Y_MIN_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMIN)) |
|
|
|
#error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMIN when homing to Y_MIN." |
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == 1 && (!Y_MAX_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMAX)) |
|
|
|
#elif Y_SENSORLESS && Y_HOME_DIR == 1 && (Y_MAX_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_YMAX)) |
|
|
|
#error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMAX when homing to Y_MAX." |
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == -1 && (!Z_MIN_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMIN)) |
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == -1 && (Z_MIN_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMIN)) |
|
|
|
#error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMIN when homing to Z_MIN." |
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == 1 && (!Z_MAX_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMAX)) |
|
|
|
#elif Z_SENSORLESS && Z_HOME_DIR == 1 && (Z_MAX_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING || DISABLED(ENDSTOPPULLUP_ZMAX)) |
|
|
|
#error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMAX when homing to Z_MAX." |
|
|
|
#elif ENDSTOP_NOISE_THRESHOLD |
|
|
|
#error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_THRESHOLD." |
|
|
|
#elif !(X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS) |
|
|
|
#error "SENSORLESS_HOMING requires a TMC stepper driver with StallGuard on X, Y, or Z axes." |
|
|
|
#endif |
|
|
|
|
|
|
|
#undef X_ENDSTOP_INVERTING |
|
|
|
#undef Y_ENDSTOP_INVERTING |
|
|
|
#undef Z_ENDSTOP_INVERTING |
|
|
|
#endif |
|
|
|
|
|
|
|
// Sensorless probing requirements
|
|
|
@ -2026,11 +2072,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS |
|
|
|
#if ENABLED(HYBRID_THRESHOLD) && !STEALTHCHOP_ENABLED |
|
|
|
#error "Enable STEALTHCHOP_(XY|Z|E) to use HYBRID_THRESHOLD." |
|
|
|
#elif ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD |
|
|
|
#error "SENSORLESS_HOMING requires TMC2130 or TMC2160 or TMC5160 stepper drivers." |
|
|
|
#error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers." |
|
|
|
#elif ENABLED(SENSORLESS_PROBING) && !HAS_STALLGUARD |
|
|
|
#error "SENSORLESS_PROBING requires TMC2130 stepper drivers." |
|
|
|
#error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers." |
|
|
|
#elif STEALTHCHOP_ENABLED && !HAS_STEALTHCHOP |
|
|
|
#error "STEALTHCHOP requires TMC2130 or TMC2160 or TMC2208 or TMC5160 stepper drivers." |
|
|
|
#error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers." |
|
|
|
#endif |
|
|
|
|
|
|
|
#if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z)) |
|
|
|