ソースを参照

Split up stepper indirection (#15111)

Scott Lahteine 4年前
コミット
586b334c2a
コミッターのメールアドレスに関連付けられたアカウントが存在しません

+ 1
- 1
Marlin/src/HAL/HAL_STM32_F4_F7/STM32F7/TMC2660.cpp ファイルの表示

@@ -37,7 +37,7 @@
37 37
 
38 38
 #include "../../../inc/MarlinConfig.h"
39 39
 #include "../../../Marlin.h"
40
-#include "../../../module/stepper_indirection.h"
40
+#include "../../../module/stepper/indirection.h"
41 41
 #include "../../../module/printcounter.h"
42 42
 #include "../../../libs/duration_t.h"
43 43
 #include "../../../libs/hex_print_routines.h"

+ 1
- 1
Marlin/src/Marlin.cpp ファイルの表示

@@ -45,7 +45,7 @@
45 45
 
46 46
 #include "HAL/shared/Delay.h"
47 47
 
48
-#include "module/stepper_indirection.h"
48
+#include "module/stepper/indirection.h"
49 49
 
50 50
 #ifdef ARDUINO
51 51
   #include <pins_arduino.h>

+ 1
- 1
Marlin/src/feature/controllerfan.cpp ファイルの表示

@@ -24,7 +24,7 @@
24 24
 
25 25
 #if ENABLED(USE_CONTROLLER_FAN)
26 26
 
27
-#include "../module/stepper_indirection.h"
27
+#include "../module/stepper/indirection.h"
28 28
 #include "../module/temperature.h"
29 29
 
30 30
 uint8_t controllerfan_speed;

+ 1
- 1
Marlin/src/feature/power.cpp ファイルの表示

@@ -30,7 +30,7 @@
30 30
 
31 31
 #include "power.h"
32 32
 #include "../module/temperature.h"
33
-#include "../module/stepper_indirection.h"
33
+#include "../module/stepper/indirection.h"
34 34
 #include "../Marlin.h"
35 35
 
36 36
 Power powerManager;

+ 1
- 1
Marlin/src/feature/prusa_MMU2/mmu2.cpp ファイルの表示

@@ -35,7 +35,7 @@ MMU2 mmu2;
35 35
 #include "../../libs/nozzle.h"
36 36
 #include "../../module/temperature.h"
37 37
 #include "../../module/planner.h"
38
-#include "../../module/stepper_indirection.h"
38
+#include "../../module/stepper/indirection.h"
39 39
 #include "../../Marlin.h"
40 40
 
41 41
 #if ENABLED(HOST_PROMPT_SUPPORT)

+ 1
- 1
Marlin/src/feature/tmc_util.cpp ファイルの表示

@@ -27,7 +27,7 @@
27 27
 #include "tmc_util.h"
28 28
 #include "../Marlin.h"
29 29
 
30
-#include "../module/stepper_indirection.h"
30
+#include "../module/stepper/indirection.h"
31 31
 #include "../module/printcounter.h"
32 32
 #include "../libs/duration_t.h"
33 33
 #include "../gcode/gcode.h"

+ 1
- 1
Marlin/src/gcode/feature/L6470/M122.cpp ファイルの表示

@@ -26,7 +26,7 @@
26 26
 
27 27
 #include "../../gcode.h"
28 28
 #include "../../../libs/L6470/L6470_Marlin.h"
29
-#include "../../../module/stepper_indirection.h"
29
+#include "../../../module/stepper/indirection.h"
30 30
 
31 31
 inline void echo_yes_no(const bool yes) { serialprintPGM(yes ? PSTR(" YES") : PSTR(" NO ")); }
32 32
 

+ 1
- 1
Marlin/src/gcode/feature/L6470/M906.cpp ファイルの表示

@@ -26,7 +26,7 @@
26 26
 
27 27
 #include "../../gcode.h"
28 28
 #include "../../../libs/L6470/L6470_Marlin.h"
29
-#include "../../../module/stepper_indirection.h"
29
+#include "../../../module/stepper/indirection.h"
30 30
 #include "../../../module/planner.h"
31 31
 
32 32
 #define DEBUG_OUT ENABLED(L6470_CHITCHAT)

+ 1
- 1
Marlin/src/gcode/feature/L6470/M916-918.cpp ファイルの表示

@@ -25,7 +25,7 @@
25 25
 #if HAS_DRIVER(L6470)
26 26
 
27 27
 #include "../../gcode.h"
28
-#include "../../../module/stepper_indirection.h"
28
+#include "../../../module/stepper/indirection.h"
29 29
 #include "../../../module/planner.h"
30 30
 #include "../../../libs/L6470/L6470_Marlin.h"
31 31
 

+ 1
- 1
Marlin/src/gcode/feature/trinamic/M569.cpp ファイルの表示

@@ -26,7 +26,7 @@
26 26
 
27 27
 #include "../../gcode.h"
28 28
 #include "../../../feature/tmc_util.h"
29
-#include "../../../module/stepper_indirection.h"
29
+#include "../../../module/stepper/indirection.h"
30 30
 
31 31
 template<typename TMC>
32 32
 void tmc_say_stealth_status(TMC &st) {

+ 1
- 1
Marlin/src/gcode/feature/trinamic/M906.cpp ファイルの表示

@@ -26,7 +26,7 @@
26 26
 
27 27
 #include "../../gcode.h"
28 28
 #include "../../../feature/tmc_util.h"
29
-#include "../../../module/stepper_indirection.h"
29
+#include "../../../module/stepper/indirection.h"
30 30
 
31 31
 /**
32 32
  * M906: Set motor current in milliamps.

+ 1
- 1
Marlin/src/gcode/feature/trinamic/M911-M914.cpp ファイルの表示

@@ -26,7 +26,7 @@
26 26
 
27 27
 #include "../../gcode.h"
28 28
 #include "../../../feature/tmc_util.h"
29
-#include "../../../module/stepper_indirection.h"
29
+#include "../../../module/stepper/indirection.h"
30 30
 #include "../../../module/planner.h"
31 31
 #include "../../queue.h"
32 32
 

+ 1
- 1
Marlin/src/gcode/host/M114.cpp ファイルの表示

@@ -31,7 +31,7 @@
31 31
   #if HAS_DRIVER(L6470)
32 32
     //C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\gcode\host\M114.cpp
33 33
     //C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\module\bob_L6470.cpp
34
-    #include "../../module/L6470/L6470_Marlin.h"
34
+    #include "../../libs/L6470/L6470_Marlin.h"
35 35
     #define DEBUG_OUT ENABLED(L6470_CHITCHAT)
36 36
     #include "../../core/debug_out.h"
37 37
   #endif

+ 1
- 1
Marlin/src/lcd/extensible_ui/ui_api.cpp ファイルの表示

@@ -77,7 +77,7 @@
77 77
 
78 78
 #if HAS_TRINAMIC
79 79
   #include "../../feature/tmc_util.h"
80
-  #include "../../module/stepper_indirection.h"
80
+  #include "../../module/stepper/indirection.h"
81 81
 #endif
82 82
 
83 83
 #include "ui_api.h"

+ 1
- 1
Marlin/src/lcd/menu/menu_tmc.cpp ファイルの表示

@@ -29,7 +29,7 @@
29 29
 #if HAS_TRINAMIC && HAS_LCD_MENU
30 30
 
31 31
 #include "menu.h"
32
-#include "../../module/stepper_indirection.h"
32
+#include "../../module/stepper/indirection.h"
33 33
 #include "../../feature/tmc_util.h"
34 34
 
35 35
 #define TMC_EDIT_STORED_I_RMS(ST,MSG) MENU_ITEM_EDIT_CALLBACK(uint16_4, MSG, &stepper##ST.val_mA, 100, 3000, refresh_stepper_current_##ST)

+ 3
- 3
Marlin/src/libs/L6470/L6470_Marlin.cpp ファイルの表示

@@ -21,7 +21,7 @@
21 21
  */
22 22
 
23 23
 /**
24
- *  The monitor_driver routines are a close copy of the TMC code
24
+ * The monitor_driver routines are a close copy of the TMC code
25 25
  */
26 26
 
27 27
 #include "../../inc/MarlinConfig.h"
@@ -32,9 +32,9 @@
32 32
 
33 33
 L6470_Marlin L6470;
34 34
 
35
-#include "../stepper_indirection.h"
35
+#include "../../module/stepper/indirection.h"
36
+#include "../../module/planner.h"
36 37
 #include "../../gcode/gcode.h"
37
-#include "../planner.h"
38 38
 
39 39
 #define DEBUG_OUT ENABLED(L6470_CHITCHAT)
40 40
 #include "../../core/debug_out.h"

+ 1
- 1
Marlin/src/module/configuration_store.cpp ファイルの表示

@@ -112,7 +112,7 @@
112 112
 #endif
113 113
 
114 114
 #if HAS_TRINAMIC
115
-  #include "stepper_indirection.h"
115
+  #include "stepper/indirection.h"
116 116
   #include "../feature/tmc_util.h"
117 117
 #endif
118 118
 

+ 1
- 1
Marlin/src/module/delta.cpp ファイルの表示

@@ -43,7 +43,7 @@
43 43
 
44 44
 #if ENABLED(SENSORLESS_HOMING)
45 45
   #include "../feature/tmc_util.h"
46
-  #include "stepper_indirection.h"
46
+  #include "stepper/indirection.h"
47 47
 #endif
48 48
 
49 49
 #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)

+ 1
- 1
Marlin/src/module/probe.cpp ファイルの表示

@@ -76,7 +76,7 @@ float zprobe_zoffset; // Initialized by settings.load()
76 76
 #endif
77 77
 
78 78
 #if QUIET_PROBING
79
-  #include "stepper_indirection.h"
79
+  #include "stepper/indirection.h"
80 80
 #endif
81 81
 
82 82
 #if ENABLED(EXTENSIBLE_UI)

+ 1
- 1
Marlin/src/module/stepper.h ファイルの表示

@@ -218,7 +218,7 @@
218 218
 // Stepper class definition
219 219
 //
220 220
 
221
-#include "stepper_indirection.h"
221
+#include "stepper/indirection.h"
222 222
 
223 223
 #ifdef __AVR__
224 224
   #include "speed_lookuptable.h"

+ 143
- 0
Marlin/src/module/stepper/L6470.cpp ファイルの表示

@@ -0,0 +1,143 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+/**
24
+ * stepper/L6470.cpp
25
+ * Stepper driver indirection for L6470 drivers
26
+ */
27
+
28
+#include "../../inc/MarlinConfig.h"
29
+
30
+#if HAS_DRIVER(L6470)
31
+
32
+#include "L6470.h"
33
+
34
+#define _L6470_DEFINE(ST) L6470 stepper##ST((const int)L6470_CHAIN_SS_PIN)
35
+
36
+// L6470 Stepper objects
37
+#if AXIS_DRIVER_TYPE_X(L6470)
38
+  _L6470_DEFINE(X);
39
+#endif
40
+#if AXIS_DRIVER_TYPE_X2(L6470)
41
+  _L6470_DEFINE(X2);
42
+#endif
43
+#if AXIS_DRIVER_TYPE_Y(L6470)
44
+  _L6470_DEFINE(Y);
45
+#endif
46
+#if AXIS_DRIVER_TYPE_Y2(L6470)
47
+  _L6470_DEFINE(Y2);
48
+#endif
49
+#if AXIS_DRIVER_TYPE_Z(L6470)
50
+  _L6470_DEFINE(Z);
51
+#endif
52
+#if AXIS_DRIVER_TYPE_Z2(L6470)
53
+  _L6470_DEFINE(Z2);
54
+#endif
55
+#if AXIS_DRIVER_TYPE_Z3(L6470)
56
+  _L6470_DEFINE(Z3);
57
+#endif
58
+#if AXIS_DRIVER_TYPE_E0(L6470)
59
+  _L6470_DEFINE(E0);
60
+#endif
61
+#if AXIS_DRIVER_TYPE_E1(L6470)
62
+  _L6470_DEFINE(E1);
63
+#endif
64
+#if AXIS_DRIVER_TYPE_E2(L6470)
65
+  _L6470_DEFINE(E2);
66
+#endif
67
+#if AXIS_DRIVER_TYPE_E3(L6470)
68
+  _L6470_DEFINE(E3);
69
+#endif
70
+#if AXIS_DRIVER_TYPE_E4(L6470)
71
+  _L6470_DEFINE(E4);
72
+#endif
73
+#if AXIS_DRIVER_TYPE_E5(L6470)
74
+  _L6470_DEFINE(E5);
75
+#endif
76
+
77
+// not using L6470 library's init command because it
78
+// briefly sends power to the steppers
79
+
80
+#define _L6470_INIT_CHIP(Q) do{                             \
81
+  stepper##Q.resetDev();                                    \
82
+  stepper##Q.softFree();                                    \
83
+  stepper##Q.SetParam(L6470_CONFIG, CONFIG_PWM_DIV_1        \
84
+                                  | CONFIG_PWM_MUL_2        \
85
+                                  | CONFIG_SR_290V_us       \
86
+                                  | CONFIG_OC_SD_DISABLE    \
87
+                                  | CONFIG_VS_COMP_DISABLE  \
88
+                                  | CONFIG_SW_HARD_STOP     \
89
+                                  | CONFIG_INT_16MHZ);      \
90
+  stepper##Q.SetParam(L6470_KVAL_RUN, 0xFF);                \
91
+  stepper##Q.SetParam(L6470_KVAL_ACC, 0xFF);                \
92
+  stepper##Q.SetParam(L6470_KVAL_DEC, 0xFF);                \
93
+  stepper##Q.setMicroSteps(Q##_MICROSTEPS);                 \
94
+  stepper##Q.setOverCurrent(Q##_OVERCURRENT);               \
95
+  stepper##Q.setStallCurrent(Q##_STALLCURRENT);             \
96
+  stepper##Q.SetParam(L6470_KVAL_HOLD, Q##_MAX_VOLTAGE);    \
97
+  stepper##Q.SetParam(L6470_ABS_POS, 0);                    \
98
+  stepper##Q.getStatus();                                   \
99
+}while(0)
100
+
101
+void L6470_Marlin::init_to_defaults() {
102
+  #if AXIS_DRIVER_TYPE_X(L6470)
103
+    _L6470_INIT_CHIP(X);
104
+  #endif
105
+  #if AXIS_DRIVER_TYPE_X2(L6470)
106
+    _L6470_INIT_CHIP(X2);
107
+  #endif
108
+  #if AXIS_DRIVER_TYPE_Y(L6470)
109
+    _L6470_INIT_CHIP(Y);
110
+  #endif
111
+  #if AXIS_DRIVER_TYPE_Y2(L6470)
112
+    _L6470_INIT_CHIP(Y2);
113
+  #endif
114
+  #if AXIS_DRIVER_TYPE_Z(L6470)
115
+    _L6470_INIT_CHIP(Z);
116
+  #endif
117
+  #if AXIS_DRIVER_TYPE_Z2(L6470)
118
+    _L6470_INIT_CHIP(Z2);
119
+  #endif
120
+  #if AXIS_DRIVER_TYPE_Z3(L6470)
121
+    _L6470_INIT_CHIP(Z3);
122
+  #endif
123
+  #if AXIS_DRIVER_TYPE_E0(L6470)
124
+    _L6470_INIT_CHIP(E0);
125
+  #endif
126
+  #if AXIS_DRIVER_TYPE_E1(L6470)
127
+    _L6470_INIT_CHIP(E1);
128
+  #endif
129
+  #if AXIS_DRIVER_TYPE_E2(L6470)
130
+    _L6470_INIT_CHIP(E2);
131
+  #endif
132
+  #if AXIS_DRIVER_TYPE_E3(L6470)
133
+    _L6470_INIT_CHIP(E3);
134
+  #endif
135
+  #if AXIS_DRIVER_TYPE_E4(L6470)
136
+    _L6470_INIT_CHIP(E4);
137
+  #endif
138
+  #if AXIS_DRIVER_TYPE_E5(L6470)
139
+    _L6470_INIT_CHIP(E5);
140
+  #endif
141
+}
142
+
143
+#endif // L6470

