Browse Source

🧑‍💻 Simplify endstops config (#25748)

Scott Lahteine 1 year ago
parent
commit
467ab74523

+ 0 - 22
Marlin/Configuration.h

@@ -1087,28 +1087,6 @@
 
 // @section endstops
 
-// Specify here all the endstop connectors that are connected to any endstop or probe.
-// Almost all printers will be using one per axis. Probes will use one or more of the
-// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
-#define USE_XMIN_PLUG
-#define USE_YMIN_PLUG
-#define USE_ZMIN_PLUG
-//#define USE_IMIN_PLUG
-//#define USE_JMIN_PLUG
-//#define USE_KMIN_PLUG
-//#define USE_UMIN_PLUG
-//#define USE_VMIN_PLUG
-//#define USE_WMIN_PLUG
-//#define USE_XMAX_PLUG
-//#define USE_YMAX_PLUG
-//#define USE_ZMAX_PLUG
-//#define USE_IMAX_PLUG
-//#define USE_JMAX_PLUG
-//#define USE_KMAX_PLUG
-//#define USE_UMAX_PLUG
-//#define USE_VMAX_PLUG
-//#define USE_WMAX_PLUG
-
 // Enable pullup for all endstops to prevent a floating state
 #define ENDSTOPPULLUPS
 #if DISABLED(ENDSTOPPULLUPS)

+ 6 - 6
Marlin/Configuration_adv.h

@@ -849,13 +849,13 @@
  *     Get the offset by homing X and measuring the error.
  *     Also set with 'M666 X<offset>' and stored to EEPROM with 'M500'.
  *
- *   - Use X2_USE_ENDSTOP to set the endstop plug by name. (_XMIN_, _XMAX_, _YMIN_, _YMAX_, _ZMIN_, _ZMAX_)
+ *   - Define the extra endstop pins here to override defaults. No auto-assignment.
  */
 #if HAS_X2_STEPPER && DISABLED(DUAL_X_CARRIAGE)
   //#define INVERT_X2_VS_X_DIR        // X2 direction signal is the opposite of X
   //#define X_DUAL_ENDSTOPS           // X2 has its own endstop
   #if ENABLED(X_DUAL_ENDSTOPS)
-    #define X2_USE_ENDSTOP    _XMAX_  // X2 endstop board plug. Don't forget to enable USE_*_PLUG.
+    //#define X2_STOP_PIN X_MAX_PIN   // X2 endstop pin override
     #define X2_ENDSTOP_ADJUSTMENT  0  // X2 offset relative to X endstop
   #endif
 #endif
@@ -864,7 +864,7 @@
   //#define INVERT_Y2_VS_Y_DIR        // Y2 direction signal is the opposite of Y
   //#define Y_DUAL_ENDSTOPS           // Y2 has its own endstop
   #if ENABLED(Y_DUAL_ENDSTOPS)
-    #define Y2_USE_ENDSTOP    _YMAX_  // Y2 endstop board plug. Don't forget to enable USE_*_PLUG.
+    //#define Y2_STOP_PIN Y_MAX_PIN   // Y2 endstop pin override
     #define Y2_ENDSTOP_ADJUSTMENT  0  // Y2 offset relative to Y endstop
   #endif
 #endif
@@ -877,20 +877,20 @@
 
   //#define Z_MULTI_ENDSTOPS          // Other Z axes have their own endstops
   #if ENABLED(Z_MULTI_ENDSTOPS)
-    #define Z2_USE_ENDSTOP   _XMAX_   // Z2 endstop board plug. Don't forget to enable USE_*_PLUG.
+    //#define Z2_STOP_PIN X_MAX_PIN   // Z2 endstop pin override
     #define Z2_ENDSTOP_ADJUSTMENT 0   // Z2 offset relative to Z endstop
   #endif
   #ifdef Z3_DRIVER_TYPE
     //#define INVERT_Z3_VS_Z_DIR      // Z3 direction signal is the opposite of Z
     #if ENABLED(Z_MULTI_ENDSTOPS)
-      #define Z3_USE_ENDSTOP   _YMAX_ // Z3 endstop board plug. Don't forget to enable USE_*_PLUG.
+      //#define Z3_STOP_PIN Y_MAX_PIN // Z3 endstop pin override
       #define Z3_ENDSTOP_ADJUSTMENT 0 // Z3 offset relative to Z endstop
     #endif
   #endif
   #ifdef Z4_DRIVER_TYPE
     //#define INVERT_Z4_VS_Z_DIR      // Z4 direction signal is the opposite of Z
     #if ENABLED(Z_MULTI_ENDSTOPS)
-      #define Z4_USE_ENDSTOP   _ZMAX_ // Z4 endstop board plug. Don't forget to enable USE_*_PLUG.
+      //#define Z4_STOP_PIN Z_MAX_PIN // Z4 endstop pin override
       #define Z4_ENDSTOP_ADJUSTMENT 0 // Z4 offset relative to Z endstop
     #endif
   #endif

+ 13 - 13
Marlin/src/HAL/AVR/endstop_interrupts.h

@@ -160,7 +160,7 @@ void setup_endstop_interrupts() {
       pciSetup(Z_MAX_PIN);
     #endif
   #endif
-  #if HAS_Z_MIN
+  #if HAS_Z_MIN_PIN
     #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(Z_MIN_PIN);
     #else
@@ -172,14 +172,14 @@ void setup_endstop_interrupts() {
     #if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(I_MAX_PIN);
     #else
-      static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(I_MAX_PIN);
     #endif
   #elif HAS_I_MIN
     #if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(I_MIN_PIN);
     #else
-      static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(I_MIN_PIN);
     #endif
   #endif
@@ -187,14 +187,14 @@ void setup_endstop_interrupts() {
     #if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(J_MAX_PIN);
     #else
-      static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(J_MAX_PIN);
     #endif
   #elif HAS_J_MIN
     #if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(J_MIN_PIN);
     #else
-      static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(J_MIN_PIN);
     #endif
   #endif
@@ -202,14 +202,14 @@ void setup_endstop_interrupts() {
     #if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(K_MAX_PIN);
     #else
-      static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(K_MAX_PIN);
     #endif
   #elif HAS_K_MIN
     #if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(K_MIN_PIN);
     #else
-      static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(K_MIN_PIN);
     #endif
   #endif
@@ -217,14 +217,14 @@ void setup_endstop_interrupts() {
     #if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(U_MAX_PIN);
     #else
-      static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(U_MAX_PIN);
     #endif
   #elif HAS_U_MIN
     #if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(U_MIN_PIN);
     #else
-      static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(U_MIN_PIN);
     #endif
   #endif
@@ -232,14 +232,14 @@ void setup_endstop_interrupts() {
     #if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(V_MAX_PIN);
     #else
-      static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(V_MAX_PIN);
     #endif
   #elif HAS_V_MIN
     #if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(V_MIN_PIN);
     #else
-      static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(V_MIN_PIN);
     #endif
   #endif
@@ -247,14 +247,14 @@ void setup_endstop_interrupts() {
     #if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(W_MAX_PIN);
     #else
-      static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(W_MAX_PIN);
     #endif
   #elif HAS_W_MIN
     #if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
       _ATTACH(W_MIN_PIN);
     #else
-      static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable");
+      static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
       pciSetup(W_MIN_PIN);
     #endif
   #endif

+ 28 - 28
Marlin/src/HAL/DUE/endstop_interrupts.h

@@ -47,33 +47,33 @@ void endstop_ISR() { endstops.update(); }
 
 void setup_endstop_interrupts() {
   #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
-  TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
-  TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
-  TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
-  TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
-  TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
-  TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
-  TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
-  TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
-  TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
-  TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
-  TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
-  TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
-  TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
-  TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
-  TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
-  TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
+  TERN_(HAS_X_MAX,           _ATTACH(X_MAX_PIN));
+  TERN_(HAS_X_MIN,           _ATTACH(X_MIN_PIN));
+  TERN_(HAS_Y_MAX,           _ATTACH(Y_MAX_PIN));
+  TERN_(HAS_Y_MIN,           _ATTACH(Y_MIN_PIN));
+  TERN_(HAS_Z_MAX,           _ATTACH(Z_MAX_PIN));
+  TERN_(HAS_Z_MIN_PIN,       _ATTACH(Z_MIN_PIN));
+  TERN_(HAS_X2_MAX,          _ATTACH(X2_MAX_PIN));
+  TERN_(HAS_X2_MIN,          _ATTACH(X2_MIN_PIN));
+  TERN_(HAS_Y2_MAX,          _ATTACH(Y2_MAX_PIN));
+  TERN_(HAS_Y2_MIN,          _ATTACH(Y2_MIN_PIN));
+  TERN_(HAS_Z2_MAX,          _ATTACH(Z2_MAX_PIN));
+  TERN_(HAS_Z2_MIN,          _ATTACH(Z2_MIN_PIN));
+  TERN_(HAS_Z3_MAX,          _ATTACH(Z3_MAX_PIN));
+  TERN_(HAS_Z3_MIN,          _ATTACH(Z3_MIN_PIN));
+  TERN_(HAS_Z4_MAX,          _ATTACH(Z4_MAX_PIN));
+  TERN_(HAS_Z4_MIN,          _ATTACH(Z4_MIN_PIN));
   TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
-  TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
-  TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
-  TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
-  TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
-  TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
-  TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
-  TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
-  TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
-  TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
-  TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
-  TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
-  TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
+  TERN_(HAS_I_MAX,           _ATTACH(I_MAX_PIN));
+  TERN_(HAS_I_MIN,           _ATTACH(I_MIN_PIN));
+  TERN_(HAS_J_MAX,           _ATTACH(J_MAX_PIN));
+  TERN_(HAS_J_MIN,           _ATTACH(J_MIN_PIN));
+  TERN_(HAS_K_MAX,           _ATTACH(K_MAX_PIN));
+  TERN_(HAS_K_MIN,           _ATTACH(K_MIN_PIN));
+  TERN_(HAS_U_MAX,           _ATTACH(U_MAX_PIN));
+  TERN_(HAS_U_MIN,           _ATTACH(U_MIN_PIN));
+  TERN_(HAS_V_MAX,           _ATTACH(V_MAX_PIN));
+  TERN_(HAS_V_MIN,           _ATTACH(V_MIN_PIN));
+  TERN_(HAS_W_MAX,           _ATTACH(W_MAX_PIN));
+  TERN_(HAS_W_MIN,           _ATTACH(W_MIN_PIN));
 }

+ 28 - 28
Marlin/src/HAL/ESP32/endstop_interrupts.h

@@ -42,33 +42,33 @@ void ICACHE_RAM_ATTR endstop_ISR() { endstops.update(); }
 
 void setup_endstop_interrupts() {
   #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
-  TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
-  TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
-  TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
-  TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
-  TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
-  TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
-  TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
-  TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
-  TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
-  TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
-  TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
-  TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
-  TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
-  TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
-  TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
-  TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
+  TERN_(HAS_X_MAX,           _ATTACH(X_MAX_PIN));
+  TERN_(HAS_X_MIN,           _ATTACH(X_MIN_PIN));
+  TERN_(HAS_Y_MAX,           _ATTACH(Y_MAX_PIN));
+  TERN_(HAS_Y_MIN,           _ATTACH(Y_MIN_PIN));
+  TERN_(HAS_Z_MAX,           _ATTACH(Z_MAX_PIN));
+  TERN_(HAS_Z_MIN_PIN,       _ATTACH(Z_MIN_PIN));
+  TERN_(HAS_X2_MAX,          _ATTACH(X2_MAX_PIN));
+  TERN_(HAS_X2_MIN,          _ATTACH(X2_MIN_PIN));
+  TERN_(HAS_Y2_MAX,          _ATTACH(Y2_MAX_PIN));
+  TERN_(HAS_Y2_MIN,          _ATTACH(Y2_MIN_PIN));
+  TERN_(HAS_Z2_MAX,          _ATTACH(Z2_MAX_PIN));
+  TERN_(HAS_Z2_MIN,          _ATTACH(Z2_MIN_PIN));
+  TERN_(HAS_Z3_MAX,          _ATTACH(Z3_MAX_PIN));
+  TERN_(HAS_Z3_MIN,          _ATTACH(Z3_MIN_PIN));
+  TERN_(HAS_Z4_MAX,          _ATTACH(Z4_MAX_PIN));
+  TERN_(HAS_Z4_MIN,          _ATTACH(Z4_MIN_PIN));
   TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
-  TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
-  TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
-  TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
-  TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
-  TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
-  TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
-  TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
-  TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
-  TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
-  TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
-  TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
-  TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
+  TERN_(HAS_I_MAX,           _ATTACH(I_MAX_PIN));
+  TERN_(HAS_I_MIN,           _ATTACH(I_MIN_PIN));
+  TERN_(HAS_J_MAX,           _ATTACH(J_MAX_PIN));
+  TERN_(HAS_J_MIN,           _ATTACH(J_MIN_PIN));
+  TERN_(HAS_K_MAX,           _ATTACH(K_MAX_PIN));
+  TERN_(HAS_K_MIN,           _ATTACH(K_MIN_PIN));
+  TERN_(HAS_U_MAX,           _ATTACH(U_MAX_PIN));
+  TERN_(HAS_U_MIN,           _ATTACH(U_MIN_PIN));
+  TERN_(HAS_V_MAX,           _ATTACH(V_MAX_PIN));
+  TERN_(HAS_V_MIN,           _ATTACH(V_MIN_PIN));
+  TERN_(HAS_W_MAX,           _ATTACH(W_MAX_PIN));
+  TERN_(HAS_W_MIN,           _ATTACH(W_MIN_PIN));
 }

+ 37 - 13
Marlin/src/HAL/LPC1768/endstop_interrupts.h

@@ -74,12 +74,36 @@ void setup_endstop_interrupts() {
     #endif
     _ATTACH(Z_MAX_PIN);
   #endif
-  #if HAS_Z_MIN
+  #if HAS_Z_MIN_PIN
     #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN)
       #error "Z_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
      _ATTACH(Z_MIN_PIN);
   #endif
+  #if HAS_X2_MAX
+    #if !LPC1768_PIN_INTERRUPT_M(X2_MAX_PIN)
+      #error "X2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(X2_MAX_PIN);
+  #endif
+  #if HAS_X2_MIN
+    #if !LPC1768_PIN_INTERRUPT_M(X2_MIN_PIN)
+      #error "X2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(X2_MIN_PIN);
+  #endif
+  #if HAS_Y2_MAX
+    #if !LPC1768_PIN_INTERRUPT_M(Y2_MAX_PIN)
+      #error "Y2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(Y2_MAX_PIN);
+  #endif
+  #if HAS_Y2_MIN
+    #if !LPC1768_PIN_INTERRUPT_M(Y2_MIN_PIN)
+      #error "Y2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(Y2_MIN_PIN);
+  #endif
   #if HAS_Z2_MAX
     #if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN)
       #error "Z2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
@@ -124,67 +148,67 @@ void setup_endstop_interrupts() {
   #endif
   #if HAS_I_MAX
     #if !LPC1768_PIN_INTERRUPT_M(I_MAX_PIN)
-      #error "I_MAX_PIN is not INTERRUPT-capable."
+      #error "I_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(I_MAX_PIN);
   #elif HAS_I_MIN
     #if !LPC1768_PIN_INTERRUPT_M(I_MIN_PIN)
-      #error "I_MIN_PIN is not INTERRUPT-capable."
+      #error "I_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(I_MIN_PIN);
   #endif
   #if HAS_J_MAX
     #if !LPC1768_PIN_INTERRUPT_M(J_MAX_PIN)
-      #error "J_MAX_PIN is not INTERRUPT-capable."
+      #error "J_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(J_MAX_PIN);
   #elif HAS_J_MIN
     #if !LPC1768_PIN_INTERRUPT_M(J_MIN_PIN)
-      #error "J_MIN_PIN is not INTERRUPT-capable."
+      #error "J_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(J_MIN_PIN);
   #endif
   #if HAS_K_MAX
     #if !LPC1768_PIN_INTERRUPT_M(K_MAX_PIN)
-      #error "K_MAX_PIN is not INTERRUPT-capable."
+      #error "K_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(K_MAX_PIN);
   #elif HAS_K_MIN
     #if !LPC1768_PIN_INTERRUPT_M(K_MIN_PIN)
-      #error "K_MIN_PIN is not INTERRUPT-capable."
+      #error "K_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(K_MIN_PIN);
   #endif
   #if HAS_U_MAX
     #if !LPC1768_PIN_INTERRUPT_M(U_MAX_PIN)
-      #error "U_MAX_PIN is not INTERRUPT-capable."
+      #error "U_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(U_MAX_PIN);
   #elif HAS_U_MIN
     #if !LPC1768_PIN_INTERRUPT_M(U_MIN_PIN)
-      #error "U_MIN_PIN is not INTERRUPT-capable."
+      #error "U_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(U_MIN_PIN);
   #endif
   #if HAS_V_MAX
     #if !LPC1768_PIN_INTERRUPT_M(V_MAX_PIN)
-      #error "V_MAX_PIN is not INTERRUPT-capable."
+      #error "V_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(V_MAX_PIN);
   #elif HAS_V_MIN
     #if !LPC1768_PIN_INTERRUPT_M(V_MIN_PIN)
-      #error "V_MIN_PIN is not INTERRUPT-capable."
+      #error "V_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(V_MIN_PIN);
   #endif
   #if HAS_W_MAX
     #if !LPC1768_PIN_INTERRUPT_M(W_MAX_PIN)
-      #error "W_MAX_PIN is not INTERRUPT-capable."
+      #error "W_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(W_MAX_PIN);
   #elif HAS_W_MIN
     #if !LPC1768_PIN_INTERRUPT_M(W_MIN_PIN)
-      #error "W_MIN_PIN is not INTERRUPT-capable."
+      #error "W_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(W_MIN_PIN);
   #endif

+ 80 - 50
Marlin/src/HAL/SAMD21/endstop_interrupts.h

@@ -54,30 +54,34 @@
 #include "../../module/endstops.h"
 
 #define MATCH_EILINE(P1,P2) (P1 != P2 && PIN_TO_EILINE(P1) == PIN_TO_EILINE(P2))
-#define MATCH_X_MAX_EILINE(P)   TERN0(HAS_X_MAX,  DEFER4(MATCH_EILINE)(P, X_MAX_PIN))
-#define MATCH_X_MIN_EILINE(P)   TERN0(HAS_X_MIN,  DEFER4(MATCH_EILINE)(P, X_MIN_PIN))
-#define MATCH_Y_MAX_EILINE(P)   TERN0(HAS_Y_MAX,  DEFER4(MATCH_EILINE)(P, Y_MAX_PIN))
-#define MATCH_Y_MIN_EILINE(P)   TERN0(HAS_Y_MIN,  DEFER4(MATCH_EILINE)(P, Y_MIN_PIN))
-#define MATCH_Z_MAX_EILINE(P)   TERN0(HAS_Z_MAX,  DEFER4(MATCH_EILINE)(P, Z_MAX_PIN))
-#define MATCH_Z_MIN_EILINE(P)   TERN0(HAS_Z_MIN,  DEFER4(MATCH_EILINE)(P, Z_MIN_PIN))
-#define MATCH_I_MAX_EILINE(P)   TERN0(HAS_I_MAX,  DEFER4(MATCH_EILINE)(P, I_MAX_PIN))
-#define MATCH_I_MIN_EILINE(P)   TERN0(HAS_I_MIN,  DEFER4(MATCH_EILINE)(P, I_MIN_PIN))
-#define MATCH_J_MAX_EILINE(P)   TERN0(HAS_J_MAX,  DEFER4(MATCH_EILINE)(P, J_MAX_PIN))
-#define MATCH_J_MIN_EILINE(P)   TERN0(HAS_J_MIN,  DEFER4(MATCH_EILINE)(P, J_MIN_PIN))
-#define MATCH_K_MAX_EILINE(P)   TERN0(HAS_K_MAX,  DEFER4(MATCH_EILINE)(P, K_MAX_PIN))
-#define MATCH_K_MIN_EILINE(P)   TERN0(HAS_K_MIN,  DEFER4(MATCH_EILINE)(P, K_MIN_PIN))
-#define MATCH_U_MAX_EILINE(P)   TERN0(HAS_U_MAX,  DEFER4(MATCH_EILINE)(P, U_MAX_PIN))
-#define MATCH_U_MIN_EILINE(P)   TERN0(HAS_U_MIN,  DEFER4(MATCH_EILINE)(P, U_MIN_PIN))
-#define MATCH_V_MAX_EILINE(P)   TERN0(HAS_V_MAX,  DEFER4(MATCH_EILINE)(P, V_MAX_PIN))
-#define MATCH_V_MIN_EILINE(P)   TERN0(HAS_V_MIN,  DEFER4(MATCH_EILINE)(P, V_MIN_PIN))
-#define MATCH_W_MAX_EILINE(P)   TERN0(HAS_W_MAX,  DEFER4(MATCH_EILINE)(P, W_MAX_PIN))
-#define MATCH_W_MIN_EILINE(P)   TERN0(HAS_W_MIN,  DEFER4(MATCH_EILINE)(P, W_MIN_PIN))
-#define MATCH_Z2_MAX_EILINE(P)  TERN0(HAS_Z2_MAX, DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN))
-#define MATCH_Z2_MIN_EILINE(P)  TERN0(HAS_Z2_MIN, DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN))
-#define MATCH_Z3_MAX_EILINE(P)  TERN0(HAS_Z3_MAX, DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN))
-#define MATCH_Z3_MIN_EILINE(P)  TERN0(HAS_Z3_MIN, DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN))
-#define MATCH_Z4_MAX_EILINE(P)  TERN0(HAS_Z4_MAX, DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN))
-#define MATCH_Z4_MIN_EILINE(P)  TERN0(HAS_Z4_MIN, DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN))
+#define MATCH_X_MAX_EILINE(P)  TERN0(HAS_X_MAX,     DEFER4(MATCH_EILINE)(P, X_MAX_PIN))
+#define MATCH_X_MIN_EILINE(P)  TERN0(HAS_X_MIN,     DEFER4(MATCH_EILINE)(P, X_MIN_PIN))
+#define MATCH_Y_MAX_EILINE(P)  TERN0(HAS_Y_MAX,     DEFER4(MATCH_EILINE)(P, Y_MAX_PIN))
+#define MATCH_Y_MIN_EILINE(P)  TERN0(HAS_Y_MIN,     DEFER4(MATCH_EILINE)(P, Y_MIN_PIN))
+#define MATCH_Z_MAX_EILINE(P)  TERN0(HAS_Z_MAX,     DEFER4(MATCH_EILINE)(P, Z_MAX_PIN))
+#define MATCH_Z_MIN_EILINE(P)  TERN0(HAS_Z_MIN_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PIN))
+#define MATCH_I_MAX_EILINE(P)  TERN0(HAS_I_MAX,     DEFER4(MATCH_EILINE)(P, I_MAX_PIN))
+#define MATCH_I_MIN_EILINE(P)  TERN0(HAS_I_MIN,     DEFER4(MATCH_EILINE)(P, I_MIN_PIN))
+#define MATCH_J_MAX_EILINE(P)  TERN0(HAS_J_MAX,     DEFER4(MATCH_EILINE)(P, J_MAX_PIN))
+#define MATCH_J_MIN_EILINE(P)  TERN0(HAS_J_MIN,     DEFER4(MATCH_EILINE)(P, J_MIN_PIN))
+#define MATCH_K_MAX_EILINE(P)  TERN0(HAS_K_MAX,     DEFER4(MATCH_EILINE)(P, K_MAX_PIN))
+#define MATCH_K_MIN_EILINE(P)  TERN0(HAS_K_MIN,     DEFER4(MATCH_EILINE)(P, K_MIN_PIN))
+#define MATCH_U_MAX_EILINE(P)  TERN0(HAS_U_MAX,     DEFER4(MATCH_EILINE)(P, U_MAX_PIN))
+#define MATCH_U_MIN_EILINE(P)  TERN0(HAS_U_MIN,     DEFER4(MATCH_EILINE)(P, U_MIN_PIN))
+#define MATCH_V_MAX_EILINE(P)  TERN0(HAS_V_MAX,     DEFER4(MATCH_EILINE)(P, V_MAX_PIN))
+#define MATCH_V_MIN_EILINE(P)  TERN0(HAS_V_MIN,     DEFER4(MATCH_EILINE)(P, V_MIN_PIN))
+#define MATCH_W_MAX_EILINE(P)  TERN0(HAS_W_MAX,     DEFER4(MATCH_EILINE)(P, W_MAX_PIN))
+#define MATCH_W_MIN_EILINE(P)  TERN0(HAS_W_MIN,     DEFER4(MATCH_EILINE)(P, W_MIN_PIN))
+#define MATCH_X2_MAX_EILINE(P) TERN0(HAS_X2_MAX,    DEFER4(MATCH_EILINE)(P, X2_MAX_PIN))
+#define MATCH_X2_MIN_EILINE(P) TERN0(HAS_X2_MIN,    DEFER4(MATCH_EILINE)(P, X2_MIN_PIN))
+#define MATCH_Y2_MAX_EILINE(P) TERN0(HAS_Y2_MAX,    DEFER4(MATCH_EILINE)(P, Y2_MAX_PIN))
+#define MATCH_Y2_MIN_EILINE(P) TERN0(HAS_Y2_MIN,    DEFER4(MATCH_EILINE)(P, Y2_MIN_PIN))
+#define MATCH_Z2_MAX_EILINE(P) TERN0(HAS_Z2_MAX,    DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN))
+#define MATCH_Z2_MIN_EILINE(P) TERN0(HAS_Z2_MIN,    DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN))
+#define MATCH_Z3_MAX_EILINE(P) TERN0(HAS_Z3_MAX,    DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN))
+#define MATCH_Z3_MIN_EILINE(P) TERN0(HAS_Z3_MIN,    DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN))
+#define MATCH_Z4_MAX_EILINE(P) TERN0(HAS_Z4_MAX,    DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN))
+#define MATCH_Z4_MIN_EILINE(P) TERN0(HAS_Z4_MIN,    DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN))
 #define MATCH_Z_MIN_PROBE_EILINE(P) TERN0(HAS_Z_MIN_PROBE_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PROBE_PIN))
 
 #define AVAILABLE_EILINE(P) ( PIN_TO_EILINE(P) != -1    \
@@ -90,6 +94,8 @@
   && !MATCH_U_MAX_EILINE(P) && !MATCH_U_MIN_EILINE(P)   \
   && !MATCH_V_MAX_EILINE(P) && !MATCH_V_MIN_EILINE(P)   \
   && !MATCH_W_MAX_EILINE(P) && !MATCH_W_MIN_EILINE(P)   \
+  && !MATCH_X2_MAX_EILINE(P) && !MATCH_X2_MIN_EILINE(P) \
+  && !MATCH_Y2_MAX_EILINE(P) && !MATCH_Y2_MIN_EILINE(P) \
   && !MATCH_Z2_MAX_EILINE(P) && !MATCH_Z2_MIN_EILINE(P) \
   && !MATCH_Z3_MAX_EILINE(P) && !MATCH_Z3_MIN_EILINE(P) \
   && !MATCH_Z4_MAX_EILINE(P) && !MATCH_Z4_MIN_EILINE(P) \
@@ -102,151 +108,175 @@ void setup_endstop_interrupts() {
   #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE)
   #if HAS_X_MAX
     #if !AVAILABLE_EILINE(X_MAX_PIN)
-      #error "X_MAX_PIN has no EXTINT line available."
+      #error "X_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(X_MAX_PIN);
   #endif
   #if HAS_X_MIN
     #if !AVAILABLE_EILINE(X_MIN_PIN)
-      #error "X_MIN_PIN has no EXTINT line available."
+      #error "X_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(X_MIN_PIN);
   #endif
   #if HAS_Y_MAX
     #if !AVAILABLE_EILINE(Y_MAX_PIN)
-      #error "Y_MAX_PIN has no EXTINT line available."
+      #error "Y_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Y_MAX_PIN);
   #endif
   #if HAS_Y_MIN
     #if !AVAILABLE_EILINE(Y_MIN_PIN)
-      #error "Y_MIN_PIN has no EXTINT line available."
+      #error "Y_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Y_MIN_PIN);
   #endif
   #if HAS_Z_MAX
     #if !AVAILABLE_EILINE(Z_MAX_PIN)
-      #error "Z_MAX_PIN has no EXTINT line available."
+      #error "Z_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z_MAX_PIN);
   #endif
-  #if HAS_Z_MIN
+  #if HAS_Z_MIN_PIN
     #if !AVAILABLE_EILINE(Z_MIN_PIN)
-      #error "Z_MIN_PIN has no EXTINT line available."
+      #error "Z_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z_MIN_PIN);
   #endif
+  #if HAS_X2_MAX
+    #if !AVAILABLE_EILINE(X2_MAX_PIN)
+      #error "X2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(X2_MAX_PIN);
+  #endif
+  #if HAS_X2_MIN
+    #if !AVAILABLE_EILINE(X2_MIN_PIN)
+      #error "X2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(X2_MIN_PIN);
+  #endif
+  #if HAS_Y2_MAX
+    #if !AVAILABLE_EILINE(Y2_MAX_PIN)
+      #error "Y2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(Y2_MAX_PIN);
+  #endif
+  #if HAS_Y2_MIN
+    #if !AVAILABLE_EILINE(Y2_MIN_PIN)
+      #error "Y2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
+    #endif
+    _ATTACH(Y2_MIN_PIN);
+  #endif
   #if HAS_Z2_MAX
     #if !AVAILABLE_EILINE(Z2_MAX_PIN)
-      #error "Z2_MAX_PIN has no EXTINT line available."
+      #error "Z2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z2_MAX_PIN);
   #endif
   #if HAS_Z2_MIN
     #if !AVAILABLE_EILINE(Z2_MIN_PIN)
-      #error "Z2_MIN_PIN has no EXTINT line available."
+      #error "Z2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z2_MIN_PIN);
   #endif
   #if HAS_Z3_MAX
     #if !AVAILABLE_EILINE(Z3_MAX_PIN)
-      #error "Z3_MAX_PIN has no EXTINT line available."
+      #error "Z3_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z3_MAX_PIN);
   #endif
   #if HAS_Z3_MIN
     #if !AVAILABLE_EILINE(Z3_MIN_PIN)
-      #error "Z3_MIN_PIN has no EXTINT line available."
+      #error "Z3_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z3_MIN_PIN);
   #endif
   #if HAS_Z4_MAX
     #if !AVAILABLE_EILINE(Z4_MAX_PIN)
-      #error "Z4_MAX_PIN has no EXTINT line available."
+      #error "Z4_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z4_MAX_PIN);
   #endif
   #if HAS_Z4_MIN
     #if !AVAILABLE_EILINE(Z4_MIN_PIN)
-      #error "Z4_MIN_PIN has no EXTINT line available."
+      #error "Z4_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z4_MIN_PIN);
   #endif
   #if HAS_Z_MIN_PROBE_PIN
     #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN)
-      #error "Z_MIN_PROBE_PIN has no EXTINT line available."
+      #error "Z_MIN_PROBE_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z_MIN_PROBE_PIN);
   #endif
   #if HAS_I_MAX
     #if !AVAILABLE_EILINE(I_MAX_PIN)
-      #error "I_MAX_PIN has no EXTINT line available."
+      #error "I_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_I_MIN
     #if !AVAILABLE_EILINE(I_MIN_PIN)
-      #error "I_MIN_PIN has no EXTINT line available."
+      #error "I_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(I_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_J_MAX
     #if !AVAILABLE_EILINE(J_MAX_PIN)
-      #error "J_MAX_PIN has no EXTINT line available."
+      #error "J_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_J_MIN
     #if !AVAILABLE_EILINE(J_MIN_PIN)
-      #error "J_MIN_PIN has no EXTINT line available."
+      #error "J_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(J_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_K_MAX
     #if !AVAILABLE_EILINE(K_MAX_PIN)
-      #error "K_MAX_PIN has no EXTINT line available."
+      #error "K_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_K_MIN
     #if !AVAILABLE_EILINE(K_MIN_PIN)
-      #error "K_MIN_PIN has no EXTINT line available."
+      #error "K_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(K_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_U_MAX
     #if !AVAILABLE_EILINE(U_MAX_PIN)
-      #error "U_MAX_PIN has no EXTINT line available."
+      #error "U_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(U_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_U_MIN
     #if !AVAILABLE_EILINE(U_MIN_PIN)
-      #error "U_MIN_PIN has no EXTINT line available."
+      #error "U_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(U_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_V_MAX
     #if !AVAILABLE_EILINE(V_MAX_PIN)
-      #error "V_MAX_PIN has no EXTINT line available."
+      #error "V_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(V_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_V_MIN
     #if !AVAILABLE_EILINE(V_MIN_PIN)
-      #error "V_MIN_PIN has no EXTINT line available."
+      #error "V_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(V_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_W_MAX
     #if !AVAILABLE_EILINE(W_MAX_PIN)
-      #error "W_MAX_PIN has no EXTINT line available."
+      #error "W_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(W_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_W_MIN
     #if !AVAILABLE_EILINE(W_MIN_PIN)
-      #error "W_MIN_PIN has no EXTINT line available."
+      #error "W_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(W_MIN_PIN, endstop_ISR, CHANGE);
   #endif

+ 56 - 50
Marlin/src/HAL/SAMD51/endstop_interrupts.h

@@ -53,30 +53,34 @@
 #include "../../module/endstops.h"
 
 #define MATCH_EILINE(P1,P2) (P1 != P2 && PIN_TO_EILINE(P1) == PIN_TO_EILINE(P2))
-#define MATCH_X_MAX_EILINE(P)   TERN0(HAS_X_MAX,  DEFER4(MATCH_EILINE)(P, X_MAX_PIN))
-#define MATCH_X_MIN_EILINE(P)   TERN0(HAS_X_MIN,  DEFER4(MATCH_EILINE)(P, X_MIN_PIN))
-#define MATCH_Y_MAX_EILINE(P)   TERN0(HAS_Y_MAX,  DEFER4(MATCH_EILINE)(P, Y_MAX_PIN))
-#define MATCH_Y_MIN_EILINE(P)   TERN0(HAS_Y_MIN,  DEFER4(MATCH_EILINE)(P, Y_MIN_PIN))
-#define MATCH_Z_MAX_EILINE(P)   TERN0(HAS_Z_MAX,  DEFER4(MATCH_EILINE)(P, Z_MAX_PIN))
-#define MATCH_Z_MIN_EILINE(P)   TERN0(HAS_Z_MIN,  DEFER4(MATCH_EILINE)(P, Z_MIN_PIN))
-#define MATCH_I_MAX_EILINE(P)   TERN0(HAS_I_MAX,  DEFER4(MATCH_EILINE)(P, I_MAX_PIN))
-#define MATCH_I_MIN_EILINE(P)   TERN0(HAS_I_MIN,  DEFER4(MATCH_EILINE)(P, I_MIN_PIN))
-#define MATCH_J_MAX_EILINE(P)   TERN0(HAS_J_MAX,  DEFER4(MATCH_EILINE)(P, J_MAX_PIN))
-#define MATCH_J_MIN_EILINE(P)   TERN0(HAS_J_MIN,  DEFER4(MATCH_EILINE)(P, J_MIN_PIN))
-#define MATCH_K_MAX_EILINE(P)   TERN0(HAS_K_MAX,  DEFER4(MATCH_EILINE)(P, K_MAX_PIN))
-#define MATCH_K_MIN_EILINE(P)   TERN0(HAS_K_MIN,  DEFER4(MATCH_EILINE)(P, K_MIN_PIN))
-#define MATCH_U_MAX_EILINE(P)   TERN0(HAS_U_MAX,  DEFER4(MATCH_EILINE)(P, U_MAX_PIN))
-#define MATCH_U_MIN_EILINE(P)   TERN0(HAS_U_MIN,  DEFER4(MATCH_EILINE)(P, U_MIN_PIN))
-#define MATCH_V_MAX_EILINE(P)   TERN0(HAS_V_MAX,  DEFER4(MATCH_EILINE)(P, V_MAX_PIN))
-#define MATCH_V_MIN_EILINE(P)   TERN0(HAS_V_MIN,  DEFER4(MATCH_EILINE)(P, V_MIN_PIN))
-#define MATCH_W_MAX_EILINE(P)   TERN0(HAS_W_MAX,  DEFER4(MATCH_EILINE)(P, W_MAX_PIN))
-#define MATCH_W_MIN_EILINE(P)   TERN0(HAS_W_MIN,  DEFER4(MATCH_EILINE)(P, W_MIN_PIN))
-#define MATCH_Z2_MAX_EILINE(P)  TERN0(HAS_Z2_MAX, DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN))
-#define MATCH_Z2_MIN_EILINE(P)  TERN0(HAS_Z2_MIN, DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN))
-#define MATCH_Z3_MAX_EILINE(P)  TERN0(HAS_Z3_MAX, DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN))
-#define MATCH_Z3_MIN_EILINE(P)  TERN0(HAS_Z3_MIN, DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN))
-#define MATCH_Z4_MAX_EILINE(P)  TERN0(HAS_Z4_MAX, DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN))
-#define MATCH_Z4_MIN_EILINE(P)  TERN0(HAS_Z4_MIN, DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN))
+#define MATCH_X_MAX_EILINE(P)  TERN0(HAS_X_MAX,     DEFER4(MATCH_EILINE)(P, X_MAX_PIN))
+#define MATCH_X_MIN_EILINE(P)  TERN0(HAS_X_MIN,     DEFER4(MATCH_EILINE)(P, X_MIN_PIN))
+#define MATCH_Y_MAX_EILINE(P)  TERN0(HAS_Y_MAX,     DEFER4(MATCH_EILINE)(P, Y_MAX_PIN))
+#define MATCH_Y_MIN_EILINE(P)  TERN0(HAS_Y_MIN,     DEFER4(MATCH_EILINE)(P, Y_MIN_PIN))
+#define MATCH_Z_MAX_EILINE(P)  TERN0(HAS_Z_MAX,     DEFER4(MATCH_EILINE)(P, Z_MAX_PIN))
+#define MATCH_Z_MIN_EILINE(P)  TERN0(HAS_Z_MIN_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PIN))
+#define MATCH_I_MAX_EILINE(P)  TERN0(HAS_I_MAX,     DEFER4(MATCH_EILINE)(P, I_MAX_PIN))
+#define MATCH_I_MIN_EILINE(P)  TERN0(HAS_I_MIN,     DEFER4(MATCH_EILINE)(P, I_MIN_PIN))
+#define MATCH_J_MAX_EILINE(P)  TERN0(HAS_J_MAX,     DEFER4(MATCH_EILINE)(P, J_MAX_PIN))
+#define MATCH_J_MIN_EILINE(P)  TERN0(HAS_J_MIN,     DEFER4(MATCH_EILINE)(P, J_MIN_PIN))
+#define MATCH_K_MAX_EILINE(P)  TERN0(HAS_K_MAX,     DEFER4(MATCH_EILINE)(P, K_MAX_PIN))
+#define MATCH_K_MIN_EILINE(P)  TERN0(HAS_K_MIN,     DEFER4(MATCH_EILINE)(P, K_MIN_PIN))
+#define MATCH_U_MAX_EILINE(P)  TERN0(HAS_U_MAX,     DEFER4(MATCH_EILINE)(P, U_MAX_PIN))
+#define MATCH_U_MIN_EILINE(P)  TERN0(HAS_U_MIN,     DEFER4(MATCH_EILINE)(P, U_MIN_PIN))
+#define MATCH_V_MAX_EILINE(P)  TERN0(HAS_V_MAX,     DEFER4(MATCH_EILINE)(P, V_MAX_PIN))
+#define MATCH_V_MIN_EILINE(P)  TERN0(HAS_V_MIN,     DEFER4(MATCH_EILINE)(P, V_MIN_PIN))
+#define MATCH_W_MAX_EILINE(P)  TERN0(HAS_W_MAX,     DEFER4(MATCH_EILINE)(P, W_MAX_PIN))
+#define MATCH_W_MIN_EILINE(P)  TERN0(HAS_W_MIN,     DEFER4(MATCH_EILINE)(P, W_MIN_PIN))
+#define MATCH_X2_MAX_EILINE(P) TERN0(HAS_X2_MAX,    DEFER4(MATCH_EILINE)(P, X2_MAX_PIN))
+#define MATCH_X2_MIN_EILINE(P) TERN0(HAS_X2_MIN,    DEFER4(MATCH_EILINE)(P, X2_MIN_PIN))
+#define MATCH_Y2_MAX_EILINE(P) TERN0(HAS_Y2_MAX,    DEFER4(MATCH_EILINE)(P, Y2_MAX_PIN))
+#define MATCH_Y2_MIN_EILINE(P) TERN0(HAS_Y2_MIN,    DEFER4(MATCH_EILINE)(P, Y2_MIN_PIN))
+#define MATCH_Z2_MAX_EILINE(P) TERN0(HAS_Z2_MAX,    DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN))
+#define MATCH_Z2_MIN_EILINE(P) TERN0(HAS_Z2_MIN,    DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN))
+#define MATCH_Z3_MAX_EILINE(P) TERN0(HAS_Z3_MAX,    DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN))
+#define MATCH_Z3_MIN_EILINE(P) TERN0(HAS_Z3_MIN,    DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN))
+#define MATCH_Z4_MAX_EILINE(P) TERN0(HAS_Z4_MAX,    DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN))
+#define MATCH_Z4_MIN_EILINE(P) TERN0(HAS_Z4_MIN,    DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN))
 #define MATCH_Z_MIN_PROBE_EILINE(P) TERN0(HAS_Z_MIN_PROBE_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PROBE_PIN))
 
 #define AVAILABLE_EILINE(P) ( PIN_TO_EILINE(P) != -1    \
@@ -89,6 +93,8 @@
   && !MATCH_U_MAX_EILINE(P) && !MATCH_U_MIN_EILINE(P)   \
   && !MATCH_V_MAX_EILINE(P) && !MATCH_V_MIN_EILINE(P)   \
   && !MATCH_W_MAX_EILINE(P) && !MATCH_W_MIN_EILINE(P)   \
+  && !MATCH_X2_MAX_EILINE(P) && !MATCH_X2_MIN_EILINE(P) \
+  && !MATCH_Y2_MAX_EILINE(P) && !MATCH_Y2_MIN_EILINE(P) \
   && !MATCH_Z2_MAX_EILINE(P) && !MATCH_Z2_MIN_EILINE(P) \
   && !MATCH_Z3_MAX_EILINE(P) && !MATCH_Z3_MIN_EILINE(P) \
   && !MATCH_Z4_MAX_EILINE(P) && !MATCH_Z4_MIN_EILINE(P) \
@@ -101,151 +107,151 @@ void setup_endstop_interrupts() {
   #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE)
   #if HAS_X_MAX
     #if !AVAILABLE_EILINE(X_MAX_PIN)
-      #error "X_MAX_PIN has no EXTINT line available."
+      #error "X_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(X_MAX_PIN);
   #endif
   #if HAS_X_MIN
     #if !AVAILABLE_EILINE(X_MIN_PIN)
-      #error "X_MIN_PIN has no EXTINT line available."
+      #error "X_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(X_MIN_PIN);
   #endif
   #if HAS_Y_MAX
     #if !AVAILABLE_EILINE(Y_MAX_PIN)
-      #error "Y_MAX_PIN has no EXTINT line available."
+      #error "Y_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Y_MAX_PIN);
   #endif
   #if HAS_Y_MIN
     #if !AVAILABLE_EILINE(Y_MIN_PIN)
-      #error "Y_MIN_PIN has no EXTINT line available."
+      #error "Y_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Y_MIN_PIN);
   #endif
   #if HAS_Z_MAX
     #if !AVAILABLE_EILINE(Z_MAX_PIN)
-      #error "Z_MAX_PIN has no EXTINT line available."
+      #error "Z_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z_MAX_PIN);
   #endif
-  #if HAS_Z_MIN
+  #if HAS_Z_MIN_PIN
     #if !AVAILABLE_EILINE(Z_MIN_PIN)
-      #error "Z_MIN_PIN has no EXTINT line available."
+      #error "Z_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z_MIN_PIN);
   #endif
   #if HAS_Z2_MAX
     #if !AVAILABLE_EILINE(Z2_MAX_PIN)
-      #error "Z2_MAX_PIN has no EXTINT line available."
+      #error "Z2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z2_MAX_PIN);
   #endif
   #if HAS_Z2_MIN
     #if !AVAILABLE_EILINE(Z2_MIN_PIN)
-      #error "Z2_MIN_PIN has no EXTINT line available."
+      #error "Z2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z2_MIN_PIN);
   #endif
   #if HAS_Z3_MAX
     #if !AVAILABLE_EILINE(Z3_MAX_PIN)
-      #error "Z3_MAX_PIN has no EXTINT line available."
+      #error "Z3_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z3_MAX_PIN);
   #endif
   #if HAS_Z3_MIN
     #if !AVAILABLE_EILINE(Z3_MIN_PIN)
-      #error "Z3_MIN_PIN has no EXTINT line available."
+      #error "Z3_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z3_MIN_PIN);
   #endif
   #if HAS_Z4_MAX
     #if !AVAILABLE_EILINE(Z4_MAX_PIN)
-      #error "Z4_MAX_PIN has no EXTINT line available."
+      #error "Z4_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z4_MAX_PIN);
   #endif
   #if HAS_Z4_MIN
     #if !AVAILABLE_EILINE(Z4_MIN_PIN)
-      #error "Z4_MIN_PIN has no EXTINT line available."
+      #error "Z4_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z4_MIN_PIN);
   #endif
   #if HAS_Z_MIN_PROBE_PIN
     #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN)
-      #error "Z_MIN_PROBE_PIN has no EXTINT line available."
+      #error "Z_MIN_PROBE_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     _ATTACH(Z_MIN_PROBE_PIN);
   #endif
   #if HAS_I_MAX
     #if !AVAILABLE_EILINE(I_MAX_PIN)
-      #error "I_MAX_PIN has no EXTINT line available."
+      #error "I_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_I_MIN
     #if !AVAILABLE_EILINE(I_MIN_PIN)
-      #error "I_MIN_PIN has no EXTINT line available."
+      #error "I_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(I_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_J_MAX
     #if !AVAILABLE_EILINE(J_MAX_PIN)
-      #error "J_MAX_PIN has no EXTINT line available."
+      #error "J_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_J_MIN
     #if !AVAILABLE_EILINE(J_MIN_PIN)
-      #error "J_MIN_PIN has no EXTINT line available."
+      #error "J_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(J_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_K_MAX
     #if !AVAILABLE_EILINE(K_MAX_PIN)
-      #error "K_MAX_PIN has no EXTINT line available."
+      #error "K_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_K_MIN
     #if !AVAILABLE_EILINE(K_MIN_PIN)
-      #error "K_MIN_PIN has no EXTINT line available."
+      #error "K_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(K_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_U_MAX
     #if !AVAILABLE_EILINE(U_MAX_PIN)
-      #error "U_MAX_PIN has no EXTINT line available."
+      #error "U_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(U_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_U_MIN
     #if !AVAILABLE_EILINE(U_MIN_PIN)
-      #error "U_MIN_PIN has no EXTINT line available."
+      #error "U_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(U_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_V_MAX
     #if !AVAILABLE_EILINE(V_MAX_PIN)
-      #error "V_MAX_PIN has no EXTINT line available."
+      #error "V_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(V_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_V_MIN
     #if !AVAILABLE_EILINE(V_MIN_PIN)
-      #error "V_MIN_PIN has no EXTINT line available."
+      #error "V_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(V_MIN_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_W_MAX
     #if !AVAILABLE_EILINE(W_MAX_PIN)
-      #error "W_MAX_PIN has no EXTINT line available."
+      #error "W_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(W_MAX_PIN, endstop_ISR, CHANGE);
   #endif
   #if HAS_W_MIN
     #if !AVAILABLE_EILINE(W_MIN_PIN)
-      #error "W_MIN_PIN has no EXTINT line available."
+      #error "W_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
     #endif
     attachInterrupt(W_MIN_PIN, endstop_ISR, CHANGE);
   #endif

+ 28 - 28
Marlin/src/HAL/STM32/endstop_interrupts.h

@@ -29,33 +29,33 @@ void endstop_ISR() { endstops.update(); }
 
 void setup_endstop_interrupts() {
   #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE)
-  TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
-  TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
-  TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
-  TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
-  TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
-  TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
-  TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
-  TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
-  TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
-  TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
-  TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
-  TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
-  TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
-  TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
-  TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
-  TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
+  TERN_(HAS_X_MAX,           _ATTACH(X_MAX_PIN));
+  TERN_(HAS_X_MIN,           _ATTACH(X_MIN_PIN));
+  TERN_(HAS_Y_MAX,           _ATTACH(Y_MAX_PIN));
+  TERN_(HAS_Y_MIN,           _ATTACH(Y_MIN_PIN));
+  TERN_(HAS_Z_MAX,           _ATTACH(Z_MAX_PIN));
+  TERN_(HAS_Z_MIN_PIN,       _ATTACH(Z_MIN_PIN));
+  TERN_(HAS_X2_MAX,          _ATTACH(X2_MAX_PIN));
+  TERN_(HAS_X2_MIN,          _ATTACH(X2_MIN_PIN));
+  TERN_(HAS_Y2_MAX,          _ATTACH(Y2_MAX_PIN));
+  TERN_(HAS_Y2_MIN,          _ATTACH(Y2_MIN_PIN));
+  TERN_(HAS_Z2_MAX,          _ATTACH(Z2_MAX_PIN));
+  TERN_(HAS_Z2_MIN,          _ATTACH(Z2_MIN_PIN));
+  TERN_(HAS_Z3_MAX,          _ATTACH(Z3_MAX_PIN));
+  TERN_(HAS_Z3_MIN,          _ATTACH(Z3_MIN_PIN));
+  TERN_(HAS_Z4_MAX,          _ATTACH(Z4_MAX_PIN));
+  TERN_(HAS_Z4_MIN,          _ATTACH(Z4_MIN_PIN));
   TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
-  TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
-  TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
-  TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
-  TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
-  TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
-  TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
-  TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
-  TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
-  TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
-  TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
-  TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
-  TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
+  TERN_(HAS_I_MAX,           _ATTACH(I_MAX_PIN));
+  TERN_(HAS_I_MIN,           _ATTACH(I_MIN_PIN));
+  TERN_(HAS_J_MAX,           _ATTACH(J_MAX_PIN));
+  TERN_(HAS_J_MIN,           _ATTACH(J_MIN_PIN));
+  TERN_(HAS_K_MAX,           _ATTACH(K_MAX_PIN));
+  TERN_(HAS_K_MIN,           _ATTACH(K_MIN_PIN));
+  TERN_(HAS_U_MAX,           _ATTACH(U_MAX_PIN));
+  TERN_(HAS_U_MIN,           _ATTACH(U_MIN_PIN));
+  TERN_(HAS_V_MAX,           _ATTACH(V_MAX_PIN));
+  TERN_(HAS_V_MIN,           _ATTACH(V_MIN_PIN));
+  TERN_(HAS_W_MAX,           _ATTACH(W_MAX_PIN));
+  TERN_(HAS_W_MIN,           _ATTACH(W_MIN_PIN));
 }

+ 28 - 28
Marlin/src/HAL/STM32F1/endstop_interrupts.h

@@ -54,33 +54,33 @@ void endstop_ISR() { endstops.update(); }
 
 void setup_endstop_interrupts() {
   #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE)
-  TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
-  TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
-  TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
-  TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
-  TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
-  TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
-  TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
-  TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
-  TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
-  TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
-  TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
-  TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
-  TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
-  TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
-  TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
-  TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
+  TERN_(HAS_X_MAX,           _ATTACH(X_MAX_PIN));
+  TERN_(HAS_X_MIN,           _ATTACH(X_MIN_PIN));
+  TERN_(HAS_Y_MAX,           _ATTACH(Y_MAX_PIN));
+  TERN_(HAS_Y_MIN,           _ATTACH(Y_MIN_PIN));
+  TERN_(HAS_Z_MAX,           _ATTACH(Z_MAX_PIN));
+  TERN_(HAS_Z_MIN_PIN,       _ATTACH(Z_MIN_PIN));
+  TERN_(HAS_X2_MAX,          _ATTACH(X2_MAX_PIN));
+  TERN_(HAS_X2_MIN,          _ATTACH(X2_MIN_PIN));
+  TERN_(HAS_Y2_MAX,          _ATTACH(Y2_MAX_PIN));
+  TERN_(HAS_Y2_MIN,          _ATTACH(Y2_MIN_PIN));
+  TERN_(HAS_Z2_MAX,          _ATTACH(Z2_MAX_PIN));
+  TERN_(HAS_Z2_MIN,          _ATTACH(Z2_MIN_PIN));
+  TERN_(HAS_Z3_MAX,          _ATTACH(Z3_MAX_PIN));
+  TERN_(HAS_Z3_MIN,          _ATTACH(Z3_MIN_PIN));
+  TERN_(HAS_Z4_MAX,          _ATTACH(Z4_MAX_PIN));
+  TERN_(HAS_Z4_MIN,          _ATTACH(Z4_MIN_PIN));
   TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
-  TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
-  TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
-  TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
-  TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
-  TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
-  TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
-  TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
-  TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
-  TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
-  TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
-  TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
-  TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
+  TERN_(HAS_I_MAX,           _ATTACH(I_MAX_PIN));
+  TERN_(HAS_I_MIN,           _ATTACH(I_MIN_PIN));
+  TERN_(HAS_J_MAX,           _ATTACH(J_MAX_PIN));
+  TERN_(HAS_J_MIN,           _ATTACH(J_MIN_PIN));
+  TERN_(HAS_K_MAX,           _ATTACH(K_MAX_PIN));
+  TERN_(HAS_K_MIN,           _ATTACH(K_MIN_PIN));
+  TERN_(HAS_U_MAX,           _ATTACH(U_MAX_PIN));
+  TERN_(HAS_U_MIN,           _ATTACH(U_MIN_PIN));
+  TERN_(HAS_V_MAX,           _ATTACH(V_MAX_PIN));
+  TERN_(HAS_V_MIN,           _ATTACH(V_MIN_PIN));
+  TERN_(HAS_W_MAX,           _ATTACH(W_MAX_PIN));
+  TERN_(HAS_W_MIN,           _ATTACH(W_MIN_PIN));
 }

Some files were not shown because too many files changed in this diff