grblHAL core  20250320
motor_pins.h
Go to the documentation of this file.
1 /*
2  motor_pins.h - pin mappings resolver for ganged/squared/ABC axes
3 
4  NOTE: This file is not used by the core, it may be used by drivers to simplify board map files
5 
6  Part of grblHAL
7 
8  Copyright (c) 2021-2025 Terje Io
9 
10  grblHAL is free software: you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  grblHAL is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
22 */
23 
24 #pragma once
25 
26 #if N_GANGED
27 
28 #if N_GANGED > N_ABC_MOTORS
29 #error "Axis configuration is not supported!"
30 #endif
31 
32 #if N_AUTO_SQUARED
33 #define SQUARING_ENABLED
34 #endif
35 
36 #if N_GANGED
37 #define GANGING_ENABLED
38 #endif
39 
40 #if Z_GANGED
41 #define Z_DOUBLED N_ABC_MOTORS
42 #elif Y_GANGED
43 #define Y_DOUBLED N_ABC_MOTORS
44 #elif X_GANGED
45 #define X_DOUBLED N_ABC_MOTORS
46 #endif
47 
48 #if Y_GANGED && !defined(Y_DOUBLED)
49 #define Y_DOUBLED (N_ABC_MOTORS - 1)
50 #elif X_GANGED && !defined(X_DOUBLED)
51 #define X_DOUBLED (N_ABC_MOTORS - 1)
52 #endif
53 
54 #if X_GANGED && !defined(X_DOUBLED)
55 #define X_DOUBLED (N_ABC_MOTORS - 2)
56 #endif
57 
58 #if X_DOUBLED == 1
59 
60 #ifdef A_AXIS
61 #error "A-axis motor is used for ganged X motor"
62 #endif
63 #define X2_STEP_PORT M3_STEP_PORT
64 #define X2_STEP_PIN M3_STEP_PIN
65 #define X2_STEP_BIT (1<<M3_STEP_PIN)
66 #define X2_DIRECTION_PORT M3_DIRECTION_PORT
67 #define X2_DIRECTION_PIN M3_DIRECTION_PIN
68 #define X2_DIRECTION_BIT (1<<M3_DIRECTION_PIN)
69 #ifdef M3_HOME_PIN
70  #if X_AUTO_SQUARE
71  #define X2_HOME_PORT M3_HOME_PORT
72  #define X2_HOME_PIN M3_HOME_PIN
73  #define X2_HOME_BIT (1<<M3_HOME_PIN)
74  #endif
75 #elif X_AUTO_SQUARE && defined(X_HOME_PIN)
76  #error "Auto squared X-axis requires second home pin input"
77 #endif
78 #ifdef M3_LIMIT_PIN
79  #if X_AUTO_SQUARE
80  #define X2_LIMIT_PORT M3_LIMIT_PORT
81  #define X2_LIMIT_PIN M3_LIMIT_PIN
82  #define X2_LIMIT_BIT (1<<M3_LIMIT_PIN)
83  #elif X_GANGED_LIM_MAX && !defined(M3_LIMIT_PIN_MAX)
84  #define X_LIMIT_PORT_MAX M3_LIMIT_PORT
85  #define X_LIMIT_PIN_MAX M3_LIMIT_PIN
86  #define X_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN)
87  #endif
88 #elif X_AUTO_SQUARE
89  #error "Auto squared X-axis requires second limit pin input"
90 #endif
91 #ifdef M3_LIMIT_PIN_MAX
92  #define X_LIMIT_PORT_MAX M3_LIMIT_PORT_MAX
93  #define X_LIMIT_PIN_MAX M3_LIMIT_PIN_MAX
94  #define X_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN_MAX)
95 #endif
96 #ifdef M3_ENABLE_PIN
97  #define X2_ENABLE_PORT M3_ENABLE_PORT
98  #define X2_ENABLE_PIN M3_ENABLE_PIN
99  #define X2_ENABLE_BIT (1<<M3_ENABLE_PIN)
100 #endif
101 #ifdef M3_MOTOR_FAULT_PIN
102  #define X2_MOTOR_FAULT_PORT M3_MOTOR_FAULT_PORT
103  #define X2_MOTOR_FAULT_PIN M3_MOTOR_FAULT_PIN
104  #define X2_MOTOR_FAULT_BIT (1<<M3_MOTOR_FAULT_PIN)
105 #endif
106 
107 #elif X_DOUBLED == 2
108 
109 #ifdef B_AXIS
110 #error "B-axis motor is used for ganged X motor"
111 #endif
112 #define X2_STEP_PORT M4_STEP_PORT
113 #define X2_STEP_PIN M4_STEP_PIN
114 #define X2_STEP_BIT (1<<M4_STEP_PIN)
115 #define X2_DIRECTION_PORT M4_DIRECTION_PORT
116 #define X2_DIRECTION_PIN M4_DIRECTION_PIN
117 #define X2_DIRECTION_BIT (1<<M4_DIRECTION_PIN)
118 #ifdef M4_HOME_PIN
119  #if X_AUTO_SQUARE
120  #define X2_HOME_PORT M4_HOME_PORT
121  #define X2_HOME_PIN M4_HOME_PIN
122  #define X2_HOME_BIT (1<<M4_HOME_PIN)
123  #endif
124 #elif X_AUTO_SQUARE && defined(X_HOME_PIN)
125  #error "Auto squared X-axis requires second home pin input"
126 #endif
127 #ifdef M4_LIMIT_PIN
128  #if X_AUTO_SQUARE
129  #define X2_LIMIT_PORT M4_LIMIT_PORT
130  #define X2_LIMIT_PIN M4_LIMIT_PIN
131  #define X2_LIMIT_BIT (1<<M4_LIMIT_PIN)
132  #elif X_GANGED_LIM_MAX && !defined(M4_LIMIT_PIN_MAX)
133  #define X_LIMIT_PORT_MAX M4_LIMIT_PORT
134  #define X_LIMIT_PIN_MAX M4_LIMIT_PIN
135  #define X_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN)
136  #endif
137 #elif X_AUTO_SQUARE
138  #error "Auto squared X-axis requires second limit pin input"
139 #endif
140 #ifdef M4_LIMIT_PIN_MAX
141  #define X_LIMIT_PORT_MAX M4_LIMIT_PORT_MAX
142  #define X_LIMIT_PIN_MAX M4_LIMIT_PIN_MAX
143  #define X_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN_MAX)
144 #endif
145 #ifdef M4_ENABLE_PIN
146  #define X2_ENABLE_PORT M4_ENABLE_PORT
147  #define X2_ENABLE_PIN M4_ENABLE_PIN
148  #define X2_ENABLE_BIT (1<<M4_ENABLE_PIN)
149 #endif
150 #ifdef M4_MOTOR_FAULT_PIN
151  #define X2_MOTOR_FAULT_PORT M4_MOTOR_FAULT_PORT
152  #define X2_MOTOR_FAULT_PIN M4_MOTOR_FAULT_PIN
153  #define X2_MOTOR_FAULT_BIT (1<<M4_MOTOR_FAULT_PIN)
154 #endif
155 
156 #elif X_DOUBLED == 3
157 
158 #ifdef C_AXIS
159 #error "C-axis motor is used for ganged X motor"
160 #endif
161 #define X2_STEP_PORT M5_STEP_PORT
162 #define X2_STEP_PIN M5_STEP_PIN
163 #define X2_STEP_BIT (1<<M5_STEP_PIN)
164 #define X2_DIRECTION_PORT M5_DIRECTION_PORT
165 #define X2_DIRECTION_PIN M5_DIRECTION_PIN
166 #define X2_DIRECTION_BIT (1<<M5_DIRECTION_PIN)
167 #ifdef M5_HOME_PIN
168  #if X_AUTO_SQUARE
169  #define X2_HOME_PORT M5_HOME_PORT
170  #define X2_HOME_PIN M5_HOME_PIN
171  #define X2_HOME_BIT (1<<M5_HOME_PIN)
172  #endif
173 #elif X_AUTO_SQUARE && defined(X_HOME_PIN)
174  #error "Auto squared X-axis requires second home pin input"
175 #endif
176 #ifdef M5_LIMIT_PIN
177  #if X_AUTO_SQUARE
178  #define X2_LIMIT_PORT M5_LIMIT_PORT
179  #define X2_LIMIT_PIN M5_LIMIT_PIN
180  #define X2_LIMIT_BIT (1<<M5_LIMIT_PIN)
181  #elif X_GANGED_LIM_MAX && !defined(M5_LIMIT_PIN_MAX)
182  #define X_LIMIT_PORT_MAX M5_LIMIT_PORT
183  #define X_LIMIT_PIN_MAX M5_LIMIT_PIN
184  #define X_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN)
185  #endif
186 #elif X_AUTO_SQUARE
187  #error "Auto squared X-axis requires second limit pin input"
188 #endif
189 #ifdef M5_LIMIT_PIN_MAX
190  #define X_LIMIT_PORT_MAX M5_LIMIT_PORT_MAX
191  #define X_LIMIT_PIN_MAX M5_LIMIT_PIN_MAX
192  #define X_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN_MAX)
193 #endif
194 #ifdef M5_ENABLE_PIN
195  #define X2_ENABLE_PORT M5_ENABLE_PORT
196  #define X2_ENABLE_PIN M5_ENABLE_PIN
197  #define X2_ENABLE_BIT (1<<M5_ENABLE_PIN)
198 #endif
199 #ifdef M5_MOTOR_FAULT_PIN
200  #define X2_MOTOR_FAULT_PORT M5_MOTOR_FAULT_PORT
201  #define X2_MOTOR_FAULT_PIN M5_MOTOR_FAULT_PIN
202  #define X2_MOTOR_FAULT_BIT (1<<M5_MOTOR_FAULT_PIN)
203 #endif
204 
205 #elif X_DOUBLED == 4
206 
207 #ifdef U_AXIS
208 #error "U-axis motor is used for ganged X motor"
209 #endif
210 #define X2_STEP_PORT M6_STEP_PORT
211 #define X2_STEP_PIN M6_STEP_PIN
212 #define X2_STEP_BIT (1<<M6_STEP_PIN)
213 #define X2_DIRECTION_PORT M6_DIRECTION_PORT
214 #define X2_DIRECTION_PIN M6_DIRECTION_PIN
215 #define X2_DIRECTION_BIT (1<<M6_DIRECTION_PIN)
216 #ifdef M6_HOME_PIN
217  #if X_AUTO_SQUARE
218  #define X2_HOME_PORT M6_HOME_PORT
219  #define X2_HOME_PIN M6_HOME_PIN
220  #define X2_HOME_BIT (1<<M6_HOME_PIN)
221  #endif
222 #elif X_AUTO_SQUARE && defined(X_HOME_PIN)
223  #error "Auto squared X-axis requires second home pin input"
224 #endif
225 #ifdef M6_LIMIT_PIN
226  #if X_AUTO_SQUARE
227  #define X2_LIMIT_PORT M6_LIMIT_PORT
228  #define X2_LIMIT_PIN M6_LIMIT_PIN
229  #define X2_LIMIT_BIT (1<<M6_LIMIT_PIN)
230  #elif X_GANGED_LIM_MAX && !defined(M6_LIMIT_PIN_MAX)
231  #define X_LIMIT_PORT_MAX M6_LIMIT_PORT
232  #define X_LIMIT_PIN_MAX M6_LIMIT_PIN
233  #define X_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN)
234  #endif
235 #elif X_AUTO_SQUARE
236  #error "Auto squared X-axis requires second limit pin input"
237 #endif
238 #ifdef M6_LIMIT_PIN_MAX
239  #define X_LIMIT_PORT_MAX M6_LIMIT_PORT_MAX
240  #define X_LIMIT_PIN_MAX M6_LIMIT_PIN_MAX
241  #define X_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN_MAX)
242 #endif
243 #ifdef M6_ENABLE_PIN
244  #define X2_ENABLE_PORT M6_ENABLE_PORT
245  #define X2_ENABLE_PIN M6_ENABLE_PIN
246  #define X2_ENABLE_BIT (1<<M6_ENABLE_PIN)
247 #endif
248 #ifdef M6_MOTOR_FAULT_PIN
249  #define X2_MOTOR_FAULT_PORT M6_MOTOR_FAULT_PORT
250  #define X2_MOTOR_FAULT_PIN M6_MOTOR_FAULT_PIN
251  #define X2_MOTOR_FAULT_BIT (1<<M6_MOTOR_FAULT_PIN)
252 #endif
253 
254 #elif X_DOUBLED == 5
255 
256 #ifdef V_AXIS
257 #error "V-axis motor is used for ganged X motor"
258 #endif
259 #define X2_STEP_PORT M7_STEP_PORT
260 #define X2_STEP_PIN M7_STEP_PIN
261 #define X2_STEP_BIT (1<<M7_STEP_PIN)
262 #define X2_DIRECTION_PORT M7_DIRECTION_PORT
263 #define X2_DIRECTION_PIN M7_DIRECTION_PIN
264 #define X2_DIRECTION_BIT (1<<M7_DIRECTION_PIN)
265 #ifdef M7_HOME_PIN
266  #if X_AUTO_SQUARE
267  #define X2_HOME_PORT M7_HOME_PORT
268  #define X2_HOME_PIN M7_HOME_PIN
269  #define X2_HOME_BIT (1<<M7_HOME_PIN)
270  #endif
271 #elif X_AUTO_SQUARE && defined(X_HOME_PIN)
272  #error "Auto squared X-axis requires second home pin input"
273 #endif
274 #ifdef M7_LIMIT_PIN
275  #if X_AUTO_SQUARE
276  #define X2_LIMIT_PORT M7_LIMIT_PORT
277  #define X2_LIMIT_PIN M7_LIMIT_PIN
278  #define X2_LIMIT_BIT (1<<M7_LIMIT_PIN)
279  #elif X_GANGED_LIM_MAX && !defined(M7_LIMIT_PIN_MAX)
280  #define X_LIMIT_PORT_MAX M7_LIMIT_PORT
281  #define X_LIMIT_PIN_MAX M7_LIMIT_PIN
282  #define X_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN)
283  #endif
284 #elif X_AUTO_SQUARE
285  #error "Auto squared X-axis requires second limit pin input"
286 #endif
287 #ifdef M7_LIMIT_PIN_MAX
288  #define X_LIMIT_PORT_MAX M7_LIMIT_PORT_MAX
289  #define X_LIMIT_PIN_MAX M7_LIMIT_PIN_MAX
290  #define X_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN_MAX)
291 #endif
292 #ifdef M7_ENABLE_PIN
293  #define X2_ENABLE_PORT M7_ENABLE_PORT
294  #define X2_ENABLE_PIN M7_ENABLE_PIN
295  #define X2_ENABLE_BIT (1<<M7_ENABLE_PIN)
296 #endif
297 #ifdef M7_MOTOR_FAULT_PIN
298  #define X2_MOTOR_FAULT_PORT M7_MOTOR_FAULT_PORT
299  #define X2_MOTOR_FAULT_PIN M7_MOTOR_FAULT_PIN
300  #define X2_MOTOR_FAULT_BIT (1<<M7_MOTOR_FAULT_PIN)
301 #endif
302 
303 #endif // X_DOUBLED
304 
305 #if Y_DOUBLED == 1
306 
307 #ifdef A_AXIS
308 #error "A-axis motor is used for ganged Y motor"
309 #endif
310 #define Y2_STEP_PORT M3_STEP_PORT
311 #define Y2_STEP_PIN M3_STEP_PIN
312 #define Y2_STEP_BIT (1<<M3_STEP_PIN)
313 #define Y2_DIRECTION_PORT M3_DIRECTION_PORT
314 #define Y2_DIRECTION_PIN M3_DIRECTION_PIN
315 #define Y2_DIRECTION_BIT (1<<M3_DIRECTION_PIN)
316 #ifdef M3_HOME_PIN
317  #if Y_AUTO_SQUARE
318  #define Y2_HOME_PORT M3_HOME_PORT
319  #define Y2_HOME_PIN M3_HOME_PIN
320  #define Y2_HOME_BIT (1<<M3_HOME_PIN)
321  #endif
322 #elif Y_AUTO_SQUARE && defined(Y_HOME_PIN)
323  #error "Auto squared Y-axis requires second home pin input"
324 #endif
325 #ifdef M3_LIMIT_PIN
326  #if Y_AUTO_SQUARE
327  #define Y2_LIMIT_PORT M3_LIMIT_PORT
328  #define Y2_LIMIT_PIN M3_LIMIT_PIN
329  #define Y2_LIMIT_BIT (1<<M3_LIMIT_PIN)
330  #elif Y_GANGED_LIM_MAX && !defined(M3_LIMIT_PIN_MAX)
331  #define Y_LIMIT_PORT_MAX M3_LIMIT_PORT
332  #define Y_LIMIT_PIN_MAX M3_LIMIT_PIN
333  #define Y_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN)
334  #endif
335 #elif Y_AUTO_SQUARE
336  #error "Auto squared Y-axis requires second limit pin input"
337 #endif
338 #ifdef M3_LIMIT_PIN_MAX
339  #define Y_LIMIT_PORT_MAX M3_LIMIT_PORT_MAX
340  #define Y_LIMIT_PIN_MAX M3_LIMIT_PIN_MAX
341  #define Y_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN_MAX)
342 #endif
343 #ifdef M3_ENABLE_PIN
344  #define Y2_ENABLE_PORT M3_ENABLE_PORT
345  #define Y2_ENABLE_PIN M3_ENABLE_PIN
346  #define Y2_ENABLE_BIT (1<<M3_ENABLE_PIN)
347 #endif
348 #ifdef M3_MOTOR_FAULT_PIN
349  #define Y2_MOTOR_FAULT_PORT M3_MOTOR_FAULT_PORT
350  #define Y2_MOTOR_FAULT_PIN M3_MOTOR_FAULT_PIN
351  #define Y2_MOTOR_FAULT_BIT (1<<M3_MOTOR_FAULT_PIN)
352 #endif
353 
354 #elif Y_DOUBLED == 2
355 
356 #ifdef B_AXIS
357 #error "B-axis motor is used for ganged Y motor"
358 #endif
359 #define Y2_STEP_PORT M4_STEP_PORT
360 #define Y2_STEP_PIN M4_STEP_PIN
361 #define Y2_STEP_BIT (1<<M4_STEP_PIN)
362 #define Y2_DIRECTION_PORT M4_DIRECTION_PORT
363 #define Y2_DIRECTION_PIN M4_DIRECTION_PIN
364 #define Y2_DIRECTION_BIT (1<<M4_DIRECTION_PIN)
365 #ifdef M4_HOME_PIN
366  #if Y_AUTO_SQUARE
367  #define Y2_HOME_PORT M4_HOME_PORT
368  #define Y2_HOME_PIN M4_HOME_PIN
369  #define Y2_HOME_BIT (1<<M4_HOME_PIN)
370  #endif
371 #elif Y_AUTO_SQUARE && defined(Y_HOME_PIN)
372  #error "Auto squared Y-axis requires second home pin input"
373 #endif
374 #ifdef M4_LIMIT_PIN
375  #if Y_AUTO_SQUARE
376  #define Y2_LIMIT_PORT M4_LIMIT_PORT
377  #define Y2_LIMIT_PIN M4_LIMIT_PIN
378  #define Y2_LIMIT_BIT (1<<M4_LIMIT_PIN)
379  #elif Y_GANGED_LIM_MAX && !defined(M4_LIMIT_PIN_MAX)
380  #define Y_LIMIT_PORT_MAX M4_LIMIT_PORT
381  #define Y_LIMIT_PIN_MAX M4_LIMIT_PIN
382  #define Y_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN)
383  #endif
384 #elif Y_AUTO_SQUARE
385  #error "Auto squared Y-axis requires second limit pin input"
386 #endif
387 #ifdef M4_LIMIT_PIN_MAX
388  #define Y_LIMIT_PORT_MAX M4_LIMIT_PORT_MAX
389  #define Y_LIMIT_PIN_MAX M4_LIMIT_PIN_MAX
390  #define Y_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN_MAX)
391 #endif
392 #ifdef M4_ENABLE_PIN
393  #define Y2_ENABLE_PORT M4_ENABLE_PORT
394  #define Y2_ENABLE_PIN M4_ENABLE_PIN
395  #define Y2_ENABLE_BIT (1<<M4_ENABLE_PIN)
396 #endif
397 #ifdef M4_MOTOR_FAULT_PIN
398  #define Y2_MOTOR_FAULT_PORT M4_MOTOR_FAULT_PORT
399  #define Y2_MOTOR_FAULT_PIN M4_MOTOR_FAULT_PIN
400  #define Y2_MOTOR_FAULT_BIT (1<<M4_MOTOR_FAULT_PIN)
401 #endif
402 
403 #elif Y_DOUBLED == 3
404 
405 #ifdef C_AXIS
406 #error "C-axis motor is used for ganged Y motor"
407 #endif
408 #define Y2_STEP_PORT M5_STEP_PORT
409 #define Y2_STEP_PIN M5_STEP_PIN
410 #define Y2_STEP_BIT (1<<M5_STEP_PIN)
411 #define Y2_DIRECTION_PORT M5_DIRECTION_PORT
412 #define Y2_DIRECTION_PIN M5_DIRECTION_PIN
413 #define Y2_DIRECTION_BIT (1<<M5_DIRECTION_PIN)
414 #ifdef M5_HOME_PIN
415  #if Y_AUTO_SQUARE
416  #define Y2_HOME_PORT M5_HOME_PORT
417  #define Y2_HOME_PIN M5_HOME_PIN
418  #define Y2_HOME_BIT (1<<M5_HOME_PIN)
419  #endif
420 #elif Y_AUTO_SQUARE && defined(Y_HOME_PIN)
421  #error "Auto squared Y-axis requires second home pin input"
422 #endif
423 #ifdef M5_LIMIT_PIN
424  #if Y_AUTO_SQUARE
425  #define Y2_LIMIT_PORT M5_LIMIT_PORT
426  #define Y2_LIMIT_PIN M5_LIMIT_PIN
427  #define Y2_LIMIT_BIT (1<<M5_LIMIT_PIN)
428  #elif Y_GANGED_LIM_MAX && !defined(M5_LIMIT_PIN_MAX)
429  #define Y_LIMIT_PORT_MAX M5_LIMIT_PORT
430  #define Y_LIMIT_PIN_MAX M5_LIMIT_PIN
431  #define Y_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN)
432  #endif
433 #elif Y_AUTO_SQUARE
434  #error "Auto squared Y-axis requires second limit pin input"
435 #endif
436 #ifdef M5_LIMIT_PIN_MAX
437  #define Y_LIMIT_PORT_MAX M5_LIMIT_PORT_MAX
438  #define Y_LIMIT_PIN_MAX M5_LIMIT_PIN_MAX
439  #define Y_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN_MAX)
440 #endif
441 #ifdef M5_ENABLE_PIN
442  #define Y2_ENABLE_PORT M5_ENABLE_PORT
443  #define Y2_ENABLE_PIN M5_ENABLE_PIN
444  #define Y2_ENABLE_BIT (1<<M5_ENABLE_PIN)
445 #endif
446 #ifdef M5_MOTOR_FAULT_PIN
447  #define Y2_MOTOR_FAULT_PORT M5_MOTOR_FAULT_PORT
448  #define Y2_MOTOR_FAULT_PIN M5_MOTOR_FAULT_PIN
449  #define Y2_MOTOR_FAULT_BIT (1<<M5_MOTOR_FAULT_PIN)
450 #endif
451 
452 #elif Y_DOUBLED == 4
453 
454 #ifdef U_AXIS
455 #error "U-axis motor is used for ganged Y motor"
456 #endif
457 #define Y2_STEP_PORT M6_STEP_PORT
458 #define Y2_STEP_PIN M6_STEP_PIN
459 #define Y2_STEP_BIT (1<<M6_STEP_PIN)
460 #define Y2_DIRECTION_PORT M6_DIRECTION_PORT
461 #define Y2_DIRECTION_PIN M6_DIRECTION_PIN
462 #define Y2_DIRECTION_BIT (1<<M6_DIRECTION_PIN)
463 #ifdef M6_HOME_PIN
464  #if Y_AUTO_SQUARE
465  #define Y2_HOME_PORT M6_HOME_PORT
466  #define Y2_HOME_PIN M6_HOME_PIN
467  #define Y2_HOME_BIT (1<<M6_HOME_PIN)
468  #endif
469 #elif Y_AUTO_SQUARE && defined(Y_HOME_PIN)
470  #error "Auto squared Y-axis requires second home pin input"
471 #endif
472 #ifdef M6_LIMIT_PIN
473  #if Y_AUTO_SQUARE
474  #define Y2_LIMIT_PORT M6_LIMIT_PORT
475  #define Y2_LIMIT_PIN M6_LIMIT_PIN
476  #define Y2_LIMIT_BIT (1<<M6_LIMIT_PIN)
477  #elif Y_GANGED_LIM_MAX && !defined(M6_LIMIT_PIN_MAX)
478  #define Y_LIMIT_PORT_MAX M6_LIMIT_PORT
479  #define Y_LIMIT_PIN_MAX M6_LIMIT_PIN
480  #define Y_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN)
481  #endif
482 #elif Y_AUTO_SQUARE
483  #error "Auto squared Y-axis requires second limit pin input"
484 #endif
485 #ifdef M6_LIMIT_PIN_MAX
486  #define Y_LIMIT_PORT_MAX M6_LIMIT_PORT_MAX
487  #define Y_LIMIT_PIN_MAX M6_LIMIT_PIN_MAX
488  #define Y_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN_MAX)
489 #endif
490 #ifdef M6_ENABLE_PIN
491  #define Y2_ENABLE_PORT M6_ENABLE_PORT
492  #define Y2_ENABLE_PIN M6_ENABLE_PIN
493  #define Y2_ENABLE_BIT (1<<M6_ENABLE_PIN)
494 #endif
495 #ifdef M6_MOTOR_FAULT_PIN
496  #define Y2_MOTOR_FAULT_PORT M6_MOTOR_FAULT_PORT
497  #define Y2_MOTOR_FAULT_PIN M6_MOTOR_FAULT_PIN
498  #define Y2_MOTOR_FAULT_BIT (1<<M6_MOTOR_FAULT_PIN)
499 #endif
500 
501 #elif Y_DOUBLED == 5
502 
503 #ifdef V_AXIS
504 #error "V-axis motor is used for ganged Y motor"
505 #endif
506 #define Y2_STEP_PORT M7_STEP_PORT
507 #define Y2_STEP_PIN M7_STEP_PIN
508 #define Y2_STEP_BIT (1<<M7_STEP_PIN)
509 #define Y2_DIRECTION_PORT M7_DIRECTION_PORT
510 #define Y2_DIRECTION_PIN M7_DIRECTION_PIN
511 #define Y2_DIRECTION_BIT (1<<M7_DIRECTION_PIN)
512 #ifdef M7_HOME_PIN
513  #if Y_AUTO_SQUARE
514  #define Y2_HOME_PORT M7_HOME_PORT
515  #define Y2_HOME_PIN M7_HOME_PIN
516  #define Y2_HOME_BIT (1<<M7_HOME_PIN)
517  #endif
518 #elif Y_AUTO_SQUARE && defined(Y_HOME_PIN)
519  #error "Auto squared Y-axis requires second home pin input"
520 #endif
521 #ifdef M7_LIMIT_PIN
522  #if Y_AUTO_SQUARE
523  #define Y2_LIMIT_PORT M7_LIMIT_PORT
524  #define Y2_LIMIT_PIN M7_LIMIT_PIN
525  #define Y2_LIMIT_BIT (1<<M7_LIMIT_PIN)
526  #elif Y_GANGED_LIM_MAX && !defined(M7_LIMIT_PIN_MAX)
527  #define Y_LIMIT_PORT_MAX M7_LIMIT_PORT
528  #define Y_LIMIT_PIN_MAX M7_LIMIT_PIN
529  #define Y_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN)
530  #endif
531 #elif Y_AUTO_SQUARE
532  #error "Auto squared Y-axis requires second limit pin input"
533 #endif
534 #ifdef M7_LIMIT_PIN_MAX
535  #define Y_LIMIT_PORT_MAX M7_LIMIT_PORT_MAX
536  #define Y_LIMIT_PIN_MAX M7_LIMIT_PIN_MAX
537  #define Y_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN_MAX)
538 #endif
539 #ifdef M7_ENABLE_PIN
540  #define Y2_ENABLE_PORT M7_ENABLE_PORT
541  #define Y2_ENABLE_PIN M7_ENABLE_PIN
542  #define Y2_ENABLE_BIT (1<<M7_ENABLE_PIN)
543 #endif
544 #ifdef M7_MOTOR_FAULT_PIN
545  #define Y2_MOTOR_FAULT_PORT M7_MOTOR_FAULT_PORT
546  #define Y2_MOTOR_FAULT_PIN M7_MOTOR_FAULT_PIN
547  #define Y2_MOTOR_FAULT_BIT (1<<M7_MOTOR_FAULT_PIN)
548 #endif
549 
550 #endif // Y_DOUBLED
551 
552 #if Z_DOUBLED == 1
553 
554 #ifdef A_AZIS
555 #error "A-axis motor is used for ganged Z motor"
556 #endif
557 #define Z2_STEP_PORT M3_STEP_PORT
558 #define Z2_STEP_PIN M3_STEP_PIN
559 #define Z2_STEP_BIT (1<<M3_STEP_PIN)
560 #define Z2_DIRECTION_PORT M3_DIRECTION_PORT
561 #define Z2_DIRECTION_PIN M3_DIRECTION_PIN
562 #define Z2_DIRECTION_BIT (1<<M3_DIRECTION_PIN)
563 #ifdef M3_HOME_PIN
564  #if Z_AUTO_SQUARE
565  #define Z2_HOME_PORT M3_HOME_PORT
566  #define Z2_HOME_PIN M3_HOME_PIN
567  #define Z2_HOME_BIT (1<<M3_HOME_PIN)
568  #endif
569 #elif Z_AUTO_SQUARE && defined(Y_HOME_PIN)
570  #error "Auto squared Z-axis requires second home pin input"
571 #endif
572 #ifdef M3_LIMIT_PIN
573  #if Z_AUTO_SQUARE
574  #define Z2_LIMIT_PORT M3_LIMIT_PORT
575  #define Z2_LIMIT_PIN M3_LIMIT_PIN
576  #define Z2_LIMIT_BIT (1<<M3_LIMIT_PIN)
577  #elif Z_GANGED_LIM_MAX && !defined(M3_LIMIT_PIN_MAX)
578  #define Z_LIMIT_PORT_MAX M3_LIMIT_PORT
579  #define Z_LIMIT_PIN_MAX M3_LIMIT_PIN
580  #define Z_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN)
581  #endif
582 #elif Z_AUTO_SQUARE
583  #error "Auto squared Z-axis requires second limit pin input"
584 #endif
585 #ifdef M3_LIMIT_PIN_MAX
586  #define Z_LIMIT_PORT_MAX M3_LIMIT_PORT_MAX
587  #define Z_LIMIT_PIN_MAX M3_LIMIT_PIN_MAX
588  #define Z_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN_MAX)
589 #endif
590 #ifdef M3_ENABLE_PIN
591  #define Z2_ENABLE_PORT M3_ENABLE_PORT
592  #define Z2_ENABLE_PIN M3_ENABLE_PIN
593  #define Z2_ENABLE_BIT (1<<M3_ENABLE_PIN)
594 #endif
595 #ifdef M3_MOTOR_FAULT_PIN
596  #define Z2_MOTOR_FAULT_PORT M3_MOTOR_FAULT_PORT
597  #define Z2_MOTOR_FAULT_PIN M3_MOTOR_FAULT_PIN
598  #define Z2_MOTOR_FAULT_BIT (1<<M3_MOTOR_FAULT_PIN)
599 #endif
600 
601 #elif Z_DOUBLED == 2
602 
603 #ifdef B_AZIS
604 #error "B-axis motor is used for ganged Z motor"
605 #endif
606 #define Z2_STEP_PORT M4_STEP_PORT
607 #define Z2_STEP_PIN M4_STEP_PIN
608 #define Z2_STEP_BIT (1<<M4_STEP_PIN)
609 #define Z2_DIRECTION_PORT M4_DIRECTION_PORT
610 #define Z2_DIRECTION_PIN M4_DIRECTION_PIN
611 #define Z2_DIRECTION_BIT (1<<M4_DIRECTION_PIN)
612 #ifdef M4_HOME_PIN
613  #if Z_AUTO_SQUARE
614  #define Z2_HOME_PORT M4_HOME_PORT
615  #define Z2_HOME_PIN M4_HOME_PIN
616  #define Z2_HOME_BIT (1<<M4_HOME_PIN)
617  #endif
618 #elif Z_AUTO_SQUARE && defined(Z_HOME_PIN)
619  #error "Auto squared Z-axis requires second home pin input"
620 #endif
621 #ifdef M4_LIMIT_PIN
622  #if Z_AUTO_SQUARE
623  #define Z2_LIMIT_PORT M4_LIMIT_PORT
624  #define Z2_LIMIT_PIN M4_LIMIT_PIN
625  #define Z2_LIMIT_BIT (1<<M4_LIMIT_PIN)
626  #elif Z_GANGED_LIM_MAX && !defined(M4_LIMIT_PIN_MAX)
627  #define Z_LIMIT_PORT_MAX M4_LIMIT_PORT
628  #define Z_LIMIT_PIN_MAX M4_LIMIT_PIN
629  #define Z_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN)
630  #endif
631 #elif Z_AUTO_SQUARE
632  #error "Auto squared Z-axis requires second limit pin input"
633 #endif
634 #ifdef M4_LIMIT_PIN_MAX
635  #define Z_LIMIT_PORT_MAX M4_LIMIT_PORT_MAX
636  #define Z_LIMIT_PIN_MAX M4_LIMIT_PIN_MAX
637  #define Z_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN_MAX)
638 #endif
639 #ifdef M4_ENABLE_PIN
640  #define Z2_ENABLE_PORT M4_ENABLE_PORT
641  #define Z2_ENABLE_PIN M4_ENABLE_PIN
642  #define Z2_ENABLE_BIT (1<<M4_ENABLE_PIN)
643 #endif
644 #ifdef M4_MOTOR_FAULT_PIN
645  #define Z2_MOTOR_FAULT_PORT M4_MOTOR_FAULT_PORT
646  #define Z2_MOTOR_FAULT_PIN M4_MOTOR_FAULT_PIN
647  #define Z2_MOTOR_FAULT_BIT (1<<M4_MOTOR_FAULT_PIN)
648 #endif
649 
650 #elif Z_DOUBLED == 3
651 
652 #ifdef C_AZIS
653 #error "C-axis motor is used for ganged Z motor"
654 #endif
655 #define Z2_STEP_PORT M5_STEP_PORT
656 #define Z2_STEP_PIN M5_STEP_PIN
657 #define Z2_STEP_BIT (1<<M5_STEP_PIN)
658 #define Z2_DIRECTION_PORT M5_DIRECTION_PORT
659 #define Z2_DIRECTION_PIN M5_DIRECTION_PIN
660 #define Z2_DIRECTION_BIT (1<<M5_DIRECTION_PIN)
661 #ifdef M5_HOME_PIN
662  #if Z_AUTO_SQUARE
663  #define Z2_HOME_PORT M5_HOME_PORT
664  #define Z2_HOME_PIN M5_HOME_PIN
665  #define Z2_HOME_BIT (1<<M5_HOME_PIN)
666  #endif
667 #elif Z_AUTO_SQUARE && defined(Z_HOME_PIN)
668  #error "Auto squared Z-axis requires second home pin input"
669 #endif
670 #ifdef M5_LIMIT_PIN
671  #if Z_AUTO_SQUARE
672  #define Z2_LIMIT_PORT M5_LIMIT_PORT
673  #define Z2_LIMIT_PIN M5_LIMIT_PIN
674  #define Z2_LIMIT_BIT (1<<M5_LIMIT_PIN)
675  #elif Z_GANGED_LIM_MAX && !defined(M5_LIMIT_PIN_MAX)
676  #define Z_LIMIT_PORT_MAX M5_LIMIT_PORT
677  #define Z_LIMIT_PIN_MAX M5_LIMIT_PIN
678  #define Z_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN)
679  #endif
680 #elif Z_AUTO_SQUARE
681  #error "Auto squared Z-axis requires second limit pin input"
682 #endif
683 #ifdef M5_LIMIT_PIN_MAX
684  #define Z_LIMIT_PORT_MAX M5_LIMIT_PORT_MAX
685  #define Z_LIMIT_PIN_MAX M5_LIMIT_PIN_MAX
686  #define Z_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN_MAX)
687 #endif
688 #ifdef M5_ENABLE_PIN
689  #define Z2_ENABLE_PORT M5_ENABLE_PORT
690  #define Z2_ENABLE_PIN M5_ENABLE_PIN
691  #define Z2_ENABLE_BIT (1<<M5_ENABLE_PIN)
692 #endif
693 #ifdef M5_MOTOR_FAULT_PIN
694  #define Z2_MOTOR_FAULT_PORT M5_MOTOR_FAULT_PORT
695  #define Z2_MOTOR_FAULT_PIN M5_MOTOR_FAULT_PIN
696  #define Z2_MOTOR_FAULT_BIT (1<<M5_MOTOR_FAULT_PIN)
697 #endif
698 
699 #elif Z_DOUBLED == 4
700 
701 #ifdef U_AZIS
702 #error "U-axis motor is used for ganged Z motor"
703 #endif
704 #define Z2_STEP_PORT M6_STEP_PORT
705 #define Z2_STEP_PIN M6_STEP_PIN
706 #define Z2_STEP_BIT (1<<M6_STEP_PIN)
707 #define Z2_DIRECTION_PORT M6_DIRECTION_PORT
708 #define Z2_DIRECTION_PIN M6_DIRECTION_PIN
709 #define Z2_DIRECTION_BIT (1<<M6_DIRECTION_PIN)
710 #ifdef M6_HOME_PIN
711  #if Z_AUTO_SQUARE
712  #define Z2_HOME_PORT M6_HOME_PORT
713  #define Z2_HOME_PIN M6_HOME_PIN
714  #define Z2_HOME_BIT (1<<M6_HOME_PIN)
715  #endif
716 #elif Z_AUTO_SQUARE && defined(Z_HOME_PIN)
717  #error "Auto squared Z-axis requires second home pin input"
718 #endif
719 #ifdef M6_LIMIT_PIN
720  #if Z_AUTO_SQUARE
721  #define Z2_LIMIT_PORT M6_LIMIT_PORT
722  #define Z2_LIMIT_PIN M6_LIMIT_PIN
723  #define Z2_LIMIT_BIT (1<<M6_LIMIT_PIN)
724  #elif Z_GANGED_LIM_MAX && !defined(M6_LIMIT_PIN_MAX)
725  #define Z_LIMIT_PORT_MAX M6_LIMIT_PORT
726  #define Z_LIMIT_PIN_MAX M6_LIMIT_PIN
727  #define Z_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN)
728  #endif
729 #elif Z_AUTO_SQUARE
730  #error "Auto squared Z-axis requires second limit pin input"
731 #endif
732 #ifdef M6_LIMIT_PIN_MAX
733  #define Z_LIMIT_PORT_MAX M6_LIMIT_PORT_MAX
734  #define Z_LIMIT_PIN_MAX M6_LIMIT_PIN_MAX
735  #define Z_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN_MAX)
736 #endif
737 #ifdef M6_ENABLE_PIN
738  #define Z2_ENABLE_PORT M6_ENABLE_PORT
739  #define Z2_ENABLE_PIN M6_ENABLE_PIN
740  #define Z2_ENABLE_BIT (1<<M6_ENABLE_PIN)
741 #endif
742 #ifdef M6_MOTOR_FAULT_PIN
743  #define Z2_MOTOR_FAULT_PORT M6_MOTOR_FAULT_PORT
744  #define Z2_MOTOR_FAULT_PIN M6_MOTOR_FAULT_PIN
745  #define Z2_MOTOR_FAULT_BIT (1<<M6_MOTOR_FAULT_PIN)
746 #endif
747 
748 #elif Z_DOUBLED == 5
749 
750 #ifdef V_AZIS
751 #error "V-axis motor is used for ganged Z motor"
752 #endif
753 #define Z2_STEP_PORT M7_STEP_PORT
754 #define Z2_STEP_PIN M7_STEP_PIN
755 #define Z2_STEP_BIT (1<<M7_STEP_PIN)
756 #define Z2_DIRECTION_PORT M7_DIRECTION_PORT
757 #define Z2_DIRECTION_PIN M7_DIRECTION_PIN
758 #define Z2_DIRECTION_BIT (1<<M7_DIRECTION_PIN)
759 #ifdef M7_HOME_PIN
760  #if Z_AUTO_SQUARE
761  #define Z2_HOME_PORT M7_HOME_PORT
762  #define Z2_HOME_PIN M7_HOME_PIN
763  #define Z2_HOME_BIT (1<<M7_HOME_PIN)
764  #endif
765 #elif Z_AUTO_SQUARE && defined(Z_HOME_PIN)
766  #error "Auto squared Z-axis requires second home pin input"
767 #endif
768 #ifdef M7_LIMIT_PIN
769  #if Z_AUTO_SQUARE
770  #define Z2_LIMIT_PORT M7_LIMIT_PORT
771  #define Z2_LIMIT_PIN M7_LIMIT_PIN
772  #define Z2_LIMIT_BIT (1<<M7_LIMIT_PIN)
773  #elif Z_GANGED_LIM_MAX && !defined(M7_LIMIT_PIN_MAX)
774  #define Z_LIMIT_PORT_MAX M7_LIMIT_PORT
775  #define Z_LIMIT_PIN_MAX M7_LIMIT_PIN
776  #define Z_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN)
777  #endif
778 #elif Z_AUTO_SQUARE
779  #error "Auto squared Z-axis requires second limit pin input"
780 #endif
781 #ifdef M7_LIMIT_PIN_MAX
782  #define Z_LIMIT_PORT_MAX M7_LIMIT_PORT_MAX
783  #define Z_LIMIT_PIN_MAX M7_LIMIT_PIN_MAX
784  #define Z_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN_MAX)
785 #endif
786 #ifdef M7_ENABLE_PIN
787  #define Z2_ENABLE_PORT M7_ENABLE_PORT
788  #define Z2_ENABLE_PIN M7_ENABLE_PIN
789  #define Z2_ENABLE_BIT (1<<M7_ENABLE_PIN)
790 #endif
791 #ifdef M7_MOTOR_FAULT_PIN
792  #define Z2_MOTOR_FAULT_PORT M7_MOTOR_FAULT_PORT
793  #define Z2_MOTOR_FAULT_PIN M7_MOTOR_FAULT_PIN
794  #define Z2_MOTOR_FAULT_BIT (1<<M7_MOTOR_FAULT_PIN)
795 #endif
796 
797 #endif // Z_DOUBLED
798 
799 #ifdef X_DOUBLED
800 #define X2_MOTOR (X_DOUBLED + 2)
801 #endif
802 #ifdef Y_DOUBLED
803 #define Y2_MOTOR (Y_DOUBLED + 2)
804 #endif
805 #ifdef Z_DOUBLED
806 #define Z2_MOTOR (Z_DOUBLED + 2)
807 #endif
808 
809 #endif // N_GANGED
810 
811 #if defined(X2_HOME_PIN) || defined(Y2_HOME_PIN) || defined(Z2_HOME_PIN)
812 #define DUAL_HOME_SWITCHES
813 #ifndef X2_HOME_BIT
814 #define X2_HOME_BIT 0
815 #endif
816 #ifndef Y2_HOME_BIT
817 #define Y2_HOME_BIT 0
818 #endif
819 #ifndef Z2_HOME_BIT
820 #define Z2_HOME_BIT 0
821 #endif
822 #define HOME2_MASK (X2_HOME_BIT|Y2_HOME_BIT|Z2_HOME_BIT)
823 #define HOME2_MASK_SUM (X2_HOME_BIT+Y2_HOME_BIT+Z2_HOME_BIT)
824 #else
825 #define HOME2_MASK 0
826 #define HOME2_MASK_SUM 0
827 #endif
828 
829 #if defined(X2_MOTOR_FAULT_PIN) || defined(Y2_MOTOR_FAULT_PIN) || defined(Z2_MOTOR_FAULT_PIN)
830 #define DUAL_MOTOR_FAULT_SWITCHES
831 #ifndef X2_MOTOR_FAULT_BIT
832 #define X2_MOTOR_FAULT_BIT 0
833 #endif
834 #ifndef Y2_MOTOR_FAULT_BIT
835 #define Y2_MOTOR_FAULT_BIT 0
836 #endif
837 #ifndef Z2_MOTOR_FAULT_BIT
838 #define Z2_MOTOR_FAULT_BIT 0
839 #endif
840 #define MOTOR_FAULT2_MASK (X2_MOTOR_FAULT_BIT|Y2_MOTOR_FAULT_BIT|Z2_MOTOR_FAULT_BIT)
841 #define MOTOR_FAULT2_MASK_SUM (X2_MOTOR_FAULT_BIT+Y2_MOTOR_FAULT_BIT+Z2_MOTOR_FAULT_BIT)
842 #else
843 #define MOTOR_FAULT2_MASK 0
844 #define MOTOR_FAULT2_MASK_SUM 0
845 #endif
846 
847 #if defined(X2_LIMIT_PIN) || defined(Y2_LIMIT_PIN) || defined(Z2_LIMIT_PIN)
848 #define DUAL_LIMIT_SWITCHES
849 #ifndef X2_LIMIT_BIT
850 #define X2_LIMIT_BIT 0
851 #endif
852 #ifndef Y2_LIMIT_BIT
853 #define Y2_LIMIT_BIT 0
854 #endif
855 #ifndef Z2_LIMIT_BIT
856 #define Z2_LIMIT_BIT 0
857 #endif
858 #define LIMIT2_MASK (X2_LIMIT_BIT|Y2_LIMIT_BIT|Z2_LIMIT_BIT)
859 #define LIMIT2_MASK_SUM (X2_LIMIT_BIT+Y2_LIMIT_BIT+Z2_LIMIT_BIT)
860 #else
861 #define LIMIT2_MASK 0
862 #define LIMIT2_MASK_SUM 0
863 #endif
864 
865 #if defined(X_LIMIT_PIN_MAX) || defined(Y_LIMIT_PIN_MAX) || defined(Z_LIMIT_PIN_MAX) || defined(A_LIMIT_PIN_MAX) || defined(B_LIMIT_PIN_MAX) || defined(C_LIMIT_PIN_MAX)
866 #define MAX_LIMIT_SWITCHES
867 #endif
868 
869 #ifdef A_AXIS
870 
871 #ifndef M3_AVAILABLE
872  #error "A_AXIS pins are not available"
873 #endif
874 #define A_STEP_PORT M3_STEP_PORT
875 #define A_STEP_PIN M3_STEP_PIN
876 #define A_STEP_BIT (1<<M3_STEP_PIN)
877 #define A_DIRECTION_PORT M3_DIRECTION_PORT
878 #define A_DIRECTION_PIN M3_DIRECTION_PIN
879 #define A_DIRECTION_BIT (1<<M3_DIRECTION_PIN)
880 #ifdef M3_HOME_PIN
881  #define A_HOME_PORT M3_HOME_PORT
882  #define A_HOME_PIN M3_HOME_PIN
883  #define A_HOME_BIT (1<<M3_HOME_PIN)
884 #endif
885 #ifdef M3_LIMIT_PIN
886  #define A_LIMIT_PORT M3_LIMIT_PORT
887  #define A_LIMIT_PIN M3_LIMIT_PIN
888  #define A_LIMIT_BIT (1<<M3_LIMIT_PIN)
889 #endif
890 #ifdef M3_LIMIT_PIN_MAX
891  #define A_LIMIT_PORT_MAX M3_LIMIT_PORT_MAX
892  #define A_LIMIT_PIN_MAX M3_LIMIT_PIN_MAX
893  #define A_LIMIT_BIT_MAX (1<<M3_LIMIT_PIN_MAX)
894 #endif
895 #ifdef M3_ENABLE_PIN
896  #define A_ENABLE_PORT M3_ENABLE_PORT
897  #define A_ENABLE_PIN M3_ENABLE_PIN
898  #define A_ENABLE_BIT (1<<M3_ENABLE_PIN)
899 #endif
900 #ifdef M3_MOTOR_FAULT_PIN
901  #define A_MOTOR_FAULT_PORT M3_MOTOR_FAULT_PORT
902  #define A_MOTOR_FAULT_PIN M3_MOTOR_FAULT_PIN
903  #define A_MOTOR_FAULT_BIT (1<<M3_MOTOR_FAULT_PIN)
904 #endif
905 
906 #endif // A_AXIS
907 
908 #ifdef B_AXIS
909 
910 #ifndef M4_AVAILABLE
911  #error "B_AXIS pins are not available"
912 #endif
913 #define B_STEP_PORT M4_STEP_PORT
914 #define B_STEP_PIN M4_STEP_PIN
915 #define B_STEP_BIT (1<<M4_STEP_PIN)
916 #define B_DIRECTION_PORT M4_DIRECTION_PORT
917 #define B_DIRECTION_PIN M4_DIRECTION_PIN
918 #define B_DIRECTION_BIT (1<<M4_DIRECTION_PIN)
919 #ifdef M4_HOME_PIN
920  #define B_HOME_PORT M4_HOME_PORT
921  #define B_HOME_PIN M4_HOME_PIN
922  #define B_HOME_BIT (1<<M4_HOME_PIN)
923 #endif
924 #ifdef M4_LIMIT_PIN
925  #define B_LIMIT_PORT M4_LIMIT_PORT
926  #define B_LIMIT_PIN M4_LIMIT_PIN
927  #define B_LIMIT_BIT (1<<M4_LIMIT_PIN)
928 #endif
929 #ifdef M4_LIMIT_PIN_MAX
930  #define B_LIMIT_PORT_MAX M4_LIMIT_PORT_MAX
931  #define B_LIMIT_PIN_MAX M4_LIMIT_PIN_MAX
932  #define B_LIMIT_BIT_MAX (1<<M4_LIMIT_PIN_MAX)
933 #endif
934 #ifdef M4_ENABLE_PIN
935  #define B_ENABLE_PORT M4_ENABLE_PORT
936  #define B_ENABLE_PIN M4_ENABLE_PIN
937  #define B_ENABLE_BIT (1<<M4_ENABLE_PIN)
938 #endif
939 #ifdef M4_MOTOR_FAULT_PIN
940  #define B_MOTOR_FAULT_PORT M4_MOTOR_FAULT_PORT
941  #define B_MOTOR_FAULT_PIN M4_MOTOR_FAULT_PIN
942  #define B_MOTOR_FAULT_BIT (1<<M4_MOTOR_FAULT_PIN)
943 #endif
944 
945 #endif //B_AXIS
946 
947 #ifdef C_AXIS
948 
949 #ifndef M5_AVAILABLE
950  #error "C_AXIS pins are not available"
951 #endif
952 #define C_STEP_PORT M5_STEP_PORT
953 #define C_STEP_PIN M5_STEP_PIN
954 #define C_STEP_BIT (1<<M5_STEP_PIN)
955 #define C_DIRECTION_PORT M5_DIRECTION_PORT
956 #define C_DIRECTION_PIN M5_DIRECTION_PIN
957 #define C_DIRECTION_BIT (1<<M5_DIRECTION_PIN)
958 #ifdef M5_HOME_PIN
959  #define C_HOME_PORT M5_HOME_PORT
960  #define C_HOME_PIN M5_HOME_PIN
961  #define C_HOME_BIT (1<<M5_HOME_PIN)
962 #endif
963 #ifdef M5_LIMIT_PIN
964  #define C_LIMIT_PORT M5_LIMIT_PORT
965  #define C_LIMIT_PIN M5_LIMIT_PIN
966  #define C_LIMIT_BIT (1<<M5_LIMIT_PIN)
967 #endif
968 #ifdef M5_LIMIT_PIN_MAX
969  #define C_LIMIT_PORT_MAX M5_LIMIT_PORT_MAX
970  #define C_LIMIT_PIN_MAX M5_LIMIT_PIN_MAX
971  #define C_LIMIT_BIT_MAX (1<<M5_LIMIT_PIN_MAX)
972 #endif
973 #ifdef M5_ENABLE_PIN
974  #define C_ENABLE_PORT M5_ENABLE_PORT
975  #define C_ENABLE_PIN M5_ENABLE_PIN
976  #define C_ENABLE_BIT (1<<M5_ENABLE_PIN)
977 #endif
978 #ifdef M5_MOTOR_FAULT_PIN
979  #define C_MOTOR_FAULT_PORT M5_MOTOR_FAULT_PORT
980  #define C_MOTOR_FAULT_PIN M5_MOTOR_FAULT_PIN
981  #define C_MOTOR_FAULT_BIT (1<<M5_MOTOR_FAULT_PIN)
982 #endif
983 
984 #endif // C_AXIS
985 
986 #ifdef U_AXIS
987 
988 #ifndef M6_AVAILABLE
989  #error "U_AXIS pins are not available"
990 #endif
991 #define U_STEP_PORT M6_STEP_PORT
992 #define U_STEP_PIN M6_STEP_PIN
993 #define U_STEP_BIT (1<<M6_STEP_PIN)
994 #define U_DIRECTION_PORT M6_DIRECTION_PORT
995 #define U_DIRECTION_PIN M6_DIRECTION_PIN
996 #define U_DIRECTION_BIT (1<<M6_DIRECTION_PIN)
997 #ifdef M6_HOME_PIN
998  #define U_HOME_PORT M6_HOME_PORT
999  #define U_HOME_PIN M6_HOME_PIN
1000  #define U_HOME_BIT (1<<M6_HOME_PIN)
1001 #endif
1002 #ifdef M6_LIMIT_PIN
1003  #define U_LIMIT_PORT M6_LIMIT_PORT
1004  #define U_LIMIT_PIN M6_LIMIT_PIN
1005  #define U_LIMIT_BIT (1<<M6_LIMIT_PIN)
1006 #endif
1007 #ifdef M6_LIMIT_PIN_MAX
1008  #define U_LIMIT_PORT_MAX M6_LIMIT_PORT_MAX
1009  #define U_LIMIT_PIN_MAX M6_LIMIT_PIN_MAX
1010  #define U_LIMIT_BIT_MAX (1<<M6_LIMIT_PIN_MAX)
1011 #endif
1012 #ifdef M6_ENABLE_PIN
1013  #define U_ENABLE_PORT M6_ENABLE_PORT
1014  #define U_ENABLE_PIN M6_ENABLE_PIN
1015  #define U_ENABLE_BIT (1<<M6_ENABLE_PIN)
1016 #endif
1017 #ifdef M6_MOTOR_FAULT_PIN
1018  #define U_MOTOR_FAULT_PORT M6_MOTOR_FAULT_PORT
1019  #define U_MOTOR_FAULT_PIN M6_MOTOR_FAULT_PIN
1020  #define U_MOTOR_FAULT_BIT (1<<M6_MOTOR_FAULT_PIN)
1021 #endif
1022 
1023 #endif // U_AXIS
1024 
1025 #ifdef V_AXIS
1026 
1027 #ifndef M7_AVAILABLE
1028  #error "V_AXIS pins are not available"
1029 #endif
1030 #define V_STEP_PORT M7_STEP_PORT
1031 #define V_STEP_PIN M7_STEP_PIN
1032 #define V_STEP_BIT (1<<M7_STEP_PIN)
1033 #define V_DIRECTION_PORT M7_DIRECTION_PORT
1034 #define V_DIRECTION_PIN M7_DIRECTION_PIN
1035 #define V_DIRECTION_BIT (1<<M7_DIRECTION_PIN)
1036 #ifdef M7_HOME_PIN
1037  #define V_HOME_PORT M7_HOME_PORT
1038  #define V_HOME_PIN M7_HOME_PIN
1039  #define V_HOME_BIT (1<<M7_HOME_PIN)
1040 #endif
1041 #ifdef M7_LIMIT_PIN
1042  #define V_LIMIT_PORT M7_LIMIT_PORT
1043  #define V_LIMIT_PIN M7_LIMIT_PIN
1044  #define V_LIMIT_BIT (1<<M7_LIMIT_PIN)
1045 #endif
1046 #ifdef M7_LIMIT_PIN_MAX
1047  #define V_LIMIT_PORT_MAX M7_LIMIT_PORT_MAX
1048  #define V_LIMIT_PIN_MAX M7_LIMIT_PIN_MAX
1049  #define V_LIMIT_BIT_MAX (1<<M7_LIMIT_PIN_MAX)
1050 #endif
1051 #ifdef M7_ENABLE_PIN
1052  #define V_ENABLE_PORT M7_ENABLE_PORT
1053  #define V_ENABLE_PIN M7_ENABLE_PIN
1054  #define V_ENABLE_BIT (1<<M7_ENABLE_PIN)
1055 #endif
1056 #ifdef M7_MOTOR_FAULT_PIN
1057  #define V_MOTOR_FAULT_PORT M7_MOTOR_FAULT_PORT
1058  #define V_MOTOR_FAULT_PIN M7_MOTOR_FAULT_PIN
1059  #define V_MOTOR_FAULT_BIT (1<<M6_MOTOR_FAULT_PIN)
1060 #endif
1061 
1062 #endif // V_AXIS
1063 
1064 #ifdef STEP_PORT
1065 #ifndef X_STEP_PORT
1066 #define X_STEP_PORT STEP_PORT
1067 #endif
1068 #ifndef Y_STEP_PORT
1069 #define Y_STEP_PORT STEP_PORT
1070 #endif
1071 #ifndef Z_STEP_PORT
1072 #define Z_STEP_PORT STEP_PORT
1073 #endif
1074 #if defined(A_AXIS) && !defined(A_STEP_PORT)
1075 #define A_STEP_PORT STEP_PORT
1076 #endif
1077 #if defined(B_AXIS) && !defined(B_STEP_PORT)
1078 #define B_STEP_PORT STEP_PORT
1079 #endif
1080 #if defined(C_AXIS) && !defined(C_STEP_PORT)
1081 #define C_STEP_PORT STEP_PORT
1082 #endif
1083 #if defined(U_AXIS) && !defined(U_STEP_PORT)
1084 #define U_STEP_PORT STEP_PORT
1085 #endif
1086 #if defined(V_AXIS) && !defined(V_STEP_PORT)
1087 #define V_STEP_PORT STEP_PORT
1088 #endif
1089 #endif
1090 
1091 #ifndef X_STEP_BIT
1092 #define X_STEP_BIT (1<<X_STEP_PIN)
1093 #endif
1094 #ifndef Y_STEP_BIT
1095 #define Y_STEP_BIT (1<<Y_STEP_PIN)
1096 #endif
1097 #ifndef Z_STEP_BIT
1098 #define Z_STEP_BIT (1<<Z_STEP_PIN)
1099 #endif
1100 
1101 #ifdef DIRECTION_PORT
1102 #ifndef X_DIRECTION_PORT
1103 #define X_DIRECTION_PORT DIRECTION_PORT
1104 #endif
1105 #ifndef Y_DIRECTION_PORT
1106 #define Y_DIRECTION_PORT DIRECTION_PORT
1107 #endif
1108 #ifndef Z_DIRECTION_PORT
1109 #define Z_DIRECTION_PORT DIRECTION_PORT
1110 #endif
1111 #if defined(A_AXIS) && !defined(A_DIRECTION_PORT)
1112 #define A_DIRECTION_PORT DIRECTION_PORT
1113 #endif
1114 #if defined(B_AXIS) && !defined(B_DIRECTION_PORT)
1115 #define B_DIRECTION_PORT DIRECTION_PORT
1116 #endif
1117 #if defined(C_AXIS) && !defined(B_DIRECTION_PORT)
1118 #define C_DIRECTION_PORT DIRECTION_PORT
1119 #endif
1120 #if defined(U_AXIS) && !defined(U_DIRECTION_PORT)
1121 #define U_DIRECTION_PORT DIRECTION_PORT
1122 #endif
1123 #if defined(V_AXIS) && !defined(V_DIRECTION_PORT)
1124 #define V_DIRECTION_PORT DIRECTION_PORT
1125 #endif
1126 #endif
1127 
1128 #ifndef X_DIRECTION_BIT
1129 #define X_DIRECTION_BIT (1<<X_DIRECTION_PIN)
1130 #endif
1131 #ifndef Y_DIRECTION_BIT
1132 #define Y_DIRECTION_BIT (1<<Y_DIRECTION_PIN)
1133 #endif
1134 #ifndef Z_DIRECTION_BIT
1135 #define Z_DIRECTION_BIT (1<<Z_DIRECTION_PIN)
1136 #endif
1137 
1138 #ifdef LIMIT_PORT
1139 #ifndef X_LIMIT_PORT
1140 #define X_LIMIT_PORT LIMIT_PORT
1141 #endif
1142 #ifndef Y_LIMIT_PORT
1143 #define Y_LIMIT_PORT LIMIT_PORT
1144 #endif
1145 #ifndef Z_LIMIT_PORT
1146 #define Z_LIMIT_PORT LIMIT_PORT
1147 #endif
1148 #if defined(A_AXIS) && !defined(A_LIMIT_PORT)
1149 #define A_LIMIT_PORT LIMIT_PORT
1150 #endif
1151 #if defined(B_AXIS) && !defined(B_LIMIT_PORT)
1152 #define B_LIMIT_PORT LIMIT_PORT
1153 #endif
1154 #if defined(C_AXIS) && !defined(C_LIMIT_PORT)
1155 #define C_LIMIT_PORT LIMIT_PORT
1156 #endif
1157 #if defined(U_AXIS) && !defined(U_LIMIT_PORT)
1158 #define U_LIMIT_PORT LIMIT_PORT
1159 #endif
1160 #if defined(V_AXIS) && !defined(V_LIMIT_PORT)
1161 #define V_LIMIT_PORT LIMIT_PORT
1162 #endif
1163 #endif
1164 
1165 #ifndef X_HOME_BIT
1166 #ifdef X_HOME_PIN
1167 #define X_HOME_BIT (1<<X_HOME_PIN)
1168 #else
1169 #define X_HOME_BIT 0
1170 #endif
1171 #endif
1172 #ifndef Y_HOME_BIT
1173 #ifdef Y_HOME_PIN
1174 #define Y_HOME_BIT (1<<Y_HOME_PIN)
1175 #else
1176 #define Y_HOME_BIT 0
1177 #endif
1178 #endif
1179 #ifndef Z_HOME_BIT
1180 #ifdef Z_HOME_PIN
1181 #define Z_HOME_BIT (1<<Z_HOME_PIN)
1182 #else
1183 #define Z_HOME_BIT 0
1184 #endif
1185 #endif
1186 
1187 #ifndef X_MOTOR_FAULT_BIT
1188 #ifdef X_MOTOR_FAULT_PIN
1189 #define X_MOTOR_FAULT_BIT (1<<X_MOTOR_FAULT_PIN)
1190 #else
1191 #define X_MOTOR_FAULT_BIT 0
1192 #endif
1193 #endif
1194 #ifndef Y_MOTOR_FAULT_BIT
1195 #ifdef Y_MOTOR_FAULT_PIN
1196 #define Y_MOTOR_FAULT_BIT (1<<Y_MOTOR_FAULT_PIN)
1197 #else
1198 #define Y_MOTOR_FAULT_BIT 0
1199 #endif
1200 #endif
1201 #ifndef Z_MOTOR_FAULT_BIT
1202 #ifdef Z_MOTOR_FAULT_PIN
1203 #define Z_MOTOR_FAULT_BIT (1<<Z_MOTOR_FAULT_PIN)
1204 #else
1205 #define Z_MOTOR_FAULT_BIT 0
1206 #endif
1207 #endif
1208 
1209 #ifndef X_LIMIT_BIT
1210 #define X_LIMIT_BIT (1<<X_LIMIT_PIN)
1211 #endif
1212 #ifndef Y_LIMIT_BIT
1213 #define Y_LIMIT_BIT (1<<Y_LIMIT_PIN)
1214 #endif
1215 #ifndef Z_LIMIT_BIT
1216 #define Z_LIMIT_BIT (1<<Z_LIMIT_PIN)
1217 #endif
1218 #ifndef X_LIMIT_BIT_MAX
1219 #ifdef X_LIMIT_PIN_MAX
1220 #define X_LIMIT_BIT_MAX (1<<X_LIMIT_PIN_MAX)
1221 #else
1222 #define X_LIMIT_BIT_MAX 0
1223 #endif
1224 #endif
1225 #ifndef Y_LIMIT_BIT_MAX
1226 #ifdef Y_LIMIT_PIN_MAX
1227 #define Y_LIMIT_BIT_MAX (1<<Y_LIMIT_PIN_MAX)
1228 #else
1229 #define Y_LIMIT_BIT_MAX 0
1230 #endif
1231 #endif
1232 #ifndef Z_LIMIT_BIT_MAX
1233 #ifdef Z_LIMIT_PIN_MAX
1234 #define Z_LIMIT_BIT_MAX (1<<Z_LIMIT_PIN_MAX)
1235 #else
1236 #define Z_LIMIT_BIT_MAX 0
1237 #endif
1238 #endif
1239 #ifndef A_LIMIT_BIT_MAX
1240 #ifdef A_LIMIT_PIN_MAX
1241 #define A_LIMIT_BIT_MAX (1<<A_LIMIT_PIN_MAX)
1242 #else
1243 #define A_LIMIT_BIT_MAX 0
1244 #endif
1245 #endif
1246 #ifndef B_LIMIT_BIT_MAX
1247 #ifdef B_LIMIT_PIN_MAX
1248 #define B_LIMIT_BIT_MAX (1<<B_LIMIT_PIN_MAX)
1249 #else
1250 #define B_LIMIT_BIT_MAX 0
1251 #endif
1252 #endif
1253 #ifndef C_LIMIT_BIT_MAX
1254 #ifdef C_LIMIT_PIN_MAX
1255 #define C_LIMIT_BIT_MAX (1<<C_LIMIT_PIN_MAX)
1256 #else
1257 #define C_LIMIT_BIT_MAX 0
1258 #endif
1259 #endif
1260 #ifndef U_LIMIT_BIT_MAX
1261 #ifdef U_LIMIT_PIN_MAX
1262 #define U_LIMIT_BIT_MAX (1<<U_LIMIT_PIN_MAX)
1263 #else
1264 #define U_LIMIT_BIT_MAX 0
1265 #endif
1266 #endif
1267 #ifndef V_LIMIT_BIT_MAX
1268 #ifdef V_LIMIT_PIN_MAX
1269 #define V_LIMIT_BIT_MAX (1<<V_LIMIT_PIN_MAX)
1270 #else
1271 #define V_LIMIT_BIT_MAX 0
1272 #endif
1273 #endif
1274 
1275 #define LIMIT_MAX_MASK (X_LIMIT_BIT_MAX|Y_LIMIT_BIT_MAX|Z_LIMIT_BIT_MAX|A_LIMIT_BIT_MAX|B_LIMIT_BIT_MAX|C_LIMIT_BIT_MAX|U_LIMIT_BIT_MAX|V_LIMIT_BIT_MAX)
1276 #define LIMIT_MAX_SUM (X_LIMIT_BIT_MAX+Y_LIMIT_BIT_MAX+Z_LIMIT_BIT_MAX+A_LIMIT_BIT_MAX+B_LIMIT_BIT_MAX+C_LIMIT_BIT_MAX+U_LIMIT_BIT_MAX+V_LIMIT_BIT_MAX)
1277 
1278 #if !defined(X_ENABLE_BIT) && defined(X_ENABLE_PIN)
1279 #define X_ENABLE_BIT (1<<X_ENABLE_PIN)
1280 #endif
1281 #if !defined(Y_ENABLE_BIT) && defined(Y_ENABLE_PIN)
1282 #define Y_ENABLE_BIT (1<<Y_ENABLE_PIN)
1283 #endif
1284 #if !defined(Z_ENABLE_BIT) && defined(Z_ENABLE_PIN)
1285 #define Z_ENABLE_BIT (1<<Z_ENABLE_PIN)
1286 #endif
1287 
1288 #ifndef STEP_MASK
1289 #if N_AXIS == 3
1290 #define STEP_MASK (X_STEP_BIT|Y_STEP_BIT|Z_STEP_BIT)
1291 #elif N_AXIS == 4
1292 #define STEP_MASK (X_STEP_BIT|Y_STEP_BIT|Z_STEP_BIT|A_STEP_BIT)
1293 #elif N_AXIS == 5
1294 #define STEP_MASK (X_STEP_BIT|Y_STEP_BIT|Z_STEP_BIT|A_STEP_BIT|B_STEP_BIT)
1295 #elif N_AXIS == 6
1296 #define STEP_MASK (X_STEP_BIT|Y_STEP_BIT|Z_STEP_BIT|A_STEP_BIT|B_STEP_BIT|C_STEP_BIT)
1297 #elif N_AXIS == 7
1298 #define STEP_MASK (X_STEP_BIT|Y_STEP_BIT|Z_STEP_BIT|A_STEP_BIT|B_STEP_BIT|C_STEP_BIT|U_STEP_BIT)
1299 #else
1300 #define STEP_MASK (X_STEP_BIT|Y_STEP_BIT|Z_STEP_BIT|A_STEP_BIT|B_STEP_BIT|C_STEP_BIT|U_STEP_BIT|V_STEP_BIT)
1301 #endif
1302 #endif
1303 
1304 #ifndef DIRECTION_MASK
1305 #if N_AXIS == 3
1306 #define DIRECTION_MASK (X_DIRECTION_BIT|Y_DIRECTION_BIT|Z_DIRECTION_BIT)
1307 #elif N_AXIS == 4
1308 #define DIRECTION_MASK (X_DIRECTION_BIT|Y_DIRECTION_BIT|Z_DIRECTION_BIT|A_DIRECTION_BIT)
1309 #elif N_AXIS == 5
1310 #define DIRECTION_MASK (X_DIRECTION_BIT|Y_DIRECTION_BIT|Z_DIRECTION_BIT|A_DIRECTION_BIT|B_DIRECTION_BIT)
1311 #elif N_AXIS == 6
1312 #define DIRECTION_MASK (X_DIRECTION_BIT|Y_DIRECTION_BIT|Z_DIRECTION_BIT|A_DIRECTION_BIT|B_DIRECTION_BIT|C_DIRECTION_BIT)
1313 #elif N_AXIS == 7
1314 #define DIRECTION_MASK (X_DIRECTION_BIT|Y_DIRECTION_BIT|Z_DIRECTION_BIT|A_DIRECTION_BIT|B_DIRECTION_BIT|C_DIRECTION_BIT|U_DIRECTION_BIT)
1315 #else
1316 #define DIRECTION_MASK (X_DIRECTION_BIT|Y_DIRECTION_BIT|Z_DIRECTION_BIT|A_DIRECTION_BIT|B_DIRECTION_BIT|C_DIRECTION_BIT|U_DIRECTION_BIT|V_DIRECTION_BIT)
1317 #endif
1318 #endif
1319 
1320 #if defined(STEPPERS_ENABLE_PIN) && !defined(STEPPERS_ENABLE_BIT)
1321 #define STEPPERS_ENABLE_BIT (1<<STEPPERS_ENABLE_PIN)
1322 #endif
1323 
1324 #ifndef STEPPERS_ENABLE_MASK
1325 
1326 #ifdef STEPPERS_ENABLE_BIT
1327 #define STEPPERS_ENABLE_MASK STEPPERS_ENABLE_BIT
1328 #else
1329 
1330 #if N_AXIS >= 4 && !defined(A_ENABLE_BIT)
1331 #define A_ENABLE_BIT 0
1332 #endif
1333 #if N_AXIS >= 5 && !defined(B_ENABLE_BIT)
1334 #define B_ENABLE_BIT 0
1335 #endif
1336 #if N_AXIS >= 6 && !defined(C_ENABLE_BIT)
1337 #define C_ENABLE_BIT 0
1338 #endif
1339 
1340 #if N_AXIS == 3
1341 #define STEPPERS_ENABLE_MASK (X_ENABLE_BIT|Y_ENABLE_BIT|Z_ENABLE_BIT)
1342 #elif N_AXIS == 4
1343 #define STEPPERS_ENABLE_MASK (X_ENABLE_BIT|Y_ENABLE_BIT|Z_ENABLE_BIT|A_ENABLE_BIT)
1344 #elif N_AXIS == 5
1345 #define STEPPERS_ENABLE_MASK (X_ENABLE_BIT|Y_ENABLE_BIT|Z_ENABLE_BIT|A_ENABLE_BIT|B_ENABLE_BIT)
1346 #elif N_AXIS == 6
1347 #define STEPPERS_ENABLE_MASK (X_ENABLE_BIT|Y_ENABLE_BIT|Z_ENABLE_BIT|A_ENABLE_BIT|B_ENABLE_BIT|C_ENABLE_BIT)
1348 #elif N_AXIS == 7
1349 #define STEPPERS_ENABLE_MASK (X_ENABLE_BIT|Y_ENABLE_BIT|Z_ENABLE_BIT|A_ENABLE_BIT|B_ENABLE_BIT|C_ENABLE_BIT|U_ENABLE_BIT)
1350 #else
1351 #define STEPPERS_ENABLE_MASK (X_ENABLE_BIT|Y_ENABLE_BIT|Z_ENABLE_BIT|A_ENABLE_BIT|B_ENABLE_BIT|C_ENABLE_BIT|U_ENABLE_BIT|V_ENABLE_BIT)
1352 #endif
1353 #endif
1354 
1355 #endif // STEPPERS_ENABLE_MASK
1356 
1357 #ifndef HOME_MASK
1358 
1359 #define HOME_MASK_BASE (X_HOME_BIT|Y_HOME_BIT|Z_HOME_BIT|HOME2_MASK)
1360 #define HOME_MASK_BASE_SUM (X_HOME_BIT+Y_HOME_BIT+Z_HOME_BIT+HOME2_MASK_SUM)
1361 
1362 #if N_AXIS == 3
1363 #define HOME_MASK HOME_MASK_BASE
1364 #define HOME_MASK_SUM HOME_MASK_BASE_SUM
1365 #define HOME_MIN_CAP AXES_BITMASK
1366 #elif N_AXIS == 4
1367 #define HOME_MASK (HOME_MASK_BASE|A_HOME_BIT)
1368 #define HOME_MASK_SUM (HOME_MASK_BASE_SUM+A_HOME_BIT)
1369 #elif N_AXIS == 5
1370 #define HOME_MASK (HOME_MASK_BASE|A_HOME_BIT|B_HOME_BIT)
1371 #define HOME_MASK_SUM (HOME_MASK_BASE_SUM+A_HOME_BIT+B_HOME_BIT)
1372 #elif N_AXIS == 6
1373 #define HOME_MASK (HOME_MASK_BASE|A_HOME_BIT|B_HOME_BIT|C_HOME_BIT)
1374 #define HOME_MASK_SUM (HOME_MASK_BASE_SUM+A_HOME_BIT+B_HOME_BIT+C_HOME_BIT)
1375 #elif N_AXIS == 7
1376 #define HOME_MASK (HOME_MASK_BASE|A_HOME_BIT|B_HOME_BIT|C_HOME_BIT|U_HOME_BIT)
1377 #define HOME_MASK_SUM (HOME_MASK_BASE_SUM+A_HOME_BIT+B_HOME_BIT+C_HOME_BIT+U_HOME_BIT)
1378 #else
1379 #define HOME_MASK (HOME_MASK_BASE|A_HOME_BIT|B_HOME_BIT|C_HOME_BIT|U_HOME_BIT|V_HOME_BIT)
1380 #define HOME_MASK_SUM (HOME_MASK_BASE_SUM+A_HOME_BIT+B_HOME_BIT+C_HOME_BIT+U_HOME_BIT+V_HOME_BIT)
1381 #endif
1382 
1383 #endif // HOME_MASK
1384 
1385 #ifndef LIMIT_MASK
1386 
1387 #if N_AXIS >=4 && !defined(A_LIMIT_BIT)
1388 #ifdef A_LIMIT_PIN
1389 #define A_LIMIT_BIT (1<<A_LIMIT_PIN)
1390 #else
1391 #define A_LIMIT_BIT 0
1392 #endif
1393 #endif
1394 #if N_AXIS >=5 && !defined(B_LIMIT_BIT)
1395 #ifdef B_LIMIT_PIN
1396 #define B_LIMIT_BIT (1<<B_LIMIT_PIN)
1397 #else
1398 #define B_LIMIT_BIT 0
1399 #endif
1400 #endif
1401 #if N_AXIS >= 6 && !defined(C_LIMIT_BIT)
1402 #ifdef C_LIMIT_PIN
1403 #define C_LIMIT_BIT (1<<C_LIMIT_PIN)
1404 #else
1405 #define C_LIMIT_BIT 0
1406 #endif
1407 #endif
1408 #if N_AXIS >= 7 && !defined(U_LIMIT_BIT)
1409 #ifdef U_LIMIT_PIN
1410 #define U_LIMIT_BIT (1<<U_LIMIT_PIN)
1411 #else
1412 #define U_LIMIT_BIT 0
1413 #endif
1414 #endif
1415 #if N_AXIS == 8 && !defined(V_LIMIT_BIT)
1416 #ifdef V_LIMIT_PIN
1417 #define V_LIMIT_BIT (1<<V_LIMIT_PIN)
1418 #else
1419 #define V_LIMIT_BIT 0
1420 #endif
1421 #endif
1422 
1423 #ifdef Z_LIMIT_POLL
1424 #define LIMIT_MASK_BASE (X_LIMIT_BIT|Y_LIMIT_BIT|LIMIT2_MASK|LIMIT_MAX_MASK)
1425 #define LIMIT_MASK_BASE_SUM (X_LIMIT_BIT+Y_LIMIT_BIT+LIMIT2_MASK_SUM+LIMIT_MAX_SUM)
1426 #else
1427 #define LIMIT_MASK_BASE (X_LIMIT_BIT|Y_LIMIT_BIT|Z_LIMIT_BIT|LIMIT2_MASK|LIMIT_MAX_MASK)
1428 #define LIMIT_MASK_BASE_SUM (X_LIMIT_BIT+Y_LIMIT_BIT+Z_LIMIT_BIT+LIMIT2_MASK_SUM+LIMIT_MAX_SUM)
1429 #endif
1430 
1431 #if N_AXIS == 3
1432 #define LIMIT_MASK LIMIT_MASK_BASE
1433 #define LIMIT_MASK_SUM LIMIT_MASK_BASE_SUM
1434 #define LIMIT_MIN_CAP AXES_BITMASK
1435 #elif N_AXIS == 4
1436 #define LIMIT_MASK (LIMIT_MASK_BASE|A_LIMIT_BIT)
1437 #define LIMIT_MASK_SUM (LIMIT_MASK_BASE_SUM+A_LIMIT_BIT)
1438 #elif N_AXIS == 5
1439 #define LIMIT_MASK (LIMIT_MASK_BASE|A_LIMIT_BIT|B_LIMIT_BIT)
1440 #define LIMIT_MASK_SUM (LIMIT_MASK_BASE_SUM+A_LIMIT_BIT+B_LIMIT_BIT)
1441 #elif N_AXIS == 6
1442 #define LIMIT_MASK (LIMIT_MASK_BASE|A_LIMIT_BIT|B_LIMIT_BIT|C_LIMIT_BIT)
1443 #define LIMIT_MASK_SUM (LIMIT_MASK_BASE_SUM+A_LIMIT_BIT+B_LIMIT_BIT+C_LIMIT_BIT)
1444 #elif N_AXIS == 7
1445 #define LIMIT_MASK (LIMIT_MASK_BASE|A_LIMIT_BIT|B_LIMIT_BIT|C_LIMIT_BIT|U_LIMIT_BIT)
1446 #define LIMIT_MASK_SUM (LIMIT_MASK_BASE_SUM+A_LIMIT_BIT+B_LIMIT_BIT+C_LIMIT_BIT+U_LIMIT_BIT)
1447 #else
1448 #define LIMIT_MASK (LIMIT_MASK_BASE|A_LIMIT_BIT|B_LIMIT_BIT|C_LIMIT_BIT|U_LIMIT_BIT|V_LIMIT_BIT)
1449 #define LIMIT_MASK_SUM (LIMIT_MASK_BASE_SUM+A_LIMIT_BIT+B_LIMIT_BIT+C_LIMIT_BIT+U_LIMIT_BIT+V_LIMIT_BIT)
1450 #endif
1451 
1452 #endif // LIMIT_MASK
1453 
1454 #ifndef MOTOR_FAULT_MASK
1455 
1456 #define MOTOR_FAULT_MASK_BASE (X_MOTOR_FAULT_BIT|Y_MOTOR_FAULT_BIT|Z_MOTOR_FAULT_BIT|MOTOR_FAULT2_MASK)
1457 #define MOTOR_FAULT_MASK_BASE_SUM (X_MOTOR_FAULT_BIT+Y_MOTOR_FAULT_BIT+Z_MOTOR_FAULT_BIT+MOTOR_FAULT2_MASK_SUM)
1458 
1459 #if N_AXIS == 3
1460 #define MOTOR_FAULT_MASK MOTOR_FAULT_MASK_BASE
1461 #define MOTOR_FAULT_MASK_SUM MOTOR_FAULT_MASK_BASE_SUM
1462 #define MOTOR_FAULT_MIN_CAP AXES_BITMASK
1463 #elif N_AXIS == 4
1464 #define MOTOR_FAULT_MASK (MOTOR_FAULT_MASK_BASE|A_MOTOR_FAULT_BIT)
1465 #define MOTOR_FAULT_MASK_SUM (MOTOR_FAULT_MASK_BASE_SUM+A_MOTOR_FAULT_BIT)
1466 #elif N_AXIS == 5
1467 #define MOTOR_FAULT_MASK (MOTOR_FAULT_MASK_BASE|A_MOTOR_FAULT_BIT|B_MOTOR_FAULT_BIT)
1468 #define MOTOR_FAULT_MASK_SUM (MOTOR_FAULT_MASK_BASE_SUM+A_MOTOR_FAULT_BIT+B_MOTOR_FAULT_BIT)
1469 #elif N_AXIS == 6
1470 #define MOTOR_FAULT_MASK (MOTOR_FAULT_MASK_BASE|A_MOTOR_FAULT_BIT|B_MOTOR_FAULT_BIT|C_MOTOR_FAULT_BIT)
1471 #define MOTOR_FAULT_MASK_SUM (MOTOR_FAULT_MASK_BASE_SUM+A_MOTOR_FAULT_BIT+B_MOTOR_FAULT_BIT+C_MOTOR_FAULT_BIT)
1472 #elif N_AXIS == 7
1473 #define MOTOR_FAULT_MASK (MOTOR_FAULT_MASK_BASE|A_MOTOR_FAULT_BIT|B_MOTOR_FAULT_BIT|C_MOTOR_FAULT_BIT|U_MOTOR_FAULT_BIT)
1474 #define MOTOR_FAULT_MASK_SUM (MOTOR_FAULT_MASK_BASE_SUM+A_MOTOR_FAULT_BIT+B_MOTOR_FAULT_BIT+C_MOTOR_FAULT_BIT+U_MOTOR_FAULT_BIT)
1475 #else
1476 #define MOTOR_FAULT_MASK (MOTOR_FAULT_MASK_BASE|A_MOTOR_FAULT_BIT|B_MOTOR_FAULT_BIT|C_MOTOR_FAULT_BIT|U_MOTOR_FAULT_BIT|V_MOTOR_FAULT_BIT)
1477 #define MOTOR_FAULT_MASK_SUM (MOTOR_FAULT_MASK_BASE_SUM+A_MOTOR_FAULT_BIT+B_MOTOR_FAULT_BIT+C_MOTOR_FAULT_BIT+U_MOTOR_FAULT_BIT+V_MOTOR_FAULT_BIT)
1478 #endif
1479 
1480 #endif // MOTOR_FAULT_MASK
1481 
1482 #ifndef N_GANGED
1483 #define N_GANGED 0
1484 #endif
1485 
1486 static void motor_iterator (motor_iterator_callback_ptr callback)
1487 {
1488  motor_map_t motor;
1489 
1490  if(callback) for(motor.id = 0; motor.id < N_AXIS + N_GANGED; motor.id++)
1491  {
1492  if(motor.id < N_AXIS)
1493  motor.axis = motor.id;
1494  else switch (motor.id) {
1495 #ifdef X2_MOTOR
1496  case X2_MOTOR:
1497  motor.axis = X_AXIS;
1498  break;
1499 #endif
1500 #ifdef Y2_MOTOR
1501  case Y2_MOTOR:
1502  motor.axis = Y_AXIS;
1503  break;
1504 #endif
1505 #ifdef Z2_MOTOR
1506  case Z2_MOTOR:
1507  motor.axis = Z_AXIS;
1508  break;
1509 #endif
1510  }
1511  callback(motor);
1512  }
1513 }
1514 
1515 static inline limit_signals_t get_limits_cap (void)
1516 {
1517  limit_signals_t limits = {0};
1518 
1519 #if X_LIMIT_BIT
1520  limits.min.x = On;
1521 #endif
1522 #if Y_LIMIT_BIT
1523  limits.min.y = On;
1524 #endif
1525 #if Z_LIMIT_BIT
1526  limits.min.z = On;
1527 #endif
1528 #if A_LIMIT_BIT
1529  limits.min.a = On;
1530 #endif
1531 #if B_LIMIT_BIT
1532  limits.min.b = On;
1533 #endif
1534 #if C_LIMIT_BIT
1535  limits.min.c = On;
1536 #endif
1537 #if U_LIMIT_BIT
1538  limits.min.u = On;
1539 #endif
1540 #if V_LIMIT_BIT
1541  limits.min.v = On;
1542 #endif
1543 
1544 #if X2_LIMIT_BIT
1545  limits.min2.x = On;
1546 #endif
1547 #if Y2_LIMIT_BIT
1548  limits.min2.y = On;
1549 #endif
1550 #if Z2_LIMIT_BIT
1551  limits.min2.z = On;
1552 #endif
1553 
1554 #if X_LIMIT_BIT_MAX
1555  limits.max.x = On;
1556 #endif
1557 #if Y_LIMIT_BIT_MAX
1558  limits.max.y = On;
1559 #endif
1560 #if Z_LIMIT_BIT_MAX
1561  limits.max.z = On;
1562 #endif
1563 #if A_LIMIT_BIT_MAX
1564  limits.max.a = On;
1565 #endif
1566 #if B_LIMIT_BIT_MAX
1567  limits.max.b = On;
1568 #endif
1569 #if C_LIMIT_BIT_MAX
1570  limits.max.c = On;
1571 #endif
1572 #if U_LIMIT_BIT_MAX
1573  limits.max.u = On;
1574 #endif
1575 #if V_LIMIT_BIT_MAX
1576  limits.max.v = On;
1577 #endif
1578 
1579  return limits;
1580 }
1581 
1582 static inline home_signals_t get_home_cap (void)
1583 {
1584  home_signals_t home = {0};
1585 
1586 #if HOME_MASK
1587 
1588 #if X_HOME_BIT
1589  home.a.x = On;
1590 #endif
1591 #if Y_HOME_BIT
1592  home.a.y = On;
1593 #endif
1594 #if Z_HOME_BIT
1595  home.a.z = On;
1596 #endif
1597 #if A_HOME_BIT
1598  home.a.a = On;
1599 #endif
1600 #if B_HOME_BIT
1601  home.a.b = On;
1602 #endif
1603 #if C_HOME_BIT
1604  home.a.c = On;
1605 #endif
1606 #if U_HOME_BIT
1607  home.a.u = On;
1608 #endif
1609 #if V_HOME_BIT
1610  home.a.v = On;
1611 #endif
1612 
1613 #if X2_HOME_BIT
1614  home.b.x = On;
1615 #endif
1616 #if Y2_HOME_BIT
1617  home.b.y = On;
1618 #endif
1619 #if Z2_HOME_BIT
1620  home.b.z = On;
1621 #endif
1622 
1623 #endif // HOME_MASK
1624 
1625  return home;
1626 }
1627 
1628 static inline home_signals_t get_motor_fault_cap (void)
1629 {
1630  home_signals_t motor_fault = {0};
1631 
1632 #if MOTOR_FAULT_MASK
1633 
1634 #if X_MOTOR_FAULT_BIT
1635  motor_fault.a.x = On;
1636 #endif
1637 #if Y_MOTOR_FAULT_BIT
1638  motor_fault.a.y = On;
1639 #endif
1640 #if Z_MOTOR_FAULT_BIT
1641  motor_fault.a.z = On;
1642 #endif
1643 #if A_MOTOR_FAULT_BIT
1644  motor_fault.a.a = On;
1645 #endif
1646 #if B_MOTOR_FAULT_BIT
1647  motor_fault.a.b = On;
1648 #endif
1649 #if C_MOTOR_FAULT_BIT
1650  motor_fault.a.c = On;
1651 #endif
1652 #if U_MOTOR_FAULT_BIT
1653  motor_fault.a.u = On;
1654 #endif
1655 #if V_MOTOR_FAULT_BIT
1656  motor_fault.a.v = On;
1657 #endif
1658 
1659 #if X2_MOTOR_FAULT_BIT
1660  motor_fault.b.x = On;
1661 #endif
1662 #if Y2_MOTOR_FAULT_BIT
1663  motor_fault.b.y = On;
1664 #endif
1665 #if Z2_MOTOR_FAULT_BIT
1666  motor_fault.b.z = On;
1667 #endif
1668 
1669 #endif // MOTOR_FAULT_MASK
1670 
1671  return motor_fault;
1672 }
1673 
1674 /*EOF*/
#define N_AXIS
Defines number of axes supported - minimum 3, maximum 8. If more than 3 axes are configured a complia...
Definition: config.h:42
void(* motor_iterator_callback_ptr)(motor_map_t motor)
Signature of the callback function to receive motor vs. axis mappings.
Definition: hal.h:225
#define N_GANGED
Definition: motor_pins.h:1483
#define X_AXIS
Definition: nuts_bolts.h:68
#define Z_AXIS
Definition: nuts_bolts.h:70
#define On
Definition: nuts_bolts.h:36
#define Y_AXIS
Definition: nuts_bolts.h:69
Home switches struct, consists of two packed axes_signals_t structs.
Definition: nuts_bolts.h:163
axes_signals_t a
Primary home switches status, optional. Limit signals are used for homing if not available.
Definition: nuts_bolts.h:164
axes_signals_t b
Secondary home switch(es) status, required for auto squaring enabled axes if primary switches are ava...
Definition: nuts_bolts.h:165
uint8_t u
Definition: nuts_bolts.h:136
uint8_t x
Definition: nuts_bolts.h:130
uint8_t y
Definition: nuts_bolts.h:131
uint8_t c
Definition: nuts_bolts.h:135
uint8_t b
Definition: nuts_bolts.h:134
uint8_t v
Definition: nuts_bolts.h:137
uint8_t z
Definition: nuts_bolts.h:132
uint8_t a
Definition: nuts_bolts.h:133
Limit switches struct, consists of four packed axes_signals_t structs in 32 bits.
Definition: nuts_bolts.h:152
axes_signals_t min
Min limit switches status, required.
Definition: nuts_bolts.h:155
axes_signals_t min2
Secondary min limit switch(es) status, required for auto squaring enabled axes.
Definition: nuts_bolts.h:157
axes_signals_t max
Max limit switches status, optional.
Definition: nuts_bolts.h:156
Motor vs. axis mapping NOTE: id and axis values are equal for primary motors, unequal for secondary (...
Definition: hal.h:214
uint32_t axis
Definition: hal.h:218
uint32_t id
Definition: hal.h:217