+ 176
- 0
Marlin/src/module/stepper/L6470.h ファイルの表示

@@ -0,0 +1,176 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+/**
25
+ * stepper/L6470.h
26
+ * Stepper driver indirection for L6470 drivers
27
+ */
28
+
29
+#include "../../inc/MarlinConfig.h"
30
+#include "../../libs/L6470/L6470_Marlin.h"
31
+
32
+// L6470 has STEP on normal pins, but DIR/ENABLE via SPI
33
+#define L6470_WRITE_DIR_COMMAND(STATE,Q) do{ L6470_dir_commands[Q] = (STATE ?  dSPIN_STEP_CLOCK_REV : dSPIN_STEP_CLOCK_FWD); }while(0)
34
+
35
+// X Stepper
36
+#if AXIS_DRIVER_TYPE_X(L6470)
37
+  extern L6470 stepperX;
38
+  #define X_ENABLE_INIT NOOP
39
+  #define X_ENABLE_WRITE(STATE) NOOP
40
+  #define X_ENABLE_READ() (stepperX.getStatus() & STATUS_HIZ)
41
+  #define X_DIR_INIT NOOP
42
+  #define X_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,X)
43
+  #define X_DIR_READ() (stepperX.getStatus() & STATUS_DIR)
44
+#endif
45
+
46
+// Y Stepper
47
+#if AXIS_DRIVER_TYPE_Y(L6470)
48
+  extern L6470 stepperY;
49
+  #define Y_ENABLE_INIT NOOP
50
+  #define Y_ENABLE_WRITE(STATE) NOOP
51
+  #define Y_ENABLE_READ() (stepperY.getStatus() & STATUS_HIZ)
52
+  #define Y_DIR_INIT NOOP
53
+  #define Y_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Y)
54
+  #define Y_DIR_READ() (stepperY.getStatus() & STATUS_DIR)
55
+#endif
56
+
57
+// Z Stepper
58
+#if AXIS_DRIVER_TYPE_Z(L6470)
59
+  extern L6470 stepperZ;
60
+  #define Z_ENABLE_INIT NOOP
61
+  #define Z_ENABLE_WRITE(STATE) NOOP
62
+  #define Z_ENABLE_READ() (stepperZ.getStatus() & STATUS_HIZ)
63
+  #define Z_DIR_INIT NOOP
64
+  #define Z_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z)
65
+  #define Z_DIR_READ() (stepperZ.getStatus() & STATUS_DIR)
66
+#endif
67
+
68
+// X2 Stepper
69
+#if HAS_X2_ENABLE && AXIS_DRIVER_TYPE_X2(L6470)
70
+  extern L6470 stepperX2;
71
+  #define X2_ENABLE_INIT NOOP
72
+  #define X2_ENABLE_WRITE(STATE) NOOP
73
+  #define X2_ENABLE_READ() (stepperX2.getStatus() & STATUS_HIZ)
74
+  #define X2_DIR_INIT NOOP
75
+  #define X2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,X2)
76
+  #define X2_DIR_READ() (stepperX2.getStatus() & STATUS_DIR)
77
+#endif
78
+
79
+// Y2 Stepper
80
+#if HAS_Y2_ENABLE && AXIS_DRIVER_TYPE_Y2(L6470)
81
+  extern L6470 stepperY2;
82
+  #define Y2_ENABLE_INIT NOOP
83
+  #define Y2_ENABLE_WRITE(STATE) NOOP
84
+  #define Y2_ENABLE_READ() (stepperY2.getStatus() & STATUS_HIZ)
85
+  #define Y2_DIR_INIT NOOP
86
+  #define Y2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Y2)
87
+  #define Y2_DIR_READ() (stepperY2.getStatus() & STATUS_DIR)
88
+#endif
89
+
90
+// Z2 Stepper
91
+#if HAS_Z2_ENABLE && AXIS_DRIVER_TYPE_Z2(L6470)
92
+  extern L6470 stepperZ2;
93
+  #define Z2_ENABLE_INIT NOOP
94
+  #define Z2_ENABLE_WRITE(STATE) NOOP
95
+  #define Z2_ENABLE_READ() (stepperZ2.getStatus() & STATUS_HIZ)
96
+  #define Z2_DIR_INIT NOOP
97
+  #define Z2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z2)
98
+  #define Z2_DIR_READ() (stepperZ2.getStatus() & STATUS_DIR)
99
+#endif
100
+
101
+// Z3 Stepper
102
+#if HAS_Z3_ENABLE && AXIS_DRIVER_TYPE_Z3(L6470)
103
+  extern L6470 stepperZ3;
104
+  #define Z3_ENABLE_INIT NOOP
105
+  #define Z3_ENABLE_WRITE(STATE) NOOP
106
+  #define Z3_ENABLE_READ() (stepperZ3.getStatus() & STATUS_HIZ)
107
+  #define Z3_DIR_INIT NOOP
108
+  #define Z3_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z3)
109
+  #define Z3_DIR_READ() (stepperZ3.getStatus() & STATUS_DIR)
110
+#endif
111
+
112
+// E0 Stepper
113
+#if AXIS_DRIVER_TYPE_E0(L6470)
114
+  extern L6470 stepperE0;
115
+  #define E0_ENABLE_INIT NOOP
116
+  #define E0_ENABLE_WRITE(STATE) NOOP
117
+  #define E0_ENABLE_READ() (stepperE0.getStatus() & STATUS_HIZ)
118
+  #define E0_DIR_INIT NOOP
119
+  #define E0_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E0)
120
+  #define E0_DIR_READ() (stepperE0.getStatus() & STATUS_DIR)
121
+#endif
122
+
123
+// E1 Stepper
124
+#if AXIS_DRIVER_TYPE_E1(L6470)
125
+  extern L6470 stepperE1;
126
+  #define E1_ENABLE_INIT NOOP
127
+  #define E1_ENABLE_WRITE(STATE) NOOP
128
+  #define E1_ENABLE_READ() (stepperE1.getStatus() & STATUS_HIZ)
129
+  #define E1_DIR_INIT NOOP
130
+  #define E1_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E1)
131
+  #define E1_DIR_READ() (stepperE1.getStatus() & STATUS_DIR)
132
+#endif
133
+
134
+// E2 Stepper
135
+#if AXIS_DRIVER_TYPE_E2(L6470)
136
+  extern L6470 stepperE2;
137
+  #define E2_ENABLE_INIT NOOP
138
+  #define E2_ENABLE_WRITE(STATE) NOOP
139
+  #define E2_ENABLE_READ() (stepperE2.getStatus() & STATUS_HIZ)
140
+  #define E2_DIR_INIT NOOP
141
+  #define E2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E2)
142
+  #define E2_DIR_READ() (stepperE2.getStatus() & STATUS_DIR)
143
+#endif
144
+
145
+// E3 Stepper
146
+#if AXIS_DRIVER_TYPE_E3(L6470)
147
+  extern L6470 stepperE3;
148
+  #define E3_ENABLE_INIT NOOP
149
+  #define E3_ENABLE_WRITE(STATE) NOOP
150
+  #define E3_ENABLE_READ() (stepperE3.getStatus() & STATUS_HIZ)
151
+  #define E3_DIR_INIT NOOP
152
+  #define E3_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E3)
153
+  #define E3_DIR_READ() (stepperE3.getStatus() & STATUS_DIR)
154
+#endif
155
+
156
+// E4 Stepper
157
+#if AXIS_DRIVER_TYPE_E4(L6470)
158
+  extern L6470 stepperE4;
159
+  #define E4_ENABLE_INIT NOOP
160
+  #define E4_ENABLE_WRITE(STATE) NOOP
161
+  #define E4_ENABLE_READ() (stepperE4.getStatus() & STATUS_HIZ)
162
+  #define E4_DIR_INIT NOOP
163
+  #define E4_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E4)
164
+  #define E4_DIR_READ() (stepperE4.getStatus() & STATUS_DIR)
165
+#endif
166
+
167
+// E5 Stepper
168
+#if AXIS_DRIVER_TYPE_E5(L6470)
169
+  extern L6470 stepperE5;
170
+  #define E5_ENABLE_INIT NOOP
171
+  #define E5_ENABLE_WRITE(STATE) NOOP
172
+  #define E5_ENABLE_READ() (stepperE5.getStatus() & STATUS_HIZ)
173
+  #define E5_DIR_INIT NOOP
174
+  #define E5_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E5)
175
+  #define E5_DIR_READ() (stepperE5.getStatus() & STATUS_DIR)
176
+#endif

+ 126
- 0
Marlin/src/module/stepper/TMC26X.cpp ファイルの表示

@@ -0,0 +1,126 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+/**
24
+ * stepper/TMC26X.cpp
25
+ * Stepper driver indirection for TMC26X drivers
26
+ */
27
+
28
+#include "../../inc/MarlinConfig.h"
29
+
30
+//
31
+// TMC26X Driver objects and inits
32
+//
33
+#if HAS_DRIVER(TMC26X)
34
+
35
+#include "TMC26X.h"
36
+
37
+#define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
38
+
39
+#if AXIS_DRIVER_TYPE_X(TMC26X)
40
+  _TMC26X_DEFINE(X);
41
+#endif
42
+#if AXIS_DRIVER_TYPE_X2(TMC26X)
43
+  _TMC26X_DEFINE(X2);
44
+#endif
45
+#if AXIS_DRIVER_TYPE_Y(TMC26X)
46
+  _TMC26X_DEFINE(Y);
47
+#endif
48
+#if AXIS_DRIVER_TYPE_Y2(TMC26X)
49
+  _TMC26X_DEFINE(Y2);
50
+#endif
51
+#if AXIS_DRIVER_TYPE_Z(TMC26X)
52
+  _TMC26X_DEFINE(Z);
53
+#endif
54
+#if AXIS_DRIVER_TYPE_Z2(TMC26X)
55
+  _TMC26X_DEFINE(Z2);
56
+#endif
57
+#if AXIS_DRIVER_TYPE_Z3(TMC26X)
58
+  _TMC26X_DEFINE(Z3);
59
+#endif
60
+#if AXIS_DRIVER_TYPE_E0(TMC26X)
61
+  _TMC26X_DEFINE(E0);
62
+#endif
63
+#if AXIS_DRIVER_TYPE_E1(TMC26X)
64
+  _TMC26X_DEFINE(E1);
65
+#endif
66
+#if AXIS_DRIVER_TYPE_E2(TMC26X)
67
+  _TMC26X_DEFINE(E2);
68
+#endif
69
+#if AXIS_DRIVER_TYPE_E3(TMC26X)
70
+  _TMC26X_DEFINE(E3);
71
+#endif
72
+#if AXIS_DRIVER_TYPE_E4(TMC26X)
73
+  _TMC26X_DEFINE(E4);
74
+#endif
75
+#if AXIS_DRIVER_TYPE_E5(TMC26X)
76
+  _TMC26X_DEFINE(E5);
77
+#endif
78
+
79
+#define _TMC26X_INIT(A) do{ \
80
+  stepper##A.setMicrosteps(A##_MICROSTEPS); \
81
+  stepper##A.start(); \
82
+}while(0)
83
+
84
+void tmc26x_init_to_defaults() {
85
+  #if AXIS_DRIVER_TYPE_X(TMC26X)
86
+    _TMC26X_INIT(X);
87
+  #endif
88
+  #if AXIS_DRIVER_TYPE_X2(TMC26X)
89
+    _TMC26X_INIT(X2);
90
+  #endif
91
+  #if AXIS_DRIVER_TYPE_Y(TMC26X)
92
+    _TMC26X_INIT(Y);
93
+  #endif
94
+  #if AXIS_DRIVER_TYPE_Y2(TMC26X)
95
+    _TMC26X_INIT(Y2);
96
+  #endif
97
+  #if AXIS_DRIVER_TYPE_Z(TMC26X)
98
+    _TMC26X_INIT(Z);
99
+  #endif
100
+  #if AXIS_DRIVER_TYPE_Z2(TMC26X)
101
+    _TMC26X_INIT(Z2);
102
+  #endif
103
+  #if AXIS_DRIVER_TYPE_Z3(TMC26X)
104
+    _TMC26X_INIT(Z3);
105
+  #endif
106
+  #if AXIS_DRIVER_TYPE_E0(TMC26X)
107
+    _TMC26X_INIT(E0);
108
+  #endif
109
+  #if AXIS_DRIVER_TYPE_E1(TMC26X)
110
+    _TMC26X_INIT(E1);
111
+  #endif
112
+  #if AXIS_DRIVER_TYPE_E2(TMC26X)
113
+    _TMC26X_INIT(E2);
114
+  #endif
115
+  #if AXIS_DRIVER_TYPE_E3(TMC26X)
116
+    _TMC26X_INIT(E3);
117
+  #endif
118
+  #if AXIS_DRIVER_TYPE_E4(TMC26X)
119
+    _TMC26X_INIT(E4);
120
+  #endif
121
+  #if AXIS_DRIVER_TYPE_E5(TMC26X)
122
+    _TMC26X_INIT(E5);
123
+  #endif
124
+}
125
+
126
+#endif // TMC26X

