Subversion Repositories MK-Marlin

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ron 1
/**
2
 * Marlin 3D Printer Firmware
3
 * Copyright (C) 2016 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.h - stepper motor driver indirection macros
25
 * to allow some stepper functions to be done via SPI/I2c instead of direct pin manipulation
26
 * Part of Marlin
27
 *
28
 * Copyright (c) 2015 Dominik Wenger
29
 *
30
 * Marlin is free software: you can redistribute it and/or modify
31
 * it under the terms of the GNU General Public License as published by
32
 * the Free Software Foundation, either version 3 of the License, or
33
 * at your option) any later version.
34
 *
35
 * Marlin is distributed in the hope that it will be useful,
36
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38
 * GNU General Public License for more details.
39
 *
40
 * You should have received a copy of the GNU General Public License
41
 * along with Marlin.  If not, see <http://www.gnu.org/licenses/>.
42
 */
43
 
44
#ifndef STEPPER_INDIRECTION_H
45
#define STEPPER_INDIRECTION_H
46
 
47
#include "MarlinConfig.h"
48
 
49
// TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI
50
#if HAS_DRIVER(TMC26X)
51
  #include <SPI.h>
52
  #include <TMC26XStepper.h>
53
  void tmc26x_init_to_defaults();
54
#endif
55
 
56
#if HAS_DRIVER(TMC2130)
57
  #include <TMC2130Stepper.h>
58
  void tmc2130_init_to_defaults();
59
#endif
60
 
61
#if HAS_DRIVER(TMC2208)
62
  #include <TMC2208Stepper.h>
63
  void tmc2208_serial_begin();
64
  void tmc2208_init_to_defaults();
65
#endif
66
 
67
// L6470 has STEP on normal pins, but DIR/ENABLE via SPI
68
#if HAS_DRIVER(L6470)
69
  #include <SPI.h>
70
  #include <L6470.h>
71
  void L6470_init_to_defaults();
72
#endif
73
 
74
void restore_stepper_drivers();  // Called by PSU_ON
75
void reset_stepper_drivers();    // Called by settings.load / settings.reset
76
 
77
// X Stepper
78
#if AXIS_DRIVER_TYPE(X, L6470)
79
  extern L6470 stepperX;
80
  #define X_ENABLE_INIT NOOP
81
  #define X_ENABLE_WRITE(STATE) do{ if (STATE) stepperX.Step_Clock(stepperX.getStatus() & STATUS_HIZ); else stepperX.softFree(); }while(0)
82
  #define X_ENABLE_READ (stepperX.getStatus() & STATUS_HIZ)
83
  #define X_DIR_INIT NOOP
84
  #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
85
  #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
86
#else
87
  #if AXIS_DRIVER_TYPE(X, TMC26X)
88
    extern TMC26XStepper stepperX;
89
    #define X_ENABLE_INIT NOOP
90
    #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
91
    #define X_ENABLE_READ stepperX.isEnabled()
92
  #else
93
    #if AXIS_DRIVER_TYPE(X, TMC2130)
94
      extern TMC2130Stepper stepperX;
95
    #elif AXIS_DRIVER_TYPE(X, TMC2208)
96
      extern TMC2208Stepper stepperX;
97
    #endif
98
    #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
99
    #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
100
    #define X_ENABLE_READ READ(X_ENABLE_PIN)
101
  #endif
102
  #define X_DIR_INIT SET_OUTPUT(X_DIR_PIN)
103
  #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE)
104
  #define X_DIR_READ READ(X_DIR_PIN)
105
#endif
106
#define X_STEP_INIT SET_OUTPUT(X_STEP_PIN)
107
#define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE)
108
#define X_STEP_READ READ(X_STEP_PIN)
109
 
110
// Y Stepper
111
#if AXIS_DRIVER_TYPE(Y, L6470)
112
  extern L6470 stepperY;
113
  #define Y_ENABLE_INIT NOOP
114
  #define Y_ENABLE_WRITE(STATE) do{ if (STATE) stepperY.Step_Clock(stepperY.getStatus() & STATUS_HIZ); else stepperY.softFree(); }while(0)
115
  #define Y_ENABLE_READ (stepperY.getStatus() & STATUS_HIZ)
116
  #define Y_DIR_INIT NOOP
117
  #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
118
  #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
119
#else
120
  #if AXIS_DRIVER_TYPE(Y, TMC26X)
121
    extern TMC26XStepper stepperY;
