My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

stepper_indirection.h 34KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  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. #pragma once
  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. #include "../inc/MarlinConfig.h"
  44. // TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI
  45. #if HAS_DRIVER(TMC26X)
  46. #include <SPI.h>
  47. #ifdef STM32F7
  48. #include "../HAL/HAL_STM32F7/TMC2660.h"
  49. #else
  50. #include <TMC26XStepper.h>
  51. #endif
  52. void tmc26x_init_to_defaults();
  53. #endif
  54. #if HAS_TRINAMIC
  55. #include <TMCStepper.h>
  56. #include "../feature/tmc_util.h"
  57. #if TMCSTEPPER_VERSION < 0x000202
  58. #error "Update TMCStepper library to 0.2.2 or newer."
  59. #endif
  60. #define __TMC_CLASS(MODEL, A, I) TMCMarlin<TMC##MODEL##Stepper, A, I>
  61. #define _TMC_CLASS(MODEL, L) __TMC_CLASS(MODEL, L)
  62. #define TMC_CLASS(ST) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL)
  63. #if HAS_DRIVER(TMC2208)
  64. void tmc2208_serial_begin();
  65. #endif
  66. #endif
  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. void restore_stepper_drivers(); // Called by PSU_ON
  74. void reset_stepper_drivers(); // Called by settings.load / settings.reset
  75. // X Stepper
  76. #if AXIS_DRIVER_TYPE(X, L6470)
  77. extern L6470 stepperX;
  78. #define X_ENABLE_INIT NOOP
  79. #define X_ENABLE_WRITE(STATE) do{ if (STATE) stepperX.Step_Clock(stepperX.getStatus() & STATUS_HIZ); else stepperX.softFree(); }while(0)
  80. #define X_ENABLE_READ (stepperX.getStatus() & STATUS_HIZ)
  81. #define X_DIR_INIT NOOP
  82. #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
  83. #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
  84. #else
  85. #if AXIS_IS_TMC(X)
  86. extern TMC_CLASS(X) stepperX;
  87. #endif
  88. #if AXIS_DRIVER_TYPE(X, TMC26X)
  89. extern TMC26XStepper stepperX;
  90. #define X_ENABLE_INIT NOOP
  91. #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
  92. #define X_ENABLE_READ stepperX.isEnabled()
  93. #elif AXIS_DRIVER_TYPE(X, TMC2660)
  94. #define X_ENABLE_INIT NOOP
  95. #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? stepperX.savedToff() : 0)
  96. #define X_ENABLE_READ stepperX.isEnabled()
  97. #else
  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. // Y Stepper
  110. #if AXIS_DRIVER_TYPE(Y, L6470)
  111. extern L6470 stepperY;
  112. #define Y_ENABLE_INIT NOOP
  113. #define Y_ENABLE_WRITE(STATE) do{ if (STATE) stepperY.Step_Clock(stepperY.getStatus() & STATUS_HIZ); else stepperY.softFree(); }while(0)
  114. #define Y_ENABLE_READ (stepperY.getStatus() & STATUS_HIZ)
  115. #define Y_DIR_INIT NOOP
  116. #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
  117. #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
  118. #else
  119. #if AXIS_IS_TMC(Y)
  120. extern TMC_CLASS(Y) stepperY;
  121. #endif
  122. #if AXIS_DRIVER_TYPE(Y, TMC26X)
  123. extern TMC26XStepper stepperY;
  124. #define Y_ENABLE_INIT NOOP
  125. #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
  126. #define Y_ENABLE_READ stepperY.isEnabled()
  127. #elif AXIS_DRIVER_TYPE(Y, TMC2660)
  128. #define Y_ENABLE_INIT NOOP
  129. #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? stepperY.savedToff() : 0)
  130. #define Y_ENABLE_READ stepperY.isEnabled()
  131. #else
  132. #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
  133. #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
  134. #define Y_ENABLE_READ READ(Y_ENABLE_PIN)
  135. #endif
  136. #define Y_DIR_INIT SET_OUTPUT(Y_DIR_PIN)
  137. #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE)
  138. #define Y_DIR_READ READ(Y_DIR_PIN)
  139. #endif
  140. #define Y_STEP_INIT SET_OUTPUT(Y_STEP_PIN)
  141. #define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE)
  142. #define Y_STEP_READ READ(Y_STEP_PIN)
  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_IS_TMC(Z)
  154. extern TMC_CLASS(Z) stepperZ;
  155. #endif
  156. #if AXIS_DRIVER_TYPE(Z, TMC26X)
  157. extern TMC26XStepper stepperZ;
  158. #define Z_ENABLE_INIT NOOP
  159. #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
  160. #define Z_ENABLE_READ stepperZ.isEnabled()
  161. #elif AXIS_DRIVER_TYPE(Z, TMC2660)
  162. #define Z_ENABLE_INIT NOOP
  163. #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? stepperZ.savedToff() : 0)
  164. #define Z_ENABLE_READ stepperZ.isEnabled()
  165. #else
  166. #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
  167. #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
  168. #define Z_ENABLE_READ READ(Z_ENABLE_PIN)
  169. #endif
  170. #define Z_DIR_INIT SET_OUTPUT(Z_DIR_PIN)
  171. #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE)
  172. #define Z_DIR_READ READ(Z_DIR_PIN)
  173. #endif
  174. #define Z_STEP_INIT SET_OUTPUT(Z_STEP_PIN)
  175. #define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE)
  176. #define Z_STEP_READ READ(Z_STEP_PIN)
  177. // X2 Stepper
  178. #if HAS_X2_ENABLE
  179. #if AXIS_DRIVER_TYPE(X2, L6470)
  180. extern L6470 stepperX2;
  181. #define X2_ENABLE_INIT NOOP
  182. #define X2_ENABLE_WRITE(STATE) do{ if (STATE) stepperX2.Step_Clock(stepperX2.getStatus() & STATUS_HIZ); else stepperX2.softFree(); }while(0)
  183. #define X2_ENABLE_READ (stepperX2.getStatus() & STATUS_HIZ)
  184. #define X2_DIR_INIT NOOP
  185. #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
  186. #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
  187. #else
  188. #if AXIS_IS_TMC(X2)
  189. extern TMC_CLASS(X2) stepperX2;
  190. #endif
  191. #if AXIS_DRIVER_TYPE(X2, TMC26X)
  192. extern TMC26XStepper stepperX2;
  193. #define X2_ENABLE_INIT NOOP
  194. #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
  195. #define X2_ENABLE_READ stepperX2.isEnabled()
  196. #elif AXIS_DRIVER_TYPE(X2, TMC2660)
  197. #define X2_ENABLE_INIT NOOP
  198. #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? stepperX2.savedToff() : 0)
  199. #define X2_ENABLE_READ stepperX2.isEnabled()
  200. #else
  201. #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
  202. #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
  203. #define X2_ENABLE_READ READ(X2_ENABLE_PIN)
  204. #endif
  205. #define X2_DIR_INIT SET_OUTPUT(X2_DIR_PIN)
  206. #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE)
  207. #define X2_DIR_READ READ(X2_DIR_PIN)
  208. #endif
  209. #define X2_STEP_INIT SET_OUTPUT(X2_STEP_PIN)
  210. #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE)
  211. #define X2_STEP_READ READ(X2_STEP_PIN)
  212. #endif
  213. // Y2 Stepper
  214. #if HAS_Y2_ENABLE
  215. #if AXIS_DRIVER_TYPE(Y2, L6470)
  216. extern L6470 stepperY2;
  217. #define Y2_ENABLE_INIT NOOP
  218. #define Y2_ENABLE_WRITE(STATE) do{ if (STATE) stepperY2.Step_Clock(stepperY2.getStatus() & STATUS_HIZ); else stepperY2.softFree(); }while(0)
  219. #define Y2_ENABLE_READ (stepperY2.getStatus() & STATUS_HIZ)
  220. #define Y2_DIR_INIT NOOP
  221. #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
  222. #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
  223. #else
  224. #if AXIS_IS_TMC(Y2)
  225. extern TMC_CLASS(Y2) stepperY2;
  226. #endif
  227. #if AXIS_DRIVER_TYPE(Y2, TMC26X)
  228. extern TMC26XStepper stepperY2;
  229. #define Y2_ENABLE_INIT NOOP
  230. #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
  231. #define Y2_ENABLE_READ stepperY2.isEnabled()
  232. #elif AXIS_DRIVER_TYPE(Y2, TMC2660)
  233. #define Y2_ENABLE_INIT NOOP
  234. #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? stepperY2.savedToff() : 0)
  235. #define Y2_ENABLE_READ stepperY2.isEnabled()
  236. #else
  237. #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
  238. #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
  239. #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN)
  240. #endif
  241. #define Y2_DIR_INIT SET_OUTPUT(Y2_DIR_PIN)
  242. #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE)
  243. #define Y2_DIR_READ READ(Y2_DIR_PIN)
  244. #endif
  245. #define Y2_STEP_INIT SET_OUTPUT(Y2_STEP_PIN)
  246. #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE)
  247. #define Y2_STEP_READ READ(Y2_STEP_PIN)
  248. #endif
  249. // Z2 Stepper
  250. #if HAS_Z2_ENABLE
  251. #if AXIS_DRIVER_TYPE(Z2, L6470)
  252. extern L6470 stepperZ2;
  253. #define Z2_ENABLE_INIT NOOP
  254. #define Z2_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ2.Step_Clock(stepperZ2.getStatus() & STATUS_HIZ); else stepperZ2.softFree(); }while(0)
  255. #define Z2_ENABLE_READ (stepperZ2.getStatus() & STATUS_HIZ)
  256. #define Z2_DIR_INIT NOOP
  257. #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
  258. #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
  259. #else
  260. #if AXIS_IS_TMC(Z2)
  261. extern TMC_CLASS(Z2) stepperZ2;
  262. #endif
  263. #if AXIS_DRIVER_TYPE(Z2, TMC26X)
  264. extern TMC26XStepper stepperZ2;
  265. #define Z2_ENABLE_INIT NOOP
  266. #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
  267. #define Z2_ENABLE_READ stepperZ2.isEnabled()
  268. #elif AXIS_DRIVER_TYPE(Z2, TMC2660)
  269. #define Z2_ENABLE_INIT NOOP
  270. #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? stepperZ2.savedToff() : 0)
  271. #define Z2_ENABLE_READ stepperZ2.isEnabled()
  272. #else
  273. #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
  274. #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
  275. #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN)
  276. #endif
  277. #define Z2_DIR_INIT SET_OUTPUT(Z2_DIR_PIN)
  278. #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE)
  279. #define Z2_DIR_READ READ(Z2_DIR_PIN)
  280. #endif
  281. #define Z2_STEP_INIT SET_OUTPUT(Z2_STEP_PIN)
  282. #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE)
  283. #define Z2_STEP_READ READ(Z2_STEP_PIN)
  284. #endif
  285. // Z3 Stepper
  286. #if HAS_Z3_ENABLE
  287. #if ENABLED(Z3_IS_L6470)
  288. extern L6470 stepperZ3;
  289. #define Z3_ENABLE_INIT NOOP
  290. #define Z3_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ3.Step_Clock(stepperZ3.getStatus() & STATUS_HIZ); else stepperZ3.softFree(); }while(0)
  291. #define Z3_ENABLE_READ (stepperZ3.getStatus() & STATUS_HIZ)
  292. #define Z3_DIR_INIT NOOP
  293. #define Z3_DIR_WRITE(STATE) stepperZ3.Step_Clock(STATE)
  294. #define Z3_DIR_READ (stepperZ3.getStatus() & STATUS_DIR)
  295. #else
  296. #if AXIS_IS_TMC(Z3)
  297. extern TMC_CLASS(Z3) stepperZ3;
  298. #endif
  299. #if ENABLED(Z3_IS_TMC26X)
  300. extern TMC26XStepper stepperZ3;
  301. #define Z3_ENABLE_INIT NOOP
  302. #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE)
  303. #define Z3_ENABLE_READ stepperZ3.isEnabled()
  304. #elif AXIS_DRIVER_TYPE(Z3, TMC2660)
  305. #define Z3_ENABLE_INIT NOOP
  306. #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? stepperZ3.savedToff() : 0)
  307. #define Z3_ENABLE_READ stepperZ3.isEnabled()
  308. #else
  309. #define Z3_ENABLE_INIT SET_OUTPUT(Z3_ENABLE_PIN)
  310. #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE)
  311. #define Z3_ENABLE_READ READ(Z3_ENABLE_PIN)
  312. #endif
  313. #define Z3_DIR_INIT SET_OUTPUT(Z3_DIR_PIN)
  314. #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE)
  315. #define Z3_DIR_READ READ(Z3_DIR_PIN)
  316. #endif
  317. #define Z3_STEP_INIT SET_OUTPUT(Z3_STEP_PIN)
  318. #define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE)
  319. #define Z3_STEP_READ READ(Z3_STEP_PIN)
  320. #endif
  321. // E0 Stepper
  322. #if AXIS_DRIVER_TYPE(E0, L6470)
  323. extern L6470 stepperE0;
  324. #define E0_ENABLE_INIT NOOP
  325. #define E0_ENABLE_WRITE(STATE) do{ if (STATE) stepperE0.Step_Clock(stepperE0.getStatus() & STATUS_HIZ); else stepperE0.softFree(); }while(0)
  326. #define E0_ENABLE_READ (stepperE0.getStatus() & STATUS_HIZ)
  327. #define E0_DIR_INIT NOOP
  328. #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
  329. #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
  330. #else
  331. #if AXIS_IS_TMC(E0)
  332. extern TMC_CLASS(E0) stepperE0;
  333. #endif
  334. #if AXIS_DRIVER_TYPE(E0, TMC26X)
  335. extern TMC26XStepper stepperE0;
  336. #define E0_ENABLE_INIT NOOP
  337. #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
  338. #define E0_ENABLE_READ stepperE0.isEnabled()
  339. #elif AXIS_DRIVER_TYPE(E0, TMC2660)
  340. #define E0_ENABLE_INIT NOOP
  341. #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? stepperE0.savedToff() : 0)
  342. #define E0_ENABLE_READ stepperE0.isEnabled()
  343. #else
  344. #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
  345. #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
  346. #define E0_ENABLE_READ READ(E0_ENABLE_PIN)
  347. #endif
  348. #define E0_DIR_INIT SET_OUTPUT(E0_DIR_PIN)
  349. #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE)
  350. #define E0_DIR_READ READ(E0_DIR_PIN)
  351. #endif
  352. #define E0_STEP_INIT SET_OUTPUT(E0_STEP_PIN)
  353. #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE)
  354. #define E0_STEP_READ READ(E0_STEP_PIN)
  355. // E1 Stepper
  356. #if AXIS_DRIVER_TYPE(E1, L6470)
  357. extern L6470 stepperE1;
  358. #define E1_ENABLE_INIT NOOP
  359. #define E1_ENABLE_WRITE(STATE) do{ if (STATE) stepperE1.Step_Clock(stepperE1.getStatus() & STATUS_HIZ); else stepperE1.softFree(); }while(0)
  360. #define E1_ENABLE_READ (stepperE1.getStatus() & STATUS_HIZ)
  361. #define E1_DIR_INIT NOOP
  362. #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
  363. #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
  364. #else
  365. #if AXIS_IS_TMC(E1)
  366. extern TMC_CLASS(E1) stepperE1;
  367. #endif
  368. #if AXIS_DRIVER_TYPE(E1, TMC26X)
  369. extern TMC26XStepper stepperE1;
  370. #define E1_ENABLE_INIT NOOP
  371. #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
  372. #define E1_ENABLE_READ stepperE1.isEnabled()
  373. #elif AXIS_DRIVER_TYPE(E1, TMC2660)
  374. #define E1_ENABLE_INIT NOOP
  375. #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? stepperE1.savedToff() : 0)
  376. #define E1_ENABLE_READ stepperE1.isEnabled()
  377. #else
  378. #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
  379. #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
  380. #define E1_ENABLE_READ READ(E1_ENABLE_PIN)
  381. #endif
  382. #define E1_DIR_INIT SET_OUTPUT(E1_DIR_PIN)
  383. #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE)
  384. #define E1_DIR_READ READ(E1_DIR_PIN)
  385. #endif
  386. #define E1_STEP_INIT SET_OUTPUT(E1_STEP_PIN)
  387. #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE)
  388. #define E1_STEP_READ READ(E1_STEP_PIN)
  389. // E2 Stepper
  390. #if AXIS_DRIVER_TYPE(E2, L6470)
  391. extern L6470 stepperE2;
  392. #define E2_ENABLE_INIT NOOP
  393. #define E2_ENABLE_WRITE(STATE) do{ if (STATE) stepperE2.Step_Clock(stepperE2.getStatus() & STATUS_HIZ); else stepperE2.softFree(); }while(0)
  394. #define E2_ENABLE_READ (stepperE2.getStatus() & STATUS_HIZ)
  395. #define E2_DIR_INIT NOOP
  396. #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
  397. #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
  398. #else
  399. #if AXIS_IS_TMC(E2)
  400. extern TMC_CLASS(E2) stepperE2;
  401. #endif
  402. #if AXIS_DRIVER_TYPE(E2, TMC26X)
  403. extern TMC26XStepper stepperE2;
  404. #define E2_ENABLE_INIT NOOP
  405. #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
  406. #define E2_ENABLE_READ stepperE2.isEnabled()
  407. #elif AXIS_DRIVER_TYPE(E2, TMC2660)
  408. #define E2_ENABLE_INIT NOOP
  409. #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? stepperE2.savedToff() : 0)
  410. #define E2_ENABLE_READ stepperE2.isEnabled()
  411. #else
  412. #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
  413. #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
  414. #define E2_ENABLE_READ READ(E2_ENABLE_PIN)
  415. #endif
  416. #define E2_DIR_INIT SET_OUTPUT(E2_DIR_PIN)
  417. #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE)
  418. #define E2_DIR_READ READ(E2_DIR_PIN)
  419. #endif
  420. #define E2_STEP_INIT SET_OUTPUT(E2_STEP_PIN)
  421. #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE)
  422. #define E2_STEP_READ READ(E2_STEP_PIN)
  423. // E3 Stepper
  424. #if AXIS_DRIVER_TYPE(E3, L6470)
  425. extern L6470 stepperE3;
  426. #define E3_ENABLE_INIT NOOP
  427. #define E3_ENABLE_WRITE(STATE) do{ if (STATE) stepperE3.Step_Clock(stepperE3.getStatus() & STATUS_HIZ); else stepperE3.softFree(); }while(0)
  428. #define E3_ENABLE_READ (stepperE3.getStatus() & STATUS_HIZ)
  429. #define E3_DIR_INIT NOOP
  430. #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
  431. #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
  432. #else
  433. #if AXIS_IS_TMC(E3)
  434. extern TMC_CLASS(E3) stepperE3;
  435. #endif
  436. #if AXIS_DRIVER_TYPE(E3, TMC26X)
  437. extern TMC26XStepper stepperE3;
  438. #define E3_ENABLE_INIT NOOP
  439. #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
  440. #define E3_ENABLE_READ stepperE3.isEnabled()
  441. #elif AXIS_DRIVER_TYPE(E3, TMC2660)
  442. #define E3_ENABLE_INIT NOOP
  443. #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? stepperE3.savedToff() : 0)
  444. #define E3_ENABLE_READ stepperE3.isEnabled()
  445. #else
  446. #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
  447. #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
  448. #define E3_ENABLE_READ READ(E3_ENABLE_PIN)
  449. #endif
  450. #define E3_DIR_INIT SET_OUTPUT(E3_DIR_PIN)
  451. #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE)
  452. #define E3_DIR_READ READ(E3_DIR_PIN)
  453. #endif
  454. #define E3_STEP_INIT SET_OUTPUT(E3_STEP_PIN)
  455. #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE)
  456. #define E3_STEP_READ READ(E3_STEP_PIN)
  457. // E4 Stepper
  458. #if AXIS_DRIVER_TYPE(E4, L6470)
  459. extern L6470 stepperE4;
  460. #define E4_ENABLE_INIT NOOP
  461. #define E4_ENABLE_WRITE(STATE) do{ if (STATE) stepperE4.Step_Clock(stepperE4.getStatus() & STATUS_HIZ); else stepperE4.softFree(); }while(0)
  462. #define E4_ENABLE_READ (stepperE4.getStatus() & STATUS_HIZ)
  463. #define E4_DIR_INIT NOOP
  464. #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
  465. #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
  466. #else
  467. #if AXIS_IS_TMC(E4)
  468. extern TMC_CLASS(E4) stepperE4;
  469. #endif
  470. #if AXIS_DRIVER_TYPE(E4, TMC26X)
  471. extern TMC26XStepper stepperE4;
  472. #define E4_ENABLE_INIT NOOP
  473. #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
  474. #define E4_ENABLE_READ stepperE4.isEnabled()
  475. #elif AXIS_DRIVER_TYPE(E4, TMC2660)
  476. #define E4_ENABLE_INIT NOOP
  477. #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? stepperE4.savedToff() : 0)
  478. #define E4_ENABLE_READ stepperE4.isEnabled()
  479. #else
  480. #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
  481. #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
  482. #define E4_ENABLE_READ READ(E4_ENABLE_PIN)
  483. #endif
  484. #define E4_DIR_INIT SET_OUTPUT(E4_DIR_PIN)
  485. #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE)
  486. #define E4_DIR_READ READ(E4_DIR_PIN)
  487. #endif
  488. #define E4_STEP_INIT SET_OUTPUT(E4_STEP_PIN)
  489. #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
  490. #define E4_STEP_READ READ(E4_STEP_PIN)
  491. // E5 Stepper
  492. #if AXIS_DRIVER_TYPE(E5, L6470)
  493. extern L6470 stepperE5;
  494. #define E5_ENABLE_INIT NOOP
  495. #define E5_ENABLE_WRITE(STATE) do{ if (STATE) stepperE5.Step_Clock(stepperE5.getStatus() & STATUS_HIZ); else stepperE5.softFree(); }while(0)
  496. #define E5_ENABLE_READ (stepperE5.getStatus() & STATUS_HIZ)
  497. #define E5_DIR_INIT NOOP
  498. #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
  499. #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
  500. #else
  501. #if AXIS_IS_TMC(E5)
  502. extern TMC_CLASS(E5) stepperE5;
  503. #endif
  504. #if AXIS_DRIVER_TYPE(E5, TMC26X)
  505. extern TMC26XStepper stepperE5;
  506. #define E5_ENABLE_INIT NOOP
  507. #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
  508. #define E5_ENABLE_READ stepperE5.isEnabled()
  509. #elif AXIS_DRIVER_TYPE(E5, TMC2660)
  510. #define E5_ENABLE_INIT NOOP
  511. #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? stepperE5.savedToff() : 0)
  512. #define E5_ENABLE_READ stepperE5.isEnabled()
  513. #else
  514. #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
  515. #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
  516. #define E5_ENABLE_READ READ(E5_ENABLE_PIN)
  517. #endif
  518. #define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN)
  519. #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE)
  520. #define E5_DIR_READ READ(E5_DIR_PIN)
  521. #endif
  522. #define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN)
  523. #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE)
  524. #define E5_STEP_READ READ(E5_STEP_PIN)
  525. /**
  526. * Extruder indirection for the single E axis
  527. */
  528. #if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
  529. #if EXTRUDERS > 5
  530. #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)
  531. #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)
  532. #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)
  533. #elif EXTRUDERS > 4
  534. #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)
  535. #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)
  536. #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)
  537. #elif EXTRUDERS > 3
  538. #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
  539. #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)
  540. #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)
  541. #elif EXTRUDERS > 2
  542. #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
  543. #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)
  544. #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)
  545. #else
  546. #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
  547. #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
  548. #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0)
  549. #endif
  550. #elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index
  551. #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
  552. #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0)
  553. #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
  554. #elif E_STEPPERS > 5
  555. #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)
  556. #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)
  557. #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)
  558. #elif E_STEPPERS > 4
  559. #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)
  560. #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)
  561. #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)
  562. #elif E_STEPPERS > 3
  563. #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)
  564. #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)
  565. #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)
  566. #elif E_STEPPERS > 2
  567. #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)
  568. #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)
  569. #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)
  570. #elif E_STEPPERS > 1
  571. #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE)
  572. #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } \
  573. else if ((E) == 0) { E0_STEP_WRITE(V); } \
  574. else { E1_STEP_WRITE(V); } }while(0)
  575. #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } \
  576. else if ((E) == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } \
  577. else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
  578. #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } \
  579. else if ((E) == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } \
  580. else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
  581. #else
  582. #define E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
  583. #define NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
  584. #define REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
  585. #endif
  586. #else
  587. #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
  588. #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR)
  589. #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR)
  590. #endif
  591. //
  592. // Stepper enable / disable
  593. //
  594. #if HAS_X2_ENABLE
  595. #define enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0)
  596. #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0)
  597. #elif HAS_X_ENABLE
  598. #define enable_X() X_ENABLE_WRITE( X_ENABLE_ON)
  599. #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0)
  600. #else
  601. #define enable_X() NOOP
  602. #define disable_X() NOOP
  603. #endif
  604. #if HAS_Y2_ENABLE
  605. #define enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0)
  606. #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0)
  607. #elif HAS_Y_ENABLE
  608. #define enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON)
  609. #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0)
  610. #else
  611. #define enable_Y() NOOP
  612. #define disable_Y() NOOP
  613. #endif
  614. #if HAS_Z3_ENABLE
  615. #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); Z3_ENABLE_WRITE(Z_ENABLE_ON); }while(0)
  616. #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); Z3_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
  617. #elif HAS_Z2_ENABLE
  618. #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0)
  619. #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
  620. #elif HAS_Z_ENABLE
  621. #define enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON)
  622. #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0)
  623. #else
  624. #define enable_Z() NOOP
  625. #define disable_Z() NOOP
  626. #endif
  627. #if ENABLED(MIXING_EXTRUDER)
  628. /**
  629. * Mixing steppers synchronize their enable (and direction) together
  630. */
  631. #if MIXING_STEPPERS > 5
  632. #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); E5_ENABLE_WRITE( E_ENABLE_ON); }
  633. #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); E5_ENABLE_WRITE(!E_ENABLE_ON); }
  634. #elif MIXING_STEPPERS > 4
  635. #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); }
  636. #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); }
  637. #elif MIXING_STEPPERS > 3
  638. #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); }
  639. #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); }
  640. #elif MIXING_STEPPERS > 2
  641. #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); }
  642. #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); }
  643. #else
  644. #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); }
  645. #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); }
  646. #endif
  647. #define enable_E1() NOOP
  648. #define disable_E1() NOOP
  649. #define enable_E2() NOOP
  650. #define disable_E2() NOOP
  651. #define enable_E3() NOOP
  652. #define disable_E3() NOOP
  653. #define enable_E4() NOOP
  654. #define disable_E4() NOOP
  655. #define enable_E5() NOOP
  656. #define disable_E5() NOOP
  657. #else // !MIXING_EXTRUDER
  658. #if HAS_E0_ENABLE
  659. #define enable_E0() E0_ENABLE_WRITE( E_ENABLE_ON)
  660. #define disable_E0() E0_ENABLE_WRITE(!E_ENABLE_ON)
  661. #else
  662. #define enable_E0() NOOP
  663. #define disable_E0() NOOP
  664. #endif
  665. #if E_STEPPERS > 1 && HAS_E1_ENABLE
  666. #define enable_E1() E1_ENABLE_WRITE( E_ENABLE_ON)
  667. #define disable_E1() E1_ENABLE_WRITE(!E_ENABLE_ON)
  668. #else
  669. #define enable_E1() NOOP
  670. #define disable_E1() NOOP
  671. #endif
  672. #if E_STEPPERS > 2 && HAS_E2_ENABLE
  673. #define enable_E2() E2_ENABLE_WRITE( E_ENABLE_ON)
  674. #define disable_E2() E2_ENABLE_WRITE(!E_ENABLE_ON)
  675. #else
  676. #define enable_E2() NOOP
  677. #define disable_E2() NOOP
  678. #endif
  679. #if E_STEPPERS > 3 && HAS_E3_ENABLE
  680. #define enable_E3() E3_ENABLE_WRITE( E_ENABLE_ON)
  681. #define disable_E3() E3_ENABLE_WRITE(!E_ENABLE_ON)
  682. #else
  683. #define enable_E3() NOOP
  684. #define disable_E3() NOOP
  685. #endif
  686. #if E_STEPPERS > 4 && HAS_E4_ENABLE
  687. #define enable_E4() E4_ENABLE_WRITE( E_ENABLE_ON)
  688. #define disable_E4() E4_ENABLE_WRITE(!E_ENABLE_ON)
  689. #else
  690. #define enable_E4() NOOP
  691. #define disable_E4() NOOP
  692. #endif
  693. #if E_STEPPERS > 5 && HAS_E5_ENABLE
  694. #define enable_E5() E5_ENABLE_WRITE( E_ENABLE_ON)
  695. #define disable_E5() E5_ENABLE_WRITE(!E_ENABLE_ON)
  696. #else
  697. #define enable_E5() NOOP
  698. #define disable_E5() NOOP
  699. #endif
  700. #endif // !MIXING_EXTRUDER