+ 144
- 0
Marlin/src/module/stepper/TMC26X.h ファイルの表示

@@ -0,0 +1,144 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+/**
25
+ * stepper/TMC26X.h
26
+ * Stepper driver indirection for TMC26X drivers
27
+ */
28
+
29
+#include "../../inc/MarlinConfig.h"
30
+
31
+// TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI
32
+
33
+#include <SPI.h>
34
+#if defined(STM32GENERIC) && defined(STM32F7)
35
+ #include "../../HAL/HAL_STM32_F4_F7/STM32F7/TMC2660.h"
36
+#else
37
+ #include <TMC26XStepper.h>
38
+#endif
39
+
40
+void tmc26x_init_to_defaults();
41
+
42
+// X Stepper
43
+#if AXIS_DRIVER_TYPE_X(TMC26X)
44
+  extern TMC26XStepper stepperX;
45
+  #define X_ENABLE_INIT NOOP
46
+  #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
47
+  #define X_ENABLE_READ() stepperX.isEnabled()
48
+#endif
49
+
50
+// Y Stepper
51
+#if AXIS_DRIVER_TYPE_Y(TMC26X)
52
+  extern TMC26XStepper stepperY;
53
+  #define Y_ENABLE_INIT NOOP
54
+  #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
55
+  #define Y_ENABLE_READ() stepperY.isEnabled()
56
+#endif
57
+
58
+// Z Stepper
59
+#if AXIS_DRIVER_TYPE_Z(TMC26X)
60
+  extern TMC26XStepper stepperZ;
61
+  #define Z_ENABLE_INIT NOOP
62
+  #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
63
+  #define Z_ENABLE_READ() stepperZ.isEnabled()
64
+#endif
65
+
66
+// X2 Stepper
67
+#if HAS_X2_ENABLE && AXIS_DRIVER_TYPE_X2(TMC26X)
68
+  extern TMC26XStepper stepperX2;
69
+  #define X2_ENABLE_INIT NOOP
70
+  #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
71
+  #define X2_ENABLE_READ() stepperX2.isEnabled()
72
+#endif
73
+
74
+// Y2 Stepper
75
+#if HAS_Y2_ENABLE && AXIS_DRIVER_TYPE_Y2(TMC26X)
76
+  extern TMC26XStepper stepperY2;
77
+  #define Y2_ENABLE_INIT NOOP
78
+  #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
79
+  #define Y2_ENABLE_READ() stepperY2.isEnabled()
80
+#endif
81
+
82
+// Z2 Stepper
83
+#if HAS_Z2_ENABLE && AXIS_DRIVER_TYPE_Z2(TMC26X)
84
+  extern TMC26XStepper stepperZ2;
85
+  #define Z2_ENABLE_INIT NOOP
86
+  #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
87
+  #define Z2_ENABLE_READ() stepperZ2.isEnabled()
88
+#endif
89
+
90
+// Z3 Stepper
91
+#if HAS_Z3_ENABLE && ENABLED(Z3_IS_TMC26X)
92
+  extern TMC26XStepper stepperZ3;
93
+  #define Z3_ENABLE_INIT NOOP
94
+  #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
95
+  #define Z3_ENABLE_READ() stepperZ3.isEnabled()
96
+#endif
97
+
98
+// E0 Stepper
99
+#if AXIS_DRIVER_TYPE_E0(TMC26X)
100
+  extern TMC26XStepper stepperE0;
101
+  #define E0_ENABLE_INIT NOOP
102
+  #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
103
+  #define E0_ENABLE_READ() stepperE0.isEnabled()
104
+#endif
105
+
106
+// E1 Stepper
107
+#if AXIS_DRIVER_TYPE_E1(TMC26X)
108
+  extern TMC26XStepper stepperE1;
109
+  #define E1_ENABLE_INIT NOOP
110
+  #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
111
+  #define E1_ENABLE_READ() stepperE1.isEnabled()
112
+#endif
113
+
114
+// E2 Stepper
115
+#if AXIS_DRIVER_TYPE_E2(TMC26X)
116
+  extern TMC26XStepper stepperE2;
117
+  #define E2_ENABLE_INIT NOOP
118
+  #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
119
+  #define E2_ENABLE_READ() stepperE2.isEnabled()
120
+#endif
121
+
122
+// E3 Stepper
123
+#if AXIS_DRIVER_TYPE_E3(TMC26X)
124
+  extern TMC26XStepper stepperE3;
125
+  #define E3_ENABLE_INIT NOOP
126
+  #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
127
+  #define E3_ENABLE_READ() stepperE3.isEnabled()
128
+#endif
129
+
130
+// E4 Stepper
131
+#if AXIS_DRIVER_TYPE_E4(TMC26X)
132
+  extern TMC26XStepper stepperE4;
133
+  #define E4_ENABLE_INIT NOOP
134
+  #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
135
+  #define E4_ENABLE_READ() stepperE4.isEnabled()
136
+#endif
137
+
138
+// E5 Stepper
139
+#if AXIS_DRIVER_TYPE_E5(TMC26X)
140
+  extern TMC26XStepper stepperE5;
141
+  #define E5_ENABLE_INIT NOOP
142
+  #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
143
+  #define E5_ENABLE_READ() stepperE5.isEnabled()
144
+#endif

+ 53
- 0
Marlin/src/module/stepper/indirection.cpp ファイルの表示

@@ -0,0 +1,53 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+
23
+/**
24
+ * stepper/indirection.cpp
25
+ *
26
+ * Stepper motor driver indirection to allow some stepper functions to
27
+ * be done via SPI/I2c instead of direct pin manipulation.
28
+ *
29
+ * Copyright (c) 2015 Dominik Wenger
30
+ */
31
+
32
+#include "../../inc/MarlinConfig.h"
33
+#include "indirection.h"
34
+
35
+void restore_stepper_drivers() {
36
+  #if HAS_TRINAMIC
37
+    restore_trinamic_drivers();
38
+  #endif
39
+}
40
+
41
+void reset_stepper_drivers() {
42
+  #if HAS_DRIVER(TMC26X)
43
+    tmc26x_init_to_defaults();
44
+  #endif
45
+
46
+  #if HAS_DRIVER(L6470)
47
+    L6470.init_to_defaults();
48
+  #endif
49
+
50
+  #if HAS_TRINAMIC
51
+    reset_trinamic_drivers();
52
+  #endif
53
+}

+ 399
- 0
Marlin/src/module/stepper/indirection.h ファイルの表示