122
    #define Y_ENABLE_INIT NOOP
123
    #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
124
    #define Y_ENABLE_READ stepperY.isEnabled()
125
  #else
126
    #if AXIS_DRIVER_TYPE(Y, TMC2130)
127
      extern TMC2130Stepper stepperY;
128
    #elif AXIS_DRIVER_TYPE(Y, TMC2208)
129
      extern TMC2208Stepper stepperY;
130
    #endif
131
    #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
132
    #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
133
    #define Y_ENABLE_READ READ(Y_ENABLE_PIN)
134
  #endif
135
  #define Y_DIR_INIT SET_OUTPUT(Y_DIR_PIN)
136
  #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE)
137
  #define Y_DIR_READ READ(Y_DIR_PIN)
138
#endif
139
#define Y_STEP_INIT SET_OUTPUT(Y_STEP_PIN)
140
#define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE)
141
#define Y_STEP_READ READ(Y_STEP_PIN)
142
 
143
// Z Stepper
144
#if AXIS_DRIVER_TYPE(Z, L6470)
145
  extern L6470 stepperZ;
146
  #define Z_ENABLE_INIT NOOP
147
  #define Z_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ.Step_Clock(stepperZ.getStatus() & STATUS_HIZ); else stepperZ.softFree(); }while(0)
148
  #define Z_ENABLE_READ (stepperZ.getStatus() & STATUS_HIZ)
149
  #define Z_DIR_INIT NOOP
150
  #define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE)
151
  #define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR)
152
#else
153
  #if AXIS_DRIVER_TYPE(Z, TMC26X)
154
    extern TMC26XStepper stepperZ;
155
    #define Z_ENABLE_INIT NOOP
156
    #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
157
    #define Z_ENABLE_READ stepperZ.isEnabled()
158
  #else
159
    #if AXIS_DRIVER_TYPE(Z, TMC2130)
160
      extern TMC2130Stepper stepperZ;
161
    #elif AXIS_DRIVER_TYPE(Z, TMC2208)
162
      extern TMC2208Stepper stepperZ;
163
    #endif
164
    #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
165
    #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
166
    #define Z_ENABLE_READ READ(Z_ENABLE_PIN)
167
  #endif
168
  #define Z_DIR_INIT SET_OUTPUT(Z_DIR_PIN)
169
  #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE)
170
  #define Z_DIR_READ READ(Z_DIR_PIN)
171
#endif
172
#define Z_STEP_INIT SET_OUTPUT(Z_STEP_PIN)
173
#define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE)
174
#define Z_STEP_READ READ(Z_STEP_PIN)
175
 
176
// X2 Stepper
177
#if HAS_X2_ENABLE
178
  #if AXIS_DRIVER_TYPE(X2, L6470)
179
    extern L6470 stepperX2;
180
    #define X2_ENABLE_INIT NOOP
181
    #define X2_ENABLE_WRITE(STATE) do{ if (STATE) stepperX2.Step_Clock(stepperX2.getStatus() & STATUS_HIZ); else stepperX2.softFree(); }while(0)
182
    #define X2_ENABLE_READ (stepperX2.getStatus() & STATUS_HIZ)
183
    #define X2_DIR_INIT NOOP
184
    #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
185
    #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
186
  #else
187
    #if AXIS_DRIVER_TYPE(X2, TMC26X)
188
      extern TMC26XStepper stepperX2;
189
      #define X2_ENABLE_INIT NOOP
190
      #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
191
      #define X2_ENABLE_READ stepperX2.isEnabled()
192
    #else
193
      #if AXIS_DRIVER_TYPE(X2, TMC2130)
194
        extern TMC2130Stepper stepperX2;
195
      #elif AXIS_DRIVER_TYPE(X2, TMC2208)
196
        extern TMC2208Stepper stepperX2;
197
      #endif
198
      #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
199
      #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
200
      #define X2_ENABLE_READ READ(X2_ENABLE_PIN)
201
    #endif
202
    #define X2_DIR_INIT SET_OUTPUT(X2_DIR_PIN)
203
    #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE)
204
    #define X2_DIR_READ READ(X2_DIR_PIN)
205
  #endif
206
  #define X2_STEP_INIT SET_OUTPUT(X2_STEP_PIN)
207
  #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE)
208
  #define X2_STEP_READ READ(X2_STEP_PIN)
209
#endif
210
 
211
// Y2 Stepper
212
#if HAS_Y2_ENABLE
213
  #if AXIS_DRIVER_TYPE(Y2, L6470)
