diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index 47fa92db43..e09bd9d5ea 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -138,6 +138,10 @@
#include "feature/caselight.h"
#endif
+#if HAS_FANMUX
+ #include "feature/fanmux.h"
+#endif
+
#if (ENABLED(SWITCHING_EXTRUDER) && !DONT_SWITCH) || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER)
#include "module/tool_change.h"
#endif
diff --git a/Marlin/src/feature/fanmux.cpp b/Marlin/src/feature/fanmux.cpp
new file mode 100644
index 0000000000..3457fe49b4
--- /dev/null
+++ b/Marlin/src/feature/fanmux.cpp
@@ -0,0 +1,55 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/**
+ * feature/pause.cpp - Pause feature support functions
+ * This may be combined with related G-codes if features are consolidated.
+ */
+
+#include "../inc/MarlinConfig.h"
+
+#if HAS_FANMUX
+
+#include "fanmux.h"
+
+void fanmux_switch(const uint8_t e) {
+ WRITE(FANMUX0_PIN, TEST(e, 0) ? HIGH : LOW);
+ #if PIN_EXISTS(FANMUX1)
+ WRITE(FANMUX1_PIN, TEST(e, 1) ? HIGH : LOW);
+ #if PIN_EXISTS(FANMUX2)
+ WRITE(FANMUX2, TEST(e, 2) ? HIGH : LOW);
+ #endif
+ #endif
+}
+
+void fanmux_init(void) {
+ SET_OUTPUT(FANMUX0_PIN);
+ #if PIN_EXISTS(FANMUX1)
+ SET_OUTPUT(FANMUX1_PIN);
+ #if PIN_EXISTS(FANMUX2)
+ SET_OUTPUT(FANMUX2_PIN);
+ #endif
+ #endif
+ fanmux_switch(0);
+}
+
+#endif // HAS_FANMUX
diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h
new file mode 100644
index 0000000000..2524876146
--- /dev/null
+++ b/Marlin/src/feature/fanmux.h
@@ -0,0 +1,33 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/**
+ * feature/fanmux.h - Cooling Fan Multiplexer support functions
+ */
+
+#ifndef _FANMUX_H_
+#define _FANMUX_H_
+
+extern void fanmux_switch(const uint8_t e);
+extern void fanmux_init(void);
+
+#endif // _FANMUX_H_
diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp
index 9deab69982..037e133d99 100644
--- a/Marlin/src/gcode/calibrate/G33.cpp
+++ b/Marlin/src/gcode/calibrate/G33.cpp
@@ -30,9 +30,12 @@
#include "../../module/motion.h"
#include "../../module/stepper.h"
#include "../../module/endstops.h"
-#include "../../module/tool_change.h"
#include "../../lcd/ultralcd.h"
+#if HOTENDS > 1
+ #include "../../module/tool_change.h"
+#endif
+
#if HAS_LEVELING
#include "../../feature/bedlevel/bedlevel.h"
#endif
diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp
index b49486bf7d..03aecfe7b2 100644
--- a/Marlin/src/module/motion.cpp
+++ b/Marlin/src/module/motion.cpp
@@ -39,10 +39,6 @@
#include "../lcd/ultralcd.h"
#endif
-// #if ENABLED(DUAL_X_CARRIAGE)
-// #include "tool_change.h"
-// #endif
-
#if HAS_BED_PROBE
#include "probe.h"
#endif
diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp
index 8d12a82b90..0bcedc80cb 100644
--- a/Marlin/src/module/tool_change.cpp
+++ b/Marlin/src/module/tool_change.cpp
@@ -50,6 +50,10 @@
#include "../feature/bedlevel/bedlevel.h"
#endif
+#if HAS_FANMUX
+ #include "../feature/fanmux.h"
+#endif
+
#if ENABLED(SWITCHING_EXTRUDER)
#if EXTRUDERS > 3
@@ -109,30 +113,6 @@
#endif // PARKING_EXTRUDER
-#if HAS_FANMUX
-
- void fanmux_switch(const uint8_t e) {
- WRITE(FANMUX0_PIN, TEST(e, 0) ? HIGH : LOW);
- #if PIN_EXISTS(FANMUX1)
- WRITE(FANMUX1_PIN, TEST(e, 1) ? HIGH : LOW);
- #if PIN_EXISTS(FANMUX2)
- WRITE(FANMUX2, TEST(e, 2) ? HIGH : LOW);
- #endif
- #endif
- }
-
- FORCE_INLINE void fanmux_init(void){
- SET_OUTPUT(FANMUX0_PIN);
- #if PIN_EXISTS(FANMUX1)
- SET_OUTPUT(FANMUX1_PIN);
- #if PIN_EXISTS(FANMUX2)
- SET_OUTPUT(FANMUX2_PIN);
- #endif
- #endif
- fanmux_switch(0);
- }
-
-#endif // HAS_FANMUX
inline void invalid_extruder_error(const uint8_t e) {
SERIAL_ECHO_START();