@@ -0,0 +1,399 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+/**
25
+ * stepper/indirection.h
26
+ *
27
+ * Stepper motor driver indirection to allow some stepper functions to
28
+ * be done via SPI/I2c instead of direct pin manipulation.
29
+ *
30
+ * Copyright (c) 2015 Dominik Wenger
31
+ */
32
+
33
+#include "../../inc/MarlinConfig.h"
34
+
35
+#if HAS_DRIVER(L6470)
36
+  #include "L6470.h"
37
+#endif
38
+
39
+#if HAS_DRIVER(TMC26X)
40
+  #include "TMC26X.h"
41
+#endif
42
+
43
+#if HAS_TRINAMIC
44
+  #include "trinamic.h"
45
+#endif
46
+
47
+void restore_stepper_drivers();  // Called by PSU_ON
48
+void reset_stepper_drivers();    // Called by settings.load / settings.reset
49
+
50
+// X Stepper
51
+#ifndef X_ENABLE_INIT
52
+  #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
53
+  #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
54
+  #define X_ENABLE_READ() READ(X_ENABLE_PIN)
55
+#endif
56
+#ifndef X_DIR_INIT
57
+  #define X_DIR_INIT SET_OUTPUT(X_DIR_PIN)
58
+  #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE)
59
+  #define X_DIR_READ() READ(X_DIR_PIN)
60
+#endif
61
+#define X_STEP_INIT SET_OUTPUT(X_STEP_PIN)
62
+#ifndef X_STEP_WRITE
63
+  #define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE)
64
+#endif
65
+#define X_STEP_READ READ(X_STEP_PIN)
66
+
67
+// Y Stepper
68
+#ifndef Y_ENABLE_INIT
69
+  #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
70
+  #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
71
+  #define Y_ENABLE_READ() READ(Y_ENABLE_PIN)
72
+#endif
73
+#ifndef Y_DIR_INIT
74
+  #define Y_DIR_INIT SET_OUTPUT(Y_DIR_PIN)
75
+  #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE)
76
+  #define Y_DIR_READ() READ(Y_DIR_PIN)
77
+#endif
78
+#define Y_STEP_INIT SET_OUTPUT(Y_STEP_PIN)
79
+#ifndef Y_STEP_WRITE
80
+  #define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE)
81
+#endif
82
+#define Y_STEP_READ READ(Y_STEP_PIN)
83
+
84
+// Z Stepper
85
+#ifndef Z_ENABLE_INIT
86
+  #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
87
+  #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
88
+  #define Z_ENABLE_READ() READ(Z_ENABLE_PIN)
89
+#endif
90
+#ifndef Z_DIR_INIT
91
+  #define Z_DIR_INIT SET_OUTPUT(Z_DIR_PIN)
92
+  #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE)
93
+  #define Z_DIR_READ() READ(Z_DIR_PIN)
94
+#endif
95
+#define Z_STEP_INIT SET_OUTPUT(Z_STEP_PIN)
96
+#ifndef Z_STEP_WRITE
97
+  #define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE)
98
+#endif
99
+#define Z_STEP_READ READ(Z_STEP_PIN)
100
+
101
+// X2 Stepper
102
+#if HAS_X2_ENABLE
103
+  #ifndef X2_ENABLE_INIT
104
+    #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
105
+    #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
106
+    #define X2_ENABLE_READ() READ(X2_ENABLE_PIN)
107
+  #endif
108
+  #ifndef X2_DIR_INIT
109
+    #define X2_DIR_INIT SET_OUTPUT(X2_DIR_PIN)
110
+    #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE)
111
+    #define X2_DIR_READ() READ(X2_DIR_PIN)
112
+  #endif
113
+  #define X2_STEP_INIT SET_OUTPUT(X2_STEP_PIN)
114
+  #ifndef X2_STEP_WRITE
115
+    #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE)
116
+  #endif
117
+  #define X2_STEP_READ READ(X2_STEP_PIN)
118
+#endif
119
+
120
+// Y2 Stepper
121
+#if HAS_Y2_ENABLE
122
+  #ifndef Y2_ENABLE_INIT
123
+    #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
124
+    #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
125
+    #define Y2_ENABLE_READ() READ(Y2_ENABLE_PIN)
126
+  #endif
127
+  #ifndef Y2_DIR_INIT
128
+    #define Y2_DIR_INIT SET_OUTPUT(Y2_DIR_PIN)
129
+    #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE)
130
+    #define Y2_DIR_READ() READ(Y2_DIR_PIN)
131
+  #endif
132
+  #define Y2_STEP_INIT SET_OUTPUT(Y2_STEP_PIN)
133
+  #ifndef Y2_STEP_WRITE
134
+    #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE)
135
+  #endif
136
+  #define Y2_STEP_READ READ(Y2_STEP_PIN)
137
+#else
138
+  #define Y2_DIR_WRITE(STATE) NOOP
139
+#endif
140
+
141
+// Z2 Stepper
142
+#if HAS_Z2_ENABLE
143
+  #ifndef Z2_ENABLE_INIT
144
+    #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
145
+    #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
146
+    #define Z2_ENABLE_READ() READ(Z2_ENABLE_PIN)
147
+  #endif
148
+  #ifndef Z2_DIR_INIT
149
+    #define Z2_DIR_INIT SET_OUTPUT(Z2_DIR_PIN)
150
+    #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE)
151
+    #define Z2_DIR_READ() READ(Z2_DIR_PIN)
152
+  #endif
153
+  #define Z2_STEP_INIT SET_OUTPUT(Z2_STEP_PIN)
154
+  #ifndef Z2_STEP_WRITE
155
+    #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE)
156
+  #endif
157
+  #define Z2_STEP_READ READ(Z2_STEP_PIN)
158
+#else
159
+  #define Z2_DIR_WRITE(STATE) NOOP
160
+#endif
161
+
162
+// Z3 Stepper
163
+#if HAS_Z3_ENABLE
164
+  #ifndef Z3_ENABLE_INIT
165
+    #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
166
+    #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
167
+    #define Z3_ENABLE_READ() READ(Z3_ENABLE_PIN)
168
+  #endif
169
+  #ifndef Z3_DIR_INIT
170
+    #define Z3_DIR_INIT SET_OUTPUT(Z3_DIR_PIN)
171
+    #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE)
172
+    #define Z3_DIR_READ() READ(Z3_DIR_PIN)
173
+  #endif
174
+  #define Z3_STEP_INIT SET_OUTPUT(Z3_STEP_PIN)
175
+  #ifndef Z3_STEP_WRITE
176
+    #define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE)
177
+  #endif
178
+  #define Z3_STEP_READ READ(Z3_STEP_PIN)
179
+#else
180
+  #define Z3_DIR_WRITE(STATE) NOOP
181
+#endif
182
+
183
+// E0 Stepper
184
+#ifndef E0_ENABLE_INIT
185
+  #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
186
+  #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
187
+  #define E0_ENABLE_READ() READ(E0_ENABLE_PIN)
188
+#endif
189
+#ifndef E0_DIR_INIT
190
+  #define E0_DIR_INIT SET_OUTPUT(E0_DIR_PIN)
191
+  #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE)
192
+  #define E0_DIR_READ() READ(E0_DIR_PIN)
193
+#endif
194
+#define E0_STEP_INIT SET_OUTPUT(E0_STEP_PIN)
195
+#ifndef E0_STEP_WRITE
196
+  #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE)
197
+#endif
198
+#define E0_STEP_READ READ(E0_STEP_PIN)
199
+
200
+// E1 Stepper
201
+#ifndef E1_ENABLE_INIT
202
+  #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
203
+  #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
204
+  #define E1_ENABLE_READ() READ(E1_ENABLE_PIN)
205
+#endif
206
+#ifndef E1_DIR_INIT
207
+  #define E1_DIR_INIT SET_OUTPUT(E1_DIR_PIN)
208
+  #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE)
209
+  #define E1_DIR_READ() READ(E1_DIR_PIN)
210
+#endif
211
+#define E1_STEP_INIT SET_OUTPUT(E1_STEP_PIN)
212
+#ifndef E1_STEP_WRITE
213
+  #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE)
214
+#endif
215
+#define E1_STEP_READ READ(E1_STEP_PIN)
216
+
217
+// E2 Stepper
218
+#ifndef E2_ENABLE_INIT
219
+  #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
220
+  #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
221
+  #define E2_ENABLE_READ() READ(E2_ENABLE_PIN)
222
+#endif
223
+#ifndef E2_DIR_INIT
224
+  #define E2_DIR_INIT SET_OUTPUT(E2_DIR_PIN)
225
+  #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE)
226
+  #define E2_DIR_READ() READ(E2_DIR_PIN)
227
+#endif
228
+#define E2_STEP_INIT SET_OUTPUT(E2_STEP_PIN)
229
+#ifndef E2_STEP_WRITE
230
+  #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE)
231
+#endif
232
+#define E2_STEP_READ READ(E2_STEP_PIN)
233
+
234
+// E3 Stepper
235
+#ifndef E3_ENABLE_INIT
236
+  #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
237
+  #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
238
+  #define E3_ENABLE_READ() READ(E3_ENABLE_PIN)
239
+#endif
240
+#ifndef E3_DIR_INIT
241
+  #define E3_DIR_INIT SET_OUTPUT(E3_DIR_PIN)
242
+  #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE)
243
+  #define E3_DIR_READ() READ(E3_DIR_PIN)
244
+#endif
245
+#define E3_STEP_INIT SET_OUTPUT(E3_STEP_PIN)
246
+#ifndef E3_STEP_WRITE
247
+  #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE)
248
+#endif
249
+#define E3_STEP_READ READ(E3_STEP_PIN)
250
+
251
+// E4 Stepper
252
+#ifndef E4_ENABLE_INIT
253
+  #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
254
+  #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
255
+  #define E4_ENABLE_READ() READ(E4_ENABLE_PIN)
256
+#endif
257
+#ifndef E4_DIR_INIT
258
+  #define E4_DIR_INIT SET_OUTPUT(E4_DIR_PIN)
259
+  #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE)
260
+  #define E4_DIR_READ() READ(E4_DIR_PIN)
261
+#endif
262
+#define E4_STEP_INIT SET_OUTPUT(E4_STEP_PIN)
263
+#ifndef E4_STEP_WRITE
264
+  #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
265
+#endif
266
+#define E4_STEP_READ READ(E4_STEP_PIN)
267
+
268
+// E5 Stepper
269
+#ifndef E5_ENABLE_INIT
270
+  #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
271
+  #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
272
+  #define E5_ENABLE_READ() READ(E5_ENABLE_PIN)
273
+#endif
274
+#ifndef E5_DIR_INIT
275
+  #define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN)
276
+  #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE)
277
+  #define E5_DIR_READ() READ(E5_DIR_PIN)
278
+#endif
279
+#define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN)
280
+#ifndef E5_STEP_WRITE
281
+  #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE)
282
+#endif
283
+#define E5_STEP_READ READ(E5_STEP_PIN)
284
+
285
+/**
286
+ * Extruder indirection for the single E axis
287
+ */
288
+#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
289
+  #if EXTRUDERS > 5
290
+    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
291
+    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); case 5: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
292
+    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); case 5: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
293
+  #elif EXTRUDERS > 4
294
+    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
295
+    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
296
+    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
297
+  #elif EXTRUDERS > 3
298
+    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
299
+    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
300
+    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
301
+  #elif EXTRUDERS > 2
302
+    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
303
+    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
304
+    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
305
+  #else
306
+    #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
307
+    #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(E ?  INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
308
+    #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR :  INVERT_E0_DIR); }while(0)
309
+  #endif
310
+#elif ENABLED(PRUSA_MMU2)
311
+  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
312
+  #define   NORM_E_DIR(E)   E0_DIR_WRITE(!INVERT_E0_DIR)
313
+  #define    REV_E_DIR(E)   E0_DIR_WRITE( INVERT_E0_DIR)
314
+
315
+#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index
316
+  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
317
+  #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR:  INVERT_E0_DIR); }while(0)
318
+  #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ?  INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
319
+
320
+#elif E_STEPPERS > 1
321
+
322
+  #if E_STEPPERS > 5
323
+    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); case 5: E5_STEP_WRITE(V); } }while(0)
324
+    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); case 5: E5_DIR_WRITE(!INVERT_E5_DIR); } }while(0)
325
+    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); case 5: E5_DIR_WRITE( INVERT_E5_DIR); } }while(0)
326
+  #elif E_STEPPERS > 4
327
+    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0)
328
+    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0)
329
+    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); } }while(0)
330
+  #elif E_STEPPERS > 3
331
+    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); } }while(0)
332
+    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0)
333
+    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); } }while(0)
334
+  #elif E_STEPPERS > 2
335
+    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0)
336
+    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
337
+    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
338
+  #else
339
+    #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
340
+    #define   _NORM_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
341
+    #define    _REV_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
342
+  #endif
343
+
344
+  #if HAS_DUPLICATION_MODE
345
+
346
+    #if ENABLED(MULTI_NOZZLE_DUPLICATION)
347
+      #define _DUPE(N,T,V)  do{ if (TEST(duplication_e_mask, N)) E##N##_##T##_WRITE(V); }while(0)
348
+    #else
349
+      #define _DUPE(N,T,V)  E##N##_##T##_WRITE(V)
350
+    #endif
351
+
352
+    #define NDIR(N) _DUPE(N,DIR,!INVERT_E##N##_DIR)
353
+    #define RDIR(N) _DUPE(N,DIR, INVERT_E##N##_DIR)
354
+
355
+    #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { DUPE(STEP,V); } else _E_STEP_WRITE(E,V); }while(0)
356
+
357
+    #if E_STEPPERS > 2
358
+      #if E_STEPPERS > 5
359
+        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); }while(0)
360
+        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); } else _NORM_E_DIR(E); }while(0)
361
+        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); } else  _REV_E_DIR(E); }while(0)
362
+      #elif E_STEPPERS > 4
363
+        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); }while(0)
364
+        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); } else _NORM_E_DIR(E); }while(0)
365
+        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); } else  _REV_E_DIR(E); }while(0)
366
+      #elif E_STEPPERS > 3
367
+        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); }while(0)
368
+        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); } else _NORM_E_DIR(E); }while(0)
369
+        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); } else  _REV_E_DIR(E); }while(0)
370
+      #else
371
+        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); }while(0)
372
+        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); } else _NORM_E_DIR(E); }while(0)
373
+        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); } else  _REV_E_DIR(E); }while(0)
374
+      #endif
375
+    #else
376
+      #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); }while(0)
377
+      #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); } else _NORM_E_DIR(E); }while(0)
378
+      #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); } else  _REV_E_DIR(E); }while(0)
379
+    #endif
380
+
381
+  #else
382
+
383
+    #define E_STEP_WRITE(E,V) _E_STEP_WRITE(E,V)
384
+    #define   NORM_E_DIR(E)   _NORM_E_DIR(E)
385
+    #define    REV_E_DIR(E)   _REV_E_DIR(E)
386
+
387
+  #endif
388
+
389
+#elif E_STEPPERS
390
+  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
391
+  #define   NORM_E_DIR(E)   E0_DIR_WRITE(!INVERT_E0_DIR)
392
+  #define    REV_E_DIR(E)   E0_DIR_WRITE( INVERT_E0_DIR)
393
+
394
+#else
395
+  #define E_STEP_WRITE(E,V) NOOP
396
+  #define   NORM_E_DIR(E)   NOOP
397
+  #define    REV_E_DIR(E)   NOOP
398
+
399
+#endif

Marlin/src/module/stepper_indirection.cpp → Marlin/src/module/stepper/trinamic.cpp ファイルの表示

@@ -21,204 +21,90 @@
21 21
  */
22 22
 
23 23
 /**
24
- * stepper_indirection.cpp
25
- *
26
- * Stepper motor driver indirection to allow some stepper functions to
27
- * be done via SPI/I2c instead of direct pin manipulation.
28
- *
29
- * Copyright (c) 2015 Dominik Wenger
24
+ * stepper/trinamic.cpp
25
+ * Stepper driver indirection for Trinamic
30 26
  */
31 27
 
32
-#include "stepper_indirection.h"
33
-
34
-#include "../inc/MarlinConfig.h"
35
-
36
-#include "stepper.h"
37
-
38
-#if HAS_DRIVER(L6470)
39
-  #include "L6470/L6470_Marlin.h"
40
-#endif
41
-
42
-//
43
-// TMC26X Driver objects and inits
44
-//
45
-#if HAS_DRIVER(TMC26X)
46
-  #include <SPI.h>
28
+#include "../../inc/MarlinConfig.h"
47 29
 
48
-  #if defined(STM32GENERIC) && defined(STM32F7)
49
-    #include "../HAL/HAL_STM32_F4_F7/STM32F7/TMC2660.h"
50
-  #else
51
-    #include <TMC26XStepper.h>
52
-  #endif
30
+#if HAS_TRINAMIC
53 31
 
54
-  #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR)
32
+#include "trinamic.h"
33
+#include "../stepper.h"
55 34
 
56
-  #if AXIS_DRIVER_TYPE_X(TMC26X)
57
-    _TMC26X_DEFINE(X);
58
-  #endif
59
-  #if AXIS_DRIVER_TYPE_X2(TMC26X)
60
-    _TMC26X_DEFINE(X2);
61
-  #endif
62
-  #if AXIS_DRIVER_TYPE_Y(TMC26X)
63
-    _TMC26X_DEFINE(Y);
64
-  #endif
65
-  #if AXIS_DRIVER_TYPE_Y2(TMC26X)
66
-    _TMC26X_DEFINE(Y2);
67
-  #endif
68
-  #if AXIS_DRIVER_TYPE_Z(TMC26X)
69
-    _TMC26X_DEFINE(Z);
70
-  #endif
71
-  #if AXIS_DRIVER_TYPE_Z2(TMC26X)
72
-    _TMC26X_DEFINE(Z2);
73
-  #endif
74
-  #if AXIS_DRIVER_TYPE_Z3(TMC26X)
75
-    _TMC26X_DEFINE(Z3);
76
-  #endif
77
-  #if AXIS_DRIVER_TYPE_E0(TMC26X)
78
-    _TMC26X_DEFINE(E0);
79
-  #endif
80
-  #if AXIS_DRIVER_TYPE_E1(TMC26X)
81
-    _TMC26X_DEFINE(E1);
82
-  #endif
83
-  #if AXIS_DRIVER_TYPE_E2(TMC26X)
84
-    _TMC26X_DEFINE(E2);
85
-  #endif
86
-  #if AXIS_DRIVER_TYPE_E3(TMC26X)
87
-    _TMC26X_DEFINE(E3);
88
-  #endif
89
-  #if AXIS_DRIVER_TYPE_E4(TMC26X)
90
-    _TMC26X_DEFINE(E4);
91
-  #endif
92
-  #if AXIS_DRIVER_TYPE_E5(TMC26X)
93
-    _TMC26X_DEFINE(E5);
94
-  #endif
35
+#include <HardwareSerial.h>
36
+#include <SPI.h>
95 37
 
96
-  #define _TMC26X_INIT(A) do{ \
97
-    stepper##A.setMicrosteps(A##_MICROSTEPS); \
98
-    stepper##A.start(); \
99
-  }while(0)
38
+enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
39
+#define _TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX])
100 40
 
101
-  void tmc26x_init_to_defaults() {
102
-    #if AXIS_DRIVER_TYPE_X(TMC26X)
103
-      _TMC26X_INIT(X);
104
-    #endif
105
-    #if AXIS_DRIVER_TYPE_X2(TMC26X)
106
-      _TMC26X_INIT(X2);
107
-    #endif
108
-    #if AXIS_DRIVER_TYPE_Y(TMC26X)
109
-      _TMC26X_INIT(Y);
110
-    #endif
111
-    #if AXIS_DRIVER_TYPE_Y2(TMC26X)
112
-      _TMC26X_INIT(Y2);
113
-    #endif
114
-    #if AXIS_DRIVER_TYPE_Z(TMC26X)
115
-      _TMC26X_INIT(Z);
116
-    #endif
117
-    #if AXIS_DRIVER_TYPE_Z2(TMC26X)
118
-      _TMC26X_INIT(Z2);
119
-    #endif
120
-    #if AXIS_DRIVER_TYPE_Z3(TMC26X)
121
-      _TMC26X_INIT(Z3);
122
-    #endif
123
-    #if AXIS_DRIVER_TYPE_E0(TMC26X)
124
-      _TMC26X_INIT(E0);
125
-    #endif
126
-    #if AXIS_DRIVER_TYPE_E1(TMC26X)
127
-      _TMC26X_INIT(E1);
128
-    #endif
129
-    #if AXIS_DRIVER_TYPE_E2(TMC26X)
130
-      _TMC26X_INIT(E2);
131
-    #endif
132
-    #if AXIS_DRIVER_TYPE_E3(TMC26X)
133
-      _TMC26X_INIT(E3);
134
-    #endif
135
-    #if AXIS_DRIVER_TYPE_E4(TMC26X)
136
-      _TMC26X_INIT(E4);
137
-    #endif
138
-    #if AXIS_DRIVER_TYPE_E5(TMC26X)
139
-      _TMC26X_INIT(E5);
140
-    #endif
141
-  }
142
-#endif // TMC26X
143
-
144
-#if HAS_TRINAMIC
145
-  #include <HardwareSerial.h>
146
-  #include <SPI.h>
147
-  #include "planner.h"
148
-  #include "../core/enum.h"
149
-
150
-  enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
151
-  #define _TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX])
152
-
153
-  //   IC = TMC model number
154
-  //   ST = Stepper object letter
155
-  //   L  = Label characters
156
-  //   AI = Axis Enum Index
157
-  // SWHW = SW/SH UART selection
158
-  #if ENABLED(TMC_USE_SW_SPI)
159
-    #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
160
-  #else
161
-    #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
162
-  #endif
163
-
164
-  #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(&ST##_HARDWARE_SERIAL, ST##_RSENSE, ST##_SLAVE_ADDRESS)
165
-  #define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_RSENSE, ST##_SLAVE_ADDRESS, ST##_SERIAL_RX_PIN > -1)
41
+//   IC = TMC model number
42
+//   ST = Stepper object letter
43
+//   L  = Label characters
44
+//   AI = Axis Enum Index
45
+// SWHW = SW/SH UART selection
46
+#if ENABLED(TMC_USE_SW_SPI)
47
+  #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, ST##_RSENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
48
+#else
49
+  #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, ST##_RSENSE)
50
+#endif
166 51
 