214
    extern L6470 stepperY2;
215
    #define Y2_ENABLE_INIT NOOP
216
    #define Y2_ENABLE_WRITE(STATE) do{ if (STATE) stepperY2.Step_Clock(stepperY2.getStatus() & STATUS_HIZ); else stepperY2.softFree(); }while(0)
217
    #define Y2_ENABLE_READ (stepperY2.getStatus() & STATUS_HIZ)
218
    #define Y2_DIR_INIT NOOP
219
    #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
220
    #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
221
  #else
222
    #if AXIS_DRIVER_TYPE(Y2, TMC26X)
223
      extern TMC26XStepper stepperY2;
224
      #define Y2_ENABLE_INIT NOOP
225
      #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
226
      #define Y2_ENABLE_READ stepperY2.isEnabled()
227
    #else
228
      #if AXIS_DRIVER_TYPE(Y2, TMC2130)
229
        extern TMC2130Stepper stepperY2;
230
      #elif AXIS_DRIVER_TYPE(Y2, TMC2208)
231
        extern TMC2208Stepper stepperY2;
232
      #endif
233
      #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
234
      #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
235
      #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN)
236
    #endif
237
    #define Y2_DIR_INIT SET_OUTPUT(Y2_DIR_PIN)
238
    #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE)
239
    #define Y2_DIR_READ READ(Y2_DIR_PIN)
240
  #endif
241
  #define Y2_STEP_INIT SET_OUTPUT(Y2_STEP_PIN)
242
  #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE)
243
  #define Y2_STEP_READ READ(Y2_STEP_PIN)
244
#endif
245
 
246
// Z2 Stepper
247
#if HAS_Z2_ENABLE
248
  #if AXIS_DRIVER_TYPE(Z2, L6470)
249
    extern L6470 stepperZ2;
250
    #define Z2_ENABLE_INIT NOOP
251
    #define Z2_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ2.Step_Clock(stepperZ2.getStatus() & STATUS_HIZ); else stepperZ2.softFree(); }while(0)
252
    #define Z2_ENABLE_READ (stepperZ2.getStatus() & STATUS_HIZ)
253
    #define Z2_DIR_INIT NOOP
254
    #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
255
    #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
256
  #else
257
    #if AXIS_DRIVER_TYPE(Z2, TMC26X)
258
      extern TMC26XStepper stepperZ2;
259
      #define Z2_ENABLE_INIT NOOP
260
      #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
261
      #define Z2_ENABLE_READ stepperZ2.isEnabled()
262
    #else
263
      #if AXIS_DRIVER_TYPE(Z2, TMC2130)
264
        extern TMC2130Stepper stepperZ2;
265
      #elif AXIS_DRIVER_TYPE(Z2, TMC2208)
266
        extern TMC2208Stepper stepperZ2;
267
      #endif
268
      #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
269
      #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
270
      #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN)
271
    #endif
272
    #define Z2_DIR_INIT SET_OUTPUT(Z2_DIR_PIN)
273
    #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE)
274
    #define Z2_DIR_READ READ(Z2_DIR_PIN)
275
  #endif
276
  #define Z2_STEP_INIT SET_OUTPUT(Z2_STEP_PIN)
277
  #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE)
278
  #define Z2_STEP_READ READ(Z2_STEP_PIN)
279
#endif
280
 
281
// E0 Stepper
282
#if AXIS_DRIVER_TYPE(E0, L6470)
283
  extern L6470 stepperE0;
284
  #define E0_ENABLE_INIT NOOP
285
  #define E0_ENABLE_WRITE(STATE) do{ if (STATE) stepperE0.Step_Clock(stepperE0.getStatus() & STATUS_HIZ); else stepperE0.softFree(); }while(0)
286
  #define E0_ENABLE_READ (stepperE0.getStatus() & STATUS_HIZ)
287
  #define E0_DIR_INIT NOOP
288
  #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
289
  #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
290
#else
291
  #if AXIS_DRIVER_TYPE(E0, TMC26X)
292
    extern TMC26XStepper stepperE0;
293
    #define E0_ENABLE_INIT NOOP
294
    #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
295
    #define E0_ENABLE_READ stepperE0.isEnabled()
296
  #else
297
    #if AXIS_DRIVER_TYPE(E0, TMC2130)
298
      extern TMC2130Stepper stepperE0;
299
    #elif AXIS_DRIVER_TYPE(E0, TMC2208)
