From 84926b1d5ac9c1f701f35245066e451e2f35b77c Mon Sep 17 00:00:00 2001
From: Alexander Amelkin <mocbuhtig@amelkin.msk.ru>
Date: Fri, 28 Sep 2018 02:02:50 +0300
Subject: [PATCH] HAL general support for DISABLE_JTAG option (#11211)

Some STM32-based boards may use multiplexed JTAG pins as IO. Up to now the `DISABLE_JTAG` option (defined in pins files) was only supported for AT90-based boards. This commit generalizes the code and adds support for boards based on STM32F1 and STM32F4.
---
 Marlin/src/HAL/HAL_AVR/HAL.h     | 4 ++++
 Marlin/src/HAL/HAL_STM32F1/HAL.h | 2 ++
 Marlin/src/HAL/HAL_STM32F4/HAL.h | 2 ++
 Marlin/src/Marlin.cpp            | 9 ++++++---
 4 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/Marlin/src/HAL/HAL_AVR/HAL.h b/Marlin/src/HAL/HAL_AVR/HAL.h
index 84cdc865f08..5a7f41ed2de 100644
--- a/Marlin/src/HAL/HAL_AVR/HAL.h
+++ b/Marlin/src/HAL/HAL_AVR/HAL.h
@@ -352,6 +352,10 @@ inline void HAL_adc_init(void) {
 
 #define HAL_SENSITIVE_PINS 0, 1
 
+#ifdef __AVR_AT90USB1286__
+  #define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0)
+#endif
+
 // AVR compatibility
 #define strtof strtod
 
diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.h b/Marlin/src/HAL/HAL_STM32F1/HAL.h
index 8a436d999a9..bf925c0a14c 100644
--- a/Marlin/src/HAL/HAL_STM32F1/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32F1/HAL.h
@@ -249,4 +249,6 @@ void HAL_enable_AdcFreerun(void);
 #define GET_PIN_MAP_INDEX(pin) pin
 #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
 
+#define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE)
+
 #endif // _HAL_STM32F1_H
diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.h b/Marlin/src/HAL/HAL_STM32F4/HAL.h
index c7565e47ab1..6d51f6e7762 100644
--- a/Marlin/src/HAL/HAL_STM32F4/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32F4/HAL.h
@@ -248,4 +248,6 @@ void HAL_enable_AdcFreerun(void);
 #define GET_PIN_MAP_INDEX(pin) pin
 #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
 
+#define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE)
+
 #endif // _HAL_STM32F4_H
diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index ba9a0862dab..6d787fac485 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -687,9 +687,12 @@ void setup() {
   #endif
 
   #if ENABLED(DISABLE_JTAG)
-    // Disable JTAG on AT90USB chips to free up pins for IO
-    MCUCR = 0x80;
-    MCUCR = 0x80;
+    // Disable JTAG to free up pins for IO
+    #ifdef JTAG_DISABLE
+      JTAG_DISABLE();
+    #else
+      #error "DISABLE_JTAG is not supported for the selected MCU/Board"
+    #endif
   #endif
 
   #if ENABLED(FILAMENT_RUNOUT_SENSOR)