167
-  #define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
168
-  #define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
52
+#define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(&ST##_HARDWARE_SERIAL, ST##_RSENSE, ST##_SLAVE_ADDRESS)
53
+#define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin<IC##Stepper, L, AI> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_RSENSE, ST##_SLAVE_ADDRESS, ST##_SERIAL_RX_PIN > -1)
169 54
 
170
-  #define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
171
-  #define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS)
55
+#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
56
+#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
172 57
 
173
-  #if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1
174
-    #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
175
-    #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI)
176
-  #else
177
-    #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
178
-    #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E)
179
-  #endif
58
+#define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
59
+#define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS)
180 60
 
181
-  // Stepper objects of TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 steppers used
182
-  #if AXIS_HAS_SPI(X)
183
-    TMC_SPI_DEFINE(X, X);
184
-  #endif
185
-  #if AXIS_HAS_SPI(X2)
186
-    TMC_SPI_DEFINE(X2, X);
187
-  #endif
188
-  #if AXIS_HAS_SPI(Y)
189
-    TMC_SPI_DEFINE(Y, Y);
190
-  #endif
191
-  #if AXIS_HAS_SPI(Y2)
192
-    TMC_SPI_DEFINE(Y2, Y);
193
-  #endif
194
-  #if AXIS_HAS_SPI(Z)
195
-    TMC_SPI_DEFINE(Z, Z);
196
-  #endif
197
-  #if AXIS_HAS_SPI(Z2)
198
-    TMC_SPI_DEFINE(Z2, Z);
199
-  #endif
200
-  #if AXIS_HAS_SPI(Z3)
201
-    TMC_SPI_DEFINE(Z3, Z);
202
-  #endif
203
-  #if AXIS_HAS_SPI(E0)
204
-    TMC_SPI_DEFINE_E(0);
205
-  #endif
206
-  #if AXIS_HAS_SPI(E1)
207
-    TMC_SPI_DEFINE_E(1);
208
-  #endif
209
-  #if AXIS_HAS_SPI(E2)
210
-    TMC_SPI_DEFINE_E(2);
211
-  #endif
212
-  #if AXIS_HAS_SPI(E3)
213
-    TMC_SPI_DEFINE_E(3);
214
-  #endif
215
-  #if AXIS_HAS_SPI(E4)
216
-    TMC_SPI_DEFINE_E(4);
217
-  #endif
218
-  #if AXIS_HAS_SPI(E5)
219
-    TMC_SPI_DEFINE_E(5);
220
-  #endif
61
+#if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1
62
+  #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
63
+  #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI)
64
+#else
65
+  #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
66
+  #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E)
67
+#endif
221 68
 
69
+// Stepper objects of TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 steppers used
70
+#if AXIS_HAS_SPI(X)
71
+  TMC_SPI_DEFINE(X, X);
72
+#endif
73
+#if AXIS_HAS_SPI(X2)
74
+  TMC_SPI_DEFINE(X2, X);
75
+#endif
76
+#if AXIS_HAS_SPI(Y)
77
+  TMC_SPI_DEFINE(Y, Y);
78
+#endif
79
+#if AXIS_HAS_SPI(Y2)
80
+  TMC_SPI_DEFINE(Y2, Y);
81
+#endif
82
+#if AXIS_HAS_SPI(Z)
83
+  TMC_SPI_DEFINE(Z, Z);
84
+#endif
85
+#if AXIS_HAS_SPI(Z2)
86
+  TMC_SPI_DEFINE(Z2, Z);
87
+#endif
88
+#if AXIS_HAS_SPI(Z3)
89
+  TMC_SPI_DEFINE(Z3, Z);
90
+#endif
91
+#if AXIS_HAS_SPI(E0)
92
+  TMC_SPI_DEFINE_E(0);
93
+#endif
94
+#if AXIS_HAS_SPI(E1)
95
+  TMC_SPI_DEFINE_E(1);
96
+#endif
97
+#if AXIS_HAS_SPI(E2)
98
+  TMC_SPI_DEFINE_E(2);
99
+#endif
100
+#if AXIS_HAS_SPI(E3)
101
+  TMC_SPI_DEFINE_E(3);
102
+#endif
103
+#if AXIS_HAS_SPI(E4)
104
+  TMC_SPI_DEFINE_E(4);
105
+#endif
106
+#if AXIS_HAS_SPI(E5)
107
+  TMC_SPI_DEFINE_E(5);
222 108
 #endif
223 109
 
224 110
 #if HAS_DRIVER(TMC2130)
@@ -704,7 +590,7 @@
704 590
   }
705 591
 #endif // TMC5160
706 592
 