300
      extern TMC2208Stepper stepperE0;
301
    #endif
302
    #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
303
    #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
304
    #define E0_ENABLE_READ READ(E0_ENABLE_PIN)
305
  #endif
306
  #define E0_DIR_INIT SET_OUTPUT(E0_DIR_PIN)
307
  #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE)
308
  #define E0_DIR_READ READ(E0_DIR_PIN)
309
#endif
310
#define E0_STEP_INIT SET_OUTPUT(E0_STEP_PIN)
311
#define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE)
312
#define E0_STEP_READ READ(E0_STEP_PIN)
313
 
314
// E1 Stepper
315
#if AXIS_DRIVER_TYPE(E1, L6470)
316
  extern L6470 stepperE1;
317
  #define E1_ENABLE_INIT NOOP
318
  #define E1_ENABLE_WRITE(STATE) do{ if (STATE) stepperE1.Step_Clock(stepperE1.getStatus() & STATUS_HIZ); else stepperE1.softFree(); }while(0)
319
  #define E1_ENABLE_READ (stepperE1.getStatus() & STATUS_HIZ)
320
  #define E1_DIR_INIT NOOP
321
  #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
322
  #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
323
#else
324
  #if AXIS_DRIVER_TYPE(E1, TMC26X)
325
    extern TMC26XStepper stepperE1;
326
    #define E1_ENABLE_INIT NOOP
327
    #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
328
    #define E1_ENABLE_READ stepperE1.isEnabled()
329
  #else
330
    #if AXIS_DRIVER_TYPE(E1, TMC2130)
331
      extern TMC2130Stepper stepperE1;
332
    #elif AXIS_DRIVER_TYPE(E1, TMC2208)
333
      extern TMC2208Stepper stepperE1;
334
    #endif
335
    #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
336
    #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
337
    #define E1_ENABLE_READ READ(E1_ENABLE_PIN)
338
  #endif
339
  #define E1_DIR_INIT SET_OUTPUT(E1_DIR_PIN)
340
  #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE)
341
  #define E1_DIR_READ READ(E1_DIR_PIN)
342
#endif
343
#define E1_STEP_INIT SET_OUTPUT(E1_STEP_PIN)
344
#define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE)
345
#define E1_STEP_READ READ(E1_STEP_PIN)
346
 
347
// E2 Stepper
348
#if AXIS_DRIVER_TYPE(E2, L6470)
349
  extern L6470 stepperE2;
350
  #define E2_ENABLE_INIT NOOP
351
  #define E2_ENABLE_WRITE(STATE) do{ if (STATE) stepperE2.Step_Clock(stepperE2.getStatus() & STATUS_HIZ); else stepperE2.softFree(); }while(0)
352
  #define E2_ENABLE_READ (stepperE2.getStatus() & STATUS_HIZ)
353
  #define E2_DIR_INIT NOOP
354
  #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
355
  #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
356
#else
357
  #if AXIS_DRIVER_TYPE(E2, TMC26X)
358
    extern TMC26XStepper stepperE2;
359
    #define E2_ENABLE_INIT NOOP
360
    #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
361
    #define E2_ENABLE_READ stepperE2.isEnabled()
362
  #else
363
    #if AXIS_DRIVER_TYPE(E2, TMC2130)
364
      extern TMC2130Stepper stepperE2;
365
    #elif AXIS_DRIVER_TYPE(E2, TMC2208)
366
      extern TMC2208Stepper stepperE2;
367
    #endif
368
    #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
369
    #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
370
    #define E2_ENABLE_READ READ(E2_ENABLE_PIN)
371
  #endif
372
  #define E2_DIR_INIT SET_OUTPUT(E2_DIR_PIN)
373
  #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE)
374
  #define E2_DIR_READ READ(E2_DIR_PIN)
375
#endif
376
#define E2_STEP_INIT SET_OUTPUT(E2_STEP_PIN)
377
#define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE)
378
#define E2_STEP_READ READ(E2_STEP_PIN)
379
 
380
// E3 Stepper
381
#if AXIS_DRIVER_TYPE(E3, L6470)
382
  extern L6470 stepperE3;
383
  #define E3_ENABLE_INIT NOOP
384
  #define E3_ENABLE_WRITE(STATE) do{ if (STATE) stepperE3.Step_Clock(stepperE3.getStatus() & STATUS_HIZ); else stepperE3.softFree(); }while(0)
385
  #define E3_ENABLE_READ (stepperE3.getStatus() & STATUS_HIZ)