707
-void restore_stepper_drivers() {
593
+void restore_trinamic_drivers() {
708 594
   #if AXIS_IS_TMC(X)
709 595
     stepperX.push();
710 596
   #endif
@@ -746,39 +632,28 @@ void restore_stepper_drivers() {
746 632
   #endif
747 633
 }
748 634
 
749
-void reset_stepper_drivers() {
750
-
751
-  #if HAS_DRIVER(TMC26X)
752
-    tmc26x_init_to_defaults();
753
-  #endif
754
-
755
-  #if HAS_DRIVER(L6470)
756
-    L6470.init_to_defaults();
757
-  #endif
758
-
759
-  #if HAS_TRINAMIC
760
-    static constexpr bool stealthchop_by_axis[] = {
761
-      #if ENABLED(STEALTHCHOP_XY)
762
-        true
763
-      #else
764
-        false
765
-      #endif
766
-      ,
767
-      #if ENABLED(STEALTHCHOP_Z)
768
-        true
769
-      #else
770
-        false
771
-      #endif
772
-      ,
773
-      #if ENABLED(STEALTHCHOP_E)
774
-        true
775
-      #else
776
-        false
777
-      #endif
778
-    };
779
-  #endif
635
+void reset_trinamic_drivers() {
636
+  static constexpr bool stealthchop_by_axis[] = {
637
+    #if ENABLED(STEALTHCHOP_XY)
638
+      true
639
+    #else
640
+      false
641
+    #endif
642
+    ,
643
+    #if ENABLED(STEALTHCHOP_Z)
644
+      true
645
+    #else
646
+      false
647
+    #endif
648
+    ,
649
+    #if ENABLED(STEALTHCHOP_E)
650
+      true
651
+    #else
652
+      false
653
+    #endif
654
+  };
780 655
 
781
- #if TMC_USE_CHAIN
656
+  #if TMC_USE_CHAIN
782 657
 
783 658
     enum TMC_axis_enum : unsigned char { _, X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5 };
784 659
     #define __TMC_CHAIN(Q,V) do{ stepper##Q.set_chain_info(Q,V); }while(0)
@@ -942,125 +817,7 @@ void reset_stepper_drivers() {
942 817
     TMC_ADV()
943 818
   #endif
944 819
 
945
-  #if HAS_TRINAMIC
946
-    stepper.set_directions();
947
-  #endif
820
+  stepper.set_directions();
948 821
 }
949 822
 
950
-//
951
-// L6470 Driver objects and inits
952
-//
953
-#if HAS_DRIVER(L6470)
954
-
955
-  // create stepper objects
956
-
957
-  #define _L6470_DEFINE(ST) L6470 stepper##ST((const int)L6470_CHAIN_SS_PIN)
958
-
959
-  // L6470 Stepper objects
960
-  #if AXIS_DRIVER_TYPE_X(L6470)
961
-    _L6470_DEFINE(X);
962
-  #endif
963
-  #if AXIS_DRIVER_TYPE_X2(L6470)
964
-    _L6470_DEFINE(X2);
965
-  #endif
966
-  #if AXIS_DRIVER_TYPE_Y(L6470)
967
-    _L6470_DEFINE(Y);
968
-  #endif
969
-  #if AXIS_DRIVER_TYPE_Y2(L6470)
970
-    _L6470_DEFINE(Y2);
971
-  #endif
972
-  #if AXIS_DRIVER_TYPE_Z(L6470)
973
-    _L6470_DEFINE(Z);
974
-  #endif
975
-  #if AXIS_DRIVER_TYPE_Z2(L6470)
976
-    _L6470_DEFINE(Z2);
977
-  #endif
978
-  #if AXIS_DRIVER_TYPE_Z3(L6470)
979
-    _L6470_DEFINE(Z3);
980
-  #endif
981
-  #if AXIS_DRIVER_TYPE_E0(L6470)
982
-    _L6470_DEFINE(E0);
983
-  #endif
984
-  #if AXIS_DRIVER_TYPE_E1(L6470)
985
-    _L6470_DEFINE(E1);
986
-  #endif
987
-  #if AXIS_DRIVER_TYPE_E2(L6470)
988
-    _L6470_DEFINE(E2);
989
-  #endif
990
-  #if AXIS_DRIVER_TYPE_E3(L6470)
991
-    _L6470_DEFINE(E3);
992
-  #endif
993
-  #if AXIS_DRIVER_TYPE_E4(L6470)
994
-    _L6470_DEFINE(E4);
995
-  #endif
996
-  #if AXIS_DRIVER_TYPE_E5(L6470)
997
-    _L6470_DEFINE(E5);
998
-  #endif
999
-
1000
-  // not using L6470 library's init command because it
1001
-  // briefly sends power to the steppers
1002
-
1003
-  #define _L6470_INIT_CHIP(Q) do{                             \
1004
-    stepper##Q.resetDev();                                    \
1005
-    stepper##Q.softFree();                                    \
1006
-    stepper##Q.SetParam(L6470_CONFIG, CONFIG_PWM_DIV_1        \
1007
-                                    | CONFIG_PWM_MUL_2        \
1008
-                                    | CONFIG_SR_290V_us       \
1009
-                                    | CONFIG_OC_SD_DISABLE    \
1010
-                                    | CONFIG_VS_COMP_DISABLE  \
1011
-                                    | CONFIG_SW_HARD_STOP     \
1012
-                                    | CONFIG_INT_16MHZ);      \
1013
-    stepper##Q.SetParam(L6470_KVAL_RUN, 0xFF);                \
1014
-    stepper##Q.SetParam(L6470_KVAL_ACC, 0xFF);                \
1015
-    stepper##Q.SetParam(L6470_KVAL_DEC, 0xFF);                \
1016
-    stepper##Q.setMicroSteps(Q##_MICROSTEPS);                 \
1017
-    stepper##Q.setOverCurrent(Q##_OVERCURRENT);               \
1018
-    stepper##Q.setStallCurrent(Q##_STALLCURRENT);             \
1019
-    stepper##Q.SetParam(L6470_KVAL_HOLD, Q##_MAX_VOLTAGE);    \
1020
-    stepper##Q.SetParam(L6470_ABS_POS, 0);                    \
1021
-    stepper##Q.getStatus();                                   \
1022
-  }while(0)
1023
-
1024
-  void L6470_Marlin::init_to_defaults() {
1025
-    #if AXIS_DRIVER_TYPE_X(L6470)
1026
-      _L6470_INIT_CHIP(X);
1027
-    #endif
1028
-    #if AXIS_DRIVER_TYPE_X2(L6470)
1029
-      _L6470_INIT_CHIP(X2);
1030
-    #endif
1031
-    #if AXIS_DRIVER_TYPE_Y(L6470)
1032
-      _L6470_INIT_CHIP(Y);
1033
-    #endif
1034
-    #if AXIS_DRIVER_TYPE_Y2(L6470)
1035
-      _L6470_INIT_CHIP(Y2);
1036
-    #endif
1037
-    #if AXIS_DRIVER_TYPE_Z(L6470)
1038
-      _L6470_INIT_CHIP(Z);
1039
-    #endif
1040
-    #if AXIS_DRIVER_TYPE_Z2(L6470)
1041
-      _L6470_INIT_CHIP(Z2);
1042
-    #endif
1043
-    #if AXIS_DRIVER_TYPE_Z3(L6470)
1044
-      _L6470_INIT_CHIP(Z3);
1045
-    #endif
1046
-    #if AXIS_DRIVER_TYPE_E0(L6470)
1047
-      _L6470_INIT_CHIP(E0);
1048
-    #endif
1049
-    #if AXIS_DRIVER_TYPE_E1(L6470)
1050
-      _L6470_INIT_CHIP(E1);
1051
-    #endif
1052
-    #if AXIS_DRIVER_TYPE_E2(L6470)
1053
-      _L6470_INIT_CHIP(E2);
1054
-    #endif
1055
-    #if AXIS_DRIVER_TYPE_E3(L6470)
1056
-      _L6470_INIT_CHIP(E3);
1057
-    #endif
1058
-    #if AXIS_DRIVER_TYPE_E4(L6470)
1059
-      _L6470_INIT_CHIP(E4);
1060
-    #endif
1061
-    #if AXIS_DRIVER_TYPE_E5(L6470)
1062
-      _L6470_INIT_CHIP(E5);
1063
-    #endif
1064
-  }
1065
-
1066
-#endif // L6470
823
+#endif // HAS_TRINAMIC

+ 232
- 0
Marlin/src/module/stepper/trinamic.h ファイルの表示

@@ -0,0 +1,232 @@
1
+/**
2
+ * Marlin 3D Printer Firmware
3
+ * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
+ *
5
+ * Based on Sprinter and grbl.
6
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
+ *
21
+ */
22
+#pragma once
23
+
24
+/**
25
+ * stepper/trinamic.h
26
+ * Stepper driver indirection for Trinamic
27
+ */
28
+
29
+#include <TMCStepper.h>
30
+#if TMCSTEPPER_VERSION < 0x000405
31
+  #error "Update TMCStepper library to 0.4.5 or newer."
32
+#endif
33
+
34
+#include "../../inc/MarlinConfig.h"
35
+#include "../../feature/tmc_util.h"
36
+
37
+#define ____TMC_CLASS(MODEL, A, I, E) TMCMarlin<TMC##MODEL##Stepper, A, I, E>
38
+#define ___TMC_CLASS(MODEL, A, I, E) ____TMC_CLASS(MODEL, A, I, E)
39
+#define __TMC_CLASS(MODEL, A, I, E) ___TMC_CLASS(_##MODEL, A, I, E)
40
+#define _TMC_CLASS(MODEL, L, E) __TMC_CLASS(MODEL, L, E)
41
+#define TMC_CLASS(ST, A) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL, A##_AXIS)
42
+#if ENABLED(DISTINCT_E_FACTORS)
43
+  #define TMC_CLASS_E(I) TMC_CLASS(E##I, E##I)
44
+#else
45
+  #define TMC_CLASS_E(I) TMC_CLASS(E##I, E)
46
+#endif
47
+
48
+typedef struct {
49
+  uint8_t toff;
50
+  int8_t hend;
51
+  uint8_t hstrt;
52
+} chopper_timing_t;
53
+
54
+static constexpr chopper_timing_t chopper_timing = CHOPPER_TIMING;
55
+
56
+#if HAS_TMC220x
57
+  void tmc_serial_begin();
58
+#endif
59
+
60
+void restore_trinamic_drivers();
61
+void reset_trinamic_drivers();
62
+
63
+#define AXIS_HAS_SQUARE_WAVE(A) (AXIS_IS_TMC(A) && ENABLED(SQUARE_WAVE_STEPPING))
64
+
65
+// X Stepper
66
+#if AXIS_IS_TMC(X)
67
+  extern TMC_CLASS(X, X) stepperX;
68
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE)
69
+    #define X_ENABLE_INIT NOOP
70
+    #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0)
71
+    #define X_ENABLE_READ() stepperX.isEnabled()
72
+  #endif
73
+  #if AXIS_HAS_SQUARE_WAVE(X)
74
+    #define X_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X_STEP_PIN); }while(0)
75
+  #endif
76
+#endif
77
+
78
+// Y Stepper
79
+#if AXIS_IS_TMC(Y)
80
+  extern TMC_CLASS(Y, Y) stepperY;
81
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE)
82
+    #define Y_ENABLE_INIT NOOP
83
+    #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0)
84
+    #define Y_ENABLE_READ() stepperY.isEnabled()
85
+  #endif
86
+  #if AXIS_HAS_SQUARE_WAVE(Y)
87
+    #define Y_STEP_WRITE(STATE) do{ if (STATE) TOGGLE(Y_STEP_PIN); }while(0)
88
+  #endif
89
+#endif
90
+
91
+// Z Stepper
92
+#if AXIS_IS_TMC(Z)
93
+  extern TMC_CLASS(Z, Z) stepperZ;
94
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE)
95
+    #define Z_ENABLE_INIT NOOP
96
+    #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0)
97
+    #define Z_ENABLE_READ() stepperZ.isEnabled()
98
+  #endif
99
+  #if AXIS_HAS_SQUARE_WAVE(Z)
100
+    #define Z_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z_STEP_PIN); }while(0)
101
+  #endif
102
+#endif
103
+
104
+// X2 Stepper
105
+#if HAS_X2_ENABLE && AXIS_IS_TMC(X2)
106
+  extern TMC_CLASS(X2, X) stepperX2;
107
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE)
108
+    #define X2_ENABLE_INIT NOOP
109
+    #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0)
110
+    #define X2_ENABLE_READ() stepperX2.isEnabled()
111
+  #endif
112
+  #if AXIS_HAS_SQUARE_WAVE(X2)
113
+    #define X2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X2_STEP_PIN); }while(0)
114
+  #endif
115
+#endif
116
+
117
+// Y2 Stepper
118
+#if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2)
119
+  extern TMC_CLASS(Y2, Y) stepperY2;
120
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE)
121
+    #define Y2_ENABLE_INIT NOOP
122
+    #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0)
123
+    #define Y2_ENABLE_READ() stepperY2.isEnabled()
124
+  #endif
125
+  #if AXIS_HAS_SQUARE_WAVE(Y2)
126
+    #define Y2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Y2_STEP_PIN); }while(0)
127
+  #endif
128
+#endif
129
+
130
+// Z2 Stepper
131
+#if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2)
132
+  extern TMC_CLASS(Z2, Z) stepperZ2;
133
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)
134
+    #define Z2_ENABLE_INIT NOOP
135
+    #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0)
136
+    #define Z2_ENABLE_READ() stepperZ2.isEnabled()
137
+  #endif
138
+  #if AXIS_HAS_SQUARE_WAVE(Z2)
139
+    #define Z2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z2_STEP_PIN); }while(0)
140
+  #endif
141
+#endif
142
+
143
+// Z3 Stepper
144
+#if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3)
145
+  extern TMC_CLASS(Z3, Z) stepperZ3;
146
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE)
147
+    #define Z3_ENABLE_INIT NOOP
148
+    #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0)
149
+    #define Z3_ENABLE_READ() stepperZ3.isEnabled()
150
+  #endif
151
+  #if AXIS_HAS_SQUARE_WAVE(Z3)
152
+    #define Z3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z3_STEP_PIN); }while(0)
153
+  #endif
154
+#endif
155
+
156
+// E0 Stepper
157
+#if AXIS_IS_TMC(E0)
158
+  extern TMC_CLASS_E(0) stepperE0;
159
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)
160
+    #define E0_ENABLE_INIT NOOP
161
+    #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
162
+    #define E0_ENABLE_READ() stepperE0.isEnabled()
163
+  #endif
164
+  #if AXIS_HAS_SQUARE_WAVE(E0)
165
+    #define E0_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E0_STEP_PIN); }while(0)
166
+  #endif
167
+#endif
168
+
169
+// E1 Stepper
170
+#if AXIS_IS_TMC(E1)
171
+  extern TMC_CLASS_E(1) stepperE1;
172
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)
173
+    #define E1_ENABLE_INIT NOOP
174
+    #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
175
+    #define E1_ENABLE_READ() stepperE1.isEnabled()
176
+  #endif
177
+  #if AXIS_HAS_SQUARE_WAVE(E1)
178
+    #define E1_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E1_STEP_PIN); }while(0)
179
+  #endif
180
+#endif
181
+
182
+// E2 Stepper
183
+#if AXIS_IS_TMC(E2)
184
+  extern TMC_CLASS_E(1) stepperE2;
185
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)
186
+    #define E2_ENABLE_INIT NOOP
187
+    #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
188
+    #define E2_ENABLE_READ() stepperE2.isEnabled()
189
+  #endif
190
+  #if AXIS_HAS_SQUARE_WAVE(E2)
191
+    #define E2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E2_STEP_PIN); }while(0)
192
+  #endif
193
+#endif
194
+
195
+// E3 Stepper
196
+#if AXIS_IS_TMC(E3)
197
+  extern TMC_CLASS_E(1) stepperE3;
198
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)
199
+    #define E3_ENABLE_INIT NOOP
200
+    #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
201
+    #define E3_ENABLE_READ() stepperE3.isEnabled()
202
+  #endif
203
+  #if AXIS_HAS_SQUARE_WAVE(E3)
204
+    #define E3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E3_STEP_PIN); }while(0)
205
+  #endif
206
+#endif
207
+
208
+// E4 Stepper
209
+#if AXIS_IS_TMC(E4)
210
+  extern TMC_CLASS_E(1) stepperE4;
211
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)
212
+    #define E4_ENABLE_INIT NOOP
213
+    #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
214
+    #define E4_ENABLE_READ() stepperE4.isEnabled()
215
+  #endif
216
+  #if AXIS_HAS_SQUARE_WAVE(E4)
217
+    #define E4_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E4_STEP_PIN); }while(0)
218
+  #endif
219
+#endif
220
+
221
+// E5 Stepper
222
+#if AXIS_IS_TMC(E5)
223
+  extern TMC_CLASS_E(1) stepperE5;
224
+  #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)
225
+    #define E5_ENABLE_INIT NOOP
226
+    #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
227
+    #define E5_ENABLE_READ() stepperE5.isEnabled()
228
+  #endif
229
+  #if AXIS_HAS_SQUARE_WAVE(E5)
230
+    #define E5_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E5_STEP_PIN); }while(0)
231
+  #endif
232
+#endif

+ 0
- 727
Marlin/src/module/stepper_indirection.h ファイルの表示

@@ -1,727 +0,0 @@
1
-/**
2
- * Marlin 3D Printer Firmware
3
- * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
4
- *
5
- * Based on Sprinter and grbl.
6
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
7
- *
8
- * This program is free software: you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License as published by
10
- * the Free Software Foundation, either version 3 of the License, or
11
- * (at your option) any later version.
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
- * GNU General Public License for more details.
17
- *
18
- * You should have received a copy of the GNU General Public License
19
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
- *
21
- */
22
-#pragma once
23
-
24
-/**
25
- * stepper_indirection.h
26
- *
27
- * Stepper motor driver indirection to allow some stepper functions to
28
- * be done via SPI/I2c instead of direct pin manipulation.
29
- *
30
- * Copyright (c) 2015 Dominik Wenger
31
- */
32
-
33
-#include "../inc/MarlinConfig.h"
34
-
35
-// TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI
36
-#if HAS_DRIVER(TMC26X)
37
-  #include <SPI.h>
38
-  #if defined(STM32GENERIC) && defined(STM32F7)
39
-    #include "../HAL/HAL_STM32_F4_F7/STM32F7/TMC2660.h"
40
-  #else
41
-    #include <TMC26XStepper.h>
42
-  #endif
43
-  void tmc26x_init_to_defaults();
44
-#endif
45
-
46
-#if HAS_TRINAMIC
47
-  #include <TMCStepper.h>
48
-  #include "../feature/tmc_util.h"
49
-  #if TMCSTEPPER_VERSION < 0x000405
50
-    #error "Update TMCStepper library to 0.4.5 or newer."
51
-  #endif
52
-
53
-  #define ____TMC_CLASS(MODEL, A, I, E) TMCMarlin<TMC##MODEL##Stepper, A, I, E>
54
-  #define ___TMC_CLASS(MODEL, A, I, E) ____TMC_CLASS(MODEL, A, I, E)
55
-  #define __TMC_CLASS(MODEL, A, I, E) ___TMC_CLASS(_##MODEL, A, I, E)
56
-  #define _TMC_CLASS(MODEL, L, E) __TMC_CLASS(MODEL, L, E)
57
-  #define TMC_CLASS(ST, A) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL, A##_AXIS)
58
-  #if ENABLED(DISTINCT_E_FACTORS)
59
-    #define TMC_CLASS_E(I) TMC_CLASS(E##I, E##I)
60
-  #else
61
-    #define TMC_CLASS_E(I) TMC_CLASS(E##I, E)
62
-  #endif
63
-
64
-  typedef struct {
65
-    uint8_t toff;
66
-    int8_t hend;
67
-    uint8_t hstrt;
68
-  } chopper_timing_t;
69
-
70
-  static constexpr chopper_timing_t chopper_timing = CHOPPER_TIMING;
71
-
72
-  #if HAS_TMC220x
73
-    void tmc_serial_begin();
74
-  #endif
75
-#endif
76
-
77
-// L6470 has STEP on normal pins, but DIR/ENABLE via SPI
78
-#if HAS_DRIVER(L6470)
79
-  #include "L6470/L6470_Marlin.h"
80
-  #define L6470_WRITE_DIR_COMMAND(STATE,Q) do{ L6470_dir_commands[Q] = (STATE ?  dSPIN_STEP_CLOCK_REV : dSPIN_STEP_CLOCK_FWD); }while(0)
81
-#endif
82
-
83
-void restore_stepper_drivers();  // Called by PSU_ON
84
-void reset_stepper_drivers();    // Called by settings.load / settings.reset
85
-
86
-#define AXIS_HAS_SQUARE_WAVE(A) (AXIS_IS_TMC(A) && ENABLED(SQUARE_WAVE_STEPPING))
87
-
88
-// X Stepper
89
-#if AXIS_DRIVER_TYPE_X(L6470)
90
-  extern L6470 stepperX;
91
-  #define X_ENABLE_INIT NOOP
92
-  #define X_ENABLE_WRITE(STATE) NOOP
93
-  #define X_ENABLE_READ() (stepperX.getStatus() & STATUS_HIZ)
94
-  #define X_DIR_INIT NOOP
95
-  #define X_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,X)
96
-  #define X_DIR_READ() (stepperX.getStatus() & STATUS_DIR)
97
-#else
98
-  #if AXIS_IS_TMC(X)
99
-    extern TMC_CLASS(X, X) stepperX;
100
-  #endif
101
-  #if AXIS_DRIVER_TYPE_X(TMC26X)
102
-    extern TMC26XStepper stepperX;
103
-    #define X_ENABLE_INIT NOOP
104
-    #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
105
-    #define X_ENABLE_READ() stepperX.isEnabled()
106
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)
107
-    #define X_ENABLE_INIT NOOP
108
-    #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0)
109
-    #define X_ENABLE_READ() stepperX.isEnabled()
110
-  #else
111
-    #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
112
-    #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
113
-    #define X_ENABLE_READ() READ(X_ENABLE_PIN)
114
-  #endif
115
-  #define X_DIR_INIT SET_OUTPUT(X_DIR_PIN)
116
-  #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE)
117
-  #define X_DIR_READ() READ(X_DIR_PIN)
118
-#endif
119
-#define X_STEP_INIT SET_OUTPUT(X_STEP_PIN)
120
-#if AXIS_HAS_SQUARE_WAVE(X)
121
-  #define X_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X_STEP_PIN); }while(0)
122
-#else
123
-  #define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE)
124
-#endif
125
-#define X_STEP_READ READ(X_STEP_PIN)
126
-
127
-// Y Stepper
128
-#if AXIS_DRIVER_TYPE_Y(L6470)
129
-  extern L6470 stepperY;
130
-  #define Y_ENABLE_INIT NOOP
131
-  #define Y_ENABLE_WRITE(STATE) NOOP
132
-  #define Y_ENABLE_READ() (stepperY.getStatus() & STATUS_HIZ)
133
-  #define Y_DIR_INIT NOOP
134
-  #define Y_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Y)
135
-  #define Y_DIR_READ() (stepperY.getStatus() & STATUS_DIR)
136
-#else
137
-  #if AXIS_IS_TMC(Y)
138
-    extern TMC_CLASS(Y, Y) stepperY;
139
-  #endif
140
-  #if AXIS_DRIVER_TYPE_Y(TMC26X)
141
-    extern TMC26XStepper stepperY;
142
-    #define Y_ENABLE_INIT NOOP
143
-    #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
144
-    #define Y_ENABLE_READ() stepperY.isEnabled()
145
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y)
146
-    #define Y_ENABLE_INIT NOOP
147
-    #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0)
148
-    #define Y_ENABLE_READ() stepperY.isEnabled()
149
-  #else
150
-    #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
151
-    #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
152
-    #define Y_ENABLE_READ() READ(Y_ENABLE_PIN)
153
-  #endif
154
-  #define Y_DIR_INIT SET_OUTPUT(Y_DIR_PIN)
155
-  #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE)
156
-  #define Y_DIR_READ() READ(Y_DIR_PIN)
157
-#endif
158
-#define Y_STEP_INIT SET_OUTPUT(Y_STEP_PIN)
159
-#if AXIS_HAS_SQUARE_WAVE(Y)
160
-  #define Y_STEP_WRITE(STATE) do{ if (STATE) TOGGLE(Y_STEP_PIN); }while(0)
161
-#else
162
-  #define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE)
163
-#endif
164
-#define Y_STEP_READ READ(Y_STEP_PIN)
165
-
166
-// Z Stepper
167
-#if AXIS_DRIVER_TYPE_Z(L6470)
168
-  extern L6470 stepperZ;
169
-  #define Z_ENABLE_INIT NOOP
170
-  #define Z_ENABLE_WRITE(STATE) NOOP
171
-  #define Z_ENABLE_READ() (stepperZ.getStatus() & STATUS_HIZ)
172
-  #define Z_DIR_INIT NOOP
173
-  #define Z_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z)
174
-  #define Z_DIR_READ() (stepperZ.getStatus() & STATUS_DIR)
175
-#else
176
-  #if AXIS_IS_TMC(Z)
177
-    extern TMC_CLASS(Z, Z) stepperZ;
178
-  #endif
179
-  #if AXIS_DRIVER_TYPE_Z(TMC26X)
180
-    extern TMC26XStepper stepperZ;
181
-    #define Z_ENABLE_INIT NOOP
182
-    #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
183
-    #define Z_ENABLE_READ() stepperZ.isEnabled()
184
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z)
185
-    #define Z_ENABLE_INIT NOOP
186
-    #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0)
187
-    #define Z_ENABLE_READ() stepperZ.isEnabled()
188
-  #else
189
-    #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
190
-    #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
191
-    #define Z_ENABLE_READ() READ(Z_ENABLE_PIN)
192
-  #endif
193
-  #define Z_DIR_INIT SET_OUTPUT(Z_DIR_PIN)
194
-  #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE)
195
-  #define Z_DIR_READ() READ(Z_DIR_PIN)
196
-#endif
197
-#define Z_STEP_INIT SET_OUTPUT(Z_STEP_PIN)
198
-#if AXIS_HAS_SQUARE_WAVE(Z)
199
-  #define Z_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z_STEP_PIN); }while(0)
200
-#else
201
-  #define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE)
202
-#endif
203
-#define Z_STEP_READ READ(Z_STEP_PIN)
204
-
205
-// X2 Stepper
206
-#if HAS_X2_ENABLE
207
-  #if AXIS_DRIVER_TYPE_X2(L6470)
208
-    extern L6470 stepperX2;
209
-    #define X2_ENABLE_INIT NOOP
210
-    #define X2_ENABLE_WRITE(STATE) NOOP
211
-    #define X2_ENABLE_READ() (stepperX2.getStatus() & STATUS_HIZ)
212
-    #define X2_DIR_INIT NOOP
213
-    #define X2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,X2)
214
-    #define X2_DIR_READ() (stepperX2.getStatus() & STATUS_DIR)
215
-  #else
216
-    #if AXIS_IS_TMC(X2)
217
-      extern TMC_CLASS(X2, X) stepperX2;
218
-    #endif
219
-    #if AXIS_DRIVER_TYPE_X2(TMC26X)
220
-      extern TMC26XStepper stepperX2;
221
-      #define X2_ENABLE_INIT NOOP
222
-      #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
223
-      #define X2_ENABLE_READ() stepperX2.isEnabled()
224
-    #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)
225
-      #define X2_ENABLE_INIT NOOP
226
-      #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0)
227
-      #define X2_ENABLE_READ() stepperX2.isEnabled()
228
-    #else
229
-      #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
230
-      #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
231
-      #define X2_ENABLE_READ() READ(X2_ENABLE_PIN)
232
-    #endif
233
-    #define X2_DIR_INIT SET_OUTPUT(X2_DIR_PIN)
234
-    #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE)
235
-    #define X2_DIR_READ() READ(X2_DIR_PIN)
236
-  #endif
237
-  #define X2_STEP_INIT SET_OUTPUT(X2_STEP_PIN)
238
-  #if AXIS_HAS_SQUARE_WAVE(X2)
239
-    #define X2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X2_STEP_PIN); }while(0)
240
-  #else
241
-    #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE)
242
-  #endif
243
-
244
-  #define X2_STEP_READ READ(X2_STEP_PIN)
245
-#endif
246
-
247
-// Y2 Stepper
248
-#if HAS_Y2_ENABLE
249
-  #if AXIS_DRIVER_TYPE_Y2(L6470)
250
-    extern L6470 stepperY2;
251
-    #define Y2_ENABLE_INIT NOOP
252
-    #define Y2_ENABLE_WRITE(STATE) NOOP
253
-    #define Y2_ENABLE_READ() (stepperY2.getStatus() & STATUS_HIZ)
254
-    #define Y2_DIR_INIT NOOP
255
-    #define Y2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Y2)
256
-    #define Y2_DIR_READ() (stepperY2.getStatus() & STATUS_DIR)
257
-  #else
258
-    #if AXIS_IS_TMC(Y2)
259
-      extern TMC_CLASS(Y2, Y) stepperY2;
260
-    #endif
261
-    #if AXIS_DRIVER_TYPE_Y2(TMC26X)
262
-      extern TMC26XStepper stepperY2;
263
-      #define Y2_ENABLE_INIT NOOP
264
-      #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
265
-      #define Y2_ENABLE_READ() stepperY2.isEnabled()
266
-    #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)
267
-      #define Y2_ENABLE_INIT NOOP
268
-      #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0)
269
-      #define Y2_ENABLE_READ() stepperY2.isEnabled()
270
-    #else
271
-      #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
272
-      #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
273
-      #define Y2_ENABLE_READ() READ(Y2_ENABLE_PIN)
274
-    #endif
275
-    #define Y2_DIR_INIT SET_OUTPUT(Y2_DIR_PIN)
276
-    #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE)
277
-    #define Y2_DIR_READ() READ(Y2_DIR_PIN)
278
-  #endif
279
-  #define Y2_STEP_INIT SET_OUTPUT(Y2_STEP_PIN)
280
-  #if AXIS_HAS_SQUARE_WAVE(Y2)
281
-    #define Y2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Y2_STEP_PIN); }while(0)
282
-  #else
283
-    #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE)
284
-  #endif
285
-
286
-  #define Y2_STEP_READ READ(Y2_STEP_PIN)
287
-#else
288
-  #define Y2_DIR_WRITE(STATE) NOOP
289
-#endif
290
-
291
-// Z2 Stepper
292
-#if HAS_Z2_ENABLE
293
-  #if AXIS_DRIVER_TYPE_Z2(L6470)
294
-    extern L6470 stepperZ2;
295
-    #define Z2_ENABLE_INIT NOOP
296
-    #define Z2_ENABLE_WRITE(STATE) NOOP
297
-    #define Z2_ENABLE_READ() (stepperZ2.getStatus() & STATUS_HIZ)
298
-    #define Z2_DIR_INIT NOOP
299
-    #define Z2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z2)
300
-    #define Z2_DIR_READ() (stepperZ2.getStatus() & STATUS_DIR)
301
-  #else
302
-    #if AXIS_IS_TMC(Z2)
303
-      extern TMC_CLASS(Z2, Z) stepperZ2;
304
-    #endif
305
-    #if AXIS_DRIVER_TYPE_Z2(TMC26X)
306
-      extern TMC26XStepper stepperZ2;
307
-      #define Z2_ENABLE_INIT NOOP
308
-      #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
309
-      #define Z2_ENABLE_READ() stepperZ2.isEnabled()
310
-    #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)
311
-      #define Z2_ENABLE_INIT NOOP
312
-      #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0)
313
-      #define Z2_ENABLE_READ() stepperZ2.isEnabled()
314
-    #else
315
-      #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
316
-      #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
317
-      #define Z2_ENABLE_READ() READ(Z2_ENABLE_PIN)
318
-    #endif
319
-    #define Z2_DIR_INIT SET_OUTPUT(Z2_DIR_PIN)
320
-    #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE)
321
-    #define Z2_DIR_READ() READ(Z2_DIR_PIN)
322
-  #endif
323
-  #define Z2_STEP_INIT SET_OUTPUT(Z2_STEP_PIN)
324
-  #if AXIS_HAS_SQUARE_WAVE(Z2)
325
-    #define Z2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z2_STEP_PIN); }while(0)
326
-  #else
327
-    #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE)
328
-  #endif
329
-
330
-  #define Z2_STEP_READ READ(Z2_STEP_PIN)
331
-#else
332
-  #define Z2_DIR_WRITE(STATE) NOOP
333
-#endif
334
-
335
-// Z3 Stepper
336
-#if HAS_Z3_ENABLE
337
-  #if AXIS_DRIVER_TYPE_Z3(L6470)
338
-    extern L6470 stepperZ3;
339
-    #define Z3_ENABLE_INIT NOOP
340
-    #define Z3_ENABLE_WRITE(STATE) NOOP
341
-    #define Z3_ENABLE_READ() (stepperZ3.getStatus() & STATUS_HIZ)
342
-    #define Z3_DIR_INIT NOOP
343
-    #define Z3_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,Z3)
344
-    #define Z3_DIR_READ() (stepperZ3.getStatus() & STATUS_DIR)
345
-  #else
346
-    #if AXIS_IS_TMC(Z3)
347
-      extern TMC_CLASS(Z3, Z) stepperZ3;
348
-    #endif
349
-    #if ENABLED(Z3_IS_TMC26X)
350
-      extern TMC26XStepper stepperZ3;
351
-      #define Z3_ENABLE_INIT NOOP
352
-      #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
353
-      #define Z3_ENABLE_READ() stepperZ3.isEnabled()
354
-    #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z3)
355
-      #define Z3_ENABLE_INIT NOOP
356
-      #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0)
357
-      #define Z3_ENABLE_READ() stepperZ3.isEnabled()
358
-    #else
359
-      #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
360
-      #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
361
-      #define Z3_ENABLE_READ() READ(Z3_ENABLE_PIN)
362
-    #endif
363
-    #define Z3_DIR_INIT SET_OUTPUT(Z3_DIR_PIN)
364
-    #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE)
365
-    #define Z3_DIR_READ() READ(Z3_DIR_PIN)
366
-  #endif
367
-  #define Z3_STEP_INIT SET_OUTPUT(Z3_STEP_PIN)
368
-  #if AXIS_HAS_SQUARE_WAVE(Z3)
369
-    #define Z3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z3_STEP_PIN); }while(0)
370
-  #else
371
-    #define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE)
372
-  #endif
373
-
374
-  #define Z3_STEP_READ READ(Z3_STEP_PIN)
375
-#else
376
-  #define Z3_DIR_WRITE(STATE) NOOP
377
-#endif
378
-
379
-// E0 Stepper
380
-#if AXIS_DRIVER_TYPE_E0(L6470)
381
-  extern L6470 stepperE0;
382
-  #define E0_ENABLE_INIT NOOP
383
-  #define E0_ENABLE_WRITE(STATE) NOOP
384
-  #define E0_ENABLE_READ() (stepperE0.getStatus() & STATUS_HIZ)
385
-  #define E0_DIR_INIT NOOP
386
-  #define E0_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E0)
387
-  #define E0_DIR_READ() (stepperE0.getStatus() & STATUS_DIR)
388
-#else
389
-  #if AXIS_IS_TMC(E0)
390
-    extern TMC_CLASS_E(0) stepperE0;
391
-  #endif
392
-  #if AXIS_DRIVER_TYPE_E0(TMC26X)
393
-    extern TMC26XStepper stepperE0;
394
-    #define E0_ENABLE_INIT NOOP
395
-    #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
396
-    #define E0_ENABLE_READ() stepperE0.isEnabled()
397
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)
398
-    #define E0_ENABLE_INIT NOOP
399
-    #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
400
-    #define E0_ENABLE_READ() stepperE0.isEnabled()
401
-  #else
402
-    #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
403
-    #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
404
-    #define E0_ENABLE_READ() READ(E0_ENABLE_PIN)
405
-  #endif
406
-  #define E0_DIR_INIT SET_OUTPUT(E0_DIR_PIN)
407
-  #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE)
408
-  #define E0_DIR_READ() READ(E0_DIR_PIN)
409
-#endif
410
-#define E0_STEP_INIT SET_OUTPUT(E0_STEP_PIN)
411
-#if AXIS_HAS_SQUARE_WAVE(E0)
412
-  #define E0_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E0_STEP_PIN); }while(0)
413
-#else
414
-  #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE)
415
-#endif
416
-#define E0_STEP_READ READ(E0_STEP_PIN)
417
-
418
-// E1 Stepper
419
-#if AXIS_DRIVER_TYPE_E1(L6470)
420
-  extern L6470 stepperE1;
421
-  #define E1_ENABLE_INIT NOOP
422
-  #define E1_ENABLE_WRITE(STATE) NOOP
423
-  #define E1_ENABLE_READ() (stepperE1.getStatus() & STATUS_HIZ)
424
-  #define E1_DIR_INIT NOOP
425
-  #define E1_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E1)
426
-  #define E1_DIR_READ() (stepperE1.getStatus() & STATUS_DIR)
427
-#else
428
-  #if AXIS_IS_TMC(E1)
429
-    extern TMC_CLASS_E(1) stepperE1;
430
-  #endif
431
-  #if AXIS_DRIVER_TYPE_E1(TMC26X)
432
-    extern TMC26XStepper stepperE1;
433
-    #define E1_ENABLE_INIT NOOP
434
-    #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
435
-    #define E1_ENABLE_READ() stepperE1.isEnabled()
436
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)
437
-    #define E1_ENABLE_INIT NOOP
438
-    #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
439
-    #define E1_ENABLE_READ() stepperE1.isEnabled()
440
-  #else
441
-    #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
442
-    #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
443
-    #define E1_ENABLE_READ() READ(E1_ENABLE_PIN)
444
-  #endif
445
-  #define E1_DIR_INIT SET_OUTPUT(E1_DIR_PIN)
446
-  #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE)
447
-  #define E1_DIR_READ() READ(E1_DIR_PIN)
448
-#endif
449
-#define E1_STEP_INIT SET_OUTPUT(E1_STEP_PIN)
450
-#if AXIS_HAS_SQUARE_WAVE(E1)
451
-  #define E1_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E1_STEP_PIN); }while(0)
452
-#else
453
-  #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE)
454
-#endif
455
-#define E1_STEP_READ READ(E1_STEP_PIN)
456
-
457
-// E2 Stepper
458
-#if AXIS_DRIVER_TYPE_E2(L6470)
459
-  extern L6470 stepperE2;
460
-  #define E2_ENABLE_INIT NOOP
461
-  #define E2_ENABLE_WRITE(STATE) NOOP
462
-  #define E2_ENABLE_READ() (stepperE2.getStatus() & STATUS_HIZ)
463
-  #define E2_DIR_INIT NOOP
464
-  #define E2_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E2)
465
-  #define E2_DIR_READ() (stepperE2.getStatus() & STATUS_DIR)
466
-#else
467
-  #if AXIS_IS_TMC(E2)
468
-    extern TMC_CLASS_E(2) stepperE2;
469
-  #endif
470
-  #if AXIS_DRIVER_TYPE_E2(TMC26X)
471
-    extern TMC26XStepper stepperE2;
472
-    #define E2_ENABLE_INIT NOOP
473
-    #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
474
-    #define E2_ENABLE_READ() stepperE2.isEnabled()
475
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)
476
-    #define E2_ENABLE_INIT NOOP
477
-    #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
478
-    #define E2_ENABLE_READ() stepperE2.isEnabled()
479
-  #else
480
-    #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
481
-    #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
482
-    #define E2_ENABLE_READ() READ(E2_ENABLE_PIN)
483
-  #endif
484
-  #define E2_DIR_INIT SET_OUTPUT(E2_DIR_PIN)
485
-  #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE)
486
-  #define E2_DIR_READ() READ(E2_DIR_PIN)
487
-#endif
488
-#define E2_STEP_INIT SET_OUTPUT(E2_STEP_PIN)
489
-#if AXIS_HAS_SQUARE_WAVE(E2)
490
-  #define E2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E2_STEP_PIN); }while(0)
491
-#else
492
-  #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE)
493
-#endif
494
-#define E2_STEP_READ READ(E2_STEP_PIN)
495
-
496
-// E3 Stepper
497
-#if AXIS_DRIVER_TYPE_E3(L6470)
498
-  extern L6470 stepperE3;
499
-  #define E3_ENABLE_INIT NOOP
500
-  #define E3_ENABLE_WRITE(STATE) NOOP
501
-  #define E3_ENABLE_READ() (stepperE3.getStatus() & STATUS_HIZ)
502
-  #define E3_DIR_INIT NOOP
503
-  #define E3_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E3)
504
-  #define E3_DIR_READ() (stepperE3.getStatus() & STATUS_DIR)
505
-#else
506
-  #if AXIS_IS_TMC(E3)
507
-    extern TMC_CLASS_E(3) stepperE3;
508
-  #endif
509
-  #if AXIS_DRIVER_TYPE_E3(TMC26X)
510
-    extern TMC26XStepper stepperE3;
511
-    #define E3_ENABLE_INIT NOOP
512
-    #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
513
-    #define E3_ENABLE_READ() stepperE3.isEnabled()
514
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)
515
-    #define E3_ENABLE_INIT NOOP
516
-    #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
517
-    #define E3_ENABLE_READ() stepperE3.isEnabled()
518
-  #else
519
-    #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
520
-    #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
521
-    #define E3_ENABLE_READ() READ(E3_ENABLE_PIN)
522
-  #endif
523
-  #define E3_DIR_INIT SET_OUTPUT(E3_DIR_PIN)
524
-  #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE)
525
-  #define E3_DIR_READ() READ(E3_DIR_PIN)
526
-#endif
527
-#define E3_STEP_INIT SET_OUTPUT(E3_STEP_PIN)
528
-#if AXIS_HAS_SQUARE_WAVE(E3)
529
-  #define E3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E3_STEP_PIN); }while(0)
530
-#else
531
-  #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE)
532
-#endif
533
-#define E3_STEP_READ READ(E3_STEP_PIN)
534
-
535
-// E4 Stepper
536
-#if AXIS_DRIVER_TYPE_E4(L6470)
537
-  extern L6470 stepperE4;
538
-  #define E4_ENABLE_INIT NOOP
539
-  #define E4_ENABLE_WRITE(STATE) NOOP
540
-  #define E4_ENABLE_READ() (stepperE4.getStatus() & STATUS_HIZ)
541
-  #define E4_DIR_INIT NOOP
542
-  #define E4_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E4)
543
-  #define E4_DIR_READ() (stepperE4.getStatus() & STATUS_DIR)
544
-#else
545
-  #if AXIS_IS_TMC(E4)
546
-    extern TMC_CLASS_E(4) stepperE4;
547
-  #endif
548
-  #if AXIS_DRIVER_TYPE_E4(TMC26X)
549
-    extern TMC26XStepper stepperE4;
550
-    #define E4_ENABLE_INIT NOOP
551
-    #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
552
-    #define E4_ENABLE_READ() stepperE4.isEnabled()
553
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)
554
-    #define E4_ENABLE_INIT NOOP
555
-    #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
556
-    #define E4_ENABLE_READ() stepperE4.isEnabled()
557
-  #else
558
-    #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
559
-    #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
560
-    #define E4_ENABLE_READ() READ(E4_ENABLE_PIN)
561
-  #endif
562
-  #define E4_DIR_INIT SET_OUTPUT(E4_DIR_PIN)
563
-  #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE)
564
-  #define E4_DIR_READ() READ(E4_DIR_PIN)
565
-#endif
566
-#define E4_STEP_INIT SET_OUTPUT(E4_STEP_PIN)
567
-#if AXIS_HAS_SQUARE_WAVE(E4)
568
-  #define E4_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E4_STEP_PIN); }while(0)
569
-#else
570
-  #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
571
-#endif
572
-#define E4_STEP_READ READ(E4_STEP_PIN)
573
-
574
-// E5 Stepper
575
-#if AXIS_DRIVER_TYPE_E5(L6470)
576
-  extern L6470 stepperE5;
577
-  #define E5_ENABLE_INIT NOOP
578
-  #define E5_ENABLE_WRITE(STATE) NOOP
579
-  #define E5_ENABLE_READ() (stepperE5.getStatus() & STATUS_HIZ)
580
-  #define E5_DIR_INIT NOOP
581
-  #define E5_DIR_WRITE(STATE) L6470_WRITE_DIR_COMMAND(STATE,E5)
582
-  #define E5_DIR_READ() (stepperE5.getStatus() & STATUS_DIR)
583
-#else
584
-  #if AXIS_IS_TMC(E5)
585
-    extern TMC_CLASS_E(5) stepperE5;
586
-  #endif
587
-  #if AXIS_DRIVER_TYPE_E5(TMC26X)
588
-    extern TMC26XStepper stepperE5;
589
-    #define E5_ENABLE_INIT NOOP
590
-    #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
591
-    #define E5_ENABLE_READ() stepperE5.isEnabled()
592
-  #elif ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)
593
-    #define E5_ENABLE_INIT NOOP
594
-    #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0)
595
-    #define E5_ENABLE_READ() stepperE5.isEnabled()
596
-  #else
597
-    #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
598
-    #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
599
-    #define E5_ENABLE_READ() READ(E5_ENABLE_PIN)
600
-  #endif
601
-  #define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN)
602
-  #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE)
603
-  #define E5_DIR_READ() READ(E5_DIR_PIN)
604
-#endif
605
-#define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN)
606
-#if AXIS_HAS_SQUARE_WAVE(E5)
607
-  #define E5_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E5_STEP_PIN); }while(0)
608
-#else
609
-  #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE)
610
-#endif
611
-#define E5_STEP_READ READ(E5_STEP_PIN)
612
-
613
-/**
614
- * Extruder indirection for the single E axis
615
- */
616
-#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
617
-  #if EXTRUDERS > 5
618
-    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
619
-    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); case 5: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
620
-    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); case 5: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
621
-  #elif EXTRUDERS > 4
622
-    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
623
-    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
624
-    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
625
-  #elif EXTRUDERS > 3
626
-    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
627
-    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
628
-    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
629
-  #elif EXTRUDERS > 2
630
-    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
631
-    #define   NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
632
-    #define    REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
633
-  #else
634
-    #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
635
-    #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(E ?  INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
636
-    #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR :  INVERT_E0_DIR); }while(0)
637
-  #endif
638
-#elif ENABLED(PRUSA_MMU2)
639
-  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
640
-  #define   NORM_E_DIR(E)   E0_DIR_WRITE(!INVERT_E0_DIR)
641
-  #define    REV_E_DIR(E)   E0_DIR_WRITE( INVERT_E0_DIR)
642
-
643
-#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index
644
-  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
645
-  #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR:  INVERT_E0_DIR); }while(0)
646
-  #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ?  INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
647
-
648
-#elif E_STEPPERS > 1
649
-
650
-  #if E_STEPPERS > 5
651
-    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); case 5: E5_STEP_WRITE(V); } }while(0)
652
-    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); case 5: E5_DIR_WRITE(!INVERT_E5_DIR); } }while(0)
653
-    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); case 5: E5_DIR_WRITE( INVERT_E5_DIR); } }while(0)
654
-  #elif E_STEPPERS > 4
655
-    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0)
656
-    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0)
657
-    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); } }while(0)
658
-  #elif E_STEPPERS > 3
659
-    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); } }while(0)
660
-    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0)
661
-    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); } }while(0)
662
-  #elif E_STEPPERS > 2
663
-    #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0)
664
-    #define   _NORM_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
665
-    #define    _REV_E_DIR(E)   do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
666
-  #else
667
-    #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
668
-    #define   _NORM_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
669
-    #define    _REV_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
670
-  #endif
671
-
672
-  #if HAS_DUPLICATION_MODE
673
-
674
-    #if ENABLED(MULTI_NOZZLE_DUPLICATION)
675
-      #define _DUPE(N,T,V)  do{ if (TEST(duplication_e_mask, N)) E##N##_##T##_WRITE(V); }while(0)
676
-    #else
677
-      #define _DUPE(N,T,V)  E##N##_##T##_WRITE(V)
678
-    #endif
679
-
680
-    #define NDIR(N) _DUPE(N,DIR,!INVERT_E##N##_DIR)
681
-    #define RDIR(N) _DUPE(N,DIR, INVERT_E##N##_DIR)
682
-
683
-    #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { DUPE(STEP,V); } else _E_STEP_WRITE(E,V); }while(0)
684
-
685
-    #if E_STEPPERS > 2
686
-      #if E_STEPPERS > 5
687
-        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); }while(0)
688
-        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); } else _NORM_E_DIR(E); }while(0)
689
-        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); } else  _REV_E_DIR(E); }while(0)
690
-      #elif E_STEPPERS > 4
691
-        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); }while(0)
692
-        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); } else _NORM_E_DIR(E); }while(0)
693
-        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); } else  _REV_E_DIR(E); }while(0)
694
-      #elif E_STEPPERS > 3
695
-        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); }while(0)
696
-        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); } else _NORM_E_DIR(E); }while(0)
697
-        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); } else  _REV_E_DIR(E); }while(0)
698
-      #else
699
-        #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); }while(0)
700
-        #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); } else _NORM_E_DIR(E); }while(0)
701
-        #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); } else  _REV_E_DIR(E); }while(0)
702
-      #endif
703
-    #else
704
-      #define DUPE(T,V)     do{ _DUPE(0,T,V); _DUPE(1,T,V); }while(0)
705
-      #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); } else _NORM_E_DIR(E); }while(0)
706
-      #define REV_E_DIR(E)  do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); } else  _REV_E_DIR(E); }while(0)
707
-    #endif
708
-
709
-  #else
710
-
711
-    #define E_STEP_WRITE(E,V) _E_STEP_WRITE(E,V)
712
-    #define   NORM_E_DIR(E)   _NORM_E_DIR(E)
713
-    #define    REV_E_DIR(E)   _REV_E_DIR(E)
714
-
715
-  #endif
716
-
717
-#elif E_STEPPERS
718
-  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
719
-  #define   NORM_E_DIR(E)   E0_DIR_WRITE(!INVERT_E0_DIR)
720
-  #define    REV_E_DIR(E)   E0_DIR_WRITE( INVERT_E0_DIR)
721
-
722
-#else
723
-  #define E_STEP_WRITE(E,V) NOOP
724
-  #define   NORM_E_DIR(E)   NOOP
725
-  #define    REV_E_DIR(E)   NOOP
726
-
727
-#endif

読み込み中…
キャンセル
保存