386
  #define E3_DIR_INIT NOOP
387
  #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
388
  #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
389
#else
390
  #if AXIS_DRIVER_TYPE(E3, TMC26X)
391
    extern TMC26XStepper stepperE3;
392
    #define E3_ENABLE_INIT NOOP
393
    #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
394
    #define E3_ENABLE_READ stepperE3.isEnabled()
395
  #else
396
    #if AXIS_DRIVER_TYPE(E3, TMC2130)
397
      extern TMC2130Stepper stepperE3;
398
    #elif AXIS_DRIVER_TYPE(E3, TMC2208)
399
      extern TMC2208Stepper stepperE3;
400
    #endif
401
    #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
402
    #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
403
    #define E3_ENABLE_READ READ(E3_ENABLE_PIN)
404
  #endif
405
  #define E3_DIR_INIT SET_OUTPUT(E3_DIR_PIN)
406
  #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE)
407
  #define E3_DIR_READ READ(E3_DIR_PIN)
408
#endif
409
#define E3_STEP_INIT SET_OUTPUT(E3_STEP_PIN)
410
#define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE)
411
#define E3_STEP_READ READ(E3_STEP_PIN)
412
 
413
// E4 Stepper
414
#if AXIS_DRIVER_TYPE(E4, L6470)
415
  extern L6470 stepperE4;
416
  #define E4_ENABLE_INIT NOOP
417
  #define E4_ENABLE_WRITE(STATE) do{ if (STATE) stepperE4.Step_Clock(stepperE4.getStatus() & STATUS_HIZ); else stepperE4.softFree(); }while(0)
418
  #define E4_ENABLE_READ (stepperE4.getStatus() & STATUS_HIZ)
419
  #define E4_DIR_INIT NOOP
420
  #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
421
  #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
422
#else
423
  #if AXIS_DRIVER_TYPE(E4, TMC26X)
424
    extern TMC26XStepper stepperE4;
425
    #define E4_ENABLE_INIT NOOP
426
    #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
427
    #define E4_ENABLE_READ stepperE4.isEnabled()
428
  #else
429
    #if AXIS_DRIVER_TYPE(E4, TMC2130)
430
      extern TMC2130Stepper stepperE4;
431
    #elif AXIS_DRIVER_TYPE(E4, TMC2208)
432
      extern TMC2208Stepper stepperE4;
433
    #endif
434
    #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
435
    #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
436
    #define E4_ENABLE_READ READ(E4_ENABLE_PIN)
437
  #endif
438
  #define E4_DIR_INIT SET_OUTPUT(E4_DIR_PIN)
439
  #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE)
440
  #define E4_DIR_READ READ(E4_DIR_PIN)
441
#endif
442
#define E4_STEP_INIT SET_OUTPUT(E4_STEP_PIN)
443
#define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
444
#define E4_STEP_READ READ(E4_STEP_PIN)
445
 
446
/**
447
 * Extruder indirection for the single E axis
448
 */
449
#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
450
  #if EXTRUDERS > 4
451
    #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)
452
    #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)
453
    #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)
454
  #elif EXTRUDERS > 3
455
    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
456
    #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)
457
    #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)
458
  #elif EXTRUDERS > 2
459
    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
460
    #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)
461
    #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)
462
  #else
463
    #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
464
    #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(E ?  INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
465
    #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR :  INVERT_E0_DIR); }while(0)
466
  #endif
467
#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index
468
  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
469
  #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR:  INVERT_E0_DIR); }while(0)
470
  #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ?  INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
471
#elif E_STEPPERS > 4
472
  #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)
473
  #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)
474
  #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)
475
#elif E_STEPPERS > 3
476
  #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)
477
  #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)
478
  #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)
479
#elif E_STEPPERS > 2
480
  #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)
481
  #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)
482
  #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)
483
#elif E_STEPPERS > 1
484
  #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE)
485
    #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } else if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
486
    #define   NORM_E_DIR(E)   do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
487
    #define    REV_E_DIR(E)   do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
488
  #else
489
    #define E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
490
    #define   NORM_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
491
    #define    REV_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
492
  #endif
493
#else
494
  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
495
  #define   NORM_E_DIR(E)   E0_DIR_WRITE(!INVERT_E0_DIR)
496
  #define    REV_E_DIR(E)   E0_DIR_WRITE( INVERT_E0_DIR)
497
#endif
498
 
499
#endif // STEPPER_INDIRECTION_H