diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 47cedf5f65e2..a0b51f011182 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -1,93 +1,8 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
#pragma once
-
-/**
- * Configuration.h
- *
- * Basic settings such as:
- *
- * - Type of electronics
- * - Type of temperature sensor
- * - Printer geometry
- * - Endstop configuration
- * - LCD controller
- * - Extra features
- *
- * Advanced settings can be found in Configuration_adv.h
- */
#define CONFIGURATION_H_VERSION 02010100
-
-//===========================================================================
-//============================= Getting Started =============================
-//===========================================================================
-
-/**
- * Here are some useful links to help get your machine configured and calibrated:
- *
- * Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all
- *
- * Průša Calculator: https://blog.prusaprinters.org/calculator_3416/
- *
- * Calibration Guides: https://reprap.org/wiki/Calibration
- * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
- * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap
- * https://youtu.be/wAL9d7FgInk
- *
- * Calibration Objects: https://www.thingiverse.com/thing:5573
- * https://www.thingiverse.com/thing:1278865
- */
-
-// @section info
-
-// Author info of this build printed to the host during boot and M115
-#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
-//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
-
-/**
- * *** VENDORS PLEASE READ ***
- *
- * Marlin allows you to add a custom boot image for Graphical LCDs.
- * With this option Marlin will first show your custom screen followed
- * by the standard Marlin logo with version number and web URL.
- *
- * We encourage you to take advantage of this new feature and we also
- * respectfully request that you retain the unmodified Marlin boot screen.
- */
-
-// Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION **
-#define SHOW_BOOTSCREEN
-
-// Show the bitmap in Marlin/_Bootscreen.h on startup.
-//#define SHOW_CUSTOM_BOOTSCREEN
-
-// Show the bitmap in Marlin/_Statusscreen.h on the status screen.
-//#define CUSTOM_STATUS_SCREEN_IMAGE
-
-// @section machine
-
-// Choose the name from boards.h that matches your setup
+#define STRING_CONFIG_H_AUTHOR "NWa" // Who made the changes.
#ifndef MOTHERBOARD
-#define MOTHERBOARD BOARD_MKS_TINYBEE
+ #define MOTHERBOARD BOARD_BTT_GTR_V1_0
#endif
/**
@@ -98,47 +13,25 @@
*
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
*/
-#define SERIAL_PORT 0
-
-/**
- * Serial Port Baud Rate
- * This is the default communication speed for all serial ports.
- * Set the baud rate defaults for additional serial ports below.
- *
- * 250000 works in most cases, but you might try a lower speed if
- * you commonly experience drop-outs during host printing.
- * You may try up to 1000000 to speed up SD file transfer.
- *
- * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000]
- */
+#define SERIAL_PORT 6
#define BAUDRATE 115200
-//#define BAUD_RATE_GCODE // Enable G-code M575 to set the baud rate
-/**
- * Select a secondary serial port on the board to use for communication with the host.
- * Currently Ethernet (-2) is only supported on Teensy 4.1 boards.
- * :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
- */
#define SERIAL_PORT_2 -1
-//#define BAUDRATE_2 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
+#define BAUDRATE_2 115200 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
-/**
- * Select a third serial port on the board to use for communication with the host.
- * Currently only supported for AVR, DUE, LPC1768/9 and STM32/STM32F1
- * :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
- */
-//#define SERIAL_PORT_3 1
-//#define BAUDRATE_3 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
+#define SERIAL_PORT_3 1
+#define BAUDRATE_3 115200 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
-// Enable the Bluetooth serial interface on AT90USB devices
-//#define BLUETOOTH
+#define SERIAL_PORT_4 3
+#define BAUDRATE_4 115200 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
+
+// #define HARDWARE_SERIAL2_RX 16
+// #define HARDWARE_SERIAL2_TX 17
// Name displayed in the LCD "Ready" message and Info menu
-//#define CUSTOM_MACHINE_NAME "3D Printer"
+#define CUSTOM_MACHINE_NAME "NWa Marlin All-in-One"
-// Printer's unique ID, used by some programs to differentiate between machines.
-// Choose your own or use a service like https://www.uuidgenerator.net/version4
-//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
+// @section stepper drivers
/**
* Stepper Drivers
@@ -158,19 +51,19 @@
#define X_DRIVER_TYPE A4988
#define Y_DRIVER_TYPE A4988
#define Z_DRIVER_TYPE A4988
-//#define X2_DRIVER_TYPE A4988
-//#define Y2_DRIVER_TYPE A4988
-//#define Z2_DRIVER_TYPE A4988
+//#define X2_DRIVER_TYPE TMC2209
+#define Y2_DRIVER_TYPE A4988
+#define Z2_DRIVER_TYPE A4988
//#define Z3_DRIVER_TYPE A4988
//#define Z4_DRIVER_TYPE A4988
-//#define I_DRIVER_TYPE A4988
+#define I_DRIVER_TYPE A4988
//#define J_DRIVER_TYPE A4988
//#define K_DRIVER_TYPE A4988
//#define U_DRIVER_TYPE A4988
//#define V_DRIVER_TYPE A4988
//#define W_DRIVER_TYPE A4988
#define E0_DRIVER_TYPE A4988
-//#define E1_DRIVER_TYPE A4988
+#define E1_DRIVER_TYPE A4988
//#define E2_DRIVER_TYPE A4988
//#define E3_DRIVER_TYPE A4988
//#define E4_DRIVER_TYPE A4988
@@ -178,48 +71,6 @@
//#define E6_DRIVER_TYPE A4988
//#define E7_DRIVER_TYPE A4988
-/**
- * Additional Axis Settings
- *
- * Define AXISn_ROTATES for all axes that rotate or pivot.
- * Rotational axis coordinates are expressed in degrees.
- *
- * AXISn_NAME defines the letter used to refer to the axis in (most) G-code commands.
- * By convention the names and roles are typically:
- * 'A' : Rotational axis parallel to X
- * 'B' : Rotational axis parallel to Y
- * 'C' : Rotational axis parallel to Z
- * 'U' : Secondary linear axis parallel to X
- * 'V' : Secondary linear axis parallel to Y
- * 'W' : Secondary linear axis parallel to Z
- *
- * Regardless of these settings the axes are internally named I, J, K, U, V, W.
- */
-#ifdef I_DRIVER_TYPE
-#define AXIS4_NAME 'A' // :['A', 'B', 'C', 'U', 'V', 'W']
-#define AXIS4_ROTATES
-#endif
-#ifdef J_DRIVER_TYPE
-#define AXIS5_NAME 'B' // :['B', 'C', 'U', 'V', 'W']
-#define AXIS5_ROTATES
-#endif
-#ifdef K_DRIVER_TYPE
-#define AXIS6_NAME 'C' // :['C', 'U', 'V', 'W']
-#define AXIS6_ROTATES
-#endif
-#ifdef U_DRIVER_TYPE
-#define AXIS7_NAME 'U' // :['U', 'V', 'W']
-//#define AXIS7_ROTATES
-#endif
-#ifdef V_DRIVER_TYPE
-#define AXIS8_NAME 'V' // :['V', 'W']
-//#define AXIS8_ROTATES
-#endif
-#ifdef W_DRIVER_TYPE
-#define AXIS9_NAME 'W' // :['W']
-//#define AXIS9_ROTATES
-#endif
-
// @section extruder
// This defines the number of extruders
@@ -229,89 +80,6 @@
// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc.
#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75
-// For Cyclops or any "multi-extruder" that shares a single nozzle.
-//#define SINGLENOZZLE
-
-// Save and restore temperature and fan speed on tool-change.
-// Set standby for the unselected tool with M104/106/109 T...
-#if ENABLED(SINGLENOZZLE)
-//#define SINGLENOZZLE_STANDBY_TEMP
-//#define SINGLENOZZLE_STANDBY_FAN
-#endif
-
-/**
- * Multi-Material Unit
- * Set to one of these predefined models:
- *
- * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version)
- * PRUSA_MMU2 : Průša MMU2
- * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5)
- * EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
- * EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
- *
- * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
- * See additional options in Configuration_adv.h.
- */
-//#define MMU_MODEL PRUSA_MMU2
-
-// A dual extruder that uses a single stepper motor
-//#define SWITCHING_EXTRUDER
-#if ENABLED(SWITCHING_EXTRUDER)
-#define SWITCHING_EXTRUDER_SERVO_NR 0
-#define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3]
-#if EXTRUDERS > 3
-#define SWITCHING_EXTRUDER_E23_SERVO_NR 1
-#endif
-#endif
-
-// A dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles
-//#define SWITCHING_NOZZLE
-#if ENABLED(SWITCHING_NOZZLE)
-#define SWITCHING_NOZZLE_SERVO_NR 0
-//#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second
-#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 (single servo) or lowered/raised (dual servo)
-#define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move
-#endif
-
-/**
- * Two separate X-carriages with extruders that connect to a moving part
- * via a solenoid docking mechanism. Requires SOL1_PIN and SOL2_PIN.
- */
-//#define PARKING_EXTRUDER
-
-/**
- * Two separate X-carriages with extruders that connect to a moving part
- * via a magnetic docking mechanism using movements and no solenoid
- *
- * project : https://www.thingiverse.com/thing:3080893
- * movements : https://youtu.be/0xCEiG9VS3k
- * https://youtu.be/Bqbcs0CU2FE
- */
-//#define MAGNETIC_PARKING_EXTRUDER
-
-#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER)
-
-#define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders
-#define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder
-
-#if ENABLED(PARKING_EXTRUDER)
-
-#define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage
-#define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil
-#define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // (ms) Delay for magnetic field. No delay if 0 or not defined.
-//#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381
-
-#elif ENABLED(MAGNETIC_PARKING_EXTRUDER)
-
-#define MPE_FAST_SPEED 9000 // (mm/min) Speed for travel before last distance point
-#define MPE_SLOW_SPEED 4500 // (mm/min) Speed for last distance travel to park and couple
-#define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point
-#define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling
-
-#endif
-
-#endif
-
/**
* Switching Toolhead
*
@@ -338,97 +106,26 @@
//#define ELECTROMAGNETIC_SWITCHING_TOOLHEAD
#if ANY(SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD)
-#define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock
-#define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis
-#define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis
-#define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders
-#if ENABLED(SWITCHING_TOOLHEAD)
-#define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector
-#define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock
-#elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD)
-#define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis
-#define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1)
-//#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock
-#if ENABLED(PRIME_BEFORE_REMOVE)
-#define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length
-#define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length
-#define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate
-#define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate
-#endif
-#elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD)
-#define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching
-#endif
-#endif
-
-/**
- * "Mixing Extruder"
- * - Adds G-codes M163 and M164 to set and "commit" the current mix factors.
- * - Extends the stepping routines to move multiple steppers in proportion to the mix.
- * - Optional support for Repetier Firmware's 'M164 S' supporting virtual tools.
- * - This implementation supports up to two mixing extruders.
- * - Enable DIRECT_MIXING_IN_G1 for M165 and mixing in G1 (from Pia Taubert's reference implementation).
- */
-//#define MIXING_EXTRUDER
-#if ENABLED(MIXING_EXTRUDER)
-#define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder
-#define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164
-//#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands
-//#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD
-//#define MIXING_PRESETS // Assign 8 default V-tool presets for 2 or 3 MIXING_STEPPERS
-#if ENABLED(GRADIENT_MIX)
-//#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias
-#endif
-#endif
-
-// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing).
-// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder).
-// For the other hotends it is their distance from the extruder 0 hotend.
-//#define HOTEND_OFFSET_X { 0.0, 20.00 } // (mm) relative X-offset for each nozzle
-//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle
-//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle
-
-// @section psu control
-
-/**
- * Power Supply Control
- *
- * Enable and connect the power supply to the PS_ON_PIN.
- * Specify whether the power supply is active HIGH or active LOW.
- */
-//#define PSU_CONTROL
-//#define PSU_NAME "Power Supply"
-
-#if ENABLED(PSU_CONTROL)
-//#define MKS_PWC // Using the MKS PWC add-on
-//#define PS_OFF_CONFIRM // Confirm dialog when power off
-//#define PS_OFF_SOUND // Beep 1s when power off
-#define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box
-
-//#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80
-//#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power
-//#define LED_POWEROFF_TIMEOUT 10000 // (ms) Turn off LEDs after power-off, with this amount of delay
-
-//#define POWER_OFF_TIMER // Enable M81 D to power off after a delay
-//#define POWER_OFF_WAIT_FOR_COOLDOWN // Enable M81 S to power off only after cooldown
-
-//#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on)
-//#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off)
-
-//#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin
-#if ENABLED(AUTO_POWER_CONTROL)
-#define AUTO_POWER_FANS // Turn on PSU if fans need power
-#define AUTO_POWER_E_FANS
-#define AUTO_POWER_CONTROLLERFAN
-#define AUTO_POWER_CHAMBER_FAN
-#define AUTO_POWER_COOLER_FAN
-#define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration
-//#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time.
-#endif
-#if EITHER(AUTO_POWER_CONTROL, POWER_OFF_WAIT_FOR_COOLDOWN)
-//#define AUTO_POWER_E_TEMP 50 // (°C) PSU on if any extruder is over this temperature
-//#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) PSU on if the chamber is over this temperature
-//#define AUTO_POWER_COOLER_TEMP 26 // (°C) PSU on if the cooler is over this temperature
-#endif
+ #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock
+ #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis
+ #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis
+ #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders
+ #if ENABLED(SWITCHING_TOOLHEAD)
+ #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector
+ #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock
+ #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD)
+ #define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis
+ #define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1)
+ //#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock
+ #if ENABLED(PRIME_BEFORE_REMOVE)
+ #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length
+ #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length
+ #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate
+ #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate
+ #endif
+ #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD)
+ #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching
+ #endif
#endif
//===========================================================================
@@ -490,7 +187,7 @@
* 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950
* 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950
* 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950
- * 66 : 4.7MΩ Dyze Design High Temperature Thermistor
+ * 66 : 4.7MΩ Dyze Design / Trianglelab T-D500 500°C High Temperature Thermistor
* 67 : 500kΩ SliceEngineering 450°C Thermistor
* 68 : PT100 amplifier board from Dyze Design
* 70 : 100kΩ bq Hephestos 2
@@ -512,6 +209,7 @@
* 110 : Pt100 with 1kΩ pullup (atypical)
* 147 : Pt100 with 4.7kΩ pullup
* 1010 : Pt1000 with 1kΩ pullup (atypical)
+ * 1022 : Pt1000 with 2.2kΩ pullup
* 1047 : Pt1000 with 4.7kΩ pullup (E3D)
* 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage.
* NOTE: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21.
@@ -530,14 +228,14 @@
*
*/
#define TEMP_SENSOR_0 1
-#define TEMP_SENSOR_1 0
+#define TEMP_SENSOR_1 1
#define TEMP_SENSOR_2 0
#define TEMP_SENSOR_3 0
#define TEMP_SENSOR_4 0
#define TEMP_SENSOR_5 0
#define TEMP_SENSOR_6 0
#define TEMP_SENSOR_7 0
-#define TEMP_SENSOR_BED 0
+#define TEMP_SENSOR_BED 1
#define TEMP_SENSOR_PROBE 0
#define TEMP_SENSOR_CHAMBER 0
#define TEMP_SENSOR_COOLER 0
@@ -550,30 +248,34 @@
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1
#if TEMP_SENSOR_IS_MAX_TC(0)
-#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
-#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
+ #define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
+ #define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
#endif
#if TEMP_SENSOR_IS_MAX_TC(1)
-#define MAX31865_SENSOR_OHMS_1 100
-#define MAX31865_CALIBRATION_OHMS_1 430
+ #define MAX31865_SENSOR_OHMS_1 100
+ #define MAX31865_CALIBRATION_OHMS_1 430
+#endif
+#if TEMP_SENSOR_IS_MAX_TC(2)
+ #define MAX31865_SENSOR_OHMS_2 100
+ #define MAX31865_CALIBRATION_OHMS_2 430
#endif
#if HAS_E_TEMP_SENSOR
-#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
-#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
-#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
+ #define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
+ #define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
+ #define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
#endif
#if TEMP_SENSOR_BED
-#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190
-#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
-#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
+ #define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190
+ #define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
+ #define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
#endif
#if TEMP_SENSOR_CHAMBER
-#define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191
-#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
-#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
+ #define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191
+ #define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
+ #define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
#endif
/**
@@ -587,14 +289,14 @@
* For selecting source/target use: COOLER, PROBE, BOARD, CHAMBER, BED, E0, E1, E2, E3, E4, E5, E6, E7
*/
#if TEMP_SENSOR_REDUNDANT
-#define TEMP_SENSOR_REDUNDANT_SOURCE E1 // The sensor that will provide the redundant reading.
-#define TEMP_SENSOR_REDUNDANT_TARGET E0 // The sensor that we are providing a redundant reading for.
-#define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10 // (°C) Temperature difference that will trigger a print abort.
+ #define TEMP_SENSOR_REDUNDANT_SOURCE E1 // The sensor that will provide the redundant reading.
+ #define TEMP_SENSOR_REDUNDANT_TARGET E0 // The sensor that we are providing a redundant reading for.
+ #define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10 // (°C) Temperature difference that will trigger a print abort.
#endif
// Below this temperature the heater will be switched off
// because it probably indicates a broken thermistor wire.
-#define HEATER_0_MINTEMP 5
+#define HEATER_0_MINTEMP -20
#define HEATER_1_MINTEMP 5
#define HEATER_2_MINTEMP 5
#define HEATER_3_MINTEMP 5
@@ -602,7 +304,7 @@
#define HEATER_5_MINTEMP 5
#define HEATER_6_MINTEMP 5
#define HEATER_7_MINTEMP 5
-#define BED_MINTEMP 5
+#define BED_MINTEMP -20
#define CHAMBER_MINTEMP 5
// Above this temperature the heater will be switched off.
@@ -645,21 +347,21 @@
#define PID_K1 0.95 // Smoothing factor within any PID loop
#if ENABLED(PIDTEMP)
-//#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation.
-//#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders)
-// Set/get with G-code: M301 E[extruder number, 0-2]
-
-#if ENABLED(PID_PARAMS_PER_HOTEND)
-// Specify up to one value per hotend here, according to your setup.
-// If there are fewer values, the last one applies to the remaining hotends.
-#define DEFAULT_Kp_LIST { 22.20, 22.20 }
-#define DEFAULT_Ki_LIST { 1.08, 1.08 }
-#define DEFAULT_Kd_LIST { 114.00, 114.00 }
-#else
-#define DEFAULT_Kp 22.20
-#define DEFAULT_Ki 1.08
-#define DEFAULT_Kd 114.00
-#endif
+ //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation.
+ //#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders)
+ // Set/get with G-code: M301 E[extruder number, 0-2]
+
+ #if ENABLED(PID_PARAMS_PER_HOTEND)
+ // Specify up to one value per hotend here, according to your setup.
+ // If there are fewer values, the last one applies to the remaining hotends.
+ #define DEFAULT_Kp_LIST { 22.20, 22.20 }
+ #define DEFAULT_Ki_LIST { 1.08, 1.08 }
+ #define DEFAULT_Kd_LIST { 114.00, 114.00 }
+ #else
+ #define DEFAULT_Kp 22.20
+ #define DEFAULT_Ki 1.08
+ #define DEFAULT_Kd 114.00
+ #endif
#endif
/**
@@ -671,38 +373,38 @@
* @section mpctemp
*/
#if ENABLED(MPCTEMP)
-//#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of flash)
-//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
+ //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of flash)
+ //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
-#define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active.
-#define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
+ #define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active.
+ #define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
-#define MPC_INCLUDE_FAN // Model the fan speed?
+ #define MPC_INCLUDE_FAN // Model the fan speed?
-// Measured physical constants from M306
-#define MPC_BLOCK_HEAT_CAPACITY { 16.7f } // (J/K) Heat block heat capacities.
-#define MPC_SENSOR_RESPONSIVENESS { 0.22f } // (K/s per ∆K) Rate of change of sensor temperature from heat block.
-#define MPC_AMBIENT_XFER_COEFF { 0.068f } // (W/K) Heat transfer coefficients from heat block to room air with fan off.
-#if ENABLED(MPC_INCLUDE_FAN)
-#define MPC_AMBIENT_XFER_COEFF_FAN255 { 0.097f } // (W/K) Heat transfer coefficients from heat block to room air with fan on full.
-#endif
+ // Measured physical constants from M306
+ #define MPC_BLOCK_HEAT_CAPACITY { 16.7f } // (J/K) Heat block heat capacities.
+ #define MPC_SENSOR_RESPONSIVENESS { 0.22f } // (K/s per ∆K) Rate of change of sensor temperature from heat block.
+ #define MPC_AMBIENT_XFER_COEFF { 0.068f } // (W/K) Heat transfer coefficients from heat block to room air with fan off.
+ #if ENABLED(MPC_INCLUDE_FAN)
+ #define MPC_AMBIENT_XFER_COEFF_FAN255 { 0.097f } // (W/K) Heat transfer coefficients from heat block to room air with fan on full.
+ #endif
-// For one fan and multiple hotends MPC needs to know how to apply the fan cooling effect.
-#if ENABLED(MPC_INCLUDE_FAN)
-//#define MPC_FAN_0_ALL_HOTENDS
-//#define MPC_FAN_0_ACTIVE_HOTEND
-#endif
+ // For one fan and multiple hotends MPC needs to know how to apply the fan cooling effect.
+ #if ENABLED(MPC_INCLUDE_FAN)
+ //#define MPC_FAN_0_ALL_HOTENDS
+ //#define MPC_FAN_0_ACTIVE_HOTEND
+ #endif
-#define FILAMENT_HEAT_CAPACITY_PERMM { 5.6e-3f } // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA).
-//#define FILAMENT_HEAT_CAPACITY_PERMM { 3.6e-3f } // 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG).
+ #define FILAMENT_HEAT_CAPACITY_PERMM { 5.6e-3f } // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA).
+ //#define FILAMENT_HEAT_CAPACITY_PERMM { 3.6e-3f } // 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG).
-// Advanced options
-#define MPC_SMOOTHING_FACTOR 0.5f // (0.0...1.0) Noisy temperature sensors may need a lower value for stabilization.
-#define MPC_MIN_AMBIENT_CHANGE 1.0f // (K/s) Modeled ambient temperature rate of change, when correcting model inaccuracies.
-#define MPC_STEADYSTATE 0.5f // (K/s) Temperature change rate for steady state logic to be enforced.
+ // Advanced options
+ #define MPC_SMOOTHING_FACTOR 0.5f // (0.0...1.0) Noisy temperature sensors may need a lower value for stabilization.
+ #define MPC_MIN_AMBIENT_CHANGE 1.0f // (K/s) Modeled ambient temperature rate of change, when correcting model inaccuracies.
+ #define MPC_STEADYSTATE 0.5f // (K/s) Temperature change rate for steady state logic to be enforced.
-#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
-#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
+ #define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
+ #define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
#endif
//===========================================================================
@@ -736,16 +438,16 @@
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current
#if ENABLED(PIDTEMPBED)
-//#define MIN_BED_POWER 0
-//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port.
+ //#define MIN_BED_POWER 0
+ //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port.
-// 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
-// from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
-#define DEFAULT_bedKp 10.00
-#define DEFAULT_bedKi .023
-#define DEFAULT_bedKd 305.4
+ // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
+ // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
+ #define DEFAULT_bedKp 10.00
+ #define DEFAULT_bedKi .023
+ #define DEFAULT_bedKd 305.4
-// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
+ // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
#endif // PIDTEMPBED
//===========================================================================
@@ -779,28 +481,28 @@
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
#if ENABLED(PIDTEMPCHAMBER)
-#define MIN_CHAMBER_POWER 0
-//#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port.
-
-// Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element
-// and placed inside the small Creality printer enclosure tent.
-//
-#define DEFAULT_chamberKp 37.04
-#define DEFAULT_chamberKi 1.40
-#define DEFAULT_chamberKd 655.17
-// M309 P37.04 I1.04 D655.17
-
-// FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
+ #define MIN_CHAMBER_POWER 0
+ //#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port.
+
+ // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element
+ // and placed inside the small Creality printer enclosure tent.
+ //
+ #define DEFAULT_chamberKp 37.04
+ #define DEFAULT_chamberKi 1.40
+ #define DEFAULT_chamberKd 655.17
+ // M309 P37.04 I1.04 D655.17
+
+ // FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
#endif // PIDTEMPCHAMBER
#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
-//#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
-//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
-#define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
-// is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
+ //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
+ //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
+ #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
+ // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
-//#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash)
-//#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of flash)
+ //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash)
+ //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of flash)
#endif
// @section safety
@@ -850,163 +552,6 @@
// @section machine
-// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
-// either in the usual order or reversed
-//#define COREXY
-//#define COREXZ
-//#define COREYZ
-//#define COREYX
-//#define COREZX
-//#define COREZY
-//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042
-//#define MARKFORGED_YX
-
-// Enable for a belt style printer with endless "Z" motion
-//#define BELTPRINTER
-
-// Enable for Polargraph Kinematics
-//#define POLARGRAPH
-#if ENABLED(POLARGRAPH)
-#define POLARGRAPH_MAX_BELT_LEN 1035.0
-#define POLAR_SEGMENTS_PER_SECOND 5
-#endif
-
-// @section delta
-
-// Enable for DELTA kinematics and configure below
-//#define DELTA
-#if ENABLED(DELTA)
-
-// Make delta curves from many straight lines (linear interpolation).
-// This is a trade-off between visible corners (not enough segments)
-// and processor overload (too many expensive sqrt calls).
-#define DELTA_SEGMENTS_PER_SECOND 200
-
-// After homing move down to a height where XY movement is unconstrained
-//#define DELTA_HOME_TO_SAFE_ZONE
-
-// Delta calibration menu
-// uncomment to add three points calibration menu option.
-// See http://minow.blogspot.com/index.html#4918805519571907051
-//#define DELTA_CALIBRATION_MENU
-
-// uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
-//#define DELTA_AUTO_CALIBRATION
-
-// NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them
-
-#if ENABLED(DELTA_AUTO_CALIBRATION)
-// set the default number of probe points : n*n (1 -> 7)
-#define DELTA_CALIBRATION_DEFAULT_POINTS 4
-#endif
-
-#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU)
-// Set the steprate for papertest probing
-#define PROBE_MANUALLY_STEP 0.05 // (mm)
-#endif
-
-// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
-#define DELTA_PRINTABLE_RADIUS 140.0 // (mm)
-
-// Maximum reachable area
-#define DELTA_MAX_RADIUS 140.0 // (mm)
-
-// Center-to-center distance of the holes in the diagonal push rods.
-#define DELTA_DIAGONAL_ROD 250.0 // (mm)
-
-// Distance between bed and nozzle Z home position
-#define DELTA_HEIGHT 250.00 // (mm) Get this value from G33 auto calibrate
-
-#define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // Get these values from G33 auto calibrate
-
-// Horizontal distance bridged by diagonal push rods when effector is centered.
-#define DELTA_RADIUS 124.0 // (mm) Get this value from G33 auto calibrate
-
-// Trim adjustments for individual towers
-// tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0
-// measured in degrees anticlockwise looking from above the printer
-#define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // Get these values from G33 auto calibrate
-
-// Delta radius and diagonal rod adjustments (mm)
-//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 }
-//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 }
-#endif
-
-// @section scara
-
-/**
- * MORGAN_SCARA was developed by QHARLEY in South Africa in 2012-2013.
- * Implemented and slightly reworked by JCERNY in June, 2014.
- *
- * Mostly Printed SCARA is an open source design by Tyler Williams. See:
- * https://www.thingiverse.com/thing:2487048
- * https://www.thingiverse.com/thing:1241491
- */
-//#define MORGAN_SCARA
-//#define MP_SCARA
-#if EITHER(MORGAN_SCARA, MP_SCARA)
-// If movement is choppy try lowering this value
-#define SCARA_SEGMENTS_PER_SECOND 200
-
-// Length of inner and outer support arms. Measure arm lengths precisely.
-#define SCARA_LINKAGE_1 150 // (mm)
-#define SCARA_LINKAGE_2 150 // (mm)
-
-// SCARA tower offset (position of Tower relative to bed zero position)
-// This needs to be reasonably accurate as it defines the printbed position in the SCARA space.
-#define SCARA_OFFSET_X 100 // (mm)
-#define SCARA_OFFSET_Y -56 // (mm)
-
-#if ENABLED(MORGAN_SCARA)
-
-//#define DEBUG_SCARA_KINEMATICS
-#define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
-
-// Radius around the center where the arm cannot reach
-#define MIDDLE_DEAD_ZONE_R 0 // (mm)
-
-#define THETA_HOMING_OFFSET 0 // Calculated from Calibration Guide and M360 / M114. See http://reprap.harleystudio.co.za/?page_id=1073
-#define PSI_HOMING_OFFSET 0 // Calculated from Calibration Guide and M364 / M114. See http://reprap.harleystudio.co.za/?page_id=1073
-
-#elif ENABLED(MP_SCARA)
-
-#define SCARA_OFFSET_THETA1 12 // degrees
-#define SCARA_OFFSET_THETA2 131 // degrees
-
-#endif
-
-#endif
-
-// @section tpara
-
-// Enable for TPARA kinematics and configure below
-//#define AXEL_TPARA
-#if ENABLED(AXEL_TPARA)
-#define DEBUG_ROBOT_KINEMATICS
-#define ROBOT_SEGMENTS_PER_SECOND 200
-
-// Length of inner and outer support arms. Measure arm lengths precisely.
-#define ROBOT_LINKAGE_1 120 // (mm)
-#define ROBOT_LINKAGE_2 120 // (mm)
-
-// SCARA tower offset (position of Tower relative to bed zero position)
-// This needs to be reasonably accurate as it defines the printbed position in the SCARA space.
-#define ROBOT_OFFSET_X 0 // (mm)
-#define ROBOT_OFFSET_Y 0 // (mm)
-#define ROBOT_OFFSET_Z 0 // (mm)
-
-#define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
-
-// Radius around the center where the arm cannot reach
-#define MIDDLE_DEAD_ZONE_R 0 // (mm)
-
-// Calculated from Calibration Guide and M360 / M114. See http://reprap.harleystudio.co.za/?page_id=1073
-#define THETA_HOMING_OFFSET 0
-#define PSI_HOMING_OFFSET 0
-#endif
-
-// @section machine
-
// Articulated robot (arm). Joints are directly mapped to axes with no kinematics.
//#define ARTICULATED_ROBOT_ARM
@@ -1045,51 +590,51 @@
// Enable pullup for all endstops to prevent a floating state
#define ENDSTOPPULLUPS
#if DISABLED(ENDSTOPPULLUPS)
-// Disable ENDSTOPPULLUPS to set pullups individually
-//#define ENDSTOPPULLUP_XMIN
-//#define ENDSTOPPULLUP_YMIN
-//#define ENDSTOPPULLUP_ZMIN
-//#define ENDSTOPPULLUP_IMIN
-//#define ENDSTOPPULLUP_JMIN
-//#define ENDSTOPPULLUP_KMIN
-//#define ENDSTOPPULLUP_UMIN
-//#define ENDSTOPPULLUP_VMIN
-//#define ENDSTOPPULLUP_WMIN
-//#define ENDSTOPPULLUP_XMAX
-//#define ENDSTOPPULLUP_YMAX
-//#define ENDSTOPPULLUP_ZMAX
-//#define ENDSTOPPULLUP_IMAX
-//#define ENDSTOPPULLUP_JMAX
-//#define ENDSTOPPULLUP_KMAX
-//#define ENDSTOPPULLUP_UMAX
-//#define ENDSTOPPULLUP_VMAX
-//#define ENDSTOPPULLUP_WMAX
-//#define ENDSTOPPULLUP_ZMIN_PROBE
+ // Disable ENDSTOPPULLUPS to set pullups individually
+ //#define ENDSTOPPULLUP_XMIN
+ //#define ENDSTOPPULLUP_YMIN
+ //#define ENDSTOPPULLUP_ZMIN
+ //#define ENDSTOPPULLUP_IMIN
+ //#define ENDSTOPPULLUP_JMIN
+ //#define ENDSTOPPULLUP_KMIN
+ //#define ENDSTOPPULLUP_UMIN
+ //#define ENDSTOPPULLUP_VMIN
+ //#define ENDSTOPPULLUP_WMIN
+ //#define ENDSTOPPULLUP_XMAX
+ //#define ENDSTOPPULLUP_YMAX
+ //#define ENDSTOPPULLUP_ZMAX
+ //#define ENDSTOPPULLUP_IMAX
+ //#define ENDSTOPPULLUP_JMAX
+ //#define ENDSTOPPULLUP_KMAX
+ //#define ENDSTOPPULLUP_UMAX
+ //#define ENDSTOPPULLUP_VMAX
+ //#define ENDSTOPPULLUP_WMAX
+ //#define ENDSTOPPULLUP_ZMIN_PROBE
#endif
// Enable pulldown for all endstops to prevent a floating state
//#define ENDSTOPPULLDOWNS
#if DISABLED(ENDSTOPPULLDOWNS)
-// Disable ENDSTOPPULLDOWNS to set pulldowns individually
-//#define ENDSTOPPULLDOWN_XMIN
-//#define ENDSTOPPULLDOWN_YMIN
-//#define ENDSTOPPULLDOWN_ZMIN
-//#define ENDSTOPPULLDOWN_IMIN
-//#define ENDSTOPPULLDOWN_JMIN
-//#define ENDSTOPPULLDOWN_KMIN
-//#define ENDSTOPPULLDOWN_UMIN
-//#define ENDSTOPPULLDOWN_VMIN
-//#define ENDSTOPPULLDOWN_WMIN
-//#define ENDSTOPPULLDOWN_XMAX
-//#define ENDSTOPPULLDOWN_YMAX
-//#define ENDSTOPPULLDOWN_ZMAX
-//#define ENDSTOPPULLDOWN_IMAX
-//#define ENDSTOPPULLDOWN_JMAX
-//#define ENDSTOPPULLDOWN_KMAX
-//#define ENDSTOPPULLDOWN_UMAX
-//#define ENDSTOPPULLDOWN_VMAX
-//#define ENDSTOPPULLDOWN_WMAX
-//#define ENDSTOPPULLDOWN_ZMIN_PROBE
+ // Disable ENDSTOPPULLDOWNS to set pulldowns individually
+ //#define ENDSTOPPULLDOWN_XMIN
+ //#define ENDSTOPPULLDOWN_YMIN
+ //#define ENDSTOPPULLDOWN_ZMIN
+ //#define ENDSTOPPULLDOWN_IMIN
+ //#define ENDSTOPPULLDOWN_JMIN
+ //#define ENDSTOPPULLDOWN_KMIN
+ //#define ENDSTOPPULLDOWN_UMIN
+ //#define ENDSTOPPULLDOWN_VMIN
+ //#define ENDSTOPPULLDOWN_WMIN
+ //#define ENDSTOPPULLDOWN_XMAX
+ //#define ENDSTOPPULLDOWN_YMAX
+ //#define ENDSTOPPULLDOWN_ZMAX
+ //#define ENDSTOPPULLDOWN_IMAX
+ //#define ENDSTOPPULLDOWN_JMAX
+ //#define ENDSTOPPULLDOWN_KMAX
+ //#define ENDSTOPPULLDOWN_UMAX
+ //#define ENDSTOPPULLDOWN_VMAX
+ //#define ENDSTOPPULLDOWN_WMAX
+ //#define ENDSTOPPULLDOWN_ZMIN_PROBE
#endif
// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
@@ -1147,43 +692,34 @@
* Note that if EEPROM is enabled, saved values will override these.
*/
-/**
- * With this option each E stepper can have its own factors for the
- * following movement settings. If fewer factors are given than the
- * total number of extruders, the last value applies to the rest.
- */
-//#define DISTINCT_E_FACTORS
-
/**
* Default Axis Steps Per Unit (linear=steps/mm, rotational=steps/°)
* Override with M92
- * X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
+ * X, Y, Z, A, E0
*/
-#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 500 }
+#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 1600, 8.8889, 400 }
/**
* Default Max Feed Rate (linear=mm/s, rotational=°/s)
* Override with M203
- * X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
*/
-#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 }
+#define DEFAULT_MAX_FEEDRATE { 3000, 3000, 3000, 3000, 500 }
-//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2
+// #define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2
#if ENABLED(LIMITED_MAX_FR_EDITING)
-#define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits
+ #define MAX_FEEDRATE_EDIT_VALUES { 5000, 5000, 1500, 5000, 1500 } // ...or, set your own edit limits
#endif
/**
* Default Max Acceleration (speed change with time) (linear=mm/(s^2), rotational=°/(s^2))
* (Maximum start speed for accelerated moves)
* Override with M201
- * X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
*/
-#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 }
+#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 3000, 1000 }
-//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2
+// #define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2
#if ENABLED(LIMITED_MAX_ACCEL_EDITING)
-#define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits
+ #define MAX_ACCEL_EDIT_VALUES { 10000, 10000, 2000, 10000, 10000 } // ...or, set your own edit limits
#endif
/**
@@ -1198,6 +734,49 @@
#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves
+/**
+ * Additional Axis Settings
+ *
+ * Define AXISn_ROTATES for all axes that rotate or pivot.
+ * Rotational axis coordinates are expressed in degrees.
+ *
+ * AXISn_NAME defines the letter used to refer to the axis in (most) G-code commands.
+ * By convention the names and roles are typically:
+ * 'A' : Rotational axis parallel to X
+ * 'B' : Rotational axis parallel to Y
+ * 'C' : Rotational axis parallel to Z
+ * 'U' : Secondary linear axis parallel to X
+ * 'V' : Secondary linear axis parallel to Y
+ * 'W' : Secondary linear axis parallel to Z
+ *
+ * Regardless of these settings the axes are internally named I, J, K, U, V, W.
+ */
+#ifdef I_DRIVER_TYPE
+ #define AXIS4_NAME 'A' // :['A', 'B', 'C', 'U', 'V', 'W']
+ #define AXIS4_ROTATES
+#endif
+#ifdef J_DRIVER_TYPE
+ #define AXIS5_NAME 'B' // :['B', 'C', 'U', 'V', 'W']
+ #define AXIS5_ROTATES
+#endif
+#ifdef K_DRIVER_TYPE
+ #define AXIS6_NAME 'C' // :['C', 'U', 'V', 'W']
+ #define AXIS6_ROTATES
+#endif
+#ifdef U_DRIVER_TYPE
+ #define AXIS7_NAME 'U' // :['U', 'V', 'W']
+ //#define AXIS7_ROTATES
+#endif
+#ifdef V_DRIVER_TYPE
+ #define AXIS8_NAME 'V' // :['V', 'W']
+ //#define AXIS8_ROTATES
+#endif
+#ifdef W_DRIVER_TYPE
+ #define AXIS9_NAME 'W' // :['W']
+ //#define AXIS9_ROTATES
+#endif
+
+
/**
* Default Jerk limits (mm/s)
* Override with M205 X Y Z . . . E
@@ -1208,22 +787,22 @@
*/
//#define CLASSIC_JERK
#if ENABLED(CLASSIC_JERK)
-#define DEFAULT_XJERK 10.0
-#define DEFAULT_YJERK 10.0
-#define DEFAULT_ZJERK 0.3
-//#define DEFAULT_IJERK 0.3
-//#define DEFAULT_JJERK 0.3
-//#define DEFAULT_KJERK 0.3
-//#define DEFAULT_UJERK 0.3
-//#define DEFAULT_VJERK 0.3
-//#define DEFAULT_WJERK 0.3
-
-//#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves
-
-//#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2
-#if ENABLED(LIMITED_JERK_EDITING)
-#define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits
-#endif
+ #define DEFAULT_XJERK 10.0
+ #define DEFAULT_YJERK 10.0
+ #define DEFAULT_ZJERK 0.3
+ #define DEFAULT_IJERK 0.3
+ //#define DEFAULT_JJERK 0.3
+ //#define DEFAULT_KJERK 0.3
+ //#define DEFAULT_UJERK 0.3
+ //#define DEFAULT_VJERK 0.3
+ //#define DEFAULT_WJERK 0.3
+
+ //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves
+
+ //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2
+ #if ENABLED(LIMITED_JERK_EDITING)
+ #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits
+ #endif
#endif
#define DEFAULT_EJERK 5.0 // May be used by Linear Advance
@@ -1236,9 +815,9 @@
* https://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html
*/
#if DISABLED(CLASSIC_JERK)
-#define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge
-#define JD_HANDLE_SMALL_SEGMENTS // Use curvature estimation instead of just the junction angle
-// for small segments (< 1mm) with large junction angles (> 135°).
+ #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge
+ #define JD_HANDLE_SMALL_SEGMENTS // Use curvature estimation instead of just the junction angle
+ // for small segments (< 1mm) with large junction angles (> 135°).
#endif
/**
@@ -1249,7 +828,7 @@
*
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
*/
-//#define S_CURVE_ACCELERATION
+#define S_CURVE_ACCELERATION
//===========================================================================
//============================= Z Probe Options =============================
@@ -1268,7 +847,7 @@
#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
// Force the use of the probe for Z-axis homing
-//#define USE_PROBE_FOR_Z_HOMING
+#define USE_PROBE_FOR_Z_HOMING
/**
* Z_MIN_PROBE_PIN
@@ -1301,6 +880,22 @@
*/
//#define PROBE_MANUALLY
+
+// Add a menu item to move between bed corners for manual bed adjustment
+#define LCD_BED_TRAMMING
+#if ENABLED(LCD_BED_TRAMMING)
+ #define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets
+ #define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
+ #define BED_TRAMMING_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
+ //#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner
+ //#define BED_TRAMMING_USE_PROBE
+ #if ENABLED(BED_TRAMMING_USE_PROBE)
+ #define BED_TRAMMING_PROBE_TOLERANCE 0.1 // (mm)
+ #define BED_TRAMMING_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify
+ //#define BED_TRAMMING_AUDIO_FEEDBACK
+ #endif
+#endif
+
/**
* A Fix-Mounted Probe either doesn't deploy or needs manual deployment.
* (e.g., an inductive probe or a nozzle-based probe-switch.)
@@ -1316,84 +911,14 @@
/**
* Z Servo Probe, such as an endstop switch on a rotating arm.
*/
-//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector.
-//#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles
+#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector.
+#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles
/**
* The BLTouch probe uses a Hall effect sensor and emulates a servo.
*/
//#define BLTOUCH
-/**
- * MagLev V4 probe by MDD
- *
- * This probe is deployed and activated by powering a built-in electromagnet.
- */
-//#define MAGLEV4
-#if ENABLED(MAGLEV4)
-//#define MAGLEV_TRIGGER_PIN 11 // Set to the connected digital output
-#define MAGLEV_TRIGGER_DELAY 15 // Changing this risks overheating the coil
-#endif
-
-/**
- * Touch-MI Probe by hotends.fr
- *
- * This probe is deployed and activated by moving the X-axis to a magnet at the edge of the bed.
- * By default, the magnet is assumed to be on the left and activated by a home. If the magnet is
- * on the right, enable and set TOUCH_MI_DEPLOY_XPOS to the deploy position.
- *
- * Also requires: BABYSTEPPING, BABYSTEP_ZPROBE_OFFSET, Z_SAFE_HOMING,
- * and a minimum Z_HOMING_HEIGHT of 10.
- */
-//#define TOUCH_MI_PROBE
-#if ENABLED(TOUCH_MI_PROBE)
-#define TOUCH_MI_RETRACT_Z 0.5 // Height at which the probe retracts
-//#define TOUCH_MI_DEPLOY_XPOS (X_MAX_BED + 2) // For a magnet on the right side of the bed
-//#define TOUCH_MI_MANUAL_DEPLOY // For manual deploy (LCD menu)
-#endif
-
-// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN)
-//#define SOLENOID_PROBE
-
-// A sled-mounted probe like those designed by Charles Bell.
-//#define Z_PROBE_SLED
-//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like.
-
-// A probe deployed by moving the x-axis, such as the Wilson II's rack-and-pinion probe designed by Marty Rice.
-//#define RACK_AND_PINION_PROBE
-#if ENABLED(RACK_AND_PINION_PROBE)
-#define Z_PROBE_DEPLOY_X X_MIN_POS
-#define Z_PROBE_RETRACT_X X_MAX_POS
-#endif
-
-/**
- * Magnetically Mounted Probe
- * For probes such as Euclid, Klicky, Klackender, etc.
- */
-//#define MAG_MOUNTED_PROBE
-#if ENABLED(MAG_MOUNTED_PROBE)
-#define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed
-#define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed
-
-#define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe
-#define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock
-#define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
-#define MAG_MOUNTED_DEPLOY_4 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
-#define MAG_MOUNTED_DEPLOY_5 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
-#define MAG_MOUNTED_STOW_1 { PROBE_STOW_FEEDRATE, { 245, 114, 20 } } // Move to dock
-#define MAG_MOUNTED_STOW_2 { PROBE_STOW_FEEDRATE, { 245, 114, 0 } } // Place probe beside remover
-#define MAG_MOUNTED_STOW_3 { PROBE_STOW_FEEDRATE, { 230, 114, 0 } } // Side move to remove probe
-#define MAG_MOUNTED_STOW_4 { PROBE_STOW_FEEDRATE, { 210, 114, 20 } } // Side move to remove probe
-#define MAG_MOUNTED_STOW_5 { PROBE_STOW_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
-#endif
-
-// Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J
-// When the pin is defined you can use M672 to set/reset the probe sensitivity.
-//#define DUET_SMART_EFFECTOR
-#if ENABLED(DUET_SMART_EFFECTOR)
-#define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin
-#endif
-
/**
* Use StallGuard2 to probe the bed with the nozzle.
* Requires stallGuard-capable Trinamic stepper drivers.
@@ -1402,37 +927,7 @@
*/
//#define SENSORLESS_PROBING
-/**
- * Allen key retractable z-probe as seen on many Kossel delta printers - https://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe
- * Deploys by touching z-axis belt. Retracts by pushing the probe down.
- */
-//#define Z_PROBE_ALLEN_KEY
-#if ENABLED(Z_PROBE_ALLEN_KEY)
-// 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29,
-// if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe.
-
-#define Z_PROBE_ALLEN_KEY_DEPLOY_1 { 30.0, DELTA_PRINTABLE_RADIUS, 100.0 }
-#define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_FEEDRATE
-
-#define Z_PROBE_ALLEN_KEY_DEPLOY_2 { 0.0, DELTA_PRINTABLE_RADIUS, 100.0 }
-#define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_FEEDRATE)/10
-
-#define Z_PROBE_ALLEN_KEY_DEPLOY_3 { 0.0, (DELTA_PRINTABLE_RADIUS) * 0.75, 100.0 }
-#define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_FEEDRATE
-
-#define Z_PROBE_ALLEN_KEY_STOW_1 { -64.0, 56.0, 23.0 } // Move the probe into position
-#define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_FEEDRATE
-
-#define Z_PROBE_ALLEN_KEY_STOW_2 { -64.0, 56.0, 3.0 } // Push it down
-#define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_FEEDRATE)/10
-
-#define Z_PROBE_ALLEN_KEY_STOW_3 { -64.0, 56.0, 50.0 } // Move it up to clear
-#define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_FEEDRATE
-
-#define Z_PROBE_ALLEN_KEY_STOW_4 { 0.0, 0.0, 50.0 }
-#define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_FEEDRATE
-
-#endif // Z_PROBE_ALLEN_KEY
+#define NO_CONFIGURATION_EMBEDDING_WARNING
/**
* Nozzle-to-Probe offsets { X, Y, Z }
@@ -1474,17 +969,17 @@
* | [-] |
* O-- FRONT --+
*/
-#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 }
+#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0, 0 }
// Most probes should stay away from the edges of the bed, but
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
#define PROBING_MARGIN 10
// X and Y axis travel speed (mm/min) between probes
-#define XY_PROBE_FEEDRATE (133*60)
+#define XY_PROBE_FEEDRATE (300*60)
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
-#define Z_PROBE_FEEDRATE_FAST (4*60)
+#define Z_PROBE_FEEDRATE_FAST (10*60)
// Feedrate (mm/min) for the "accurate" probe of each point
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2)
@@ -1496,8 +991,8 @@
*/
//#define PROBE_ACTIVATION_SWITCH
#if ENABLED(PROBE_ACTIVATION_SWITCH)
-#define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active
-//#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin
+ #define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active
+ //#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin
#endif
/**
@@ -1507,13 +1002,13 @@
*/
//#define PROBE_TARE
#if ENABLED(PROBE_TARE)
-#define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin
-#define PROBE_TARE_DELAY 200 // (ms) Delay after tare before
-#define PROBE_TARE_STATE HIGH // State to write pin for tare
-//#define PROBE_TARE_PIN PA5 // Override default pin
-#if ENABLED(PROBE_ACTIVATION_SWITCH)
-//#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active
-#endif
+ #define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin
+ #define PROBE_TARE_DELAY 200 // (ms) Delay after tare before
+ #define PROBE_TARE_STATE HIGH // State to write pin for tare
+ //#define PROBE_TARE_PIN PA5 // Override default pin
+ #if ENABLED(PROBE_ACTIVATION_SWITCH)
+ //#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active
+ #endif
#endif
/**
@@ -1522,7 +1017,7 @@
*/
//#define PROBE_ENABLE_DISABLE
#if ENABLED(PROBE_ENABLE_DISABLE)
-//#define PROBE_ENABLE_PIN -1 // Override the default pin here
+ //#define PROBE_ENABLE_PIN -1 // Override the default pin here
#endif
/**
@@ -1568,7 +1063,7 @@
// Before deploy/stow pause for user confirmation
//#define PAUSE_BEFORE_DEPLOY_STOW
#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW)
-//#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe
+ //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe
#endif
/**
@@ -1580,8 +1075,8 @@
*/
//#define PROBING_HEATERS_OFF // Turn heaters off when probing
#if ENABLED(PROBING_HEATERS_OFF)
-//#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy)
-//#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude)
+ //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy)
+ //#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude)
#endif
//#define PROBING_FANS_OFF // Turn fans off when probing
//#define PROBING_ESTEPPERS_OFF // Turn all extruder steppers off when probing
@@ -1589,10 +1084,10 @@
//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors
// Require minimum nozzle and/or bed temperature for probing
-//#define PREHEAT_BEFORE_PROBING
+#define PREHEAT_BEFORE_PROBING
#if ENABLED(PREHEAT_BEFORE_PROBING)
-#define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
-#define PROBING_BED_TEMP 50
+ #define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
+ #define PROBING_BED_TEMP 50
#endif
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
@@ -1601,7 +1096,7 @@
#define Y_ENABLE_ON 0
#define Z_ENABLE_ON 0
#define E_ENABLE_ON 0 // For all extruders
-//#define I_ENABLE_ON 0
+#define I_ENABLE_ON 0
//#define J_ENABLE_ON 0
//#define K_ENABLE_ON 0
//#define U_ENABLE_ON 0
@@ -1613,7 +1108,7 @@
#define DISABLE_X false
#define DISABLE_Y false
#define DISABLE_Z false
-//#define DISABLE_I false
+#define DISABLE_I false
//#define DISABLE_J false
//#define DISABLE_K false
//#define DISABLE_U false
@@ -1628,13 +1123,13 @@
#define DISABLE_E false // Disable the extruder when not stepping
#define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled
-// @section machine
+// @section motion
// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
#define INVERT_X_DIR false
#define INVERT_Y_DIR true
#define INVERT_Z_DIR false
-//#define INVERT_I_DIR false
+#define INVERT_I_DIR false
//#define INVERT_J_DIR false
//#define INVERT_K_DIR false
//#define INVERT_U_DIR false
@@ -1661,12 +1156,12 @@
/**
* Set Z_IDLE_HEIGHT if the Z-Axis moves on its own when steppers are disabled.
* - Use a low value (i.e., Z_MIN_POS) if the nozzle falls down to the bed.
- * - Use a large value (i.e., Z_MAX_POS) if the bed falls down, away from the nozzle.
+ * - Use a large value (i.e., `POS) if the bed falls down, away from the nozzle.
*/
//#define Z_IDLE_HEIGHT Z_HOME_POS
//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ...
-// Be sure to have this much clearance over your Z_MAX_POS to prevent grinding.
+ // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding.
//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing Z
@@ -1675,7 +1170,7 @@
#define X_HOME_DIR -1
#define Y_HOME_DIR -1
#define Z_HOME_DIR -1
-//#define I_HOME_DIR -1
+#define I_HOME_DIR 0
//#define J_HOME_DIR -1
//#define K_HOME_DIR -1
//#define U_HOME_DIR -1
@@ -1685,8 +1180,8 @@
// @section geometry
// The size of the printable area
-#define X_BED_SIZE 200
-#define Y_BED_SIZE 200
+#define X_BED_SIZE 630
+#define Y_BED_SIZE 500
// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
#define X_MIN_POS 0
@@ -1694,9 +1189,9 @@
#define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE
-#define Z_MAX_POS 200
-//#define I_MIN_POS 0
-//#define I_MAX_POS 50
+#define Z_MAX_POS 150
+#define I_MIN_POS 0
+#define I_MAX_POS 360
//#define J_MIN_POS 0
//#define J_MAX_POS 50
//#define K_MIN_POS 0
@@ -1720,33 +1215,33 @@
// Min software endstops constrain movement within minimum coordinate bounds
#define MIN_SOFTWARE_ENDSTOPS
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
-#define MIN_SOFTWARE_ENDSTOP_X
-#define MIN_SOFTWARE_ENDSTOP_Y
-#define MIN_SOFTWARE_ENDSTOP_Z
-#define MIN_SOFTWARE_ENDSTOP_I
-#define MIN_SOFTWARE_ENDSTOP_J
-#define MIN_SOFTWARE_ENDSTOP_K
-#define MIN_SOFTWARE_ENDSTOP_U
-#define MIN_SOFTWARE_ENDSTOP_V
-#define MIN_SOFTWARE_ENDSTOP_W
+ #define MIN_SOFTWARE_ENDSTOP_X
+ #define MIN_SOFTWARE_ENDSTOP_Y
+ #define MIN_SOFTWARE_ENDSTOP_Z
+ #define MIN_SOFTWARE_ENDSTOP_I
+ #define MIN_SOFTWARE_ENDSTOP_J
+ #define MIN_SOFTWARE_ENDSTOP_K
+ #define MIN_SOFTWARE_ENDSTOP_U
+ #define MIN_SOFTWARE_ENDSTOP_V
+ #define MIN_SOFTWARE_ENDSTOP_W
#endif
// Max software endstops constrain movement within maximum coordinate bounds
#define MAX_SOFTWARE_ENDSTOPS
#if ENABLED(MAX_SOFTWARE_ENDSTOPS)
-#define MAX_SOFTWARE_ENDSTOP_X
-#define MAX_SOFTWARE_ENDSTOP_Y
-#define MAX_SOFTWARE_ENDSTOP_Z
-#define MAX_SOFTWARE_ENDSTOP_I
-#define MAX_SOFTWARE_ENDSTOP_J
-#define MAX_SOFTWARE_ENDSTOP_K
-#define MAX_SOFTWARE_ENDSTOP_U
-#define MAX_SOFTWARE_ENDSTOP_V
-#define MAX_SOFTWARE_ENDSTOP_W
+ #define MAX_SOFTWARE_ENDSTOP_X
+ #define MAX_SOFTWARE_ENDSTOP_Y
+ #define MAX_SOFTWARE_ENDSTOP_Z
+ #define MAX_SOFTWARE_ENDSTOP_I
+ #define MAX_SOFTWARE_ENDSTOP_J
+ #define MAX_SOFTWARE_ENDSTOP_K
+ #define MAX_SOFTWARE_ENDSTOP_U
+ #define MAX_SOFTWARE_ENDSTOP_V
+ #define MAX_SOFTWARE_ENDSTOP_W
#endif
#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS)
-//#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD
+ //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD
#endif
/**
@@ -1762,66 +1257,67 @@
* RAMPS-based boards use SERVO3_PIN for the first runout sensor.
* For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc.
*/
-//#define FILAMENT_RUNOUT_SENSOR
+#define FILAMENT_RUNOUT_SENSOR
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
-#define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500.
-#define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
-
-#define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present.
-#define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
-//#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.
-//#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder.
-// This is automatically enabled for MIXING_EXTRUDERs.
-
-// Override individually if the runout sensors vary
-//#define FIL_RUNOUT1_STATE LOW
-//#define FIL_RUNOUT1_PULLUP
-//#define FIL_RUNOUT1_PULLDOWN
-
-//#define FIL_RUNOUT2_STATE LOW
-//#define FIL_RUNOUT2_PULLUP
-//#define FIL_RUNOUT2_PULLDOWN
-
-//#define FIL_RUNOUT3_STATE LOW
-//#define FIL_RUNOUT3_PULLUP
-//#define FIL_RUNOUT3_PULLDOWN
-
-//#define FIL_RUNOUT4_STATE LOW
-//#define FIL_RUNOUT4_PULLUP
-//#define FIL_RUNOUT4_PULLDOWN
-
-//#define FIL_RUNOUT5_STATE LOW
-//#define FIL_RUNOUT5_PULLUP
-//#define FIL_RUNOUT5_PULLDOWN
-
-//#define FIL_RUNOUT6_STATE LOW
-//#define FIL_RUNOUT6_PULLUP
-//#define FIL_RUNOUT6_PULLDOWN
-
-//#define FIL_RUNOUT7_STATE LOW
-//#define FIL_RUNOUT7_PULLUP
-//#define FIL_RUNOUT7_PULLDOWN
-
-//#define FIL_RUNOUT8_STATE LOW
-//#define FIL_RUNOUT8_PULLUP
-//#define FIL_RUNOUT8_PULLDOWN
-
-// Commands to execute on filament runout.
-// With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c")
-// NOTE: After 'M412 H1' the host handles filament runout and this script does not apply.
-#define FILAMENT_RUNOUT_SCRIPT "M600"
-
-// After a runout is detected, continue printing this length of filament
-// before executing the runout script. Useful for a sensor at the end of
-// a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead.
-//#define FILAMENT_RUNOUT_DISTANCE_MM 25
-
-#ifdef FILAMENT_RUNOUT_DISTANCE_MM
-// Enable this option to use an encoder disc that toggles the runout pin
-// as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM
-// large enough to avoid false positives.)
-//#define FILAMENT_MOTION_SENSOR
-#endif
+ #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500.
+ #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
+
+ #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present.
+ #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
+ #define FIL_RUNOUT_PIN 35
+ //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.
+ //#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder.
+ // This is automatically enabled for MIXING_EXTRUDERs.
+
+ // Override individually if the runout sensors vary
+ //#define FIL_RUNOUT1_STATE LOW
+ //#define FIL_RUNOUT1_PULLUP
+ //#define FIL_RUNOUT1_PULLDOWN
+
+ //#define FIL_RUNOUT2_STATE LOW
+ //#define FIL_RUNOUT2_PULLUP
+ //#define FIL_RUNOUT2_PULLDOWN
+
+ //#define FIL_RUNOUT3_STATE LOW
+ //#define FIL_RUNOUT3_PULLUP
+ //#define FIL_RUNOUT3_PULLDOWN
+
+ //#define FIL_RUNOUT4_STATE LOW
+ //#define FIL_RUNOUT4_PULLUP
+ //#define FIL_RUNOUT4_PULLDOWN
+
+ //#define FIL_RUNOUT5_STATE LOW
+ //#define FIL_RUNOUT5_PULLUP
+ //#define FIL_RUNOUT5_PULLDOWN
+
+ //#define FIL_RUNOUT6_STATE LOW
+ //#define FIL_RUNOUT6_PULLUP
+ //#define FIL_RUNOUT6_PULLDOWN
+
+ //#define FIL_RUNOUT7_STATE LOW
+ //#define FIL_RUNOUT7_PULLUP
+ //#define FIL_RUNOUT7_PULLDOWN
+
+ //#define FIL_RUNOUT8_STATE LOW
+ //#define FIL_RUNOUT8_PULLUP
+ //#define FIL_RUNOUT8_PULLDOWN
+
+ // Commands to execute on filament runout.
+ // With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c")
+ // NOTE: After 'M412 H1' the host handles filament runout and this script does not apply.
+ #define FILAMENT_RUNOUT_SCRIPT "M600"
+
+ // After a runout is detected, continue printing this length of filament
+ // before executing the runout script. Useful for a sensor at the end of
+ // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead.
+ //#define FILAMENT_RUNOUT_DISTANCE_MM 25
+
+ #ifdef FILAMENT_RUNOUT_DISTANCE_MM
+ // Enable this option to use an encoder disc that toggles the runout pin
+ // as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM
+ // large enough to avoid false positives.)
+ //#define FILAMENT_MOTION_SENSOR
+ #endif
#endif
//===========================================================================
@@ -1864,7 +1360,7 @@
*/
//#define AUTO_BED_LEVELING_3POINT
//#define AUTO_BED_LEVELING_LINEAR
-//#define AUTO_BED_LEVELING_BILINEAR
+#define AUTO_BED_LEVELING_BILINEAR
//#define AUTO_BED_LEVELING_UBL
//#define MESH_BED_LEVELING
@@ -1881,8 +1377,8 @@
*/
//#define PREHEAT_BEFORE_LEVELING
#if ENABLED(PREHEAT_BEFORE_LEVELING)
-#define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
-#define LEVELING_BED_TEMP 50
+ #define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
+ #define LEVELING_BED_TEMP 50
#endif
/**
@@ -1902,150 +1398,126 @@
//#define DEBUG_LEVELING_FEATURE
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL, PROBE_MANUALLY)
-// Set a height for the start of manual adjustment
-#define MANUAL_PROBE_START_Z 0.2 // (mm) Comment out to use the last-measured height
+ // Set a height for the start of manual adjustment
+ #define MANUAL_PROBE_START_Z 0.2 // (mm) Comment out to use the last-measured height
#endif
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL)
-// Gradually reduce leveling correction until a set height is reached,
-// at which point movement will be level to the machine's XY plane.
-// The height can be set with M420 Z
-#define ENABLE_LEVELING_FADE_HEIGHT
-#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
-#define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height.
-#endif
-
-// For Cartesian machines, instead of dividing moves on mesh boundaries,
-// split up moves into short segments like a Delta. This follows the
-// contours of the bed more closely than edge-to-edge straight moves.
-#define SEGMENT_LEVELED_MOVES
-#define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one)
-
-/**
- * Enable the G26 Mesh Validation Pattern tool.
- */
-//#define G26_MESH_VALIDATION
-#if ENABLED(G26_MESH_VALIDATION)
-#define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
-#define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26.
-#define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for G26.
-#define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for G26.
-#define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for G26 XY moves.
-#define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for G26 XY travel moves.
-#define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements.
-#endif
+ /**
+ * Gradually reduce leveling correction until a set height is reached,
+ * at which point movement will be level to the machine's XY plane.
+ * The height can be set with M420 Z
+ */
+ #define ENABLE_LEVELING_FADE_HEIGHT
+ #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
+ #define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height.
+ #endif
+
+ /**
+ * For Cartesian machines, instead of dividing moves on mesh boundaries,
+ * split up moves into short segments like a Delta. This follows the
+ * contours of the bed more closely than edge-to-edge straight moves.
+ */
+ #define SEGMENT_LEVELED_MOVES
+ #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one)
+
+ /**
+ * Enable the G26 Mesh Validation Pattern tool.
+ */
+ //#define G26_MESH_VALIDATION
+ #if ENABLED(G26_MESH_VALIDATION)
+ #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
+ #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26.
+ #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for G26.
+ #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for G26.
+ #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for G26 XY moves.
+ #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for G26 XY travel moves.
+ #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements.
+ #endif
#endif
#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)
-// Set the number of grid points per dimension.
-#define GRID_MAX_POINTS_X 3
-#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
+ // Set the number of grid points per dimension.
+ #define GRID_MAX_POINTS_X 5
+ #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
-// Probe along the Y axis, advancing X after each column
-//#define PROBE_Y_FIRST
+ // Probe along the Y axis, advancing X after each column
+ //#define PROBE_Y_FIRST
-#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
+ #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
-// Beyond the probed grid, continue the implied tilt?
-// Default is to maintain the height of the nearest edge.
-//#define EXTRAPOLATE_BEYOND_GRID
+ // Beyond the probed grid, continue the implied tilt?
+ // Default is to maintain the height of the nearest edge.
+ //#define EXTRAPOLATE_BEYOND_GRID
-//
-// Experimental Subdivision of the grid by Catmull-Rom method.
-// Synthesizes intermediate points to produce a more detailed mesh.
-//
-//#define ABL_BILINEAR_SUBDIVISION
-#if ENABLED(ABL_BILINEAR_SUBDIVISION)
-// Number of subdivisions between probe points
-#define BILINEAR_SUBDIVISIONS 3
-#endif
+ //
+ // Subdivision of the grid by Catmull-Rom method.
+ // Synthesizes intermediate points to produce a more detailed mesh.
+ //
+ //#define ABL_BILINEAR_SUBDIVISION
+ #if ENABLED(ABL_BILINEAR_SUBDIVISION)
+ // Number of subdivisions between probe points
+ #define BILINEAR_SUBDIVISIONS 3
+ #endif
-#endif
+ #endif
#elif ENABLED(AUTO_BED_LEVELING_UBL)
-//===========================================================================
-//========================= Unified Bed Leveling ============================
-//===========================================================================
+ //===========================================================================
+ //========================= Unified Bed Leveling ============================
+ //===========================================================================
-//#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh
+ //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh
-#define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed
-#define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited.
-#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
+ #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed
+ #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited.
+ #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
-//#define UBL_HILBERT_CURVE // Use Hilbert distribution for less travel when probing multiple points
+ //#define UBL_HILBERT_CURVE // Use Hilbert distribution for less travel when probing multiple points
-#define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle
-#define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500
+ #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle
+ #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500
-//#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used
-// as the Z-Height correction value.
+ //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used
+ // as the Z-Height correction value.
-//#define UBL_MESH_WIZARD // Run several commands in a row to get a complete mesh
+ //#define UBL_MESH_WIZARD // Run several commands in a row to get a complete mesh
-#elif ENABLED(MESH_BED_LEVELING)
+ /**
+ * Probing not allowed within the position of an obstacle.
+ */
+ //#define AVOID_OBSTACLES
+ #if ENABLED(AVOID_OBSTACLES)
+ #define CLIP_W 23 // Bed clip width, should be padded a few mm over its physical size
+ #define CLIP_H 14 // Bed clip height, should be padded a few mm over its physical size
-//===========================================================================
-//=================================== Mesh ==================================
-//===========================================================================
+ // Obstacle Rectangles defined as { X1, Y1, X2, Y2 }
+ #define OBSTACLE1 { (X_BED_SIZE) / 4 - (CLIP_W) / 2, 0, (X_BED_SIZE) / 4 + (CLIP_W) / 2, CLIP_H }
+ #define OBSTACLE2 { (X_BED_SIZE) * 3 / 4 - (CLIP_W) / 2, 0, (X_BED_SIZE) * 3 / 4 + (CLIP_W) / 2, CLIP_H }
+ #define OBSTACLE3 { (X_BED_SIZE) / 4 - (CLIP_W) / 2, (Y_BED_SIZE) - (CLIP_H), (X_BED_SIZE) / 4 + (CLIP_W) / 2, Y_BED_SIZE }
+ #define OBSTACLE4 { (X_BED_SIZE) * 3 / 4 - (CLIP_W) / 2, (Y_BED_SIZE) - (CLIP_H), (X_BED_SIZE) * 3 / 4 + (CLIP_W) / 2, Y_BED_SIZE }
-#define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
-#define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited.
-#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
+ // The probed grid must be inset for G29 J. This is okay, since it is
+ // only used to compute a linear transformation for the mesh itself.
+ #define G29J_MESH_TILT_MARGIN ((CLIP_H) + 1)
+ #endif
-//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
-
-#endif // BED_LEVELING
-
-/**
- * Add a bed leveling sub-menu for ABL or MBL.
- * Include a guided procedure if manual probing is enabled.
- */
-//#define LCD_BED_LEVELING
+#elif ENABLED(MESH_BED_LEVELING)
-#if ENABLED(LCD_BED_LEVELING)
-#define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis.
-#define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment
-//#define MESH_EDIT_MENU // Add a menu to edit mesh points
-#endif
+ //===========================================================================
+ //=================================== Mesh ==================================
+ //===========================================================================
-// Add a menu item to move between bed corners for manual bed adjustment
-//#define LCD_BED_TRAMMING
+ #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
+ #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited.
+ #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
-#if ENABLED(LCD_BED_TRAMMING)
-#define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets
-#define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
-#define BED_TRAMMING_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
-//#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner
-//#define BED_TRAMMING_USE_PROBE
-#if ENABLED(BED_TRAMMING_USE_PROBE)
-#define BED_TRAMMING_PROBE_TOLERANCE 0.1 // (mm)
-#define BED_TRAMMING_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify
-//#define BED_TRAMMING_AUDIO_FEEDBACK
-#endif
+ //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
-/**
- * Corner Leveling Order
- *
- * Set 2 or 4 points. When 2 points are given, the 3rd is the center of the opposite edge.
- *
- * LF Left-Front RF Right-Front
- * LB Left-Back RB Right-Back
- *
- * Examples:
- *
- * Default {LF,RB,LB,RF} {LF,RF} {LB,LF}
- * LB --------- RB LB --------- RB LB --------- RB LB --------- RB
- * | 4 3 | | 3 2 | | <3> | | 1 |
- * | | | | | | | <3>|
- * | 1 2 | | 1 4 | | 1 2 | | 2 |
- * LF --------- RF LF --------- RF LF --------- RF LF --------- RF
- */
-#define BED_TRAMMING_LEVELING_ORDER { LF, RF, RB, LB }
-#endif
+#endif // BED_LEVELING
/**
* Commands to execute at the end of G29 probing.
@@ -2056,14 +1528,14 @@
// @section homing
// The center of the bed is at (X=0, Y=0)
-//#define BED_CENTER_AT_0_0
+#define BED_CENTER_AT_0_0
// Manually set the home position. Leave these undefined for automatic settings.
// For DELTA this is the top-center of the Cartesian print volume.
//#define MANUAL_X_HOME_POS 0
//#define MANUAL_Y_HOME_POS 0
//#define MANUAL_Z_HOME_POS 0
-//#define MANUAL_I_HOME_POS 0
+#define MANUAL_I_HOME_POS 0
//#define MANUAL_J_HOME_POS 0
//#define MANUAL_K_HOME_POS 0
//#define MANUAL_U_HOME_POS 0
@@ -2077,15 +1549,14 @@
* - Allows Z homing only when XY positions are known and trusted.
* - If stepper drivers sleep, XY homing may be required again before Z homing.
*/
-//#define Z_SAFE_HOMING
-
+#define Z_SAFE_HOMING
#if ENABLED(Z_SAFE_HOMING)
-#define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing
-#define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing
+ #define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing
+ #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing
#endif
// Homing speeds (linear=mm/min, rotational=°/min)
-#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) }
+#define HOMING_FEEDRATE_MM_M { (300*60), (300*60), (50*60), (50*60) }
// Validate that endstops are triggered on homing moves
#define VALIDATE_HOMING_ENDSTOPS
@@ -2123,28 +1594,29 @@
//#define SKEW_CORRECTION
#if ENABLED(SKEW_CORRECTION)
-// Input all length measurements here:
-#define XY_DIAG_AC 282.8427124746
-#define XY_DIAG_BD 282.8427124746
-#define XY_SIDE_AD 200
-
-// Or, set the default skew factors directly here
-// to override the above measurements:
-#define XY_SKEW_FACTOR 0.0
-
-//#define SKEW_CORRECTION_FOR_Z
-#if ENABLED(SKEW_CORRECTION_FOR_Z)
-#define XZ_DIAG_AC 282.8427124746
-#define XZ_DIAG_BD 282.8427124746
-#define YZ_DIAG_AC 282.8427124746
-#define YZ_DIAG_BD 282.8427124746
-#define YZ_SIDE_AD 200
-#define XZ_SKEW_FACTOR 0.0
-#define YZ_SKEW_FACTOR 0.0
-#endif
+ // Input all length measurements here:
+ #define XY_DIAG_AC 282.8427124746
+ #define XY_DIAG_BD 282.8427124746
+ #define XY_SIDE_AD 200
+
+ // Or, set the XY skew factor directly:
+ //#define XY_SKEW_FACTOR 0.0
+
+ //#define SKEW_CORRECTION_FOR_Z
+ #if ENABLED(SKEW_CORRECTION_FOR_Z)
+ #define XZ_DIAG_AC 282.8427124746
+ #define XZ_DIAG_BD 282.8427124746
+ #define YZ_DIAG_AC 282.8427124746
+ #define YZ_DIAG_BD 282.8427124746
+ #define YZ_SIDE_AD 200
+
+ // Or, set the Z skew factors directly:
+ //#define XZ_SKEW_FACTOR 0.0
+ //#define YZ_SKEW_FACTOR 0.0
+ #endif
-// Enable this option for M852 to set skew at runtime
-//#define SKEW_CORRECTION_GCODE
+ // Enable this option for M852 to set skew at runtime
+ //#define SKEW_CORRECTION_GCODE
#endif
//=============================================================================
@@ -2167,8 +1639,8 @@
#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM.
#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load
#if ENABLED(EEPROM_SETTINGS)
-//#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors.
-//#define EEPROM_INIT_NOW // Init EEPROM on first boot after a new build.
+ //#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors.
+ //#define EEPROM_INIT_NOW // Init EEPROM on first boot after a new build.
#endif
// @section host
@@ -2181,15 +1653,10 @@
//
#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages
#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
-#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating
+// #define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating
// @section units
-//
-// G20/G21 Inch mode support
-//
-//#define INCH_MODE_SUPPORT
-
//
// M149 Set temperature units support
//
@@ -2198,7 +1665,7 @@
// @section temperature
//
-// Preheat Constants - Up to 6 are supported without changes
+// Preheat Constants - Up to 10 are supported without changes
//
#define PREHEAT_1_LABEL "PLA"
#define PREHEAT_1_TEMP_HOTEND 180
@@ -2212,6 +1679,32 @@
#define PREHEAT_2_TEMP_CHAMBER 35
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255
+#define PREHEAT_3_LABEL "PET-G"
+#define PREHEAT_3_TEMP_HOTEND 240
+#define PREHEAT_3_TEMP_BED 110
+#define PREHEAT_3_TEMP_CHAMBER 35
+#define PREHEAT_3_FAN_SPEED 0 // Value from 0 to 255
+
+#define PREHEAT_4_LABEL "WOOD"
+#define PREHEAT_4_TEMP_HOTEND 180
+#define PREHEAT_4_TEMP_BED 70
+#define PREHEAT_4_TEMP_CHAMBER 35
+#define PREHEAT_4_FAN_SPEED 0 // Value from 0 to 255
+
+#define PREHEAT_5_LABEL "METAL"
+#define PREHEAT_5_TEMP_HOTEND 240
+#define PREHEAT_5_TEMP_BED 110
+#define PREHEAT_5_TEMP_CHAMBER 35
+#define PREHEAT_5_FAN_SPEED 0 // Value from 0 to 255
+
+#define PREHEAT_6_LABEL "CERAMIC"
+#define PREHEAT_6_TEMP_HOTEND 240
+#define PREHEAT_6_TEMP_BED 110
+#define PREHEAT_6_TEMP_CHAMBER 35
+#define PREHEAT_6_FAN_SPEED 0 // Value from 0 to 255
+
+
+
// @section motion
/**
@@ -2225,19 +1718,19 @@
* P1 Raise the nozzle always to Z-park height.
* P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS.
*/
-//#define NOZZLE_PARK_FEATURE
+#define NOZZLE_PARK_FEATURE
#if ENABLED(NOZZLE_PARK_FEATURE)
-// Specify a park position as { X, Y, Z_raise }
-#define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 }
-#define NOZZLE_PARK_MOVE 0 // Park motion: 0 = XY Move, 1 = X Only, 2 = Y Only, 3 = X before Y, 4 = Y before X
-#define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance
-#define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis)
-#define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers)
+ // Specify a park position as { X, Y, Z_raise }
+ #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 }
+ #define NOZZLE_PARK_MOVE 0 // Park motion: 0 = XY Move, 1 = X Only, 2 = Y Only, 3 = X before Y, 4 = Y before X
+ #define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance
+ #define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis)
+ #define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers)
#endif
/**
- * Clean Nozzle Feature -- EXPERIMENTAL
+ * Clean Nozzle Feature
*
* Adds the G12 command to perform a nozzle cleaning process.
*
@@ -2271,44 +1764,43 @@
* Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT.
*
* Caveats: The ending Z should be the same as starting Z.
- * Attention: EXPERIMENTAL. G-code arguments may change.
*/
//#define NOZZLE_CLEAN_FEATURE
#if ENABLED(NOZZLE_CLEAN_FEATURE)
-// Default number of pattern repetitions
-#define NOZZLE_CLEAN_STROKES 12
+ // Default number of pattern repetitions
+ #define NOZZLE_CLEAN_STROKES 12
-// Default number of triangles
-#define NOZZLE_CLEAN_TRIANGLES 3
+ // Default number of triangles
+ #define NOZZLE_CLEAN_TRIANGLES 3
-// Specify positions for each tool as { { X, Y, Z }, { X, Y, Z } }
-// Dual hotend system may use { { -20, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }, { 420, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }}
-#define NOZZLE_CLEAN_START_POINT { { 30, 30, (Z_MIN_POS + 1) } }
-#define NOZZLE_CLEAN_END_POINT { { 100, 60, (Z_MIN_POS + 1) } }
+ // Specify positions for each tool as { { X, Y, Z }, { X, Y, Z } }
+ // Dual hotend system may use { { -20, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }, { 420, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }}
+ #define NOZZLE_CLEAN_START_POINT { { 30, 30, (Z_MIN_POS + 1) } }
+ #define NOZZLE_CLEAN_END_POINT { { 100, 60, (Z_MIN_POS + 1) } }
-// Circular pattern radius
-#define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5
-// Circular pattern circle fragments number
-#define NOZZLE_CLEAN_CIRCLE_FN 10
-// Middle point of circle
-#define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT
+ // Circular pattern radius
+ #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5
+ // Circular pattern circle fragments number
+ #define NOZZLE_CLEAN_CIRCLE_FN 10
+ // Middle point of circle
+ #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT
-// Move the nozzle to the initial position after cleaning
-#define NOZZLE_CLEAN_GOBACK
+ // Move the nozzle to the initial position after cleaning
+ #define NOZZLE_CLEAN_GOBACK
-// For a purge/clean station that's always at the gantry height (thus no Z move)
-//#define NOZZLE_CLEAN_NO_Z
+ // For a purge/clean station that's always at the gantry height (thus no Z move)
+ //#define NOZZLE_CLEAN_NO_Z
-// For a purge/clean station mounted on the X axis
-//#define NOZZLE_CLEAN_NO_Y
+ // For a purge/clean station mounted on the X axis
+ //#define NOZZLE_CLEAN_NO_Y
-// Require a minimum hotend temperature for cleaning
-#define NOZZLE_CLEAN_MIN_TEMP 170
-//#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe
+ // Require a minimum hotend temperature for cleaning
+ #define NOZZLE_CLEAN_MIN_TEMP 170
+ //#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe
-// Explicit wipe G-code script applies to a G12 with no arguments.
-//#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0"
+ // Explicit wipe G-code script applies to a G12 with no arguments.
+ //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0"
#endif
@@ -2354,43 +1846,11 @@
*
* View the current statistics with M78.
*/
-//#define PRINTCOUNTER
+#define PRINTCOUNTER
#if ENABLED(PRINTCOUNTER)
-#define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print
+ #define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print. A value of 0 will save stats at end of print.
#endif
-// @section security
-
-/**
- * Password
- *
- * Set a numerical password for the printer which can be requested:
- *
- * - When the printer boots up
- * - Upon opening the 'Print from Media' Menu
- * - When SD printing is completed or aborted
- *
- * The following G-codes can be used:
- *
- * M510 - Lock Printer. Blocks all commands except M511.
- * M511 - Unlock Printer.
- * M512 - Set, Change and Remove Password.
- *
- * If you forget the password and get locked out you'll need to re-flash
- * the firmware with the feature disabled, reset EEPROM, and (optionally)
- * re-flash the firmware again with this feature enabled.
- */
-//#define PASSWORD_FEATURE
-#if ENABLED(PASSWORD_FEATURE)
-#define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended
-#define PASSWORD_ON_STARTUP
-#define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack.
-#define PASSWORD_CHANGE_GCODE // Change the password with M512 P S.
-//#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running
-//#define PASSWORD_AFTER_SD_PRINT_END
-//#define PASSWORD_AFTER_SD_PRINT_ABORT
-//#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE
-#endif
//=============================================================================
//============================= LCD and SD support ============================
@@ -2432,7 +1892,7 @@
*
* :['JAPANESE', 'WESTERN', 'CYRILLIC']
*/
-#define DISPLAY_CHARSET_HD44780 JAPANESE
+#define DISPLAY_CHARSET_HD44780 WESTERN
/**
* Info Screen Style (0:Classic, 1:Průša)
@@ -2454,81 +1914,7 @@
*
* Use CRC checks and retries on the SD communication.
*/
-//#define SD_CHECK_AND_RETRY
-
-/**
- * LCD Menu Items
- *
- * Disable all menus and only display the Status Screen, or
- * just remove some extraneous menu items to recover space.
- */
-//#define NO_LCD_MENUS
-//#define SLIM_LCD_MENUS
-
-//
-// ENCODER SETTINGS
-//
-// This option overrides the default number of encoder pulses needed to
-// produce one step. Should be increased for high-resolution encoders.
-//
-//#define ENCODER_PULSES_PER_STEP 4
-
-//
-// Use this option to override the number of step signals required to
-// move between next/prev menu items.
-//
-//#define ENCODER_STEPS_PER_MENU_ITEM 1
-
-/**
- * Encoder Direction Options
- *
- * Test your encoder's behavior first with both options disabled.
- *
- * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION.
- * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION.
- * Reversed Value Editing only? Enable BOTH options.
- */
-
-//
-// This option reverses the encoder direction everywhere.
-//
-// Set this option if CLOCKWISE causes values to DECREASE
-//
-//#define REVERSE_ENCODER_DIRECTION
-
-//
-// This option reverses the encoder direction for navigating LCD menus.
-//
-// If CLOCKWISE normally moves DOWN this makes it go UP.
-// If CLOCKWISE normally moves UP this makes it go DOWN.
-//
-//#define REVERSE_MENU_DIRECTION
-
-//
-// This option reverses the encoder direction for Select Screen.
-//
-// If CLOCKWISE normally moves LEFT this makes it go RIGHT.
-// If CLOCKWISE normally moves RIGHT this makes it go LEFT.
-//
-//#define REVERSE_SELECT_DIRECTION
-
-//
-// Encoder EMI Noise Filter
-//
-// This option increases encoder samples to filter out phantom encoder clicks caused by EMI noise.
-//
-//#define ENCODER_NOISE_FILTER
-#if ENABLED(ENCODER_NOISE_FILTER)
-#define ENCODER_SAMPLES 10
-#endif
-
-//
-// Individual Axis Homing
-//
-// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu.
-//
-//#define INDIVIDUAL_AXIS_HOMING_MENU
-//#define INDIVIDUAL_AXIS_HOMING_SUBMENU
+#define SD_CHECK_AND_RETRY
//
// SPEAKER/BUZZER
@@ -2548,640 +1934,12 @@
//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2
//#define LCD_FEEDBACK_FREQUENCY_HZ 5000
-//=============================================================================
-//======================== LCD / Controller Selection =========================
-//======================== (Character-based LCDs) =========================
-//=============================================================================
-// @section lcd
-
-//
-// RepRapDiscount Smart Controller.
-// https://reprap.org/wiki/RepRapDiscount_Smart_Controller
-//
-// Note: Usually sold with a white PCB.
-//
-//#define REPRAP_DISCOUNT_SMART_CONTROLLER
-
-//
-// GT2560 (YHCB2004) LCD Display
-//
-// Requires Testato, Koepel softwarewire library and
-// Andriy Golovnya's LiquidCrystal_AIP31068 library.
-//
-//#define YHCB2004
-
-//
-// Original RADDS LCD Display+Encoder+SDCardReader
-// http://doku.radds.org/dokumentation/lcd-display/
-//
-//#define RADDS_DISPLAY
-
-//
-// ULTIMAKER Controller.
-//
-//#define ULTIMAKERCONTROLLER
-
-//
-// ULTIPANEL as seen on Thingiverse.
-//
-//#define ULTIPANEL
-
-//
-// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3)
-// https://reprap.org/wiki/PanelOne
-//
-//#define PANEL_ONE
-
-//
-// GADGETS3D G3D LCD/SD Controller
-// https://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel
-//
-// Note: Usually sold with a blue PCB.
-//
-//#define G3D_PANEL
-
-//
-// RigidBot Panel V1.0
-// http://www.inventapart.com/
-//
-//#define RIGIDBOT_PANEL
-
-//
-// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller
-// https://www.aliexpress.com/item/32765887917.html
-//
-//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
-
-//
-// ANET and Tronxy 20x4 Controller
-//
-//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
-// This LCD is known to be susceptible to electrical interference
-// which scrambles the display. Pressing any button clears it up.
-// This is a LCD2004 display with 5 analog buttons.
-
-//
-// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD.
-//
-//#define ULTRA_LCD
-
-//=============================================================================
-//======================== LCD / Controller Selection =========================
-//===================== (I2C and Shift-Register LCDs) =====================
-//=============================================================================
-
-//
-// CONTROLLER TYPE: I2C
-//
-// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C
-// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C
-//
-
-//
-// Elefu RA Board Control Panel
-// http://www.elefu.com/index.php?route=product/product&product_id=53
-//
-//#define RA_CONTROL_PANEL
-
-//
-// Sainsmart (YwRobot) LCD Displays
-//
-// These require F.Malpartida's LiquidCrystal_I2C library
-// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
-//
-//#define LCD_SAINSMART_I2C_1602
-//#define LCD_SAINSMART_I2C_2004
-
-//
-// Generic LCM1602 LCD adapter
-//
-//#define LCM1602
-
-//
-// PANELOLU2 LCD with status LEDs,
-// separate encoder and click inputs.
-//
-// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later.
-// For more info: https://github.com/lincomatic/LiquidTWI2
-//
-// Note: The PANELOLU2 encoder click input can either be directly connected to
-// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1).
-//
-//#define LCD_I2C_PANELOLU2
-
-//
-// Panucatt VIKI LCD with status LEDs,
-// integrated click & L/R/U/D buttons, separate encoder inputs.
-//
-//#define LCD_I2C_VIKI
-
-//
-// CONTROLLER TYPE: Shift register panels
-//
-
-//
-// 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH
-// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD
-//
-//#define SAV_3DLCD
-
-//
-// 3-wire SR LCD with strobe using 74HC4094
-// https://github.com/mikeshub/SailfishLCD
-// Uses the code directly from Sailfish
-//
-//#define FF_INTERFACEBOARD
-
-//
-// TFT GLCD Panel with Marlin UI
-// Panel connected to main board by SPI or I2C interface.
-// See https://github.com/Serhiy-K/TFTGLCDAdapter
-//
-//#define TFTGLCD_PANEL_SPI
-//#define TFTGLCD_PANEL_I2C
-
-//=============================================================================
-//======================= LCD / Controller Selection =======================
-//========================= (Graphical LCDs) ========================
-//=============================================================================
-
-//
-// CONTROLLER TYPE: Graphical 128x64 (DOGM)
-//
-// IMPORTANT: The U8glib library is required for Graphical Display!
-// https://github.com/olikraus/U8glib_Arduino
-//
-// NOTE: If the LCD is unresponsive you may need to reverse the plugs.
-//
-
-//
-// RepRapDiscount FULL GRAPHIC Smart Controller
-// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
-//
-//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
-
-//
-// K.3D Full Graphic Smart Controller
-//
-//#define K3D_FULL_GRAPHIC_SMART_CONTROLLER
-
-//
-// ReprapWorld Graphical LCD
-// https://reprapworld.com/?products_details&products_id/1218
-//
-//#define REPRAPWORLD_GRAPHICAL_LCD
-
-//
-// Activate one of these if you have a Panucatt Devices
-// Viki 2.0 or mini Viki with Graphic LCD
-// https://www.panucatt.com
-//
-//#define VIKI2
-//#define miniVIKI
-
-//
-// Alfawise Ex8 printer LCD marked as WYH L12864 COG
-//
-//#define WYH_L12864
-
-//
-// MakerLab Mini Panel with graphic
-// controller and SD support - https://reprap.org/wiki/Mini_panel
-//
-//#define MINIPANEL
-
-//
-// MaKr3d Makr-Panel with graphic controller and SD support.
-// https://reprap.org/wiki/MaKr3d_MaKrPanel
-//
-//#define MAKRPANEL
-
-//
-// Adafruit ST7565 Full Graphic Controller.
-// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/
-//
-//#define ELB_FULL_GRAPHIC_CONTROLLER
-
-//
-// BQ LCD Smart Controller shipped by
-// default with the BQ Hephestos 2 and Witbox 2.
-//
-//#define BQ_LCD_SMART_CONTROLLER
-
-//
-// Cartesio UI
-// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface
-//
-//#define CARTESIO_UI
-
-//
-// LCD for Melzi Card with Graphical LCD
-//
-//#define LCD_FOR_MELZI
-
-//
-// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder
-// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1)
-//
-//#define ULTI_CONTROLLER
-
-//
-// MKS MINI12864 with graphic controller and SD support
-// https://reprap.org/wiki/MKS_MINI_12864
-//
-//#define MKS_MINI_12864
-
-//
-// MKS MINI12864 V3 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight.
-//
-//#define MKS_MINI_12864_V3
-
-//
-// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout.
-// https://www.aliexpress.com/item/33018110072.html
-//
-//#define MKS_LCD12864A
-//#define MKS_LCD12864B
-
-//
-// FYSETC variant of the MINI12864 graphic controller with SD support
-// https://wiki.fysetc.com/Mini12864_Panel/
-//
-//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default
-//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on)
-//#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight
-//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel RGB Backlight
-//#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight.
-
-//
-// BigTreeTech Mini 12864 V1.0 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight.
-//
-//#define BTT_MINI_12864_V1
-
-//
-// Factory display for Creality CR-10
-// https://www.aliexpress.com/item/32833148327.html
-//
-// This is RAMPS-compatible using a single 10-pin connector.
-// (For CR-10 owners who want to replace the Melzi Creality board but retain the display)
-//
-//#define CR10_STOCKDISPLAY
-
-//
-// Ender-2 OEM display, a variant of the MKS_MINI_12864
-//
-//#define ENDER2_STOCKDISPLAY
-
-//
-// ANET and Tronxy Graphical Controller
-//
-// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6
-// A clone of the RepRapDiscount full graphics display but with
-// different pins/wiring (see pins_ANET_10.h). Enable one of these.
-//
-//#define ANET_FULL_GRAPHICS_LCD
-//#define ANET_FULL_GRAPHICS_LCD_ALT_WIRING
-
-//
-// AZSMZ 12864 LCD with SD
-// https://www.aliexpress.com/item/32837222770.html
-//
-//#define AZSMZ_12864
-
-//
-// Silvergate GLCD controller
-// https://github.com/android444/Silvergate
-//
-//#define SILVER_GATE_GLCD_CONTROLLER
-
-//
-// eMotion Tech LCD with SD
-// https://www.reprap-france.com/produit/1234568748-ecran-graphique-128-x-64-points-2-1
-//
-//#define EMOTION_TECH_LCD
-
-//=============================================================================
-//============================== OLED Displays ==============================
-//=============================================================================
-
-//
-// SSD1306 OLED full graphics generic display
-//
-//#define U8GLIB_SSD1306
-
-//
-// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules
-//
-//#define SAV_3DGLCD
-#if ENABLED(SAV_3DGLCD)
-#define U8GLIB_SSD1306
-//#define U8GLIB_SH1106
-#endif
-
-//
-// TinyBoy2 128x64 OLED / Encoder Panel
-//
-//#define OLED_PANEL_TINYBOY2
-
-//
-// MKS OLED 1.3" 128×64 Full Graphics Controller
-// https://reprap.org/wiki/MKS_12864OLED
-//
-// Tiny, but very sharp OLED display
-//
-//#define MKS_12864OLED // Uses the SH1106 controller (default)
-//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
-
-//
-// Zonestar OLED 128×64 Full Graphics Controller
-//
-//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller
-//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default)
-//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller
-
-//
-// Einstart S OLED SSD1306
-//
-//#define U8GLIB_SH1106_EINSTART
-
-//
-// Overlord OLED display/controller with i2c buzzer and LEDs
-//
-//#define OVERLORD_OLED
-
-//
-// FYSETC OLED 2.42" 128×64 Full Graphics Controller with WS2812 RGB
-// Where to find : https://www.aliexpress.com/item/4000345255731.html
-//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller
-
-//
-// K.3D SSD1309 OLED 2.42" 128×64 Full Graphics Controller
-//
-//#define K3D_242_OLED_CONTROLLER // Software SPI
//=============================================================================
//========================== Extensible UI Displays ===========================
//=============================================================================
-/**
- * DGUS Touch Display with DWIN OS. (Choose one.)
- * ORIGIN : https://www.aliexpress.com/item/32993409517.html
- * FYSETC : https://www.aliexpress.com/item/32961471929.html
- * MKS : https://www.aliexpress.com/item/1005002008179262.html
- *
- * Flash display with DGUS Displays for Marlin:
- * - Format the SD card to FAT32 with an allocation size of 4kb.
- * - Download files as specified for your type of display.
- * - Plug the microSD card into the back of the display.
- * - Boot the display and wait for the update to complete.
- *
- * ORIGIN (Marlin DWIN_SET)
- * - Download https://github.com/coldtobi/Marlin_DGUS_Resources
- * - Copy the downloaded DWIN_SET folder to the SD card.
- *
- * FYSETC (Supplier default)
- * - Download https://github.com/FYSETC/FYSTLCD-2.0
- * - Copy the downloaded SCREEN folder to the SD card.
- *
- * HIPRECY (Supplier default)
- * - Download https://github.com/HiPrecy/Touch-Lcd-LEO
- * - Copy the downloaded DWIN_SET folder to the SD card.
- *
- * MKS (MKS-H43) (Supplier default)
- * - Download https://github.com/makerbase-mks/MKS-H43
- * - Copy the downloaded DWIN_SET folder to the SD card.
- *
- * RELOADED (T5UID1)
- * - Download https://github.com/Desuuuu/DGUS-reloaded/releases
- * - Copy the downloaded DWIN_SET folder to the SD card.
- */
-//#define DGUS_LCD_UI_ORIGIN
-//#define DGUS_LCD_UI_FYSETC
-//#define DGUS_LCD_UI_HIPRECY
-//#define DGUS_LCD_UI_MKS
-//#define DGUS_LCD_UI_RELOADED
-#if ENABLED(DGUS_LCD_UI_MKS)
-#define USE_MKS_GREEN_UI
-#endif
-
-//
-// Touch-screen LCD for Malyan M200/M300 printers
-//
-//#define MALYAN_LCD
-
-//
-// Touch UI for FTDI EVE (FT800/FT810) displays
-// See Configuration_adv.h for all configuration options.
-//
-//#define TOUCH_UI_FTDI_EVE
-
-//
-// Touch-screen LCD for Anycubic printers
-//
-//#define ANYCUBIC_LCD_I3MEGA
-//#define ANYCUBIC_LCD_CHIRON
-#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON)
-//#define ANYCUBIC_LCD_DEBUG
-#endif
-
-//
-// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028
-//
-//#define NEXTION_TFT
-
-//
-// Third-party or vendor-customized controller interfaces.
-// Sources should be installed in 'src/lcd/extui'.
-//
-//#define EXTENSIBLE_UI
-
-#if ENABLED(EXTENSIBLE_UI)
-//#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display
-#endif
-
-//=============================================================================
-//=============================== Graphical TFTs ==============================
-//=============================================================================
-
-/**
- * Specific TFT Model Presets. Enable one of the following options
- * or enable TFT_GENERIC and set sub-options.
- */
-
-//
-// 480x320, 3.5", SPI Display with Rotary Encoder from MKS
-// Usually paired with MKS Robin Nano V2 & V3
-//
-//#define MKS_TS35_V2_0
-
-//
-// 320x240, 2.4", FSMC Display From MKS
-// Usually paired with MKS Robin Nano V1.2
-//
-//#define MKS_ROBIN_TFT24
-
-//
-// 320x240, 2.8", FSMC Display From MKS
-// Usually paired with MKS Robin Nano V1.2
-//
-//#define MKS_ROBIN_TFT28
-
-//
-// 320x240, 3.2", FSMC Display From MKS
-// Usually paired with MKS Robin Nano V1.2
-//
-//#define MKS_ROBIN_TFT32
-
-//
-// 480x320, 3.5", FSMC Display From MKS
-// Usually paired with MKS Robin Nano V1.2
-//
-//#define MKS_ROBIN_TFT35
-
-//
-// 480x272, 4.3", FSMC Display From MKS
-//
-//#define MKS_ROBIN_TFT43
-
-//
-// 320x240, 3.2", FSMC Display From MKS
-// Usually paired with MKS Robin
-//
-//#define MKS_ROBIN_TFT_V1_1R
-
-//
-// 480x320, 3.5", FSMC Stock Display from TronxXY
-//
-//#define TFT_TRONXY_X5SA
-
-//
-// 480x320, 3.5", FSMC Stock Display from AnyCubic
-//
-//#define ANYCUBIC_TFT35
-
-//
-// 320x240, 2.8", FSMC Stock Display from Longer/Alfawise
-//
-//#define LONGER_LK_TFT28
-
-//
-// 320x240, 2.8", FSMC Stock Display from ET4
-//
-//#define ANET_ET4_TFT28
-
-//
-// 480x320, 3.5", FSMC Stock Display from ET5
-//
-//#define ANET_ET5_TFT35
-
-//
-// 1024x600, 7", RGB Stock Display with Rotary Encoder from BIQU-BX
-//
-//#define BIQU_BX_TFT70
-
-//
-// 480x320, 3.5", SPI Stock Display with Rotary Encoder from BIQU B1 SE Series
-//
-//#define BTT_TFT35_SPI_V1_0
-
-//
-// Generic TFT with detailed options
-//
-//#define TFT_GENERIC
-#if ENABLED(TFT_GENERIC)
-// :[ 'AUTO', 'ST7735', 'ST7789', 'ST7796', 'R61505', 'ILI9328', 'ILI9341', 'ILI9488' ]
-#define TFT_DRIVER AUTO
-
-// Interface. Enable one of the following options:
-//#define TFT_INTERFACE_FSMC
-//#define TFT_INTERFACE_SPI
-
-// TFT Resolution. Enable one of the following options:
-//#define TFT_RES_320x240
-//#define TFT_RES_480x272
-//#define TFT_RES_480x320
-//#define TFT_RES_1024x600
-#endif
-
-/**
- * TFT UI - User Interface Selection. Enable one of the following options:
- *
- * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled
- * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities
- * TFT_LVGL_UI - A Modern UI using LVGL
- *
- * For LVGL_UI also copy the 'assets' folder from the build directory to the
- * root of your SD card, together with the compiled firmware.
- */
-//#define TFT_CLASSIC_UI
-//#define TFT_COLOR_UI
-//#define TFT_LVGL_UI
-
-#if ENABLED(TFT_LVGL_UI)
-//#define MKS_WIFI_MODULE // MKS WiFi module
-#endif
-
-/**
- * TFT Rotation. Set to one of the following values:
- *
- * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y,
- * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y,
- * TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y,
- * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION
- */
-//#define TFT_ROTATION TFT_NO_ROTATION
-
-//=============================================================================
-//============================ Other Controllers ============================
-//=============================================================================
-
-//
-// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder.
-//
-//#define DWIN_CREALITY_LCD // Creality UI
-//#define DWIN_LCD_PROUI // Pro UI by MRiscoC
-//#define DWIN_CREALITY_LCD_JYERSUI // Jyers UI by Jacob Myers
-//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
-//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
-
-//
-// Touch Screen Settings
-//
-//#define TOUCH_SCREEN
-#if ENABLED(TOUCH_SCREEN)
-#define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens
-#define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
-
-//#define TOUCH_IDLE_SLEEP 300 // (s) Turn off the TFT backlight if set (5mn)
-
-#define TOUCH_SCREEN_CALIBRATION
-
-//#define TOUCH_CALIBRATION_X 12316
-//#define TOUCH_CALIBRATION_Y -8981
-//#define TOUCH_OFFSET_X -43
-//#define TOUCH_OFFSET_Y 257
-//#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
-
-#if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS)
-#define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM
-#endif
-
-#if ENABLED(TFT_COLOR_UI)
-//#define SINGLE_TOUCH_NAVIGATION
-#endif
-#endif
-
-//
-// RepRapWorld REPRAPWORLD_KEYPAD v1.1
-// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/
-//
-//#define REPRAPWORLD_KEYPAD
-//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
-
-//
-// EasyThreeD ET-4000+ with button input and status LED
-//
-//#define EASYTHREED_UI
+#define DGUS_LCD_UI_RELOADED
//=============================================================================
//=============================== Extra Features ==============================
@@ -3214,99 +1972,7 @@
// @section extras
// Support for the BariCUDA Paste Extruder
-//#define BARICUDA
-
-// @section lights
-
-// Temperature status LEDs that display the hotend and bed temperature.
-// If all hotends, bed temperature, and target temperature are under 54C
-// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
-//#define TEMP_STAT_LEDS
-
-// Support for BlinkM/CyzRgb
-//#define BLINKM
-
-// Support for PCA9632 PWM LED driver
-//#define PCA9632
-
-// Support for PCA9533 PWM LED driver
-//#define PCA9533
-
-/**
- * RGB LED / LED Strip Control
- *
- * Enable support for an RGB LED connected to 5V digital pins, or
- * an RGB Strip connected to MOSFETs controlled by digital pins.
- *
- * Adds the M150 command to set the LED (or LED strip) color.
- * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of
- * luminance values can be set from 0 to 255.
- * For NeoPixel LED an overall brightness parameter is also available.
- *
- * *** CAUTION ***
- * LED Strips require a MOSFET Chip between PWM lines and LEDs,
- * as the Arduino cannot handle the current the LEDs will require.
- * Failure to follow this precaution can destroy your Arduino!
- * NOTE: A separate 5V power supply is required! The NeoPixel LED needs
- * more current than the Arduino 5V linear regulator can produce.
- * *** CAUTION ***
- *
- * LED Type. Enable only one of the following two options.
- */
-//#define RGB_LED
-//#define RGBW_LED
-
-#if EITHER(RGB_LED, RGBW_LED)
-//#define RGB_LED_R_PIN 34
-//#define RGB_LED_G_PIN 43
-//#define RGB_LED_B_PIN 35
-//#define RGB_LED_W_PIN -1
-#endif
-
-// Support for Adafruit NeoPixel LED driver
-//#define NEOPIXEL_LED
-#if ENABLED(NEOPIXEL_LED)
-#define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW, NEO_RGBW, NEO_GRB, NEO_RBG, etc.
-// See https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.h
-//#define NEOPIXEL_PIN 4 // LED driving pin
-//#define NEOPIXEL2_TYPE NEOPIXEL_TYPE
-//#define NEOPIXEL2_PIN 5
-#define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.)
-#define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once.
-#define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255)
-//#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup
-
-// Support for second Adafruit NeoPixel LED driver controlled with M150 S1 ...
-//#define NEOPIXEL2_SEPARATE
-#if ENABLED(NEOPIXEL2_SEPARATE)
-#define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip
-#define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255)
-#define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup
-#else
-//#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel
-#endif
-
-// Use some of the NeoPixel LEDs for static (background) lighting
-//#define NEOPIXEL_BKGD_INDEX_FIRST 0 // Index of the first background LED
-//#define NEOPIXEL_BKGD_INDEX_LAST 5 // Index of the last background LED
-//#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W
-//#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off
-#endif
-
-/**
- * Printer Event LEDs
- *
- * During printing, the LEDs will reflect the printer status:
- *
- * - Gradually change from blue to violet as the heated bed gets to target temp
- * - Gradually change from violet to red as the hotend gets to temperature
- * - Change to white to illuminate work surface
- * - Change to green once print has finished
- * - Turn off after the print has finished and the user has pushed a button
- */
-#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED)
-#define PRINTER_EVENT_LEDS
-#endif
+#define BARICUDA
// @section servos
@@ -3317,7 +1983,7 @@
* Set this manually if there are extra servos needing manual control.
* Set to 0 to turn off servo support.
*/
-//#define NUM_SERVOS 3 // Note: Servo index starts with 0 for M280-M282 commands
+#define NUM_SERVOS 1 // Note: Servo index starts with 0 for M280-M282 commands
// (ms) Delay before the next move will start, to give the servo time to reach its target angle.
// 300ms is a good value but you can try less delay.
@@ -3332,3 +1998,5 @@
// Disable servo with M282 to reduce power consumption, noise, and heat when not in use
//#define SERVO_DETACH_GCODE
+
+#define NO_AUTO_ASSIGN_WARNING 1
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 7abeee2d2844..91715e1ecda6 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -72,101 +72,101 @@
// Custom Thermistor 1000 parameters
//
#if TEMP_SENSOR_0 == 1000
-#define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND0_BETA 3950 // Beta value
-#define HOTEND0_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND0_BETA 3950 // Beta value
+ #define HOTEND0_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_1 == 1000
-#define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND1_BETA 3950 // Beta value
-#define HOTEND1_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND1_BETA 3950 // Beta value
+ #define HOTEND1_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_2 == 1000
-#define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND2_BETA 3950 // Beta value
-#define HOTEND2_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND2_BETA 3950 // Beta value
+ #define HOTEND2_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_3 == 1000
-#define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND3_BETA 3950 // Beta value
-#define HOTEND3_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND3_BETA 3950 // Beta value
+ #define HOTEND3_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_4 == 1000
-#define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND4_BETA 3950 // Beta value
-#define HOTEND4_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND4_BETA 3950 // Beta value
+ #define HOTEND4_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_5 == 1000
-#define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND5_BETA 3950 // Beta value
-#define HOTEND5_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND5_BETA 3950 // Beta value
+ #define HOTEND5_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_6 == 1000
-#define HOTEND6_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND6_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND6_BETA 3950 // Beta value
-#define HOTEND6_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND6_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND6_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND6_BETA 3950 // Beta value
+ #define HOTEND6_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_7 == 1000
-#define HOTEND7_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define HOTEND7_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define HOTEND7_BETA 3950 // Beta value
-#define HOTEND7_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define HOTEND7_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define HOTEND7_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define HOTEND7_BETA 3950 // Beta value
+ #define HOTEND7_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_BED == 1000
-#define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define BED_BETA 3950 // Beta value
-#define BED_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define BED_BETA 3950 // Beta value
+ #define BED_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_CHAMBER == 1000
-#define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define CHAMBER_BETA 3950 // Beta value
-#define CHAMBER_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define CHAMBER_BETA 3950 // Beta value
+ #define CHAMBER_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_COOLER == 1000
-#define COOLER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define COOLER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define COOLER_BETA 3950 // Beta value
-#define COOLER_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define COOLER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define COOLER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define COOLER_BETA 3950 // Beta value
+ #define COOLER_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_PROBE == 1000
-#define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define PROBE_BETA 3950 // Beta value
-#define PROBE_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define PROBE_BETA 3950 // Beta value
+ #define PROBE_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_BOARD == 1000
-#define BOARD_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define BOARD_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define BOARD_BETA 3950 // Beta value
-#define BOARD_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define BOARD_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define BOARD_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define BOARD_BETA 3950 // Beta value
+ #define BOARD_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
#if TEMP_SENSOR_REDUNDANT == 1000
-#define REDUNDANT_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
-#define REDUNDANT_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
-#define REDUNDANT_BETA 3950 // Beta value
-#define REDUNDANT_SH_C_COEFF 0 // Steinhart-Hart C coefficient
+ #define REDUNDANT_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
+ #define REDUNDANT_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
+ #define REDUNDANT_BETA 3950 // Beta value
+ #define REDUNDANT_SH_C_COEFF 0 // Steinhart-Hart C coefficient
#endif
/**
@@ -175,6 +175,7 @@
//#define TEMP_SENSOR_FORCE_HW_SPI // Ignore SCK/MOSI/MISO pins; use CS and the default SPI bus.
//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board.
//#define MAX31865_SENSOR_WIRES_1 2
+//#define MAX31865_SENSOR_WIRES_2 2
//#define MAX31865_50HZ_FILTER // Use a 50Hz filter instead of the default 60Hz.
//#define MAX31865_USE_READ_ERROR_DETECTION // Treat value spikes (20°C delta in under 1s) as read errors.
@@ -185,6 +186,7 @@
//#define MAX31865_WIRE_OHMS_0 0.95f // For 2-wire, set the wire resistances for more accurate readings.
//#define MAX31865_WIRE_OHMS_1 0.0f
+//#define MAX31865_WIRE_OHMS_2 0.0f
/**
* Hephestos 2 24V heated bed upgrade kit.
@@ -192,93 +194,93 @@
*/
//#define HEPHESTOS2_HEATED_BED_KIT
#if ENABLED(HEPHESTOS2_HEATED_BED_KIT)
-#undef TEMP_SENSOR_BED
-#define TEMP_SENSOR_BED 70
-#define HEATER_BED_INVERTING true
+ #undef TEMP_SENSOR_BED
+ #define TEMP_SENSOR_BED 70
+ #define HEATER_BED_INVERTING true
#endif
//
// Heated Bed Bang-Bang options
//
#if DISABLED(PIDTEMPBED)
-#define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
-#if ENABLED(BED_LIMIT_SWITCHING)
-#define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS
-#endif
+ #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
+ #if ENABLED(BED_LIMIT_SWITCHING)
+ #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS
+ #endif
#endif
//
// Heated Chamber options
//
#if DISABLED(PIDTEMPCHAMBER)
-#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
-#if ENABLED(CHAMBER_LIMIT_SWITCHING)
-#define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS
-#endif
+ #define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
+ #if ENABLED(CHAMBER_LIMIT_SWITCHING)
+ #define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS
+ #endif
#endif
#if TEMP_SENSOR_CHAMBER
-//#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug)
-//#define HEATER_CHAMBER_INVERTING false
-//#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug)
-
-//#define CHAMBER_FAN // Enable a fan on the chamber
-#if ENABLED(CHAMBER_FAN)
-//#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
-#define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve; 3=similar to 1 but fan is always on.
-#if CHAMBER_FAN_MODE == 0
-#define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255)
-#elif CHAMBER_FAN_MODE == 1
-#define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target
-#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target
-#elif CHAMBER_FAN_MODE == 2
-#define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255)
-#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target
-#elif CHAMBER_FAN_MODE == 3
-#define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255)
-#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target
-#endif
-#endif
-
-//#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber
-#if ENABLED(CHAMBER_VENT)
-#define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo
-#define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber
-#define LOW_EXCESS_HEAT_LIMIT 3
-#define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20
-#define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5
-#endif
+ //#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug)
+ //#define HEATER_CHAMBER_INVERTING false
+ //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug)
+
+ //#define CHAMBER_FAN // Enable a fan on the chamber
+ #if ENABLED(CHAMBER_FAN)
+ //#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
+ #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve; 3=similar to 1 but fan is always on.
+ #if CHAMBER_FAN_MODE == 0
+ #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255)
+ #elif CHAMBER_FAN_MODE == 1
+ #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target
+ #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target
+ #elif CHAMBER_FAN_MODE == 2
+ #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255)
+ #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target
+ #elif CHAMBER_FAN_MODE == 3
+ #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255)
+ #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target
+ #endif
+ #endif
+
+ //#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber
+ #if ENABLED(CHAMBER_VENT)
+ #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo
+ #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber
+ #define LOW_EXCESS_HEAT_LIMIT 3
+ #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20
+ #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5
+ #endif
#endif
//
// Laser Cooler options
//
#if TEMP_SENSOR_COOLER
-#define COOLER_MINTEMP 8 // (°C)
-#define COOLER_MAXTEMP 26 // (°C)
-#define COOLER_DEFAULT_TEMP 16 // (°C)
-#define TEMP_COOLER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target
-#define COOLER_PIN 8 // Laser cooler on/off pin used to control power to the cooling element (e.g., TEC, External chiller via relay)
-#define COOLER_INVERTING false
-#define TEMP_COOLER_PIN 15 // Laser/Cooler temperature sensor pin. ADC is required.
-#define COOLER_FAN // Enable a fan on the cooler, Fan# 0,1,2,3 etc.
-#define COOLER_FAN_INDEX 0 // FAN number 0, 1, 2 etc. e.g.
-#if ENABLED(COOLER_FAN)
-#define COOLER_FAN_BASE 100 // Base Cooler fan PWM (0-255); turns on when Cooler temperature is above the target
-#define COOLER_FAN_FACTOR 25 // PWM increase per °C above target
-#endif
+ #define COOLER_MINTEMP 8 // (°C)
+ #define COOLER_MAXTEMP 26 // (°C)
+ #define COOLER_DEFAULT_TEMP 16 // (°C)
+ #define TEMP_COOLER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target
+ #define COOLER_PIN 8 // Laser cooler on/off pin used to control power to the cooling element (e.g., TEC, External chiller via relay)
+ #define COOLER_INVERTING false
+ #define TEMP_COOLER_PIN 15 // Laser/Cooler temperature sensor pin. ADC is required.
+ #define COOLER_FAN // Enable a fan on the cooler, Fan# 0,1,2,3 etc.
+ #define COOLER_FAN_INDEX 0 // FAN number 0, 1, 2 etc. e.g.
+ #if ENABLED(COOLER_FAN)
+ #define COOLER_FAN_BASE 100 // Base Cooler fan PWM (0-255); turns on when Cooler temperature is above the target
+ #define COOLER_FAN_FACTOR 25 // PWM increase per °C above target
+ #endif
#endif
//
// Motherboard Sensor options
//
#if TEMP_SENSOR_BOARD
-#define THERMAL_PROTECTION_BOARD // Halt the printer if the board sensor leaves the temp range below.
-#define BOARD_MINTEMP 8 // (°C)
-#define BOARD_MAXTEMP 70 // (°C)
-#ifndef TEMP_BOARD_PIN
-//#define TEMP_BOARD_PIN -1 // Board temp sensor pin, if not set in pins file.
-#endif
+ #define THERMAL_PROTECTION_BOARD // Halt the printer if the board sensor leaves the temp range below.
+ #define BOARD_MINTEMP 8 // (°C)
+ #define BOARD_MAXTEMP 70 // (°C)
+ #ifndef TEMP_BOARD_PIN
+ //#define TEMP_BOARD_PIN -1 // Board temp sensor pin, if not set in pins file.
+ #endif
#endif
/**
@@ -298,138 +300,138 @@
* THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD
*/
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
-#define THERMAL_PROTECTION_PERIOD 40 // Seconds
-#define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius
-
-//#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops
-#if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP)
-//#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303
-#endif
-
-/**
- * Whenever an M104, M109, or M303 increases the target temperature, the
- * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature
- * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and
- * requires a hard reset. This test restarts with any M104/M109/M303, but only
- * if the current temperature is far enough below the target for a reliable
- * test.
- *
- * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD
- * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set
- * below 2.
- */
-#define WATCH_TEMP_PERIOD 40 // Seconds
-#define WATCH_TEMP_INCREASE 2 // Degrees Celsius
+ #define THERMAL_PROTECTION_PERIOD 40 // Seconds
+ #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius
+
+ //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops
+ #if ENABLED(ADAPTIVE_FAN_SLOWING) && EITHER(MPCTEMP, PIDTEMP)
+ //#define TEMP_TUNING_MAINTAIN_FAN // Don't slow fan speed during M303 or M306 T
+ #endif
+
+ /**
+ * Whenever an M104, M109, or M303 increases the target temperature, the
+ * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature
+ * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and
+ * requires a hard reset. This test restarts with any M104/M109/M303, but only
+ * if the current temperature is far enough below the target for a reliable
+ * test.
+ *
+ * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD
+ * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set
+ * below 2.
+ */
+ #define WATCH_TEMP_PERIOD 40 // Seconds
+ #define WATCH_TEMP_INCREASE 2 // Degrees Celsius
#endif
/**
* Thermal Protection parameters for the bed are just as above for hotends.
*/
#if ENABLED(THERMAL_PROTECTION_BED)
-#define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds
-#define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius
+ #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds
+ #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius
-/**
- * As described above, except for the bed (M140/M190/M303).
- */
-#define WATCH_BED_TEMP_PERIOD 60 // Seconds
-#define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius
+ /**
+ * As described above, except for the bed (M140/M190/M303).
+ */
+ #define WATCH_BED_TEMP_PERIOD 60 // Seconds
+ #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius
#endif
/**
* Thermal Protection parameters for the heated chamber.
*/
#if ENABLED(THERMAL_PROTECTION_CHAMBER)
-#define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds
-#define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius
+ #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds
+ #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius
-/**
- * Heated chamber watch settings (M141/M191).
- */
-#define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds
-#define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius
+ /**
+ * Heated chamber watch settings (M141/M191).
+ */
+ #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds
+ #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius
#endif
/**
* Thermal Protection parameters for the laser cooler.
*/
#if ENABLED(THERMAL_PROTECTION_COOLER)
-#define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds
-#define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius
+ #define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds
+ #define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius
-/**
- * Laser cooling watch settings (M143/M193).
- */
-#define WATCH_COOLER_TEMP_PERIOD 60 // Seconds
-#define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius
+ /**
+ * Laser cooling watch settings (M143/M193).
+ */
+ #define WATCH_COOLER_TEMP_PERIOD 60 // Seconds
+ #define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius
#endif
#if ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_BED, THERMAL_PROTECTION_CHAMBER, THERMAL_PROTECTION_COOLER)
-/**
- * Thermal Protection Variance Monitor - EXPERIMENTAL.
- * Kill the machine on a stuck temperature sensor. Disable if you get false positives.
- */
-//#define THERMAL_PROTECTION_VARIANCE_MONITOR // Detect a sensor malfunction preventing temperature updates
+ /**
+ * Thermal Protection Variance Monitor - EXPERIMENTAL.
+ * Kill the machine on a stuck temperature sensor. Disable if you get false positives.
+ */
+ //#define THERMAL_PROTECTION_VARIANCE_MONITOR // Detect a sensor malfunction preventing temperature updates
#endif
#if ENABLED(PIDTEMP)
-// Add an experimental additional term to the heater power, proportional to the extrusion speed.
-// A well-chosen Kc value should add just enough power to melt the increased material volume.
-//#define PID_EXTRUSION_SCALING
-#if ENABLED(PID_EXTRUSION_SCALING)
-#define DEFAULT_Kc (100) // heating power = Kc * e_speed
-#define LPQ_MAX_LEN 50
-#endif
-
-/**
- * Add an experimental additional term to the heater power, proportional to the fan speed.
- * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
- * You can either just add a constant compensation with the DEFAULT_Kf value
- * or follow the instruction below to get speed-dependent compensation.
- *
- * Constant compensation (use only with fanspeeds of 0% and 100%)
- * ---------------------------------------------------------------------
- * A good starting point for the Kf-value comes from the calculation:
- * kf = (power_fan * eff_fan) / power_heater * 255
- * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater.
- *
- * Example:
- * Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8
- * Kf = (2.4W * 0.8) / 40W * 255 = 12.24
- *
- * Fan-speed dependent compensation
- * --------------------------------
- * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%).
- * Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled.
- * If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature
- * drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big.
- * 2. Note the Kf-value for fan-speed at 100%
- * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving.
- * 4. Repeat step 1. and 2. for this fan speed.
- * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in
- * PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED
- */
-//#define PID_FAN_SCALING
-#if ENABLED(PID_FAN_SCALING)
-//#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION
-#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
-// The alternative definition is used for an easier configuration.
-// Just figure out Kf at fullspeed (255) and PID_FAN_SCALING_MIN_SPEED.
-// DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
-
-#define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf
-#define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf
-#define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
-
-#define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
-#define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
-
-#else
-#define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed)
-#define DEFAULT_Kf 10 // A constant value added to the PID-tuner
-#define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
-#endif
-#endif
+ // Add an additional term to the heater power, proportional to the extrusion speed.
+ // A well-chosen Kc value should add just enough power to melt the increased material volume.
+ //#define PID_EXTRUSION_SCALING
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ #define DEFAULT_Kc (100) // heating power = Kc * e_speed
+ #define LPQ_MAX_LEN 50
+ #endif
+
+ /**
+ * Add an additional term to the heater power, proportional to the fan speed.
+ * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
+ * You can either just add a constant compensation with the DEFAULT_Kf value
+ * or follow the instruction below to get speed-dependent compensation.
+ *
+ * Constant compensation (use only with fanspeeds of 0% and 100%)
+ * ---------------------------------------------------------------------
+ * A good starting point for the Kf-value comes from the calculation:
+ * kf = (power_fan * eff_fan) / power_heater * 255
+ * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater.
+ *
+ * Example:
+ * Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8
+ * Kf = (2.4W * 0.8) / 40W * 255 = 12.24
+ *
+ * Fan-speed dependent compensation
+ * --------------------------------
+ * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%).
+ * Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled.
+ * If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature
+ * drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big.
+ * 2. Note the Kf-value for fan-speed at 100%
+ * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving.
+ * 4. Repeat step 1. and 2. for this fan speed.
+ * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in
+ * PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED
+ */
+ //#define PID_FAN_SCALING
+ #if ENABLED(PID_FAN_SCALING)
+ //#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION
+ #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
+ // The alternative definition is used for an easier configuration.
+ // Just figure out Kf at fullspeed (255) and PID_FAN_SCALING_MIN_SPEED.
+ // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
+
+ #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf
+ #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf
+ #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
+
+ #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
+ #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
+
+ #else
+ #define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed)
+ #define DEFAULT_Kf 10 // A constant value added to the PID-tuner
+ #define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
+ #endif
+ #endif
#endif
/**
@@ -447,14 +449,17 @@
*/
#define AUTOTEMP
#if ENABLED(AUTOTEMP)
-#define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0)
-// Turn on AUTOTEMP on M104/M109 by default using proportions set here
-//#define AUTOTEMP_PROPORTIONAL
-#if ENABLED(AUTOTEMP_PROPORTIONAL)
-#define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature
-#define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature
-#define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F)
-#endif
+ #define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0)
+ #define AUTOTEMP_MIN 210
+ #define AUTOTEMP_MAX 250
+ #define AUTOTEMP_FACTOR 0.1f
+ // Turn on AUTOTEMP on M104/M109 by default using proportions set here
+ //#define AUTOTEMP_PROPORTIONAL
+ #if ENABLED(AUTOTEMP_PROPORTIONAL)
+ #define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature
+ #define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature
+ #define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F)
+ #endif
#endif
// Show Temperature ADC value
@@ -467,38 +472,43 @@
* Thermistors able to support high temperature tend to have a hard time getting
* good readings at room and lower temperatures. This means TEMP_SENSOR_X_RAW_LO_TEMP
* will probably be caught when the heating element first turns on during the
- * preheating process, which will trigger a min_temp_error as a safety measure
+ * preheating process, which will trigger a MINTEMP error as a safety measure
* and force stop everything.
* To circumvent this limitation, we allow for a preheat time (during which,
- * min_temp_error won't be triggered) and add a min_temp buffer to handle
+ * MINTEMP error won't be triggered) and add a min_temp buffer to handle
* aberrant readings.
*
* If you want to enable this feature for your hotend thermistor(s)
- * uncomment and set values > 0 in the constants below
+ * uncomment and set va lues > 0 in the constants below
*/
// The number of consecutive low temperature errors that can occur
-// before a min_temp_error is triggered. (Shouldn't be more than 10.)
+// before a MINTEMP error is triggered. (Shouldn't be more than 10.)
//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0
-// The number of milliseconds a hotend will preheat before starting to check
-// the temperature. This value should NOT be set to the time it takes the
-// hot end to reach the target temperature, but the time it takes to reach
-// the minimum temperature your thermistor can read. The lower the better/safer.
-// This shouldn't need to be more than 30 seconds (30000)
-//#define MILLISECONDS_PREHEAT_TIME 0
+/**
+ * The number of milliseconds a hotend will preheat before starting to check
+ * the temperature. This value should NOT be set to the time it takes the
+ * hot end to reach the target temperature, but the time it takes to reach
+ * the minimum temperature your thermistor can read. The lower the better/safer.
+ * This shouldn't need to be more than 30 seconds (30000)
+ */
+//#define PREHEAT_TIME_HOTEND_MS 0
+//#define PREHEAT_TIME_BED_MS 0
// @section extruder
-// Extruder runout prevention.
-// If the machine is idle and the temperature over MINTEMP
-// then extrude some filament every couple of SECONDS.
+/**
+ * Extruder runout prevention.
+ * If the machine is idle and the temperature over MINTEMP
+ * then extrude some filament every couple of SECONDS.
+ */
//#define EXTRUDER_RUNOUT_PREVENT
#if ENABLED(EXTRUDER_RUNOUT_PREVENT)
-#define EXTRUDER_RUNOUT_MINTEMP 190
-#define EXTRUDER_RUNOUT_SECONDS 30
-#define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min)
-#define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm)
+ #define EXTRUDER_RUNOUT_MINTEMP 190
+ #define EXTRUDER_RUNOUT_SECONDS 30
+ #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min)
+ #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm)
#endif
/**
@@ -507,10 +517,10 @@
*/
//#define HOTEND_IDLE_TIMEOUT
#if ENABLED(HOTEND_IDLE_TIMEOUT)
-#define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection
-#define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection
-#define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout
-#define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout
+ #define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection
+ #define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection
+ #define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout
+ #define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout
#endif
// @section temperature
@@ -529,29 +539,34 @@
* The fan turns on automatically whenever any driver is enabled and turns
* off (or reduces to idle speed) shortly after drivers are turned off.
*/
-//#define USE_CONTROLLER_FAN
+#define USE_CONTROLLER_FAN
#if ENABLED(USE_CONTROLLER_FAN)
-//#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan
-//#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered
-//#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled.
-#define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.)
-#define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled
-#define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled
-#define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors
-
-// Use TEMP_SENSOR_BOARD as a trigger for enabling the controller fan
-//#define CONTROLLER_FAN_MIN_BOARD_TEMP 40 // (°C) Turn on the fan if the board reaches this temperature
-
-//#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings
-#if ENABLED(CONTROLLER_FAN_EDITABLE)
-#define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu
-#endif
+ #define CONTROLLER_FAN_PIN FAN3_PIN // Set a custom pin for the controller fan
+ //#define CONTROLLER_FAN2_PIN -1 // Set a custom pin for second controller fan
+ //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered
+ //#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled.
+ #define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.)
+ #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled
+ #define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled
+ #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors
+
+ // Use TEMP_SENSOR_BOARD as a trigger for enabling the controller fan
+ //#define CONTROLLER_FAN_MIN_BOARD_TEMP 40 // (°C) Turn on the fan if the board reaches this temperature
+
+ #define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings
+ #if ENABLED(CONTROLLER_FAN_EDITABLE)
+ #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu
+ #endif
#endif
-// When first starting the main fan, run it at full speed for the
-// given number of milliseconds. This gets the fan spinning reliably
-// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
-//#define FAN_KICKSTART_TIME 100
+/**
+ * Fan Kickstart
+ * When part cooling or controller fans first start, run at a speed that
+ * gets it spinning reliably for a short time before setting the requested speed.
+ * (Does not work on Sanguinololu with FAN_SOFT_PWM.)
+ */
+//#define FAN_KICKSTART_TIME 100 // (ms)
+//#define FAN_KICKSTART_POWER 180 // 64-255
// Some coolers may require a non-zero "off" state.
//#define FAN_OFF_PWM 1
@@ -596,17 +611,17 @@
* PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.)
* USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies.
*/
-//#define FAST_PWM_FAN // Increase the fan PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino
+#define FAST_PWM_FAN // Increase the fan PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino
#if ENABLED(FAST_PWM_FAN)
-//#define FAST_PWM_FAN_FREQUENCY 31400 // Define here to override the defaults below
-//#define USE_OCR2A_AS_TOP
-#ifndef FAST_PWM_FAN_FREQUENCY
-#ifdef __AVR__
-#define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1))
-#else
-#define FAST_PWM_FAN_FREQUENCY 1000U
-#endif
-#endif
+ // #define FAST_PWM_FAN_FREQUENCY 20000 // Define here to override the defaults below
+ //#define USE_OCR2A_AS_TOP
+ #ifndef FAST_PWM_FAN_FREQUENCY
+ #ifdef __AVR__
+ #define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1))
+ #else
+ #define FAST_PWM_FAN_FREQUENCY 1000U
+ #endif
+ #endif
#endif
/**
@@ -691,29 +706,6 @@
#define FANMUX1_PIN -1
#define FANMUX2_PIN -1
-/**
- * M355 Case Light on-off / brightness
- */
-//#define CASE_LIGHT_ENABLE
-#if ENABLED(CASE_LIGHT_ENABLE)
-//#define CASE_LIGHT_PIN 4 // Override the default pin if needed
-#define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW
-#define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on
-#define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin)
-//#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting.
-//#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255)
-//#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu
-#if ENABLED(NEOPIXEL_LED)
-//#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light
-#endif
-#if EITHER(RGB_LED, RGBW_LED)
-//#define CASE_LIGHT_USE_RGB_LED // Use RGB / RGBW LED as case light
-#endif
-#if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED)
-#define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White }
-#endif
-#endif
-
// @section homing
// If you want endstops to stay on (by default) even when not homing
@@ -727,58 +719,8 @@
// Employ an external closed loop controller. Override pins here if needed.
//#define EXTERNAL_CLOSED_LOOP_CONTROLLER
#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER)
-//#define CLOSED_LOOP_ENABLE_PIN -1
-//#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1
-#endif
-
-/**
- * Dual X Carriage
- *
- * This setup has two X carriages that can move independently, each with its own hotend.
- * The carriages can be used to print an object with two colors or materials, or in
- * "duplication mode" it can print two identical or X-mirrored objects simultaneously.
- * The inactive carriage is parked automatically to prevent oozing.
- * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis.
- * By default the X2 stepper is assigned to the first unused E plug on the board.
- *
- * The following Dual X Carriage modes can be selected with M605 S:
- *
- * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel
- * results as long as it supports dual X-carriages. (M605 S0)
- *
- * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so
- * that additional slicer support is not required. (M605 S1)
- *
- * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with
- * the first X-carriage and extruder, to print 2 copies of the same object at the same time.
- * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and
- * follow with M605 S2 to initiate duplicated movement.
- *
- * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates
- * the movement of the first except the second extruder is reversed in the X axis.
- * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and
- * follow with M605 S3 to initiate mirrored movement.
- */
-//#define DUAL_X_CARRIAGE
-#if ENABLED(DUAL_X_CARRIAGE)
-#define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS
-#define X1_MAX_POS X_BED_SIZE // A max coordinate so the X1 carriage can't hit the parked X2 carriage
-#define X2_MIN_POS 80 // A min coordinate so the X2 carriage can't hit the parked X1 carriage
-#define X2_MAX_POS 353 // The max position of the X2 carriage, typically also the home position
-#define X2_HOME_DIR 1 // Set to 1. The X2 carriage always homes to the max endstop position
-#define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS.
-// NOTE: For Dual X Carriage use M218 T1 Xn to override the X2_HOME_POS.
-// This allows recalibration of endstops distance without a rebuild.
-// Remember to set the second extruder's X-offset to 0 in your slicer.
-
-// This is the default power-up mode which can be changed later using M605 S.
-#define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE
-
-// Default x offset in duplication mode (typically set to half print bed width)
-#define DEFAULT_DUPLICATION_X_OFFSET 100
-
-// Default action to execute following M605 mode change commands. Typically G28X to apply new mode.
-//#define EVENT_GCODE_IDEX_AFTER_MODECHANGE "G28X"
+ //#define CLOSED_LOOP_ENABLE_PIN -1
+ //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1
#endif
/**
@@ -802,60 +744,56 @@
* - Use X2_USE_ENDSTOP to set the endstop plug by name. (_XMIN_, _XMAX_, _YMIN_, _YMAX_, _ZMIN_, _ZMAX_)
*/
#if HAS_X2_STEPPER && DISABLED(DUAL_X_CARRIAGE)
-//#define INVERT_X2_VS_X_DIR // X2 direction signal is the opposite of X
-//#define X_DUAL_ENDSTOPS // X2 has its own endstop
-#if ENABLED(X_DUAL_ENDSTOPS)
-#define X2_USE_ENDSTOP _XMAX_ // X2 endstop board plug. Don't forget to enable USE_*_PLUG.
-#define X2_ENDSTOP_ADJUSTMENT 0 // X2 offset relative to X endstop
-#endif
+ //#define INVERT_X2_VS_X_DIR // X2 direction signal is the opposite of X
+ //#define X_DUAL_ENDSTOPS // X2 has its own endstop
+ #if ENABLED(X_DUAL_ENDSTOPS)
+ #define X2_USE_ENDSTOP _XMAX_ // X2 endstop board plug. Don't forget to enable USE_*_PLUG.
+ #define X2_ENDSTOP_ADJUSTMENT 0 // X2 offset relative to X endstop
+ #endif
#endif
#if HAS_DUAL_Y_STEPPERS
-//#define INVERT_Y2_VS_Y_DIR // Y2 direction signal is the opposite of Y
-//#define Y_DUAL_ENDSTOPS // Y2 has its own endstop
-#if ENABLED(Y_DUAL_ENDSTOPS)
-#define Y2_USE_ENDSTOP _YMAX_ // Y2 endstop board plug. Don't forget to enable USE_*_PLUG.
-#define Y2_ENDSTOP_ADJUSTMENT 0 // Y2 offset relative to Y endstop
-#endif
+ #define INVERT_Y2_VS_Y_DIR // Y2 direction signal is the opposite of Y
+ //#define Y_DUAL_ENDSTOPS // Y2 has its own endstop
+ #if ENABLED(Y_DUAL_ENDSTOPS)
+ #define Y2_USE_ENDSTOP _YMAX_ // Y2 endstop board plug. Don't forget to enable USE_*_PLUG.
+ #define Y2_ENDSTOP_ADJUSTMENT 0 // Y2 offset relative to Y endstop
+ #endif
#endif
//
// Multi-Z steppers
//
#ifdef Z2_DRIVER_TYPE
-//#define INVERT_Z2_VS_Z_DIR // Z2 direction signal is the opposite of Z
-
-//#define Z_MULTI_ENDSTOPS // Other Z axes have their own endstops
-#if ENABLED(Z_MULTI_ENDSTOPS)
-#define Z2_USE_ENDSTOP _XMAX_ // Z2 endstop board plug. Don't forget to enable USE_*_PLUG.
-#define Z2_ENDSTOP_ADJUSTMENT 0 // Z2 offset relative to Y endstop
-#endif
-#ifdef Z3_DRIVER_TYPE
-//#define INVERT_Z3_VS_Z_DIR // Z3 direction signal is the opposite of Z
-#if ENABLED(Z_MULTI_ENDSTOPS)
-#define Z3_USE_ENDSTOP _YMAX_ // Z3 endstop board plug. Don't forget to enable USE_*_PLUG.
-#define Z3_ENDSTOP_ADJUSTMENT 0 // Z3 offset relative to Y endstop
-#endif
-#endif
-#ifdef Z4_DRIVER_TYPE
-//#define INVERT_Z4_VS_Z_DIR // Z4 direction signal is the opposite of Z
-#if ENABLED(Z_MULTI_ENDSTOPS)
-#define Z4_USE_ENDSTOP _ZMAX_ // Z4 endstop board plug. Don't forget to enable USE_*_PLUG.
-#define Z4_ENDSTOP_ADJUSTMENT 0 // Z4 offset relative to Y endstop
-#endif
-#endif
+ #define INVERT_Z2_VS_Z_DIR // Z2 direction signal is the opposite of Z
+
+ //#define Z_MULTI_ENDSTOPS // Other Z axes have their own endstops
+ #if ENABLED(Z_MULTI_ENDSTOPS)
+ #define Z2_USE_ENDSTOP _XMAX_ // Z2 endstop board plug. Don't forget to enable USE_*_PLUG.
+ #define Z2_ENDSTOP_ADJUSTMENT 0 // Z2 offset relative to Z endstop
+ #endif
+ #ifdef Z3_DRIVER_TYPE
+ //#define INVERT_Z3_VS_Z_DIR // Z3 direction signal is the opposite of Z
+ #if ENABLED(Z_MULTI_ENDSTOPS)
+ #define Z3_USE_ENDSTOP _YMAX_ // Z3 endstop board plug. Don't forget to enable USE_*_PLUG.
+ #define Z3_ENDSTOP_ADJUSTMENT 0 // Z3 offset relative to Z endstop
+ #endif
+ #endif
+ #ifdef Z4_DRIVER_TYPE
+ //#define INVERT_Z4_VS_Z_DIR // Z4 direction signal is the opposite of Z
+ #if ENABLED(Z_MULTI_ENDSTOPS)
+ #define Z4_USE_ENDSTOP _ZMAX_ // Z4 endstop board plug. Don't forget to enable USE_*_PLUG.
+ #define Z4_ENDSTOP_ADJUSTMENT 0 // Z4 offset relative to Z endstop
+ #endif
+ #endif
#endif
// Drive the E axis with two synchronized steppers
//#define E_DUAL_STEPPER_DRIVERS
#if ENABLED(E_DUAL_STEPPER_DRIVERS)
-//#define INVERT_E1_VS_E0_DIR // E direction signals are opposites
+ //#define INVERT_E1_VS_E0_DIR // E direction signals are opposites
#endif
-// Activate a solenoid on the active extruder with M380. Disable all with M381.
-// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid.
-//#define EXT_SOLENOID
-
// @section homing
/**
@@ -866,187 +804,126 @@
//#define SENSORLESS_BACKOFF_MM { 2, 2, 0 } // (linear=mm, rotational=°) Backoff from endstops before sensorless homing
-#define HOMING_BUMP_MM { 5, 5, 2 } // (linear=mm, rotational=°) Backoff from endstops after first bump
-#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate)
+#define HOMING_BUMP_MM { 5, 5, 2, 0 } // (linear=mm, rotational=°) Backoff from endstops after first bump
+#define HOMING_BUMP_DIVISOR { 2, 2, 4, 2 } // Re-Bump Speed Divisor (Divides the Homing Feedrate)
-//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (linear=mm, rotational=°) Backoff from endstops after homing
+#define HOMING_BACKOFF_POST_MM { 1, 1, 1, 1 } // (linear=mm, rotational=°) Backoff from endstops after homing
+//#define XY_COUNTERPART_BACKOFF_MM 0 // (mm) Backoff X after homing Y, and vice-versa
-//#define QUICK_HOME // If G28 contains XY do a diagonal move first
-//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
+#define QUICK_HOME // If G28 contains XY do a diagonal move first
+#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
//#define HOME_Z_FIRST // Home Z first. Requires a Z-MIN endstop (not a probe).
-//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first
+// #define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first
+
+#define BLTOUCH
// @section bltouch
#if ENABLED(BLTOUCH)
-/**
- * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES
- * Do not activate settings that the probe might not understand. Clones might misunderstand
- * advanced commands.
- *
- * Note: If the probe is not deploying, do a "Reset" and "Self-Test" and then check the
- * wiring of the BROWN, RED and ORANGE wires.
- *
- * Note: If the trigger signal of your probe is not being recognized, it has been very often
- * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable"
- * like they would be with a real switch. So please check the wiring first.
- *
- * Settings for all BLTouch and clone probes:
- */
-
-// Safety: The probe needs time to recognize the command.
-// Minimum command delay (ms). Enable and increase if needed.
-//#define BLTOUCH_DELAY 500
-
-/**
- * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones:
- */
-
-// Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful
-// in special cases, like noisy or filtered input configurations.
-//#define BLTOUCH_FORCE_SW_MODE
-
-/**
- * Settings for BLTouch Smart 3.0 and 3.1
- * Summary:
- * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes
- * - High-Speed mode
- * - Disable LCD voltage options
- */
-
-/**
- * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller!
- * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup.
- * If disabled, OD mode is the hard-coded default on 3.0
- * On startup, Marlin will compare its eeprom to this value. If the selected mode
- * differs, a mode set eeprom write will be completed at initialization.
- * Use the option below to force an eeprom write to a V3.1 probe regardless.
- */
-//#define BLTOUCH_SET_5V_MODE
-
-/**
- * Safety: Activate if connecting a probe with an unknown voltage mode.
- * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0
- * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write )
- * To preserve the life of the probe, use this once then turn it off and re-flash.
- */
-//#define BLTOUCH_FORCE_MODE_SET
-
-/**
- * Enable "HIGH SPEED" option for probing.
- * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems.
- * This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians
- * might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM.
- *
- * Set the default state here, change with 'M401 S' or UI, use M500 to save, M502 to reset.
- */
-//#define BLTOUCH_HS_MODE true
-
-// Safety: Enable voltage mode settings in the LCD menu.
-//#define BLTOUCH_LCD_VOLTAGE_MENU
+ /**
+ * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES
+ * Do not activate settings that the probe might not understand. Clones might misunderstand
+ * advanced commands.
+ *
+ * Note: If the probe is not deploying, do a "Reset" and "Self-Test" and then check the
+ * wiring of the BROWN, RED and ORANGE wires.
+ *
+ * Note: If the trigger signal of your probe is not being recognized, it has been very often
+ * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable"
+ * like they would be with a real switch. So please check the wiring first.
+ *
+ * Settings for all BLTouch and clone probes:
+ */
+
+ // Safety: The probe needs time to recognize the command.
+ // Minimum command delay (ms). Enable and increase if needed.
+ #define BLTOUCH_DELAY 500
+
+ /**
+ * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones:
+ */
+
+ // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful
+ // in special cases, like noisy or filtered input configurations.
+ //#define BLTOUCH_FORCE_SW_MODE
+
+ /**
+ * Settings for BLTouch Smart 3.0 and 3.1
+ * Summary:
+ * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes
+ * - High-Speed mode
+ * - Disable LCD voltage options
+ */
+
+ /**
+ * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller!
+ * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup.
+ * If disabled, OD mode is the hard-coded default on 3.0
+ * On startup, Marlin will compare its eeprom to this value. If the selected mode
+ * differs, a mode set eeprom write will be completed at initialization.
+ * Use the option below to force an eeprom write to a V3.1 probe regardless.
+ */
+ //#define BLTOUCH_SET_5V_MODE
+
+ /**
+ * Safety: Activate if connecting a probe with an unknown voltage mode.
+ * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0
+ * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write )
+ * To preserve the life of the probe, use this once then turn it off and re-flash.
+ */
+ //#define BLTOUCH_FORCE_MODE_SET
+
+ /**
+ * Enable "HIGH SPEED" option for probing.
+ * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems.
+ * This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians
+ * might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM.
+ *
+ * Set the default state here, change with 'M401 S' or UI, use M500 to save, M502 to reset.
+ */
+ //#define BLTOUCH_HS_MODE true
+
+ // Safety: Enable voltage mode settings in the LCD menu.
+ //#define BLTOUCH_LCD_VOLTAGE_MENU
#endif // BLTOUCH
// @section extras
-/**
- * Z Steppers Auto-Alignment
- * Add the G34 command to align multiple Z steppers using a bed probe.
- */
-//#define Z_STEPPER_AUTO_ALIGN
-#if ENABLED(Z_STEPPER_AUTO_ALIGN)
-/**
- * Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]]
- * These positions are machine-relative and do not shift with the M206 home offset!
- * If not defined, probe limits will be used.
- * Override with 'M422 S X Y'.
- */
-//#define Z_STEPPER_ALIGN_XY { { 10, 190 }, { 100, 10 }, { 190, 190 } }
-
-/**
- * Orientation for the automatically-calculated probe positions.
- * Override Z stepper align points with 'M422 S X Y'
- *
- * 2 Steppers: (0) (1)
- * | | 2 |
- * | 1 2 | |
- * | | 1 |
- *
- * 3 Steppers: (0) (1) (2) (3)
- * | 3 | 1 | 2 1 | 2 |
- * | | 3 | | 3 |
- * | 1 2 | 2 | 3 | 1 |
- *
- * 4 Steppers: (0) (1) (2) (3)
- * | 4 3 | 1 4 | 2 1 | 3 2 |
- * | | | | |
- * | 1 2 | 2 3 | 3 4 | 4 1 |
- */
-#ifndef Z_STEPPER_ALIGN_XY
-//#define Z_STEPPERS_ORIENTATION 0
-#endif
-
-/**
- * Z Stepper positions for more rapid convergence in bed alignment.
- * Requires 3 or 4 Z steppers.
- *
- * Define Stepper XY positions for Z1, Z2, Z3... corresponding to the screw
- * positions in the bed carriage, with one position per Z stepper in stepper
- * driver order.
- */
-//#define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } }
-
-#ifndef Z_STEPPER_ALIGN_STEPPER_XY
-// Amplification factor. Used to scale the correction step up or down in case
-// the stepper (spindle) position is farther out than the test point.
-#define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability!
-#endif
-
-// On a 300mm bed a 5% grade would give a misalignment of ~1.5cm
-#define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle
-#define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment
-#define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this
-#define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done?
-// After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
-// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
-#define HOME_AFTER_G34
-#endif
-
//
// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe.
//
-//#define ASSISTED_TRAMMING
+#define ASSISTED_TRAMMING
#if ENABLED(ASSISTED_TRAMMING)
-// Define positions for probe points.
-#define TRAMMING_POINT_XY { { 20, 20 }, { 180, 20 }, { 180, 180 }, { 20, 180 } }
+ // Define positions for probe points.
+ #define TRAMMING_POINT_XY { { 20, 20 }, { 180, 20 }, { 180, 180 }, { 20, 180 } }
-// Define position names for probe points.
-#define TRAMMING_POINT_NAME_1 "Front-Left"
-#define TRAMMING_POINT_NAME_2 "Front-Right"
-#define TRAMMING_POINT_NAME_3 "Back-Right"
-#define TRAMMING_POINT_NAME_4 "Back-Left"
+ // Define position names for probe points.
+ #define TRAMMING_POINT_NAME_1 "Front-Left"
+ #define TRAMMING_POINT_NAME_2 "Front-Right"
+ #define TRAMMING_POINT_NAME_3 "Back-Right"
+ #define TRAMMING_POINT_NAME_4 "Back-Left"
-#define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation
-//#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first
+ #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation
+ #define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first
-//#define ASSISTED_TRAMMING_WIZARD // Add a Tramming Wizard to the LCD menu
+ //#define ASSISTED_TRAMMING_WIZARD // Add a Tramming Wizard to the LCD menu
-//#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment
+ //#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment
-/**
- * Screw thread:
- * M3: 30 = Clockwise, 31 = Counter-Clockwise
- * M4: 40 = Clockwise, 41 = Counter-Clockwise
- * M5: 50 = Clockwise, 51 = Counter-Clockwise
- */
-#define TRAMMING_SCREW_THREAD 30
+ /**
+ * Screw thread:
+ * M3: 30 = Clockwise, 31 = Counter-Clockwise
+ * M4: 40 = Clockwise, 41 = Counter-Clockwise
+ * M5: 50 = Clockwise, 51 = Counter-Clockwise
+ */
+ #define TRAMMING_SCREW_THREAD 30
#endif
// @section motion
-
-#define AXIS_RELATIVE_MODES { false, false, false, false }
+#define AXIS_RELATIVE_MODES { false, false, false, true, false }
// Add a Duplicate option for well-separated conjoined nozzles
//#define MULTI_NOZZLE_DUPLICATION
@@ -1091,7 +968,7 @@
// Increase the slowdown divisor for larger buffer sizes.
#define SLOWDOWN
#if ENABLED(SLOWDOWN)
-#define SLOWDOWN_DIVISOR 2
+ #define SLOWDOWN_DIVISOR 2
#endif
/**
@@ -1102,7 +979,7 @@
*/
//#define XY_FREQUENCY_LIMIT 10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F.
#ifdef XY_FREQUENCY_LIMIT
-#define XY_FREQUENCY_MIN_PERCENT 5 // (percent) Minimum FR percentage to apply. Set with M201 G.
+ #define XY_FREQUENCY_MIN_PERCENT 5 // (percent) Minimum FR percentage to apply. Set with M201 G.
#endif
// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end
@@ -1110,111 +987,6 @@
// if unwanted behavior is observed on a user's machine when running at very slow speeds.
#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s)
-//
-// Backlash Compensation
-// Adds extra movement to axes on direction-changes to account for backlash.
-//
-//#define BACKLASH_COMPENSATION
-#if ENABLED(BACKLASH_COMPENSATION)
-// Define values for backlash distance and correction.
-// If BACKLASH_GCODE is enabled these values are the defaults.
-#define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (linear=mm, rotational=°) One value for each linear axis
-#define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction
-
-// Add steps for motor direction changes on CORE kinematics
-//#define CORE_BACKLASH
-
-// Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments
-// to reduce print artifacts. (Enabling this is costly in memory and computation!)
-//#define BACKLASH_SMOOTHING_MM 3 // (mm)
-
-// Add runtime configuration and tuning of backlash values (M425)
-//#define BACKLASH_GCODE
-
-#if ENABLED(BACKLASH_GCODE)
-// Measure the Z backlash when probing (G29) and set with "M425 Z"
-#define MEASURE_BACKLASH_WHEN_PROBING
-
-#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING)
-// When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT
-// mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION
-// increments while checking for the contact to be broken.
-#define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm)
-#define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm)
-#define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_FEEDRATE_SLOW // (mm/min)
-#endif
-#endif
-#endif
-
-/**
- * Automatic backlash, position and hotend offset calibration
- *
- * Enable G425 to run automatic calibration using an electrically-
- * conductive cube, bolt, or washer mounted on the bed.
- *
- * G425 uses the probe to touch the top and sides of the calibration object
- * on the bed and measures and/or correct positional offsets, axis backlash
- * and hotend offsets.
- *
- * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within
- * ±5mm of true values for G425 to succeed.
- */
-//#define CALIBRATION_GCODE
-#if ENABLED(CALIBRATION_GCODE)
-
-//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
-//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"
-
-#define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm
-
-#define CALIBRATION_FEEDRATE_SLOW 60 // mm/min
-#define CALIBRATION_FEEDRATE_FAST 1200 // mm/min
-#define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min
-
-// The following parameters refer to the conical section of the nozzle tip.
-#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm
-#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm
-
-// Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM).
-//#define CALIBRATION_REPORTING
-
-// The true location and dimension the cube/bolt/washer on the bed.
-#define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm
-#define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm
-
-// Comment out any sides which are unreachable by the probe. For best
-// auto-calibration results, all sides must be reachable.
-#define CALIBRATION_MEASURE_RIGHT
-#define CALIBRATION_MEASURE_FRONT
-#define CALIBRATION_MEASURE_LEFT
-#define CALIBRATION_MEASURE_BACK
-
-//#define CALIBRATION_MEASURE_IMIN
-//#define CALIBRATION_MEASURE_IMAX
-//#define CALIBRATION_MEASURE_JMIN
-//#define CALIBRATION_MEASURE_JMAX
-//#define CALIBRATION_MEASURE_KMIN
-//#define CALIBRATION_MEASURE_KMAX
-//#define CALIBRATION_MEASURE_UMIN
-//#define CALIBRATION_MEASURE_UMAX
-//#define CALIBRATION_MEASURE_VMIN
-//#define CALIBRATION_MEASURE_VMAX
-//#define CALIBRATION_MEASURE_WMIN
-//#define CALIBRATION_MEASURE_WMAX
-
-// Probing at the exact top center only works if the center is flat. If
-// probing on a screwhead or hollow washer, probe near the edges.
-//#define CALIBRATION_MEASURE_AT_TOP_EDGES
-
-// Define the pin to read during calibration
-#ifndef CALIBRATION_PIN
-//#define CALIBRATION_PIN -1 // Define here to override the default pin
-#define CALIBRATION_PIN_INVERTING false // Set to true to invert the custom pin
-//#define CALIBRATION_PIN_PULLDOWN
-#define CALIBRATION_PIN_PULLUP
-#endif
-#endif
-
/**
* Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
* below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible
@@ -1237,58 +1009,6 @@
// Microstep settings (Requires a board with pins named X_MS1, X_MS2, etc.)
#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16]
-/**
- * @section stepper motor current
- *
- * Some boards have a means of setting the stepper motor current via firmware.
- *
- * The power on motor currents are set by:
- * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2
- * known compatible chips: A4982
- * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H
- * known compatible chips: AD5206
- * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2
- * known compatible chips: MCP4728
- * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE
- * known compatible chips: MCP4451, MCP4018
- *
- * Motor currents can also be set by M907 - M910 and by the LCD.
- * M907 - applies to all.
- * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H
- * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2
- */
-//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps
-//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
-//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis
-
-/**
- * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro)
- */
-//#define DIGIPOT_MCP4018 // Requires https://github.com/felias-fogg/SlowSoftI2CMaster
-//#define DIGIPOT_MCP4451
-#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451)
-#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5
-
-// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS.
-// These correspond to the physical drivers, so be mindful if the order is changed.
-#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO
-
-//#define DIGIPOT_USE_RAW_VALUES // Use DIGIPOT_MOTOR_CURRENT raw wiper values (instead of A4988 motor currents)
-
-/**
- * Common slave addresses:
- *
- * A (A shifted) B (B shifted) IC
- * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451
- * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451
- * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451
- * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451
- * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018
- */
-//#define DIGIPOT_I2C_ADDRESS_A 0x2C // Unshifted slave address for first DIGIPOT
-//#define DIGIPOT_I2C_ADDRESS_B 0x2D // Unshifted slave address for second DIGIPOT
-#endif
-
//===========================================================================
//=============================Additional Features===========================
//===========================================================================
@@ -1296,781 +1016,404 @@
// @section lcd
#if HAS_MANUAL_MOVE_MENU
-#define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel
-#define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines
-#if IS_ULTIPANEL
-#define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position"
-#define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen
-#endif
+ #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60, 50*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel
+ #define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines
+ #if IS_ULTIPANEL
+ #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position"
+ #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen
+ #endif
#endif
// Change values more rapidly when the encoder is rotated faster
#define ENCODER_RATE_MULTIPLIER
#if ENABLED(ENCODER_RATE_MULTIPLIER)
-#define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed
-#define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed
+ #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed
+ #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed
#endif
// Play a beep when the feedrate is changed from the Status Screen
//#define BEEP_ON_FEEDRATE_CHANGE
#if ENABLED(BEEP_ON_FEEDRATE_CHANGE)
-#define FEEDRATE_CHANGE_BEEP_DURATION 10
-#define FEEDRATE_CHANGE_BEEP_FREQUENCY 440
+ #define FEEDRATE_CHANGE_BEEP_DURATION 10
+ #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440
#endif
//
// LCD Backlight Timeout
//
-//#define LCD_BACKLIGHT_TIMEOUT 30 // (s) Timeout before turning off the backlight
-
-#if HAS_BED_PROBE && EITHER(HAS_MARLINUI_MENU, HAS_TFT_LVGL_UI)
-//#define PROBE_OFFSET_WIZARD // Add a Probe Z Offset calibration option to the LCD menu
-#if ENABLED(PROBE_OFFSET_WIZARD)
-/**
- * Enable to init the Probe Z-Offset when starting the Wizard.
- * Use a height slightly above the estimated nozzle-to-probe Z offset.
- * For example, with an offset of -5, consider a starting height of -4.
- */
-//#define PROBE_OFFSET_WIZARD_START_Z -4.0
+//#define LCD_BACKLIGHT_TIMEOUT_MINS 1 // (minutes) Timeout before turning off the backlight
+
+#if HAS_DISPLAY
+ //#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
+ #define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state
+
+ // The timeout to return to the status screen from sub-menus
+ //#define LCD_TIMEOUT_TO_STATUS 15000 // (ms)
+
+ #if ENABLED(SHOW_BOOTSCREEN)
+ #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
+ #if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI)
+ #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
+ #endif
+ #endif
+
+ // Scroll a longer status message into view
+ //#define STATUS_MESSAGE_SCROLLING
+
+ // Apply a timeout to low-priority status messages
+ //#define STATUS_MESSAGE_TIMEOUT_SEC 30 // (seconds)
+
+ // On the Info Screen, display XY with one decimal place when possible
+ //#define LCD_DECIMAL_SMALL_XY
+
+ // Show the E position (filament used) during printing
+ //#define LCD_SHOW_E_TOTAL
+
+ // Display a negative temperature instead of "err"
+ //#define SHOW_TEMPERATURE_BELOW_ZERO
+
+ /**
+ * LED Control Menu
+ * Add LED Control to the LCD menu
+ */
+ //#define LED_CONTROL_MENU
+ #if ENABLED(LED_CONTROL_MENU)
+ #define LED_COLOR_PRESETS // Enable the Preset Color menu option
+ //#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option
+ #if ENABLED(LED_COLOR_PRESETS)
+ #define LED_USER_PRESET_RED 255 // User defined RED value
+ #define LED_USER_PRESET_GREEN 128 // User defined GREEN value
+ #define LED_USER_PRESET_BLUE 0 // User defined BLUE value
+ #define LED_USER_PRESET_WHITE 255 // User defined WHITE value
+ #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity
+ //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup
+ #endif
+ #if ENABLED(NEO2_COLOR_PRESETS)
+ #define NEO2_USER_PRESET_RED 255 // User defined RED value
+ #define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value
+ #define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value
+ #define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value
+ #define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity
+ //#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip
+ #endif
+ #endif
+
+#endif // HAS_DISPLAY
+
+// Add 'M73' to set print job progress, overrides Marlin's built-in estimate
+//#define SET_PROGRESS_MANUALLY
+#if ENABLED(SET_PROGRESS_MANUALLY)
+ #define SET_PROGRESS_PERCENT // Add 'P' parameter to set percentage done
+ #define SET_REMAINING_TIME // Add 'R' parameter to set remaining time
+ //#define SET_INTERACTION_TIME // Add 'C' parameter to set time until next filament change or other user interaction
+ //#define M73_REPORT // Report M73 values to host
+ #if BOTH(M73_REPORT, SDSUPPORT)
+ #define M73_REPORT_SD_ONLY // Report only when printing from SD
+ #endif
+#endif
+
+// LCD Print Progress options. Multiple times may be displayed in turn.
+#if HAS_DISPLAY && EITHER(SDSUPPORT, SET_PROGRESS_MANUALLY)
+ #define SHOW_PROGRESS_PERCENT // Show print progress percentage (doesn't affect progress bar)
+ #define SHOW_ELAPSED_TIME // Display elapsed printing time (prefix 'E')
+ //#define SHOW_REMAINING_TIME // Display estimated time to completion (prefix 'R')
+ #if ENABLED(SET_INTERACTION_TIME)
+ #define SHOW_INTERACTION_TIME // Display time until next user interaction ('C' = filament change)
+ #endif
+ //#define PRINT_PROGRESS_SHOW_DECIMALS // Show/report progress with decimal digits, not all UIs support this
-// Set a convenient position to do the calibration (probing point and nozzle/bed-distance)
-//#define PROBE_OFFSET_WIZARD_XY_POS { X_CENTER, Y_CENTER }
-#endif
#endif
-#if HAS_MARLINUI_MENU
+#if ENABLED(SDSUPPORT)
+ /**
+ * SD Card SPI Speed
+ * May be required to resolve "volume init" errors.
+ *
+ * Enable and set to SPI_HALF_SPEED, SPI_QUARTER_SPEED, or SPI_EIGHTH_SPEED
+ * otherwise full speed will be applied.
+ *
+ * :['SPI_HALF_SPEED', 'SPI_QUARTER_SPEED', 'SPI_EIGHTH_SPEED']
+ */
+ //#define SD_SPI_SPEED SPI_HALF_SPEED
+
+ // The standard SD detect circuit reads LOW when media is inserted and HIGH when empty.
+ // Enable this option and set to HIGH if your SD cards are incorrectly detected.
+ //#define SD_DETECT_STATE HIGH
+
+ //#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up
+ //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash)
+
+ //#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping
+
+ #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls
+
+ #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished
+ #define SD_FINISHED_RELEASECOMMAND "M84" // Use "M84XYE" to keep Z enabled so your bed stays in place
+
+ // Reverse SD sort to show "more recent" files first, according to the card's FAT.
+ // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended.
+ #define SDCARD_RATHERRECENTFIRST
+
+ #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing
+
+ //#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM
+ //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files
+
+ //#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted
+
+ //#define MEDIA_MENU_AT_TOP // Force the media menu to be listed on the top of the main menu
+
+ #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27")
+
+ #if ENABLED(PRINTER_EVENT_LEDS)
+ #define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination
+ #endif
+
+ /**
+ * Sort SD file listings in alphabetical order.
+ *
+ * With this option enabled, items on SD cards will be sorted
+ * by name for easier navigation.
+ *
+ * By default...
+ *
+ * - Use the slowest -but safest- method for sorting.
+ * - Folders are sorted to the top.
+ * - The sort key is statically allocated.
+ * - No added G-code (M34) support.
+ * - 40 item sorting limit. (Items after the first 40 are unsorted.)
+ *
+ * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the
+ * compiler to calculate the worst-case usage and throw an error if the SRAM
+ * limit is exceeded.
+ *
+ * - SDSORT_USES_RAM provides faster sorting via a static directory buffer.
+ * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer.
+ * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!)
+ * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!)
+ */
+ //#define SDCARD_SORT_ALPHA
+
+ // SD Card Sorting options
+ #if ENABLED(SDCARD_SORT_ALPHA)
+ #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each.
+ #define FOLDER_SORTING -1 // -1=above 0=none 1=below
+ #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 G-code.
+ #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting.
+ #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
+ #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option.
+ #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
+ #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
+ // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
+ #endif
+
+ // Allow international symbols in long filenames. To display correctly, the
+ // LCD's font must contain the characters. Check your selected LCD language.
+ //#define UTF_FILENAME_SUPPORT
+
+ //#define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 ' and list long filenames with 'M20 L'
+ //#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol
+ //#define M20_TIMESTAMP_SUPPORT // Include timestamps by adding the 'T' flag to M20 commands
+
+ //#define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu
+
+ //#define SD_ABORT_NO_COOLDOWN // Leave the heaters on after Stop Print (not recommended!)
+
+ /**
+ * Abort SD printing when any endstop is triggered.
+ * This feature is enabled with 'M540 S1' or from the LCD menu.
+ * Endstops must be activated for this option to work.
+ */
+ //#define SD_ABORT_ON_ENDSTOP_HIT
+ #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT)
+ //#define SD_ABORT_ON_ENDSTOP_HIT_GCODE "G28XY" // G-code to run on endstop hit (e.g., "G28XY" or "G27")
+ #endif
+
+ //#define SD_REPRINT_LAST_SELECTED_FILE // On print completion open the LCD Menu and select the same file
+
+ #define AUTO_REPORT_SD_STATUS // Auto-report media status with 'M27 S'
+
+ /**
+ * Enable this option if you have more than ~3K of unused flash space.
+ * Marlin will embed all settings in the firmware binary as compressed data.
+ * Use 'M503 C' to write the settings out to the SD Card as 'mc.zip'.
+ * See docs/ConfigEmbedding.md for details on how to use 'mc-apply.py'.
+ */
+ // #define CONFIGURATION_EMBEDDING
+
+ // Add an optimized binary file transfer mode, initiated with 'M28 B1'
+ //#define BINARY_FILE_TRANSFER
+
+ #if ENABLED(BINARY_FILE_TRANSFER)
+ // Include extra facilities (e.g., 'M20 F') supporting firmware upload via BINARY_FILE_TRANSFER
+ //#define CUSTOM_FIRMWARE_UPLOAD
+ #endif
+
+ /**
+ * Set this option to one of the following (or the board's defaults apply):
+ *
+ * LCD - Use the SD drive in the external LCD controller.
+ * ONBOARD - Use the SD drive on the control board.
+ * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file).
+ *
+ * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ]
+ */
+ //#define SDCARD_CONNECTION LCD
+
+ // Enable if SD detect is rendered useless (e.g., by using an SD extender)
+ //#define NO_SD_DETECT
+
+ /**
+ * Multiple volume support - EXPERIMENTAL.
+ * Adds 'M21 Pm' / 'M21 S' / 'M21 U' to mount SD Card / USB Drive.
+ */
+ //#define MULTI_VOLUME
+ #if ENABLED(MULTI_VOLUME)
+ #define VOLUME_SD_ONBOARD
+ #define VOLUME_USB_FLASH_DRIVE
+ #define DEFAULT_VOLUME SV_SD_ONBOARD
+ #define DEFAULT_SHARED_VOLUME SV_USB_FLASH_DRIVE
+ #endif
+
+#endif // SDSUPPORT
-#if HAS_BED_PROBE
-// Add calibration in the Probe Offsets menu to compensate for X-axis twist.
-//#define X_AXIS_TWIST_COMPENSATION
-#if ENABLED(X_AXIS_TWIST_COMPENSATION)
/**
- * Enable to init the Probe Z-Offset when starting the Wizard.
- * Use a height slightly above the estimated nozzle-to-probe Z offset.
- * For example, with an offset of -5, consider a starting height of -4.
+ * By default an onboard SD card reader may be shared as a USB mass-
+ * storage device. This option hides the SD card from the host PC.
*/
-#define XATC_START_Z 0.0
-#define XATC_MAX_POINTS 3 // Number of points to probe in the wizard
-#define XATC_Y_POSITION Y_CENTER // (mm) Y position to probe
-#define XATC_Z_OFFSETS { 0, 0, 0 } // Z offsets for X axis sample points
-#endif
-
-// Show Deploy / Stow Probe options in the Motion menu.
-#define PROBE_DEPLOY_STOW_MENU
-#endif
-
-// Include a page of printer information in the LCD Main Menu
-//#define LCD_INFO_MENU
-#if ENABLED(LCD_INFO_MENU)
-//#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages
-#endif
-
-// BACK menu items keep the highlight at the top
-//#define TURBO_BACK_MENU_ITEM
-
-// Insert a menu for preheating at the top level to allow for quick access
-//#define PREHEAT_SHORTCUT_MENU_ITEM
+//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security).
-#endif // HAS_MARLINUI_MENU
+//
+// Additional options for DGUS / DWIN displays
+//
-#if ANY(HAS_DISPLAY, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI)
-//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
-#define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state
-#endif
+// #define USE_ESP32_EXIO
-#if EITHER(HAS_DISPLAY, DWIN_LCD_PROUI)
-// The timeout to return to the status screen from sub-menus
-//#define LCD_TIMEOUT_TO_STATUS 15000 // (ms)
+#if HAS_DGUS_LCD
+ #define LCD_SERIAL_PORT 3
+ #define LCD_BAUDRATE 115200
+
+ #define DGUS_RX_BUFFER_SIZE 128
+ #define DGUS_TX_BUFFER_SIZE 48
+ //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR)
+
+ #define DGUS_UPDATE_INTERVAL_MS 1000 // (ms) Interval between automatic screen updates
+
+ #define DGUS_PRINT_FILENAME // Display the filename during printing
+ #define DGUS_PREHEAT_UI // Display a preheat screen during heatup
+ //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for FYSETC and MKS
+
+ #define DGUS_FILAMENT_LOADUNLOAD
+ #if ENABLED(DGUS_FILAMENT_LOADUNLOAD)
+ #define DGUS_FILAMENT_PURGE_LENGTH 10
+ #define DGUS_FILAMENT_LOAD_LENGTH_PER_TIME 0.5 // (mm) Adjust in proportion to DGUS_UPDATE_INTERVAL_MS
+ #endif
+
+ #define DGUS_UI_WAITING // Show a "waiting" screen between some screens
+ #if ENABLED(DGUS_UI_WAITING)
+ #define DGUS_UI_WAITING_STATUS 10
+ #define DGUS_UI_WAITING_STATUS_PERIOD 8 // Increase to slower waiting status looping
+ #endif
+#endif // HAS_DGUS_LCD
-#if ENABLED(SHOW_BOOTSCREEN)
-#define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
-#if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI)
-#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
-#endif
+//
+// ADC Button Debounce
+//
+#if HAS_ADC_BUTTONS
+ #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast
#endif
-// Scroll a longer status message into view
-//#define STATUS_MESSAGE_SCROLLING
-
-// Apply a timeout to low-priority status messages
-//#define STATUS_MESSAGE_TIMEOUT_SEC 30 // (seconds)
-
-// On the Info Screen, display XY with one decimal place when possible
-//#define LCD_DECIMAL_SMALL_XY
-
-// Add an 'M73' G-code to set the current percentage
-//#define LCD_SET_PROGRESS_MANUALLY
-
-// Show the E position (filament used) during printing
-//#define LCD_SHOW_E_TOTAL
+// @section safety
/**
- * LED Control Menu
- * Add LED Control to the LCD menu
+ * The watchdog hardware timer will do a reset and disable all outputs
+ * if the firmware gets too overloaded to read the temperature sensors.
+ *
+ * If you find that watchdog reboot causes your AVR board to hang forever,
+ * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO.
+ * NOTE: This method is less reliable as it can only catch hangups while
+ * interrupts are enabled.
*/
-//#define LED_CONTROL_MENU
-#if ENABLED(LED_CONTROL_MENU)
-#define LED_COLOR_PRESETS // Enable the Preset Color menu option
-//#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option
-#if ENABLED(LED_COLOR_PRESETS)
-#define LED_USER_PRESET_RED 255 // User defined RED value
-#define LED_USER_PRESET_GREEN 128 // User defined GREEN value
-#define LED_USER_PRESET_BLUE 0 // User defined BLUE value
-#define LED_USER_PRESET_WHITE 255 // User defined WHITE value
-#define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity
-//#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup
-#endif
-#if ENABLED(NEO2_COLOR_PRESETS)
-#define NEO2_USER_PRESET_RED 255 // User defined RED value
-#define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value
-#define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value
-#define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value
-#define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity
-//#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip
-#endif
-#endif
-
-#endif
-
-// LCD Print Progress options
-#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY)
-#if CAN_SHOW_REMAINING_TIME
-//#define SHOW_REMAINING_TIME // Display estimated time to completion
-#if ENABLED(SHOW_REMAINING_TIME)
-//#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation
-//#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time
-#endif
-#endif
-
-#if EITHER(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI)
-//#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits
+#define USE_WATCHDOG
+#if ENABLED(USE_WATCHDOG)
+ //#define WATCHDOG_RESET_MANUAL
#endif
-#if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
-//#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing
-#if ENABLED(LCD_PROGRESS_BAR)
-#define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar
-#define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message
-#define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever)
-//#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it
-//#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar
-#endif
-#endif
-#endif
+// @section lcd
-#if ENABLED(SDSUPPORT)
/**
- * SD Card SPI Speed
- * May be required to resolve "volume init" errors.
- *
- * Enable and set to SPI_HALF_SPEED, SPI_QUARTER_SPEED, or SPI_EIGHTH_SPEED
- * otherwise full speed will be applied.
+ * Babystepping enables movement of the axes by tiny increments without changing
+ * the current position values. This feature is used primarily to adjust the Z
+ * axis in the first layer of a print in real-time.
*
- * :['SPI_HALF_SPEED', 'SPI_QUARTER_SPEED', 'SPI_EIGHTH_SPEED']
+ * Warning: Does not respect endstops!
*/
-//#define SD_SPI_SPEED SPI_HALF_SPEED
-
-// The standard SD detect circuit reads LOW when media is inserted and HIGH when empty.
-// Enable this option and set to HIGH if your SD cards are incorrectly detected.
-//#define SD_DETECT_STATE HIGH
-
-//#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up
-//#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash)
-
-//#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping
-
-#define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls
-
-#define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished
-#define SD_FINISHED_RELEASECOMMAND "M84" // Use "M84XYE" to keep Z enabled so your bed stays in place
-
-// Reverse SD sort to show "more recent" files first, according to the card's FAT.
-// Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended.
-#define SDCARD_RATHERRECENTFIRST
-
-#define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing
-
-//#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM
-//#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files
-
-//#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted
-
-//#define MEDIA_MENU_AT_TOP // Force the media menu to be listed on the top of the main menu
-
-#define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27")
-
-#if ENABLED(PRINTER_EVENT_LEDS)
-#define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination
+#define BABYSTEPPING
+#if ENABLED(BABYSTEPPING)
+ //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR
+ //#define BABYSTEP_WITHOUT_HOMING
+ #define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement).
+ //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA!
+ #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way
+ //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps
+ #define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep
+ #define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep
+
+ //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
+ #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING)
+ #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
+ // Note: Extra time may be added to mitigate controller latency.
+ //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle.
+ #if ENABLED(MOVE_Z_WHEN_IDLE)
+ #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size.
+ #endif
+ #endif
+
+ //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28
+
+ #define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets
+ //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor
+ #endif
#endif
-/**
- * Continue after Power-Loss (Creality3D)
- *
- * Store the current state to the SD Card at the start of each layer
- * during SD printing. If the recovery file is found at boot time, present
- * an option on the LCD screen to continue the print from the last-known
- * point in the file.
- */
-//#define POWER_LOSS_RECOVERY
-#if ENABLED(POWER_LOSS_RECOVERY)
-#define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
-//#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss
-//#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS)
-//#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module.
-//#define POWER_LOSS_STATE HIGH // State of pin indicating power loss
-//#define POWER_LOSS_PULLUP // Set pullup / pulldown as appropriate for your sensor
-//#define POWER_LOSS_PULLDOWN
-//#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume
-//#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power.
-
-// Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card,
-// especially with "vase mode" printing. Set too high and vases cannot be continued.
-#define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data
-
-// Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled!
-//#define POWER_LOSS_RECOVER_ZHOME
-#if ENABLED(POWER_LOSS_RECOVER_ZHOME)
-//#define POWER_LOSS_ZHOME_POS { 0, 0 } // Safe XY position to home Z while avoiding objects on the bed
-#endif
-#endif
+// @section extruder
/**
- * Sort SD file listings in alphabetical order.
- *
- * With this option enabled, items on SD cards will be sorted
- * by name for easier navigation.
+ * Linear Pressure Control v1.5
*
- * By default...
+ * Assumption: advance [steps] = k * (delta velocity [steps/s])
+ * K=0 means advance disabled.
*
- * - Use the slowest -but safest- method for sorting.
- * - Folders are sorted to the top.
- * - The sort key is statically allocated.
- * - No added G-code (M34) support.
- * - 40 item sorting limit. (Items after the first 40 are unsorted.)
+ * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions!
*
- * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the
- * compiler to calculate the worst-case usage and throw an error if the SRAM
- * limit is exceeded.
+ * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak.
+ * Larger K values will be needed for flexible filament and greater distances.
+ * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk)
+ * print acceleration will be reduced during the affected moves to keep within the limit.
*
- * - SDSORT_USES_RAM provides faster sorting via a static directory buffer.
- * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer.
- * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!)
- * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!)
+ * See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
*/
-//#define SDCARD_SORT_ALPHA
-
-// SD Card Sorting options
-#if ENABLED(SDCARD_SORT_ALPHA)
-#define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each.
-#define FOLDER_SORTING -1 // -1=above 0=none 1=below
-#define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 G-code.
-#define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting.
-#define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
-#define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option.
-#define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
-#define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
-// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
+//#define LIN_ADVANCE
+#if ENABLED(LIN_ADVANCE)
+ #if ENABLED(DISTINCT_E_FACTORS)
+ #define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder
+ #else
+ #define ADVANCE_K 0.22 // (mm) Compression length applying to all extruders
+ #endif
+ //#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with M900 L.
+ //#define LA_DEBUG // Print debug information to serial during operation. Disable for production use.
+ //#define ALLOW_LOW_EJERK // Allow a DEFAULT_EJERK value of <10. Recommended for direct drive hotends.
+ //#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz.
#endif
-// Allow international symbols in long filenames. To display correctly, the
-// LCD's font must contain the characters. Check your selected LCD language.
-//#define UTF_FILENAME_SUPPORT
-
-#define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 ' and list long filenames with 'M20 L'
-#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol
-
-//#define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu
-
-//#define SD_ABORT_NO_COOLDOWN // Leave the heaters on after Stop Print (not recommended!)
+// @section leveling
/**
- * Abort SD printing when any endstop is triggered.
- * This feature is enabled with 'M540 S1' or from the LCD menu.
- * Endstops must be activated for this option to work.
- */
-//#define SD_ABORT_ON_ENDSTOP_HIT
-#if ENABLED(SD_ABORT_ON_ENDSTOP_HIT)
-//#define SD_ABORT_ON_ENDSTOP_HIT_GCODE "G28XY" // G-code to run on endstop hit (e.g., "G28XY" or "G27")
-#endif
-
-//#define SD_REPRINT_LAST_SELECTED_FILE // On print completion open the LCD Menu and select the same file
-
-//#define AUTO_REPORT_SD_STATUS // Auto-report media status with 'M27 S'
-
-/**
- * Support for USB thumb drives using an Arduino USB Host Shield or
- * equivalent MAX3421E breakout board. The USB thumb drive will appear
- * to Marlin as an SD card.
- *
- * The MAX3421E can be assigned the same pins as the SD card reader, with
- * the following pin mapping:
- *
- * SCLK, MOSI, MISO --> SCLK, MOSI, MISO
- * INT --> SD_DETECT_PIN [1]
- * SS --> SDSS
- *
- * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
- */
-//#define USB_FLASH_DRIVE_SUPPORT
-#if ENABLED(USB_FLASH_DRIVE_SUPPORT)
-/**
- * USB Host Shield Library
- *
- * - UHS2 uses no interrupts and has been production-tested
- * on a LulzBot TAZ Pro with a 32-bit Archim board.
- *
- * - UHS3 is newer code with better USB compatibility. But it
- * is less tested and is known to interfere with Servos.
- * [1] This requires USB_INTR_PIN to be interrupt-capable.
- */
-//#define USE_UHS2_USB
-//#define USE_UHS3_USB
-
-#define DISABLE_DUE_SD_MMC // Disable USB Host access to USB Drive to prevent hangs on block access for DUE platform
-
-/**
- * Native USB Host supported by some boards (USB OTG)
- */
-//#define USE_OTG_USB_HOST
-
-#if DISABLED(USE_OTG_USB_HOST)
-#define USB_CS_PIN SDSS
-#define USB_INTR_PIN SD_DETECT_PIN
-#endif
-#endif
-
-/**
- * When using a bootloader that supports SD-Firmware-Flashing,
- * add a menu item to activate SD-FW-Update on the next reboot.
- *
- * Requires ATMEGA2560 (Arduino Mega)
- *
- * Tested with this bootloader:
- * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
- */
-//#define SD_FIRMWARE_UPDATE
-#if ENABLED(SD_FIRMWARE_UPDATE)
-#define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
-#define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
-#define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
-#endif
-
-/**
- * Enable this option if you have more than ~3K of unused flash space.
- * Marlin will embed all settings in the firmware binary as compressed data.
- * Use 'M503 C' to write the settings out to the SD Card as 'mc.zip'.
- * See docs/ConfigEmbedding.md for details on how to use 'mc-apply.py'.
- */
-//#define CONFIGURATION_EMBEDDING
-
-// Add an optimized binary file transfer mode, initiated with 'M28 B1'
-//#define BINARY_FILE_TRANSFER
-
-#if ENABLED(BINARY_FILE_TRANSFER)
-// Include extra facilities (e.g., 'M20 F') supporting firmware upload via BINARY_FILE_TRANSFER
-//#define CUSTOM_FIRMWARE_UPLOAD
-#endif
-
-/**
- * Set this option to one of the following (or the board's defaults apply):
- *
- * LCD - Use the SD drive in the external LCD controller.
- * ONBOARD - Use the SD drive on the control board.
- * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file).
- *
- * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ]
- */
-//#define SDCARD_CONNECTION LCD
-
-// Enable if SD detect is rendered useless (e.g., by using an SD extender)
-//#define NO_SD_DETECT
-
-/**
- * Multiple volume support - EXPERIMENTAL.
- * Adds 'M21 Pm' / 'M21 S' / 'M21 U' to mount SD Card / USB Drive.
- */
-//#define MULTI_VOLUME
-#if ENABLED(MULTI_VOLUME)
-#define VOLUME_SD_ONBOARD
-#define VOLUME_USB_FLASH_DRIVE
-#define DEFAULT_VOLUME SV_SD_ONBOARD
-#define DEFAULT_SHARED_VOLUME SV_USB_FLASH_DRIVE
-#endif
-
-#endif // SDSUPPORT
-
-/**
- * By default an onboard SD card reader may be shared as a USB mass-
- * storage device. This option hides the SD card from the host PC.
- */
-//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security).
-
-/**
- * Additional options for Graphical Displays
- *
- * Use the optimizations here to improve printing performance,
- * which can be adversely affected by graphical display drawing,
- * especially when doing several short moves, and when printing
- * on DELTA and SCARA machines.
- *
- * Some of these options may result in the display lagging behind
- * controller events, as there is a trade-off between reliable
- * printing performance versus fast display updates.
- */
-#if HAS_MARLINUI_U8GLIB
-// Save many cycles by drawing a hollow frame or no frame on the Info Screen
-//#define XYZ_NO_FRAME
-#define XYZ_HOLLOW_FRAME
-
-// A bigger font is available for edit items. Costs 3120 bytes of flash.
-// Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese.
-//#define USE_BIG_EDIT_FONT
-
-// A smaller font may be used on the Info Screen. Costs 2434 bytes of flash.
-// Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese.
-//#define USE_SMALL_INFOFONT
-
-/**
- * Graphical Display Sleep
- *
- * The U8G library provides sleep / wake functions for SH1106, SSD1306,
- * SSD1309, and some other DOGM displays.
- * Enable this option to save energy and prevent OLED pixel burn-in.
- * Adds the menu item Configuration > LCD Timeout (m) to set a wait period
- * from 0 (disabled) to 99 minutes.
- */
-//#define DISPLAY_SLEEP_MINUTES 2 // (minutes) Timeout before turning off the screen
-
-/**
- * ST7920-based LCDs can emulate a 16 x 4 character display using
- * the ST7920 character-generator for very fast screen updates.
- * Enable LIGHTWEIGHT_UI to use this special display mode.
- *
- * Since LIGHTWEIGHT_UI has limited space, the position and status
- * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the
- * length of time to display the status message before clearing.
- *
- * Set STATUS_EXPIRE_SECONDS to zero to never clear the status.
- * This will prevent position updates from being displayed.
- */
-#if IS_U8GLIB_ST7920
-// Enable this option and reduce the value to optimize screen updates.
-// The normal delay is 10µs. Use the lowest value that still gives a reliable display.
-//#define DOGM_SPI_DELAY_US 5
-
-//#define LIGHTWEIGHT_UI
-#if ENABLED(LIGHTWEIGHT_UI)
-#define STATUS_EXPIRE_SECONDS 20
-#endif
-#endif
-
-/**
- * Status (Info) Screen customizations
- * These options may affect code size and screen render time.
- * Custom status screens can forcibly override these settings.
- */
-//#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones
-//#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends)
-#define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM for numbered hotends)
-#define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating
-#define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating
-#define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating
-//#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active
-//#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling
-//#define STATUS_FLOWMETER_ANIM // Use multiple bitmaps to indicate coolant flow
-//#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap
-//#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap
-//#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames
-//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
-//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
-
-// Frivolous Game Options
-//#define MARLIN_BRICKOUT
-//#define MARLIN_INVADERS
-//#define MARLIN_SNAKE
-//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
-
-#endif // HAS_MARLINUI_U8GLIB
-
-#if HAS_MARLINUI_U8GLIB || IS_DWIN_MARLINUI
-// Show SD percentage next to the progress bar
-//#define SHOW_SD_PERCENT
-
-// Enable to save many cycles by drawing a hollow frame on Menu Screens
-#define MENU_HOLLOW_FRAME
-
-// Swap the CW/CCW indicators in the graphics overlay
-//#define OVERLAY_GFX_REVERSE
-#endif
-
-//
-// Additional options for DGUS / DWIN displays
-//
-#if HAS_DGUS_LCD
-#define LCD_BAUDRATE 115200
-
-#define DGUS_RX_BUFFER_SIZE 128
-#define DGUS_TX_BUFFER_SIZE 48
-//#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR)
-
-#define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates
-
-#if ANY(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS, DGUS_LCD_UI_HIPRECY)
-#define DGUS_PRINT_FILENAME // Display the filename during printing
-#define DGUS_PREHEAT_UI // Display a preheat screen during heatup
-
-#if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS)
-//#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for FYSETC and MKS
-#else
-#define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY
-#endif
-
-#define DGUS_FILAMENT_LOADUNLOAD
-#if ENABLED(DGUS_FILAMENT_LOADUNLOAD)
-#define DGUS_FILAMENT_PURGE_LENGTH 10
-#define DGUS_FILAMENT_LOAD_LENGTH_PER_TIME 0.5 // (mm) Adjust in proportion to DGUS_UPDATE_INTERVAL_MS
-#endif
-
-#define DGUS_UI_WAITING // Show a "waiting" screen between some screens
-#if ENABLED(DGUS_UI_WAITING)
-#define DGUS_UI_WAITING_STATUS 10
-#define DGUS_UI_WAITING_STATUS_PERIOD 8 // Increase to slower waiting status looping
-#endif
-#endif
-#endif // HAS_DGUS_LCD
-
-//
-// Additional options for AnyCubic Chiron TFT displays
-//
-#if ENABLED(ANYCUBIC_LCD_CHIRON)
-// By default the type of panel is automatically detected.
-// Enable one of these options if you know the panel type.
-//#define CHIRON_TFT_STANDARD
-//#define CHIRON_TFT_NEW
-
-// Enable the longer Anycubic powerup startup tune
-//#define AC_DEFAULT_STARTUP_TUNE
-
-/**
- * Display Folders
- * By default the file browser lists all G-code files (including those in subfolders) in a flat list.
- * Enable this option to display a hierarchical file browser.
- *
- * NOTES:
- * - Without this option it helps to enable SDCARD_SORT_ALPHA so files are sorted before/after folders.
- * - When used with the "new" panel, folder names will also have '.gcode' appended to their names.
- * This hack is currently required to force the panel to show folders.
- */
-#define AC_SD_FOLDER_VIEW
-#endif
-
-//
-// Specify additional languages for the UI. Default specified by LCD_LANGUAGE.
-//
-#if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI)
-//#define LCD_LANGUAGE_2 fr
-//#define LCD_LANGUAGE_3 de
-//#define LCD_LANGUAGE_4 es
-//#define LCD_LANGUAGE_5 it
-#ifdef LCD_LANGUAGE_2
-//#define LCD_LANGUAGE_AUTO_SAVE // Automatically save language to EEPROM on change
-#endif
-#endif
-
-//
-// Touch UI for the FTDI Embedded Video Engine (EVE)
-//
-#if ENABLED(TOUCH_UI_FTDI_EVE)
-// Display board used
-//#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240)
-//#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272)
-//#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272)
-//#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480)
-//#define LCD_LULZBOT_CLCD_UI // LulzBot Color LCD UI
-//#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480)
-//#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815
-//#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813
-
-// Correct the resolution if not using the stock TFT panel.
-//#define TOUCH_UI_320x240
-//#define TOUCH_UI_480x272
-//#define TOUCH_UI_800x480
-
-// Mappings for boards with a standard RepRapDiscount Display connector
-//#define AO_EXP1_PINMAP // LulzBot CLCD UI EXP1 mapping
-//#define AO_EXP2_PINMAP // LulzBot CLCD UI EXP2 mapping
-//#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping
-//#define S6_TFT_PINMAP // FYSETC S6 pin mapping
-//#define F6_TFT_PINMAP // FYSETC F6 pin mapping
-
-//#define OTHER_PIN_LAYOUT // Define pins manually below
-#if ENABLED(OTHER_PIN_LAYOUT)
-// Pins for CS and MOD_RESET (PD) must be chosen
-#define CLCD_MOD_RESET 9
-#define CLCD_SPI_CS 10
-
-// If using software SPI, specify pins for SCLK, MOSI, MISO
-//#define CLCD_USE_SOFT_SPI
-#if ENABLED(CLCD_USE_SOFT_SPI)
-#define CLCD_SOFT_SPI_MOSI 11
-#define CLCD_SOFT_SPI_MISO 12
-#define CLCD_SOFT_SPI_SCLK 13
-#endif
-#endif
-
-// Display Orientation. An inverted (i.e. upside-down) display
-// is supported on the FT800. The FT810 and beyond also support
-// portrait and mirrored orientations.
-//#define TOUCH_UI_INVERTED
-//#define TOUCH_UI_PORTRAIT
-//#define TOUCH_UI_MIRRORED
-
-// UTF8 processing and rendering.
-// Unsupported characters are shown as '?'.
-//#define TOUCH_UI_USE_UTF8
-#if ENABLED(TOUCH_UI_USE_UTF8)
-// Western accents support. These accented characters use
-// combined bitmaps and require relatively little storage.
-#define TOUCH_UI_UTF8_WESTERN_CHARSET
-#if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET)
-// Additional character groups. These characters require
-// full bitmaps and take up considerable storage:
-//#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³
-//#define TOUCH_UI_UTF8_COPYRIGHT // © ®
-//#define TOUCH_UI_UTF8_GERMANIC // ß
-//#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ
-//#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡
-//#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥
-//#define TOUCH_UI_UTF8_ORDINALS // º ª
-//#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷
-//#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾
-//#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬
-#endif
-
-// Cyrillic character set, costs about 27KiB of flash
-//#define TOUCH_UI_UTF8_CYRILLIC_CHARSET
-#endif
-
-// Use a smaller font when labels don't fit buttons
-#define TOUCH_UI_FIT_TEXT
-
-// Use a numeric passcode for "Screen lock" keypad.
-// (recommended for smaller displays)
-//#define TOUCH_UI_PASSCODE
-
-// Output extra debug info for Touch UI events
-//#define TOUCH_UI_DEBUG
-
-// Developer menu (accessed by touching "About Printer" copyright text)
-//#define TOUCH_UI_DEVELOPER_MENU
-#endif
-
-//
-// Classic UI Options
-//
-#if TFT_SCALED_DOGLCD
-//#define TFT_MARLINUI_COLOR 0xFFFF // White
-//#define TFT_MARLINBG_COLOR 0x0000 // Black
-//#define TFT_DISABLED_COLOR 0x0003 // Almost black
-//#define TFT_BTCANCEL_COLOR 0xF800 // Red
-//#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow
-//#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan
-#endif
-
-//
-// ADC Button Debounce
-//
-#if HAS_ADC_BUTTONS
-#define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast
-#endif
-
-// @section safety
-
-/**
- * The watchdog hardware timer will do a reset and disable all outputs
- * if the firmware gets too overloaded to read the temperature sensors.
- *
- * If you find that watchdog reboot causes your AVR board to hang forever,
- * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO.
- * NOTE: This method is less reliable as it can only catch hangups while
- * interrupts are enabled.
- */
-#define USE_WATCHDOG
-#if ENABLED(USE_WATCHDOG)
-//#define WATCHDOG_RESET_MANUAL
-#endif
-
-// @section lcd
-
-/**
- * Babystepping enables movement of the axes by tiny increments without changing
- * the current position values. This feature is used primarily to adjust the Z
- * axis in the first layer of a print in real-time.
- *
- * Warning: Does not respect endstops!
- */
-//#define BABYSTEPPING
-#if ENABLED(BABYSTEPPING)
-//#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR
-//#define BABYSTEP_WITHOUT_HOMING
-//#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement).
-//#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA!
-#define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way
-//#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps
-#define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep
-#define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep
-
-//#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
-#if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING)
-#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
-// Note: Extra time may be added to mitigate controller latency.
-//#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle.
-#if ENABLED(MOVE_Z_WHEN_IDLE)
-#define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size.
-#endif
-#endif
-
-//#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28
-
-//#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping
-#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
-//#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets
-//#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor
-#endif
-#endif
-
-// @section extruder
-
-/**
- * Linear Pressure Control v1.5
- *
- * Assumption: advance [steps] = k * (delta velocity [steps/s])
- * K=0 means advance disabled.
- *
- * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions!
- *
- * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak.
- * Larger K values will be needed for flexible filament and greater distances.
- * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk)
- * print acceleration will be reduced during the affected moves to keep within the limit.
- *
- * See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
- */
-//#define LIN_ADVANCE
-#if ENABLED(LIN_ADVANCE)
-//#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants
-#define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed
-//#define LA_DEBUG // If enabled, this will generate debug information output over USB.
-//#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration
-//#define ALLOW_LOW_EJERK // Allow a DEFAULT_EJERK value of <10. Recommended for direct drive hotends.
-#endif
-
-// @section leveling
-
-/**
- * Use Safe Bed Leveling coordinates to move axes to a useful position before bed probing.
- * For example, after homing a rotational axis the Z probe might not be perpendicular to the bed.
- * Choose values the orient the bed horizontally and the Z-probe vertically.
+ * Use Safe Bed Leveling coordinates to move axes to a useful position before bed probing.
+ * For example, after homing a rotational axis the Z probe might not be perpendicular to the bed.
+ * Choose values the orient the bed horizontally and the Z-probe vertically.
*/
//#define SAFE_BED_LEVELING_START_X 0.0
//#define SAFE_BED_LEVELING_START_Y 0.0
@@ -2087,12 +1430,12 @@
* Override if the automatically selected points are inadequate.
*/
#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL)
-//#define PROBE_PT_1_X 15
-//#define PROBE_PT_1_Y 180
-//#define PROBE_PT_2_X 15
-//#define PROBE_PT_2_Y 20
-//#define PROBE_PT_3_X 170
-//#define PROBE_PT_3_Y 20
+ //#define PROBE_PT_1_X 15
+ //#define PROBE_PT_1_Y 180
+ //#define PROBE_PT_2_X 15
+ //#define PROBE_PT_2_Y 20
+ //#define PROBE_PT_3_X 170
+ //#define PROBE_PT_3_Y 20
#endif
/**
@@ -2115,22 +1458,22 @@
* the probe to be unable to reach any points.
*/
#if PROBE_SELECTED && !IS_KINEMATIC
-//#define PROBING_MARGIN_LEFT PROBING_MARGIN
-//#define PROBING_MARGIN_RIGHT PROBING_MARGIN
-//#define PROBING_MARGIN_FRONT PROBING_MARGIN
-//#define PROBING_MARGIN_BACK PROBING_MARGIN
+ //#define PROBING_MARGIN_LEFT PROBING_MARGIN
+ //#define PROBING_MARGIN_RIGHT PROBING_MARGIN
+ //#define PROBING_MARGIN_FRONT PROBING_MARGIN
+ //#define PROBING_MARGIN_BACK PROBING_MARGIN
#endif
#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)
-// Override the mesh area if the automatic (max) area is too large
-//#define MESH_MIN_X MESH_INSET
-//#define MESH_MIN_Y MESH_INSET
-//#define MESH_MAX_X X_BED_SIZE - (MESH_INSET)
-//#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET)
+ // Override the mesh area if the automatic (max) area is too large
+ //#define MESH_MIN_X MESH_INSET
+ //#define MESH_MIN_Y MESH_INSET
+ //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET)
+ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET)
#endif
#if BOTH(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS)
-//#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space
+ //#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space
#endif
/**
@@ -2139,15 +1482,15 @@
*/
//#define G29_RETRY_AND_RECOVER
#if ENABLED(G29_RETRY_AND_RECOVER)
-#define G29_MAX_RETRIES 3
-#define G29_HALT_ON_FAILURE
-/**
- * Specify the GCODE commands that will be executed when leveling succeeds,
- * between attempts, and after the maximum number of retries have been tried.
- */
-#define G29_SUCCESS_COMMANDS "M117 Bed leveling done."
-#define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0"
-#define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1"
+ #define G29_MAX_RETRIES 3
+ #define G29_HALT_ON_FAILURE
+ /**
+ * Specify the GCODE commands that will be executed when leveling succeeds,
+ * between attempts, and after the maximum number of retries have been tried.
+ */
+ #define G29_SUCCESS_COMMANDS "M117 Bed leveling done."
+ #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0"
+ #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1"
#endif
@@ -2166,55 +1509,55 @@
//#define PTC_HOTEND // Compensate based on hotend temperature
#if ANY(PTC_PROBE, PTC_BED, PTC_HOTEND)
-/**
- * If the probe is outside the defined range, use linear extrapolation with the closest
- * point and the point with index PTC_LINEAR_EXTRAPOLATION. e.g., If set to 4 it will use the
- * linear extrapolation between data[0] and data[4] for values below PTC_PROBE_START.
- */
-//#define PTC_LINEAR_EXTRAPOLATION 4
-
-#if ENABLED(PTC_PROBE)
-// Probe temperature calibration generates a table of values starting at PTC_PROBE_START
-// (e.g., 30), in steps of PTC_PROBE_RES (e.g., 5) with PTC_PROBE_COUNT (e.g., 10) samples.
-#define PTC_PROBE_START 30 // (°C)
-#define PTC_PROBE_RES 5 // (°C)
-#define PTC_PROBE_COUNT 10
-#define PTC_PROBE_ZOFFS { 0 } // (µm) Z adjustments per sample
-#endif
-
-#if ENABLED(PTC_BED)
-// Bed temperature calibration builds a similar table.
-#define PTC_BED_START 60 // (°C)
-#define PTC_BED_RES 5 // (°C)
-#define PTC_BED_COUNT 10
-#define PTC_BED_ZOFFS { 0 } // (µm) Z adjustments per sample
-#endif
-
-#if ENABLED(PTC_HOTEND)
-// Note: There is no automatic calibration for the hotend. Use M871.
-#define PTC_HOTEND_START 180 // (°C)
-#define PTC_HOTEND_RES 5 // (°C)
-#define PTC_HOTEND_COUNT 20
-#define PTC_HOTEND_ZOFFS { 0 } // (µm) Z adjustments per sample
-#endif
-
-// G76 options
-#if BOTH(PTC_PROBE, PTC_BED)
-// Park position to wait for probe cooldown
-#define PTC_PARK_POS { 0, 0, 100 }
-
-// Probe position to probe and wait for probe to reach target temperature
-//#define PTC_PROBE_POS { 12.0f, 7.3f } // Example: MK52 magnetic heatbed
-#define PTC_PROBE_POS { 90, 100 }
-
-// The temperature the probe should be at while taking measurements during
-// bed temperature calibration.
-#define PTC_PROBE_TEMP 30 // (°C)
-
-// Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster.
-// Note: The Z=0.0 offset is determined by the probe Z offset (e.g., as set with M851 Z).
-#define PTC_PROBE_HEATING_OFFSET 0.5
-#endif
+ /**
+ * If the probe is outside the defined range, use linear extrapolation with the closest
+ * point and the point with index PTC_LINEAR_EXTRAPOLATION. e.g., If set to 4 it will use the
+ * linear extrapolation between data[0] and data[4] for values below PTC_PROBE_START.
+ */
+ //#define PTC_LINEAR_EXTRAPOLATION 4
+
+ #if ENABLED(PTC_PROBE)
+ // Probe temperature calibration generates a table of values starting at PTC_PROBE_START
+ // (e.g., 30), in steps of PTC_PROBE_RES (e.g., 5) with PTC_PROBE_COUNT (e.g., 10) samples.
+ #define PTC_PROBE_START 30 // (°C)
+ #define PTC_PROBE_RES 5 // (°C)
+ #define PTC_PROBE_COUNT 10
+ #define PTC_PROBE_ZOFFS { 0 } // (µm) Z adjustments per sample
+ #endif
+
+ #if ENABLED(PTC_BED)
+ // Bed temperature calibration builds a similar table.
+ #define PTC_BED_START 60 // (°C)
+ #define PTC_BED_RES 5 // (°C)
+ #define PTC_BED_COUNT 10
+ #define PTC_BED_ZOFFS { 0 } // (µm) Z adjustments per sample
+ #endif
+
+ #if ENABLED(PTC_HOTEND)
+ // Note: There is no automatic calibration for the hotend. Use M871.
+ #define PTC_HOTEND_START 180 // (°C)
+ #define PTC_HOTEND_RES 5 // (°C)
+ #define PTC_HOTEND_COUNT 20
+ #define PTC_HOTEND_ZOFFS { 0 } // (µm) Z adjustments per sample
+ #endif
+
+ // G76 options
+ #if BOTH(PTC_PROBE, PTC_BED)
+ // Park position to wait for probe cooldown
+ #define PTC_PARK_POS { 0, 0, 100 }
+
+ // Probe position to probe and wait for probe to reach target temperature
+ //#define PTC_PROBE_POS { 12.0f, 7.3f } // Example: MK52 magnetic heatbed
+ #define PTC_PROBE_POS { 90, 100 }
+
+ // The temperature the probe should be at while taking measurements during
+ // bed temperature calibration.
+ #define PTC_PROBE_TEMP 30 // (°C)
+
+ // Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster.
+ // Note: The Z=0.0 offset is determined by the probe Z offset (e.g., as set with M851 Z).
+ #define PTC_PROBE_HEATING_OFFSET 0.5
+ #endif
#endif // PTC_PROBE || PTC_BED || PTC_HOTEND
// @section extras
@@ -2229,20 +1572,20 @@
//
#define ARC_SUPPORT // Requires ~3226 bytes
#if ENABLED(ARC_SUPPORT)
-#define MIN_ARC_SEGMENT_MM 0.1 // (mm) Minimum length of each arc segment
-#define MAX_ARC_SEGMENT_MM 1.0 // (mm) Maximum length of each arc segment
-#define MIN_CIRCLE_SEGMENTS 72 // Minimum number of segments in a complete circle
-//#define ARC_SEGMENTS_PER_SEC 50 // Use the feedrate to choose the segment length
-#define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections
-//#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles
-//#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure
+ #define MIN_ARC_SEGMENT_MM 0.1 // (mm) Minimum length of each arc segment
+ #define MAX_ARC_SEGMENT_MM 1.0 // (mm) Maximum length of each arc segment
+ #define MIN_CIRCLE_SEGMENTS 72 // Minimum number of segments in a complete circle
+ //#define ARC_SEGMENTS_PER_SEC 50 // Use the feedrate to choose the segment length
+ #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections
+ //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles
+ //#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure
#endif
// G5 Bézier Curve Support with XYZE destination and IJPQ offsets
-//#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes
+#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes
#if EITHER(ARC_SUPPORT, BEZIER_CURVE_SUPPORT)
-//#define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes
+ #define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes
#endif
/**
@@ -2264,8 +1607,8 @@
*/
//#define G38_PROBE_TARGET
#if ENABLED(G38_PROBE_TARGET)
-//#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target
-#define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move.
+ //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target
+ #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move.
#endif
// Moves (or segments) with fewer steps than this will be joined with the next move
@@ -2328,11 +1671,11 @@
// The number of linear moves that can be in the planner at once.
// The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g., 8, 16, 32)
#if BOTH(SDSUPPORT, DIRECT_STEPPING)
-#define BLOCK_BUFFER_SIZE 8
+ #define BLOCK_BUFFER_SIZE 8
#elif ENABLED(SDSUPPORT)
-#define BLOCK_BUFFER_SIZE 16
+ #define BLOCK_BUFFER_SIZE 16
#else
-#define BLOCK_BUFFER_SIZE 16
+ #define BLOCK_BUFFER_SIZE 16
#endif
// @section serial
@@ -2354,1030 +1697,157 @@
// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
// To use flow control, set this buffer size to at least 1024 bytes.
// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
-#define RX_BUFFER_SIZE 1024
+//#define RX_BUFFER_SIZE 1024
#if RX_BUFFER_SIZE >= 1024
-// Enable to have the controller send XON/XOFF control characters to
-// the host to signal the RX buffer is becoming full.
-//#define SERIAL_XON_XOFF
+ // Enable to have the controller send XON/XOFF control characters to
+ // the host to signal the RX buffer is becoming full.
+ //#define SERIAL_XON_XOFF
#endif
#if ENABLED(SDSUPPORT)
-// Enable this option to collect and display the maximum
-// RX queue usage after transferring a file to SD.
-//#define SERIAL_STATS_MAX_RX_QUEUED
+ // Enable this option to collect and display the maximum
+ // RX queue usage after transferring a file to SD.
+ //#define SERIAL_STATS_MAX_RX_QUEUED
-// Enable this option to collect and display the number
-// of dropped bytes after a file transfer to SD.
-//#define SERIAL_STATS_DROPPED_RX
+ // Enable this option to collect and display the number
+ // of dropped bytes after a file transfer to SD.
+ //#define SERIAL_STATS_DROPPED_RX
#endif
// Monitor RX buffer usage
// Dump an error to the serial port if the serial receive buffer overflows.
// If you see these errors, increase the RX_BUFFER_SIZE value.
// Not supported on all platforms.
-//#define RX_BUFFER_MONITOR
-
-/**
- * Emergency Command Parser
- *
- * Add a low-level parser to intercept certain commands as they
- * enter the serial receive buffer, so they cannot be blocked.
- * Currently handles M108, M112, M410, M876
- * NOTE: Not yet implemented for all platforms.
- */
-//#define EMERGENCY_PARSER
-
-/**
- * Realtime Reporting (requires EMERGENCY_PARSER)
- *
- * - Report position and state of the machine (like Grbl).
- * - Auto-report position during long moves.
- * - Useful for CNC/LASER.
- *
- * Adds support for commands:
- * S000 : Report State and Position while moving.
- * P000 : Instant Pause / Hold while moving.
- * R000 : Resume from Pause / Hold.
- *
- * - During Hold all Emergency Parser commands are available, as usual.
- * - Enable NANODLP_Z_SYNC and NANODLP_ALL_AXIS for move command end-state reports.
- */
-//#define REALTIME_REPORTING_COMMANDS
-#if ENABLED(REALTIME_REPORTING_COMMANDS)
-//#define FULL_REPORT_TO_HOST_FEATURE // Auto-report the machine status like Grbl CNC
-#endif
-
-// Bad Serial-connections can miss a received command by sending an 'ok'
-// Therefore some clients abort after 30 seconds in a timeout.
-// Some other clients start sending commands while receiving a 'wait'.
-// This "wait" is only sent when the buffer is empty. 1 second is a good value here.
-//#define NO_TIMEOUTS 1000 // Milliseconds
-
-// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary.
-//#define ADVANCED_OK
-
-// Printrun may have trouble receiving long strings all at once.
-// This option inserts short delays between lines of serial output.
-#define SERIAL_OVERRUN_PROTECTION
-
-// For serial echo, the number of digits after the decimal point
-//#define SERIAL_FLOAT_PRECISION 4
-
-/**
- * Set the number of proportional font spaces required to fill up a typical character space.
- * This can help to better align the output of commands like `G29 O` Mesh Output.
- *
- * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0.
- * Otherwise, adjust according to your client and font.
- */
-#define PROPORTIONAL_FONT_RATIO 1.0
-
-// @section extras
-
-/**
- * Extra Fan Speed
- * Adds a secondary fan speed for each print-cooling fan.
- * 'M106 P T3-255' : Set a secondary speed for
- * 'M106 P T2' : Use the set secondary speed
- * 'M106 P T1' : Restore the previous fan speed
- */
-//#define EXTRA_FAN_SPEED
-
-/**
- * Firmware-based and LCD-controlled retract
- *
- * Add G10 / G11 commands for automatic firmware-based retract / recover.
- * Use M207 and M208 to define parameters for retract / recover.
- *
- * Use M209 to enable or disable auto-retract.
- * With auto-retract enabled, all G1 E moves within the set range
- * will be converted to firmware-based retract/recover moves.
- *
- * Be sure to turn off auto-retract during filament change.
- *
- * Note that M207 / M208 / M209 settings are saved to EEPROM.
- */
-//#define FWRETRACT
-#if ENABLED(FWRETRACT)
-#define FWRETRACT_AUTORETRACT // Override slicer retractions
-#if ENABLED(FWRETRACT_AUTORETRACT)
-#define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length
-#define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length
-#endif
-#define RETRACT_LENGTH 3 // (mm) Default retract length (positive value)
-#define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value)
-#define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting
-#define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise
-#define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover)
-#define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange)
-#define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction
-#define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction
-#if ENABLED(MIXING_EXTRUDER)
-//#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously
-#endif
-#endif
-
-/**
- * Universal tool change settings.
- * Applies to all types of extruders except where explicitly noted.
- */
-#if HAS_MULTI_EXTRUDER
-// Z raise distance for tool-change, as needed for some extruders
-#define TOOLCHANGE_ZRAISE 2 // (mm)
-//#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled)
-//#define TOOLCHANGE_NO_RETURN // Never return to previous position on tool-change
-#if ENABLED(TOOLCHANGE_NO_RETURN)
-//#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change
-#endif
-
-/**
- * Extra G-code to run while executing tool-change commands. Can be used to use an additional
- * stepper motor (e.g., I axis in Configuration.h) to drive the tool-changer.
- */
-//#define EVENT_GCODE_TOOLCHANGE_T0 "G28 A\nG1 A0" // Extra G-code to run while executing tool-change command T0
-//#define EVENT_GCODE_TOOLCHANGE_T1 "G1 A10" // Extra G-code to run while executing tool-change command T1
-//#define EVENT_GCODE_TOOLCHANGE_ALWAYS_RUN // Always execute above G-code sequences. Use with caution!
-
-/**
- * Tool Sensors detect when tools have been picked up or dropped.
- * Requires the pins TOOL_SENSOR1_PIN, TOOL_SENSOR2_PIN, etc.
- */
-//#define TOOL_SENSOR
-
-/**
- * Retract and prime filament on tool-change to reduce
- * ooze and stringing and to get cleaner transitions.
- */
-//#define TOOLCHANGE_FILAMENT_SWAP
-#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
-// Load / Unload
-#define TOOLCHANGE_FS_LENGTH 12 // (mm) Load / Unload length
-#define TOOLCHANGE_FS_EXTRA_RESUME_LENGTH 0 // (mm) Extra length for better restart. Adjust with LCD or M217 B.
-#define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/min) (Unloading)
-#define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/min) (On SINGLENOZZLE or Bowden loading must be slowed down)
-
-// Longer prime to clean out a SINGLENOZZLE
-#define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length
-#define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/min) Extra priming feedrate
-#define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm) Retract before cooling for less stringing, better wipe, etc.
-
-// Cool after prime to reduce stringing
-#define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip
-#define TOOLCHANGE_FS_FAN_SPEED 255 // 0-255
-#define TOOLCHANGE_FS_FAN_TIME 10 // (seconds)
-
-// Use TOOLCHANGE_FS_PRIME_SPEED feedrate the first time each extruder is primed
-//#define TOOLCHANGE_FS_SLOW_FIRST_PRIME
-
-/**
- * Prime T0 the first time T0 is sent to the printer:
- * [ Power-On -> T0 { Activate & Prime T0 } -> T1 { Retract T0, Activate & Prime T1 } ]
- * If disabled, no priming on T0 until switching back to T0 from another extruder:
- * [ Power-On -> T0 { T0 Activated } -> T1 { Activate & Prime T1 } -> T0 { Retract T1, Activate & Prime T0 } ]
- * Enable with M217 V1 before printing to avoid unwanted priming on host connect.
- */
-//#define TOOLCHANGE_FS_PRIME_FIRST_USED
-
-/**
- * Tool Change Migration
- * This feature provides G-code and LCD options to switch tools mid-print.
- * All applicable tool properties are migrated so the print can continue.
- * Tools must be closely matching and other restrictions may apply.
- * Useful to:
- * - Change filament color without interruption
- * - Switch spools automatically on filament runout
- * - Switch to a different nozzle on an extruder jam
- */
-#define TOOLCHANGE_MIGRATION_FEATURE
-
-#endif
-
-/**
- * Position to park head during tool change.
- * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER
- */
-//#define TOOLCHANGE_PARK
-#if ENABLED(TOOLCHANGE_PARK)
-#define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 }
-#define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min)
-//#define TOOLCHANGE_PARK_X_ONLY // X axis only move
-//#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move
-#endif
-#endif // HAS_MULTI_EXTRUDER
-
-// @section advanced pause
-
-/**
- * Advanced Pause for Filament Change
- * - Adds the G-code M600 Filament Change to initiate a filament change.
- * - This feature is required for the default FILAMENT_RUNOUT_SCRIPT.
- *
- * Requirements:
- * - For Filament Change parking enable and configure NOZZLE_PARK_FEATURE.
- * - For user interaction enable an LCD display, HOST_PROMPT_SUPPORT, or EMERGENCY_PARSER.
- *
- * Enable PARK_HEAD_ON_PAUSE to add the G-code M125 Pause and Park.
- */
-//#define ADVANCED_PAUSE_FEATURE
-#if ENABLED(ADVANCED_PAUSE_FEATURE)
-#define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate.
-#define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract.
-// This short retract is done immediately, before parking the nozzle.
-#define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast.
-#define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate.
-#define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload.
-// For Bowden, the full length of the tube and nozzle.
-// For direct drive, the full length of the nozzle.
-// Set to 0 for manual unloading.
-#define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load.
-#define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material.
-// 0 to disable start loading and skip to fast load only
-#define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast.
-#define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate.
-#define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle.
-// For Bowden, the full length of the tube and nozzle.
-// For direct drive, the full length of the nozzle.
-//#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted.
-#define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate.
-#define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading.
-// Set to 0 for manual extrusion.
-// Filament can be extruded repeatedly from the Filament Change menu
-// until extrusion is consistent, and to purge old filament.
-#define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park.
-//#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused.
-
-// Filament Unload does a Retract, Delay, and Purge first:
-#define FILAMENT_UNLOAD_PURGE_RETRACT 13 // (mm) Unload initial retract length.
-#define FILAMENT_UNLOAD_PURGE_DELAY 5000 // (ms) Delay for the filament to cool after retract.
-#define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged.
-#define FILAMENT_UNLOAD_PURGE_FEEDRATE 25 // (mm/s) feedrate to purge before unload
-
-#define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety.
-#define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed.
-#define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change.
-//#define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is triggered again.
-//#define PAUSE_REHEAT_FAST_RESUME // Reduce number of waits by not prompting again post-timeout before continuing.
-
-//#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change.
-//#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change
-
-//#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu.
-//#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302)
-#endif
-
-/**
- * TMC26X Stepper Driver options
- *
- * The TMC26XStepper library is required for this stepper driver.
- * https://github.com/trinamic/TMC26XStepper
- * @section tmc/tmc26x
- */
-#if HAS_DRIVER(TMC26X)
-
-#if AXIS_DRIVER_TYPE_X(TMC26X)
-#define X_MAX_CURRENT 1000 // (mA)
-#define X_SENSE_RESISTOR 91 // (mOhms)
-#define X_MICROSTEPS 16 // Number of microsteps
-#endif
-
-#if AXIS_DRIVER_TYPE_X2(TMC26X)
-#define X2_MAX_CURRENT 1000
-#define X2_SENSE_RESISTOR 91
-#define X2_MICROSTEPS X_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_Y(TMC26X)
-#define Y_MAX_CURRENT 1000
-#define Y_SENSE_RESISTOR 91
-#define Y_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_Y2(TMC26X)
-#define Y2_MAX_CURRENT 1000
-#define Y2_SENSE_RESISTOR 91
-#define Y2_MICROSTEPS Y_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_Z(TMC26X)
-#define Z_MAX_CURRENT 1000
-#define Z_SENSE_RESISTOR 91
-#define Z_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_Z2(TMC26X)
-#define Z2_MAX_CURRENT 1000
-#define Z2_SENSE_RESISTOR 91
-#define Z2_MICROSTEPS Z_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_Z3(TMC26X)
-#define Z3_MAX_CURRENT 1000
-#define Z3_SENSE_RESISTOR 91
-#define Z3_MICROSTEPS Z_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_Z4(TMC26X)
-#define Z4_MAX_CURRENT 1000
-#define Z4_SENSE_RESISTOR 91
-#define Z4_MICROSTEPS Z_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_I(TMC26X)
-#define I_MAX_CURRENT 1000
-#define I_SENSE_RESISTOR 91
-#define I_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_J(TMC26X)
-#define J_MAX_CURRENT 1000
-#define J_SENSE_RESISTOR 91
-#define J_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_K(TMC26X)
-#define K_MAX_CURRENT 1000
-#define K_SENSE_RESISTOR 91
-#define K_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_U(TMC26X)
-#define U_MAX_CURRENT 1000
-#define U_SENSE_RESISTOR 91
-#define U_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_V(TMC26X)
-#define V_MAX_CURRENT 1000
-#define V_SENSE_RESISTOR 91
-#define V_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_W(TMC26X)
-#define W_MAX_CURRENT 1000
-#define W_SENSE_RESISTOR 91
-#define W_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_E0(TMC26X)
-#define E0_MAX_CURRENT 1000
-#define E0_SENSE_RESISTOR 91
-#define E0_MICROSTEPS 16
-#endif
-
-#if AXIS_DRIVER_TYPE_E1(TMC26X)
-#define E1_MAX_CURRENT 1000
-#define E1_SENSE_RESISTOR 91
-#define E1_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_E2(TMC26X)
-#define E2_MAX_CURRENT 1000
-#define E2_SENSE_RESISTOR 91
-#define E2_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_E3(TMC26X)
-#define E3_MAX_CURRENT 1000
-#define E3_SENSE_RESISTOR 91
-#define E3_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_E4(TMC26X)
-#define E4_MAX_CURRENT 1000
-#define E4_SENSE_RESISTOR 91
-#define E4_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_E5(TMC26X)
-#define E5_MAX_CURRENT 1000
-#define E5_SENSE_RESISTOR 91
-#define E5_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_E6(TMC26X)
-#define E6_MAX_CURRENT 1000
-#define E6_SENSE_RESISTOR 91
-#define E6_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#if AXIS_DRIVER_TYPE_E7(TMC26X)
-#define E7_MAX_CURRENT 1000
-#define E7_SENSE_RESISTOR 91
-#define E7_MICROSTEPS E0_MICROSTEPS
-#endif
-
-#endif // TMC26X
-
-/**
- * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode
- * connect your SPI pins to the hardware SPI interface on your board and define
- * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3
- * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.).
- * You may also use software SPI if you wish to use general purpose IO pins.
- *
- * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN
- * to the driver side PDN_UART pin with a 1K resistor.
- * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without
- * a resistor.
- * The drivers can also be used with hardware serial.
- *
- * TMCStepper library is required to use TMC stepper drivers.
- * https://github.com/teemuatlut/TMCStepper
- * @section tmc/config
- */
-#if HAS_TRINAMIC_CONFIG
-
-#define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
-
-/**
- * Interpolate microsteps to 256
- * Override for each driver with _INTERPOLATE settings below
- */
-#define INTERPOLATE true
-
-#if AXIS_IS_TMC(X)
-#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
-#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing
-#define X_MICROSTEPS 16 // 0..256
-#define X_RSENSE 0.11
-#define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ...
-//#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis
-//#define X_HOLD_MULTIPLIER 0.5 // Enable to override 'HOLD_MULTIPLIER' for the X axis
-#endif
-
-#if AXIS_IS_TMC(X2)
-#define X2_CURRENT 800
-#define X2_CURRENT_HOME X2_CURRENT
-#define X2_MICROSTEPS X_MICROSTEPS
-#define X2_RSENSE 0.11
-#define X2_CHAIN_POS -1
-//#define X2_INTERPOLATE true
-//#define X2_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(Y)
-#define Y_CURRENT 800
-#define Y_CURRENT_HOME Y_CURRENT
-#define Y_MICROSTEPS 16
-#define Y_RSENSE 0.11
-#define Y_CHAIN_POS -1
-//#define Y_INTERPOLATE true
-//#define Y_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(Y2)
-#define Y2_CURRENT 800
-#define Y2_CURRENT_HOME Y2_CURRENT
-#define Y2_MICROSTEPS Y_MICROSTEPS
-#define Y2_RSENSE 0.11
-#define Y2_CHAIN_POS -1
-//#define Y2_INTERPOLATE true
-//#define Y2_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(Z)
-#define Z_CURRENT 800
-#define Z_CURRENT_HOME Z_CURRENT
-#define Z_MICROSTEPS 16
-#define Z_RSENSE 0.11
-#define Z_CHAIN_POS -1
-//#define Z_INTERPOLATE true
-//#define Z_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(Z2)
-#define Z2_CURRENT 800
-#define Z2_CURRENT_HOME Z2_CURRENT
-#define Z2_MICROSTEPS Z_MICROSTEPS
-#define Z2_RSENSE 0.11
-#define Z2_CHAIN_POS -1
-//#define Z2_INTERPOLATE true
-//#define Z2_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(Z3)
-#define Z3_CURRENT 800
-#define Z3_CURRENT_HOME Z3_CURRENT
-#define Z3_MICROSTEPS Z_MICROSTEPS
-#define Z3_RSENSE 0.11
-#define Z3_CHAIN_POS -1
-//#define Z3_INTERPOLATE true
-//#define Z3_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(Z4)
-#define Z4_CURRENT 800
-#define Z4_CURRENT_HOME Z4_CURRENT
-#define Z4_MICROSTEPS Z_MICROSTEPS
-#define Z4_RSENSE 0.11
-#define Z4_CHAIN_POS -1
-//#define Z4_INTERPOLATE true
-//#define Z4_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(I)
-#define I_CURRENT 800
-#define I_CURRENT_HOME I_CURRENT
-#define I_MICROSTEPS 16
-#define I_RSENSE 0.11
-#define I_CHAIN_POS -1
-//#define I_INTERPOLATE true
-//#define I_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(J)
-#define J_CURRENT 800
-#define J_CURRENT_HOME J_CURRENT
-#define J_MICROSTEPS 16
-#define J_RSENSE 0.11
-#define J_CHAIN_POS -1
-//#define J_INTERPOLATE true
-//#define J_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(K)
-#define K_CURRENT 800
-#define K_CURRENT_HOME K_CURRENT
-#define K_MICROSTEPS 16
-#define K_RSENSE 0.11
-#define K_CHAIN_POS -1
-//#define K_INTERPOLATE true
-//#define K_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(U)
-#define U_CURRENT 800
-#define U_CURRENT_HOME U_CURRENT
-#define U_MICROSTEPS 8
-#define U_RSENSE 0.11
-#define U_CHAIN_POS -1
-//#define U_INTERPOLATE true
-//#define U_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(V)
-#define V_CURRENT 800
-#define V_CURRENT_HOME V_CURRENT
-#define V_MICROSTEPS 8
-#define V_RSENSE 0.11
-#define V_CHAIN_POS -1
-//#define V_INTERPOLATE true
-//#define V_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(W)
-#define W_CURRENT 800
-#define W_CURRENT_HOME W_CURRENT
-#define W_MICROSTEPS 8
-#define W_RSENSE 0.11
-#define W_CHAIN_POS -1
-//#define W_INTERPOLATE true
-//#define W_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E0)
-#define E0_CURRENT 800
-#define E0_MICROSTEPS 16
-#define E0_RSENSE 0.11
-#define E0_CHAIN_POS -1
-//#define E0_INTERPOLATE true
-//#define E0_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E1)
-#define E1_CURRENT 800
-#define E1_MICROSTEPS E0_MICROSTEPS
-#define E1_RSENSE 0.11
-#define E1_CHAIN_POS -1
-//#define E1_INTERPOLATE true
-//#define E1_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E2)
-#define E2_CURRENT 800
-#define E2_MICROSTEPS E0_MICROSTEPS
-#define E2_RSENSE 0.11
-#define E2_CHAIN_POS -1
-//#define E2_INTERPOLATE true
-//#define E2_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E3)
-#define E3_CURRENT 800
-#define E3_MICROSTEPS E0_MICROSTEPS
-#define E3_RSENSE 0.11
-#define E3_CHAIN_POS -1
-//#define E3_INTERPOLATE true
-//#define E3_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E4)
-#define E4_CURRENT 800
-#define E4_MICROSTEPS E0_MICROSTEPS
-#define E4_RSENSE 0.11
-#define E4_CHAIN_POS -1
-//#define E4_INTERPOLATE true
-//#define E4_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E5)
-#define E5_CURRENT 800
-#define E5_MICROSTEPS E0_MICROSTEPS
-#define E5_RSENSE 0.11
-#define E5_CHAIN_POS -1
-//#define E5_INTERPOLATE true
-//#define E5_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E6)
-#define E6_CURRENT 800
-#define E6_MICROSTEPS E0_MICROSTEPS
-#define E6_RSENSE 0.11
-#define E6_CHAIN_POS -1
-//#define E6_INTERPOLATE true
-//#define E6_HOLD_MULTIPLIER 0.5
-#endif
-
-#if AXIS_IS_TMC(E7)
-#define E7_CURRENT 800
-#define E7_MICROSTEPS E0_MICROSTEPS
-#define E7_RSENSE 0.11
-#define E7_CHAIN_POS -1
-//#define E7_INTERPOLATE true
-//#define E7_HOLD_MULTIPLIER 0.5
-#endif
-
-// @section tmc/spi
-
-/**
- * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
- * The default pins can be found in your board's pins file.
- */
-//#define X_CS_PIN -1
-//#define Y_CS_PIN -1
-//#define Z_CS_PIN -1
-//#define X2_CS_PIN -1
-//#define Y2_CS_PIN -1
-//#define Z2_CS_PIN -1
-//#define Z3_CS_PIN -1
-//#define Z4_CS_PIN -1
-//#define I_CS_PIN -1
-//#define J_CS_PIN -1
-//#define K_CS_PIN -1
-//#define U_CS_PIN -1
-//#define V_CS_PIN -1
-//#define W_CS_PIN -1
-//#define E0_CS_PIN -1
-//#define E1_CS_PIN -1
-//#define E2_CS_PIN -1
-//#define E3_CS_PIN -1
-//#define E4_CS_PIN -1
-//#define E5_CS_PIN -1
-//#define E6_CS_PIN -1
-//#define E7_CS_PIN -1
-
-/**
- * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
- * The default SW SPI pins are defined the respective pins files,
- * but you can override or define them here.
- */
-//#define TMC_USE_SW_SPI
-//#define TMC_SW_MOSI -1
-//#define TMC_SW_MISO -1
-//#define TMC_SW_SCK -1
-
-// @section tmc/serial
-
-/**
- * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses.
- * Set the address using jumpers on pins MS1 and MS2.
- * Address | MS1 | MS2
- * 0 | LOW | LOW
- * 1 | HIGH | LOW
- * 2 | LOW | HIGH
- * 3 | HIGH | HIGH
- *
- * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers
- * on the same serial port, either here or in your board's pins file.
- */
-//#define X_SLAVE_ADDRESS 0
-//#define Y_SLAVE_ADDRESS 0
-//#define Z_SLAVE_ADDRESS 0
-//#define X2_SLAVE_ADDRESS 0
-//#define Y2_SLAVE_ADDRESS 0
-//#define Z2_SLAVE_ADDRESS 0
-//#define Z3_SLAVE_ADDRESS 0
-//#define Z4_SLAVE_ADDRESS 0
-//#define I_SLAVE_ADDRESS 0
-//#define J_SLAVE_ADDRESS 0
-//#define K_SLAVE_ADDRESS 0
-//#define U_SLAVE_ADDRESS 0
-//#define V_SLAVE_ADDRESS 0
-//#define W_SLAVE_ADDRESS 0
-//#define E0_SLAVE_ADDRESS 0
-//#define E1_SLAVE_ADDRESS 0
-//#define E2_SLAVE_ADDRESS 0
-//#define E3_SLAVE_ADDRESS 0
-//#define E4_SLAVE_ADDRESS 0
-//#define E5_SLAVE_ADDRESS 0
-//#define E6_SLAVE_ADDRESS 0
-//#define E7_SLAVE_ADDRESS 0
-
-// @section tmc/smart
-
-/**
- * Software enable
- *
- * Use for drivers that do not use a dedicated enable pin, but rather handle the same
- * function through a communication line such as SPI or UART.
- */
-//#define SOFTWARE_DRIVER_ENABLE
-
-// @section tmc/stealthchop
-
-/**
- * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
- * Use Trinamic's ultra quiet stepping mode.
- * When disabled, Marlin will use spreadCycle stepping mode.
- */
-#define STEALTHCHOP_XY
-#define STEALTHCHOP_Z
-#define STEALTHCHOP_I
-#define STEALTHCHOP_J
-#define STEALTHCHOP_K
-#define STEALTHCHOP_U
-#define STEALTHCHOP_V
-#define STEALTHCHOP_W
-#define STEALTHCHOP_E
-
-/**
- * Optimize spreadCycle chopper parameters by using predefined parameter sets
- * or with the help of an example included in the library.
- * Provided parameter sets are
- * CHOPPER_DEFAULT_12V
- * CHOPPER_DEFAULT_19V
- * CHOPPER_DEFAULT_24V
- * CHOPPER_DEFAULT_36V
- * CHOPPER_09STEP_24V // 0.9 degree steppers (24V)
- * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V)
- * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9
- *
- * Define your own with:
- * { , , hysteresis_start[1..8] }
- */
-#define CHOPPER_TIMING CHOPPER_DEFAULT_12V // All axes (override below)
-//#define CHOPPER_TIMING_X CHOPPER_TIMING // For X Axes (override below)
-//#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X
-//#define CHOPPER_TIMING_Y CHOPPER_TIMING // For Y Axes (override below)
-//#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y
-//#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below)
-//#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z
-//#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z
-//#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z
-//#define CHOPPER_TIMING_I CHOPPER_TIMING // For I Axis
-//#define CHOPPER_TIMING_J CHOPPER_TIMING // For J Axis
-//#define CHOPPER_TIMING_K CHOPPER_TIMING // For K Axis
-//#define CHOPPER_TIMING_U CHOPPER_TIMING // For U Axis
-//#define CHOPPER_TIMING_V CHOPPER_TIMING // For V Axis
-//#define CHOPPER_TIMING_W CHOPPER_TIMING // For W Axis
-//#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below)
-//#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E
-//#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E
-//#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E
-//#define CHOPPER_TIMING_E4 CHOPPER_TIMING_E
-//#define CHOPPER_TIMING_E5 CHOPPER_TIMING_E
-//#define CHOPPER_TIMING_E6 CHOPPER_TIMING_E
-//#define CHOPPER_TIMING_E7 CHOPPER_TIMING_E
-
-// @section tmc/status
-
-/**
- * Monitor Trinamic drivers
- * for error conditions like overtemperature and short to ground.
- * To manage over-temp Marlin can decrease the driver current until the error condition clears.
- * Other detected conditions can be used to stop the current print.
- * Relevant G-codes:
- * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given.
- * M911 - Report stepper driver overtemperature pre-warn condition.
- * M912 - Clear stepper driver overtemperature pre-warn condition flag.
- * M122 - Report driver parameters (Requires TMC_DEBUG)
- */
-//#define MONITOR_DRIVER_STATUS
-
-#if ENABLED(MONITOR_DRIVER_STATUS)
-#define CURRENT_STEP_DOWN 50 // [mA]
-#define REPORT_CURRENT_CHANGE
-#define STOP_ON_ERROR
-#endif
-
-// @section tmc/hybrid
-
-/**
- * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
- * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
- * This mode allows for faster movements at the expense of higher noise levels.
- * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
- * M913 X/Y/Z/E to live tune the setting
- */
-//#define HYBRID_THRESHOLD
-
-#define X_HYBRID_THRESHOLD 100 // [mm/s]
-#define X2_HYBRID_THRESHOLD 100
-#define Y_HYBRID_THRESHOLD 100
-#define Y2_HYBRID_THRESHOLD 100
-#define Z_HYBRID_THRESHOLD 3
-#define Z2_HYBRID_THRESHOLD 3
-#define Z3_HYBRID_THRESHOLD 3
-#define Z4_HYBRID_THRESHOLD 3
-#define I_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s]
-#define J_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s]
-#define K_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s]
-#define U_HYBRID_THRESHOLD 3 // [mm/s]
-#define V_HYBRID_THRESHOLD 3
-#define W_HYBRID_THRESHOLD 3
-#define E0_HYBRID_THRESHOLD 30
-#define E1_HYBRID_THRESHOLD 30
-#define E2_HYBRID_THRESHOLD 30
-#define E3_HYBRID_THRESHOLD 30
-#define E4_HYBRID_THRESHOLD 30
-#define E5_HYBRID_THRESHOLD 30
-#define E6_HYBRID_THRESHOLD 30
-#define E7_HYBRID_THRESHOLD 30
-
-/**
- * Use StallGuard to home / probe X, Y, Z.
- *
- * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
- * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
- * X, Y, and Z homing will always be done in spreadCycle mode.
- *
- * X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
- * Use M914 X Y Z to set the stall threshold at runtime:
- *
- * Sensitivity TMC2209 Others
- * HIGHEST 255 -64 (Too sensitive => False positive)
- * LOWEST 0 63 (Too insensitive => No trigger)
- *
- * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
- *
- * SPI_ENDSTOPS *** Beta feature! *** TMC2130/TMC5160 Only ***
- * Poll the driver through SPI to determine load when homing.
- * Removes the need for a wire from DIAG1 to an endstop pin.
- *
- * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when
- * homing and adds a guard period for endstop triggering.
- *
- * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis.
- * @section tmc/stallguard
- */
-//#define SENSORLESS_HOMING // StallGuard capable drivers only
-
-#if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING)
-// TMC2209: 0...255. TMC2130: -64...63
-#define X_STALL_SENSITIVITY 8
-#define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY
-#define Y_STALL_SENSITIVITY 8
-#define Y2_STALL_SENSITIVITY Y_STALL_SENSITIVITY
-//#define Z_STALL_SENSITIVITY 8
-//#define Z2_STALL_SENSITIVITY Z_STALL_SENSITIVITY
-//#define Z3_STALL_SENSITIVITY Z_STALL_SENSITIVITY
-//#define Z4_STALL_SENSITIVITY Z_STALL_SENSITIVITY
-//#define I_STALL_SENSITIVITY 8
-//#define J_STALL_SENSITIVITY 8
-//#define K_STALL_SENSITIVITY 8
-//#define U_STALL_SENSITIVITY 8
-//#define V_STALL_SENSITIVITY 8
-//#define W_STALL_SENSITIVITY 8
-//#define SPI_ENDSTOPS // TMC2130 only
-//#define IMPROVE_HOMING_RELIABILITY
-#endif
-
-// @section tmc/config
-
-/**
- * TMC Homing stepper phase.
- *
- * Improve homing repeatability by homing to stepper coil's nearest absolute
- * phase position. Trinamic drivers use a stepper phase table with 1024 values
- * spanning 4 full steps with 256 positions each (ergo, 1024 positions).
- * Full step positions (128, 384, 640, 896) have the highest holding torque.
- *
- * Values from 0..1023, -1 to disable homing phase for that axis.
- */
-//#define TMC_HOME_PHASE { 896, 896, 896 }
-
-/**
- * Beta feature!
- * Create a 50/50 square wave step pulse optimal for stepper drivers.
- */
-//#define SQUARE_WAVE_STEPPING
+//#define RX_BUFFER_MONITOR
/**
- * Enable M122 debugging command for TMC stepper drivers.
- * M122 S0/1 will enable continuous reporting.
+ * Emergency Command Parser
+ *
+ * Add a low-level parser to intercept certain commands as they
+ * enter the serial receive buffer, so they cannot be blocked.
+ * Currently handles M108, M112, M410, M876
+ * NOTE: Not yet implemented for all platforms.
*/
-//#define TMC_DEBUG
+#define EMERGENCY_PARSER
/**
- * You can set your own advanced settings by filling in predefined functions.
- * A list of available functions can be found on the library github page
- * https://github.com/teemuatlut/TMCStepper
+ * Realtime Reporting (requires EMERGENCY_PARSER)
+ *
+ * - Report position and state of the machine (like Grbl).
+ * - Auto-report position during long moves.
+ * - Useful for CNC/LASER.
+ *
+ * Adds support for commands:
+ * S000 : Report State and Position while moving.
+ * P000 : Instant Pause / Hold while moving.
+ * R000 : Resume from Pause / Hold.
*
- * Example:
- * #define TMC_ADV() { \
- * stepperX.diag0_otpw(1); \
- * stepperY.intpol(0); \
- * }
+ * - During Hold all Emergency Parser commands are available, as usual.
+ * - Enable NANODLP_Z_SYNC and NANODLP_ALL_AXIS for move command end-state reports.
*/
-#define TMC_ADV() { }
+#define REALTIME_REPORTING_COMMANDS
+#if ENABLED(REALTIME_REPORTING_COMMANDS)
+ #define FULL_REPORT_TO_HOST_FEATURE // Auto-report the machine status like Grbl CNC
+#endif
-#endif // HAS_TRINAMIC_CONFIG
+// Bad Serial-connections can miss a received command by sending an 'ok'
+// Therefore some clients abort after 30 seconds in a timeout.
+// Some other clients start sending commands while receiving a 'wait'.
+// This "wait" is only sent when the buffer is empty. 1 second is a good value here.
+//#define NO_TIMEOUTS 1000 // Milliseconds
-// @section i2cbus
+// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary.
+// #define ADVANCED_OK
-//
-// I2C Master ID for LPC176x LCD and Digital Current control
-// Does not apply to other peripherals based on the Wire library.
-//
-//#define I2C_MASTER_ID 1 // Set a value from 0 to 2
+// Printrun may have trouble receiving long strings all at once.
+// This option inserts short delays between lines of serial output.
+#define SERIAL_OVERRUN_PROTECTION
+
+// For serial echo, the number of digits after the decimal point
+//#define SERIAL_FLOAT_PRECISION 4
/**
- * TWI/I2C BUS
- *
- * This feature is an EXPERIMENTAL feature so it shall not be used on production
- * machines. Enabling this will allow you to send and receive I2C data from slave
- * devices on the bus.
- *
- * ; Example #1
- * ; This macro send the string "Marlin" to the slave device with address 0x63 (99)
- * ; It uses multiple M260 commands with one B arg
- * M260 A99 ; Target slave address
- * M260 B77 ; M
- * M260 B97 ; a
- * M260 B114 ; r
- * M260 B108 ; l
- * M260 B105 ; i
- * M260 B110 ; n
- * M260 S1 ; Send the current buffer
- *
- * ; Example #2
- * ; Request 6 bytes from slave device with address 0x63 (99)
- * M261 A99 B5
+ * Set the number of proportional font spaces required to fill up a typical character space.
+ * This can help to better align the output of commands like `G29 O` Mesh Output.
*
- * ; Example #3
- * ; Example serial output of a M261 request
- * echo:i2c-reply: from:99 bytes:5 data:hello
+ * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0.
+ * Otherwise, adjust according to your client and font.
*/
+#define PROPORTIONAL_FONT_RATIO 1.0
-//#define EXPERIMENTAL_I2CBUS
-#if ENABLED(EXPERIMENTAL_I2CBUS)
-#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave
-#endif
-
-// @section photo
+// @section extras
/**
- * Photo G-code
- * Add the M240 G-code to take a photo.
- * The photo can be triggered by a digital pin or a physical movement.
+ * Extra Fan Speed
+ * Adds a secondary fan speed for each print-cooling fan.
+ * 'M106 P T3-255' : Set a secondary speed for
+ * 'M106 P T2' : Use the set secondary speed
+ * 'M106 P T1' : Restore the previous fan speed
*/
-//#define PHOTO_GCODE
-#if ENABLED(PHOTO_GCODE)
-// A position to move to (and raise Z) before taking the photo
-//#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z)
-//#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P)
-//#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S)
-
-// Canon RC-1 or homebrew digital camera trigger
-// Data from: https://www.doc-diy.net/photo/rc-1_hacked/
-//#define PHOTOGRAPH_PIN 23
+#define EXTRA_FAN_SPEED
-// Canon Hack Development Kit
-// https://captain-slow.dk/2014/03/09/3d-printing-timelapses/
-//#define CHDK_PIN 4
-
-// Optional second move with delay to trigger the camera shutter
-//#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J)
-
-// Duration to hold the switch or keep CHDK_PIN high
-//#define PHOTO_SWITCH_MS 50 // (ms) (M240 D)
+// @section advanced pause
/**
- * PHOTO_PULSES_US may need adjustment depending on board and camera model.
- * Pin must be running at 48.4kHz.
- * Be sure to use a PHOTOGRAPH_PIN which can rise and fall quick enough.
- * (e.g., MKS SBase temp sensor pin was too slow, so used P1.23 on J8.)
+ * Advanced Pause for Filament Change
+ * - Adds the G-code M600 Filament Change to initiate a filament change.
+ * - This feature is required for the default FILAMENT_RUNOUT_SCRIPT.
+ *
+ * Requirements:
+ * - For Filament Change parking enable and configure NOZZLE_PARK_FEATURE.
+ * - For user interaction enable an LCD display, HOST_PROMPT_SUPPORT, or EMERGENCY_PARSER.
*
- * Example pulse data for Nikon: https://bit.ly/2FKD0Aq
- * IR Wiring: https://git.io/JvJf7
+ * Enable PARK_HEAD_ON_PAUSE to add the G-code M125 Pause and Park.
*/
-//#define PHOTO_PULSES_US { 2000, 27850, 400, 1580, 400, 3580, 400 } // (µs) Durations for each 48.4kHz oscillation
-#ifdef PHOTO_PULSES_US
-#define PHOTO_PULSE_DELAY_US 13 // (µs) Approximate duration of each HIGH and LOW pulse in the oscillation
-#endif
+#define ADVANCED_PAUSE_FEATURE
+#if ENABLED(ADVANCED_PAUSE_FEATURE)
+ #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate.
+ #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract.
+ // This short retract is done immediately, before parking the nozzle.
+ #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast.
+ #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate.
+ #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload.
+ // For Bowden, the full length of the tube and nozzle.
+ // For direct drive, the full length of the nozzle.
+ // Set to 0 for manual unloading.
+ #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load.
+ #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material.
+ // 0 to disable start loading and skip to fast load only
+ #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast.
+ #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate.
+ #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle.
+ // For Bowden, the full length of the tube and nozzle.
+ // For direct drive, the full length of the nozzle.
+ //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted.
+ #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate.
+ #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading.
+ // Set to 0 for manual extrusion.
+ // Filament can be extruded repeatedly from the Filament Change menu
+ // until extrusion is consistent, and to purge old filament.
+ #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park.
+ //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused.
+
+ // Filament Unload does a Retract, Delay, and Purge first:
+ #define FILAMENT_UNLOAD_PURGE_RETRACT 13 // (mm) Unload initial retract length.
+ #define FILAMENT_UNLOAD_PURGE_DELAY 5000 // (ms) Delay for the filament to cool after retract.
+ #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged.
+ #define FILAMENT_UNLOAD_PURGE_FEEDRATE 25 // (mm/s) feedrate to purge before unload
+
+ #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety.
+ #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed.
+ #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change.
+ //#define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is triggered again.
+ //#define PAUSE_REHEAT_FAST_RESUME // Reduce number of waits by not prompting again post-timeout before continuing.
+
+ #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change.
+ //#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change
+
+ //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu.
+ //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302)
#endif
+
// @section cnc
/**
@@ -3396,164 +1866,165 @@
* See https://marlinfw.org/docs/configuration/2.0.9/laser_spindle.html for more config details.
*/
//#define SPINDLE_FEATURE
-//#define LASER_FEATURE
+#define LASER_FEATURE
#if EITHER(SPINDLE_FEATURE, LASER_FEATURE)
-#define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if SPINDLE_LASER_ENA_PIN is active HIGH
-
-#define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power
-#if ENABLED(SPINDLE_LASER_USE_PWM)
-#define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
-#define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR, ESP32, and LPC)
-// ESP32: If SPINDLE_LASER_PWM_PIN is onboard then <=78125Hz. For I2S expander
-// the frequency determines the PWM resolution. 2500Hz = 0-100, 977Hz = 0-255, ...
-// (250000 / SPINDLE_LASER_FREQUENCY) = max value.
-#endif
-
-//#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11
-#if ENABLED(AIR_EVACUATION)
-#define AIR_EVACUATION_ACTIVE LOW // Set to "HIGH" if the on/off function is active HIGH
-//#define AIR_EVACUATION_PIN 42 // Override the default Cutter Vacuum or Laser Blower pin
-#endif
-
-//#define AIR_ASSIST // Air Assist control with G-codes M8-M9
-#if ENABLED(AIR_ASSIST)
-#define AIR_ASSIST_ACTIVE LOW // Active state on air assist pin
-//#define AIR_ASSIST_PIN 44 // Override the default Air Assist pin
-#endif
-
-//#define SPINDLE_SERVO // A servo converting an angle to spindle power
-#ifdef SPINDLE_SERVO
-#define SPINDLE_SERVO_NR 0 // Index of servo used for spindle control
-#define SPINDLE_SERVO_MIN 10 // Minimum angle for servo spindle
-#endif
-
-/**
- * Speed / Power can be set ('M3 S') and displayed in terms of:
- * - PWM255 (S0 - S255)
- * - PERCENT (S0 - S100)
- * - RPM (S0 - S50000) Best for use with a spindle
- * - SERVO (S0 - S180)
- */
-#define CUTTER_POWER_UNIT PWM255
-
-/**
- * Relative Cutter Power
- * Normally, 'M3 O' sets
- * OCR power is relative to the range SPEED_POWER_MIN...SPEED_POWER_MAX.
- * so input powers of 0...255 correspond to SPEED_POWER_MIN...SPEED_POWER_MAX
- * instead of normal range (0 to SPEED_POWER_MAX).
- * Best used with (e.g.) SuperPID router controller: S0 = 5,000 RPM and S255 = 30,000 RPM
- */
-//#define CUTTER_POWER_RELATIVE // Set speed proportional to [SPEED_POWER_MIN...SPEED_POWER_MAX]
-
-#if ENABLED(SPINDLE_FEATURE)
-//#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction
-#define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction
-#define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed
-
-#define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power
-#define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop
-
-/**
- * M3/M4 Power Equation
- *
- * Each tool uses different value ranges for speed / power control.
- * These parameters are used to convert between tool power units and PWM.
- *
- * Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE
- * PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE
- */
-#if ENABLED(SPINDLE_LASER_USE_PWM)
-#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
-#define SPEED_POWER_MIN 5000 // (RPM)
-#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
-#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
-#endif
-
-#else
-
-#if ENABLED(SPINDLE_LASER_USE_PWM)
-#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
-#define SPEED_POWER_MIN 0 // (%) 0-100
-#define SPEED_POWER_MAX 100 // (%) 0-100
-#define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
-#endif
-
-// Define the minimum and maximum test pulse time values for a laser test fire function
-#define LASER_TEST_PULSE_MIN 1 // (ms) Used with Laser Control Menu
-#define LASER_TEST_PULSE_MAX 999 // (ms) Caution: Menu may not show more than 3 characters
-
-#define SPINDLE_LASER_POWERUP_DELAY 50 // (ms) Delay to allow the spindle/laser to come up to speed/power
-#define SPINDLE_LASER_POWERDOWN_DELAY 50 // (ms) Delay to allow the spindle to stop
-
-/**
- * Laser Safety Timeout
- *
- * The laser should be turned off when there is no movement for a period of time.
- * Consider material flammability, cut rate, and G-code order when setting this
- * value. Too low and it could turn off during a very slow move; too high and
- * the material could ignite.
- */
-#define LASER_SAFETY_TIMEOUT_MS 1000 // (ms)
-
-/**
- * Any M3 or G1/2/3/5 command with the 'I' parameter enables continuous inline power mode.
- *
- * e.g., 'M3 I' enables continuous inline power which is processed by the planner.
- * Power is stored in move blocks and applied when blocks are processed by the Stepper ISR.
- *
- * 'M4 I' sets dynamic mode which uses the current feedrate to calculate a laser power OCR value.
- *
- * Any move in dynamic mode will use the current feedrate to calculate the laser power.
- * Feed rates are set by the F parameter of a move command e.g. G1 X0 Y10 F6000
- * Laser power would be calculated by bit shifting off 8 LSB's. In binary this is div 256.
- * The calculation gives us ocr values from 0 to 255, values over F65535 will be set as 255 .
- * More refined power control such as compesation for accell/decell will be addressed in future releases.
- *
- * M5 I clears inline mode and set power to 0, M5 sets the power output to 0 but leaves inline mode on.
- */
-
-/**
- * Enable M3 commands for laser mode inline power planner syncing.
- * This feature enables any M3 S-value to be injected into the block buffers while in
- * CUTTER_MODE_CONTINUOUS. The option allows M3 laser power to be commited without waiting
- * for a planner syncronization
- */
-//#define LASER_POWER_SYNC
-
-/**
- * Scale the laser's power in proportion to the movement rate.
- *
- * - Sets the entry power proportional to the entry speed over the nominal speed.
- * - Ramps the power up every N steps to approximate the speed trapezoid.
- * - Due to the limited power resolution this is only approximate.
- */
-//#define LASER_POWER_TRAP
-
-//
-// Laser I2C Ammeter (High precision INA226 low/high side module)
-//
-//#define I2C_AMMETER
-#if ENABLED(I2C_AMMETER)
-#define I2C_AMMETER_IMAX 0.1 // (Amps) Calibration value for the expected current range
-#define I2C_AMMETER_SHUNT_RESISTOR 0.1 // (Ohms) Calibration shunt resistor value
-#endif
-
-//
-// Laser Coolant Flow Meter
-//
-//#define LASER_COOLANT_FLOW_METER
-#if ENABLED(LASER_COOLANT_FLOW_METER)
-#define FLOWMETER_PIN 20 // Requires an external interrupt-enabled pin (e.g., RAMPS 2,3,18,19,20,21)
-#define FLOWMETER_PPL 5880 // (pulses/liter) Flow meter pulses-per-liter on the input pin
-#define FLOWMETER_INTERVAL 1000 // (ms) Flow rate calculation interval in milliseconds
-#define FLOWMETER_SAFETY // Prevent running the laser without the minimum flow rate set below
-#if ENABLED(FLOWMETER_SAFETY)
-#define FLOWMETER_MIN_LITERS_PER_MINUTE 1.5 // (liters/min) Minimum flow required when enabled
-#endif
-#endif
-
-#endif
+ #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if SPINDLE_LASER_ENA_PIN is active HIGH
+
+ #define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
+ #define SPINDLE_LASER_FREQUENCY 20000 // (Hz) Spindle/laser frequency (only on supported HALs: AVR, ESP32, and LPC)
+ // ESP32: If SPINDLE_LASER_PWM_PIN is onboard then <=78125Hz. For I2S expander
+ // the frequency determines the PWM resolution. 2500Hz = 0-100, 977Hz = 0-255, ...
+ // (250000 / SPINDLE_LASER_FREQUENCY) = max value.
+ #define SPINDLE_LASER_PWM_PIN LASER_PWM_PIN
+ #endif
+
+ #define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11
+ #if ENABLED(AIR_EVACUATION)
+ #define AIR_EVACUATION_ACTIVE LOW // Set to "HIGH" if the on/off function is active HIGH
+ #define AIR_EVACUATION_PIN PA9 // Override the default Cutter Vacuum or Laser Blower pin
+ #endif
+
+ #define AIR_ASSIST // Air Assist control with G-codes M8-M9
+ #if ENABLED(AIR_ASSIST)
+ #define AIR_ASSIST_ACTIVE LOW // Active state on air assist pin
+ #define AIR_ASSIST_PIN PA10 // Override the default Air Assist pin
+ #endif
+
+ //#define SPINDLE_SERVO // A servo converting an angle to spindle power
+ #ifdef SPINDLE_SERVO
+ #define SPINDLE_SERVO_NR 0 // Index of servo used for spindle control
+ #define SPINDLE_SERVO_MIN 10 // Minimum angle for servo spindle
+ #endif
+
+ /**
+ * Speed / Power can be set ('M3 S') and displayed in terms of:
+ * - PWM255 (S0 - S255)
+ * - PERCENT (S0 - S100)
+ * - RPM (S0 - S50000) Best for use with a spindle
+ * - SERVO (S0 - S180)
+ */
+ #define CUTTER_POWER_UNIT PWM255
+
+ /**
+ * Relative Cutter Power
+ * Normally, 'M3 O' sets
+ * OCR power is relative to the range SPEED_POWER_MIN...SPEED_POWER_MAX.
+ * so input powers of 0...255 correspond to SPEED_POWER_MIN...SPEED_POWER_MAX
+ * instead of normal range (0 to SPEED_POWER_MAX).
+ * Best used with (e.g.) SuperPID router controller: S0 = 5,000 RPM and S255 = 30,000 RPM
+ */
+ //#define CUTTER_POWER_RELATIVE // Set speed proportional to [SPEED_POWER_MIN...SPEED_POWER_MAX]
+
+ #if ENABLED(SPINDLE_FEATURE)
+ //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction
+ #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction
+ #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed
+
+ #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power
+ #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop
+
+ /**
+ * M3/M4 Power Equation
+ *
+ * Each tool uses different value ranges for speed / power control.
+ * These parameters are used to convert between tool power units and PWM.
+ *
+ * Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE
+ * PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE
+ */
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
+ #define SPEED_POWER_MIN 5000 // (RPM)
+ #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
+ #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
+ #endif
+
+ #else
+
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
+ #define SPEED_POWER_MIN 0 // (%) 0-100
+ #define SPEED_POWER_MAX 100 // (%) 0-100
+ #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
+ #endif
+
+ // Define the minimum and maximum test pulse time values for a laser test fire function
+ #define LASER_TEST_PULSE_MIN 1 // (ms) Used with Laser Control Menu
+ #define LASER_TEST_PULSE_MAX 999 // (ms) Caution: Menu may not show more than 3 characters
+
+ #define SPINDLE_LASER_POWERUP_DELAY 50 // (ms) Delay to allow the spindle/laser to come up to speed/power
+ #define SPINDLE_LASER_POWERDOWN_DELAY 50 // (ms) Delay to allow the spindle to stop
+
+ /**
+ * Laser Safety Timeout
+ *
+ * The laser should be turned off when there is no movement for a period of time.
+ * Consider material flammability, cut rate, and G-code order when setting this
+ * value. Too low and it could turn off during a very slow move; too high and
+ * the material could ignite.
+ */
+ // #define LASER_SAFETY_TIMEOUT_MS 1000 // (ms)
+
+ /**
+ * Any M3 or G1/2/3/5 command with the 'I' parameter enables continuous inline power mode.
+ *
+ * e.g., 'M3 I' enables continuous inline power which is processed by the planner.
+ * Power is stored in move blocks and applied when blocks are processed by the Stepper ISR.
+ *
+ * 'M4 I' sets dynamic mode which uses the current feedrate to calculate a laser power OCR value.
+ *
+ * Any move in dynamic mode will use the current feedrate to calculate the laser power.
+ * Feed rates are set by the F parameter of a move command e.g. G1 X0 Y10 F6000
+ * Laser power would be calculated by bit shifting off 8 LSB's. In binary this is div 256.
+ * The calculation gives us ocr values from 0 to 255, values over F65535 will be set as 255 .
+ * More refined power control such as compesation for accell/decell will be addressed in future releases.
+ *
+ * M5 I clears inline mode and set power to 0, M5 sets the power output to 0 but leaves inline mode on.
+ */
+
+ /**
+ * Enable M3 commands for laser mode inline power planner syncing.
+ * This feature enables any M3 S-value to be injected into the block buffers while in
+ * CUTTER_MODE_CONTINUOUS. The option allows M3 laser power to be commited without waiting
+ * for a planner syncronization
+ */
+ //#define LASER_POWER_SYNC
+
+ /**
+ * Scale the laser's power in proportion to the movement rate.
+ *
+ * - Sets the entry power proportional to the entry speed over the nominal speed.
+ * - Ramps the power up every N steps to approximate the speed trapezoid.
+ * - Due to the limited power resolution this is only approximate.
+ */
+ //#define LASER_POWER_TRAP
+
+ //
+ // Laser I2C Ammeter (High precision INA226 low/high side module)
+ //
+ //#define I2C_AMMETER
+ #if ENABLED(I2C_AMMETER)
+ #define I2C_AMMETER_IMAX 0.1 // (Amps) Calibration value for the expected current range
+ #define I2C_AMMETER_SHUNT_RESISTOR 0.1 // (Ohms) Calibration shunt resistor value
+ #endif
+
+ //
+ // Laser Coolant Flow Meter
+ //
+ //#define LASER_COOLANT_FLOW_METER
+ #if ENABLED(LASER_COOLANT_FLOW_METER)
+ #define FLOWMETER_PIN 20 // Requires an external interrupt-enabled pin (e.g., RAMPS 2,3,18,19,20,21)
+ #define FLOWMETER_PPL 5880 // (pulses/liter) Flow meter pulses-per-liter on the input pin
+ #define FLOWMETER_INTERVAL 1000 // (ms) Flow rate calculation interval in milliseconds
+ #define FLOWMETER_SAFETY // Prevent running the laser without the minimum flow rate set below
+ #if ENABLED(FLOWMETER_SAFETY)
+ #define FLOWMETER_MIN_LITERS_PER_MINUTE 1.5 // (liters/min) Minimum flow required when enabled
+ #endif
+ #endif
+
+ #endif
#endif // SPINDLE_FEATURE || LASER_FEATURE
/**
@@ -3575,47 +2046,12 @@
*
* Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined.
*/
-//#define COOLANT_CONTROL
+// #define COOLANT_CONTROL
#if ENABLED(COOLANT_CONTROL)
-#define COOLANT_MIST // Enable if mist coolant is present
-#define COOLANT_FLOOD // Enable if flood coolant is present
-#define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed
-#define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed
-#endif
-
-// @section filament width
-
-/**
- * Filament Width Sensor
- *
- * Measures the filament width in real-time and adjusts
- * flow rate to compensate for any irregularities.
- *
- * Also allows the measured filament diameter to set the
- * extrusion rate, so the slicer only has to specify the
- * volume.
- *
- * Only a single extruder is supported at this time.
- *
- * 34 RAMPS_14 : Analog input 5 on the AUX2 connector
- * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E)
- * 301 RAMBO : Analog input 3
- *
- * Note: May require analog pins to be defined for other boards.
- */
-//#define FILAMENT_WIDTH_SENSOR
-
-#if ENABLED(FILAMENT_WIDTH_SENSOR)
-#define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4]
-#define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber
-
-#define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it
-#define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM.
-
-#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially
-
-// Display filament width on the LCD status line. Status messages will expire after 5 seconds.
-//#define FILAMENT_LCD_DISPLAY
+ #define COOLANT_MIST // Enable if mist coolant is present
+ #define COOLANT_FLOOD // Enable if flood coolant is present
+ #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed
+ #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed
#endif
// @section power
@@ -3633,14 +2069,14 @@
//#define POWER_MONITOR_VOLTAGE // Monitor the system voltage
#if ENABLED(POWER_MONITOR_CURRENT)
-#define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF!
-#define POWER_MONITOR_CURRENT_OFFSET 0 // Offset (in amps) applied to the calculated current
-#define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display)
+ #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF!
+ #define POWER_MONITOR_CURRENT_OFFSET 0 // Offset (in amps) applied to the calculated current
+ #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display)
#endif
#if ENABLED(POWER_MONITOR_VOLTAGE)
-#define POWER_MONITOR_VOLTS_PER_VOLT 0.077933 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF!
-#define POWER_MONITOR_VOLTAGE_OFFSET 0 // Offset (in volts) applied to the calculated voltage
+ #define POWER_MONITOR_VOLTS_PER_VOLT 0.077933 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF!
+ #define POWER_MONITOR_VOLTAGE_OFFSET 0 // Offset (in volts) applied to the calculated voltage
#endif
// @section safety
@@ -3670,27 +2106,27 @@
* Auto-report fan speed with M123 S
* Requires fans with tachometer pins
*/
-//#define AUTO_REPORT_FANS
+// #define AUTO_REPORT_FANS
/**
* Auto-report temperatures with M155 S
*/
#define AUTO_REPORT_TEMPERATURES
#if ENABLED(AUTO_REPORT_TEMPERATURES) && TEMP_SENSOR_REDUNDANT
-//#define AUTO_REPORT_REDUNDANT // Include the "R" sensor in the auto-report
+ #define AUTO_REPORT_REDUNDANT // Include the "R" sensor in the auto-report
#endif
/**
* Auto-report position with M154 S
*/
-//#define AUTO_REPORT_POSITION
+#define AUTO_REPORT_POSITION
/**
* Include capabilities in M115 output
*/
#define EXTENDED_CAPABILITIES_REPORT
#if ENABLED(EXTENDED_CAPABILITIES_REPORT)
-//#define M115_GEOMETRY_REPORT
+ //#define M115_GEOMETRY_REPORT
#endif
// @section security
@@ -3702,44 +2138,14 @@
*/
//#define EXPECTED_PRINTER_CHECK
-// @section volumetrics
-
-/**
- * Disable all Volumetric extrusion options
- */
-//#define NO_VOLUMETRICS
-
-#if DISABLED(NO_VOLUMETRICS)
-/**
- * Volumetric extrusion default state
- * Activate to make volumetric extrusion the default method,
- * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter.
- *
- * M200 D0 to disable, M200 Dn to set a new diameter (and enable volumetric).
- * M200 S0/S1 to disable/enable volumetric extrusion.
- */
-//#define VOLUMETRIC_DEFAULT_ON
-
-//#define VOLUMETRIC_EXTRUDER_LIMIT
-#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
-/**
- * Default volumetric extrusion limit in cubic mm per second (mm^3/sec).
- * This factory setting applies to all extruders.
- * Use 'M200 [T] L' to override and 'M502' to reset.
- * A non-zero value activates Volume-based Extrusion Limiting.
- */
-#define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 // (mm^3/sec)
-#endif
-#endif
-
// @section reporting
// Extra options for the M114 "Current Position" report
-//#define M114_DETAIL // Use 'M114` for details to check planner calculations
+#define M114_DETAIL // Use 'M114` for details to check planner calculations
//#define M114_REALTIME // Real current position based on forward kinematics
//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed.
-//#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others)
+#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others)
// @section gcode
@@ -3747,18 +2153,12 @@
* Spend 28 bytes of SRAM to optimize the G-code parser
*/
#define FASTER_GCODE_PARSER
-
#if ENABLED(FASTER_GCODE_PARSER)
-//#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
+ //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
#endif
-// Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack)
-//#define MEATPACK_ON_SERIAL_PORT_1
-//#define MEATPACK_ON_SERIAL_PORT_2
-//#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase
-
-//#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW
+#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase
/**
* Enable this option for a leaner build of Marlin that removes all
@@ -3776,12 +2176,12 @@
* High feedrates may cause ringing and harm print quality.
*/
//#define PAREN_COMMENTS // Support for parentheses-delimited comments
-//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc.
+#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc.
// Enable and set a (default) feedrate for all G0 moves
-//#define G0_FEEDRATE 3000 // (mm/min)
+#define G0_FEEDRATE 3000 // (mm/min)
#ifdef G0_FEEDRATE
-//#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode
+ #define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode
#endif
// @section gcode
@@ -3801,77 +2201,8 @@
*/
//#define GCODE_MACROS
#if ENABLED(GCODE_MACROS)
-#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
-#define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
-#endif
-
-/**
- * User-defined menu items to run custom G-code.
- * Up to 25 may be defined, but the actual number is LCD-dependent.
- */
-
-// @section custom main menu
-
-// Custom Menu: Main Menu
-//#define CUSTOM_MENU_MAIN
-#if ENABLED(CUSTOM_MENU_MAIN)
-//#define CUSTOM_MENU_MAIN_TITLE "Custom Commands"
-#define CUSTOM_MENU_MAIN_SCRIPT_DONE "M117 User Script Done"
-#define CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK
-//#define CUSTOM_MENU_MAIN_SCRIPT_RETURN // Return to status screen after a script
-#define CUSTOM_MENU_MAIN_ONLY_IDLE // Only show custom menu when the machine is idle
-
-#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
-#define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W"
-//#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
-
-#define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL
-#define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
-//#define MAIN_MENU_ITEM_2_CONFIRM
-
-//#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL
-//#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
-//#define MAIN_MENU_ITEM_3_CONFIRM
-
-//#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level"
-//#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
-//#define MAIN_MENU_ITEM_4_CONFIRM
-
-//#define MAIN_MENU_ITEM_5_DESC "Home & Info"
-//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
-//#define MAIN_MENU_ITEM_5_CONFIRM
-#endif
-
-// @section custom config menu
-
-// Custom Menu: Configuration Menu
-//#define CUSTOM_MENU_CONFIG
-#if ENABLED(CUSTOM_MENU_CONFIG)
-//#define CUSTOM_MENU_CONFIG_TITLE "Custom Commands"
-#define CUSTOM_MENU_CONFIG_SCRIPT_DONE "M117 Wireless Script Done"
-#define CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK
-//#define CUSTOM_MENU_CONFIG_SCRIPT_RETURN // Return to status screen after a script
-#define CUSTOM_MENU_CONFIG_ONLY_IDLE // Only show custom menu when the machine is idle
-
-#define CONFIG_MENU_ITEM_1_DESC "Wifi ON"
-#define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678"
-//#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
-
-#define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON"
-#define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678"
-//#define CONFIG_MENU_ITEM_2_CONFIRM
-
-//#define CONFIG_MENU_ITEM_3_DESC "Radio OFF"
-//#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678"
-//#define CONFIG_MENU_ITEM_3_CONFIRM
-
-//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
-//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
-//#define CONFIG_MENU_ITEM_4_CONFIRM
-
-//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
-//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
-//#define CONFIG_MENU_ITEM_5_CONFIRM
+ #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
+ #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
#endif
// @section custom buttons
@@ -3880,31 +2211,31 @@
* User-defined buttons to run custom G-code.
* Up to 25 may be defined.
*/
-//#define CUSTOM_USER_BUTTONS
+// #define CUSTOM_USER_BUTTONS
#if ENABLED(CUSTOM_USER_BUTTONS)
-//#define BUTTON1_PIN -1
-#if PIN_EXISTS(BUTTON1)
-#define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH.
-#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
-#define BUTTON1_GCODE "G28"
-#define BUTTON1_DESC "Homing" // Optional string to set the LCD status
-#endif
-
-//#define BUTTON2_PIN -1
-#if PIN_EXISTS(BUTTON2)
-#define BUTTON2_HIT_STATE LOW
-#define BUTTON2_WHEN_PRINTING false
-#define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
-#define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
-#endif
-
-//#define BUTTON3_PIN -1
-#if PIN_EXISTS(BUTTON3)
-#define BUTTON3_HIT_STATE LOW
-#define BUTTON3_WHEN_PRINTING false
-#define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
-#define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
-#endif
+ #define BUTTON1_PIN 18
+ #if PIN_EXISTS(BUTTON1)
+ #define BUTTON1_HIT_STATE HIGH // State of the triggered button. NC=LOW. NO=HIGH.
+ #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
+ #define BUTTON1_GCODE "M10"
+ #define BUTTON1_DESC "Ventillation" // Optional string to set the LCD status
+ #endif
+
+ //#define BUTTON2_PIN -1
+ #if PIN_EXISTS(BUTTON2)
+ #define BUTTON2_HIT_STATE LOW
+ #define BUTTON2_WHEN_PRINTING false
+ #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
+ #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
+ #endif
+
+ //#define BUTTON3_PIN -1
+ #if PIN_EXISTS(BUTTON3)
+ #define BUTTON3_HIT_STATE LOW
+ #define BUTTON3_WHEN_PRINTING false
+ #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
+ #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
+ #endif
#endif
// @section host
@@ -3923,15 +2254,15 @@
* Host Prompt Support enables Marlin to use the host for user prompts so
* filament runout and other processes can be managed from the host side.
*/
-//#define HOST_ACTION_COMMANDS
+#define HOST_ACTION_COMMANDS
#if ENABLED(HOST_ACTION_COMMANDS)
-//#define HOST_PAUSE_M76 // Tell the host to pause in response to M76
-//#define HOST_PROMPT_SUPPORT // Initiate host prompts to get user feedback
-#if ENABLED(HOST_PROMPT_SUPPORT)
-//#define HOST_STATUS_NOTIFICATIONS // Send some status messages to the host as notifications
-#endif
-//#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
-//#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down
+ #define HOST_PAUSE_M76 // Tell the host to pause in response to M76
+ //#define HOST_PROMPT_SUPPORT // Initiate host prompts to get user feedback
+ #if ENABLED(HOST_PROMPT_SUPPORT)
+ //#define HOST_STATUS_NOTIFICATIONS // Send some status messages to the host as notifications
+ #endif
+ //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
+ //#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down
#endif
// @section extras
@@ -3941,132 +2272,9 @@
*
* Implement M486 to allow Marlin to skip objects
*/
-//#define CANCEL_OBJECTS
+#define CANCEL_OBJECTS
#if ENABLED(CANCEL_OBJECTS)
-#define CANCEL_OBJECTS_REPORTING // Emit the current object as a status message
-#endif
-
-/**
- * I2C position encoders for closed loop control.
- * Developed by Chris Barr at Aus3D.
- *
- * Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder
- * Github: https://github.com/Aus3D/MagneticEncoder
- *
- * Supplier: https://aus3d.com.au/magnetic-encoder-module
- * Alternative Supplier: https://reliabuild3d.com/
- *
- * Reliabuild encoders have been modified to improve reliability.
- * @section i2c encoders
- */
-
-//#define I2C_POSITION_ENCODERS
-#if ENABLED(I2C_POSITION_ENCODERS)
-
-#define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5
-// encoders supported currently.
-
-#define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200.
-#define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS.
-#define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or-
-// I2CPE_ENC_TYPE_ROTARY.
-#define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for
-// 1mm poles. For linear encoders this is ticks / mm,
-// for rotary encoders this is ticks / revolution.
-//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
-// steps per full revolution (motor steps/rev * microstepping)
-//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
-#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction.
-#define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the
-// printer will attempt to correct the error; errors
-// smaller than this are ignored to minimize effects of
-// measurement noise / latency (filter).
-
-#define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2.
-#define I2CPE_ENC_2_AXIS Y_AXIS
-#define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR
-#define I2CPE_ENC_2_TICKS_UNIT 2048
-//#define I2CPE_ENC_2_TICKS_REV (16 * 200)
-//#define I2CPE_ENC_2_INVERT
-#define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP
-#define I2CPE_ENC_2_EC_THRESH 0.10
-
-#define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options
-#define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below.
-
-#define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4.
-#define I2CPE_ENC_4_AXIS E_AXIS
-
-#define I2CPE_ENC_5_ADDR 34 // Encoder 5.
-#define I2CPE_ENC_5_AXIS E_AXIS
-
-// Default settings for encoders which are enabled, but without settings configured above.
-#define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR
-#define I2CPE_DEF_ENC_TICKS_UNIT 2048
-#define I2CPE_DEF_TICKS_REV (16 * 200)
-#define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE
-#define I2CPE_DEF_EC_THRESH 0.1
-
-//#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given
-// axis after which the printer will abort. Comment out to
-// disable abort behavior.
-
-#define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault
-// for this amount of time (in ms) before the encoder
-// is trusted again.
-
-/**
- * Position is checked every time a new command is executed from the buffer but during long moves,
- * this setting determines the minimum update time between checks. A value of 100 works well with
- * error rolling average when attempting to correct only for skips and not for vibration.
- */
-#define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks.
-
-// Use a rolling average to identify persistent errors that indicate skips, as opposed to vibration and noise.
-#define I2CPE_ERR_ROLLING_AVERAGE
-
-#endif // I2C_POSITION_ENCODERS
-
-/**
- * Analog Joystick(s)
- * @section joystick
- */
-//#define JOYSTICK
-#if ENABLED(JOYSTICK)
-#define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2
-#define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2
-#define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2
-#define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2
-
-//#define INVERT_JOY_X // Enable if X direction is reversed
-//#define INVERT_JOY_Y // Enable if Y direction is reversed
-//#define INVERT_JOY_Z // Enable if Z direction is reversed
-
-// Use M119 with JOYSTICK_DEBUG to find reasonable values after connecting:
-#define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max
-#define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 }
-#define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 }
-//#define JOYSTICK_DEBUG
-#endif
-
-/**
- * Mechanical Gantry Calibration
- * Modern replacement for the Prusa TMC_Z_CALIBRATION.
- * Adds capability to work with any adjustable current drivers.
- * Implemented as G34 because M915 is deprecated.
- * @section calibrate
- */
-//#define MECHANICAL_GANTRY_CALIBRATION
-#if ENABLED(MECHANICAL_GANTRY_CALIBRATION)
-#define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma
-#define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move
-#define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move
-//#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction
-
-//#define GANTRY_CALIBRATION_SAFE_POSITION XY_CENTER // Safe position for nozzle
-//#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM
-//#define GANTRY_CALIBRATION_COMMANDS_PRE ""
-#define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position
+ #define CANCEL_OBJECTS_REPORTING // Emit the current object as a status message
#endif
/**
@@ -4074,61 +2282,10 @@
* Potentially useful for emergency stop that allows being resumed.
* @section interface
*/
-//#define FREEZE_FEATURE
+#define FREEZE_FEATURE
#if ENABLED(FREEZE_FEATURE)
-//#define FREEZE_PIN 41 // Override the default (KILL) pin here
-#define FREEZE_STATE LOW // State of pin indicating freeze
-#endif
-
-/**
- * MAX7219 Debug Matrix
- *
- * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display.
- * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage.
- * @section debug matrix
- */
-//#define MAX7219_DEBUG
-#if ENABLED(MAX7219_DEBUG)
-#define MAX7219_CLK_PIN 64
-#define MAX7219_DIN_PIN 57
-#define MAX7219_LOAD_PIN 44
-
-//#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix
-#define MAX7219_INIT_TEST 2 // Test pattern at startup: 0=none, 1=sweep, 2=spiral
-#define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain.
-#define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°)
-// connector at: right=0 bottom=-90 top=90 left=180
-//#define MAX7219_REVERSE_ORDER // The order of the LED matrix units may be reversed
-//#define MAX7219_REVERSE_EACH // The LEDs in each matrix unit row may be reversed
-//#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side
-
-/**
- * Sample debug features
- * If you add more debug displays, be careful to avoid conflicts!
- */
-#define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning
-#define MAX7219_DEBUG_PLANNER_HEAD 2 // Show the planner queue head position on this and the next LED matrix row
-#define MAX7219_DEBUG_PLANNER_TAIL 4 // Show the planner queue tail position on this and the next LED matrix row
-
-#define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row
-// If you experience stuttering, reboots, etc. this option can reveal how
-// tweaks made to the configuration are affecting the printer in real-time.
-#define MAX7219_DEBUG_PROFILE 6 // Display the fraction of CPU time spent in profiled code on this LED matrix
-// row. By default idle() is profiled so this shows how "idle" the processor is.
-// See class CodeProfiler.
-#endif
-
-/**
- * NanoDLP Sync support
- *
- * Support for Synchronized Z moves when used with NanoDLP. G0/G1 axis moves will
- * output a "Z_move_comp" string to enable synchronization with DLP projector exposure.
- * This feature allows you to use [[WaitForDoneMessage]] instead of M400 commands.
- * @section nanodlp
- */
-//#define NANODLP_Z_SYNC
-#if ENABLED(NANODLP_Z_SYNC)
-//#define NANODLP_ALL_AXIS // Send a "Z_move_comp" report for any axis move (not just Z).
+ #define FREEZE_PIN 41 // Override the default (KILL) pin here
+ #define FREEZE_STATE LOW // State of pin indicating freeze
#endif
/**
@@ -4136,150 +2293,45 @@
* @section network
*/
#if HAS_ETHERNET
-#define MAC_ADDRESS { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D } // A MAC address unique to your network
+ #define MAC_ADDRESS { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D } // A MAC address unique to your network
#endif
/**
* WiFi Support (Espressif ESP32 WiFi)
*/
-//#define WIFISUPPORT // Marlin embedded WiFi managenent
-#define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib)
+//#define WIFISUPPORT // Marlin embedded WiFi management
+// #define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib)
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
-#define WEBSUPPORT // Start a webserver (which may include auto-discovery)
-//#define OTASUPPORT // Support over-the-air firmware updates
-#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host
-#define CUSTOM_SD_ACCESS //Enable another lib accessing the SD card without conflicts
-
-/**
- * To set a default WiFi SSID / Password, create a file called Configuration_Secure.h with
- * the following defines, customized for your network. This specific file is excluded via
- * .gitignore to prevent it from accidentally leaking to the public.
- *
- * #define WIFI_SSID "WiFi SSID"
- * #define WIFI_PWD "WiFi Password"
- */
-//#include "Configuration_Secure.h" // External file with WiFi SSID / Password
-#endif
-
-// @section multi-material
-
-/**
- * Průša Multi-Material Unit (MMU)
- * Enable in Configuration.h
- *
- * These devices allow a single stepper driver on the board to drive
- * multi-material feeders with any number of stepper motors.
- */
-#if HAS_PRUSA_MMU1
-/**
- * This option only allows the multiplexer to switch on tool-change.
- * Additional options to configure custom E moves are pending.
- *
- * Override the default DIO selector pins here, if needed.
- * Some pins files may provide defaults for these pins.
- */
-//#define E_MUX0_PIN 40 // Always Required
-//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
-//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
-#elif HAS_PRUSA_MMU2
-// Serial port used for communication with MMU2.
-#define MMU2_SERIAL_PORT 2
-
-// Use hardware reset for MMU if a pin is defined for it
-//#define MMU2_RST_PIN 23
-
-// Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up)
-//#define MMU2_MODE_12V
-
-// G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout
-#define MMU2_FILAMENT_RUNOUT_SCRIPT "M600"
-
-// Add an LCD menu for MMU2
-//#define MMU2_MENUS
-#if EITHER(MMU2_MENUS, HAS_PRUSA_MMU2S)
-// Settings for filament load / unload from the LCD menu.
-// This is for Průša MK3-style extruders. Customize for your hardware.
-#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
-#define MMU2_LOAD_TO_NOZZLE_SEQUENCE \
- { 7.2, 1145 }, \
- { 14.4, 871 }, \
- { 36.0, 1393 }, \
- { 14.4, 871 }, \
- { 50.0, 198 }
-
-#define MMU2_RAMMING_SEQUENCE \
- { 1.0, 1000 }, \
- { 1.0, 1500 }, \
- { 2.0, 2000 }, \
- { 1.5, 3000 }, \
- { 2.5, 4000 }, \
- { -15.0, 5000 }, \
- { -14.0, 1200 }, \
- { -6.0, 600 }, \
- { 10.0, 700 }, \
- { -10.0, 400 }, \
- { -50.0, 2000 }
-#endif
-
-/**
- * Using a sensor like the MMU2S
- * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S.
- * See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11
- */
-#if HAS_PRUSA_MMU2S
-#define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries)
-
-#define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min)
-#define MMU2_CAN_LOAD_SEQUENCE \
- { 0.1, MMU2_CAN_LOAD_FEEDRATE }, \
- { 60.0, MMU2_CAN_LOAD_FEEDRATE }, \
- { -52.0, MMU2_CAN_LOAD_FEEDRATE }
-
-#define MMU2_CAN_LOAD_RETRACT 6.0 // (mm) Keep under the distance between Load Sequence values
-#define MMU2_CAN_LOAD_DEVIATION 0.8 // (mm) Acceptable deviation
-
-#define MMU2_CAN_LOAD_INCREMENT 0.2 // (mm) To reuse within MMU2 module
-#define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \
- { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE }
-
-#else
-
-/**
- * MMU1 Extruder Sensor
- *
- * Support for a Průša (or other) IR Sensor to detect filament near the extruder
- * and make loading more reliable. Suitable for an extruder equipped with a filament
- * sensor less than 38mm from the gears.
- *
- * During loading the extruder will stop when the sensor is triggered, then do a last
- * move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
- * If all attempts fail, a filament runout will be triggered.
- */
-//#define MMU_EXTRUDER_SENSOR
-#if ENABLED(MMU_EXTRUDER_SENSOR)
-#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
+ #define WEBSUPPORT // Start a webserver (which may include auto-discovery)
+ #define OTASUPPORT // Support over-the-air firmware updates
+ #define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host
+ #define WIFI_SSID ""
+ #define WIFI_PWD ""
+ /**
+ * To set a default WiFi SSID / Password, create a file called Configuration_Secure.h with
+ * the following defines, customized for your network. This specific file is excluded via
+ * .gitignore to prevent it from accidentally leaking to the public.
+ *
+ * #define WIFI_SSID "WiFi SSID"
+ * #define WIFI_PWD "WiFi Password"
+ */
+ //#include "Configuration_Secure.h" // External file with WiFi SSID / Password
#endif
-#endif
-
-//#define MMU2_DEBUG // Write debug info to serial output
-
-#endif // HAS_PRUSA_MMU2
-
/**
* Advanced Print Counter settings
* @section stats
*/
#if ENABLED(PRINTCOUNTER)
-#define SERVICE_WARNING_BUZZES 3
-// Activate up to 3 service interval watchdogs
-//#define SERVICE_NAME_1 "Service S"
-//#define SERVICE_INTERVAL_1 100 // print hours
-//#define SERVICE_NAME_2 "Service L"
-//#define SERVICE_INTERVAL_2 200 // print hours
-//#define SERVICE_NAME_3 "Service 3"
-//#define SERVICE_INTERVAL_3 1 // print hours
+ #define SERVICE_WARNING_BUZZES 3
+ // Activate up to 3 service interval watchdogs
+ //#define SERVICE_NAME_1 "Service S"
+ //#define SERVICE_INTERVAL_1 100 // print hours
+ //#define SERVICE_NAME_2 "Service L"
+ //#define SERVICE_INTERVAL_2 200 // print hours
+ //#define SERVICE_NAME_3 "Service 3"
+ //#define SERVICE_INTERVAL_3 1 // print hours
#endif
// @section develop
@@ -4287,17 +2339,17 @@
//
// M100 Free Memory Watcher to debug memory usage
//
-//#define M100_FREE_MEMORY_WATCHER
+// #define M100_FREE_MEMORY_WATCHER
//
// M42 - Set pin states
//
-//#define DIRECT_PIN_CONTROL
+#define DIRECT_PIN_CONTROL
//
// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe
//
-//#define PINS_DEBUGGING
+#define PINS_DEBUGGING
// Enable Tests that will run at startup and produce a report
//#define MARLIN_TEST_BUILD
@@ -4306,11 +2358,11 @@
//#define MARLIN_DEV_MODE
#if ENABLED(MARLIN_DEV_MODE)
-/**
- * D576 - Buffer Monitoring
- * To help diagnose print quality issues stemming from empty command buffers.
- */
-//#define BUFFER_MONITORING
+ /**
+ * D576 - Buffer Monitoring
+ * To help diagnose print quality issues stemming from empty command buffers.
+ */
+ //#define BUFFER_MONITORING
#endif
/**
@@ -4323,8 +2375,551 @@
/**
* Software Reset options
*/
-//#define SOFT_RESET_VIA_SERIAL // 'KILL' and '^X' commands will soft-reset the controller
+// #define SOFT_RESET_VIA_SERIAL // 'KILL' and '^X' commands will soft-reset the controller
//#define SOFT_RESET_ON_KILL // Use a digital button to soft-reset the controller after KILL
// Report uncleaned reset reason from register r2 instead of MCUSR. Supported by Optiboot on AVR.
//#define OPTIBOOT_RESET_REASON
+
+//MDNS_FEATURE: this feature allow type the name defined
+//in web browser by default: http:\\marlinesp.local and connect
+#define DISABLE_MDNS_FEATURE
+
+//SSDD_FEATURE: this feature is a discovery protocol, supported on Windows out of the box
+//Rely on Configuration_adv.h
+#define DISABLE_SSDP_FEATURE
+
+// @section tmc_smart
+
+/**
+ * Trinamic Smart Drivers
+ *
+ * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
+ * - Connect your SPI pins to the Hardware SPI interface on the board.
+ * Some boards have simple jumper connections! See your board's documentation.
+ * - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
+ * (See the RAMPS pins, for example.)
+ * - You can also use Software SPI with GPIO pins instead of Hardware SPI.
+ *
+ * To use TMC220x stepper drivers with Serial UART:
+ * - Connect PDN_UART to the #_SERIAL_TX_PIN through a 1K resistor.
+ * For reading capabilities also connect PDN_UART to #_SERIAL_RX_PIN with no resistor.
+ * Some boards have simple jumper connections! See your board's documentation.
+ * - These drivers can also be used with Hardware Serial.
+ *
+ * The TMC26XStepper library is required for TMC26X stepper drivers.
+ * https://github.com/MarlinFirmware/TMC26XStepper
+ *
+ * The TMCStepper library is required for other TMC stepper drivers.
+ * https://github.com/teemuatlut/TMCStepper
+ *
+ * @section tmc/config
+ */
+#if HAS_TRINAMIC_CONFIG || HAS_TMC26X
+
+ #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
+
+ /**
+ * Interpolate microsteps to 256
+ * Override for each driver with _INTERPOLATE settings below
+ */
+ #define INTERPOLATE true
+
+ #if AXIS_IS_TMC_CONFIG(X)
+ #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
+ #define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing
+ #define X_MICROSTEPS 16 // 0..256
+ #define X_RSENSE 0.11 // Multiplied x1000 for TMC26X
+ #define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ...
+ //#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis
+ //#define X_HOLD_MULTIPLIER 0.5 // Enable to override 'HOLD_MULTIPLIER' for the X axis
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(X2)
+ #define X2_CURRENT 800
+ #define X2_CURRENT_HOME X2_CURRENT
+ #define X2_MICROSTEPS X_MICROSTEPS
+ #define X2_RSENSE 0.11
+ #define X2_CHAIN_POS -1
+ //#define X2_INTERPOLATE true
+ //#define X2_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(Y)
+ #define Y_CURRENT 800
+ #define Y_CURRENT_HOME Y_CURRENT
+ #define Y_MICROSTEPS 16
+ #define Y_RSENSE 0.11
+ #define Y_CHAIN_POS -1
+ //#define Y_INTERPOLATE true
+ //#define Y_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(Y2)
+ #define Y2_CURRENT 800
+ #define Y2_CURRENT_HOME Y2_CURRENT
+ #define Y2_MICROSTEPS Y_MICROSTEPS
+ #define Y2_RSENSE 0.11
+ #define Y2_CHAIN_POS -1
+ //#define Y2_INTERPOLATE true
+ //#define Y2_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(Z)
+ #define Z_CURRENT 800
+ #define Z_CURRENT_HOME Z_CURRENT
+ #define Z_MICROSTEPS 16
+ #define Z_RSENSE 0.11
+ #define Z_CHAIN_POS -1
+ //#define Z_INTERPOLATE true
+ //#define Z_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(Z2)
+ #define Z2_CURRENT 800
+ #define Z2_CURRENT_HOME Z2_CURRENT
+ #define Z2_MICROSTEPS Z_MICROSTEPS
+ #define Z2_RSENSE 0.11
+ #define Z2_CHAIN_POS -1
+ //#define Z2_INTERPOLATE true
+ //#define Z2_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(Z3)
+ #define Z3_CURRENT 800
+ #define Z3_CURRENT_HOME Z3_CURRENT
+ #define Z3_MICROSTEPS Z_MICROSTEPS
+ #define Z3_RSENSE 0.11
+ #define Z3_CHAIN_POS -1
+ //#define Z3_INTERPOLATE true
+ //#define Z3_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(Z4)
+ #define Z4_CURRENT 800
+ #define Z4_CURRENT_HOME Z4_CURRENT
+ #define Z4_MICROSTEPS Z_MICROSTEPS
+ #define Z4_RSENSE 0.11
+ #define Z4_CHAIN_POS -1
+ //#define Z4_INTERPOLATE true
+ //#define Z4_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(I)
+ #define I_CURRENT 800
+ #define I_CURRENT_HOME I_CURRENT
+ #define I_MICROSTEPS 16
+ #define I_RSENSE 0.11
+ #define I_CHAIN_POS -1
+ //#define I_INTERPOLATE true
+ //#define I_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(J)
+ #define J_CURRENT 800
+ #define J_CURRENT_HOME J_CURRENT
+ #define J_MICROSTEPS 16
+ #define J_RSENSE 0.11
+ #define J_CHAIN_POS -1
+ //#define J_INTERPOLATE true
+ //#define J_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(K)
+ #define K_CURRENT 800
+ #define K_CURRENT_HOME K_CURRENT
+ #define K_MICROSTEPS 16
+ #define K_RSENSE 0.11
+ #define K_CHAIN_POS -1
+ //#define K_INTERPOLATE true
+ //#define K_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(U)
+ #define U_CURRENT 800
+ #define U_CURRENT_HOME U_CURRENT
+ #define U_MICROSTEPS 8
+ #define U_RSENSE 0.11
+ #define U_CHAIN_POS -1
+ //#define U_INTERPOLATE true
+ //#define U_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(V)
+ #define V_CURRENT 800
+ #define V_CURRENT_HOME V_CURRENT
+ #define V_MICROSTEPS 8
+ #define V_RSENSE 0.11
+ #define V_CHAIN_POS -1
+ //#define V_INTERPOLATE true
+ //#define V_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(W)
+ #define W_CURRENT 800
+ #define W_CURRENT_HOME W_CURRENT
+ #define W_MICROSTEPS 8
+ #define W_RSENSE 0.11
+ #define W_CHAIN_POS -1
+ //#define W_INTERPOLATE true
+ //#define W_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E0)
+ #define E0_CURRENT 800
+ #define E0_MICROSTEPS 16
+ #define E0_RSENSE 0.11
+ #define E0_CHAIN_POS -1
+ //#define E0_INTERPOLATE true
+ //#define E0_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E1)
+ #define E1_CURRENT 800
+ #define E1_MICROSTEPS E0_MICROSTEPS
+ #define E1_RSENSE 0.11
+ #define E1_CHAIN_POS -1
+ //#define E1_INTERPOLATE true
+ //#define E1_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E2)
+ #define E2_CURRENT 800
+ #define E2_MICROSTEPS E0_MICROSTEPS
+ #define E2_RSENSE 0.11
+ #define E2_CHAIN_POS -1
+ //#define E2_INTERPOLATE true
+ //#define E2_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E3)
+ #define E3_CURRENT 800
+ #define E3_MICROSTEPS E0_MICROSTEPS
+ #define E3_RSENSE 0.11
+ #define E3_CHAIN_POS -1
+ //#define E3_INTERPOLATE true
+ //#define E3_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E4)
+ #define E4_CURRENT 800
+ #define E4_MICROSTEPS E0_MICROSTEPS
+ #define E4_RSENSE 0.11
+ #define E4_CHAIN_POS -1
+ //#define E4_INTERPOLATE true
+ //#define E4_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E5)
+ #define E5_CURRENT 800
+ #define E5_MICROSTEPS E0_MICROSTEPS
+ #define E5_RSENSE 0.11
+ #define E5_CHAIN_POS -1
+ //#define E5_INTERPOLATE true
+ //#define E5_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E6)
+ #define E6_CURRENT 800
+ #define E6_MICROSTEPS E0_MICROSTEPS
+ #define E6_RSENSE 0.11
+ #define E6_CHAIN_POS -1
+ //#define E6_INTERPOLATE true
+ //#define E6_HOLD_MULTIPLIER 0.5
+ #endif
+
+ #if AXIS_IS_TMC_CONFIG(E7)
+ #define E7_CURRENT 800
+ #define E7_MICROSTEPS E0_MICROSTEPS
+ #define E7_RSENSE 0.11
+ #define E7_CHAIN_POS -1
+ //#define E7_INTERPOLATE true
+ //#define E7_HOLD_MULTIPLIER 0.5
+ #endif
+// @section tmc/spi
+
+ /**
+ * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
+ * The default pins can be found in your board's pins file.
+ */
+ //#define X_CS_PIN -1
+ //#define Y_CS_PIN -1
+ //#define Z_CS_PIN -1
+ //#define X2_CS_PIN -1
+ //#define Y2_CS_PIN -1
+ //#define Z2_CS_PIN -1
+ //#define Z3_CS_PIN -1
+ //#define Z4_CS_PIN -1
+ //#define I_CS_PIN -1
+ //#define J_CS_PIN -1
+ //#define K_CS_PIN -1
+ //#define U_CS_PIN -1
+ //#define V_CS_PIN -1
+ //#define W_CS_PIN -1
+ //#define E0_CS_PIN -1
+ //#define E1_CS_PIN -1
+ //#define E2_CS_PIN -1
+ //#define E3_CS_PIN -1
+ //#define E4_CS_PIN -1
+ //#define E5_CS_PIN -1
+ //#define E6_CS_PIN -1
+ //#define E7_CS_PIN -1
+
+ /**
+ * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
+ * The default SW SPI pins are defined the respective pins files,
+ * but you can override or define them here.
+ */
+ //#define TMC_USE_SW_SPI
+ //#define TMC_SW_MOSI -1
+ //#define TMC_SW_MISO -1
+ //#define TMC_SW_SCK -1
+
+ // @section tmc/serial
+
+ /**
+ * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses.
+ * Set the address using jumpers on pins MS1 and MS2.
+ * Address | MS1 | MS2
+ * 0 | LOW | LOW
+ * 1 | HIGH | LOW
+ * 2 | LOW | HIGH
+ * 3 | HIGH | HIGH
+ *
+ * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers
+ * on the same serial port, either here or in your board's pins file.
+ */
+ //#define X_SLAVE_ADDRESS 0
+ //#define Y_SLAVE_ADDRESS 0
+ //#define Z_SLAVE_ADDRESS 0
+ //#define X2_SLAVE_ADDRESS 0
+ //#define Y2_SLAVE_ADDRESS 0
+ //#define Z2_SLAVE_ADDRESS 0
+ //#define Z3_SLAVE_ADDRESS 0
+ //#define Z4_SLAVE_ADDRESS 0
+ //#define I_SLAVE_ADDRESS 0
+ //#define J_SLAVE_ADDRESS 0
+ //#define K_SLAVE_ADDRESS 0
+ //#define U_SLAVE_ADDRESS 0
+ //#define V_SLAVE_ADDRESS 0
+ //#define W_SLAVE_ADDRESS 0
+ //#define E0_SLAVE_ADDRESS 0
+ //#define E1_SLAVE_ADDRESS 0
+ //#define E2_SLAVE_ADDRESS 0
+ //#define E3_SLAVE_ADDRESS 0
+ //#define E4_SLAVE_ADDRESS 0
+ //#define E5_SLAVE_ADDRESS 0
+ //#define E6_SLAVE_ADDRESS 0
+ //#define E7_SLAVE_ADDRESS 0
+
+ // @section tmc/smart
+
+ /**
+ * Software enable
+ *
+ * Use for drivers that do not use a dedicated enable pin, but rather handle the same
+ * function through a communication line such as SPI or UART.
+ */
+ //#define SOFTWARE_DRIVER_ENABLE
+
+ // @section tmc/stealthchop
+
+ /**
+ * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
+ * Use Trinamic's ultra quiet stepping mode.
+ * When disabled, Marlin will use spreadCycle stepping mode.
+ */
+ #if HAS_STEALTHCHOP
+ #define STEALTHCHOP_XY
+ #define STEALTHCHOP_Z
+ #define STEALTHCHOP_I
+ #define STEALTHCHOP_J
+ #define STEALTHCHOP_K
+ #define STEALTHCHOP_U
+ #define STEALTHCHOP_V
+ #define STEALTHCHOP_W
+ #define STEALTHCHOP_E
+ #endif
+
+ /**
+ * Optimize spreadCycle chopper parameters by using predefined parameter sets
+ * or with the help of an example included in the library.
+ * Provided parameter sets are
+ * CHOPPER_DEFAULT_12V
+ * CHOPPER_DEFAULT_19V
+ * CHOPPER_DEFAULT_24V
+ * CHOPPER_DEFAULT_36V
+ * CHOPPER_09STEP_24V // 0.9 degree steppers (24V)
+ * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V)
+ * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9
+ *
+ * Define your own with:
+ * { , , hysteresis_start[1..8] }
+ */
+ #define CHOPPER_TIMING CHOPPER_DEFAULT_24V // All axes (override below)
+ //#define CHOPPER_TIMING_X CHOPPER_TIMING // For X Axes (override below)
+ //#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X
+ //#define CHOPPER_TIMING_Y CHOPPER_TIMING // For Y Axes (override below)
+ //#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y
+ //#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below)
+ //#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z
+ //#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z
+ //#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z
+ //#define CHOPPER_TIMING_I CHOPPER_TIMING // For I Axis
+ //#define CHOPPER_TIMING_J CHOPPER_TIMING // For J Axis
+ //#define CHOPPER_TIMING_K CHOPPER_TIMING // For K Axis
+ //#define CHOPPER_TIMING_U CHOPPER_TIMING // For U Axis
+ //#define CHOPPER_TIMING_V CHOPPER_TIMING // For V Axis
+ //#define CHOPPER_TIMING_W CHOPPER_TIMING // For W Axis
+ //#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below)
+ //#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E
+ //#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E
+ //#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E
+ //#define CHOPPER_TIMING_E4 CHOPPER_TIMING_E
+ //#define CHOPPER_TIMING_E5 CHOPPER_TIMING_E
+ //#define CHOPPER_TIMING_E6 CHOPPER_TIMING_E
+ //#define CHOPPER_TIMING_E7 CHOPPER_TIMING_E
+
+ // @section tmc/status
+
+ /**
+ * Monitor Trinamic drivers
+ * for error conditions like overtemperature and short to ground.
+ * To manage over-temp Marlin can decrease the driver current until the error condition clears.
+ * Other detected conditions can be used to stop the current print.
+ * Relevant G-codes:
+ * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given.
+ * M911 - Report stepper driver overtemperature pre-warn condition.
+ * M912 - Clear stepper driver overtemperature pre-warn condition flag.
+ * M122 - Report driver parameters (Requires TMC_DEBUG)
+ */
+ #define MONITOR_DRIVER_STATUS
+
+ #if ENABLED(MONITOR_DRIVER_STATUS)
+ #define CURRENT_STEP_DOWN 50 // [mA]
+ #define REPORT_CURRENT_CHANGE
+ #define STOP_ON_ERROR
+ #endif
+
+ // @section tmc/hybrid
+
+ /**
+ * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
+ * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
+ * This mode allows for faster movements at the expense of higher noise levels.
+ * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
+ * M913 X/Y/Z/E to live tune the setting
+ */
+ //#define HYBRID_THRESHOLD
+
+ #define X_HYBRID_THRESHOLD 100 // [mm/s]
+ #define X2_HYBRID_THRESHOLD 100
+ #define Y_HYBRID_THRESHOLD 100
+ #define Y2_HYBRID_THRESHOLD 100
+ #define Z_HYBRID_THRESHOLD 3
+ #define Z2_HYBRID_THRESHOLD 3
+ #define Z3_HYBRID_THRESHOLD 3
+ #define Z4_HYBRID_THRESHOLD 3
+ #define I_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s]
+ #define J_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s]
+ #define K_HYBRID_THRESHOLD 3 // [linear=mm/s, rotational=°/s]
+ #define U_HYBRID_THRESHOLD 3 // [mm/s]
+ #define V_HYBRID_THRESHOLD 3
+ #define W_HYBRID_THRESHOLD 3
+ #define E0_HYBRID_THRESHOLD 30
+ #define E1_HYBRID_THRESHOLD 30
+ #define E2_HYBRID_THRESHOLD 30
+ #define E3_HYBRID_THRESHOLD 30
+ #define E4_HYBRID_THRESHOLD 30
+ #define E5_HYBRID_THRESHOLD 30
+ #define E6_HYBRID_THRESHOLD 30
+ #define E7_HYBRID_THRESHOLD 30
+
+ /**
+ * Use StallGuard to home / probe X, Y, Z.
+ *
+ * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
+ * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
+ * X, Y, and Z homing will always be done in spreadCycle mode.
+ *
+ * X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
+ * Use M914 X Y Z to set the stall threshold at runtime:
+ *
+ * Sensitivity TMC2209 Others
+ * HIGHEST 255 -64 (Too sensitive => False positive)
+ * LOWEST 0 63 (Too insensitive => No trigger)
+ *
+ * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
+ *
+ * SPI_ENDSTOPS *** Beta feature! *** TMC2130/TMC5160 Only ***
+ * Poll the driver through SPI to determine load when homing.
+ * Removes the need for a wire from DIAG1 to an endstop pin.
+ *
+ * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when
+ * homing and adds a guard period for endstop triggering.
+ *
+ * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis.
+ * @section tmc/stallguard
+ */
+ #define SENSORLESS_HOMING // StallGuard capable drivers only
+
+ #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING)
+ // TMC2209: 0...255. TMC2130: -64...63
+ #define X_STALL_SENSITIVITY 8
+ #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY
+ #define Y_STALL_SENSITIVITY 8
+ #define Y2_STALL_SENSITIVITY Y_STALL_SENSITIVITY
+ //#define Z_STALL_SENSITIVITY 8
+ //#define Z2_STALL_SENSITIVITY Z_STALL_SENSITIVITY
+ //#define Z3_STALL_SENSITIVITY Z_STALL_SENSITIVITY
+ //#define Z4_STALL_SENSITIVITY Z_STALL_SENSITIVITY
+ //#define I_STALL_SENSITIVITY 8
+ //#define J_STALL_SENSITIVITY 8
+ //#define K_STALL_SENSITIVITY 8
+ //#define U_STALL_SENSITIVITY 8
+ //#define V_STALL_SENSITIVITY 8
+ //#define W_STALL_SENSITIVITY 8
+ //#define SPI_ENDSTOPS // TMC2130 only
+ //#define IMPROVE_HOMING_RELIABILITY
+ #endif
+
+ // @section tmc/config
+
+ /**
+ * TMC Homing stepper phase.
+ *
+ * Improve homing repeatability by homing to stepper coil's nearest absolute
+ * phase position. Trinamic drivers use a stepper phase table with 1024 values
+ * spanning 4 full steps with 256 positions each (ergo, 1024 positions).
+ * Full step positions (128, 384, 640, 896) have the highest holding torque.
+ *
+ * Values from 0..1023, -1 to disable homing phase for that axis.
+ */
+ //#define TMC_HOME_PHASE { 896, 896, 896 }
+
+ /**
+ * Beta feature!
+ * Create a 50/50 square wave step pulse optimal for stepper drivers.
+ */
+ #define SQUARE_WAVE_STEPPING
+
+ /**
+ * Enable M122 debugging command for TMC stepper drivers.
+ * M122 S0/1 will enable continuous reporting.
+ */
+ #define TMC_DEBUG
+
+ /**
+ * You can set your own advanced settings by filling in predefined functions.
+ * A list of available functions can be found on the library github page
+ * https://github.com/teemuatlut/TMCStepper
+ *
+ * Example:
+ * #define TMC_ADV() { \
+ * stepperX.diag0_otpw(1); \
+ * stepperY.intpol(0); \
+ * }
+ */
+ #define TMC_ADV() { }
+
+#endif // HAS_TRINAMIC_CONFIG || HAS_TMC26X
diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp
deleted file mode 100644
index 5382eb36a2bd..000000000000
--- a/Marlin/src/HAL/AVR/HAL.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#ifdef __AVR__
-
-#include "../../inc/MarlinConfig.h"
-#include "HAL.h"
-#include
-
-#ifdef USBCON
- DefaultSerial1 MSerial0(false, Serial);
- #ifdef BLUETOOTH
- BTSerial btSerial(false, bluetoothSerial);
- #endif
-#endif
-
-// ------------------------
-// Public Variables
-// ------------------------
-
-// Don't initialize/override variable (which would happen in .init4)
-uint8_t MarlinHAL::reset_reason __attribute__((section(".noinit")));
-
-// ------------------------
-// Public functions
-// ------------------------
-
-__attribute__((naked)) // Don't output function pro- and epilogue
-__attribute__((used)) // Output the function, even if "not used"
-__attribute__((section(".init3"))) // Put in an early user definable section
-void save_reset_reason() {
- #if ENABLED(OPTIBOOT_RESET_REASON)
- __asm__ __volatile__(
- A("STS %0, r2")
- : "=m"(hal.reset_reason)
- );
- #else
- hal.reset_reason = MCUSR;
- #endif
-
- // Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop
- hal.clear_reset_source();
- wdt_disable();
-}
-
-void MarlinHAL::init() {
- // Init Servo Pins
- #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
- #if HAS_SERVO_0
- INIT_SERVO(0);
- #endif
- #if HAS_SERVO_1
- INIT_SERVO(1);
- #endif
- #if HAS_SERVO_2
- INIT_SERVO(2);
- #endif
- #if HAS_SERVO_3
- INIT_SERVO(3);
- #endif
-
- init_pwm_timers(); // Init user timers to default frequency - 1000HZ
-}
-
-void MarlinHAL::reboot() {
- #if ENABLED(USE_WATCHDOG)
- while (1) { /* run out the watchdog */ }
- #else
- void (*resetFunc)() = 0; // Declare resetFunc() at address 0
- resetFunc(); // Jump to address 0
- #endif
-}
-
-// ------------------------
-// Watchdog Timer
-// ------------------------
-
-#if ENABLED(USE_WATCHDOG)
-
- #include
- #include "../../MarlinCore.h"
-
- // Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
- void MarlinHAL::watchdog_init() {
- #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
- #define WDTO_NS WDTO_8S
- #else
- #define WDTO_NS WDTO_4S
- #endif
- #if ENABLED(WATCHDOG_RESET_MANUAL)
- // Enable the watchdog timer, but only for the interrupt.
- // Take care, as this requires the correct order of operation, with interrupts disabled.
- // See the datasheet of any AVR chip for details.
- wdt_reset();
- cli();
- _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
- _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
- // So worked for up to WDTO_2S
- sei();
- wdt_reset();
- #else
- wdt_enable(WDTO_NS); // The function handles the upper bit correct.
- #endif
- //delay(10000); // test it!
- }
-
- //===========================================================================
- //=================================== ISR ===================================
- //===========================================================================
-
- // Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
- #if ENABLED(WATCHDOG_RESET_MANUAL)
- ISR(WDT_vect) {
- sei(); // With the interrupt driven serial we need to allow interrupts.
- SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
- minkill(); // interrupt-safe final kill and infinite loop
- }
- #endif
-
- // Reset watchdog. MUST be called at least every 4 seconds after the
- // first watchdog_init or AVR will go into emergency procedures.
- void MarlinHAL::watchdog_refresh() { wdt_reset(); }
-
-#endif // USE_WATCHDOG
-
-// ------------------------
-// Free Memory Accessor
-// ------------------------
-
-#if ENABLED(SDSUPPORT)
-
- #include "../../sd/SdFatUtil.h"
- int freeMemory() { return SdFatUtil::FreeRam(); }
-
-#else // !SDSUPPORT
-
- extern "C" {
- extern char __bss_end;
- extern char __heap_start;
- extern void* __brkval;
-
- int freeMemory() {
- int free_memory;
- if ((int)__brkval == 0)
- free_memory = ((int)&free_memory) - ((int)&__bss_end);
- else
- free_memory = ((int)&free_memory) - ((int)__brkval);
- return free_memory;
- }
- }
-
-#endif // !SDSUPPORT
-
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h
deleted file mode 100644
index 149186772158..000000000000
--- a/Marlin/src/HAL/AVR/HAL.h
+++ /dev/null
@@ -1,277 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- *
- * 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 .
- *
- */
-#pragma once
-
-/**
- * HAL for Arduino AVR
- */
-
-#include "../shared/Marduino.h"
-#include "../shared/HAL_SPI.h"
-#include "fastio.h"
-#include "math.h"
-
-#ifdef USBCON
- #include
-#else
- #include "MarlinSerial.h"
-#endif
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-//
-// Default graphical display delays
-//
-#if F_CPU >= 20000000
- #define CPU_ST7920_DELAY_1 150
- #define CPU_ST7920_DELAY_2 0
- #define CPU_ST7920_DELAY_3 150
-#elif F_CPU == 16000000
- #define CPU_ST7920_DELAY_1 125
- #define CPU_ST7920_DELAY_2 0
- #define CPU_ST7920_DELAY_3 188
-#endif
-
-#ifndef pgm_read_ptr
- // Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for
- // Windows Subsystem for Linux on Windows 10 as of 10/18/2019
- #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long))
- #define pgm_read_ptr_near(address_short) (void*)__LPM_word((uint16_t)(address_short))
- #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short)
-#endif
-
-// ------------------------
-// Defines
-// ------------------------
-
-// AVR PROGMEM extension for sprintf_P
-#define S_FMT "%S"
-
-// AVR PROGMEM extension for string define
-#define PGMSTR(NAM,STR) const char NAM[] PROGMEM = STR
-
-#ifndef CRITICAL_SECTION_START
- #define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli()
- #define CRITICAL_SECTION_END() SREG = _sreg
-#endif
-
-#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
-#define PWM_FREQUENCY 1000 // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
-
-// ------------------------
-// Types
-// ------------------------
-
-typedef int8_t pin_t;
-
-#define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
-
-class Servo;
-typedef Servo hal_servo_t;
-
-// ------------------------
-// Serial ports
-// ------------------------
-
-#ifdef USBCON
- #include "../../core/serial_hook.h"
- typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
- extern DefaultSerial1 MSerial0;
- #ifdef BLUETOOTH
- typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial;
- extern BTSerial btSerial;
- #endif
-
- #define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
-#else
- #if !WITHIN(SERIAL_PORT, -1, 3)
- #error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
- #endif
- #define MYSERIAL1 customizedSerial1
-
- #ifdef SERIAL_PORT_2
- #if !WITHIN(SERIAL_PORT_2, -1, 3)
- #error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
- #endif
- #define MYSERIAL2 customizedSerial2
- #endif
-
- #ifdef SERIAL_PORT_3
- #if !WITHIN(SERIAL_PORT_3, -1, 3)
- #error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
- #endif
- #define MYSERIAL3 customizedSerial3
- #endif
-#endif
-
-#ifdef MMU2_SERIAL_PORT
- #if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
- #error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
- #endif
- #define MMU2_SERIAL mmuSerial
-#endif
-
-#ifdef LCD_SERIAL_PORT
- #if !WITHIN(LCD_SERIAL_PORT, -1, 3)
- #error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
- #endif
- #define LCD_SERIAL lcdSerial
- #if HAS_DGUS_LCD
- #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
- #endif
-#endif
-
-//
-// ADC
-//
-#define HAL_ADC_VREF 5.0
-#define HAL_ADC_RESOLUTION 10
-
-//
-// Pin Mapping for M42, M43, M226
-//
-#define GET_PIN_MAP_PIN(index) index
-#define GET_PIN_MAP_INDEX(pin) pin
-#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
-
-#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
-
-// ------------------------
-// Free Memory Accessor
-// ------------------------
-
-#pragma GCC diagnostic push
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic ignored "-Wunused-function"
-#endif
-
-extern "C" int freeMemory();
-
-#pragma GCC diagnostic pop
-
-// ------------------------
-// MarlinHAL Class
-// ------------------------
-
-class MarlinHAL {
-public:
-
- // Earliest possible init, before setup()
- MarlinHAL() {}
-
- // Watchdog
- static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
- static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
-
- static void init(); // Called early in setup()
- static void init_board() {} // Called less early in setup()
- static void reboot(); // Restart the firmware from 0x0
-
- // Interrupts
- static bool isr_state() { return TEST(SREG, SREG_I); }
- static void isr_on() { sei(); }
- static void isr_off() { cli(); }
-
- static void delay_ms(const int ms) { _delay_ms(ms); }
-
- // Tasks, called from idle()
- static void idletask() {}
-
- // Reset
- static uint8_t reset_reason;
- static uint8_t get_reset_source() { return reset_reason; }
- static void clear_reset_source() { MCUSR = 0; }
-
- // Free SRAM
- static int freeMemory() { return ::freeMemory(); }
-
- //
- // ADC Methods
- //
-
- // Called by Temperature::init once at startup
- static void adc_init() {
- ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07;
- DIDR0 = 0;
- #ifdef DIDR2
- DIDR2 = 0;
- #endif
- }
-
- // Called by Temperature::init for each sensor at startup
- static void adc_enable(const uint8_t ch) {
- #ifdef DIDR2
- if (ch > 7) { SBI(DIDR2, ch & 0x07); return; }
- #endif
- SBI(DIDR0, ch);
- }
-
- // Begin ADC sampling on the given channel. Called from Temperature::isr!
- static void adc_start(const uint8_t ch) {
- #ifdef MUX5
- ADCSRB = ch > 7 ? _BV(MUX5) : 0;
- #else
- ADCSRB = 0;
- #endif
- ADMUX = _BV(REFS0) | (ch & 0x07);
- SBI(ADCSRA, ADSC);
- }
-
- // Is the ADC ready for reading?
- static bool adc_ready() { return !TEST(ADCSRA, ADSC); }
-
- // The current value of the ADC register
- static __typeof__(ADC) adc_value() { return ADC; }
-
- /**
- * init_pwm_timers
- * Set the default frequency for timers 2-5 to 1000HZ
- */
- static void init_pwm_timers();
-
- /**
- * Set the PWM duty cycle for the pin to the given value.
- * Optionally invert the duty cycle [default = false]
- * Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
- */
- static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
-
- /**
- * Set the frequency of the timer for the given pin as close as
- * possible to the provided desired frequency. Internally calculate
- * the required waveform generation mode, prescaler, and resolution
- * values and set timer registers accordingly.
- * NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B)
- * NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST_PWM_FAN Settings)
- */
- static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
-};
diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp
deleted file mode 100644
index dc98f2f79e71..000000000000
--- a/Marlin/src/HAL/AVR/HAL_SPI.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Adapted from Arduino Sd2Card Library
- * Copyright (c) 2009 by William Greiman
- */
-
-/**
- * HAL for AVR - SPI functions
- */
-
-#ifdef __AVR__
-
-#include "../../inc/MarlinConfig.h"
-
-void spiBegin() {
- #if PIN_EXISTS(SD_SS)
- // Do not init HIGH for boards with pin 4 used as Fans or Heaters or otherwise, not likely to have multiple SPI devices anyway.
- #if defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
- // SS must be in output mode even it is not chip select
- SET_OUTPUT(SD_SS_PIN);
- #else
- // set SS high - may be chip select for another SPI device
- OUT_WRITE(SD_SS_PIN, HIGH);
- #endif
- #endif
- SET_OUTPUT(SD_SCK_PIN);
- SET_INPUT(SD_MISO_PIN);
- SET_OUTPUT(SD_MOSI_PIN);
-
- IF_DISABLED(SOFTWARE_SPI, spiInit(SPI_HALF_SPEED));
-}
-
-#if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI)
-
- // ------------------------
- // Hardware SPI
- // ------------------------
-
- // make sure SPCR rate is in expected bits
- #if (SPR0 != 0 || SPR1 != 1)
- #error "unexpected SPCR bits"
- #endif
-
- /**
- * Initialize hardware SPI
- * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6]
- */
- void spiInit(uint8_t spiRate) {
- // See avr processor documentation
- CBI(
- #ifdef PRR
- PRR
- #elif defined(PRR0)
- PRR0
- #endif
- , PRSPI
- );
-
- SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
- SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
- }
-
- /** SPI receive a byte */
- uint8_t spiRec() {
- SPDR = 0xFF;
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- return SPDR;
- }
-
- /** SPI read data */
- void spiRead(uint8_t *buf, uint16_t nbyte) {
- if (nbyte-- == 0) return;
- SPDR = 0xFF;
- for (uint16_t i = 0; i < nbyte; i++) {
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- buf[i] = SPDR;
- SPDR = 0xFF;
- }
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- buf[nbyte] = SPDR;
- }
-
- /** SPI send a byte */
- void spiSend(uint8_t b) {
- SPDR = b;
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- }
-
- /** SPI send block */
- void spiSendBlock(uint8_t token, const uint8_t *buf) {
- SPDR = token;
- for (uint16_t i = 0; i < 512; i += 2) {
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- SPDR = buf[i];
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- SPDR = buf[i + 1];
- }
- while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
- }
-
-
- /** begin spi transaction */
- void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
- // Based on Arduino SPI library
- // Clock settings are defined as follows. Note that this shows SPI2X
- // inverted, so the bits form increasing numbers. Also note that
- // fosc/64 appears twice
- // SPR1 SPR0 ~SPI2X Freq
- // 0 0 0 fosc/2
- // 0 0 1 fosc/4
- // 0 1 0 fosc/8
- // 0 1 1 fosc/16
- // 1 0 0 fosc/32
- // 1 0 1 fosc/64
- // 1 1 0 fosc/64
- // 1 1 1 fosc/128
-
- // We find the fastest clock that is less than or equal to the
- // given clock rate. The clock divider that results in clock_setting
- // is 2 ^^ (clock_div + 1). If nothing is slow enough, we'll use the
- // slowest (128 == 2 ^^ 7, so clock_div = 6).
- uint8_t clockDiv;
-
- // When the clock is known at compiletime, use this if-then-else
- // cascade, which the compiler knows how to completely optimize
- // away. When clock is not known, use a loop instead, which generates
- // shorter code.
- if (__builtin_constant_p(spiClock)) {
- if (spiClock >= F_CPU / 2) clockDiv = 0;
- else if (spiClock >= F_CPU / 4) clockDiv = 1;
- else if (spiClock >= F_CPU / 8) clockDiv = 2;
- else if (spiClock >= F_CPU / 16) clockDiv = 3;
- else if (spiClock >= F_CPU / 32) clockDiv = 4;
- else if (spiClock >= F_CPU / 64) clockDiv = 5;
- else clockDiv = 6;
- }
- else {
- uint32_t clockSetting = F_CPU / 2;
- clockDiv = 0;
- while (clockDiv < 6 && spiClock < clockSetting) {
- clockSetting /= 2;
- clockDiv++;
- }
- }
-
- // Compensate for the duplicate fosc/64
- if (clockDiv == 6) clockDiv = 7;
-
- // Invert the SPI2X bit
- clockDiv ^= 0x1;
-
- SPCR = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) |
- (dataMode << CPHA) | ((clockDiv >> 1) << SPR0);
- SPSR = clockDiv | 0x01;
- }
-
-
-#else // SOFTWARE_SPI || FORCE_SOFT_SPI
-
- // ------------------------
- // Software SPI
- // ------------------------
-
- // nop to tune soft SPI timing
- #define nop asm volatile ("\tnop\n")
-
- void spiInit(uint8_t) { /* do nothing */ }
-
- // Begin SPI transaction, set clock, bit order, data mode
- void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ }
-
- // Soft SPI receive byte
- uint8_t spiRec() {
- uint8_t data = 0;
- // no interrupts during byte receive - about 8µs
- cli();
- // output pin high - like sending 0xFF
- WRITE(SD_MOSI_PIN, HIGH);
-
- LOOP_L_N(i, 8) {
- WRITE(SD_SCK_PIN, HIGH);
-
- nop; // adjust so SCK is nice
- nop;
-
- data <<= 1;
-
- if (READ(SD_MISO_PIN)) data |= 1;
-
- WRITE(SD_SCK_PIN, LOW);
- }
-
- sei();
- return data;
- }
-
- // Soft SPI read data
- void spiRead(uint8_t *buf, uint16_t nbyte) {
- for (uint16_t i = 0; i < nbyte; i++)
- buf[i] = spiRec();
- }
-
- // Soft SPI send byte
- void spiSend(uint8_t data) {
- // no interrupts during byte send - about 8µs
- cli();
- LOOP_L_N(i, 8) {
- WRITE(SD_SCK_PIN, LOW);
- WRITE(SD_MOSI_PIN, data & 0x80);
- data <<= 1;
- WRITE(SD_SCK_PIN, HIGH);
- }
-
- nop; // hold SCK high for a few ns
- nop;
- nop;
- nop;
-
- WRITE(SD_SCK_PIN, LOW);
-
- sei();
- }
-
- // Soft SPI send block
- void spiSendBlock(uint8_t token, const uint8_t *buf) {
- spiSend(token);
- for (uint16_t i = 0; i < 512; i++)
- spiSend(buf[i]);
- }
-
-#endif // SOFTWARE_SPI || FORCE_SOFT_SPI
-
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/MarlinSPI.h b/Marlin/src/HAL/AVR/MarlinSPI.h
deleted file mode 100644
index 0c447ba4cb3d..000000000000
--- a/Marlin/src/HAL/AVR/MarlinSPI.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2021 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 .
- *
- */
-#pragma once
-
-#include
-
-using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp
deleted file mode 100644
index 986462437c8f..000000000000
--- a/Marlin/src/HAL/AVR/MarlinSerial.cpp
+++ /dev/null
@@ -1,652 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * MarlinSerial.cpp - Hardware serial library for Wiring
- * Copyright (c) 2006 Nicholas Zambetti. All right reserved.
- *
- * Modified 23 November 2006 by David A. Mellis
- * Modified 28 September 2010 by Mark Sproul
- * Modified 14 February 2016 by Andreas Hardtung (added tx buffer)
- * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF)
- * Modified 10 June 2018 by Eduardo José Tagle (See #10991)
- * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances
- */
-
-#ifdef __AVR__
-
-// Disable HardwareSerial.cpp to support chips without a UART (Attiny, etc.)
-
-#include "../../inc/MarlinConfig.h"
-
-#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
-
-#include "MarlinSerial.h"
-#include "../../MarlinCore.h"
-
-#if ENABLED(DIRECT_STEPPING)
- #include "../../feature/direct_stepping.h"
-#endif
-
-template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } };
-template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 };
-template bool MarlinSerial::_written = false;
-template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR;
-template uint8_t MarlinSerial::rx_dropped_bytes = 0;
-template uint8_t MarlinSerial::rx_buffer_overruns = 0;
-template uint8_t MarlinSerial::rx_framing_errors = 0;
-template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0;
-
-// A SW memory barrier, to ensure GCC does not overoptimize loops
-#define sw_barrier() asm volatile("": : :"memory");
-
-#include "../../feature/e_parser.h"
-
-// "Atomically" read the RX head index value without disabling interrupts:
-// This MUST be called with RX interrupts enabled, and CAN'T be called
-// from the RX ISR itself!
-template
-FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_head() {
- if (Cfg::RX_SIZE > 256) {
- // Keep reading until 2 consecutive reads return the same value,
- // meaning there was no update in-between caused by an interrupt.
- // This works because serial RX interrupts happen at a slower rate
- // than successive reads of a variable, so 2 consecutive reads with
- // the same value means no interrupt updated it.
- ring_buffer_pos_t vold, vnew = rx_buffer.head;
- sw_barrier();
- do {
- vold = vnew;
- vnew = rx_buffer.head;
- sw_barrier();
- } while (vold != vnew);
- return vnew;
- }
- else {
- // With an 8bit index, reads are always atomic. No need for special handling
- return rx_buffer.head;
- }
-}
-
-template
-volatile bool MarlinSerial::rx_tail_value_not_stable = false;
-template
-volatile uint16_t MarlinSerial::rx_tail_value_backup = 0;
-
-// Set RX tail index, taking into account the RX ISR could interrupt
-// the write to this variable in the middle - So a backup strategy
-// is used to ensure reads of the correct values.
-// -Must NOT be called from the RX ISR -
-template
-FORCE_INLINE void MarlinSerial::atomic_set_rx_tail(typename MarlinSerial::ring_buffer_pos_t value) {
- if (Cfg::RX_SIZE > 256) {
- // Store the new value in the backup
- rx_tail_value_backup = value;
- sw_barrier();
- // Flag we are about to change the true value
- rx_tail_value_not_stable = true;
- sw_barrier();
- // Store the new value
- rx_buffer.tail = value;
- sw_barrier();
- // Signal the new value is completely stored into the value
- rx_tail_value_not_stable = false;
- sw_barrier();
- }
- else
- rx_buffer.tail = value;
-}
-
-// Get the RX tail index, taking into account the read could be
-// interrupting in the middle of the update of that index value
-// -Called from the RX ISR -
-template
-FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_tail() {
- if (Cfg::RX_SIZE > 256) {
- // If the true index is being modified, return the backup value
- if (rx_tail_value_not_stable) return rx_tail_value_backup;
- }
- // The true index is stable, return it
- return rx_buffer.tail;
-}
-
-// (called with RX interrupts disabled)
-template
-FORCE_INLINE void MarlinSerial::store_rxd_char() {
-
- static EmergencyParser::State emergency_state; // = EP_RESET
-
- // This must read the R_UCSRA register before reading the received byte to detect error causes
- if (Cfg::DROPPED_RX && B_DOR && !++rx_dropped_bytes) --rx_dropped_bytes;
- if (Cfg::RX_OVERRUNS && B_DOR && !++rx_buffer_overruns) --rx_buffer_overruns;
- if (Cfg::RX_FRAMING_ERRORS && B_FE && !++rx_framing_errors) --rx_framing_errors;
-
- // Read the character from the USART
- uint8_t c = R_UDR;
-
- #if ENABLED(DIRECT_STEPPING)
- if (page_manager.maybe_store_rxd_char(c)) return;
- #endif
-
- // Get the tail - Nothing can alter its value while this ISR is executing, but there's
- // a chance that this ISR interrupted the main process while it was updating the index.
- // The backup mechanism ensures the correct value is always returned.
- const ring_buffer_pos_t t = atomic_read_rx_tail();
-
- // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here
- ring_buffer_pos_t h = rx_buffer.head;
-
- // Get the next element
- ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c);
-
- // If the character is to be stored at the index just before the tail
- // (such that the head would advance to the current tail), the RX FIFO is
- // full, so don't write the character or advance the head.
- if (i != t) {
- rx_buffer.buffer[h] = c;
- h = i;
- }
- else if (Cfg::DROPPED_RX && !++rx_dropped_bytes)
- --rx_dropped_bytes;
-
- if (Cfg::MAX_RX_QUEUED) {
- // Calculate count of bytes stored into the RX buffer
- const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // Keep track of the maximum count of enqueued bytes
- NOLESS(rx_max_enqueued, rx_count);
- }
-
- if (Cfg::XONOFF) {
- // If the last char that was sent was an XON
- if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) {
-
- // Bytes stored into the RX buffer
- const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // If over 12.5% of RX buffer capacity, send XOFF before running out of
- // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react
- // and stop sending bytes. This translates to 13mS propagation time.
- if (rx_count >= (Cfg::RX_SIZE) / 8) {
-
- // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted.
- // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens
- // to be in the middle of trying to disable the RX interrupt in the main program, eventually the
- // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure
- // the sending of the XOFF char is to send it HERE AND NOW.
-
- // About to send the XOFF char
- xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT;
-
- // Wait until the TX register becomes empty and send it - Here there could be a problem
- // - While waiting for the TX register to empty, the RX register could receive a new
- // character. This must also handle that situation!
- while (!B_UDRE) {
-
- if (B_RXC) {
- // A char arrived while waiting for the TX buffer to be empty - Receive and process it!
-
- i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // Read the character from the USART
- c = R_UDR;
-
- if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c);
-
- // If the character is to be stored at the index just before the tail
- // (such that the head would advance to the current tail), the FIFO is
- // full, so don't write the character or advance the head.
- if (i != t) {
- rx_buffer.buffer[h] = c;
- h = i;
- }
- else if (Cfg::DROPPED_RX && !++rx_dropped_bytes)
- --rx_dropped_bytes;
- }
- sw_barrier();
- }
-
- R_UDR = XOFF_CHAR;
-
- // Clear the TXC bit -- "can be cleared by writing a one to its bit
- // location". This makes sure flush() won't return until the bytes
- // actually got written
- B_TXC = 1;
-
- // At this point there could be a race condition between the write() function
- // and this sending of the XOFF char. This interrupt could happen between the
- // wait to be empty TX buffer loop and the actual write of the character. Since
- // the TX buffer is full because it's sending the XOFF char, the only way to be
- // sure the write() function will succeed is to wait for the XOFF char to be
- // completely sent. Since an extra character could be received during the wait
- // it must also be handled!
- while (!B_UDRE) {
-
- if (B_RXC) {
- // A char arrived while waiting for the TX buffer to be empty - Receive and process it!
-
- i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // Read the character from the USART
- c = R_UDR;
-
- if (Cfg::EMERGENCYPARSER)
- emergency_parser.update(emergency_state, c);
-
- // If the character is to be stored at the index just before the tail
- // (such that the head would advance to the current tail), the FIFO is
- // full, so don't write the character or advance the head.
- if (i != t) {
- rx_buffer.buffer[h] = c;
- h = i;
- }
- else if (Cfg::DROPPED_RX && !++rx_dropped_bytes)
- --rx_dropped_bytes;
- }
- sw_barrier();
- }
-
- // At this point everything is ready. The write() function won't
- // have any issues writing to the UART TX register if it needs to!
- }
- }
- }
-
- // Store the new head value - The main loop will retry until the value is stable
- rx_buffer.head = h;
-}
-
-// (called with TX irqs disabled)
-template
-FORCE_INLINE void MarlinSerial::_tx_udr_empty_irq() {
- if (Cfg::TX_SIZE > 0) {
- // Read positions
- uint8_t t = tx_buffer.tail;
- const uint8_t h = tx_buffer.head;
-
- if (Cfg::XONOFF) {
- // If an XON char is pending to be sent, do it now
- if (xon_xoff_state == XON_CHAR) {
-
- // Send the character
- R_UDR = XON_CHAR;
-
- // clear the TXC bit -- "can be cleared by writing a one to its bit
- // location". This makes sure flush() won't return until the bytes
- // actually got written
- B_TXC = 1;
-
- // Remember we sent it.
- xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT;
-
- // If nothing else to transmit, just disable TX interrupts.
- if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed)
-
- return;
- }
- }
-
- // If nothing to transmit, just disable TX interrupts. This could
- // happen as the result of the non atomicity of the disabling of RX
- // interrupts that could end reenabling TX interrupts as a side effect.
- if (h == t) {
- B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed)
- return;
- }
-
- // There is something to TX, Send the next byte
- const uint8_t c = tx_buffer.buffer[t];
- t = (t + 1) & (Cfg::TX_SIZE - 1);
- R_UDR = c;
- tx_buffer.tail = t;
-
- // Clear the TXC bit (by writing a one to its bit location).
- // Ensures flush() won't return until the bytes are actually written/
- B_TXC = 1;
-
- // Disable interrupts if there is nothing to transmit following this byte
- if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed)
- }
-}
-
-// Public Methods
-template
-void MarlinSerial::begin(const long baud) {
- uint16_t baud_setting;
- bool useU2X = true;
-
- #if F_CPU == 16000000UL && SERIAL_PORT == 0
- // Hard-coded exception for compatibility with the bootloader shipped
- // with the Duemilanove and previous boards, and the firmware on the
- // 8U2 on the Uno and Mega 2560.
- if (baud == 57600) useU2X = false;
- #endif
-
- R_UCSRA = 0;
- if (useU2X) {
- B_U2X = 1;
- baud_setting = (F_CPU / 4 / baud - 1) / 2;
- }
- else
- baud_setting = (F_CPU / 8 / baud - 1) / 2;
-
- // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
- R_UBRRH = baud_setting >> 8;
- R_UBRRL = baud_setting;
-
- B_RXEN = 1;
- B_TXEN = 1;
- B_RXCIE = 1;
- if (Cfg::TX_SIZE > 0) B_UDRIE = 0;
- _written = false;
-}
-
-template
-void MarlinSerial::end() {
- B_RXEN = 0;
- B_TXEN = 0;
- B_RXCIE = 0;
- B_UDRIE = 0;
-}
-
-template
-int MarlinSerial::peek() {
- const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail;
- return h == t ? -1 : rx_buffer.buffer[t];
-}
-
-template
-int MarlinSerial::read() {
- const ring_buffer_pos_t h = atomic_read_rx_head();
-
- // Read the tail. Main thread owns it, so it is safe to directly read it
- ring_buffer_pos_t t = rx_buffer.tail;
-
- // If nothing to read, return now
- if (h == t) return -1;
-
- // Get the next char
- const int v = rx_buffer.buffer[t];
- t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1);
-
- // Advance tail - Making sure the RX ISR will always get an stable value, even
- // if it interrupts the writing of the value of that variable in the middle.
- atomic_set_rx_tail(t);
-
- if (Cfg::XONOFF) {
- // If the XOFF char was sent, or about to be sent...
- if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) {
- // Get count of bytes in the RX buffer
- const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
- if (rx_count < (Cfg::RX_SIZE) / 10) {
- if (Cfg::TX_SIZE > 0) {
- // Signal we want an XON character to be sent.
- xon_xoff_state = XON_CHAR;
- // Enable TX ISR. Non atomic, but it will eventually enable them
- B_UDRIE = 1;
- }
- else {
- // If not using TX interrupts, we must send the XON char now
- xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT;
- while (!B_UDRE) sw_barrier();
- R_UDR = XON_CHAR;
- }
- }
- }
- }
-
- return v;
-}
-
-template
-typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() {
- const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail;
- return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1);
-}
-
-template
-void MarlinSerial::flush() {
-
- // Set the tail to the head:
- // - Read the RX head index in a safe way. (See atomic_read_rx_head.)
- // - Set the tail, making sure the RX ISR will always get a stable value, even
- // if it interrupts the writing of the value of that variable in the middle.
- atomic_set_rx_tail(atomic_read_rx_head());
-
- if (Cfg::XONOFF) {
- // If the XOFF char was sent, or about to be sent...
- if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) {
- if (Cfg::TX_SIZE > 0) {
- // Signal we want an XON character to be sent.
- xon_xoff_state = XON_CHAR;
- // Enable TX ISR. Non atomic, but it will eventually enable it.
- B_UDRIE = 1;
- }
- else {
- // If not using TX interrupts, we must send the XON char now
- xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT;
- while (!B_UDRE) sw_barrier();
- R_UDR = XON_CHAR;
- }
- }
- }
-}
-
-template
-void MarlinSerial::write(const uint8_t c) {
- if (Cfg::TX_SIZE == 0) {
-
- _written = true;
- while (!B_UDRE) sw_barrier();
- R_UDR = c;
-
- }
- else {
-
- _written = true;
-
- // If the TX interrupts are disabled and the data register
- // is empty, just write the byte to the data register and
- // be done. This shortcut helps significantly improve the
- // effective datarate at high (>500kbit/s) bitrates, where
- // interrupt overhead becomes a slowdown.
- // Yes, there is a race condition between the sending of the
- // XOFF char at the RX ISR, but it is properly handled there
- if (!B_UDRIE && B_UDRE) {
- R_UDR = c;
-
- // clear the TXC bit -- "can be cleared by writing a one to its bit
- // location". This makes sure flush() won't return until the bytes
- // actually got written
- B_TXC = 1;
- return;
- }
-
- const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
-
- // If global interrupts are disabled (as the result of being called from an ISR)...
- if (!hal.isr_state()) {
-
- // Make room by polling if it is possible to transmit, and do so!
- while (i == tx_buffer.tail) {
-
- // If we can transmit another byte, do it.
- if (B_UDRE) _tx_udr_empty_irq();
-
- // Make sure compiler rereads tx_buffer.tail
- sw_barrier();
- }
- }
- else {
- // Interrupts are enabled, just wait until there is space
- while (i == tx_buffer.tail) sw_barrier();
- }
-
- // Store new char. head is always safe to move
- tx_buffer.buffer[tx_buffer.head] = c;
- tx_buffer.head = i;
-
- // Enable TX ISR - Non atomic, but it will eventually enable TX ISR
- B_UDRIE = 1;
- }
-}
-
-template
-void MarlinSerial::flushTX() {
-
- if (Cfg::TX_SIZE == 0) {
- // No bytes written, no need to flush. This special case is needed since there's
- // no way to force the TXC (transmit complete) bit to 1 during initialization.
- if (!_written) return;
-
- // Wait until everything was transmitted
- while (!B_TXC) sw_barrier();
-
- // At this point nothing is queued anymore (DRIE is disabled) and
- // the hardware finished transmission (TXC is set).
-
- }
- else {
-
- // No bytes written, no need to flush. This special case is needed since there's
- // no way to force the TXC (transmit complete) bit to 1 during initialization.
- if (!_written) return;
-
- // If global interrupts are disabled (as the result of being called from an ISR)...
- if (!hal.isr_state()) {
-
- // Wait until everything was transmitted - We must do polling, as interrupts are disabled
- while (tx_buffer.head != tx_buffer.tail || !B_TXC) {
-
- // If there is more space, send an extra character
- if (B_UDRE) _tx_udr_empty_irq();
-
- sw_barrier();
- }
-
- }
- else {
- // Wait until everything was transmitted
- while (tx_buffer.head != tx_buffer.tail || !B_TXC) sw_barrier();
- }
-
- // At this point nothing is queued anymore (DRIE is disabled) and
- // the hardware finished transmission (TXC is set).
- }
-}
-
-// Hookup ISR handlers
-ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) {
- MarlinSerial>::store_rxd_char();
-}
-
-ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) {
- MarlinSerial>::_tx_udr_empty_irq();
-}
-
-// Because of the template definition above, it's required to instantiate the template to have all methods generated
-template class MarlinSerial< MarlinSerialCfg >;
-MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
-
-#ifdef SERIAL_PORT_2
-
- // Hookup ISR handlers
- ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _RX_vect)) {
- MarlinSerial>::store_rxd_char();
- }
-
- ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _UDRE_vect)) {
- MarlinSerial>::_tx_udr_empty_irq();
- }
-
- template class MarlinSerial< MarlinSerialCfg >;
- MSerialT2 customizedSerial2(MSerialT2::HasEmergencyParser);
-
-#endif // SERIAL_PORT_2
-
-#ifdef SERIAL_PORT_3
-
- // Hookup ISR handlers
- ISR(SERIAL_REGNAME(USART, SERIAL_PORT_3, _RX_vect)) {
- MarlinSerial>::store_rxd_char();
- }
-
- ISR(SERIAL_REGNAME(USART, SERIAL_PORT_3, _UDRE_vect)) {
- MarlinSerial>::_tx_udr_empty_irq();
- }
-
- template class MarlinSerial< MarlinSerialCfg >;
- MSerialT3 customizedSerial3(MSerialT3::HasEmergencyParser);
-
-#endif // SERIAL_PORT_3
-
-#ifdef MMU2_SERIAL_PORT
-
- ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) {
- MarlinSerial>::store_rxd_char();
- }
-
- ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) {
- MarlinSerial>::_tx_udr_empty_irq();
- }
-
- template class MarlinSerial< MMU2SerialCfg >;
- MSerialMMU2 mmuSerial(MSerialMMU2::HasEmergencyParser);
-
-#endif // MMU2_SERIAL_PORT
-
-#ifdef LCD_SERIAL_PORT
-
- ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _RX_vect)) {
- MarlinSerial>::store_rxd_char();
- }
-
- ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _UDRE_vect)) {
- MarlinSerial>::_tx_udr_empty_irq();
- }
-
- template class MarlinSerial< LCDSerialCfg >;
- MSerialLCD lcdSerial(MSerialLCD::HasEmergencyParser);
-
- #if HAS_DGUS_LCD
- template
- typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() {
- const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send.
- h = tx_buffer.head; // next pos for queue.
- int ret = t - h - 1;
- if (ret < 0) ret += Cfg::TX_SIZE + 1;
- return ret;
- }
- #endif
-
-#endif // LCD_SERIAL_PORT
-
-#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H)
-
-// For AT90USB targets use the UART for BT interfacing
-#if defined(USBCON) && ENABLED(BLUETOOTH)
- MSerialBT bluetoothSerial(false);
-#endif
-
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h
deleted file mode 100644
index 7eb76000d66e..000000000000
--- a/Marlin/src/HAL/AVR/MarlinSerial.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * MarlinSerial.h - Hardware serial library for Wiring
- * Copyright (c) 2006 Nicholas Zambetti. All right reserved.
- *
- * Modified 28 September 2010 by Mark Sproul
- * Modified 14 February 2016 by Andreas Hardtung (added tx buffer)
- * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF)
- * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances
- */
-
-#include
-
-#include "../../inc/MarlinConfigPre.h"
-#include "../../core/serial_hook.h"
-
-#ifndef SERIAL_PORT
- #define SERIAL_PORT 0
-#endif
-
-#ifndef USBCON
-
- // The presence of the UBRRH register is used to detect a UART.
- #define UART_PRESENT(port) ((port == 0 && (defined(UBRRH) || defined(UBRR0H))) || \
- (port == 1 && defined(UBRR1H)) || (port == 2 && defined(UBRR2H)) || \
- (port == 3 && defined(UBRR3H)))
-
- // These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor
- // requires two levels of indirection to expand macro values properly)
- #define SERIAL_REGNAME(registerbase,number,suffix) _SERIAL_REGNAME(registerbase,number,suffix)
- #if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary
- #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##suffix
- #else
- #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##number##suffix
- #endif
-
- // Registers used by MarlinSerial class (expanded depending on selected serial port)
-
- // Templated 8bit register (generic)
- #define UART_REGISTER_DECL_BASE(registerbase, suffix) \
- template struct R_##registerbase##x##suffix {}
-
- // Templated 8bit register (specialization for each port)
- #define UART_REGISTER_DECL(port, registerbase, suffix) \
- template<> struct R_##registerbase##x##suffix { \
- constexpr R_##registerbase##x##suffix(int) {} \
- FORCE_INLINE void operator=(uint8_t newVal) const { SERIAL_REGNAME(registerbase,port,suffix) = newVal; } \
- FORCE_INLINE operator uint8_t() const { return SERIAL_REGNAME(registerbase,port,suffix); } \
- }
-
- // Templated 1bit register (generic)
- #define UART_BIT_DECL_BASE(registerbase, suffix, bit) \
- templatestruct B_##bit##x {}
-
- // Templated 1bit register (specialization for each port)
- #define UART_BIT_DECL(port, registerbase, suffix, bit) \
- template<> struct B_##bit##x { \
- constexpr B_##bit##x(int) {} \
- FORCE_INLINE void operator=(int newVal) const { \
- if (newVal) \
- SBI(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); \
- else \
- CBI(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); \
- } \
- FORCE_INLINE operator bool() const { return TEST(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); } \
- }
-
- #define UART_DECL_BASE() \
- UART_REGISTER_DECL_BASE(UCSR,A);\
- UART_REGISTER_DECL_BASE(UDR,);\
- UART_REGISTER_DECL_BASE(UBRR,H);\
- UART_REGISTER_DECL_BASE(UBRR,L);\
- UART_BIT_DECL_BASE(UCSR,B,RXEN);\
- UART_BIT_DECL_BASE(UCSR,B,TXEN);\
- UART_BIT_DECL_BASE(UCSR,A,TXC);\
- UART_BIT_DECL_BASE(UCSR,B,RXCIE);\
- UART_BIT_DECL_BASE(UCSR,A,UDRE);\
- UART_BIT_DECL_BASE(UCSR,A,FE);\
- UART_BIT_DECL_BASE(UCSR,A,DOR);\
- UART_BIT_DECL_BASE(UCSR,B,UDRIE);\
- UART_BIT_DECL_BASE(UCSR,A,RXC);\
- UART_BIT_DECL_BASE(UCSR,A,U2X)
-
- #define UART_DECL(port) \
- UART_REGISTER_DECL(port,UCSR,A);\
- UART_REGISTER_DECL(port,UDR,);\
- UART_REGISTER_DECL(port,UBRR,H);\
- UART_REGISTER_DECL(port,UBRR,L);\
- UART_BIT_DECL(port,UCSR,B,RXEN);\
- UART_BIT_DECL(port,UCSR,B,TXEN);\
- UART_BIT_DECL(port,UCSR,A,TXC);\
- UART_BIT_DECL(port,UCSR,B,RXCIE);\
- UART_BIT_DECL(port,UCSR,A,UDRE);\
- UART_BIT_DECL(port,UCSR,A,FE);\
- UART_BIT_DECL(port,UCSR,A,DOR);\
- UART_BIT_DECL(port,UCSR,B,UDRIE);\
- UART_BIT_DECL(port,UCSR,A,RXC);\
- UART_BIT_DECL(port,UCSR,A,U2X)
-
- // Declare empty templates
- UART_DECL_BASE();
-
- // And all the specializations for each possible serial port
- #if UART_PRESENT(0)
- UART_DECL(0);
- #endif
- #if UART_PRESENT(1)
- UART_DECL(1);
- #endif
- #if UART_PRESENT(2)
- UART_DECL(2);
- #endif
- #if UART_PRESENT(3)
- UART_DECL(3);
- #endif
-
- #define BYTE 0
-
- // Templated type selector
- template struct TypeSelector { typedef T type;} ;
- template struct TypeSelector { typedef F type; };
-
- template
- class MarlinSerial {
- protected:
- // Registers
- static constexpr R_UCSRxA R_UCSRA = 0;
- static constexpr R_UDRx R_UDR = 0;
- static constexpr R_UBRRxH R_UBRRH = 0;
- static constexpr R_UBRRxL R_UBRRL = 0;
-
- // Bits
- static constexpr B_RXENx B_RXEN = 0;
- static constexpr B_TXENx B_TXEN = 0;
- static constexpr B_TXCx B_TXC = 0;
- static constexpr B_RXCIEx B_RXCIE = 0;
- static constexpr B_UDREx B_UDRE = 0;
- static constexpr B_FEx B_FE = 0;
- static constexpr B_DORx B_DOR = 0;
- static constexpr B_UDRIEx B_UDRIE = 0;
- static constexpr B_RXCx B_RXC = 0;
- static constexpr B_U2Xx B_U2X = 0;
-
- // Base size of type on buffer size
- typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t;
-
- struct ring_buffer_r {
- volatile ring_buffer_pos_t head, tail;
- unsigned char buffer[Cfg::RX_SIZE];
- };
-
- struct ring_buffer_t {
- volatile uint8_t head, tail;
- unsigned char buffer[Cfg::TX_SIZE];
- };
-
- static ring_buffer_r rx_buffer;
- static ring_buffer_t tx_buffer;
- static bool _written;
-
- static constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent
- XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send
-
- // XON / XOFF character definitions
- static constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19;
- static uint8_t xon_xoff_state,
- rx_dropped_bytes,
- rx_buffer_overruns,
- rx_framing_errors;
- static ring_buffer_pos_t rx_max_enqueued;
-
- FORCE_INLINE static ring_buffer_pos_t atomic_read_rx_head();
-
- static volatile bool rx_tail_value_not_stable;
- static volatile uint16_t rx_tail_value_backup;
-
- FORCE_INLINE static void atomic_set_rx_tail(ring_buffer_pos_t value);
- FORCE_INLINE static ring_buffer_pos_t atomic_read_rx_tail();
-
- public:
- FORCE_INLINE static void store_rxd_char();
- FORCE_INLINE static void _tx_udr_empty_irq();
-
- public:
- static void begin(const long);
- static void end();
- static int peek();
- static int read();
- static void flush();
- static ring_buffer_pos_t available();
- static void write(const uint8_t c);
- static void flushTX();
- #if HAS_DGUS_LCD
- static ring_buffer_pos_t get_tx_buffer_free();
- #endif
-
- enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
- static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
-
- FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
- FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
- FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
- FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
- };
-
- template
- struct MarlinSerialCfg {
- static constexpr int PORT = serial;
- static constexpr unsigned int RX_SIZE = RX_BUFFER_SIZE;
- static constexpr unsigned int TX_SIZE = TX_BUFFER_SIZE;
- static constexpr bool XONOFF = ENABLED(SERIAL_XON_XOFF);
- static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
- static constexpr bool DROPPED_RX = ENABLED(SERIAL_STATS_DROPPED_RX);
- static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS);
- static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
- static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
- };
-
- typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT1;
- extern MSerialT1 customizedSerial1;
-
- #ifdef SERIAL_PORT_2
- typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT2;
- extern MSerialT2 customizedSerial2;
- #endif
-
- #ifdef SERIAL_PORT_3
- typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT3;
- extern MSerialT3 customizedSerial3;
- #endif
-
-#endif // !USBCON
-
-#ifdef MMU2_SERIAL_PORT
- template
- struct MMU2SerialCfg {
- static constexpr int PORT = serial;
- static constexpr unsigned int RX_SIZE = 32;
- static constexpr unsigned int TX_SIZE = 32;
- static constexpr bool XONOFF = false;
- static constexpr bool EMERGENCYPARSER = false;
- static constexpr bool DROPPED_RX = false;
- static constexpr bool RX_FRAMING_ERRORS = false;
- static constexpr bool MAX_RX_QUEUED = false;
- static constexpr bool RX_OVERRUNS = false;
- };
-
- typedef Serial1Class< MarlinSerial< MMU2SerialCfg > > MSerialMMU2;
- extern MSerialMMU2 mmuSerial;
-#endif
-
-#ifdef LCD_SERIAL_PORT
-
- template
- struct LCDSerialCfg {
- static constexpr int PORT = serial;
- static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64);
- static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128);
- static constexpr bool XONOFF = false;
- static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
- static constexpr bool DROPPED_RX = false;
- static constexpr bool RX_FRAMING_ERRORS = false;
- static constexpr bool MAX_RX_QUEUED = false;
- static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
- };
-
- typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialLCD;
- extern MSerialLCD lcdSerial;
-#endif
-
-// Use the UART for Bluetooth in AT90USB configurations
-#if defined(USBCON) && ENABLED(BLUETOOTH)
- typedef Serial1Class MSerialBT;
- extern MSerialBT bluetoothSerial;
-#endif
diff --git a/Marlin/src/HAL/AVR/Servo.cpp b/Marlin/src/HAL/AVR/Servo.cpp
deleted file mode 100644
index 0a1ef5337ae9..000000000000
--- a/Marlin/src/HAL/AVR/Servo.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
- * Copyright (c) 2009 Michael Margolis. All right reserved.
- */
-
-/**
- * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method.
- * The servos are pulsed in the background using the value most recently written using the write() method
- *
- * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached.
- * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four.
- *
- * The methods are:
- *
- * Servo - Class for manipulating servo motors connected to Arduino pins.
- *
- * attach(pin) - Attach a servo motor to an i/o pin.
- * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds
- * Default min is 544, max is 2400
- *
- * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.)
- * writeMicroseconds() - Set the servo pulse width in microseconds.
- * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]).
- * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex].
- * read() - Get the last-written servo pulse width as an angle between 0 and 180.
- * readMicroseconds() - Get the last-written servo pulse width in microseconds.
- * attached() - Return true if a servo is attached.
- * detach() - Stop an attached servo from pulsing its i/o pin.
- */
-
-#ifdef __AVR__
-
-#include "../../inc/MarlinConfig.h"
-
-#if HAS_SERVOS
-
-#include
-
-#include "../shared/servo.h"
-#include "../shared/servo_private.h"
-
-static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
-
-
-/************ static functions common to all instances ***********************/
-
-static inline void handle_interrupts(const timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {
- int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
- if (cho < 0) // Channel -1 indicates the refresh interval completed...
- *TCNTn = 0; // ...so reset the timer
- else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
- extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
-
- Channel[timer] = ++cho; // Handle the next channel (or 0)
- if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
- *OCRnA = *TCNTn + SERVO(timer, cho).ticks; // set compare to current ticks plus duration
- if (SERVO(timer, cho).Pin.isActive) // activated?
- extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
- }
- else {
- // finished all channels so wait for the refresh period to expire before starting over
- const unsigned int cval = ((unsigned)*TCNTn) + 32 / (SERVO_TIMER_PRESCALER), // allow 32 cycles to ensure the next OCR1A not missed
- ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
- *OCRnA = max(cval, ival);
-
- Channel[timer] = -1; // reset the timer counter to 0 on the next call
- }
-}
-
-#ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform
-
- // Interrupt handlers for Arduino
- #ifdef _useTimer1
- SIGNAL(TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); }
- #endif
-
- #ifdef _useTimer3
- SIGNAL(TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); }
- #endif
-
- #ifdef _useTimer4
- SIGNAL(TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); }
- #endif
-
- #ifdef _useTimer5
- SIGNAL(TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); }
- #endif
-
-#else // WIRING
-
- // Interrupt handlers for Wiring
- #ifdef _useTimer1
- void Timer1Service() { handle_interrupts(_timer1, &TCNT1, &OCR1A); }
- #endif
- #ifdef _useTimer3
- void Timer3Service() { handle_interrupts(_timer3, &TCNT3, &OCR3A); }
- #endif
-
-#endif // WIRING
-
-/****************** end of static functions ******************************/
-
-void initISR(const timer16_Sequence_t timer_index) {
- switch (timer_index) {
- default: break;
-
- #ifdef _useTimer1
- case _timer1:
- TCCR1A = 0; // normal counting mode
- TCCR1B = _BV(CS11); // set prescaler of 8
- TCNT1 = 0; // clear the timer count
- #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
- SBI(TIFR, OCF1A); // clear any pending interrupts;
- SBI(TIMSK, OCIE1A); // enable the output compare interrupt
- #else
- // here if not ATmega8 or ATmega128
- SBI(TIFR1, OCF1A); // clear any pending interrupts;
- SBI(TIMSK1, OCIE1A); // enable the output compare interrupt
- #endif
- #ifdef WIRING
- timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
- #endif
- break;
- #endif
-
- #ifdef _useTimer3
- case _timer3:
- TCCR3A = 0; // normal counting mode
- TCCR3B = _BV(CS31); // set prescaler of 8
- TCNT3 = 0; // clear the timer count
- #ifdef __AVR_ATmega128__
- SBI(TIFR, OCF3A); // clear any pending interrupts;
- SBI(ETIMSK, OCIE3A); // enable the output compare interrupt
- #else
- SBI(TIFR3, OCF3A); // clear any pending interrupts;
- SBI(TIMSK3, OCIE3A); // enable the output compare interrupt
- #endif
- #ifdef WIRING
- timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only
- #endif
- break;
- #endif
-
- #ifdef _useTimer4
- case _timer4:
- TCCR4A = 0; // normal counting mode
- TCCR4B = _BV(CS41); // set prescaler of 8
- TCNT4 = 0; // clear the timer count
- TIFR4 = _BV(OCF4A); // clear any pending interrupts;
- TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt
- break;
- #endif
-
- #ifdef _useTimer5
- case _timer5:
- TCCR5A = 0; // normal counting mode
- TCCR5B = _BV(CS51); // set prescaler of 8
- TCNT5 = 0; // clear the timer count
- TIFR5 = _BV(OCF5A); // clear any pending interrupts;
- TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt
- break;
- #endif
- }
-}
-
-void finISR(const timer16_Sequence_t timer_index) {
- // Disable use of the given timer
- #ifdef WIRING
- switch (timer_index) {
- default: break;
-
- case _timer1:
- CBI(
- #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
- TIMSK1
- #else
- TIMSK
- #endif
- , OCIE1A // disable timer 1 output compare interrupt
- );
- timerDetach(TIMER1OUTCOMPAREA_INT);
- break;
-
- case _timer3:
- CBI(
- #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
- TIMSK3
- #else
- ETIMSK
- #endif
- , OCIE3A // disable the timer3 output compare A interrupt
- );
- timerDetach(TIMER3OUTCOMPAREA_INT);
- break;
- }
- #else // !WIRING
- // For arduino - in future: call here to a currently undefined function to reset the timer
- UNUSED(timer_index);
- #endif
-}
-
-#endif // HAS_SERVOS
-
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h
deleted file mode 100644
index 436b28141f95..000000000000
--- a/Marlin/src/HAL/AVR/ServoTimers.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * ServoTimers.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
- * Copyright (c) 2009 Michael Margolis. All right reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * Defines for 16 bit timers used with Servo library
- *
- * If _useTimerX is defined then TimerX is a 16 bit timer on the current board
- * timer16_Sequence_t enumerates the sequence that the timers should be allocated
- * _Nbr_16timers indicates how many 16 bit timers are available.
- */
-
-/**
- * AVR Only definitions
- * --------------------
- */
-
-#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
-#define SERVO_TIMER_PRESCALER 8 // timer prescaler
-
-// Say which 16 bit timers can be used and in what order
-#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- //#define _useTimer1
- #define _useTimer4
- #if NUM_SERVOS > SERVOS_PER_TIMER
- #define _useTimer3
- #if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER
- #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos.
- #endif
- #endif
-#elif defined(__AVR_ATmega32U4__)
- #define _useTimer3
-#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
- #define _useTimer3
-#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__)
- #define _useTimer3
-#else
- // everything else
-#endif
-
-typedef enum {
- #ifdef _useTimer1
- _timer1,
- #endif
- #ifdef _useTimer3
- _timer3,
- #endif
- #ifdef _useTimer4
- _timer4,
- #endif
- #ifdef _useTimer5
- _timer5,
- #endif
- _Nbr_16timers
-} timer16_Sequence_t;
diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp
deleted file mode 100644
index 8d084dec7fdf..000000000000
--- a/Marlin/src/HAL/AVR/eeprom.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#ifdef __AVR__
-
-#include "../../inc/MarlinConfig.h"
-
-#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
-
-/**
- * PersistentStore for Arduino-style EEPROM interface
- * with implementations supplied by the framework.
- */
-
-#include "../shared/eeprom_api.h"
-
-#ifndef MARLIN_EEPROM_SIZE
- #define MARLIN_EEPROM_SIZE size_t(E2END + 1)
-#endif
-size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
-bool PersistentStore::access_start() { return true; }
-bool PersistentStore::access_finish() { return true; }
-
-bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
- uint16_t written = 0;
- while (size--) {
- uint8_t * const p = (uint8_t * const)pos;
- uint8_t v = *value;
- if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
- eeprom_write_byte(p, v);
- if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
- if (eeprom_read_byte(p) != v) {
- SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
- return true;
- }
- }
- crc16(crc, &v, 1);
- pos++;
- value++;
- }
- return false;
-}
-
-bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
- do {
- uint8_t c = eeprom_read_byte((uint8_t*)pos);
- if (writing) *value = c;
- crc16(crc, &c, 1);
- pos++;
- value++;
- } while (--size);
- return false; // always assume success for AVR's
-}
-
-#endif // EEPROM_SETTINGS || SD_FIRMWARE_UPDATE
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h
deleted file mode 100644
index 5511aa406fec..000000000000
--- a/Marlin/src/HAL/AVR/endstop_interrupts.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Endstop Interrupts
- *
- * Without endstop interrupts the endstop pins must be polled continually in
- * the temperature-ISR via endstops.update(), most of the time finding no change.
- * With this feature endstops.update() is called only when we know that at
- * least one endstop has changed state, saving valuable CPU cycles.
- *
- * This feature only works when all used endstop pins can generate either an
- * 'external interrupt' or a 'pin change interrupt'.
- *
- * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'.
- * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino)
- */
-
-#include "../../module/endstops.h"
-
-#include
-
-// One ISR for all EXT-Interrupts
-void endstop_ISR() { endstops.update(); }
-
-/**
- * Patch for pins_arduino.h (...\Arduino\hardware\arduino\avr\variants\mega\pins_arduino.h)
- *
- * These macros for the Arduino MEGA do not include the two connected pins on Port J (D14, D15).
- * So we extend them here because these are the normal pins for Y_MIN and Y_MAX on RAMPS.
- * There are more PCI-enabled processor pins on Port J, but they are not connected to Arduino MEGA.
- */
-#if defined(ARDUINO_AVR_MEGA2560) || defined(ARDUINO_AVR_MEGA)
-
- #define digitalPinHasPCICR(p) (WITHIN(p, 10, 15) || WITHIN(p, 50, 53) || WITHIN(p, 62, 69))
-
- #undef digitalPinToPCICR
- #define digitalPinToPCICR(p) (digitalPinHasPCICR(p) ? (&PCICR) : nullptr)
-
- #undef digitalPinToPCICRbit
- #define digitalPinToPCICRbit(p) (WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? 0 : \
- WITHIN(p, 14, 15) ? 1 : \
- WITHIN(p, 62, 69) ? 2 : \
- 0)
-
- #undef digitalPinToPCMSK
- #define digitalPinToPCMSK(p) (WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? (&PCMSK0) : \
- WITHIN(p, 14, 15) ? (&PCMSK1) : \
- WITHIN(p, 62, 69) ? (&PCMSK2) : \
- nullptr)
-
- #undef digitalPinToPCMSKbit
- #define digitalPinToPCMSKbit(p) (WITHIN(p, 10, 13) ? ((p) - 6) : \
- (p) == 14 || (p) == 51 ? 2 : \
- (p) == 15 || (p) == 52 ? 1 : \
- (p) == 50 ? 3 : \
- (p) == 53 ? 0 : \
- WITHIN(p, 62, 69) ? ((p) - 62) : \
- 0)
-
-#elif defined(__AVR_ATmega164A__) || defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324A__) || \
- defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega324PB__) || \
- defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || \
- defined(__AVR_ATmega1284P__)
-
- #define digitalPinHasPCICR(p) WITHIN(p, 0, NUM_DIGITAL_PINS)
-
-#else
-
- #error "Unsupported AVR variant!"
-
-#endif
-
-
-// Install Pin change interrupt for a pin. Can be called multiple times.
-void pciSetup(const int8_t pin) {
- if (digitalPinHasPCICR(pin)) {
- SBI(*digitalPinToPCMSK(pin), digitalPinToPCMSKbit(pin)); // enable pin
- SBI(PCIFR, digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
- SBI(PCICR, digitalPinToPCICRbit(pin)); // enable interrupt for the group
- }
-}
-
-// Handlers for pin change interrupts
-#ifdef PCINT0_vect
- ISR(PCINT0_vect) { endstop_ISR(); }
-#endif
-
-#ifdef PCINT1_vect
- ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect));
-#endif
-
-#ifdef PCINT2_vect
- ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect));
-#endif
-
-#ifdef PCINT3_vect
- ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect));
-#endif
-
-void setup_endstop_interrupts() {
- #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
- #if HAS_X_MAX
- #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(X_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(X_MAX_PIN);
- #endif
- #endif
- #if HAS_X_MIN
- #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(X_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(X_MIN_PIN);
- #endif
- #endif
- #if HAS_Y_MAX
- #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Y_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Y_MAX_PIN);
- #endif
- #endif
- #if HAS_Y_MIN
- #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Y_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Y_MIN_PIN);
- #endif
- #endif
- #if HAS_Z_MAX
- #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z_MAX_PIN);
- #endif
- #endif
- #if HAS_Z_MIN
- #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z_MIN_PIN);
- #endif
- #endif
- #if HAS_I_MAX
- #if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(I_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
- pciSetup(I_MAX_PIN);
- #endif
- #elif HAS_I_MIN
- #if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(I_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
- pciSetup(I_MIN_PIN);
- #endif
- #endif
- #if HAS_J_MAX
- #if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(J_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
- pciSetup(J_MAX_PIN);
- #endif
- #elif HAS_J_MIN
- #if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(J_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
- pciSetup(J_MIN_PIN);
- #endif
- #endif
- #if HAS_K_MAX
- #if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(K_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
- pciSetup(K_MAX_PIN);
- #endif
- #elif HAS_K_MIN
- #if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(K_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
- pciSetup(K_MIN_PIN);
- #endif
- #endif
- #if HAS_U_MAX
- #if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(U_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable");
- pciSetup(U_MAX_PIN);
- #endif
- #elif HAS_U_MIN
- #if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(U_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable");
- pciSetup(U_MIN_PIN);
- #endif
- #endif
- #if HAS_V_MAX
- #if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(V_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable");
- pciSetup(V_MAX_PIN);
- #endif
- #elif HAS_V_MIN
- #if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(V_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable");
- pciSetup(V_MIN_PIN);
- #endif
- #endif
- #if HAS_W_MAX
- #if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(W_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable");
- pciSetup(W_MAX_PIN);
- #endif
- #elif HAS_W_MIN
- #if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(W_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable");
- pciSetup(W_MIN_PIN);
- #endif
- #endif
- #if HAS_X2_MAX
- #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(X2_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(X2_MAX_PIN);
- #endif
- #endif
- #if HAS_X2_MIN
- #if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(X2_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(X2_MIN_PIN);
- #endif
- #endif
- #if HAS_Y2_MAX
- #if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Y2_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Y2_MAX_PIN);
- #endif
- #endif
- #if HAS_Y2_MIN
- #if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Y2_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Y2_MIN_PIN);
- #endif
- #endif
- #if HAS_Z2_MAX
- #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z2_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z2_MAX_PIN);
- #endif
- #endif
- #if HAS_Z2_MIN
- #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z2_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z2_MIN_PIN);
- #endif
- #endif
- #if HAS_Z3_MAX
- #if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z3_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z3_MAX_PIN);
- #endif
- #endif
- #if HAS_Z3_MIN
- #if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z3_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z3_MIN_PIN);
- #endif
- #endif
- #if HAS_Z4_MAX
- #if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z4_MAX_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z4_MAX_PIN);
- #endif
- #endif
- #if HAS_Z4_MIN
- #if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z4_MIN_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z4_MIN_PIN);
- #endif
- #endif
- #if HAS_Z_MIN_PROBE_PIN
- #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
- _ATTACH(Z_MIN_PROBE_PIN);
- #else
- static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
- pciSetup(Z_MIN_PROBE_PIN);
- #endif
- #endif
-
- // If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
-}
diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp
deleted file mode 100644
index 0a384172c32a..000000000000
--- a/Marlin/src/HAL/AVR/fast_pwm.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#ifdef __AVR__
-
-#include "../../inc/MarlinConfig.h"
-
-struct Timer {
- volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
- volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer
- volatile uint16_t* ICRn; // max 1 ICR register per timer
- uint8_t n; // the timer number [0->5]
- uint8_t q; // the timer output [0->2] (A->C)
- bool isPWM; // True if pin is a "hardware timer"
- bool isProtected; // True if timer is protected
-};
-
-// Macros for the Timer structure
-#define _SET_WGMnQ(T, V) do{ \
- *(T.TCCRnQ)[0] = (*(T.TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \
- *(T.TCCRnQ)[1] = (*(T.TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \
- }while(0)
-
-// Set TCCR CS bits
-#define _SET_CSn(T, V) (*(T.TCCRnQ)[1] = (*(T.TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0))
-
-// Set TCCR COM bits
-#define _SET_COMnQ(T, Q, V) (*(T.TCCRnQ)[0] = (*(T.TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q))))
-
-// Set OCRnQ register
-#define _SET_OCRnQ(T, Q, V) (*(T.OCRnQ)[Q] = int(V) & 0xFFFF)
-
-// Set ICRn register (one per timer)
-#define _SET_ICRn(T, V) (*(T.ICRn) = int(V) & 0xFFFF)
-
-/**
- * Return a Timer struct describing a pin's timer.
- */
-const Timer get_pwm_timer(const pin_t pin) {
-
- uint8_t q = 0;
-
- switch (digitalPinToTimer(pin)) {
- #ifdef TCCR0A
- IF_DISABLED(AVR_AT90USB1286_FAMILY, case TIMER0A:)
- #endif
- #ifdef TCCR1A
- case TIMER1A: case TIMER1B:
- #endif
-
- break; // Protect reserved timers (TIMER0 & TIMER1)
-
- #ifdef TCCR0A
- case TIMER0B: // Protected timer, but allow setting the duty cycle on OCR0B for pin D4 only
- return Timer({ { &TCCR0A, nullptr, nullptr }, { (uint16_t*)&OCR0A, (uint16_t*)&OCR0B, nullptr }, nullptr, 0, 1, true, true });
- #endif
-
- #if HAS_TCCR2
- case TIMER2:
- return Timer({ { &TCCR2, nullptr, nullptr }, { (uint16_t*)&OCR2, nullptr, nullptr }, nullptr, 2, 0, true, false });
- #elif ENABLED(USE_OCR2A_AS_TOP)
- case TIMER2A: break; // Protect TIMER2A since its OCR is used by TIMER2B
- case TIMER2B:
- return Timer({ { &TCCR2A, &TCCR2B, nullptr }, { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, nullptr, 2, 1, true, false });
- #elif defined(TCCR2A)
- case TIMER2B: ++q; case TIMER2A:
- return Timer({ { &TCCR2A, &TCCR2B, nullptr }, { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, nullptr, 2, q, true, false });
- #endif
-
- #ifdef OCR3C
- case TIMER3C: ++q; case TIMER3B: ++q; case TIMER3A:
- return Timer({ { &TCCR3A, &TCCR3B, &TCCR3C }, { &OCR3A, &OCR3B, &OCR3C }, &ICR3, 3, q, true, false });
- #elif defined(OCR3B)
- case TIMER3B: ++q; case TIMER3A:
- return Timer({ { &TCCR3A, &TCCR3B, nullptr }, { &OCR3A, &OCR3B, nullptr }, &ICR3, 3, q, true, false });
- #endif
-
- #ifdef TCCR4A
- case TIMER4C: ++q; case TIMER4B: ++q; case TIMER4A:
- return Timer({ { &TCCR4A, &TCCR4B, &TCCR4C }, { &OCR4A, &OCR4B, &OCR4C }, &ICR4, 4, q, true, false });
- #endif
-
- #ifdef TCCR5A
- case TIMER5C: ++q; case TIMER5B: ++q; case TIMER5A:
- return Timer({ { &TCCR5A, &TCCR5B, &TCCR5C }, { &OCR5A, &OCR5B, &OCR5C }, &ICR5, 5, q, true, false });
- #endif
- }
-
- return Timer();
-}
-
-void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
- const Timer timer = get_pwm_timer(pin);
- if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized
-
- const bool is_timer2 = timer.n == 2;
- const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF;
-
- uint16_t res = 0xFF; // resolution (TOP value)
- uint8_t j = CS_NONE; // prescaler index
- uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
-
- // Calculating the prescaler and resolution to use to achieve closest frequency
- if (f_desired != 0) {
- constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only
- uint16_t f = (F_CPU) / (2 * 1024 * maxtop) + 1; // Start with the lowest non-zero frequency achievable (1 or 31)
-
- LOOP_L_N(i, COUNT(prescaler)) { // Loop through all prescaler values
- const uint16_t p = prescaler[i];
- uint16_t res_fast_temp, res_pc_temp;
- if (is_timer2) {
- #if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
- const uint16_t rft = (F_CPU) / (p * f_desired);
- res_fast_temp = rft - 1;
- res_pc_temp = rft / 2;
- #else
- res_fast_temp = res_pc_temp = maxtop;
- #endif
- }
- else {
- if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
- const uint16_t rft = (F_CPU) / (p * f_desired);
- res_fast_temp = rft - 1;
- res_pc_temp = rft / 2;
- }
-
- LIMIT(res_fast_temp, 1U, maxtop);
- LIMIT(res_pc_temp, 1U, maxtop);
-
- // Calculate frequencies of test prescaler and resolution values
- const uint32_t f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
- f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)),
- f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired),
- f_pc_temp = (F_CPU) / (2 * p * res_pc_temp),
- f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired);
-
- if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
- // Set the Wave Generation Mode to FAST PWM
- wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn);
- // Remember this combination
- f = f_fast_temp; res = res_fast_temp; j = i + 1;
- }
- else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
- // Set the Wave Generation Mode to PWM PHASE CORRECT
- wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn);
- f = f_pc_temp; res = res_pc_temp; j = i + 1;
- }
- }
- }
-
- _SET_WGMnQ(timer, wgm);
- _SET_CSn(timer, j);
-
- if (is_timer2) {
- TERN_(USE_OCR2A_AS_TOP, _SET_OCRnQ(timer, 0, res)); // Set OCR2A value (TOP) = res
- }
- else
- _SET_ICRn(timer, res); // Set ICRn value (TOP) = res
-}
-
-void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
- // If v is 0 or v_size (max), digitalWrite to LOW or HIGH.
- // Note that digitalWrite also disables PWM output for us (sets COM bit to 0)
- if (v == 0)
- digitalWrite(pin, invert);
- else if (v == v_size)
- digitalWrite(pin, !invert);
- else {
- const Timer timer = get_pwm_timer(pin);
- if (timer.isPWM) {
- if (timer.n == 0) {
- _SET_COMnQ(timer, timer.q, COM_CLEAR_SET); // Only allow a TIMER0B select...
- _SET_OCRnQ(timer, timer.q, v); // ...and OCR0B duty update. For output pin D4 no frequency changes are permitted.
- }
- else if (!timer.isProtected) {
- const uint16_t top = timer.n == 2 ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn;
- _SET_COMnQ(timer, SUM_TERN(HAS_TCCR2, timer.q, timer.q == 2), COM_CLEAR_SET + invert); // COM20 is on bit 4 of TCCR2, so +1 for q==2
- _SET_OCRnQ(timer, timer.q, uint16_t(uint32_t(v) * top / v_size)); // Scale 8/16-bit v to top value
- }
- }
- else
- digitalWrite(pin, v < v_size / 2 ? LOW : HIGH);
- }
-}
-
-void MarlinHAL::init_pwm_timers() {
- // Init some timer frequencies to a default 1KHz
- const pin_t pwm_pin[] = {
- #ifdef __AVR_ATmega2560__
- 10, 5, 6, 46
- #elif defined(__AVR_ATmega1280__)
- 12, 31
- #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284__)
- 15, 6
- #elif defined(__AVR_AT90USB1286__) || defined(__AVR_mega64) || defined(__AVR_mega128)
- 16, 24
- #endif
- };
-
- LOOP_L_N(i, COUNT(pwm_pin))
- set_pwm_frequency(pwm_pin[i], 1000);
-}
-
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/fastio.cpp b/Marlin/src/HAL/AVR/fastio.cpp
deleted file mode 100644
index 5c6ef1891512..000000000000
--- a/Marlin/src/HAL/AVR/fastio.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Fast I/O for extended pins
- */
-
-#ifdef __AVR__
-
-#include "fastio.h"
-
-#ifdef FASTIO_EXT_START
-
-#include "../shared/Marduino.h"
-
-#define _IS_EXT(P) WITHIN(P, FASTIO_EXT_START, FASTIO_EXT_END)
-
-void extDigitalWrite(const int8_t pin, const uint8_t state) {
- #define _WCASE(N) case N: WRITE(N, state); break
- switch (pin) {
- default: digitalWrite(pin, state);
- #if _IS_EXT(70)
- _WCASE(70);
- #endif
- #if _IS_EXT(71)
- _WCASE(71);
- #endif
- #if _IS_EXT(72)
- _WCASE(72);
- #endif
- #if _IS_EXT(73)
- _WCASE(73);
- #endif
- #if _IS_EXT(74)
- _WCASE(74);
- #endif
- #if _IS_EXT(75)
- _WCASE(75);
- #endif
- #if _IS_EXT(76)
- _WCASE(76);
- #endif
- #if _IS_EXT(77)
- _WCASE(77);
- #endif
- #if _IS_EXT(78)
- _WCASE(78);
- #endif
- #if _IS_EXT(79)
- _WCASE(79);
- #endif
- #if _IS_EXT(80)
- _WCASE(80);
- #endif
- #if _IS_EXT(81)
- _WCASE(81);
- #endif
- #if _IS_EXT(82)
- _WCASE(82);
- #endif
- #if _IS_EXT(83)
- _WCASE(83);
- #endif
- #if _IS_EXT(84)
- _WCASE(84);
- #endif
- #if _IS_EXT(85)
- _WCASE(85);
- #endif
- #if _IS_EXT(86)
- _WCASE(86);
- #endif
- #if _IS_EXT(87)
- _WCASE(87);
- #endif
- #if _IS_EXT(88)
- _WCASE(88);
- #endif
- #if _IS_EXT(89)
- _WCASE(89);
- #endif
- #if _IS_EXT(90)
- _WCASE(90);
- #endif
- #if _IS_EXT(91)
- _WCASE(91);
- #endif
- #if _IS_EXT(92)
- _WCASE(92);
- #endif
- #if _IS_EXT(93)
- _WCASE(93);
- #endif
- #if _IS_EXT(94)
- _WCASE(94);
- #endif
- #if _IS_EXT(95)
- _WCASE(95);
- #endif
- #if _IS_EXT(96)
- _WCASE(96);
- #endif
- #if _IS_EXT(97)
- _WCASE(97);
- #endif
- #if _IS_EXT(98)
- _WCASE(98);
- #endif
- #if _IS_EXT(99)
- _WCASE(99);
- #endif
- #if _IS_EXT(100)
- _WCASE(100);
- #endif
- }
-}
-
-uint8_t extDigitalRead(const int8_t pin) {
- #define _RCASE(N) case N: return READ(N)
- switch (pin) {
- default: return digitalRead(pin);
- #if _IS_EXT(70)
- _RCASE(70);
- #endif
- #if _IS_EXT(71)
- _RCASE(71);
- #endif
- #if _IS_EXT(72)
- _RCASE(72);
- #endif
- #if _IS_EXT(73)
- _RCASE(73);
- #endif
- #if _IS_EXT(74)
- _RCASE(74);
- #endif
- #if _IS_EXT(75)
- _RCASE(75);
- #endif
- #if _IS_EXT(76)
- _RCASE(76);
- #endif
- #if _IS_EXT(77)
- _RCASE(77);
- #endif
- #if _IS_EXT(78)
- _RCASE(78);
- #endif
- #if _IS_EXT(79)
- _RCASE(79);
- #endif
- #if _IS_EXT(80)
- _RCASE(80);
- #endif
- #if _IS_EXT(81)
- _RCASE(81);
- #endif
- #if _IS_EXT(82)
- _RCASE(82);
- #endif
- #if _IS_EXT(83)
- _RCASE(83);
- #endif
- #if _IS_EXT(84)
- _RCASE(84);
- #endif
- #if _IS_EXT(85)
- _RCASE(85);
- #endif
- #if _IS_EXT(86)
- _RCASE(86);
- #endif
- #if _IS_EXT(87)
- _RCASE(87);
- #endif
- #if _IS_EXT(88)
- _RCASE(88);
- #endif
- #if _IS_EXT(89)
- _RCASE(89);
- #endif
- #if _IS_EXT(90)
- _RCASE(90);
- #endif
- #if _IS_EXT(91)
- _RCASE(91);
- #endif
- #if _IS_EXT(92)
- _RCASE(92);
- #endif
- #if _IS_EXT(93)
- _RCASE(93);
- #endif
- #if _IS_EXT(94)
- _RCASE(94);
- #endif
- #if _IS_EXT(95)
- _RCASE(95);
- #endif
- #if _IS_EXT(96)
- _RCASE(96);
- #endif
- #if _IS_EXT(97)
- _RCASE(97);
- #endif
- #if _IS_EXT(98)
- _RCASE(98);
- #endif
- #if _IS_EXT(99)
- _RCASE(99);
- #endif
- #if _IS_EXT(100)
- _RCASE(100);
- #endif
- }
-}
-
-#if 0
-/**
- * Set Timer 5 PWM frequency in Hz, from 3.8Hz up to ~16MHz
- * with a minimum resolution of 100 steps.
- *
- * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
- */
-uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) {
- float count = 0;
- if (hz > 0 && (dca || dcb || dcc)) {
- count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
- uint16_t prescaler; // Range of 30.5Hz (65535) 64.5kHz (>31)
-
- if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); }
- else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); }
- else if (count >= 255. * 8.) { prescaler = 64; SET_CS(5, PRESCALER_64); }
- else if (count >= 255.) { prescaler = 8; SET_CS(5, PRESCALER_8); }
- else { prescaler = 1; SET_CS(5, PRESCALER_1); }
-
- count /= float(prescaler);
- const float pwm_top = round(count); // Get the rounded count
-
- ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
- OCR5A = pwm_top * ABS(dca); // Update and scale DCs
- OCR5B = pwm_top * ABS(dcb);
- OCR5C = pwm_top * ABS(dcc);
- _SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes
- _SET_COM(5, B, dcb ? (dcb < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL);
- _SET_COM(5, C, dcc ? (dcc < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL);
-
- SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP
-
- //SERIAL_ECHOLNPGM("Timer 5 Settings:");
- //SERIAL_ECHOLNPGM(" Prescaler=", prescaler);
- //SERIAL_ECHOLNPGM(" TOP=", ICR5);
- //SERIAL_ECHOLNPGM(" OCR5A=", OCR5A);
- //SERIAL_ECHOLNPGM(" OCR5B=", OCR5B);
- //SERIAL_ECHOLNPGM(" OCR5C=", OCR5C);
- }
- else {
- // Restore the default for Timer 5
- SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct)
- SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing
- SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
- OCR5A = OCR5B = OCR5C = 0;
- }
- return round(count);
-}
-#endif
-
-#endif // FASTIO_EXT_START
-#endif // __AVR__
diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h
deleted file mode 100644
index 51d3b311ee9d..000000000000
--- a/Marlin/src/HAL/AVR/fastio.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Fast I/O Routines for AVR
- * Use direct port manipulation to save scads of processor time.
- * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al.
- */
-
-#include
-
-#if defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)
- #define AVR_AT90USB1286_FAMILY 1
-#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
- #define AVR_ATmega1284_FAMILY 1
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- #define AVR_ATmega2560_FAMILY 1
-#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
- #define AVR_ATmega2561_FAMILY 1
-#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
- #define AVR_ATmega328_FAMILY 1
-#endif
-
-/**
- * Include Ports and Functions
- */
-#if AVR_ATmega328_FAMILY
- #include "fastio/fastio_168.h"
-#elif AVR_ATmega1284_FAMILY
- #include "fastio/fastio_644.h"
-#elif AVR_ATmega2560_FAMILY
- #include "fastio/fastio_1280.h"
-#elif AVR_AT90USB1286_FAMILY
- #include "fastio/fastio_AT90USB.h"
-#elif AVR_ATmega2561_FAMILY
- #include "fastio/fastio_1281.h"
-#else
- #error "No FastIO definition for the selected AVR Board."
-#endif
-
-/**
- * Magic I/O routines
- *
- * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW);
- *
- * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
- */
-
-#define _READ(IO) TEST(DIO ## IO ## _RPORT, DIO ## IO ## _PIN)
-
-#define _WRITE_NC(IO,V) do{ \
- if (V) SBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \
- else CBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \
-}while(0)
-
-#define _WRITE_C(IO,V) do{ \
- uint8_t port_bits = DIO ## IO ## _WPORT; /* Get a mask from the current port bits */ \
- if (V) port_bits = ~port_bits; /* For setting bits, invert the mask */ \
- DIO ## IO ## _RPORT = port_bits & _BV(DIO ## IO ## _PIN); /* Atomically toggle the output port bits */ \
-}while(0)
-
-#define _WRITE(IO,V) do{ if (&(DIO ## IO ## _RPORT) < (uint8_t*)0x100) _WRITE_NC(IO,V); else _WRITE_C(IO,V); }while(0)
-
-#define _TOGGLE(IO) (DIO ## IO ## _RPORT = _BV(DIO ## IO ## _PIN))
-
-#define _SET_INPUT(IO) CBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN)
-#define _SET_OUTPUT(IO) SBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN)
-
-#define _IS_INPUT(IO) !TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN)
-#define _IS_OUTPUT(IO) TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN)
-
-// digitalRead/Write wrappers
-#ifdef FASTIO_EXT_START
- void extDigitalWrite(const int8_t pin, const uint8_t state);
- uint8_t extDigitalRead(const int8_t pin);
-#else
- #define extDigitalWrite(IO,V) digitalWrite(IO,V)
- #define extDigitalRead(IO) digitalRead(IO)
-#endif
-
-#define READ(IO) _READ(IO)
-#define WRITE(IO,V) _WRITE(IO,V)
-#define TOGGLE(IO) _TOGGLE(IO)
-
-#define SET_INPUT(IO) _SET_INPUT(IO)
-#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _WRITE(IO, HIGH); }while(0)
-#define SET_INPUT_PULLDOWN SET_INPUT
-#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
-#define SET_PWM SET_OUTPUT
-
-#define IS_INPUT(IO) _IS_INPUT(IO)
-#define IS_OUTPUT(IO) _IS_OUTPUT(IO)
-
-#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0)
-
-/**
- * Timer and Interrupt Control
- */
-
-// Waveform Generation Modes
-enum WaveGenMode : uint8_t {
- WGM_NORMAL, // 0
- WGM_PWM_PC_8, // 1
- WGM_PWM_PC_9, // 2
- WGM_PWM_PC_10, // 3
- WGM_CTC_OCRnA, // 4 COM OCnx
- WGM_FAST_PWM_8, // 5
- WGM_FAST_PWM_9, // 6
- WGM_FAST_PWM_10, // 7
- WGM_PWM_PC_FC_ICRn, // 8
- WGM_PWM_PC_FC_OCRnA, // 9 COM OCnA
- WGM_PWM_PC_ICRn, // 10
- WGM_PWM_PC_OCRnA, // 11 COM OCnA
- WGM_CTC_ICRn, // 12 COM OCnx
- WGM_reserved, // 13
- WGM_FAST_PWM_ICRn, // 14 COM OCnA
- WGM_FAST_PWM_OCRnA // 15 COM OCnA
-};
-
-// Wavefore Generation Modes (Timer 2 only)
-enum WaveGenMode2 : uint8_t {
- WGM2_NORMAL, // 0
- WGM2_PWM_PC, // 1
- WGM2_CTC_OCR2A, // 2
- WGM2_FAST_PWM, // 3
- WGM2_reserved_1, // 4
- WGM2_PWM_PC_OCR2A, // 5
- WGM2_reserved_2, // 6
- WGM2_FAST_PWM_OCR2A, // 7
-};
-
-// Compare Modes
-enum CompareMode : uint8_t {
- COM_NORMAL, // 0
- COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL
- COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down
- COM_SET_CLEAR // 3 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down
-};
-
-// Clock Sources
-enum ClockSource : uint8_t {
- CS_NONE, // 0
- CS_PRESCALER_1, // 1
- CS_PRESCALER_8, // 2
- CS_PRESCALER_64, // 3
- CS_PRESCALER_256, // 4
- CS_PRESCALER_1024, // 5
- CS_EXT_FALLING, // 6
- CS_EXT_RISING // 7
-};
-
-// Clock Sources (Timer 2 only)
-enum ClockSource2 : uint8_t {
- CS2_NONE, // 0
- CS2_PRESCALER_1, // 1
- CS2_PRESCALER_8, // 2
- CS2_PRESCALER_32, // 3
- CS2_PRESCALER_64, // 4
- CS2_PRESCALER_128, // 5
- CS2_PRESCALER_256, // 6
- CS2_PRESCALER_1024 // 7
-};
-
-// Get interrupt bits in an orderly way
-// Ex: cs = GET_CS(0); coma1 = GET_COM(A,1);
-#define GET_WGM(T) (((TCCR##T##A >> WGM##T##0) & 0x3) | ((TCCR##T##B >> WGM##T##2 << 2) & 0xC))
-#define GET_CS(T) ((TCCR##T##B >> CS##T##0) & 0x7)
-#define GET_COM(T,Q) ((TCCR##T##Q >> COM##T##Q##0) & 0x3)
-#define GET_COMA(T) GET_COM(T,A)
-#define GET_COMB(T) GET_COM(T,B)
-#define GET_COMC(T) GET_COM(T,C)
-#define GET_ICNC(T) (!!(TCCR##T##B & _BV(ICNC##T)))
-#define GET_ICES(T) (!!(TCCR##T##B & _BV(ICES##T)))
-#define GET_FOC(T,Q) (!!(TCCR##T##C & _BV(FOC##T##Q)))
-#define GET_FOCA(T) GET_FOC(T,A)
-#define GET_FOCB(T) GET_FOC(T,B)
-#define GET_FOCC(T) GET_FOC(T,C)
-
-// Set Wave Generation Mode bits
-// Ex: SET_WGM(5,CTC_ICRn);
-#define _SET_WGM(T,V) do{ \
- TCCR##T##A = (TCCR##T##A & ~(0x3 << WGM##T##0)) | (( int(V) & 0x3) << WGM##T##0); \
- TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \
- }while(0)
-#define SET_WGM(T,V) _SET_WGM(T,WGM_##V)
-
-// Set Clock Select bits
-// Ex: SET_CS3(PRESCALER_64);
-#ifdef TCCR2
- #define HAS_TCCR2 1
-#endif
-#define _SET_CS(T,V) (TCCR##T##B = (TCCR##T##B & ~(0x7 << CS##T##0)) | ((int(V) & 0x7) << CS##T##0))
-#define _SET_CS0(V) _SET_CS(0,V)
-#define _SET_CS1(V) _SET_CS(1,V)
-#define _SET_CS3(V) _SET_CS(3,V)
-#define _SET_CS4(V) _SET_CS(4,V)
-#define _SET_CS5(V) _SET_CS(5,V)
-#define SET_CS0(V) _SET_CS0(CS_##V)
-#define SET_CS1(V) _SET_CS1(CS_##V)
-
-#if HAS_TCCR2
- #define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20))
- #define SET_CS2(V) _SET_CS2(CS2_##V)
-#else
- #define _SET_CS2(V) _SET_CS(2,V)
- #define SET_CS2(V) _SET_CS2(CS_##V)
-#endif
-
-#define SET_CS3(V) _SET_CS3(CS_##V)
-#define SET_CS4(V) _SET_CS4(CS_##V)
-#define SET_CS5(V) _SET_CS5(CS_##V)
-#define SET_CS(T,V) SET_CS##T(V)
-
-// Set Compare Mode bits
-// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET);
-#define _SET_COM(T,Q,V) (TCCR##T##Q = (TCCR##T##Q & ~(0x3 << COM##T##Q##0)) | (int(V) << COM##T##Q##0))
-#define SET_COM(T,Q,V) _SET_COM(T,Q,COM_##V)
-#define SET_COMA(T,V) SET_COM(T,A,V)
-#define SET_COMB(T,V) SET_COM(T,B,V)
-#define SET_COMC(T,V) SET_COM(T,C,V)
-#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0)
-
-// Set Noise Canceler bit
-// Ex: SET_ICNC(2,1)
-#define SET_ICNC(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICNC##T) : TCCR##T##B & ~_BV(ICNC##T))
-
-// Set Input Capture Edge Select bit
-// Ex: SET_ICES(5,0)
-#define SET_ICES(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICES##T) : TCCR##T##B & ~_BV(ICES##T))
-
-// Set Force Output Compare bit
-// Ex: SET_FOC(3,A,1)
-#define SET_FOC(T,Q,V) (TCCR##T##C = (V) ? TCCR##T##C | _BV(FOC##T##Q) : TCCR##T##C & ~_BV(FOC##T##Q))
-#define SET_FOCA(T,V) SET_FOC(T,A,V)
-#define SET_FOCB(T,V) SET_FOC(T,B,V)
-#define SET_FOCC(T,V) SET_FOC(T,C,V)
-
-#if 0
-
-/**
- * PWM availability macros
- */
-
-// Determine which hardware PWMs are already in use
-#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
-#if PIN_EXISTS(CONTROLLER_FAN)
- #define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
-#else
- #define PWM_CHK_FAN_B(P) _PWM_CHK_FAN_B(P)
-#endif
-
-#if ANY_PIN(FAN, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7)
- #if PIN_EXISTS(FAN7)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN || P == FAN7_PIN)
- #elif PIN_EXISTS(FAN6)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN)
- #elif PIN_EXISTS(FAN5)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN)
- #elif PIN_EXISTS(FAN4)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN)
- #elif PIN_EXISTS(FAN3)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN)
- #elif PIN_EXISTS(FAN2)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN)
- #elif PIN_EXISTS(FAN1)
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN)
- #else
- #define PWM_CHK_FAN_A(P) (P == FAN0_PIN)
- #endif
-#else
- #define PWM_CHK_FAN_A(P) false
-#endif
-
-#if HAS_MOTOR_CURRENT_PWM
- #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
- #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY)
- #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
- #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z)
- #else
- #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E)
- #endif
-#else
- #define PWM_CHK_MOTOR_CURRENT(P) false
-#endif
-
-#ifdef NUM_SERVOS
- #if AVR_ATmega2560_FAMILY
- #define PWM_CHK_SERVO(P) (P == 5 || (NUM_SERVOS > 12 && P == 6) || (NUM_SERVOS > 24 && P == 46)) // PWMS 3A, 4A & 5A
- #elif AVR_ATmega2561_FAMILY
- #define PWM_CHK_SERVO(P) (P == 5) // PWM3A
- #elif AVR_ATmega1284_FAMILY
- #define PWM_CHK_SERVO(P) false
- #elif AVR_AT90USB1286_FAMILY
- #define PWM_CHK_SERVO(P) (P == 16) // PWM3A
- #elif AVR_ATmega328_FAMILY
- #define PWM_CHK_SERVO(P) false
- #endif
-#else
- #define PWM_CHK_SERVO(P) false
-#endif
-
-#if ENABLED(BARICUDA)
- #if HAS_HEATER_1 && HAS_HEATER_2
- #define PWM_CHK_HEATER(P) (P == HEATER_1_PIN || P == HEATER_2_PIN)
- #elif HAS_HEATER_1
- #define PWM_CHK_HEATER(P) (P == HEATER_1_PIN)
- #endif
-#else
- #define PWM_CHK_HEATER(P) false
-#endif
-
-#define PWM_CHK(P) (PWM_CHK_HEATER(P) || PWM_CHK_SERVO(P) || PWM_CHK_MOTOR_CURRENT(P) || PWM_CHK_FAN_A(P) || PWM_CHK_FAN_B(P))
-
-#endif // PWM_CHK is not used in Marlin
-
-// define which hardware PWMs are available for the current CPU
-// all timer 1 PWMS deleted from this list because they are never available
-#if AVR_ATmega2560_FAMILY
- #define PWM_PIN(P) ((P >= 2 && P <= 10) || P == 13 || P == 44 || P == 45 || P == 46)
-#elif AVR_ATmega2561_FAMILY
- #define PWM_PIN(P) ((P >= 2 && P <= 6) || P == 9)
-#elif AVR_ATmega1284_FAMILY
- #define PWM_PIN(P) (P == 3 || P == 4 || P == 14 || P == 15)
-#elif AVR_AT90USB1286_FAMILY
- #define PWM_PIN(P) (P == 0 || P == 1 || P == 14 || P == 15 || P == 16 || P == 24)
-#elif AVR_ATmega328_FAMILY
- #define PWM_PIN(P) (P == 3 || P == 5 || P == 6 || P == 11)
-#else
- #error "unknown CPU"
-#endif
diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1280.h b/Marlin/src/HAL/AVR/fastio/fastio_1280.h
deleted file mode 100644
index f482f823e8b9..000000000000
--- a/Marlin/src/HAL/AVR/fastio/fastio_1280.h
+++ /dev/null
@@ -1,1114 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Pin mapping for the 1280 and 2560
- *
- * Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100
- * Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx
- * Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx
- */
-
-#include "../fastio.h"
-
-// change for your board
-#define DEBUG_LED DIO21
-
-// UART
-#define RXD DIO0
-#define TXD DIO1
-
-// SPI
-#define SCK DIO52
-#define MISO DIO50
-#define MOSI DIO51
-#define SS DIO53
-
-// TWI (I2C)
-#define SCL DIO21
-#define SDA DIO20
-
-// Timers and PWM
-#define OC0A DIO13
-#define OC0B DIO4
-#define OC1A DIO11
-#define OC1B DIO12
-#define OC2A DIO10
-#define OC2B DIO9
-#define OC3A DIO5
-#define OC3B DIO2
-#define OC3C DIO3
-#define OC4A DIO6
-#define OC4B DIO7
-#define OC4C DIO8
-#define OC5A DIO46
-#define OC5B DIO45
-#define OC5C DIO44
-
-// Digital I/O
-
-#define DIO0_PIN PINE0
-#define DIO0_RPORT PINE
-#define DIO0_WPORT PORTE
-#define DIO0_DDR DDRE
-#define DIO0_PWM nullptr
-
-#define DIO1_PIN PINE1
-#define DIO1_RPORT PINE
-#define DIO1_WPORT PORTE
-#define DIO1_DDR DDRE
-#define DIO1_PWM nullptr
-
-#define DIO2_PIN PINE4
-#define DIO2_RPORT PINE
-#define DIO2_WPORT PORTE
-#define DIO2_DDR DDRE
-#define DIO2_PWM &OCR3BL
-
-#define DIO3_PIN PINE5
-#define DIO3_RPORT PINE
-#define DIO3_WPORT PORTE
-#define DIO3_DDR DDRE
-#define DIO3_PWM &OCR3CL
-
-#define DIO4_PIN PING5
-#define DIO4_RPORT PING
-#define DIO4_WPORT PORTG
-#define DIO4_DDR DDRG
-#define DIO4_PWM &OCR0B
-
-#define DIO5_PIN PINE3
-#define DIO5_RPORT PINE
-#define DIO5_WPORT PORTE
-#define DIO5_DDR DDRE
-#define DIO5_PWM &OCR3AL
-
-#define DIO6_PIN PINH3
-#define DIO6_RPORT PINH
-#define DIO6_WPORT PORTH
-#define DIO6_DDR DDRH
-#define DIO6_PWM &OCR4AL
-
-#define DIO7_PIN PINH4
-#define DIO7_RPORT PINH
-#define DIO7_WPORT PORTH
-#define DIO7_DDR DDRH
-#define DIO7_PWM &OCR4BL
-
-#define DIO8_PIN PINH5
-#define DIO8_RPORT PINH
-#define DIO8_WPORT PORTH
-#define DIO8_DDR DDRH
-#define DIO8_PWM &OCR4CL
-
-#define DIO9_PIN PINH6
-#define DIO9_RPORT PINH
-#define DIO9_WPORT PORTH
-#define DIO9_DDR DDRH
-#define DIO9_PWM &OCR2B
-
-#define DIO10_PIN PINB4
-#define DIO10_RPORT PINB
-#define DIO10_WPORT PORTB
-#define DIO10_DDR DDRB
-#define DIO10_PWM &OCR2A
-
-#define DIO11_PIN PINB5
-#define DIO11_RPORT PINB
-#define DIO11_WPORT PORTB
-#define DIO11_DDR DDRB
-#define DIO11_PWM nullptr
-
-#define DIO12_PIN PINB6
-#define DIO12_RPORT PINB
-#define DIO12_WPORT PORTB
-#define DIO12_DDR DDRB
-#define DIO12_PWM nullptr
-
-#define DIO13_PIN PINB7
-#define DIO13_RPORT PINB
-#define DIO13_WPORT PORTB
-#define DIO13_DDR DDRB
-#define DIO13_PWM &OCR0A
-
-#define DIO14_PIN PINJ1
-#define DIO14_RPORT PINJ
-#define DIO14_WPORT PORTJ
-#define DIO14_DDR DDRJ
-#define DIO14_PWM nullptr
-
-#define DIO15_PIN PINJ0
-#define DIO15_RPORT PINJ
-#define DIO15_WPORT PORTJ
-#define DIO15_DDR DDRJ
-#define DIO15_PWM nullptr
-
-#define DIO16_PIN PINH1
-#define DIO16_RPORT PINH
-#define DIO16_WPORT PORTH
-#define DIO16_DDR DDRH
-#define DIO16_PWM nullptr
-
-#define DIO17_PIN PINH0
-#define DIO17_RPORT PINH
-#define DIO17_WPORT PORTH
-#define DIO17_DDR DDRH
-#define DIO17_PWM nullptr
-
-#define DIO18_PIN PIND3
-#define DIO18_RPORT PIND
-#define DIO18_WPORT PORTD
-#define DIO18_DDR DDRD
-#define DIO18_PWM nullptr
-
-#define DIO19_PIN PIND2
-#define DIO19_RPORT PIND
-#define DIO19_WPORT PORTD
-#define DIO19_DDR DDRD
-#define DIO19_PWM nullptr
-
-#define DIO20_PIN PIND1
-#define DIO20_RPORT PIND
-#define DIO20_WPORT PORTD
-#define DIO20_DDR DDRD
-#define DIO20_PWM nullptr
-
-#define DIO21_PIN PIND0
-#define DIO21_RPORT PIND
-#define DIO21_WPORT PORTD
-#define DIO21_DDR DDRD
-#define DIO21_PWM nullptr
-
-#define DIO22_PIN PINA0
-#define DIO22_RPORT PINA
-#define DIO22_WPORT PORTA
-#define DIO22_DDR DDRA
-#define DIO22_PWM nullptr
-
-#define DIO23_PIN PINA1
-#define DIO23_RPORT PINA
-#define DIO23_WPORT PORTA
-#define DIO23_DDR DDRA
-#define DIO23_PWM nullptr
-
-#define DIO24_PIN PINA2
-#define DIO24_RPORT PINA
-#define DIO24_WPORT PORTA
-#define DIO24_DDR DDRA
-#define DIO24_PWM nullptr
-
-#define DIO25_PIN PINA3
-#define DIO25_RPORT PINA
-#define DIO25_WPORT PORTA
-#define DIO25_DDR DDRA
-#define DIO25_PWM nullptr
-
-#define DIO26_PIN PINA4
-#define DIO26_RPORT PINA
-#define DIO26_WPORT PORTA
-#define DIO26_DDR DDRA
-#define DIO26_PWM nullptr
-
-#define DIO27_PIN PINA5
-#define DIO27_RPORT PINA
-#define DIO27_WPORT PORTA
-#define DIO27_DDR DDRA
-#define DIO27_PWM nullptr
-
-#define DIO28_PIN PINA6
-#define DIO28_RPORT PINA
-#define DIO28_WPORT PORTA
-#define DIO28_DDR DDRA
-#define DIO28_PWM nullptr
-
-#define DIO29_PIN PINA7
-#define DIO29_RPORT PINA
-#define DIO29_WPORT PORTA
-#define DIO29_DDR DDRA
-#define DIO29_PWM nullptr
-
-#define DIO30_PIN PINC7
-#define DIO30_RPORT PINC
-#define DIO30_WPORT PORTC
-#define DIO30_DDR DDRC
-#define DIO30_PWM nullptr
-
-#define DIO31_PIN PINC6
-#define DIO31_RPORT PINC
-#define DIO31_WPORT PORTC
-#define DIO31_DDR DDRC
-#define DIO31_PWM nullptr
-
-#define DIO32_PIN PINC5
-#define DIO32_RPORT PINC
-#define DIO32_WPORT PORTC
-#define DIO32_DDR DDRC
-#define DIO32_PWM nullptr
-
-#define DIO33_PIN PINC4
-#define DIO33_RPORT PINC
-#define DIO33_WPORT PORTC
-#define DIO33_DDR DDRC
-#define DIO33_PWM nullptr
-
-#define DIO34_PIN PINC3
-#define DIO34_RPORT PINC
-#define DIO34_WPORT PORTC
-#define DIO34_DDR DDRC
-#define DIO34_PWM nullptr
-
-#define DIO35_PIN PINC2
-#define DIO35_RPORT PINC
-#define DIO35_WPORT PORTC
-#define DIO35_DDR DDRC
-#define DIO35_PWM nullptr
-
-#define DIO36_PIN PINC1
-#define DIO36_RPORT PINC
-#define DIO36_WPORT PORTC
-#define DIO36_DDR DDRC
-#define DIO36_PWM nullptr
-
-#define DIO37_PIN PINC0
-#define DIO37_RPORT PINC
-#define DIO37_WPORT PORTC
-#define DIO37_DDR DDRC
-#define DIO37_PWM nullptr
-
-#define DIO38_PIN PIND7
-#define DIO38_RPORT PIND
-#define DIO38_WPORT PORTD
-#define DIO38_DDR DDRD
-#define DIO38_PWM nullptr
-
-#define DIO39_PIN PING2
-#define DIO39_RPORT PING
-#define DIO39_WPORT PORTG
-#define DIO39_DDR DDRG
-#define DIO39_PWM nullptr
-
-#define DIO40_PIN PING1
-#define DIO40_RPORT PING
-#define DIO40_WPORT PORTG
-#define DIO40_DDR DDRG
-#define DIO40_PWM nullptr
-
-#define DIO41_PIN PING0
-#define DIO41_RPORT PING
-#define DIO41_WPORT PORTG
-#define DIO41_DDR DDRG
-#define DIO41_PWM nullptr
-
-#define DIO42_PIN PINL7
-#define DIO42_RPORT PINL
-#define DIO42_WPORT PORTL
-#define DIO42_DDR DDRL
-#define DIO42_PWM nullptr
-
-#define DIO43_PIN PINL6
-#define DIO43_RPORT PINL
-#define DIO43_WPORT PORTL
-#define DIO43_DDR DDRL
-#define DIO43_PWM nullptr
-
-#define DIO44_PIN PINL5
-#define DIO44_RPORT PINL
-#define DIO44_WPORT PORTL
-#define DIO44_DDR DDRL
-#define DIO44_PWM &OCR5CL
-
-#define DIO45_PIN PINL4
-#define DIO45_RPORT PINL
-#define DIO45_WPORT PORTL
-#define DIO45_DDR DDRL
-#define DIO45_PWM &OCR5BL
-
-#define DIO46_PIN PINL3
-#define DIO46_RPORT PINL
-#define DIO46_WPORT PORTL
-#define DIO46_DDR DDRL
-#define DIO46_PWM &OCR5AL
-
-#define DIO47_PIN PINL2
-#define DIO47_RPORT PINL
-#define DIO47_WPORT PORTL
-#define DIO47_DDR DDRL
-#define DIO47_PWM nullptr
-
-#define DIO48_PIN PINL1
-#define DIO48_RPORT PINL
-#define DIO48_WPORT PORTL
-#define DIO48_DDR DDRL
-#define DIO48_PWM nullptr
-
-#define DIO49_PIN PINL0
-#define DIO49_RPORT PINL
-#define DIO49_WPORT PORTL
-#define DIO49_DDR DDRL
-#define DIO49_PWM nullptr
-
-#define DIO50_PIN PINB3
-#define DIO50_RPORT PINB
-#define DIO50_WPORT PORTB
-#define DIO50_DDR DDRB
-#define DIO50_PWM nullptr
-
-#define DIO51_PIN PINB2
-#define DIO51_RPORT PINB
-#define DIO51_WPORT PORTB
-#define DIO51_DDR DDRB
-#define DIO51_PWM nullptr
-
-#define DIO52_PIN PINB1
-#define DIO52_RPORT PINB
-#define DIO52_WPORT PORTB
-#define DIO52_DDR DDRB
-#define DIO52_PWM nullptr
-
-#define DIO53_PIN PINB0
-#define DIO53_RPORT PINB
-#define DIO53_WPORT PORTB
-#define DIO53_DDR DDRB
-#define DIO53_PWM nullptr
-
-#define DIO54_PIN PINF0
-#define DIO54_RPORT PINF
-#define DIO54_WPORT PORTF
-#define DIO54_DDR DDRF
-#define DIO54_PWM nullptr
-
-#define DIO55_PIN PINF1
-#define DIO55_RPORT PINF
-#define DIO55_WPORT PORTF
-#define DIO55_DDR DDRF
-#define DIO55_PWM nullptr
-
-#define DIO56_PIN PINF2
-#define DIO56_RPORT PINF
-#define DIO56_WPORT PORTF
-#define DIO56_DDR DDRF
-#define DIO56_PWM nullptr
-
-#define DIO57_PIN PINF3
-#define DIO57_RPORT PINF
-#define DIO57_WPORT PORTF
-#define DIO57_DDR DDRF
-#define DIO57_PWM nullptr
-
-#define DIO58_PIN PINF4
-#define DIO58_RPORT PINF
-#define DIO58_WPORT PORTF
-#define DIO58_DDR DDRF
-#define DIO58_PWM nullptr
-
-#define DIO59_PIN PINF5
-#define DIO59_RPORT PINF
-#define DIO59_WPORT PORTF
-#define DIO59_DDR DDRF
-#define DIO59_PWM nullptr
-
-#define DIO60_PIN PINF6
-#define DIO60_RPORT PINF
-#define DIO60_WPORT PORTF
-#define DIO60_DDR DDRF
-#define DIO60_PWM nullptr
-
-#define DIO61_PIN PINF7
-#define DIO61_RPORT PINF
-#define DIO61_WPORT PORTF
-#define DIO61_DDR DDRF
-#define DIO61_PWM nullptr
-
-#define DIO62_PIN PINK0
-#define DIO62_RPORT PINK
-#define DIO62_WPORT PORTK
-#define DIO62_DDR DDRK
-#define DIO62_PWM nullptr
-
-#define DIO63_PIN PINK1
-#define DIO63_RPORT PINK
-#define DIO63_WPORT PORTK
-#define DIO63_DDR DDRK
-#define DIO63_PWM nullptr
-
-#define DIO64_PIN PINK2
-#define DIO64_RPORT PINK
-#define DIO64_WPORT PORTK
-#define DIO64_DDR DDRK
-#define DIO64_PWM nullptr
-
-#define DIO65_PIN PINK3
-#define DIO65_RPORT PINK
-#define DIO65_WPORT PORTK
-#define DIO65_DDR DDRK
-#define DIO65_PWM nullptr
-
-#define DIO66_PIN PINK4
-#define DIO66_RPORT PINK
-#define DIO66_WPORT PORTK
-#define DIO66_DDR DDRK
-#define DIO66_PWM nullptr
-
-#define DIO67_PIN PINK5
-#define DIO67_RPORT PINK
-#define DIO67_WPORT PORTK
-#define DIO67_DDR DDRK
-#define DIO67_PWM nullptr
-
-#define DIO68_PIN PINK6
-#define DIO68_RPORT PINK
-#define DIO68_WPORT PORTK
-#define DIO68_DDR DDRK
-#define DIO68_PWM nullptr
-
-#define DIO69_PIN PINK7
-#define DIO69_RPORT PINK
-#define DIO69_WPORT PORTK
-#define DIO69_DDR DDRK
-#define DIO69_PWM nullptr
-
-//#define FASTIO_EXT_START 70
-//#define FASTIO_EXT_END 85
-
-#define DIO70_PIN PING4
-#define DIO70_RPORT PING
-#define DIO70_WPORT PORTG
-#define DIO70_DDR DDRG
-#define DIO70_PWM nullptr
-
-#define DIO71_PIN PING3
-#define DIO71_RPORT PING
-#define DIO71_WPORT PORTG
-#define DIO71_DDR DDRG
-#define DIO71_PWM nullptr
-
-#define DIO72_PIN PINJ2
-#define DIO72_RPORT PINJ
-#define DIO72_WPORT PORTJ
-#define DIO72_DDR DDRJ
-#define DIO72_PWM nullptr
-
-#define DIO73_PIN PINJ3
-#define DIO73_RPORT PINJ
-#define DIO73_WPORT PORTJ
-#define DIO73_DDR DDRJ
-#define DIO73_PWM nullptr
-
-#define DIO74_PIN PINJ7
-#define DIO74_RPORT PINJ
-#define DIO74_WPORT PORTJ
-#define DIO74_DDR DDRJ
-#define DIO74_PWM nullptr
-
-#define DIO75_PIN PINJ4
-#define DIO75_RPORT PINJ
-#define DIO75_WPORT PORTJ
-#define DIO75_DDR DDRJ
-#define DIO75_PWM nullptr
-
-#define DIO76_PIN PINJ5
-#define DIO76_RPORT PINJ
-#define DIO76_WPORT PORTJ
-#define DIO76_DDR DDRJ
-#define DIO76_PWM nullptr
-
-#define DIO77_PIN PINJ6
-#define DIO77_RPORT PINJ
-#define DIO77_WPORT PORTJ
-#define DIO77_DDR DDRJ
-#define DIO77_PWM nullptr
-
-#define DIO78_PIN PINE2
-#define DIO78_RPORT PINE
-#define DIO78_WPORT PORTE
-#define DIO78_DDR DDRE
-#define DIO78_PWM nullptr
-
-#define DIO79_PIN PINE6
-#define DIO79_RPORT PINE
-#define DIO79_WPORT PORTE
-#define DIO79_DDR DDRE
-#define DIO79_PWM nullptr
-
-#define DIO80_PIN PINE7
-#define DIO80_RPORT PINE
-#define DIO80_WPORT PORTE
-#define DIO80_DDR DDRE
-#define DIO80_PWM nullptr
-
-#define DIO81_PIN PIND4
-#define DIO81_RPORT PIND
-#define DIO81_WPORT PORTD
-#define DIO81_DDR DDRD
-#define DIO81_PWM nullptr
-
-#define DIO82_PIN PIND5
-#define DIO82_RPORT PIND
-#define DIO82_WPORT PORTD
-#define DIO82_DDR DDRD
-#define DIO82_PWM nullptr
-
-#define DIO83_PIN PIND6
-#define DIO83_RPORT PIND
-#define DIO83_WPORT PORTD
-#define DIO83_DDR DDRD
-#define DIO83_PWM nullptr
-
-#define DIO84_PIN PINH2
-#define DIO84_RPORT PINH
-#define DIO84_WPORT PORTH
-#define DIO84_DDR DDRH
-#define DIO84_PWM nullptr
-
-#define DIO85_PIN PINH7
-#define DIO85_RPORT PINH
-#define DIO85_WPORT PORTH
-#define DIO85_DDR DDRH
-#define DIO85_PWM nullptr
-
-#undef PA0
-#define PA0_PIN PINA0
-#define PA0_RPORT PINA
-#define PA0_WPORT PORTA
-#define PA0_DDR DDRA
-#define PA0_PWM nullptr
-#undef PA1
-#define PA1_PIN PINA1
-#define PA1_RPORT PINA
-#define PA1_WPORT PORTA
-#define PA1_DDR DDRA
-#define PA1_PWM nullptr
-#undef PA2
-#define PA2_PIN PINA2
-#define PA2_RPORT PINA
-#define PA2_WPORT PORTA
-#define PA2_DDR DDRA
-#define PA2_PWM nullptr
-#undef PA3
-#define PA3_PIN PINA3
-#define PA3_RPORT PINA
-#define PA3_WPORT PORTA
-#define PA3_DDR DDRA
-#define PA3_PWM nullptr
-#undef PA4
-#define PA4_PIN PINA4
-#define PA4_RPORT PINA
-#define PA4_WPORT PORTA
-#define PA4_DDR DDRA
-#define PA4_PWM nullptr
-#undef PA5
-#define PA5_PIN PINA5
-#define PA5_RPORT PINA
-#define PA5_WPORT PORTA
-#define PA5_DDR DDRA
-#define PA5_PWM nullptr
-#undef PA6
-#define PA6_PIN PINA6
-#define PA6_RPORT PINA
-#define PA6_WPORT PORTA
-#define PA6_DDR DDRA
-#define PA6_PWM nullptr
-#undef PA7
-#define PA7_PIN PINA7
-#define PA7_RPORT PINA
-#define PA7_WPORT PORTA
-#define PA7_DDR DDRA
-#define PA7_PWM nullptr
-
-#undef PB0
-#define PB0_PIN PINB0
-#define PB0_RPORT PINB
-#define PB0_WPORT PORTB
-#define PB0_DDR DDRB
-#define PB0_PWM nullptr
-#undef PB1
-#define PB1_PIN PINB1
-#define PB1_RPORT PINB
-#define PB1_WPORT PORTB
-#define PB1_DDR DDRB
-#define PB1_PWM nullptr
-#undef PB2
-#define PB2_PIN PINB2
-#define PB2_RPORT PINB
-#define PB2_WPORT PORTB
-#define PB2_DDR DDRB
-#define PB2_PWM nullptr
-#undef PB3
-#define PB3_PIN PINB3
-#define PB3_RPORT PINB
-#define PB3_WPORT PORTB
-#define PB3_DDR DDRB
-#define PB3_PWM nullptr
-#undef PB4
-#define PB4_PIN PINB4
-#define PB4_RPORT PINB
-#define PB4_WPORT PORTB
-#define PB4_DDR DDRB
-#define PB4_PWM &OCR2A
-#undef PB5
-#define PB5_PIN PINB5
-#define PB5_RPORT PINB
-#define PB5_WPORT PORTB
-#define PB5_DDR DDRB
-#define PB5_PWM nullptr
-#undef PB6
-#define PB6_PIN PINB6
-#define PB6_RPORT PINB
-#define PB6_WPORT PORTB
-#define PB6_DDR DDRB
-#define PB6_PWM nullptr
-#undef PB7
-#define PB7_PIN PINB7
-#define PB7_RPORT PINB
-#define PB7_WPORT PORTB
-#define PB7_DDR DDRB
-#define PB7_PWM &OCR0A
-
-#undef PC0
-#define PC0_PIN PINC0
-#define PC0_RPORT PINC
-#define PC0_WPORT PORTC
-#define PC0_DDR DDRC
-#define PC0_PWM nullptr
-#undef PC1
-#define PC1_PIN PINC1
-#define PC1_RPORT PINC
-#define PC1_WPORT PORTC
-#define PC1_DDR DDRC
-#define PC1_PWM nullptr
-#undef PC2
-#define PC2_PIN PINC2
-#define PC2_RPORT PINC
-#define PC2_WPORT PORTC
-#define PC2_DDR DDRC
-#define PC2_PWM nullptr
-#undef PC3
-#define PC3_PIN PINC3
-#define PC3_RPORT PINC
-#define PC3_WPORT PORTC
-#define PC3_DDR DDRC
-#define PC3_PWM nullptr
-#undef PC4
-#define PC4_PIN PINC4
-#define PC4_RPORT PINC
-#define PC4_WPORT PORTC
-#define PC4_DDR DDRC
-#define PC4_PWM nullptr
-#undef PC5
-#define PC5_PIN PINC5
-#define PC5_RPORT PINC
-#define PC5_WPORT PORTC
-#define PC5_DDR DDRC
-#define PC5_PWM nullptr
-#undef PC6
-#define PC6_PIN PINC6
-#define PC6_RPORT PINC
-#define PC6_WPORT PORTC
-#define PC6_DDR DDRC
-#define PC6_PWM nullptr
-#undef PC7
-#define PC7_PIN PINC7
-#define PC7_RPORT PINC
-#define PC7_WPORT PORTC
-#define PC7_DDR DDRC
-#define PC7_PWM nullptr
-
-#undef PD0
-#define PD0_PIN PIND0
-#define PD0_RPORT PIND
-#define PD0_WPORT PORTD
-#define PD0_DDR DDRD
-#define PD0_PWM nullptr
-#undef PD1
-#define PD1_PIN PIND1
-#define PD1_RPORT PIND
-#define PD1_WPORT PORTD
-#define PD1_DDR DDRD
-#define PD1_PWM nullptr
-#undef PD2
-#define PD2_PIN PIND2
-#define PD2_RPORT PIND
-#define PD2_WPORT PORTD
-#define PD2_DDR DDRD
-#define PD2_PWM nullptr
-#undef PD3
-#define PD3_PIN PIND3
-#define PD3_RPORT PIND
-#define PD3_WPORT PORTD
-#define PD3_DDR DDRD
-#define PD3_PWM nullptr
-#undef PD4
-#define PD4_PIN PIND4
-#define PD4_RPORT PIND
-#define PD4_WPORT PORTD
-#define PD4_DDR DDRD
-#define PD4_PWM nullptr
-#undef PD5
-#define PD5_PIN PIND5
-#define PD5_RPORT PIND
-#define PD5_WPORT PORTD
-#define PD5_DDR DDRD
-#define PD5_PWM nullptr
-#undef PD6
-#define PD6_PIN PIND6
-#define PD6_RPORT PIND
-#define PD6_WPORT PORTD
-#define PD6_DDR DDRD
-#define PD6_PWM nullptr
-#undef PD7
-#define PD7_PIN PIND7
-#define PD7_RPORT PIND
-#define PD7_WPORT PORTD
-#define PD7_DDR DDRD
-#define PD7_PWM nullptr
-
-#undef PE0
-#define PE0_PIN PINE0
-#define PE0_RPORT PINE
-#define PE0_WPORT PORTE
-#define PE0_DDR DDRE
-#define PE0_PWM nullptr
-#undef PE1
-#define PE1_PIN PINE1
-#define PE1_RPORT PINE
-#define PE1_WPORT PORTE
-#define PE1_DDR DDRE
-#define PE1_PWM nullptr
-#undef PE2
-#define PE2_PIN PINE2
-#define PE2_RPORT PINE
-#define PE2_WPORT PORTE
-#define PE2_DDR DDRE
-#define PE2_PWM nullptr
-#undef PE3
-#define PE3_PIN PINE3
-#define PE3_RPORT PINE
-#define PE3_WPORT PORTE
-#define PE3_DDR DDRE
-#define PE3_PWM &OCR3AL
-#undef PE4
-#define PE4_PIN PINE4
-#define PE4_RPORT PINE
-#define PE4_WPORT PORTE
-#define PE4_DDR DDRE
-#define PE4_PWM &OCR3BL
-#undef PE5
-#define PE5_PIN PINE5
-#define PE5_RPORT PINE
-#define PE5_WPORT PORTE
-#define PE5_DDR DDRE
-#define PE5_PWM &OCR3CL
-#undef PE6
-#define PE6_PIN PINE6
-#define PE6_RPORT PINE
-#define PE6_WPORT PORTE
-#define PE6_DDR DDRE
-#define PE6_PWM nullptr
-#undef PE7
-#define PE7_PIN PINE7
-#define PE7_RPORT PINE
-#define PE7_WPORT PORTE
-#define PE7_DDR DDRE
-#define PE7_PWM nullptr
-
-#undef PF0
-#define PF0_PIN PINF0
-#define PF0_RPORT PINF
-#define PF0_WPORT PORTF
-#define PF0_DDR DDRF
-#define PF0_PWM nullptr
-#undef PF1
-#define PF1_PIN PINF1
-#define PF1_RPORT PINF
-#define PF1_WPORT PORTF
-#define PF1_DDR DDRF
-#define PF1_PWM nullptr
-#undef PF2
-#define PF2_PIN PINF2
-#define PF2_RPORT PINF
-#define PF2_WPORT PORTF
-#define PF2_DDR DDRF
-#define PF2_PWM nullptr
-#undef PF3
-#define PF3_PIN PINF3
-#define PF3_RPORT PINF
-#define PF3_WPORT PORTF
-#define PF3_DDR DDRF
-#define PF3_PWM nullptr
-#undef PF4
-#define PF4_PIN PINF4
-#define PF4_RPORT PINF
-#define PF4_WPORT PORTF
-#define PF4_DDR DDRF
-#define PF4_PWM nullptr
-#undef PF5
-#define PF5_PIN PINF5
-#define PF5_RPORT PINF
-#define PF5_WPORT PORTF
-#define PF5_DDR DDRF
-#define PF5_PWM nullptr
-#undef PF6
-#define PF6_PIN PINF6
-#define PF6_RPORT PINF
-#define PF6_WPORT PORTF
-#define PF6_DDR DDRF
-#define PF6_PWM nullptr
-#undef PF7
-#define PF7_PIN PINF7
-#define PF7_RPORT PINF
-#define PF7_WPORT PORTF
-#define PF7_DDR DDRF
-#define PF7_PWM nullptr
-
-#undef PG0
-#define PG0_PIN PING0
-#define PG0_RPORT PING
-#define PG0_WPORT PORTG
-#define PG0_DDR DDRG
-#define PG0_PWM nullptr
-#undef PG1
-#define PG1_PIN PING1
-#define PG1_RPORT PING
-#define PG1_WPORT PORTG
-#define PG1_DDR DDRG
-#define PG1_PWM nullptr
-#undef PG2
-#define PG2_PIN PING2
-#define PG2_RPORT PING
-#define PG2_WPORT PORTG
-#define PG2_DDR DDRG
-#define PG2_PWM nullptr
-#undef PG3
-#define PG3_PIN PING3
-#define PG3_RPORT PING
-#define PG3_WPORT PORTG
-#define PG3_DDR DDRG
-#define PG3_PWM nullptr
-#undef PG4
-#define PG4_PIN PING4
-#define PG4_RPORT PING
-#define PG4_WPORT PORTG
-#define PG4_DDR DDRG
-#define PG4_PWM nullptr
-#undef PG5
-#define PG5_PIN PING5
-#define PG5_RPORT PING
-#define PG5_WPORT PORTG
-#define PG5_DDR DDRG
-#define PG5_PWM &OCR0B
-
-#undef PH0
-#define PH0_PIN PINH0
-#define PH0_RPORT PINH
-#define PH0_WPORT PORTH
-#define PH0_DDR DDRH
-#define PH0_PWM nullptr
-#undef PH1
-#define PH1_PIN PINH1
-#define PH1_RPORT PINH
-#define PH1_WPORT PORTH
-#define PH1_DDR DDRH
-#define PH1_PWM nullptr
-#undef PH2
-#define PH2_PIN PINH2
-#define PH2_RPORT PINH
-#define PH2_WPORT PORTH
-#define PH2_DDR DDRH
-#define PH2_PWM nullptr
-#undef PH3
-#define PH3_PIN PINH3
-#define PH3_RPORT PINH
-#define PH3_WPORT PORTH
-#define PH3_DDR DDRH
-#define PH3_PWM &OCR4AL
-#undef PH4
-#define PH4_PIN PINH4
-#define PH4_RPORT PINH
-#define PH4_WPORT PORTH
-#define PH4_DDR DDRH
-#define PH4_PWM &OCR4BL
-#undef PH5
-#define PH5_PIN PINH5
-#define PH5_RPORT PINH
-#define PH5_WPORT PORTH
-#define PH5_DDR DDRH
-#define PH5_PWM &OCR4CL
-#undef PH6
-#define PH6_PIN PINH6
-#define PH6_RPORT PINH
-#define PH6_WPORT PORTH
-#define PH6_DDR DDRH
-#define PH6_PWM &OCR2B
-#undef PH7
-#define PH7_PIN PINH7
-#define PH7_RPORT PINH
-#define PH7_WPORT PORTH
-#define PH7_DDR DDRH
-#define PH7_PWM nullptr
-
-#undef PJ0
-#define PJ0_PIN PINJ0
-#define PJ0_RPORT PINJ
-#define PJ0_WPORT PORTJ
-#define PJ0_DDR DDRJ
-#define PJ0_PWM nullptr
-#undef PJ1
-#define PJ1_PIN PINJ1
-#define PJ1_RPORT PINJ
-#define PJ1_WPORT PORTJ
-#define PJ1_DDR DDRJ
-#define PJ1_PWM nullptr
-#undef PJ2
-#define PJ2_PIN PINJ2
-#define PJ2_RPORT PINJ
-#define PJ2_WPORT PORTJ
-#define PJ2_DDR DDRJ
-#define PJ2_PWM nullptr
-#undef PJ3
-#define PJ3_PIN PINJ3
-#define PJ3_RPORT PINJ
-#define PJ3_WPORT PORTJ
-#define PJ3_DDR DDRJ
-#define PJ3_PWM nullptr
-#undef PJ4
-#define PJ4_PIN PINJ4
-#define PJ4_RPORT PINJ
-#define PJ4_WPORT PORTJ
-#define PJ4_DDR DDRJ
-#define PJ4_PWM nullptr
-#undef PJ5
-#define PJ5_PIN PINJ5
-#define PJ5_RPORT PINJ
-#define PJ5_WPORT PORTJ
-#define PJ5_DDR DDRJ
-#define PJ5_PWM nullptr
-#undef PJ6
-#define PJ6_PIN PINJ6
-#define PJ6_RPORT PINJ
-#define PJ6_WPORT PORTJ
-#define PJ6_DDR DDRJ
-#define PJ6_PWM nullptr
-#undef PJ7
-#define PJ7_PIN PINJ7
-#define PJ7_RPORT PINJ
-#define PJ7_WPORT PORTJ
-#define PJ7_DDR DDRJ
-#define PJ7_PWM nullptr
-
-#undef PK0
-#define PK0_PIN PINK0
-#define PK0_RPORT PINK
-#define PK0_WPORT PORTK
-#define PK0_DDR DDRK
-#define PK0_PWM nullptr
-#undef PK1
-#define PK1_PIN PINK1
-#define PK1_RPORT PINK
-#define PK1_WPORT PORTK
-#define PK1_DDR DDRK
-#define PK1_PWM nullptr
-#undef PK2
-#define PK2_PIN PINK2
-#define PK2_RPORT PINK
-#define PK2_WPORT PORTK
-#define PK2_DDR DDRK
-#define PK2_PWM nullptr
-#undef PK3
-#define PK3_PIN PINK3
-#define PK3_RPORT PINK
-#define PK3_WPORT PORTK
-#define PK3_DDR DDRK
-#define PK3_PWM nullptr
-#undef PK4
-#define PK4_PIN PINK4
-#define PK4_RPORT PINK
-#define PK4_WPORT PORTK
-#define PK4_DDR DDRK
-#define PK4_PWM nullptr
-#undef PK5
-#define PK5_PIN PINK5
-#define PK5_RPORT PINK
-#define PK5_WPORT PORTK
-#define PK5_DDR DDRK
-#define PK5_PWM nullptr
-#undef PK6
-#define PK6_PIN PINK6
-#define PK6_RPORT PINK
-#define PK6_WPORT PORTK
-#define PK6_DDR DDRK
-#define PK6_PWM nullptr
-#undef PK7
-#define PK7_PIN PINK7
-#define PK7_RPORT PINK
-#define PK7_WPORT PORTK
-#define PK7_DDR DDRK
-#define PK7_PWM nullptr
-
-#undef PL0
-#define PL0_PIN PINL0
-#define PL0_RPORT PINL
-#define PL0_WPORT PORTL
-#define PL0_DDR DDRL
-#define PL0_PWM nullptr
-#undef PL1
-#define PL1_PIN PINL1
-#define PL1_RPORT PINL
-#define PL1_WPORT PORTL
-#define PL1_DDR DDRL
-#define PL1_PWM nullptr
-#undef PL2
-#define PL2_PIN PINL2
-#define PL2_RPORT PINL
-#define PL2_WPORT PORTL
-#define PL2_DDR DDRL
-#define PL2_PWM nullptr
-#undef PL3
-#define PL3_PIN PINL3
-#define PL3_RPORT PINL
-#define PL3_WPORT PORTL
-#define PL3_DDR DDRL
-#define PL3_PWM &OCR5AL
-#undef PL4
-#define PL4_PIN PINL4
-#define PL4_RPORT PINL
-#define PL4_WPORT PORTL
-#define PL4_DDR DDRL
-#define PL4_PWM &OCR5BL
-#undef PL5
-#define PL5_PIN PINL5
-#define PL5_RPORT PINL
-#define PL5_WPORT PORTL
-#define PL5_DDR DDRL
-#define PL5_PWM &OCR5CL
-#undef PL6
-#define PL6_PIN PINL6
-#define PL6_RPORT PINL
-#define PL6_WPORT PORTL
-#define PL6_DDR DDRL
-#define PL6_PWM nullptr
-#undef PL7
-#define PL7_PIN PINL7
-#define PL7_RPORT PINL
-#define PL7_WPORT PORTL
-#define PL7_DDR DDRL
-#define PL7_PWM nullptr
diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1281.h b/Marlin/src/HAL/AVR/fastio/fastio_1281.h
deleted file mode 100644
index e0bc5e2995d1..000000000000
--- a/Marlin/src/HAL/AVR/fastio/fastio_1281.h
+++ /dev/null
@@ -1,715 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Pin mapping for the 1281 and 2561
- *
- * Logical Pin: 38 39 40 41 42 43 44 45 16 10 11 12 06 07 08 09 30 31 32 33 34 35 36 37 17 18 19 20 21 22 23 24 00 01 13 05 02 03 14 15 46 47 48 49 50 51 52 53 25 26 27 28 29 04
- * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5
- */
-
-#include "../fastio.h"
-
-// change for your board
-#define DEBUG_LED DIO46
-
-// UART
-#define RXD DIO0
-#define TXD DIO1
-
-// SPI
-#define SCK DIO10
-#define MISO DIO12
-#define MOSI DIO11
-#define SS DIO16
-
-// TWI (I2C)
-#define SCL DIO17
-#define SDA DIO18
-
-// Timers and PWM
-#define OC0A DIO9
-#define OC0B DIO4
-#define OC1A DIO7
-#define OC1B DIO8
-#define OC2A DIO6
-#define OC3A DIO5
-#define OC3B DIO2
-#define OC3C DIO3
-
-// Digital I/O
-
-#define DIO0_PIN PINE0
-#define DIO0_RPORT PINE
-#define DIO0_WPORT PORTE
-#define DIO0_DDR DDRE
-#define DIO0_PWM nullptr
-
-#define DIO1_PIN PINE1
-#define DIO1_RPORT PINE
-#define DIO1_WPORT PORTE
-#define DIO1_DDR DDRE
-#define DIO1_PWM nullptr
-
-#define DIO2_PIN PINE4
-#define DIO2_RPORT PINE
-#define DIO2_WPORT PORTE
-#define DIO2_DDR DDRE
-#define DIO2_PWM &OCR3BL
-
-#define DIO3_PIN PINE5
-#define DIO3_RPORT PINE
-#define DIO3_WPORT PORTE
-#define DIO3_DDR DDRE
-#define DIO3_PWM &OCR3CL
-
-#define DIO4_PIN PING5
-#define DIO4_RPORT PING
-#define DIO4_WPORT PORTG
-#define DIO4_DDR DDRG
-#define DIO4_PWM &OCR0B
-
-#define DIO5_PIN PINE3
-#define DIO5_RPORT PINE
-#define DIO5_WPORT PORTE
-#define DIO5_DDR DDRE
-#define DIO5_PWM &OCR3AL
-
-#define DIO6_PIN PINB4
-#define DIO6_RPORT PINB
-#define DIO6_WPORT PORTB
-#define DIO6_DDR DDRB
-#define DIO6_PWM &OCR2AL
-
-#define DIO7_PIN PINB5
-#define DIO7_RPORT PINB
-#define DIO7_WPORT PORTB
-#define DIO7_DDR DDRB
-#define DIO7_PWM &OCR1AL
-
-#define DIO8_PIN PINB6
-#define DIO8_RPORT PINB
-#define DIO8_WPORT PORTB
-#define DIO8_DDR DDRB
-#define DIO8_PWM &OCR1BL
-
-#define DIO9_PIN PINB7
-#define DIO9_RPORT PINB
-#define DIO9_WPORT PORTB
-#define DIO9_DDR DDRB
-#define DIO9_PWM &OCR0AL
-
-#define DIO10_PIN PINB1
-#define DIO10_RPORT PINB
-#define DIO10_WPORT PORTB
-#define DIO10_DDR DDRB
-#define DIO10_PWM nullptr
-
-#define DIO11_PIN PINB2
-#define DIO11_RPORT PINB
-#define DIO11_WPORT PORTB
-#define DIO11_DDR DDRB
-#define DIO11_PWM nullptr
-
-#define DIO12_PIN PINB3
-#define DIO12_RPORT PINB
-#define DIO12_WPORT PORTB
-#define DIO12_DDR DDRB
-#define DIO12_PWM nullptr
-
-#define DIO13_PIN PINE2
-#define DIO13_RPORT PINE
-#define DIO13_WPORT PORTE
-#define DIO13_DDR DDRE
-#define DIO13_PWM nullptr
-
-#define DIO14_PIN PINE6
-#define DIO14_RPORT PINE
-#define DIO14_WPORT PORTE
-#define DIO14_DDR DDRE
-#define DIO14_PWM nullptr
-
-#define DIO15_PIN PINE7
-#define DIO15_RPORT PINE
-#define DIO15_WPORT PORTE
-#define DIO15_DDR DDRE
-#define DIO15_PWM nullptr
-
-#define DIO16_PIN PINB0
-#define DIO16_RPORT PINB
-#define DIO16_WPORT PORTB
-#define DIO16_DDR DDRB
-#define DIO16_PWM nullptr
-
-#define DIO17_PIN PIND0
-#define DIO17_RPORT PIND
-#define DIO17_WPORT PORTD
-#define DIO17_DDR DDRD
-#define DIO17_PWM nullptr
-
-#define DIO18_PIN PIND1
-#define DIO18_RPORT PIND
-#define DIO18_WPORT PORTD
-#define DIO18_DDR DDRD
-#define DIO18_PWM nullptr
-
-#define DIO19_PIN PIND2
-#define DIO19_RPORT PIND
-#define DIO19_WPORT PORTD
-#define DIO19_DDR DDRD
-#define DIO19_PWM nullptr
-
-#define DIO20_PIN PIND3
-#define DIO20_RPORT PIND
-#define DIO20_WPORT PORTD
-#define DIO20_DDR DDRD
-#define DIO20_PWM nullptr
-
-#define DIO21_PIN PIND4
-#define DIO21_RPORT PIND
-#define DIO21_WPORT PORTD
-#define DIO21_DDR DDRD
-#define DIO21_PWM nullptr
-
-#define DIO22_PIN PIND5
-#define DIO22_RPORT PIND
-#define DIO22_WPORT PORTD
-#define DIO22_DDR DDRD
-#define DIO22_PWM nullptr
-
-#define DIO23_PIN PIND6
-#define DIO23_RPORT PIND
-#define DIO23_WPORT PORTD
-#define DIO23_DDR DDRD
-#define DIO23_PWM nullptr
-
-#define DIO24_PIN PIND7
-#define DIO24_RPORT PIND
-#define DIO24_WPORT PORTD
-#define DIO24_DDR DDRD
-#define DIO24_PWM nullptr
-
-#define DIO25_PIN PING0
-#define DIO25_RPORT PING
-#define DIO25_WPORT PORTG
-#define DIO25_DDR DDRG
-#define DIO25_PWM nullptr
-
-#define DIO26_PIN PING1
-#define DIO26_RPORT PING
-#define DIO26_WPORT PORTG
-#define DIO26_DDR DDRG
-#define DIO26_PWM nullptr
-
-#define DIO27_PIN PING2
-#define DIO27_RPORT PING
-#define DIO27_WPORT PORTG
-#define DIO27_DDR DDRG
-#define DIO27_PWM nullptr
-
-#define DIO28_PIN PING3
-#define DIO28_RPORT PING
-#define DIO28_WPORT PORTG
-#define DIO28_DDR DDRG
-#define DIO28_PWM nullptr
-
-#define DIO29_PIN PING4
-#define DIO29_RPORT PING
-#define DIO29_WPORT PORTG
-#define DIO29_DDR DDRG
-#define DIO29_PWM nullptr
-
-#define DIO30_PIN PINC0
-#define DIO30_RPORT PINC
-#define DIO30_WPORT PORTC
-#define DIO30_DDR DDRC
-#define DIO30_PWM nullptr
-
-#define DIO31_PIN PINC1
-#define DIO31_RPORT PINC
-#define DIO31_WPORT PORTC
-#define DIO31_DDR DDRC
-#define DIO31_PWM nullptr
-
-#define DIO32_PIN PINC2
-#define DIO32_RPORT PINC
-#define DIO32_WPORT PORTC
-#define DIO32_DDR DDRC
-#define DIO32_PWM nullptr
-
-#define DIO33_PIN PINC3
-#define DIO33_RPORT PINC
-#define DIO33_WPORT PORTC
-#define DIO33_DDR DDRC
-#define DIO33_PWM nullptr
-
-#define DIO34_PIN PINC4
-#define DIO34_RPORT PINC
-#define DIO34_WPORT PORTC
-#define DIO34_DDR DDRC
-#define DIO34_PWM nullptr
-
-#define DIO35_PIN PINC5
-#define DIO35_RPORT PINC
-#define DIO35_WPORT PORTC
-#define DIO35_DDR DDRC
-#define DIO35_PWM nullptr
-
-#define DIO36_PIN PINC6
-#define DIO36_RPORT PINC
-#define DIO36_WPORT PORTC
-#define DIO36_DDR DDRC
-#define DIO36_PWM nullptr
-
-#define DIO37_PIN PINC7
-#define DIO37_RPORT PINC
-#define DIO37_WPORT PORTC
-#define DIO37_DDR DDRC
-#define DIO37_PWM nullptr
-
-#define DIO38_PIN PINA0
-#define DIO38_RPORT PINA
-#define DIO38_WPORT PORTA
-#define DIO38_DDR DDRA
-#define DIO38_PWM nullptr
-
-#define DIO39_PIN PINA1
-#define DIO39_RPORT PINA
-#define DIO39_WPORT PORTA
-#define DIO39_DDR DDRA
-#define DIO39_PWM nullptr
-
-#define DIO40_PIN PINA2
-#define DIO40_RPORT PINA
-#define DIO40_WPORT PORTA
-#define DIO40_DDR DDRA
-#define DIO40_PWM nullptr
-
-#define DIO41_PIN PINA3
-#define DIO41_RPORT PINA
-#define DIO41_WPORT PORTA
-#define DIO41_DDR DDRA
-#define DIO41_PWM nullptr
-
-#define DIO42_PIN PINA4
-#define DIO42_RPORT PINA
-#define DIO42_WPORT PORTA
-#define DIO42_DDR DDRA
-#define DIO42_PWM nullptr
-
-#define DIO43_PIN PINA5
-#define DIO43_RPORT PINA
-#define DIO43_WPORT PORTA
-#define DIO43_DDR DDRA
-#define DIO43_PWM nullptr
-
-#define DIO44_PIN PINA6
-#define DIO44_RPORT PINA
-#define DIO44_WPORT PORTA
-#define DIO44_DDR DDRA
-#define DIO44_PWM nullptr
-
-#define DIO45_PIN PINA7
-#define DIO45_RPORT PINA
-#define DIO45_WPORT PORTA
-#define DIO45_DDR DDRA
-#define DIO45_PWM nullptr
-
-#define DIO46_PIN PINF0
-#define DIO46_RPORT PINF
-#define DIO46_WPORT PORTF
-#define DIO46_DDR DDRF
-#define DIO46_PWM nullptr
-
-#define DIO47_PIN PINF1
-#define DIO47_RPORT PINF
-#define DIO47_WPORT PORTF
-#define DIO47_DDR DDRF
-#define DIO47_PWM nullptr
-
-#define DIO48_PIN PINF2
-#define DIO48_RPORT PINF
-#define DIO48_WPORT PORTF
-#define DIO48_DDR DDRF
-#define DIO48_PWM nullptr
-
-#define DIO49_PIN PINF3
-#define DIO49_RPORT PINF
-#define DIO49_WPORT PORTF
-#define DIO49_DDR DDRF
-#define DIO49_PWM nullptr
-
-#define DIO50_PIN PINF4
-#define DIO50_RPORT PINF
-#define DIO50_WPORT PORTF
-#define DIO50_DDR DDRF
-#define DIO50_PWM nullptr
-
-#define DIO51_PIN PINF5
-#define DIO51_RPORT PINF
-#define DIO51_WPORT PORTF
-#define DIO51_DDR DDRF
-#define DIO51_PWM nullptr
-
-#define DIO52_PIN PINF6
-#define DIO52_RPORT PINF
-#define DIO52_WPORT PORTF
-#define DIO52_DDR DDRF
-#define DIO52_PWM nullptr
-
-#define DIO53_PIN PINF7
-#define DIO53_RPORT PINF
-#define DIO53_WPORT PORTF
-#define DIO53_DDR DDRF
-#define DIO53_PWM nullptr
-
-#undef PA0
-#define PA0_PIN PINA0
-#define PA0_RPORT PINA
-#define PA0_WPORT PORTA
-#define PA0_DDR DDRA
-#define PA0_PWM nullptr
-#undef PA1
-#define PA1_PIN PINA1
-#define PA1_RPORT PINA
-#define PA1_WPORT PORTA
-#define PA1_DDR DDRA
-#define PA1_PWM nullptr
-#undef PA2
-#define PA2_PIN PINA2
-#define PA2_RPORT PINA
-#define PA2_WPORT PORTA
-#define PA2_DDR DDRA
-#define PA2_PWM nullptr
-#undef PA3
-#define PA3_PIN PINA3
-#define PA3_RPORT PINA
-#define PA3_WPORT PORTA
-#define PA3_DDR DDRA
-#define PA3_PWM nullptr
-#undef PA4
-#define PA4_PIN PINA4
-#define PA4_RPORT PINA
-#define PA4_WPORT PORTA
-#define PA4_DDR DDRA
-#define PA4_PWM nullptr
-#undef PA5
-#define PA5_PIN PINA5
-#define PA5_RPORT PINA
-#define PA5_WPORT PORTA
-#define PA5_DDR DDRA
-#define PA5_PWM nullptr
-#undef PA6
-#define PA6_PIN PINA6
-#define PA6_RPORT PINA
-#define PA6_WPORT PORTA
-#define PA6_DDR DDRA
-#define PA6_PWM nullptr
-#undef PA7
-#define PA7_PIN PINA7
-#define PA7_RPORT PINA
-#define PA7_WPORT PORTA
-#define PA7_DDR DDRA
-#define PA7_PWM nullptr
-
-#undef PB0
-#define PB0_PIN PINB0
-#define PB0_RPORT PINB
-#define PB0_WPORT PORTB
-#define PB0_DDR DDRB
-#define PB0_PWM nullptr
-#undef PB1
-#define PB1_PIN PINB1
-#define PB1_RPORT PINB
-#define PB1_WPORT PORTB
-#define PB1_DDR DDRB
-#define PB1_PWM nullptr
-#undef PB2
-#define PB2_PIN PINB2
-#define PB2_RPORT PINB
-#define PB2_WPORT PORTB
-#define PB2_DDR DDRB
-#define PB2_PWM nullptr
-#undef PB3
-#define PB3_PIN PINB3
-#define PB3_RPORT PINB
-#define PB3_WPORT PORTB
-#define PB3_DDR DDRB
-#define PB3_PWM nullptr
-#undef PB4
-#define PB4_PIN PINB4
-#define PB4_RPORT PINB
-#define PB4_WPORT PORTB
-#define PB4_DDR DDRB
-#define PB4_PWM &OCR2A
-#undef PB5
-#define PB5_PIN PINB5
-#define PB5_RPORT PINB
-#define PB5_WPORT PORTB
-#define PB5_DDR DDRB
-#define PB5_PWM nullptr
-#undef PB6
-#define PB6_PIN PINB6
-#define PB6_RPORT PINB
-#define PB6_WPORT PORTB
-#define PB6_DDR DDRB
-#define PB6_PWM nullptr
-#undef PB7
-#define PB7_PIN PINB7
-#define PB7_RPORT PINB
-#define PB7_WPORT PORTB
-#define PB7_DDR DDRB
-#define PB7_PWM &OCR0A
-
-#undef PC0
-#define PC0_PIN PINC0
-#define PC0_RPORT PINC
-#define PC0_WPORT PORTC
-#define PC0_DDR DDRC
-#define PC0_PWM nullptr
-#undef PC1
-#define PC1_PIN PINC1
-#define PC1_RPORT PINC
-#define PC1_WPORT PORTC
-#define PC1_DDR DDRC
-#define PC1_PWM nullptr
-#undef PC2
-#define PC2_PIN PINC2
-#define PC2_RPORT PINC
-#define PC2_WPORT PORTC
-#define PC2_DDR DDRC
-#define PC2_PWM nullptr
-#undef PC3
-#define PC3_PIN PINC3
-#define PC3_RPORT PINC
-#define PC3_WPORT PORTC
-#define PC3_DDR DDRC
-#define PC3_PWM nullptr
-#undef PC4
-#define PC4_PIN PINC4
-#define PC4_RPORT PINC
-#define PC4_WPORT PORTC
-#define PC4_DDR DDRC
-#define PC4_PWM nullptr
-#undef PC5
-#define PC5_PIN PINC5
-#define PC5_RPORT PINC
-#define PC5_WPORT PORTC
-#define PC5_DDR DDRC
-#define PC5_PWM nullptr
-#undef PC6
-#define PC6_PIN PINC6
-#define PC6_RPORT PINC
-#define PC6_WPORT PORTC
-#define PC6_DDR DDRC
-#define PC6_PWM nullptr
-#undef PC7
-#define PC7_PIN PINC7
-#define PC7_RPORT PINC
-#define PC7_WPORT PORTC
-#define PC7_DDR DDRC
-#define PC7_PWM nullptr
-
-#undef PD0
-#define PD0_PIN PIND0
-#define PD0_RPORT PIND
-#define PD0_WPORT PORTD
-#define PD0_DDR DDRD
-#define PD0_PWM nullptr
-#undef PD1
-#define PD1_PIN PIND1
-#define PD1_RPORT PIND
-#define PD1_WPORT PORTD
-#define PD1_DDR DDRD
-#define PD1_PWM nullptr
-#undef PD2
-#define PD2_PIN PIND2
-#define PD2_RPORT PIND
-#define PD2_WPORT PORTD
-#define PD2_DDR DDRD
-#define PD2_PWM nullptr
-#undef PD3
-#define PD3_PIN PIND3
-#define PD3_RPORT PIND
-#define PD3_WPORT PORTD
-#define PD3_DDR DDRD
-#define PD3_PWM nullptr
-#undef PD4
-#define PD4_PIN PIND4
-#define PD4_RPORT PIND
-#define PD4_WPORT PORTD
-#define PD4_DDR DDRD
-#define PD4_PWM nullptr
-#undef PD5
-#define PD5_PIN PIND5
-#define PD5_RPORT PIND
-#define PD5_WPORT PORTD
-#define PD5_DDR DDRD
-#define PD5_PWM nullptr
-#undef PD6
-#define PD6_PIN PIND6
-#define PD6_RPORT PIND
-#define PD6_WPORT PORTD
-#define PD6_DDR DDRD
-#define PD6_PWM nullptr
-#undef PD7
-#define PD7_PIN PIND7
-#define PD7_RPORT PIND
-#define PD7_WPORT PORTD
-#define PD7_DDR DDRD
-#define PD7_PWM nullptr
-
-#undef PE0
-#define PE0_PIN PINE0
-#define PE0_RPORT PINE
-#define PE0_WPORT PORTE
-#define PE0_DDR DDRE
-#define PE0_PWM nullptr
-#undef PE1
-#define PE1_PIN PINE1
-#define PE1_RPORT PINE
-#define PE1_WPORT PORTE
-#define PE1_DDR DDRE
-#define PE1_PWM nullptr
-#undef PE2
-#define PE2_PIN PINE2
-#define PE2_RPORT PINE
-#define PE2_WPORT PORTE
-#define PE2_DDR DDRE
-#define PE2_PWM nullptr
-#undef PE3
-#define PE3_PIN PINE3
-#define PE3_RPORT PINE
-#define PE3_WPORT PORTE
-#define PE3_DDR DDRE
-#define PE3_PWM &OCR3AL
-#undef PE4
-#define PE4_PIN PINE4
-#define PE4_RPORT PINE
-#define PE4_WPORT PORTE
-#define PE4_DDR DDRE
-#define PE4_PWM &OCR3BL
-#undef PE5
-#define PE5_PIN PINE5
-#define PE5_RPORT PINE
-#define PE5_WPORT PORTE
-#define PE5_DDR DDRE
-#define PE5_PWM &OCR3CL
-#undef PE6
-#define PE6_PIN PINE6
-#define PE6_RPORT PINE
-#define PE6_WPORT PORTE
-#define PE6_DDR DDRE
-#define PE6_PWM nullptr
-#undef PE7
-#define PE7_PIN PINE7
-#define PE7_RPORT PINE
-#define PE7_WPORT PORTE
-#define PE7_DDR DDRE
-#define PE7_PWM nullptr
-
-#undef PF0
-#define PF0_PIN PINF0
-#define PF0_RPORT PINF
-#define PF0_WPORT PORTF
-#define PF0_DDR DDRF
-#define PF0_PWM nullptr
-#undef PF1
-#define PF1_PIN PINF1
-#define PF1_RPORT PINF
-#define PF1_WPORT PORTF
-#define PF1_DDR DDRF
-#define PF1_PWM nullptr
-#undef PF2
-#define PF2_PIN PINF2
-#define PF2_RPORT PINF
-#define PF2_WPORT PORTF
-#define PF2_DDR DDRF
-#define PF2_PWM nullptr
-#undef PF3
-#define PF3_PIN PINF3
-#define PF3_RPORT PINF
-#define PF3_WPORT PORTF
-#define PF3_DDR DDRF
-#define PF3_PWM nullptr
-#undef PF4
-#define PF4_PIN PINF4
-#define PF4_RPORT PINF
-#define PF4_WPORT PORTF
-#define PF4_DDR DDRF
-#define PF4_PWM nullptr
-#undef PF5
-#define PF5_PIN PINF5
-#define PF5_RPORT PINF
-#define PF5_WPORT PORTF
-#define PF5_DDR DDRF
-#define PF5_PWM nullptr
-#undef PF6
-#define PF6_PIN PINF6
-#define PF6_RPORT PINF
-#define PF6_WPORT PORTF
-#define PF6_DDR DDRF
-#define PF6_PWM nullptr
-#undef PF7
-#define PF7_PIN PINF7
-#define PF7_RPORT PINF
-#define PF7_WPORT PORTF
-#define PF7_DDR DDRF
-#define PF7_PWM nullptr
-
-#undef PG0
-#define PG0_PIN PING0
-#define PG0_RPORT PING
-#define PG0_WPORT PORTG
-#define PG0_DDR DDRG
-#define PG0_PWM nullptr
-#undef PG1
-#define PG1_PIN PING1
-#define PG1_RPORT PING
-#define PG1_WPORT PORTG
-#define PG1_DDR DDRG
-#define PG1_PWM nullptr
-#undef PG2
-#define PG2_PIN PING2
-#define PG2_RPORT PING
-#define PG2_WPORT PORTG
-#define PG2_DDR DDRG
-#define PG2_PWM nullptr
-#undef PG3
-#define PG3_PIN PING3
-#define PG3_RPORT PING
-#define PG3_WPORT PORTG
-#define PG3_DDR DDRG
-#define PG3_PWM nullptr
-#undef PG4
-#define PG4_PIN PING4
-#define PG4_RPORT PING
-#define PG4_WPORT PORTG
-#define PG4_DDR DDRG
-#define PG4_PWM nullptr
-#undef PG5
-#define PG5_PIN PING5
-#define PG5_RPORT PING
-#define PG5_WPORT PORTG
-#define PG5_DDR DDRG
-#define PG5_PWM &OCR0B
diff --git a/Marlin/src/HAL/AVR/fastio/fastio_168.h b/Marlin/src/HAL/AVR/fastio/fastio_168.h
deleted file mode 100644
index 8cfdd1e8f825..000000000000
--- a/Marlin/src/HAL/AVR/fastio/fastio_168.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Pin mapping for the 168, 328, and 328P
- *
- * Logical Pin: 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00 01 02 03 04 05 06 07
- * Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7
- */
-
-#include "../fastio.h"
-
-#define DEBUG_LED AIO5
-
-// UART
-#define RXD DIO0
-#define TXD DIO1
-
-// SPI
-#define SCK DIO13
-#define MISO DIO12
-#define MOSI DIO11
-#define SS DIO10
-
-// TWI (I2C)
-#define SCL AIO5
-#define SDA AIO4
-
-// Timers and PWM
-#define OC0A DIO6
-#define OC0B DIO5
-#define OC1A DIO9
-#define OC1B DIO10
-#define OC2A DIO11
-#define OC2B DIO3
-
-// Digital I/O
-
-#define DIO0_PIN PIND0
-#define DIO0_RPORT PIND
-#define DIO0_WPORT PORTD
-#define DIO0_DDR DDRD
-#define DIO0_PWM nullptr
-
-#define DIO1_PIN PIND1
-#define DIO1_RPORT PIND
-#define DIO1_WPORT PORTD
-#define DIO1_DDR DDRD
-#define DIO1_PWM nullptr
-
-#define DIO2_PIN PIND2
-#define DIO2_RPORT PIND
-#define DIO2_WPORT PORTD
-#define DIO2_DDR DDRD
-#define DIO2_PWM nullptr
-
-#define DIO3_PIN PIND3
-#define DIO3_RPORT PIND
-#define DIO3_WPORT PORTD
-#define DIO3_DDR DDRD
-#define DIO3_PWM &OCR2B
-
-#define DIO4_PIN PIND4
-#define DIO4_RPORT PIND
-#define DIO4_WPORT PORTD
-#define DIO4_DDR DDRD
-#define DIO4_PWM nullptr
-
-#define DIO5_PIN PIND5
-#define DIO5_RPORT PIND
-#define DIO5_WPORT PORTD
-#define DIO5_DDR DDRD
-#define DIO5_PWM &OCR0B
-
-#define DIO6_PIN PIND6
-#define DIO6_RPORT PIND
-#define DIO6_WPORT PORTD
-#define DIO6_DDR DDRD
-#define DIO6_PWM &OCR0A
-
-#define DIO7_PIN PIND7
-#define DIO7_RPORT PIND
-#define DIO7_WPORT PORTD
-#define DIO7_DDR DDRD
-#define DIO7_PWM nullptr
-
-#define DIO8_PIN PINB0
-#define DIO8_RPORT PINB
-#define DIO8_WPORT PORTB
-#define DIO8_DDR DDRB
-#define DIO8_PWM nullptr
-
-#define DIO9_PIN PINB1
-#define DIO9_RPORT PINB
-#define DIO9_WPORT PORTB
-#define DIO9_DDR DDRB
-#define DIO9_PWM nullptr
-
-#define DIO10_PIN PINB2
-#define DIO10_RPORT PINB
-#define DIO10_WPORT PORTB
-#define DIO10_DDR DDRB
-#define DIO10_PWM nullptr
-
-#define DIO11_PIN PINB3
-#define DIO11_RPORT PINB
-#define DIO11_WPORT PORTB
-#define DIO11_DDR DDRB
-#define DIO11_PWM &OCR2A
-
-#define DIO12_PIN PINB4
-#define DIO12_RPORT PINB
-#define DIO12_WPORT PORTB
-#define DIO12_DDR DDRB
-#define DIO12_PWM nullptr
-
-#define DIO13_PIN PINB5
-#define DIO13_RPORT PINB
-#define DIO13_WPORT PORTB
-#define DIO13_DDR DDRB
-#define DIO13_PWM nullptr
-
-#define DIO14_PIN PINC0
-#define DIO14_RPORT PINC
-#define DIO14_WPORT PORTC
-#define DIO14_DDR DDRC
-#define DIO14_PWM nullptr
-
-#define DIO15_PIN PINC1
-#define DIO15_RPORT PINC
-#define DIO15_WPORT PORTC
-#define DIO15_DDR DDRC
-#define DIO15_PWM nullptr
-
-#define DIO16_PIN PINC2
-#define DIO16_RPORT PINC
-#define DIO16_WPORT PORTC
-#define DIO16_DDR DDRC
-#define DIO16_PWM nullptr
-
-#define DIO17_PIN PINC3
-#define DIO17_RPORT PINC
-#define DIO17_WPORT PORTC
-#define DIO17_DDR DDRC
-#define DIO17_PWM nullptr
-
-#define DIO18_PIN PINC4
-#define DIO18_RPORT PINC
-#define DIO18_WPORT PORTC
-#define DIO18_DDR DDRC
-#define DIO18_PWM nullptr
-
-#define DIO19_PIN PINC5
-#define DIO19_RPORT PINC
-#define DIO19_WPORT PORTC
-#define DIO19_DDR DDRC
-#define DIO19_PWM nullptr
-
-#define DIO20_PIN PINC6
-#define DIO20_RPORT PINC
-#define DIO20_WPORT PORTC
-#define DIO20_DDR DDRC
-#define DIO20_PWM nullptr
-
-#define DIO21_PIN PINC7
-#define DIO21_RPORT PINC
-#define DIO21_WPORT PORTC
-#define DIO21_DDR DDRC
-#define DIO21_PWM nullptr
-
-#undef PB0
-#define PB0_PIN PINB0
-#define PB0_RPORT PINB
-#define PB0_WPORT PORTB
-#define PB0_DDR DDRB
-#define PB0_PWM nullptr
-
-#undef PB1
-#define PB1_PIN PINB1
-#define PB1_RPORT PINB
-#define PB1_WPORT PORTB
-#define PB1_DDR DDRB
-#define PB1_PWM nullptr
-
-#undef PB2
-#define PB2_PIN PINB2
-#define PB2_RPORT PINB
-#define PB2_WPORT PORTB
-#define PB2_DDR DDRB
-#define PB2_PWM nullptr
-
-#undef PB3
-#define PB3_PIN PINB3
-#define PB3_RPORT PINB
-#define PB3_WPORT PORTB
-#define PB3_DDR DDRB
-#define PB3_PWM &OCR2A
-
-#undef PB4
-#define PB4_PIN PINB4
-#define PB4_RPORT PINB
-#define PB4_WPORT PORTB
-#define PB4_DDR DDRB
-#define PB4_PWM nullptr
-
-#undef PB5
-#define PB5_PIN PINB5
-#define PB5_RPORT PINB
-#define PB5_WPORT PORTB
-#define PB5_DDR DDRB
-#define PB5_PWM nullptr
-
-#undef PB6
-#define PB6_PIN PINB6
-#define PB6_RPORT PINB
-#define PB6_WPORT PORTB
-#define PB6_DDR DDRB
-#define PB6_PWM nullptr
-
-#undef PB7
-#define PB7_PIN PINB7
-#define PB7_RPORT PINB
-#define PB7_WPORT PORTB
-#define PB7_DDR DDRB
-#define PB7_PWM nullptr
-
-#undef PC0
-#define PC0_PIN PINC0
-#define PC0_RPORT PINC
-#define PC0_WPORT PORTC
-#define PC0_DDR DDRC
-#define PC0_PWM nullptr
-
-#undef PC1
-#define PC1_PIN PINC1
-#define PC1_RPORT PINC
-#define PC1_WPORT PORTC
-#define PC1_DDR DDRC
-#define PC1_PWM nullptr
-
-#undef PC2
-#define PC2_PIN PINC2
-#define PC2_RPORT PINC
-#define PC2_WPORT PORTC
-#define PC2_DDR DDRC
-#define PC2_PWM nullptr
-
-#undef PC3
-#define PC3_PIN PINC3
-#define PC3_RPORT PINC
-#define PC3_WPORT PORTC
-#define PC3_DDR DDRC
-#define PC3_PWM nullptr
-
-#undef PC4
-#define PC4_PIN PINC4
-#define PC4_RPORT PINC
-#define PC4_WPORT PORTC
-#define PC4_DDR DDRC
-#define PC4_PWM nullptr
-
-#undef PC5
-#define PC5_PIN PINC5
-#define PC5_RPORT PINC
-#define PC5_WPORT PORTC
-#define PC5_DDR DDRC
-#define PC5_PWM nullptr
-
-#undef PC6
-#define PC6_PIN PINC6
-#define PC6_RPORT PINC
-#define PC6_WPORT PORTC
-#define PC6_DDR DDRC
-#define PC6_PWM nullptr
-
-#undef PC7
-#define PC7_PIN PINC7
-#define PC7_RPORT PINC
-#define PC7_WPORT PORTC
-#define PC7_DDR DDRC
-#define PC7_PWM nullptr
-
-#undef PD0
-#define PD0_PIN PIND0
-#define PD0_RPORT PIND
-#define PD0_WPORT PORTD
-#define PD0_DDR DDRD
-#define PD0_PWM nullptr
-
-#undef PD1
-#define PD1_PIN PIND1
-#define PD1_RPORT PIND
-#define PD1_WPORT PORTD
-#define PD1_DDR DDRD
-#define PD1_PWM nullptr
-
-#undef PD2
-#define PD2_PIN PIND2
-#define PD2_RPORT PIND
-#define PD2_WPORT PORTD
-#define PD2_DDR DDRD
-#define PD2_PWM nullptr
-
-#undef PD3
-#define PD3_PIN PIND3
-#define PD3_RPORT PIND
-#define PD3_WPORT PORTD
-#define PD3_DDR DDRD
-#define PD3_PWM &OCR2B
-
-#undef PD4
-#define PD4_PIN PIND4
-#define PD4_RPORT PIND
-#define PD4_WPORT PORTD
-#define PD4_DDR DDRD
-#define PD4_PWM nullptr
-
-#undef PD5
-#define PD5_PIN PIND5
-#define PD5_RPORT PIND
-#define PD5_WPORT PORTD
-#define PD5_DDR DDRD
-#define PD5_PWM &OCR0B
-
-#undef PD6
-#define PD6_PIN PIND6
-#define PD6_RPORT PIND
-#define PD6_WPORT PORTD
-#define PD6_DDR DDRD
-#define PD6_PWM &OCR0A
-
-#undef PD7
-#define PD7_PIN PIND7
-#define PD7_RPORT PIND
-#define PD7_WPORT PORTD
-#define PD7_DDR DDRD
-#define PD7_PWM nullptr
diff --git a/Marlin/src/HAL/AVR/fastio/fastio_644.h b/Marlin/src/HAL/AVR/fastio/fastio_644.h
deleted file mode 100644
index f4a9427e0abf..000000000000
--- a/Marlin/src/HAL/AVR/fastio/fastio_644.h
+++ /dev/null
@@ -1,552 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Pin mapping for the 644, 644p, 644pa, and 1284p
- *
- * Logical Pin: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
- * Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0
- */
-
-/** ATMega644
- *
- * +---\/---+
- * (D 0) PB0 1| |40 PA0 (AI 0 / D31)
- * (D 1) PB1 2| |39 PA1 (AI 1 / D30)
- * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29)
- * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28)
- * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27)
- * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26)
- * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)
- * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)
- * RST 9| |32 AREF
- * VCC 10| |31 GND
- * GND 11| |30 AVCC
- * XTAL2 12| |29 PC7 (D 23)
- * XTAL1 13| |28 PC6 (D 22)
- * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI
- * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO
- * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS
- * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK
- * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA
- * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL
- * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
- * +--------+
- */
-
-#include "../fastio.h"
-
-#define DEBUG_LED DIO0
-
-// UART
-#define RXD DIO8
-#define TXD DIO9
-#define RXD0 DIO8
-#define TXD0 DIO9
-
-#define RXD1 DIO10
-#define TXD1 DIO11
-
-// SPI
-#define SCK DIO7
-#define MISO DIO6
-#define MOSI DIO5
-#define SS DIO4
-
-// TWI (I2C)
-#define SCL DIO16
-#define SDA DIO17
-
-// Timers and PWM
-#define OC0A DIO3
-#define OC0B DIO4
-#define OC1A DIO13
-#define OC1B DIO12
-#define OC2A DIO15
-#define OC2B DIO14
-
-// Digital I/O
-
-#define DIO0_PIN PINB0
-#define DIO0_RPORT PINB
-#define DIO0_WPORT PORTB
-#define DIO0_DDR DDRB
-#define DIO0_PWM nullptr
-
-#define DIO1_PIN PINB1
-#define DIO1_RPORT PINB
-#define DIO1_WPORT PORTB
-#define DIO1_DDR DDRB
-#define DIO1_PWM nullptr
-
-#define DIO2_PIN PINB2
-#define DIO2_RPORT PINB
-#define DIO2_WPORT PORTB
-#define DIO2_DDR DDRB
-#define DIO2_PWM nullptr
-
-#define DIO3_PIN PINB3
-#define DIO3_RPORT PINB
-#define DIO3_WPORT PORTB
-#define DIO3_DDR DDRB
-#define DIO3_PWM &OCR0A
-
-#define DIO4_PIN PINB4
-#define DIO4_RPORT PINB
-#define DIO4_WPORT PORTB
-#define DIO4_DDR DDRB
-#define DIO4_PWM &OCR0B
-
-#define DIO5_PIN PINB5
-#define DIO5_RPORT PINB
-#define DIO5_WPORT PORTB
-#define DIO5_DDR DDRB
-#define DIO5_PWM nullptr
-
-#define DIO6_PIN PINB6
-#define DIO6_RPORT PINB
-#define DIO6_WPORT PORTB
-#define DIO6_DDR DDRB
-#define DIO6_PWM nullptr
-
-#define DIO7_PIN PINB7
-#define DIO7_RPORT PINB
-#define DIO7_WPORT PORTB
-#define DIO7_DDR DDRB
-#define DIO7_PWM nullptr
-
-#define DIO8_PIN PIND0
-#define DIO8_RPORT PIND
-#define DIO8_WPORT PORTD
-#define DIO8_DDR DDRD
-#define DIO8_PWM nullptr
-
-#define DIO9_PIN PIND1
-#define DIO9_RPORT PIND
-#define DIO9_WPORT PORTD
-#define DIO9_DDR DDRD
-#define DIO9_PWM nullptr
-
-#define DIO10_PIN PIND2
-#define DIO10_RPORT PIND
-#define DIO10_WPORT PORTD
-#define DIO10_DDR DDRD
-#define DIO10_PWM nullptr
-
-#define DIO11_PIN PIND3
-#define DIO11_RPORT PIND
-#define DIO11_WPORT PORTD
-#define DIO11_DDR DDRD
-#define DIO11_PWM nullptr
-
-#define DIO12_PIN PIND4
-#define DIO12_RPORT PIND
-#define DIO12_WPORT PORTD
-#define DIO12_DDR DDRD
-#define DIO12_PWM &OCR1B
-
-#define DIO13_PIN PIND5
-#define DIO13_RPORT PIND
-#define DIO13_WPORT PORTD
-#define DIO13_DDR DDRD
-#define DIO13_PWM &OCR1A
-
-#define DIO14_PIN PIND6
-#define DIO14_RPORT PIND
-#define DIO14_WPORT PORTD
-#define DIO14_DDR DDRD
-#define DIO14_PWM &OCR2B
-
-#define DIO15_PIN PIND7
-#define DIO15_RPORT PIND
-#define DIO15_WPORT PORTD
-#define DIO15_DDR DDRD
-#define DIO15_PWM &OCR2A
-
-#define DIO16_PIN PINC0
-#define DIO16_RPORT PINC
-#define DIO16_WPORT PORTC
-#define DIO16_DDR DDRC
-#define DIO16_PWM nullptr
-
-#define DIO17_PIN PINC1
-#define DIO17_RPORT PINC
-#define DIO17_WPORT PORTC
-#define DIO17_DDR DDRC
-#define DIO17_PWM nullptr
-
-#define DIO18_PIN PINC2
-#define DIO18_RPORT PINC
-#define DIO18_WPORT PORTC
-#define DIO18_DDR DDRC
-#define DIO18_PWM nullptr
-
-#define DIO19_PIN PINC3
-#define DIO19_RPORT PINC
-#define DIO19_WPORT PORTC
-#define DIO19_DDR DDRC
-#define DIO19_PWM nullptr
-
-#define DIO20_PIN PINC4
-#define DIO20_RPORT PINC
-#define DIO20_WPORT PORTC
-#define DIO20_DDR DDRC
-#define DIO20_PWM nullptr
-
-#define DIO21_PIN PINC5
-#define DIO21_RPORT PINC
-#define DIO21_WPORT PORTC
-#define DIO21_DDR DDRC
-#define DIO21_PWM nullptr
-
-#define DIO22_PIN PINC6
-#define DIO22_RPORT PINC
-#define DIO22_WPORT PORTC
-#define DIO22_DDR DDRC
-#define DIO22_PWM nullptr
-
-#define DIO23_PIN PINC7
-#define DIO23_RPORT PINC
-#define DIO23_WPORT PORTC
-#define DIO23_DDR DDRC
-#define DIO23_PWM nullptr
-
-#define DIO24_PIN PINA7
-#define DIO24_RPORT PINA
-#define DIO24_WPORT PORTA
-#define DIO24_DDR DDRA
-#define DIO24_PWM nullptr
-
-#define DIO25_PIN PINA6
-#define DIO25_RPORT PINA
-#define DIO25_WPORT PORTA
-#define DIO25_DDR DDRA
-#define DIO25_PWM nullptr
-
-#define DIO26_PIN PINA5
-#define DIO26_RPORT PINA
-#define DIO26_WPORT PORTA
-#define DIO26_DDR DDRA
-#define DIO26_PWM nullptr
-
-#define DIO27_PIN PINA4
-#define DIO27_RPORT PINA
-#define DIO27_WPORT PORTA
-#define DIO27_DDR DDRA
-#define DIO27_PWM nullptr
-
-#define DIO28_PIN PINA3
-#define DIO28_RPORT PINA
-#define DIO28_WPORT PORTA
-#define DIO28_DDR DDRA
-#define DIO28_PWM nullptr
-
-#define DIO29_PIN PINA2
-#define DIO29_RPORT PINA
-#define DIO29_WPORT PORTA
-#define DIO29_DDR DDRA
-#define DIO29_PWM nullptr
-
-#define DIO30_PIN PINA1
-#define DIO30_RPORT PINA
-#define DIO30_WPORT PORTA
-#define DIO30_DDR DDRA
-#define DIO30_PWM nullptr
-
-#define DIO31_PIN PINA0
-#define DIO31_RPORT PINA
-#define DIO31_WPORT PORTA
-#define DIO31_DDR DDRA
-#define DIO31_PWM nullptr
-
-#define AIO0_PIN PINA0
-#define AIO0_RPORT PINA
-#define AIO0_WPORT PORTA
-#define AIO0_DDR DDRA
-#define AIO0_PWM nullptr
-
-#define AIO1_PIN PINA1
-#define AIO1_RPORT PINA
-#define AIO1_WPORT PORTA
-#define AIO1_DDR DDRA
-#define AIO1_PWM nullptr
-
-#define AIO2_PIN PINA2
-#define AIO2_RPORT PINA
-#define AIO2_WPORT PORTA
-#define AIO2_DDR DDRA
-#define AIO2_PWM nullptr
-
-#define AIO3_PIN PINA3
-#define AIO3_RPORT PINA
-#define AIO3_WPORT PORTA
-#define AIO3_DDR DDRA
-#define AIO3_PWM nullptr
-
-#define AIO4_PIN PINA4
-#define AIO4_RPORT PINA
-#define AIO4_WPORT PORTA
-#define AIO4_DDR DDRA
-#define AIO4_PWM nullptr
-
-#define AIO5_PIN PINA5
-#define AIO5_RPORT PINA
-#define AIO5_WPORT PORTA
-#define AIO5_DDR DDRA
-#define AIO5_PWM nullptr
-
-#define AIO6_PIN PINA6
-#define AIO6_RPORT PINA
-#define AIO6_WPORT PORTA
-#define AIO6_DDR DDRA
-#define AIO6_PWM nullptr
-
-#define AIO7_PIN PINA7
-#define AIO7_RPORT PINA
-#define AIO7_WPORT PORTA
-#define AIO7_DDR DDRA
-#define AIO7_PWM nullptr
-
-#undef PA0
-#define PA0_PIN PINA0
-#define PA0_RPORT PINA
-#define PA0_WPORT PORTA
-#define PA0_DDR DDRA
-#define PA0_PWM nullptr
-
-#undef PA1
-#define PA1_PIN PINA1
-#define PA1_RPORT PINA
-#define PA1_WPORT PORTA
-#define PA1_DDR DDRA
-#define PA1_PWM nullptr
-
-#undef PA2
-#define PA2_PIN PINA2
-#define PA2_RPORT PINA
-#define PA2_WPORT PORTA
-#define PA2_DDR DDRA
-#define PA2_PWM nullptr
-
-#undef PA3
-#define PA3_PIN PINA3
-#define PA3_RPORT PINA
-#define PA3_WPORT PORTA
-#define PA3_DDR DDRA
-#define PA3_PWM nullptr
-
-#undef PA4
-#define PA4_PIN PINA4
-#define PA4_RPORT PINA
-#define PA4_WPORT PORTA
-#define PA4_DDR DDRA
-#define PA4_PWM nullptr
-
-#undef PA5
-#define PA5_PIN PINA5
-#define PA5_RPORT PINA
-#define PA5_WPORT PORTA
-#define PA5_DDR DDRA
-#define PA5_PWM nullptr
-
-#undef PA6
-#define PA6_PIN PINA6
-#define PA6_RPORT PINA
-#define PA6_WPORT PORTA
-#define PA6_DDR DDRA
-#define PA6_PWM nullptr
-
-#undef PA7
-#define PA7_PIN PINA7
-#define PA7_RPORT PINA
-#define PA7_WPORT PORTA
-#define PA7_DDR DDRA
-#define PA7_PWM nullptr
-
-#undef PB0
-#define PB0_PIN PINB0
-#define PB0_RPORT PINB
-#define PB0_WPORT PORTB
-#define PB0_DDR DDRB
-#define PB0_PWM nullptr
-
-#undef PB1
-#define PB1_PIN PINB1
-#define PB1_RPORT PINB
-#define PB1_WPORT PORTB
-#define PB1_DDR DDRB
-#define PB1_PWM nullptr
-
-#undef PB2
-#define PB2_PIN PINB2
-#define PB2_RPORT PINB
-#define PB2_WPORT PORTB
-#define PB2_DDR DDRB
-#define PB2_PWM nullptr
-
-#undef PB3
-#define PB3_PIN PINB3
-#define PB3_RPORT PINB
-#define PB3_WPORT PORTB
-#define PB3_DDR DDRB
-#define PB3_PWM &OCR0A
-
-#undef PB4
-#define PB4_PIN PINB4
-#define PB4_RPORT PINB
-#define PB4_WPORT PORTB
-#define PB4_DDR DDRB
-#define PB4_PWM &OCR0B
-
-#undef PB5
-#define PB5_PIN PINB5
-#define PB5_RPORT PINB
-#define PB5_WPORT PORTB
-#define PB5_DDR DDRB
-#define PB5_PWM nullptr
-
-#undef PB6
-#define PB6_PIN PINB6
-#define PB6_RPORT PINB
-#define PB6_WPORT PORTB
-#define PB6_DDR DDRB
-#define PB6_PWM nullptr
-
-#undef PB7
-#define PB7_PIN PINB7
-#define PB7_RPORT PINB
-#define PB7_WPORT PORTB
-#define PB7_DDR DDRB
-#define PB7_PWM nullptr
-
-#undef PC0
-#define PC0_PIN PINC0
-#define PC0_RPORT PINC
-#define PC0_WPORT PORTC
-#define PC0_DDR DDRC
-#define PC0_PWM nullptr
-
-#undef PC1
-#define PC1_PIN PINC1
-#define PC1_RPORT PINC
-#define PC1_WPORT PORTC
-#define PC1_DDR DDRC
-#define PC1_PWM nullptr
-
-#undef PC2
-#define PC2_PIN PINC2
-#define PC2_RPORT PINC
-#define PC2_WPORT PORTC
-#define PC2_DDR DDRC
-#define PC2_PWM nullptr
-
-#undef PC3
-#define PC3_PIN PINC3
-#define PC3_RPORT PINC
-#define PC3_WPORT PORTC
-#define PC3_DDR DDRC
-#define PC3_PWM nullptr
-
-#undef PC4
-#define PC4_PIN PINC4
-#define PC4_RPORT PINC
-#define PC4_WPORT PORTC
-#define PC4_DDR DDRC
-#define PC4_PWM nullptr
-
-#undef PC5
-#define PC5_PIN PINC5
-#define PC5_RPORT PINC
-#define PC5_WPORT PORTC
-#define PC5_DDR DDRC
-#define PC5_PWM nullptr
-
-#undef PC6
-#define PC6_PIN PINC6
-#define PC6_RPORT PINC
-#define PC6_WPORT PORTC
-#define PC6_DDR DDRC
-#define PC6_PWM nullptr
-
-#undef PC7
-#define PC7_PIN PINC7
-#define PC7_RPORT PINC
-#define PC7_WPORT PORTC
-#define PC7_DDR DDRC
-#define PC7_PWM nullptr
-
-#undef PD0
-#define PD0_PIN PIND0
-#define PD0_RPORT PIND
-#define PD0_WPORT PORTD
-#define PD0_DDR DDRD
-#define PD0_PWM nullptr
-
-#undef PD1
-#define PD1_PIN PIND1
-#define PD1_RPORT PIND
-#define PD1_WPORT PORTD
-#define PD1_DDR DDRD
-#define PD1_PWM nullptr
-
-#undef PD2
-#define PD2_PIN PIND2
-#define PD2_RPORT PIND
-#define PD2_WPORT PORTD
-#define PD2_DDR DDRD
-#define PD2_PWM nullptr
-
-#undef PD3
-#define PD3_PIN PIND3
-#define PD3_RPORT PIND
-#define PD3_WPORT PORTD
-#define PD3_DDR DDRD
-#define PD3_PWM nullptr
-
-#undef PD4
-#define PD4_PIN PIND4
-#define PD4_RPORT PIND
-#define PD4_WPORT PORTD
-#define PD4_DDR DDRD
-#define PD4_PWM nullptr
-
-#undef PD5
-#define PD5_PIN PIND5
-#define PD5_RPORT PIND
-#define PD5_WPORT PORTD
-#define PD5_DDR DDRD
-#define PD5_PWM nullptr
-
-#undef PD6
-#define PD6_PIN PIND6
-#define PD6_RPORT PIND
-#define PD6_WPORT PORTD
-#define PD6_DDR DDRD
-#define PD6_PWM &OCR2B
-
-#undef PD7
-#define PD7_PIN PIND7
-#define PD7_RPORT PIND
-#define PD7_WPORT PORTD
-#define PD7_DDR DDRD
-#define PD7_PWM &OCR2A
diff --git a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h
deleted file mode 100644
index 51d400b70565..000000000000
--- a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h
+++ /dev/null
@@ -1,697 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Pin mapping (Teensy) for AT90USB646, 647, 1286, and 1287
- *
- * Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45
- * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7
- * The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3
- */
-
-#include "../fastio.h"
-
-// change for your board
-#define DEBUG_LED DIO31 /* led D5 red */
-
-// SPI
-#define SCK DIO21 // 9
-#define MISO DIO23 // 11
-#define MOSI DIO22 // 10
-#define SS DIO20 // 8
-
-// Digital I/O
-
-#define DIO0_PIN PIND0
-#define DIO0_RPORT PIND
-#define DIO0_WPORT PORTD
-#define DIO0_PWM 0
-#define DIO0_DDR DDRD
-
-#define DIO1_PIN PIND1
-#define DIO1_RPORT PIND
-#define DIO1_WPORT PORTD
-#define DIO1_PWM 0
-#define DIO1_DDR DDRD
-
-#define DIO2_PIN PIND2
-#define DIO2_RPORT PIND
-#define DIO2_WPORT PORTD
-#define DIO2_PWM 0
-#define DIO2_DDR DDRD
-
-#define DIO3_PIN PIND3
-#define DIO3_RPORT PIND
-#define DIO3_WPORT PORTD
-#define DIO3_PWM 0
-#define DIO3_DDR DDRD
-
-#define DIO4_PIN PIND4
-#define DIO4_RPORT PIND
-#define DIO4_WPORT PORTD
-#define DIO4_PWM 0
-#define DIO4_DDR DDRD
-
-#define DIO5_PIN PIND5
-#define DIO5_RPORT PIND
-#define DIO5_WPORT PORTD
-#define DIO5_PWM 0
-#define DIO5_DDR DDRD
-
-#define DIO6_PIN PIND6
-#define DIO6_RPORT PIND
-#define DIO6_WPORT PORTD
-#define DIO6_PWM 0
-#define DIO6_DDR DDRD
-
-#define DIO7_PIN PIND7
-#define DIO7_RPORT PIND
-#define DIO7_WPORT PORTD
-#define DIO7_PWM 0
-#define DIO7_DDR DDRD
-
-#define DIO8_PIN PINE0
-#define DIO8_RPORT PINE
-#define DIO8_WPORT PORTE
-#define DIO8_PWM 0
-#define DIO8_DDR DDRE
-
-#define DIO9_PIN PINE1
-#define DIO9_RPORT PINE
-#define DIO9_WPORT PORTE
-#define DIO9_PWM 0
-#define DIO9_DDR DDRE
-
-#define DIO10_PIN PINC0
-#define DIO10_RPORT PINC
-#define DIO10_WPORT PORTC
-#define DIO10_PWM 0
-#define DIO10_DDR DDRC
-
-#define DIO11_PIN PINC1
-#define DIO11_RPORT PINC
-#define DIO11_WPORT PORTC
-#define DIO11_PWM 0
-#define DIO11_DDR DDRC
-
-#define DIO12_PIN PINC2
-#define DIO12_RPORT PINC
-#define DIO12_WPORT PORTC
-#define DIO12_PWM 0
-#define DIO12_DDR DDRC
-
-#define DIO13_PIN PINC3
-#define DIO13_RPORT PINC
-#define DIO13_WPORT PORTC
-#define DIO13_PWM 0
-#define DIO13_DDR DDRC
-
-#define DIO14_PIN PINC4
-#define DIO14_RPORT PINC
-#define DIO14_WPORT PORTC
-#define DIO14_PWM 0 // OC3C
-#define DIO14_DDR DDRC
-
-#define DIO15_PIN PINC5
-#define DIO15_RPORT PINC
-#define DIO15_WPORT PORTC
-#define DIO15_PWM 0 // OC3B
-#define DIO15_DDR DDRC
-
-#define DIO16_PIN PINC6
-#define DIO16_RPORT PINC
-#define DIO16_WPORT PORTC
-#define DIO16_PWM 0 // OC3A
-#define DIO16_DDR DDRC
-
-#define DIO17_PIN PINC7
-#define DIO17_RPORT PINC
-#define DIO17_WPORT PORTC
-#define DIO17_PWM 0
-#define DIO17_DDR DDRC
-
-#define DIO18_PIN PINE6
-#define DIO18_RPORT PINE
-#define DIO18_WPORT PORTE
-#define DIO18_PWM 0
-#define DIO18_DDR DDRE
-
-#define DIO19_PIN PINE7
-#define DIO19_RPORT PINE
-#define DIO19_WPORT PORTE
-#define DIO19_PWM 0
-#define DIO19_DDR DDRE
-
-#define DIO20_PIN PINB0
-#define DIO20_RPORT PINB
-#define DIO20_WPORT PORTB
-#define DIO20_PWM 0
-#define DIO20_DDR DDRB
-
-#define DIO21_PIN PINB1
-#define DIO21_RPORT PINB
-#define DIO21_WPORT PORTB
-#define DIO21_PWM 0
-#define DIO21_DDR DDRB
-
-#define DIO22_PIN PINB2
-#define DIO22_RPORT PINB
-#define DIO22_WPORT PORTB
-#define DIO22_PWM 0
-#define DIO22_DDR DDRB
-
-#define DIO23_PIN PINB3
-#define DIO23_RPORT PINB
-#define DIO23_WPORT PORTB
-#define DIO23_PWM 0
-#define DIO23_DDR DDRB
-
-#define DIO24_PIN PINB4
-#define DIO24_RPORT PINB
-#define DIO24_WPORT PORTB
-#define DIO24_PWM 0 // OC2A
-#define DIO24_DDR DDRB
-
-#define DIO25_PIN PINB5
-#define DIO25_RPORT PINB
-#define DIO25_WPORT PORTB
-#define DIO25_PWM 0 // OC1A
-#define DIO25_DDR DDRB
-
-#define DIO26_PIN PINB6
-#define DIO26_RPORT PINB
-#define DIO26_WPORT PORTB
-#define DIO26_PWM 0 // OC1B
-#define DIO26_DDR DDRB
-
-#define DIO27_PIN PINB7
-#define DIO27_RPORT PINB
-#define DIO27_WPORT PORTB
-#define DIO27_PWM 0 // OC1C
-#define DIO27_DDR DDRB
-
-#define DIO28_PIN PINA0
-#define DIO28_RPORT PINA
-#define DIO28_WPORT PORTA
-#define DIO28_PWM 0
-#define DIO28_DDR DDRA
-
-#define DIO29_PIN PINA1
-#define DIO29_RPORT PINA
-#define DIO29_WPORT PORTA
-#define DIO29_PWM 0
-#define DIO29_DDR DDRA
-
-#define DIO30_PIN PINA2
-#define DIO30_RPORT PINA
-#define DIO30_WPORT PORTA
-#define DIO30_PWM 0
-#define DIO30_DDR DDRA
-
-#define DIO31_PIN PINA3
-#define DIO31_RPORT PINA
-#define DIO31_WPORT PORTA
-#define DIO31_PWM 0
-#define DIO31_DDR DDRA
-
-#define DIO32_PIN PINA4
-#define DIO32_RPORT PINA
-#define DIO32_WPORT PORTA
-#define DIO32_PWM 0
-#define DIO32_DDR DDRA
-
-#define DIO33_PIN PINA5
-#define DIO33_RPORT PINA
-#define DIO33_WPORT PORTA
-#define DIO33_PWM 0
-#define DIO33_DDR DDRA
-
-#define DIO34_PIN PINA6
-#define DIO34_RPORT PINA
-#define DIO34_WPORT PORTA
-#define DIO34_PWM 0
-#define DIO34_DDR DDRA
-
-#define DIO35_PIN PINA7
-#define DIO35_RPORT PINA
-#define DIO35_WPORT PORTA
-#define DIO35_PWM 0
-#define DIO35_DDR DDRA
-
-#define DIO36_PIN PINE4
-#define DIO36_RPORT PINE
-#define DIO36_WPORT PORTE
-#define DIO36_PWM 0
-#define DIO36_DDR DDRE
-
-#define DIO37_PIN PINE5
-#define DIO37_RPORT PINE
-#define DIO37_WPORT PORTE
-#define DIO37_PWM 0
-#define DIO37_DDR DDRE
-
-#define DIO38_PIN PINF0
-#define DIO38_RPORT PINF
-#define DIO38_WPORT PORTF
-#define DIO38_PWM 0
-#define DIO38_DDR DDRF
-
-#define DIO39_PIN PINF1
-#define DIO39_RPORT PINF
-#define DIO39_WPORT PORTF
-#define DIO39_PWM 0
-#define DIO39_DDR DDRF
-
-#define DIO40_PIN PINF2
-#define DIO40_RPORT PINF
-#define DIO40_WPORT PORTF
-#define DIO40_PWM 0
-#define DIO40_DDR DDRF
-
-#define DIO41_PIN PINF3
-#define DIO41_RPORT PINF
-#define DIO41_WPORT PORTF
-#define DIO41_PWM 0
-#define DIO41_DDR DDRF
-
-#define DIO42_PIN PINF4
-#define DIO42_RPORT PINF
-#define DIO42_WPORT PORTF
-#define DIO42_PWM 0
-#define DIO42_DDR DDRF
-
-#define DIO43_PIN PINF5
-#define DIO43_RPORT PINF
-#define DIO43_WPORT PORTF
-#define DIO43_PWM 0
-#define DIO43_DDR DDRF
-
-#define DIO44_PIN PINF6
-#define DIO44_RPORT PINF
-#define DIO44_WPORT PORTF
-#define DIO44_PWM 0
-#define DIO44_DDR DDRF
-
-#define DIO45_PIN PINF7
-#define DIO45_RPORT PINF
-#define DIO45_WPORT PORTF
-#define DIO45_PWM 0
-#define DIO45_DDR DDRF
-
-#define AIO0_PIN PINF0
-#define AIO0_RPORT PINF
-#define AIO0_WPORT PORTF
-#define AIO0_PWM 0
-#define AIO0_DDR DDRF
-
-#define AIO1_PIN PINF1
-#define AIO1_RPORT PINF
-#define AIO1_WPORT PORTF
-#define AIO1_PWM 0
-#define AIO1_DDR DDRF
-
-#define AIO2_PIN PINF2
-#define AIO2_RPORT PINF
-#define AIO2_WPORT PORTF
-#define AIO2_PWM 0
-#define AIO2_DDR DDRF
-
-#define AIO3_PIN PINF3
-#define AIO3_RPORT PINF
-#define AIO3_WPORT PORTF
-#define AIO3_PWM 0
-#define AIO3_DDR DDRF
-
-#define AIO4_PIN PINF4
-#define AIO4_RPORT PINF
-#define AIO4_WPORT PORTF
-#define AIO4_PWM 0
-#define AIO4_DDR DDRF
-
-#define AIO5_PIN PINF5
-#define AIO5_RPORT PINF
-#define AIO5_WPORT PORTF
-#define AIO5_PWM 0
-#define AIO5_DDR DDRF
-
-#define AIO6_PIN PINF6
-#define AIO6_RPORT PINF
-#define AIO6_WPORT PORTF
-#define AIO6_PWM 0
-#define AIO6_DDR DDRF
-
-#define AIO7_PIN PINF7
-#define AIO7_RPORT PINF
-#define AIO7_WPORT PORTF
-#define AIO7_PWM 0
-#define AIO7_DDR DDRF
-
-//-- Begin not supported by Teensyduino
-//-- don't use Arduino functions on these pins pinMode/digitalWrite/etc
-#define DIO46_PIN PINE2
-#define DIO46_RPORT PINE
-#define DIO46_WPORT PORTE
-#define DIO46_PWM 0
-#define DIO46_DDR DDRE
-
-#define DIO47_PIN PINE3
-#define DIO47_RPORT PINE
-#define DIO47_WPORT PORTE
-#define DIO47_PWM 0
-#define DIO47_DDR DDRE
-
-#define TEENSY_E2 46
-#define TEENSY_E3 47
-
-//-- end not supported by Teensyduino
-
-#undef PA0
-#define PA0_PIN PINA0
-#define PA0_RPORT PINA
-#define PA0_WPORT PORTA
-#define PA0_PWM 0
-#define PA0_DDR DDRA
-#undef PA1
-#define PA1_PIN PINA1
-#define PA1_RPORT PINA
-#define PA1_WPORT PORTA
-#define PA1_PWM 0
-#define PA1_DDR DDRA
-#undef PA2
-#define PA2_PIN PINA2
-#define PA2_RPORT PINA
-#define PA2_WPORT PORTA
-#define PA2_PWM 0
-#define PA2_DDR DDRA
-#undef PA3
-#define PA3_PIN PINA3
-#define PA3_RPORT PINA
-#define PA3_WPORT PORTA
-#define PA3_PWM 0
-#define PA3_DDR DDRA
-#undef PA4
-#define PA4_PIN PINA4
-#define PA4_RPORT PINA
-#define PA4_WPORT PORTA
-#define PA4_PWM 0
-#define PA4_DDR DDRA
-#undef PA5
-#define PA5_PIN PINA5
-#define PA5_RPORT PINA
-#define PA5_WPORT PORTA
-#define PA5_PWM 0
-#define PA5_DDR DDRA
-#undef PA6
-#define PA6_PIN PINA6
-#define PA6_RPORT PINA
-#define PA6_WPORT PORTA
-#define PA6_PWM 0
-#define PA6_DDR DDRA
-#undef PA7
-#define PA7_PIN PINA7
-#define PA7_RPORT PINA
-#define PA7_WPORT PORTA
-#define PA7_PWM 0
-#define PA7_DDR DDRA
-
-#undef PB0
-#define PB0_PIN PINB0
-#define PB0_RPORT PINB
-#define PB0_WPORT PORTB
-#define PB0_PWM 0
-#define PB0_DDR DDRB
-#undef PB1
-#define PB1_PIN PINB1
-#define PB1_RPORT PINB
-#define PB1_WPORT PORTB
-#define PB1_PWM 0
-#define PB1_DDR DDRB
-#undef PB2
-#define PB2_PIN PINB2
-#define PB2_RPORT PINB
-#define PB2_WPORT PORTB
-#define PB2_PWM 0
-#define PB2_DDR DDRB
-#undef PB3
-#define PB3_PIN PINB3
-#define PB3_RPORT PINB
-#define PB3_WPORT PORTB
-#define PB3_PWM 0
-#define PB3_DDR DDRB
-#undef PB4
-#define PB4_PIN PINB4
-#define PB4_RPORT PINB
-#define PB4_WPORT PORTB
-#define PB4_PWM 0
-#define PB4_DDR DDRB
-#undef PB5
-#define PB5_PIN PINB5
-#define PB5_RPORT PINB
-#define PB5_WPORT PORTB
-#define PB5_PWM 0
-#define PB5_DDR DDRB
-#undef PB6
-#define PB6_PIN PINB6
-#define PB6_RPORT PINB
-#define PB6_WPORT PORTB
-#define PB6_PWM 0
-#define PB6_DDR DDRB
-#undef PB7
-#define PB7_PIN PINB7
-#define PB7_RPORT PINB
-#define PB7_WPORT PORTB
-#define PB7_PWM 0
-#define PB7_DDR DDRB
-
-#undef PC0
-#define PC0_PIN PINC0
-#define PC0_RPORT PINC
-#define PC0_WPORT PORTC
-#define PC0_PWM 0
-#define PC0_DDR DDRC
-#undef PC1
-#define PC1_PIN PINC1
-#define PC1_RPORT PINC
-#define PC1_WPORT PORTC
-#define PC1_PWM 0
-#define PC1_DDR DDRC
-#undef PC2
-#define PC2_PIN PINC2
-#define PC2_RPORT PINC
-#define PC2_WPORT PORTC
-#define PC2_PWM 0
-#define PC2_DDR DDRC
-#undef PC3
-#define PC3_PIN PINC3
-#define PC3_RPORT PINC
-#define PC3_WPORT PORTC
-#define PC3_PWM 0
-#define PC3_DDR DDRC
-#undef PC4
-#define PC4_PIN PINC4
-#define PC4_RPORT PINC
-#define PC4_WPORT PORTC
-#define PC4_PWM 0
-#define PC4_DDR DDRC
-#undef PC5
-#define PC5_PIN PINC5
-#define PC5_RPORT PINC
-#define PC5_WPORT PORTC
-#define PC5_PWM 0
-#define PC5_DDR DDRC
-#undef PC6
-#define PC6_PIN PINC6
-#define PC6_RPORT PINC
-#define PC6_WPORT PORTC
-#define PC6_PWM 0
-#define PC6_DDR DDRC
-#undef PC7
-#define PC7_PIN PINC7
-#define PC7_RPORT PINC
-#define PC7_WPORT PORTC
-#define PC7_PWM 0
-#define PC7_DDR DDRC
-
-#undef PD0
-#define PD0_PIN PIND0
-#define PD0_RPORT PIND
-#define PD0_WPORT PORTD
-#define PD0_PWM 0 // OC0B
-#define PD0_DDR DDRD
-#undef PD1
-#define PD1_PIN PIND1
-#define PD1_RPORT PIND
-#define PD1_WPORT PORTD
-#define PD1_PWM 0 // OC2B
-#define PD1_DDR DDRD
-#undef PD2
-#define PD2_PIN PIND2
-#define PD2_RPORT PIND
-#define PD2_WPORT PORTD
-#define PD2_PWM 0
-#define PD2_DDR DDRD
-#undef PD3
-#define PD3_PIN PIND3
-#define PD3_RPORT PIND
-#define PD3_WPORT PORTD
-#define PD3_PWM 0
-#define PD3_DDR DDRD
-#undef PD4
-#define PD4_PIN PIND4
-#define PD4_RPORT PIND
-#define PD4_WPORT PORTD
-#define PD4_PWM 0
-#define PD4_DDR DDRD
-#undef PD5
-#define PD5_PIN PIND5
-#define PD5_RPORT PIND
-#define PD5_WPORT PORTD
-#define PD5_PWM 0
-#define PD5_DDR DDRD
-#undef PD6
-#define PD6_PIN PIND6
-#define PD6_RPORT PIND
-#define PD6_WPORT PORTD
-#define PD6_PWM 0
-#define PD6_DDR DDRD
-#undef PD7
-#define PD7_PIN PIND7
-#define PD7_RPORT PIND
-#define PD7_WPORT PORTD
-#define PD7_PWM 0
-#define PD7_DDR DDRD
-
-#undef PE0
-#define PE0_PIN PINE0
-#define PE0_RPORT PINE
-#define PE0_WPORT PORTE
-#define PE0_PWM 0
-#define PE0_DDR DDRE
-#undef PE1
-#define PE1_PIN PINE1
-#define PE1_RPORT PINE
-#define PE1_WPORT PORTE
-#define PE1_PWM 0
-#define PE1_DDR DDRE
-#undef PE2
-#define PE2_PIN PINE2
-#define PE2_RPORT PINE
-#define PE2_WPORT PORTE
-#define PE2_PWM 0
-#define PE2_DDR DDRE
-#undef PE3
-#define PE3_PIN PINE3
-#define PE3_RPORT PINE
-#define PE3_WPORT PORTE
-#define PE3_PWM 0
-#define PE3_DDR DDRE
-#undef PE4
-#define PE4_PIN PINE4
-#define PE4_RPORT PINE
-#define PE4_WPORT PORTE
-#define PE4_PWM 0
-#define PE4_DDR DDRE
-#undef PE5
-#define PE5_PIN PINE5
-#define PE5_RPORT PINE
-#define PE5_WPORT PORTE
-#define PE5_PWM 0
-#define PE5_DDR DDRE
-#undef PE6
-#define PE6_PIN PINE6
-#define PE6_RPORT PINE
-#define PE6_WPORT PORTE
-#define PE6_PWM 0
-#define PE6_DDR DDRE
-#undef PE7
-#define PE7_PIN PINE7
-#define PE7_RPORT PINE
-#define PE7_WPORT PORTE
-#define PE7_PWM 0
-#define PE7_DDR DDRE
-
-#undef PF0
-#define PF0_PIN PINF0
-#define PF0_RPORT PINF
-#define PF0_WPORT PORTF
-#define PF0_PWM 0
-#define PF0_DDR DDRF
-#undef PF1
-#define PF1_PIN PINF1
-#define PF1_RPORT PINF
-#define PF1_WPORT PORTF
-#define PF1_PWM 0
-#define PF1_DDR DDRF
-#undef PF2
-#define PF2_PIN PINF2
-#define PF2_RPORT PINF
-#define PF2_WPORT PORTF
-#define PF2_PWM 0
-#define PF2_DDR DDRF
-#undef PF3
-#define PF3_PIN PINF3
-#define PF3_RPORT PINF
-#define PF3_WPORT PORTF
-#define PF3_PWM 0
-#define PF3_DDR DDRF
-#undef PF4
-#define PF4_PIN PINF4
-#define PF4_RPORT PINF
-#define PF4_WPORT PORTF
-#define PF4_PWM 0
-#define PF4_DDR DDRF
-#undef PF5
-#define PF5_PIN PINF5
-#define PF5_RPORT PINF
-#define PF5_WPORT PORTF
-#define PF5_PWM 0
-#define PF5_DDR DDRF
-#undef PF6
-#define PF6_PIN PINF6
-#define PF6_RPORT PINF
-#define PF6_WPORT PORTF
-#define PF6_PWM 0
-#define PF6_DDR DDRF
-#undef PF7
-#define PF7_PIN PINF7
-#define PF7_RPORT PINF
-#define PF7_WPORT PORTF
-#define PF7_PWM 0
-#define PF7_DDR DDRF
-
-
-/**
- * Some of the pin mapping functions of the Teensduino extension to the Arduino IDE
- * do not function the same as the other Arduino extensions.
- */
-
-//digitalPinToTimer(pin) function works like Arduino but Timers are not defined
-#define TIMER0B 1
-#define TIMER1A 7
-#define TIMER1B 8
-#define TIMER1C 9
-#define TIMER2A 6
-#define TIMER2B 2
-#define TIMER3A 5
-#define TIMER3B 4
-#define TIMER3C 3
diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h
deleted file mode 100644
index a611ccd7c4a9..000000000000
--- a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-#if HAS_SPI_TFT || HAS_FSMC_TFT
- #error "Sorry! TFT displays are not available for HAL/AVR."
-#endif
diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h b/Marlin/src/HAL/AVR/inc/Conditionals_adv.h
deleted file mode 100644
index 5f1c4b16019d..000000000000
--- a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_post.h b/Marlin/src/HAL/AVR/inc/Conditionals_post.h
deleted file mode 100644
index 5f1c4b16019d..000000000000
--- a/Marlin/src/HAL/AVR/inc/Conditionals_post.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h
deleted file mode 100644
index 89425ca853b3..000000000000
--- a/Marlin/src/HAL/AVR/inc/SanityCheck.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Test AVR-specific configuration values for errors at compile-time.
- */
-
-/**
- * Check for common serial pin conflicts
- */
-#define CHECK_SERIAL_PIN(N) ( \
- X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
- || X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
- || X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
- || X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
- || X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
- || X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
- || BTN_EN1 == N || BTN_EN2 == N \
-)
-#if CONF_SERIAL_IS(0)
- // D0-D1. No known conflicts.
-#endif
-#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
- #if CONF_SERIAL_IS(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
- #error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
- #endif
-#else
- #if CONF_SERIAL_IS(1) && (CHECK_SERIAL_PIN(10) || CHECK_SERIAL_PIN(11))
- #error "Serial Port 1 pin D10 and/or D11 conflicts with another pin on the board."
- #endif
-#endif
-#if CONF_SERIAL_IS(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
- #error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
-#endif
-#if CONF_SERIAL_IS(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
- #error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
-#endif
-#undef CHECK_SERIAL_PIN
-
-/**
- * Checks for FAST PWM
- */
-#if ALL(FAST_PWM_FAN, USE_OCR2A_AS_TOP, HAS_TCCR2)
- #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2."
-#endif
-
-/**
- * Checks for SOFT PWM
- */
-#if HAS_FAN0 && FAN_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER)
- #error "FAN_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)."
- #error "Disable SPEAKER or enable FAN_SOFT_PWM."
-#endif
-
-/**
- * Sanity checks for Spindle / Laser PWM
- */
-#if ENABLED(SPINDLE_LASER_USE_PWM)
- #include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
- #if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
- #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
- #elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
- #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
- #endif
-#elif SPINDLE_LASER_FREQUENCY
- #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM."
-#endif
-
-/**
- * The Trinamic library includes SoftwareSerial.h, leading to a compile error.
- */
-#if BOTH(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
- #error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
-#endif
-
-#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
- #error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
-#endif
-
-/**
- * Postmortem debugging
- */
-#if ENABLED(POSTMORTEM_DEBUGGING)
- #error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
-#endif
-
-#if USING_PULLDOWNS
- #error "PULLDOWN pin mode is not available on AVR boards."
-#endif
diff --git a/Marlin/src/HAL/AVR/math.h b/Marlin/src/HAL/AVR/math.h
deleted file mode 100644
index 7dd1018ff199..000000000000
--- a/Marlin/src/HAL/AVR/math.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Optimized math functions for AVR
- */
-
-// intRes = longIn1 * longIn2 >> 24
-// uses:
-// A[tmp] to store 0
-// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result.
-// note that the lower two bytes and the upper byte of the 48bit result are not calculated.
-// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones.
-// B A are bits 24-39 and are the returned value
-// C B A is longIn1
-// D C B A is longIn2
-//
-FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) {
- uint8_t tmp1;
- uint8_t tmp2;
- uint16_t intRes;
- __asm__ __volatile__(
- A("clr %[tmp1]")
- A("mul %A[longIn1], %B[longIn2]")
- A("mov %[tmp2], r1")
- A("mul %B[longIn1], %C[longIn2]")
- A("movw %A[intRes], r0")
- A("mul %C[longIn1], %C[longIn2]")
- A("add %B[intRes], r0")
- A("mul %C[longIn1], %B[longIn2]")
- A("add %A[intRes], r0")
- A("adc %B[intRes], r1")
- A("mul %A[longIn1], %C[longIn2]")
- A("add %[tmp2], r0")
- A("adc %A[intRes], r1")
- A("adc %B[intRes], %[tmp1]")
- A("mul %B[longIn1], %B[longIn2]")
- A("add %[tmp2], r0")
- A("adc %A[intRes], r1")
- A("adc %B[intRes], %[tmp1]")
- A("mul %C[longIn1], %A[longIn2]")
- A("add %[tmp2], r0")
- A("adc %A[intRes], r1")
- A("adc %B[intRes], %[tmp1]")
- A("mul %B[longIn1], %A[longIn2]")
- A("add %[tmp2], r1")
- A("adc %A[intRes], %[tmp1]")
- A("adc %B[intRes], %[tmp1]")
- A("lsr %[tmp2]")
- A("adc %A[intRes], %[tmp1]")
- A("adc %B[intRes], %[tmp1]")
- A("mul %D[longIn2], %A[longIn1]")
- A("add %A[intRes], r0")
- A("adc %B[intRes], r1")
- A("mul %D[longIn2], %B[longIn1]")
- A("add %B[intRes], r0")
- A("clr r1")
- : [intRes] "=&r" (intRes),
- [tmp1] "=&r" (tmp1),
- [tmp2] "=&r" (tmp2)
- : [longIn1] "d" (longIn1),
- [longIn2] "d" (longIn2)
- : "cc"
- );
- return intRes;
-}
-
-// intRes = intIn1 * intIn2 >> 16
-// uses:
-// r26 to store 0
-// r27 to store the byte 1 of the 24 bit result
-FORCE_INLINE static uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) {
- uint8_t tmp;
- uint16_t intRes;
- __asm__ __volatile__ (
- A("clr %[tmp]")
- A("mul %[charIn1], %B[intIn2]")
- A("movw %A[intRes], r0")
- A("mul %[charIn1], %A[intIn2]")
- A("add %A[intRes], r1")
- A("adc %B[intRes], %[tmp]")
- A("lsr r0")
- A("adc %A[intRes], %[tmp]")
- A("adc %B[intRes], %[tmp]")
- A("clr r1")
- : [intRes] "=&r" (intRes),
- [tmp] "=&r" (tmp)
- : [charIn1] "d" (charIn1),
- [intIn2] "d" (intIn2)
- : "cc"
- );
- return intRes;
-}
diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h
deleted file mode 100644
index dab4e4471524..000000000000
--- a/Marlin/src/HAL/AVR/pinsDebug.h
+++ /dev/null
@@ -1,400 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * PWM print routines for Atmel 8 bit AVR CPUs
- */
-
-#include "../../inc/MarlinConfig.h"
-
-#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
-
-#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
- #define AVR_ATmega2560_FAMILY_PLUS_70 1
-#endif
-
-#if AVR_AT90USB1286_FAMILY
-
- // Working with Teensyduino extension so need to re-define some things
- #include "pinsDebug_Teensyduino.h"
- // Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
- // portModeRegister takes a different argument
- #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
- #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
- #define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
- #define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
-
-#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
-
- #include "pinsDebug_plus_70.h"
- #define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p)
- #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p)
- #define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p)
- bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
-
-#else
-
- #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
- #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
- #define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
- bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
- #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
-
-#endif
-
-#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
-#if AVR_ATmega1284_FAMILY
- #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P))
- #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0))
-#else
- #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0))
- #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7)))
-#endif
-#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
-#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
-
-void PRINT_ARRAY_NAME(uint8_t x) {
- PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
- LOOP_L_N(y, MAX_NAME_LENGTH) {
- char temp_char = pgm_read_byte(name_mem_pointer + y);
- if (temp_char != 0)
- SERIAL_CHAR(temp_char);
- else {
- LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' ');
- break;
- }
- }
-}
-
-#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital)
-
-
-#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of
- #undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it
- #define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog
-#endif
-
-#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0)
-#define PWM_CASE(N,Z) \
- case TIMER##N##Z: \
- if (TCCR##N##A & (_BV(COM##N##Z##1) | _BV(COM##N##Z##0))) { \
- PWM_PRINT(OCR##N##Z); \
- return true; \
- } else return false
-
-#define ABTEST(N) defined(TCCR##N##A) && defined(COM##N##A1)
-
-/**
- * Print a pin's PWM status.
- * Return true if it's currently a PWM pin.
- */
-static bool pwm_status(uint8_t pin) {
- char buffer[20]; // for the sprintf statements
-
- switch (digitalPinToTimer_DEBUG(pin)) {
-
- #if ABTEST(0)
- #ifdef TIMER0A
- #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
- PWM_CASE(0, A);
- #endif
- #endif
- PWM_CASE(0, B);
- #endif
-
- #if ABTEST(1)
- PWM_CASE(1, A);
- PWM_CASE(1, B);
- #if defined(COM1C1) && defined(TIMER1C)
- PWM_CASE(1, C);
- #endif
- #endif
-
- #if ABTEST(2)
- PWM_CASE(2, A);
- PWM_CASE(2, B);
- #endif
-
- #if ABTEST(3)
- PWM_CASE(3, A);
- PWM_CASE(3, B);
- #ifdef COM3C1
- PWM_CASE(3, C);
- #endif
- #endif
-
- #ifdef TCCR4A
- PWM_CASE(4, A);
- PWM_CASE(4, B);
- PWM_CASE(4, C);
- #endif
-
- #if ABTEST(5)
- PWM_CASE(5, A);
- PWM_CASE(5, B);
- PWM_CASE(5, C);
- #endif
-
- case NOT_ON_TIMER:
- default:
- return false;
- }
- SERIAL_ECHO_SP(2);
-} // pwm_status
-
-
-const volatile uint8_t* const PWM_other[][3] PROGMEM = {
- { &TCCR0A, &TCCR0B, &TIMSK0 },
- { &TCCR1A, &TCCR1B, &TIMSK1 },
- #if ABTEST(2)
- { &TCCR2A, &TCCR2B, &TIMSK2 },
- #endif
- #if ABTEST(3)
- { &TCCR3A, &TCCR3B, &TIMSK3 },
- #endif
- #ifdef TCCR4A
- { &TCCR4A, &TCCR4B, &TIMSK4 },
- #endif
- #if ABTEST(5)
- { &TCCR5A, &TCCR5B, &TIMSK5 },
- #endif
-};
-
-
-const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
-
- #ifdef TIMER0A
- { &OCR0A, &OCR0B, 0 },
- #else
- { 0, &OCR0B, 0 },
- #endif
-
- #if defined(COM1C1) && defined(TIMER1C)
- { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, (const uint8_t*)&OCR1C },
- #else
- { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 },
- #endif
-
- #if ABTEST(2)
- { &OCR2A, &OCR2B, 0 },
- #endif
-
- #if ABTEST(3)
- #ifdef COM3C1
- { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C },
- #else
- { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, 0 },
- #endif
- #endif
-
- #ifdef TCCR4A
- { (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C },
- #endif
-
- #if ABTEST(5)
- { (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C },
- #endif
-};
-
-
-#define TCCR_A(T) pgm_read_word(&PWM_other[T][0])
-#define TCCR_B(T) pgm_read_word(&PWM_other[T][1])
-#define TIMSK(T) pgm_read_word(&PWM_other[T][2])
-#define CS_0 0
-#define CS_1 1
-#define CS_2 2
-#define WGM_0 0
-#define WGM_1 1
-#define WGM_2 3
-#define WGM_3 4
-#define TOIE 0
-
-#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L])
-
-static void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); }
-static void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); }
-static void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); }
-static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); }
-
-inline void com_print(const uint8_t N, const uint8_t Z) {
- const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
- SERIAL_ECHOPGM(" COM", AS_DIGIT(N));
- SERIAL_CHAR(Z);
- SERIAL_ECHOPGM(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
-}
-
-void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
- char buffer[20]; // for the sprintf statements
- const uint8_t *TCCRB = (uint8_t*)TCCR_B(T),
- *TCCRA = (uint8_t*)TCCR_A(T);
- uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
- if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
-
- SERIAL_ECHOPGM(" TIMER", AS_DIGIT(T));
- SERIAL_CHAR(L);
- SERIAL_ECHO_SP(3);
-
- if (N == 3) {
- const uint8_t *OCRVAL8 = (uint8_t*)OCR_VAL(T, L - 'A');
- PWM_PRINT(*OCRVAL8);
- }
- else {
- const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A');
- PWM_PRINT(*OCRVAL16);
- }
- SERIAL_ECHOPGM(" WGM: ", WGM);
- com_print(T,L);
- SERIAL_ECHOPGM(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
- SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "A: ", *TCCRA);
- SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "B: ", *TCCRB);
-
- const uint8_t *TMSK = (uint8_t*)TIMSK(T);
- SERIAL_ECHOPGM(" TIMSK", AS_DIGIT(T), ": ", *TMSK);
-
- const uint8_t OCIE = L - 'A' + 1;
- if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
- else { if (WGM == 0 || WGM == 4 || WGM == 12 || WGM == 13) err_is_counter(); }
- if (TEST(*TMSK, OCIE)) err_is_interrupt();
- if (TEST(*TMSK, TOIE)) err_prob_interrupt();
-}
-
-static void pwm_details(uint8_t pin) {
- switch (digitalPinToTimer_DEBUG(pin)) {
-
- #if ABTEST(0)
- #ifdef TIMER0A
- #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
- case TIMER0A: timer_prefix(0, 'A', 3); break;
- #endif
- #endif
- case TIMER0B: timer_prefix(0, 'B', 3); break;
- #endif
-
- #if ABTEST(1)
- case TIMER1A: timer_prefix(1, 'A', 4); break;
- case TIMER1B: timer_prefix(1, 'B', 4); break;
- #if defined(COM1C1) && defined(TIMER1C)
- case TIMER1C: timer_prefix(1, 'C', 4); break;
- #endif
- #endif
-
- #if ABTEST(2)
- case TIMER2A: timer_prefix(2, 'A', 3); break;
- case TIMER2B: timer_prefix(2, 'B', 3); break;
- #endif
-
- #if ABTEST(3)
- case TIMER3A: timer_prefix(3, 'A', 4); break;
- case TIMER3B: timer_prefix(3, 'B', 4); break;
- #ifdef COM3C1
- case TIMER3C: timer_prefix(3, 'C', 4); break;
- #endif
- #endif
-
- #ifdef TCCR4A
- case TIMER4A: timer_prefix(4, 'A', 4); break;
- case TIMER4B: timer_prefix(4, 'B', 4); break;
- case TIMER4C: timer_prefix(4, 'C', 4); break;
- #endif
-
- #if ABTEST(5)
- case TIMER5A: timer_prefix(5, 'A', 4); break;
- case TIMER5B: timer_prefix(5, 'B', 4); break;
- case TIMER5C: timer_prefix(5, 'C', 4); break;
- #endif
-
- case NOT_ON_TIMER: break;
-
- }
- SERIAL_ECHOPGM(" ");
-
- // on pins that have two PWMs, print info on second PWM
- #if AVR_ATmega2560_FAMILY || AVR_AT90USB1286_FAMILY
- // looking for port B7 - PWMs 0A and 1C
- if (digitalPinToPort_DEBUG(pin) == 'B' - 64 && 0x80 == digitalPinToBitMask_DEBUG(pin)) {
- #if !AVR_AT90USB1286_FAMILY
- SERIAL_ECHOPGM("\n .");
- SERIAL_ECHO_SP(18);
- SERIAL_ECHOPGM("TIMER1C");
- print_is_also_tied();
- timer_prefix(1, 'C', 4);
- #else
- SERIAL_ECHOPGM("\n .");
- SERIAL_ECHO_SP(18);
- SERIAL_ECHOPGM("TIMER0A");
- print_is_also_tied();
- timer_prefix(0, 'A', 3);
- #endif
- }
- #else
- UNUSED(print_is_also_tied);
- #endif
-} // pwm_details
-
-#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
- int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed
- const uint8_t port = digitalPinToPort_DEBUG(pin);
- return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW;
- }
-#endif
-
-#ifndef PRINT_PORT
-
- void print_port(int8_t pin) { // print port number
- #ifdef digitalPinToPort_DEBUG
- uint8_t x;
- SERIAL_ECHOPGM(" Port: ");
- #if AVR_AT90USB1286_FAMILY
- x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64;
- #else
- x = digitalPinToPort_DEBUG(pin) + 64;
- #endif
- SERIAL_CHAR(x);
-
- #if AVR_AT90USB1286_FAMILY
- if (pin == 46)
- x = '2';
- else if (pin == 47)
- x = '3';
- else {
- uint8_t temp = digitalPinToBitMask_DEBUG(pin);
- for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1;
- }
- #else
- uint8_t temp = digitalPinToBitMask_DEBUG(pin);
- for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1;
- #endif
- SERIAL_CHAR(x);
- #else
- SERIAL_ECHO_SP(10);
- #endif
- }
-
- #define PRINT_PORT(p) print_port(p)
-
-#endif
-
-#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
-#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
-
-#undef ABTEST
diff --git a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
deleted file mode 100644
index 582ae79ba787..000000000000
--- a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-//
-// some of the pin mapping functions of the Teensduino extension to the Arduino IDE
-// do not function the same as the other Arduino extensions
-//
-
-
-#define TEENSYDUINO_IDE
-
-//digitalPinToTimer(pin) function works like Arduino but Timers are not defined
-#define TIMER0B 1
-#define TIMER1A 7
-#define TIMER1B 8
-#define TIMER1C 9
-#define TIMER2A 6
-#define TIMER2B 2
-#define TIMER3A 5
-#define TIMER3B 4
-#define TIMER3C 3
-
-// digitalPinToPort function just returns the pin number so need to create our own
-#define PA 1
-#define PB 2
-#define PC 3
-#define PD 4
-#define PE 5
-#define PF 6
-
-#undef digitalPinToPort
-
-const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
- PD, // 0 - PD0 - INT0 - PWM
- PD, // 1 - PD1 - INT1 - PWM
- PD, // 2 - PD2 - INT2 - RX
- PD, // 3 - PD3 - INT3 - TX
- PD, // 4 - PD4
- PD, // 5 - PD5
- PD, // 6 - PD6
- PD, // 7 - PD7
- PE, // 8 - PE0
- PE, // 9 - PE1
- PC, // 10 - PC0
- PC, // 11 - PC1
- PC, // 12 - PC2
- PC, // 13 - PC3
- PC, // 14 - PC4 - PWM
- PC, // 15 - PC5 - PWM
- PC, // 16 - PC6 - PWM
- PC, // 17 - PC7
- PE, // 18 - PE6 - INT6
- PE, // 19 - PE7 - INT7
- PB, // 20 - PB0
- PB, // 21 - PB1
- PB, // 22 - PB2
- PB, // 23 - PB3
- PB, // 24 - PB4 - PWM
- PB, // 25 - PB5 - PWM
- PB, // 26 - PB6 - PWM
- PB, // 27 - PB7 - PWM
- PA, // 28 - PA0
- PA, // 29 - PA1
- PA, // 30 - PA2
- PA, // 31 - PA3
- PA, // 32 - PA4
- PA, // 33 - PA5
- PA, // 34 - PA6
- PA, // 35 - PA7
- PE, // 36 - PE4 - INT4
- PE, // 37 - PE5 - INT5
- PF, // 38 - PF0 - A0
- PF, // 39 - PF1 - A1
- PF, // 40 - PF2 - A2
- PF, // 41 - PF3 - A3
- PF, // 42 - PF4 - A4
- PF, // 43 - PF5 - A5
- PF, // 44 - PF6 - A6
- PF, // 45 - PF7 - A7
- PE, // 46 - PE2 (not defined in teensyduino)
- PE, // 47 - PE3 (not defined in teensyduino)
-};
-
-#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
-
-// digitalPinToBitMask(pin) is OK
-
-#define digitalRead_mod(p) extDigitalRead(p) // Teensyduino's version of digitalRead doesn't
- // disable the PWMs so we can use it as is
-
-// portModeRegister(pin) is OK
diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
deleted file mode 100644
index d9aa44c3cb15..000000000000
--- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Structures for 2560 family boards that use more than 70 pins
- */
-
-#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
- #undef NUM_DIGITAL_PINS
- #define NUM_DIGITAL_PINS 85
-#elif MB(MIGHTYBOARD_REVE)
- #undef NUM_DIGITAL_PINS
- #define NUM_DIGITAL_PINS 80
-#endif
-
-#define PA 1
-#define PB 2
-#define PC 3
-#define PD 4
-#define PE 5
-#define PF 6
-#define PG 7
-#define PH 8
-#define PJ 10
-#define PK 11
-#define PL 12
-
-const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = {
- // PORTLIST
- // ------------------------
- PE , // PE 0 ** 0 ** USART0_RX
- PE , // PE 1 ** 1 ** USART0_TX
- PE , // PE 4 ** 2 ** PWM2
- PE , // PE 5 ** 3 ** PWM3
- PG , // PG 5 ** 4 ** PWM4
- PE , // PE 3 ** 5 ** PWM5
- PH , // PH 3 ** 6 ** PWM6
- PH , // PH 4 ** 7 ** PWM7
- PH , // PH 5 ** 8 ** PWM8
- PH , // PH 6 ** 9 ** PWM9
- PB , // PB 4 ** 10 ** PWM10
- PB , // PB 5 ** 11 ** PWM11
- PB , // PB 6 ** 12 ** PWM12
- PB , // PB 7 ** 13 ** PWM13
- PJ , // PJ 1 ** 14 ** USART3_TX
- PJ , // PJ 0 ** 15 ** USART3_RX
- PH , // PH 1 ** 16 ** USART2_TX
- PH , // PH 0 ** 17 ** USART2_RX
- PD , // PD 3 ** 18 ** USART1_TX
- PD , // PD 2 ** 19 ** USART1_RX
- PD , // PD 1 ** 20 ** I2C_SDA
- PD , // PD 0 ** 21 ** I2C_SCL
- PA , // PA 0 ** 22 ** D22
- PA , // PA 1 ** 23 ** D23
- PA , // PA 2 ** 24 ** D24
- PA , // PA 3 ** 25 ** D25
- PA , // PA 4 ** 26 ** D26
- PA , // PA 5 ** 27 ** D27
- PA , // PA 6 ** 28 ** D28
- PA , // PA 7 ** 29 ** D29
- PC , // PC 7 ** 30 ** D30
- PC , // PC 6 ** 31 ** D31
- PC , // PC 5 ** 32 ** D32
- PC , // PC 4 ** 33 ** D33
- PC , // PC 3 ** 34 ** D34
- PC , // PC 2 ** 35 ** D35
- PC , // PC 1 ** 36 ** D36
- PC , // PC 0 ** 37 ** D37
- PD , // PD 7 ** 38 ** D38
- PG , // PG 2 ** 39 ** D39
- PG , // PG 1 ** 40 ** D40
- PG , // PG 0 ** 41 ** D41
- PL , // PL 7 ** 42 ** D42
- PL , // PL 6 ** 43 ** D43
- PL , // PL 5 ** 44 ** D44
- PL , // PL 4 ** 45 ** D45
- PL , // PL 3 ** 46 ** D46
- PL , // PL 2 ** 47 ** D47
- PL , // PL 1 ** 48 ** D48
- PL , // PL 0 ** 49 ** D49
- PB , // PB 3 ** 50 ** SPI_MISO
- PB , // PB 2 ** 51 ** SPI_MOSI
- PB , // PB 1 ** 52 ** SPI_SCK
- PB , // PB 0 ** 53 ** SPI_SS
- PF , // PF 0 ** 54 ** A0
- PF , // PF 1 ** 55 ** A1
- PF , // PF 2 ** 56 ** A2
- PF , // PF 3 ** 57 ** A3
- PF , // PF 4 ** 58 ** A4
- PF , // PF 5 ** 59 ** A5
- PF , // PF 6 ** 60 ** A6
- PF , // PF 7 ** 61 ** A7
- PK , // PK 0 ** 62 ** A8
- PK , // PK 1 ** 63 ** A9
- PK , // PK 2 ** 64 ** A10
- PK , // PK 3 ** 65 ** A11
- PK , // PK 4 ** 66 ** A12
- PK , // PK 5 ** 67 ** A13
- PK , // PK 6 ** 68 ** A14
- PK , // PK 7 ** 69 ** A15
- PG , // PG 4 ** 70 **
- PG , // PG 3 ** 71 **
- PJ , // PJ 2 ** 72 **
- PJ , // PJ 3 ** 73 **
- PJ , // PJ 7 ** 74 **
- PJ , // PJ 4 ** 75 **
- PJ , // PJ 5 ** 76 **
- PJ , // PJ 6 ** 77 **
- PE , // PE 2 ** 78 **
- PE , // PE 6 ** 79 **
- PE , // PE 7 ** 80 **
- PD , // PD 4 ** 81 **
- PD , // PD 5 ** 82 **
- PD , // PD 6 ** 83 **
- PH , // PH 2 ** 84 **
- PH , // PH 7 ** 85 **
-};
-
-#define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) )
-
-const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
- // PIN IN PORT
- // ------------------------
- _BV( 0 ) , // PE 0 ** 0 ** USART0_RX
- _BV( 1 ) , // PE 1 ** 1 ** USART0_TX
- _BV( 4 ) , // PE 4 ** 2 ** PWM2
- _BV( 5 ) , // PE 5 ** 3 ** PWM3
- _BV( 5 ) , // PG 5 ** 4 ** PWM4
- _BV( 3 ) , // PE 3 ** 5 ** PWM5
- _BV( 3 ) , // PH 3 ** 6 ** PWM6
- _BV( 4 ) , // PH 4 ** 7 ** PWM7
- _BV( 5 ) , // PH 5 ** 8 ** PWM8
- _BV( 6 ) , // PH 6 ** 9 ** PWM9
- _BV( 4 ) , // PB 4 ** 10 ** PWM10
- _BV( 5 ) , // PB 5 ** 11 ** PWM11
- _BV( 6 ) , // PB 6 ** 12 ** PWM12
- _BV( 7 ) , // PB 7 ** 13 ** PWM13
- _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX
- _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX
- _BV( 1 ) , // PH 1 ** 16 ** USART2_TX
- _BV( 0 ) , // PH 0 ** 17 ** USART2_RX
- _BV( 3 ) , // PD 3 ** 18 ** USART1_TX
- _BV( 2 ) , // PD 2 ** 19 ** USART1_RX
- _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA
- _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL
- _BV( 0 ) , // PA 0 ** 22 ** D22
- _BV( 1 ) , // PA 1 ** 23 ** D23
- _BV( 2 ) , // PA 2 ** 24 ** D24
- _BV( 3 ) , // PA 3 ** 25 ** D25
- _BV( 4 ) , // PA 4 ** 26 ** D26
- _BV( 5 ) , // PA 5 ** 27 ** D27
- _BV( 6 ) , // PA 6 ** 28 ** D28
- _BV( 7 ) , // PA 7 ** 29 ** D29
- _BV( 7 ) , // PC 7 ** 30 ** D30
- _BV( 6 ) , // PC 6 ** 31 ** D31
- _BV( 5 ) , // PC 5 ** 32 ** D32
- _BV( 4 ) , // PC 4 ** 33 ** D33
- _BV( 3 ) , // PC 3 ** 34 ** D34
- _BV( 2 ) , // PC 2 ** 35 ** D35
- _BV( 1 ) , // PC 1 ** 36 ** D36
- _BV( 0 ) , // PC 0 ** 37 ** D37
- _BV( 7 ) , // PD 7 ** 38 ** D38
- _BV( 2 ) , // PG 2 ** 39 ** D39
- _BV( 1 ) , // PG 1 ** 40 ** D40
- _BV( 0 ) , // PG 0 ** 41 ** D41
- _BV( 7 ) , // PL 7 ** 42 ** D42
- _BV( 6 ) , // PL 6 ** 43 ** D43
- _BV( 5 ) , // PL 5 ** 44 ** D44
- _BV( 4 ) , // PL 4 ** 45 ** D45
- _BV( 3 ) , // PL 3 ** 46 ** D46
- _BV( 2 ) , // PL 2 ** 47 ** D47
- _BV( 1 ) , // PL 1 ** 48 ** D48
- _BV( 0 ) , // PL 0 ** 49 ** D49
- _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO
- _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI
- _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK
- _BV( 0 ) , // PB 0 ** 53 ** SPI_SS
- _BV( 0 ) , // PF 0 ** 54 ** A0
- _BV( 1 ) , // PF 1 ** 55 ** A1
- _BV( 2 ) , // PF 2 ** 56 ** A2
- _BV( 3 ) , // PF 3 ** 57 ** A3
- _BV( 4 ) , // PF 4 ** 58 ** A4
- _BV( 5 ) , // PF 5 ** 59 ** A5
- _BV( 6 ) , // PF 6 ** 60 ** A6
- _BV( 7 ) , // PF 7 ** 61 ** A7
- _BV( 0 ) , // PK 0 ** 62 ** A8
- _BV( 1 ) , // PK 1 ** 63 ** A9
- _BV( 2 ) , // PK 2 ** 64 ** A10
- _BV( 3 ) , // PK 3 ** 65 ** A11
- _BV( 4 ) , // PK 4 ** 66 ** A12
- _BV( 5 ) , // PK 5 ** 67 ** A13
- _BV( 6 ) , // PK 6 ** 68 ** A14
- _BV( 7 ) , // PK 7 ** 69 ** A15
- _BV( 4 ) , // PG 4 ** 70 **
- _BV( 3 ) , // PG 3 ** 71 **
- _BV( 2 ) , // PJ 2 ** 72 **
- _BV( 3 ) , // PJ 3 ** 73 **
- _BV( 7 ) , // PJ 7 ** 74 **
- _BV( 4 ) , // PJ 4 ** 75 **
- _BV( 5 ) , // PJ 5 ** 76 **
- _BV( 6 ) , // PJ 6 ** 77 **
- _BV( 2 ) , // PE 2 ** 78 **
- _BV( 6 ) , // PE 6 ** 79 **
- _BV( 7 ) , // PE 7 ** 80 **
- _BV( 4 ) , // PD 4 ** 81 **
- _BV( 5 ) , // PD 5 ** 82 **
- _BV( 6 ) , // PD 6 ** 83 **
- _BV( 2 ) , // PH 2 ** 84 **
- _BV( 7 ) , // PH 7 ** 85 **
-};
-
-#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
-
-
-const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
- // TIMERS
- // ------------------------
- NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX
- NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX
- TIMER3B , // PE 4 ** 2 ** PWM2
- TIMER3C , // PE 5 ** 3 ** PWM3
- TIMER0B , // PG 5 ** 4 ** PWM4
- TIMER3A , // PE 3 ** 5 ** PWM5
- TIMER4A , // PH 3 ** 6 ** PWM6
- TIMER4B , // PH 4 ** 7 ** PWM7
- TIMER4C , // PH 5 ** 8 ** PWM8
- TIMER2B , // PH 6 ** 9 ** PWM9
- TIMER2A , // PB 4 ** 10 ** PWM10
- TIMER1A , // PB 5 ** 11 ** PWM11
- TIMER1B , // PB 6 ** 12 ** PWM12
- TIMER0A , // PB 7 ** 13 ** PWM13
- NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX
- NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX
- NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX
- NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX
- NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX
- NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX
- NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA
- NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL
- NOT_ON_TIMER , // PA 0 ** 22 ** D22
- NOT_ON_TIMER , // PA 1 ** 23 ** D23
- NOT_ON_TIMER , // PA 2 ** 24 ** D24
- NOT_ON_TIMER , // PA 3 ** 25 ** D25
- NOT_ON_TIMER , // PA 4 ** 26 ** D26
- NOT_ON_TIMER , // PA 5 ** 27 ** D27
- NOT_ON_TIMER , // PA 6 ** 28 ** D28
- NOT_ON_TIMER , // PA 7 ** 29 ** D29
- NOT_ON_TIMER , // PC 7 ** 30 ** D30
- NOT_ON_TIMER , // PC 6 ** 31 ** D31
- NOT_ON_TIMER , // PC 5 ** 32 ** D32
- NOT_ON_TIMER , // PC 4 ** 33 ** D33
- NOT_ON_TIMER , // PC 3 ** 34 ** D34
- NOT_ON_TIMER , // PC 2 ** 35 ** D35
- NOT_ON_TIMER , // PC 1 ** 36 ** D36
- NOT_ON_TIMER , // PC 0 ** 37 ** D37
- NOT_ON_TIMER , // PD 7 ** 38 ** D38
- NOT_ON_TIMER , // PG 2 ** 39 ** D39
- NOT_ON_TIMER , // PG 1 ** 40 ** D40
- NOT_ON_TIMER , // PG 0 ** 41 ** D41
- NOT_ON_TIMER , // PL 7 ** 42 ** D42
- NOT_ON_TIMER , // PL 6 ** 43 ** D43
- TIMER5C , // PL 5 ** 44 ** D44
- TIMER5B , // PL 4 ** 45 ** D45
- TIMER5A , // PL 3 ** 46 ** D46
- NOT_ON_TIMER , // PL 2 ** 47 ** D47
- NOT_ON_TIMER , // PL 1 ** 48 ** D48
- NOT_ON_TIMER , // PL 0 ** 49 ** D49
- NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO
- NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI
- NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK
- NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS
- NOT_ON_TIMER , // PF 0 ** 54 ** A0
- NOT_ON_TIMER , // PF 1 ** 55 ** A1
- NOT_ON_TIMER , // PF 2 ** 56 ** A2
- NOT_ON_TIMER , // PF 3 ** 57 ** A3
- NOT_ON_TIMER , // PF 4 ** 58 ** A4
- NOT_ON_TIMER , // PF 5 ** 59 ** A5
- NOT_ON_TIMER , // PF 6 ** 60 ** A6
- NOT_ON_TIMER , // PF 7 ** 61 ** A7
- NOT_ON_TIMER , // PK 0 ** 62 ** A8
- NOT_ON_TIMER , // PK 1 ** 63 ** A9
- NOT_ON_TIMER , // PK 2 ** 64 ** A10
- NOT_ON_TIMER , // PK 3 ** 65 ** A11
- NOT_ON_TIMER , // PK 4 ** 66 ** A12
- NOT_ON_TIMER , // PK 5 ** 67 ** A13
- NOT_ON_TIMER , // PK 6 ** 68 ** A14
- NOT_ON_TIMER , // PK 7 ** 69 ** A15
- NOT_ON_TIMER , // PG 4 ** 70 **
- NOT_ON_TIMER , // PG 3 ** 71 **
- NOT_ON_TIMER , // PJ 2 ** 72 **
- NOT_ON_TIMER , // PJ 3 ** 73 **
- NOT_ON_TIMER , // PJ 7 ** 74 **
- NOT_ON_TIMER , // PJ 4 ** 75 **
- NOT_ON_TIMER , // PJ 5 ** 76 **
- NOT_ON_TIMER , // PJ 6 ** 77 **
- NOT_ON_TIMER , // PE 2 ** 78 **
- NOT_ON_TIMER , // PE 6 ** 79 **
-};
-
-#define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) )
-
-/**
- * Interrupts that are not implemented
- *
- * INT6 E6 79
- * INT7 E7 80
- * PCINT11 J2 72
- * PCINT12 J3 73
- * PCINT13 J4 75
- * PCINT14 J5 76
- * PCINT15 J6 77
- */
diff --git a/Marlin/src/HAL/AVR/spi_pins.h b/Marlin/src/HAL/AVR/spi_pins.h
deleted file mode 100644
index 831972938a7b..000000000000
--- a/Marlin/src/HAL/AVR/spi_pins.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Define SPI Pins: SCK, MISO, MOSI, SS
- */
-#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
- #define AVR_SCK_PIN 13
- #define AVR_MISO_PIN 12
- #define AVR_MOSI_PIN 11
- #define AVR_SS_PIN 10
-#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
- #define AVR_SCK_PIN 7
- #define AVR_MISO_PIN 6
- #define AVR_MOSI_PIN 5
- #define AVR_SS_PIN 4
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
- #define AVR_SCK_PIN 52
- #define AVR_MISO_PIN 50
- #define AVR_MOSI_PIN 51
- #define AVR_SS_PIN 53
-#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
- #define AVR_SCK_PIN 21
- #define AVR_MISO_PIN 23
- #define AVR_MOSI_PIN 22
- #define AVR_SS_PIN 20
-#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
- #define AVR_SCK_PIN 10
- #define AVR_MISO_PIN 12
- #define AVR_MOSI_PIN 11
- #define AVR_SS_PIN 16
-#endif
-
-#ifndef SD_SCK_PIN
- #define SD_SCK_PIN AVR_SCK_PIN
-#endif
-#ifndef SD_MISO_PIN
- #define SD_MISO_PIN AVR_MISO_PIN
-#endif
-#ifndef SD_MOSI_PIN
- #define SD_MOSI_PIN AVR_MOSI_PIN
-#endif
-#ifndef SD_SS_PIN
- #define SD_SS_PIN AVR_SS_PIN
-#endif
diff --git a/Marlin/src/HAL/AVR/timers.h b/Marlin/src/HAL/AVR/timers.h
deleted file mode 100644
index 33c3880b6b99..000000000000
--- a/Marlin/src/HAL/AVR/timers.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- *
- * 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 .
- *
- */
-#pragma once
-
-#include
-
-// ------------------------
-// Types
-// ------------------------
-
-typedef uint16_t hal_timer_t;
-#define HAL_TIMER_TYPE_MAX 0xFFFF
-
-// ------------------------
-// Defines
-// ------------------------
-
-#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
-
-#ifndef MF_TIMER_STEP
- #define MF_TIMER_STEP 1
-#endif
-#ifndef MF_TIMER_PULSE
- #define MF_TIMER_PULSE MF_TIMER_STEP
-#endif
-#ifndef MF_TIMER_TEMP
- #define MF_TIMER_TEMP 0
-#endif
-
-#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
-
-#define STEPPER_TIMER_RATE HAL_TIMER_RATE
-#define STEPPER_TIMER_PRESCALE 8
-#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
-
-#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
-#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
-#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
-
-#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
-#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
-#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
-
-#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0A)
-#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0A)
-#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0A)
-
-FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
- switch (timer_num) {
- case MF_TIMER_STEP:
- // waveform generation = 0100 = CTC
- SET_WGM(1, CTC_OCRnA);
-
- // output mode = 00 (disconnected)
- SET_COMA(1, NORMAL);
-
- // Set the timer pre-scaler
- // Generally we use a divider of 8, resulting in a 2MHz timer
- // frequency on a 16MHz MCU. If you are going to change this, be
- // sure to regenerate speed_lookuptable.h with
- // create_speed_lookuptable.py
- SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler
-
- // Init Stepper ISR to 122 Hz for quick starting
- // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency
- OCR1A = 0x4000;
- TCNT1 = 0;
- break;
-
- case MF_TIMER_TEMP:
- // Use timer0 for temperature measurement
- // Interleave temperature interrupt with millies interrupt
- OCR0A = 128;
- break;
- }
-}
-
-#define TIMER_OCR_1 OCR1A
-#define TIMER_COUNTER_1 TCNT1
-
-#define TIMER_OCR_0 OCR0A
-#define TIMER_COUNTER_0 TCNT0
-
-#define _CAT(a,V...) a##V
-#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
-#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer)
-#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer)
-
-/**
- * On AVR there is no hardware prioritization and preemption of
- * interrupts, so this emulates it. The UART has first priority
- * (otherwise, characters will be lost due to UART overflow).
- * Then: Stepper, Endstops, Temperature, and -finally- all others.
- */
-#define HAL_timer_isr_prologue(T) NOOP
-#define HAL_timer_isr_epilogue(T) NOOP
-
-#ifndef HAL_STEP_TIMER_ISR
-
-/* 18 cycles maximum latency */
-#define HAL_STEP_TIMER_ISR() \
-extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
-extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
-void TIMER1_COMPA_vect() { \
- __asm__ __volatile__ ( \
- A("push r16") /* 2 Save R16 */ \
- A("in r16, __SREG__") /* 1 Get SREG */ \
- A("push r16") /* 2 Save SREG into stack */ \
- A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
- A("push r16") /* 2 Save TIMSK0 into the stack */ \
- A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \
- A("sts %[timsk0], r16") /* 2 And set the new value */ \
- A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \
- A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \
- A("sts %[timsk1], r16") /* 2 And set the new value */ \
- A("push r16") /* 2 Save TIMSK1 into stack */ \
- A("in r16, 0x3B") /* 1 Get RAMPZ register */ \
- A("push r16") /* 2 Save RAMPZ into stack */ \
- A("in r16, 0x3C") /* 1 Get EIND register */ \
- A("push r0") /* C runtime can modify all the following registers without restoring them */ \
- A("push r1") \
- A("push r18") \
- A("push r19") \
- A("push r20") \
- A("push r21") \
- A("push r22") \
- A("push r23") \
- A("push r24") \
- A("push r25") \
- A("push r26") \
- A("push r27") \
- A("push r30") \
- A("push r31") \
- A("clr r1") /* C runtime expects this register to be 0 */ \
- A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
- A("pop r31") \
- A("pop r30") \
- A("pop r27") \
- A("pop r26") \
- A("pop r25") \
- A("pop r24") \
- A("pop r23") \
- A("pop r22") \
- A("pop r21") \
- A("pop r20") \
- A("pop r19") \
- A("pop r18") \
- A("pop r1") \
- A("pop r0") \
- A("out 0x3C, r16") /* 1 Restore EIND register */ \
- A("pop r16") /* 2 Get the original RAMPZ register value */ \
- A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \
- A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \
- A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \
- A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \
- A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \
- A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \
- A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \
- A("pop r16") /* 2 Get the old SREG value */ \
- A("out __SREG__, r16") /* 1 And restore the SREG value */ \
- A("pop r16") /* 2 Restore R16 value */ \
- A("reti") /* 4 Return from interrupt */ \
- : \
- : [timsk0] "i" ((uint16_t)&TIMSK0), \
- [timsk1] "i" ((uint16_t)&TIMSK1), \
- [msk0] "M" ((uint8_t)(1<.
- *
- */
-
-/**
- * Based on u8g_com_st7920_hw_spi.c
- *
- * Universal 8bit Graphics Library
- *
- * Copyright (c) 2011, olikraus@gmail.com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM)
-
-#include "../../inc/MarlinConfigPre.h"
-
-#if HAS_MARLINUI_U8GLIB
-
-#include "../shared/Marduino.h"
-#include "../shared/Delay.h"
-
-#include
-
-static uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
-static volatile uint8_t *u8g_outData, *u8g_outClock;
-
-static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
- u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
- u8g_outClock = portOutputRegister(digitalPinToPort(clockPin));
- u8g_bitData = digitalPinToBitMask(dataPin);
- u8g_bitClock = digitalPinToBitMask(clockPin);
-
- u8g_bitNotClock = u8g_bitClock;
- u8g_bitNotClock ^= 0xFF;
-
- u8g_bitNotData = u8g_bitData;
- u8g_bitNotData ^= 0xFF;
-}
-
-void u8g_spiSend_sw_AVR_mode_0(uint8_t val) {
- uint8_t bitData = u8g_bitData,
- bitNotData = u8g_bitNotData,
- bitClock = u8g_bitClock,
- bitNotClock = u8g_bitNotClock;
- volatile uint8_t *outData = u8g_outData,
- *outClock = u8g_outClock;
- U8G_ATOMIC_START();
- LOOP_L_N(i, 8) {
- if (val & 0x80)
- *outData |= bitData;
- else
- *outData &= bitNotData;
- *outClock |= bitClock;
- val <<= 1;
- *outClock &= bitNotClock;
- }
- U8G_ATOMIC_END();
-}
-
-void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
- uint8_t bitData = u8g_bitData,
- bitNotData = u8g_bitNotData,
- bitClock = u8g_bitClock,
- bitNotClock = u8g_bitNotClock;
- volatile uint8_t *outData = u8g_outData,
- *outClock = u8g_outClock;
- U8G_ATOMIC_START();
- LOOP_L_N(i, 8) {
- *outClock &= bitNotClock;
- if (val & 0x80)
- *outData |= bitData;
- else
- *outData &= bitNotData;
- *outClock |= bitClock;
- val <<= 1;
- }
- U8G_ATOMIC_END();
-}
-
-
-#if ENABLED(FYSETC_MINI_12864)
- #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3
-#else
- #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_0
-#endif
-
-uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
- switch (msg) {
- case U8G_COM_MSG_INIT:
- u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]);
- u8g_com_arduino_assign_pin_output_high(u8g);
- u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0);
- u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, 0);
- break;
-
- case U8G_COM_MSG_STOP:
- break;
-
- case U8G_COM_MSG_RESET:
- if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val);
- break;
-
- case U8G_COM_MSG_CHIP_SELECT:
- #if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
- if (arg_val) { // SCK idle state needs to be set to the proper idle state before
- // the next chip select goes active
- u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active
- u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
- }
- else {
- u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH);
- u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive
- }
- #else
- u8g_com_arduino_digital_write(u8g, U8G_PI_CS, !arg_val);
- #endif
- break;
-
- case U8G_COM_MSG_WRITE_BYTE:
- SPISEND_SW_AVR(arg_val);
- break;
-
- case U8G_COM_MSG_WRITE_SEQ: {
- uint8_t *ptr = (uint8_t *)arg_ptr;
- while (arg_val > 0) {
- SPISEND_SW_AVR(*ptr++);
- arg_val--;
- }
- }
- break;
-
- case U8G_COM_MSG_WRITE_SEQ_P: {
- uint8_t *ptr = (uint8_t *)arg_ptr;
- while (arg_val > 0) {
- SPISEND_SW_AVR(u8g_pgm_read(ptr));
- ptr++;
- arg_val--;
- }
- }
- break;
-
- case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
- u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val);
- break;
- }
- return 1;
-}
-
-#endif // HAS_MARLINUI_U8GLIB
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp
deleted file mode 100644
index 4353f1649732..000000000000
--- a/Marlin/src/HAL/DUE/HAL.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- *
- * 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 .
- *
- */
-
-/**
- * HAL for Arduino Due and compatible (SAM3X8E)
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-#include "../../MarlinCore.h"
-
-#include
-#include "usb/usb_task.h"
-
-// ------------------------
-// Public Variables
-// ------------------------
-
-uint16_t MarlinHAL::adc_result;
-
-// ------------------------
-// Public functions
-// ------------------------
-
-#if ENABLED(POSTMORTEM_DEBUGGING)
- extern void install_min_serial();
-#endif
-
-void MarlinHAL::init() {
- #if ENABLED(SDSUPPORT)
- OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
- #endif
- usb_task_init(); // Initialize the USB stack
- TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
-}
-
-void MarlinHAL::init_board() {
- #ifdef BOARD_INIT
- BOARD_INIT();
- #endif
-}
-
-void MarlinHAL::idletask() { usb_task_idle(); } // Perform USB stack housekeeping
-
-uint8_t MarlinHAL::get_reset_source() {
- switch ((RSTC->RSTC_SR >> 8) & 0x07) {
- case 0: return RST_POWER_ON;
- case 1: return RST_BACKUP;
- case 2: return RST_WATCHDOG;
- case 3: return RST_SOFTWARE;
- case 4: return RST_EXTERNAL;
- default: return 0;
- }
-}
-
-void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); }
-
-// ------------------------
-// Watchdog Timer
-// ------------------------
-
-#if ENABLED(USE_WATCHDOG)
-
- // Initialize watchdog - On SAM3X, Watchdog was already configured
- // and enabled or disabled at startup, so no need to reconfigure it
- // here.
- void MarlinHAL::watchdog_init() { WDT_Restart(WDT); } // Reset watchdog to start clean
-
- // Reset watchdog. MUST be called at least every 4 seconds after the
- // first watchdog_init or AVR will go into emergency procedures.
- void MarlinHAL::watchdog_refresh() { watchdogReset(); }
-
-#endif
-
-// Override Arduino runtime to either config or disable the watchdog
-//
-// We need to configure the watchdog as soon as possible in the boot
-// process, because watchdog initialization at hardware reset on SAM3X8E
-// is unreliable, and there is risk of unintended resets if we delay
-// that initialization to a later time.
-void watchdogSetup() {
-
- #if ENABLED(USE_WATCHDOG)
-
- // 4 seconds timeout
- uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
-
- // Calculate timeout value in WDT counter ticks: This assumes
- // the slow clock is running at 32.768 kHz watchdog
- // frequency is therefore 32768 / 128 = 256 Hz
- timeout = (timeout << 8) / 1000;
- if (timeout == 0)
- timeout = 1;
- else if (timeout > 0xFFF)
- timeout = 0xFFF;
-
- // We want to enable the watchdog with the specified timeout
- uint32_t value =
- WDT_MR_WDV(timeout) | // With the specified timeout
- WDT_MR_WDD(timeout) | // and no invalid write window
- #if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
- WDT_MR_WDRPROC | // WDT fault resets processor only - We want
- // to keep PIO controller state
- #endif
- WDT_MR_WDDBGHLT | // WDT stops in debug state.
- WDT_MR_WDIDLEHLT; // WDT stops in idle state.
-
- #if ENABLED(WATCHDOG_RESET_MANUAL)
- // We enable the watchdog timer, but only for the interrupt.
-
- // Configure WDT to only trigger an interrupt
- value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt.
-
- // Disable WDT interrupt (just in case, to avoid triggering it!)
- NVIC_DisableIRQ(WDT_IRQn);
-
- // We NEED memory barriers to ensure Interrupts are actually disabled!
- // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
- __DSB();
- __ISB();
-
- // Initialize WDT with the given parameters
- WDT_Enable(WDT, value);
-
- // Configure and enable WDT interrupt.
- NVIC_ClearPendingIRQ(WDT_IRQn);
- NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
- NVIC_EnableIRQ(WDT_IRQn);
-
- #else
-
- // a WDT fault triggers a reset
- value |= WDT_MR_WDRSTEN;
-
- // Initialize WDT with the given parameters
- WDT_Enable(WDT, value);
-
- #endif
-
- // Reset the watchdog
- WDT_Restart(WDT);
-
- #else
-
- // Make sure to completely disable the Watchdog
- WDT_Disable(WDT);
-
- #endif
-}
-
-// ------------------------
-// Free Memory Accessor
-// ------------------------
-
-extern "C" {
- extern unsigned int _ebss; // end of bss section
-}
-
-// Return free memory between end of heap (or end bss) and whatever is current
-int freeMemory() {
- int free_memory, heap_end = (int)_sbrk(0);
- return (int)&free_memory - (heap_end ?: (int)&_ebss);
-}
-
-// ------------------------
-// Serial Ports
-// ------------------------
-
-// Forward the default serial ports
-#if USING_HW_SERIAL0
- DefaultSerial1 MSerial0(false, Serial);
-#endif
-#if USING_HW_SERIAL1
- DefaultSerial2 MSerial1(false, Serial1);
-#endif
-#if USING_HW_SERIAL2
- DefaultSerial3 MSerial2(false, Serial2);
-#endif
-#if USING_HW_SERIAL3
- DefaultSerial4 MSerial3(false, Serial3);
-#endif
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h
deleted file mode 100644
index 4d3f4823a517..000000000000
--- a/Marlin/src/HAL/DUE/HAL.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- *
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
- *
- * 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 .
- *
- */
-#pragma once
-
-/**
- * HAL for Arduino Due and compatible (SAM3X8E)
- */
-
-#define CPU_32_BIT
-
-#include "../shared/Marduino.h"
-#include "../shared/eeprom_if.h"
-#include "../shared/math_32bit.h"
-#include "../shared/HAL_SPI.h"
-#include "fastio.h"
-
-#include
-
-#include "../../core/serial_hook.h"
-
-// ------------------------
-// Serial ports
-// ------------------------
-
-typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
-typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
-typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
-typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
-extern DefaultSerial1 MSerial0;
-extern DefaultSerial2 MSerial1;
-extern DefaultSerial3 MSerial2;
-extern DefaultSerial4 MSerial3;
-
-#define _MSERIAL(X) MSerial##X
-#define MSERIAL(X) _MSERIAL(X)
-
-#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
- #define MYSERIAL1 customizedSerial1
-#elif WITHIN(SERIAL_PORT, 0, 3)
- #define MYSERIAL1 MSERIAL(SERIAL_PORT)
-#else
- #error "The required SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
-#endif
-
-#ifdef SERIAL_PORT_2
- #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
- #define MYSERIAL2 customizedSerial2
- #elif WITHIN(SERIAL_PORT_2, 0, 3)
- #define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
- #else
- #error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
- #endif
-#endif
-
-#ifdef SERIAL_PORT_3
- #if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
- #define MYSERIAL3 customizedSerial3
- #elif WITHIN(SERIAL_PORT_3, 0, 3)
- #define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
- #else
- #error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
- #endif
-#endif
-
-#ifdef MMU2_SERIAL_PORT
- #if WITHIN(MMU2_SERIAL_PORT, 0, 3)
- #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
- #else
- #error "MMU2_SERIAL_PORT must be from 0 to 3."
- #endif
-#endif
-
-#ifdef LCD_SERIAL_PORT
- #if WITHIN(LCD_SERIAL_PORT, 0, 3)
- #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
- #else
- #error "LCD_SERIAL_PORT must be from 0 to 3."
- #endif
-#endif
-
-#include "MarlinSerial.h"
-#include "MarlinSerialUSB.h"
-
-// ------------------------
-// Types
-// ------------------------
-
-typedef int8_t pin_t;
-
-#define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
-
-class Servo;
-typedef Servo hal_servo_t;
-
-//
-// Interrupts
-//
-#define sei() interrupts()
-#define cli() noInterrupts()
-
-#define CRITICAL_SECTION_START() const bool _irqon = hal.isr_state(); hal.isr_off()
-#define CRITICAL_SECTION_END() if (_irqon) hal.isr_on()
-
-//
-// ADC
-//
-#define HAL_ADC_VREF 3.3
-#define HAL_ADC_RESOLUTION 10
-
-#ifndef analogInputToDigitalPin
- #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1)
-#endif
-
-//
-// Pin Mapping for M42, M43, M226
-//
-#define GET_PIN_MAP_PIN(index) index
-#define GET_PIN_MAP_INDEX(pin) pin
-#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
-
-//
-// Tone
-//
-void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
-void noTone(const pin_t _pin);
-
-// ------------------------
-// Class Utilities
-// ------------------------
-
-#pragma GCC diagnostic push
-#if GCC_VERSION <= 50000
- #pragma GCC diagnostic ignored "-Wunused-function"
-#endif
-
-#pragma GCC diagnostic pop
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s);
-#ifdef __cplusplus
- }
-#endif
-
-// Return free RAM between end of heap (or end bss) and whatever is current
-int freeMemory();
-
-// ------------------------
-// MarlinHAL Class
-// ------------------------
-
-class MarlinHAL {
-public:
-
- // Earliest possible init, before setup()
- MarlinHAL() {}
-
- // Watchdog
- static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
- static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
-
- static void init(); // Called early in setup()
- static void init_board(); // Called less early in setup()
- static void reboot(); // Restart the firmware
-
- // Interrupts
- static bool isr_state() { return !__get_PRIMASK(); }
- static void isr_on() { __enable_irq(); }
- static void isr_off() { __disable_irq(); }
-
- static void delay_ms(const int ms) { delay(ms); }
-
- // Tasks, called from idle()
- static void idletask();
-
- // Reset
- static uint8_t get_reset_source();
- static void clear_reset_source() {}
-
- // Free SRAM
- static int freeMemory() { return ::freeMemory(); }
-
- //
- // ADC Methods
- //
-
- static uint16_t adc_result;
-
- // Called by Temperature::init once at startup
- static void adc_init() {}
-
- // Called by Temperature::init for each sensor at startup
- static void adc_enable(const uint8_t ch) {}
-
- // Begin ADC sampling on the given channel. Called from Temperature::isr!
- static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); }
-
- // Is the ADC ready for reading?
- static bool adc_ready() { return true; }
-
- // The current value of the ADC register
- static uint16_t adc_value() { return adc_result; }
-
- /**
- * Set the PWM duty cycle for the pin to the given value.
- * No inverting the duty cycle in this HAL.
- * No changing the maximum size of the provided value to enable finer PWM duty control in this HAL.
- */
- static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) {
- analogWrite(pin, v);
- }
-
-};
diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp
deleted file mode 100644
index 7e3fe0135645..000000000000
--- a/Marlin/src/HAL/DUE/HAL_SPI.cpp
+++ /dev/null
@@ -1,819 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Software SPI functions originally from Arduino Sd2Card Library
- * Copyright (c) 2009 by William Greiman
- *
- * Completely rewritten and tuned by Eduardo José Tagle in 2017/2018
- * in ARM thumb2 inline assembler and tuned for maximum speed and performance
- * allowing SPI clocks of up to 12 Mhz to increase SD card read/write performance
- */
-
-/**
- * HAL for Arduino Due and compatible (SAM3X8E)
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-#include "../shared/Delay.h"
-
-// ------------------------
-// Public functions
-// ------------------------
-
-#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI)
-
- // ------------------------
- // Software SPI
- // ------------------------
-
- // Make sure GCC optimizes this file.
- // Note that this line triggers a bug in GCC which is fixed by casting.
- // See the note below.
- #pragma GCC optimize (3)
-
- typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
- typedef void (*pfnSpiRxBlock)(uint8_t *buf, uint32_t nbyte);
- typedef void (*pfnSpiTxBlock)(const uint8_t *buf, uint32_t nbyte);
-
- /* ---------------- Macros to be able to access definitions from asm */
- #define _PORT(IO) DIO ## IO ## _WPORT
- #define _PIN_MASK(IO) MASK(DIO ## IO ## _PIN)
- #define _PIN_SHIFT(IO) DIO ## IO ## _PIN
- #define PORT(IO) _PORT(IO)
- #define PIN_MASK(IO) _PIN_MASK(IO)
- #define PIN_SHIFT(IO) _PIN_SHIFT(IO)
-
- // run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
- static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
- uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
- uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
- uint32_t idx = 0;
-
- /* Negate bout, as the assembler requires a negated value */
- bout = ~bout;
-
- /* The software SPI routine */
- __asm__ __volatile__(
- A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
-
- /* Bit 7 */
- A("ubfx %[idx],%[txval],#7,#1") /* Place bit 7 in bit 0 of idx*/
-
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#6,#1") /* Place bit 6 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 6 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#5,#1") /* Place bit 5 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 5 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#4,#1") /* Place bit 4 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 4 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#3,#1") /* Place bit 3 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 3 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#2,#1") /* Place bit 2 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 2 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#1,#1") /* Place bit 1 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 1 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[idx],%[txval],#0,#1") /* Place bit 0 in bit 0 of idx*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 0 */
- A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("nop") /* Result will be 0 */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- : [idx]"+r"( idx )
- : [txval]"r"( bout ) ,
- [mosi_mask]"r"( MOSI_MASK ),
- [mosi_port]"r"( MOSI_PORT_PLUS30 ),
- [sck_mask]"r"( SCK_MASK ),
- [sck_port]"r"( SCK_PORT_PLUS30 )
- : "cc"
- );
-
- return 0;
- }
-
- // Calculates the bit band alias address and returns a pointer address to word.
- // addr: The byte address of bitbanding bit.
- // bit: The bit position of bitbanding bit.
- #define BITBAND_ADDRESS(addr, bit) \
- (((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4)
-
- // run at ~8 .. ~10Mhz - Rx version (Tx line not altered)
- static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
- uint32_t bin = 0;
- uint32_t work = 0;
- uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
-
- /* The software SPI routine */
- __asm__ __volatile__(
- A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
-
- /* bit 7 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */
-
- /* bit 6 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */
-
- /* bit 5 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */
-
- /* bit 4 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */
-
- /* bit 3 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */
-
- /* bit 2 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */
-
- /* bit 1 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */
-
- /* bit 0 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */
-
- : [bin]"+r"(bin),
- [work]"+r"(work)
- : [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
- [sck_mask]"r"( SCK_MASK ),
- [sck_port]"r"( SCK_PORT_PLUS30 )
- : "cc"
- );
-
- return bin;
- }
-
- // run at ~4Mhz
- static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
- int bits = 8;
- do {
- WRITE(SD_MOSI_PIN, b & 0x80);
- b <<= 1; // little setup time
-
- WRITE(SD_SCK_PIN, HIGH);
- DELAY_NS(125); // 10 cycles @ 84mhz
-
- b |= (READ(SD_MISO_PIN) != 0);
-
- WRITE(SD_SCK_PIN, LOW);
- DELAY_NS(125); // 10 cycles @ 84mhz
- } while (--bits);
- return b;
- }
-
- // all the others
- static uint16_t spiDelayNS = 4000; // 4000ns => 125khz
-
- static uint8_t spiTransferX(uint8_t b) { // using Mode 0
- int bits = 8;
- do {
- WRITE(SD_MOSI_PIN, b & 0x80);
- b <<= 1; // little setup time
-
- WRITE(SD_SCK_PIN, HIGH);
- DELAY_NS(spiDelayNS);
-
- b |= (READ(SD_MISO_PIN) != 0);
-
- WRITE(SD_SCK_PIN, LOW);
- DELAY_NS(spiDelayNS);
- } while (--bits);
- return b;
- }
-
- // Pointers to generic functions for byte transfers
-
- /**
- * Note: The cast is unnecessary, but without it, this file triggers a GCC 4.8.3-2014 bug.
- * Later GCC versions do not have this problem, but at this time (May 2018) Arduino still
- * uses that buggy and obsolete GCC version!!
- */
- static pfnSpiTransfer spiTransferRx = (pfnSpiTransfer)spiTransferX;
- static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
-
- // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
- static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) {
- uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
- uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
- uint32_t work = 0;
- uint32_t txval = 0;
-
- /* The software SPI routine */
- __asm__ __volatile__(
- A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
-
- L("loop%=")
- A("ldrb.w %[txval], [%[ptr]], #1") /* Load value to send, increment buffer */
- A("mvn %[txval],%[txval]") /* Negate value */
-
- /* Bit 7 */
- A("ubfx %[work],%[txval],#7,#1") /* Place bit 7 in bit 0 of work*/
-
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#6,#1") /* Place bit 6 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 6 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#5,#1") /* Place bit 5 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 5 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#4,#1") /* Place bit 4 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 4 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#3,#1") /* Place bit 3 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 3 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#2,#1") /* Place bit 2 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 2 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#1,#1") /* Place bit 1 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 1 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ubfx %[work],%[txval],#0,#1") /* Place bit 0 in bit 0 of work*/
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
-
- /* Bit 0 */
- A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("subs %[todo],#1") /* Decrement count of pending words to send, update status */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bne.n loop%=") /* Repeat until done */
-
- : [ptr]"+r" ( ptr ) ,
- [todo]"+r" ( todo ) ,
- [work]"+r"( work ) ,
- [txval]"+r"( txval )
- : [mosi_mask]"r"( MOSI_MASK ),
- [mosi_port]"r"( MOSI_PORT_PLUS30 ),
- [sck_mask]"r"( SCK_MASK ),
- [sck_port]"r"( SCK_PORT_PLUS30 )
- : "cc"
- );
- }
-
- static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
- uint32_t bin = 0;
- uint32_t work = 0;
- uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
- uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
- uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
-
- /* The software SPI routine */
- __asm__ __volatile__(
- A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax
-
- L("loop%=")
-
- /* bit 7 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */
-
- /* bit 6 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */
-
- /* bit 5 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */
-
- /* bit 4 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */
-
- /* bit 3 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */
-
- /* bit 2 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */
-
- /* bit 1 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */
-
- /* bit 0 */
- A("str %[sck_mask],[%[sck_port]]") /* SODR */
- A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */
- A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
- A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */
-
- A("subs %[todo],#1") /* Decrement count of pending words to send, update status */
- A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */
- A("bne.n loop%=") /* Repeat until done */
-
- : [ptr]"+r"(ptr),
- [todo]"+r"(todo),
- [bin]"+r"(bin),
- [work]"+r"(work)
- : [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
- [sck_mask]"r"( SCK_MASK ),
- [sck_port]"r"( SCK_PORT_PLUS30 )
- : "cc"
- );
- }
-
- static void spiTxBlockX(const uint8_t *buf, uint32_t todo) {
- do {
- (void)spiTransferTx(*buf++);
- } while (--todo);
- }
-
- static void spiRxBlockX(uint8_t *buf, uint32_t todo) {
- do {
- *buf++ = spiTransferRx(0xFF);
- } while (--todo);
- }
-
- // Pointers to generic functions for block transfers
- static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
- static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
-
- #if MB(ALLIGATOR)
- #define _SS_WRITE(S) WRITE(SD_SS_PIN, S)
- #else
- #define _SS_WRITE(S) NOOP
- #endif
-
- void spiBegin() {
- SET_OUTPUT(SD_SS_PIN);
- _SS_WRITE(HIGH);
- SET_OUTPUT(SD_SCK_PIN);
- SET_INPUT(SD_MISO_PIN);
- SET_OUTPUT(SD_MOSI_PIN);
- }
-
- uint8_t spiRec() {
- _SS_WRITE(LOW);
- WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
- uint8_t b = spiTransferRx(0xFF);
- _SS_WRITE(HIGH);
- return b;
- }
-
- void spiRead(uint8_t *buf, uint16_t nbyte) {
- if (nbyte) {
- _SS_WRITE(LOW);
- WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
- spiRxBlock(buf, nbyte);
- _SS_WRITE(HIGH);
- }
- }
-
- void spiSend(uint8_t b) {
- _SS_WRITE(LOW);
- (void)spiTransferTx(b);
- _SS_WRITE(HIGH);
- }
-
- void spiSendBlock(uint8_t token, const uint8_t *buf) {
- _SS_WRITE(LOW);
- (void)spiTransferTx(token);
- spiTxBlock(buf, 512);
- _SS_WRITE(HIGH);
- }
-
- /**
- * spiRate should be
- * 0 : 8 - 10 MHz
- * 1 : 4 - 5 MHz
- * 2 : 2 - 2.5 MHz
- * 3 : 1 - 1.25 MHz
- * 4 : 500 - 625 kHz
- * 5 : 250 - 312 kHz
- * 6 : 125 - 156 kHz
- */
- void spiInit(uint8_t spiRate) {
- switch (spiRate) {
- case 0:
- spiTransferTx = (pfnSpiTransfer)spiTransferTx0;
- spiTransferRx = (pfnSpiTransfer)spiTransferRx0;
- spiTxBlock = (pfnSpiTxBlock)spiTxBlock0;
- spiRxBlock = (pfnSpiRxBlock)spiRxBlock0;
- break;
- case 1:
- spiTransferTx = (pfnSpiTransfer)spiTransfer1;
- spiTransferRx = (pfnSpiTransfer)spiTransfer1;
- spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
- spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
- break;
- default:
- spiDelayNS = 4000 >> (6 - spiRate); // spiRate of 2 gives the maximum error with current CPU
- spiTransferTx = (pfnSpiTransfer)spiTransferX;
- spiTransferRx = (pfnSpiTransfer)spiTransferX;
- spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
- spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
- break;
- }
-
- _SS_WRITE(HIGH);
- WRITE(SD_MOSI_PIN, HIGH);
- WRITE(SD_SCK_PIN, LOW);
- }
-
- /** Begin SPI transaction, set clock, bit order, data mode */
- void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
- // TODO: to be implemented
- }
-
- #pragma GCC reset_options
-
-#else // !SOFTWARE_SPI
-
- #define WHILE_TX(N) while ((SPI0->SPI_SR & SPI_SR_TDRE) == (N))
- #define WHILE_RX(N) while ((SPI0->SPI_SR & SPI_SR_RDRF) == (N))
- #define FLUSH_TX() do{ WHILE_RX(1) SPI0->SPI_RDR; }while(0)
-
- #if MB(ALLIGATOR)
-
- // slave selects controlled by SPI controller
- // doesn't support changing SPI speeds for SD card
-
- // ------------------------
- // hardware SPI
- // ------------------------
- static bool spiInitialized = false;
-
- void spiInit(uint8_t spiRate) {
- if (spiInitialized) return;
-
- // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz
- constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 };
- if (spiRate > 6) spiRate = 1;
-
- // Set SPI mode 1, clock, select not active after transfer, with delay between transfers
- SPI_ConfigureNPCS(SPI0, SPI_CHAN_DAC,
- SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) |
- SPI_CSR_DLYBCT(1));
- // Set SPI mode 0, clock, select not active after transfer, with delay between transfers
- SPI_ConfigureNPCS(SPI0, SPI_CHAN_EEPROM1, SPI_CSR_NCPHA |
- SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) |
- SPI_CSR_DLYBCT(1));
-
- // Set SPI mode 0, clock, select not active after transfer, with delay between transfers
- SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA |
- SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) |
- SPI_CSR_DLYBCT(1));
- SPI_Enable(SPI0);
- spiInitialized = true;
- }
-
- void spiBegin() {
- if (spiInitialized) return;
-
- // Configure SPI pins
- PIO_Configure(
- g_APinDescription[SD_SCK_PIN].pPort,
- g_APinDescription[SD_SCK_PIN].ulPinType,
- g_APinDescription[SD_SCK_PIN].ulPin,
- g_APinDescription[SD_SCK_PIN].ulPinConfiguration);
- PIO_Configure(
- g_APinDescription[SD_MOSI_PIN].pPort,
- g_APinDescription[SD_MOSI_PIN].ulPinType,
- g_APinDescription[SD_MOSI_PIN].ulPin,
- g_APinDescription[SD_MOSI_PIN].ulPinConfiguration);
- PIO_Configure(
- g_APinDescription[SD_MISO_PIN].pPort,
- g_APinDescription[SD_MISO_PIN].ulPinType,
- g_APinDescription[SD_MISO_PIN].ulPin,
- g_APinDescription[SD_MISO_PIN].ulPinConfiguration);
-
- // set master mode, peripheral select, fault detection
- SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
- SPI_Enable(SPI0);
-
- SET_OUTPUT(DAC0_SYNC_PIN);
- #if HAS_MULTI_EXTRUDER
- OUT_WRITE(DAC1_SYNC_PIN, HIGH);
- #endif
- WRITE(DAC0_SYNC_PIN, HIGH);
- OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
- OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
- OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
- WRITE(SD_SS_PIN, HIGH);
-
- OUT_WRITE(SDSS, LOW);
-
- PIO_Configure(
- g_APinDescription[SPI_PIN].pPort,
- g_APinDescription[SPI_PIN].ulPinType,
- g_APinDescription[SPI_PIN].ulPin,
- g_APinDescription[SPI_PIN].ulPinConfiguration
- );
-
- spiInit(1);
- }
-
- // Read single byte from SPI
- uint8_t spiRec() {
- // write dummy byte with address and end transmission flag
- SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER;
-
- WHILE_TX(0);
- WHILE_RX(0);
-
- //DELAY_US(1U);
- return SPI0->SPI_RDR;
- }
-
- uint8_t spiRec(uint32_t chan) {
-
- WHILE_TX(0);
- FLUSH_RX();
-
- // write dummy byte with address and end transmission flag
- SPI0->SPI_TDR = 0x000000FF | SPI_PCS(chan) | SPI_TDR_LASTXFER;
- WHILE_RX(0);
-
- return SPI0->SPI_RDR;
- }
-
- // Read from SPI into buffer
- void spiRead(uint8_t *buf, uint16_t nbyte) {
- if (!nbyte) return;
- --nbyte;
- for (int i = 0; i < nbyte; i++) {
- //WHILE_TX(0);
- SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN);
- WHILE_RX(0);
- buf[i] = SPI0->SPI_RDR;
- //DELAY_US(1U);
- }
- buf[nbyte] = spiRec();
- }
-
- // Write single byte to SPI
- void spiSend(const byte b) {
- // write byte with address and end transmission flag
- SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER;
- WHILE_TX(0);
- WHILE_RX(0);
- SPI0->SPI_RDR;
- //DELAY_US(1U);
- }
-
- void spiSend(const uint8_t *buf, size_t nbyte) {
- if (!nbyte) return;
- --nbyte;
- for (size_t i = 0; i < nbyte; i++) {
- SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN);
- WHILE_TX(0);
- WHILE_RX(0);
- SPI0->SPI_RDR;
- //DELAY_US(1U);
- }
- spiSend(buf[nbyte]);
- }
-
- void spiSend(uint32_t chan, byte b) {
- WHILE_TX(0);
- // write byte with address and end transmission flag
- SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(chan) | SPI_TDR_LASTXFER;
- WHILE_RX(0);
- FLUSH_RX();
- }
-
- void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {
- if (!nbyte) return;
- --nbyte;
- for (size_t i = 0; i < nbyte; i++) {
- WHILE_TX(0);
- SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan);
- WHILE_RX(0);
- FLUSH_RX();
- }
- spiSend(chan, buf[nbyte]);
- }
-
- // Write from buffer to SPI
- void spiSendBlock(uint8_t token, const uint8_t *buf) {
- SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
- WHILE_TX(0);
- //WHILE_RX(0);
- //SPI0->SPI_RDR;
- for (int i = 0; i < 511; i++) {
- SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN);
- WHILE_TX(0);
- WHILE_RX(0);
- SPI0->SPI_RDR;
- //DELAY_US(1U);
- }
- spiSend(buf[511]);
- }
-
- /** Begin SPI transaction, set clock, bit order, data mode */
- void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
- // TODO: to be implemented
- }
-
- #else // U8G compatible hardware SPI
-
- #define SPI_MODE_0_DUE_HW 2 // DUE CPHA control bit is inverted
- #define SPI_MODE_1_DUE_HW 3
- #define SPI_MODE_2_DUE_HW 0
- #define SPI_MODE_3_DUE_HW 1
-
- /**
- * The DUE SPI controller is set up so the upper word of the longword
- * written to the transmit data register selects which SPI Chip Select
- * Register is used. This allows different streams to have different SPI
- * settings.
- *
- * In practice it's spooky. Some combinations hang the system, while others
- * upset the peripheral device.
- *
- * SPI mode should be the same for all streams. The FYSETC_MINI_12864 gets
- * upset if the clock phase changes after chip select goes active.
- *
- * SPI_CSR_CSAAT should be set for all streams. If not the WHILE_TX(0)
- * macro returns immediately which can result in the SPI chip select going
- * inactive before all the data has been sent.
- *
- * The TMC2130 library uses SPI0->SPI_CSR[3].
- *
- * The U8G hardware SPI uses SPI0->SPI_CSR[0]. The system hangs and/or the
- * FYSETC_MINI_12864 gets upset if lower baud rates are used and the SD card
- * is inserted or removed.
- *
- * The SD card uses SPI0->SPI_CSR[3]. Efforts were made to use [1] and [2]
- * but they all resulted in hangs or garbage on the LCD.
- *
- * The SPI controlled chip selects are NOT enabled in the GPIO controller.
- * The application must control the chip select.
- *
- * All of the above can be avoided by defining FORCE_SOFT_SPI to force the
- * display to use software SPI.
- */
-
- void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified)
- // Also sets U8G SPI rate to 4MHz and the SPI mode to 3
-
- // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz
- constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 };
- if (spiRate > 6) spiRate = 1;
-
- // Enable PIOA and SPI0
- REG_PMC_PCER0 = (1UL << ID_PIOA) | (1UL << ID_SPI0);
-
- // Disable PIO on A26 and A27
- REG_PIOA_PDR = 0x0C000000;
- OUT_WRITE(SDSS, HIGH);
-
- // Reset SPI0 (from sam lib)
- SPI0->SPI_CR = SPI_CR_SPIDIS;
- SPI0->SPI_CR = SPI_CR_SWRST;
- SPI0->SPI_CR = SPI_CR_SWRST;
- SPI0->SPI_CR = SPI_CR_SPIEN;
-
- // TMC2103 compatible setup
- // Master mode, no fault detection, PCS bits in data written to TDR select CSR register
- SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS;
- // SPI mode 3, 8 Bit data transfer, baud rate
- SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // use same CSR as TMC2130
- SPI0->SPI_CSR[0] = SPI_CSR_SCBR(spiDivider[1]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // U8G default to 4MHz
- }
-
- void spiBegin() { spiInit(); }
-
- static uint8_t spiTransfer(uint8_t data) {
- WHILE_TX(0);
- SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte (use SPI0->SPI_CSR[3])
- WHILE_TX(0);
- WHILE_RX(0);
- return SPI0->SPI_RDR;
- }
-
- uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
-
- void spiRead(uint8_t *buf, uint16_t nbyte) {
- for (int i = 0; i < nbyte; i++)
- buf[i] = spiTransfer(0xFF);
- }
-
- void spiSend(uint8_t data) { spiTransfer(data); }
-
- void spiSend(const uint8_t *buf, size_t nbyte) {
- for (uint16_t i = 0; i < nbyte; i++)
- spiTransfer(buf[i]);
- }
-
- void spiSendBlock(uint8_t token, const uint8_t *buf) {
- spiTransfer(token);
- for (uint16_t i = 0; i < 512; i++)
- spiTransfer(buf[i]);
- }
-
- #endif // !ALLIGATOR
-#endif // !SOFTWARE_SPI
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/InterruptVectors.cpp b/Marlin/src/HAL/DUE/InterruptVectors.cpp
deleted file mode 100644
index e4e0ce99f2b5..000000000000
--- a/Marlin/src/HAL/DUE/InterruptVectors.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * InterruptVectors_Due.cpp - This module relocates the Interrupt vector table to SRAM,
- * allowing to register new interrupt handlers at runtime. Specially valuable and needed
- * because Arduino runtime allocates some interrupt handlers that we NEED to override to
- * properly support extended functionality, as for example, USB host or USB device (MSD, MTP)
- * and custom serial port handlers, and we don't actually want to modify and/or recompile the
- * Arduino runtime. We just want to run as much as possible on Stock Arduino
- *
- * Copyright (c) 2017 Eduardo José Tagle. All right reserved
- */
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-#include "HAL.h"
-#include "InterruptVectors.h"
-
-/* The relocated Exception/Interrupt Table - According to the ARM
- reference manual, alignment to 128 bytes should suffice, but in
- practice, we need alignment to 256 bytes to make this work in all
- cases */
-__attribute__ ((aligned(256)))
-static DeviceVectors ram_tab = { nullptr };
-
-/**
- * This function checks if the exception/interrupt table is already in SRAM or not.
- * If it is not, then it copies the ROM table to the SRAM and relocates the table
- * by reprogramming the NVIC registers
- */
-static pfnISR_Handler* get_relocated_table_addr() {
- // Get the address of the interrupt/exception table
- uint32_t isrtab = SCB->VTOR;
-
- // If already relocated, we are done!
- if (isrtab >= IRAM0_ADDR)
- return (pfnISR_Handler*)isrtab;
-
- // Get the address of the table stored in FLASH
- const pfnISR_Handler* romtab = (const pfnISR_Handler*)isrtab;
-
- // Copy it to SRAM
- memcpy(&ram_tab, romtab, sizeof(ram_tab));
-
- // Disable global interrupts
- CRITICAL_SECTION_START();
-
- // Set the vector table base address to the SRAM copy
- SCB->VTOR = (uint32_t)(&ram_tab);
-
- // Reenable interrupts
- CRITICAL_SECTION_END();
-
- // Return the address of the table
- return (pfnISR_Handler*)(&ram_tab);
-}
-
-pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler) {
- // Get the address of the relocated table
- pfnISR_Handler *isrtab = get_relocated_table_addr();
-
- // Disable global interrupts
- CRITICAL_SECTION_START();
-
- // Get the original handler
- pfnISR_Handler oldHandler = isrtab[irq + 16];
-
- // Install the new one
- isrtab[irq + 16] = newHandler;
-
- // Reenable interrupts
- CRITICAL_SECTION_END();
-
- // Return the original one
- return oldHandler;
-}
-
-#endif
diff --git a/Marlin/src/HAL/DUE/InterruptVectors.h b/Marlin/src/HAL/DUE/InterruptVectors.h
deleted file mode 100644
index 6faeb34b7a3e..000000000000
--- a/Marlin/src/HAL/DUE/InterruptVectors.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * InterruptVectors_Due.h
- *
- * This module relocates the Interrupt vector table to SRAM, allowing new
- * interrupt handlers to be added at runtime. This is required because the
- * Arduino runtime steals interrupt handlers that Marlin MUST use to support
- * extended functionality such as USB hosts and USB devices (MSD, MTP) and
- * custom serial port handlers. Rather than modifying and/or recompiling the
- * Arduino runtime, We just want to run as much as possible on Stock Arduino.
- *
- * Copyright (c) 2017 Eduardo José Tagle. All right reserved
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-// ISR handler type
-typedef void (*pfnISR_Handler)();
-
-// Install a new interrupt vector handler for the given irq, returning the old one
-pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler);
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/MarlinSPI.h b/Marlin/src/HAL/DUE/MarlinSPI.h
deleted file mode 100644
index 0c447ba4cb3d..000000000000
--- a/Marlin/src/HAL/DUE/MarlinSPI.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2021 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 .
- *
- */
-#pragma once
-
-#include
-
-using MarlinSPI = SPIClass;
diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp
deleted file mode 100644
index 638f7a100722..000000000000
--- a/Marlin/src/HAL/DUE/MarlinSerial.cpp
+++ /dev/null
@@ -1,494 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
- * Copyright (c) 2017 Eduardo José Tagle. All right reserved
- * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
- */
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-
-#include "MarlinSerial.h"
-#include "InterruptVectors.h"
-#include "../../MarlinCore.h"
-
-template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } };
-template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 };
-template bool MarlinSerial::_written = false;
-template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR;
-template uint8_t MarlinSerial::rx_dropped_bytes = 0;
-template uint8_t MarlinSerial::rx_buffer_overruns = 0;
-template uint8_t MarlinSerial::rx_framing_errors = 0;
-template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0;
-
-// A SW memory barrier, to ensure GCC does not overoptimize loops
-#define sw_barrier() asm volatile("": : :"memory");
-
-#include "../../feature/e_parser.h"
-
-// (called with RX interrupts disabled)
-template
-FORCE_INLINE void MarlinSerial::store_rxd_char() {
-
- static EmergencyParser::State emergency_state; // = EP_RESET
-
- // Get the tail - Nothing can alter its value while we are at this ISR
- const ring_buffer_pos_t t = rx_buffer.tail;
-
- // Get the head pointer
- ring_buffer_pos_t h = rx_buffer.head;
-
- // Get the next element
- ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // Read the character from the USART
- uint8_t c = HWUART->UART_RHR;
-
- if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c);
-
- // If the character is to be stored at the index just before the tail
- // (such that the head would advance to the current tail), the RX FIFO is
- // full, so don't write the character or advance the head.
- if (i != t) {
- rx_buffer.buffer[h] = c;
- h = i;
- }
- else if (Cfg::DROPPED_RX && !++rx_dropped_bytes)
- --rx_dropped_bytes;
-
- const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
- // Calculate count of bytes stored into the RX buffer
-
- // Keep track of the maximum count of enqueued bytes
- if (Cfg::MAX_RX_QUEUED) NOLESS(rx_max_enqueued, rx_count);
-
- if (Cfg::XONOFF) {
- // If the last char that was sent was an XON
- if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) {
-
- // Bytes stored into the RX buffer
- const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // If over 12.5% of RX buffer capacity, send XOFF before running out of
- // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react
- // and stop sending bytes. This translates to 13mS propagation time.
- if (rx_count >= (Cfg::RX_SIZE) / 8) {
-
- // At this point, definitely no TX interrupt was executing, since the TX isr can't be preempted.
- // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens
- // to be in the middle of trying to disable the RX interrupt in the main program, eventually the
- // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure
- // the sending of the XOFF char is to send it HERE AND NOW.
-
- // About to send the XOFF char
- xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT;
-
- // Wait until the TX register becomes empty and send it - Here there could be a problem
- // - While waiting for the TX register to empty, the RX register could receive a new
- // character. This must also handle that situation!
- uint32_t status;
- while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) {
-
- if (status & UART_SR_RXRDY) {
- // We received a char while waiting for the TX buffer to be empty - Receive and process it!
-
- i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // Read the character from the USART
- c = HWUART->UART_RHR;
-
- if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c);
-
- // If the character is to be stored at the index just before the tail
- // (such that the head would advance to the current tail), the FIFO is
- // full, so don't write the character or advance the head.
- if (i != t) {
- rx_buffer.buffer[h] = c;
- h = i;
- }
- else if (Cfg::DROPPED_RX && !++rx_dropped_bytes)
- --rx_dropped_bytes;
- }
- sw_barrier();
- }
-
- HWUART->UART_THR = XOFF_CHAR;
-
- // At this point there could be a race condition between the write() function
- // and this sending of the XOFF char. This interrupt could happen between the
- // wait to be empty TX buffer loop and the actual write of the character. Since
- // the TX buffer is full because it's sending the XOFF char, the only way to be
- // sure the write() function will succeed is to wait for the XOFF char to be
- // completely sent. Since an extra character could be received during the wait
- // it must also be handled!
- while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) {
-
- if (status & UART_SR_RXRDY) {
- // A char arrived while waiting for the TX buffer to be empty - Receive and process it!
-
- i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
-
- // Read the character from the USART
- c = HWUART->UART_RHR;
-
- if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c);
-
- // If the character is to be stored at the index just before the tail
- // (such that the head would advance to the current tail), the FIFO is
- // full, so don't write the character or advance the head.
- if (i != t) {
- rx_buffer.buffer[h] = c;
- h = i;
- }
- else if (Cfg::DROPPED_RX && !++rx_dropped_bytes)
- --rx_dropped_bytes;
- }
- sw_barrier();
- }
-
- // At this point everything is ready. The write() function won't
- // have any issues writing to the UART TX register if it needs to!
- }
- }
- }
-
- // Store the new head value
- rx_buffer.head = h;
-}
-
-template
-FORCE_INLINE void MarlinSerial::_tx_thr_empty_irq() {
- if (Cfg::TX_SIZE > 0) {
- // Read positions
- uint8_t t = tx_buffer.tail;
- const uint8_t h = tx_buffer.head;
-
- if (Cfg::XONOFF) {
- // If an XON char is pending to be sent, do it now
- if (xon_xoff_state == XON_CHAR) {
-
- // Send the character
- HWUART->UART_THR = XON_CHAR;
-
- // Remember we sent it.
- xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT;
-
- // If nothing else to transmit, just disable TX interrupts.
- if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY;
-
- return;
- }
- }
-
- // If nothing to transmit, just disable TX interrupts. This could
- // happen as the result of the non atomicity of the disabling of RX
- // interrupts that could end reenabling TX interrupts as a side effect.
- if (h == t) {
- HWUART->UART_IDR = UART_IDR_TXRDY;
- return;
- }
-
- // There is something to TX, Send the next byte
- const uint8_t c = tx_buffer.buffer[t];
- t = (t + 1) & (Cfg::TX_SIZE - 1);
- HWUART->UART_THR = c;
- tx_buffer.tail = t;
-
- // Disable interrupts if there is nothing to transmit following this byte
- if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY;
- }
-}
-
-template
-void MarlinSerial::UART_ISR() {
- const uint32_t status = HWUART->UART_SR;
-
- // Data received?
- if (status & UART_SR_RXRDY) store_rxd_char();
-
- if (Cfg::TX_SIZE > 0) {
- // Something to send, and TX interrupts are enabled (meaning something to send)?
- if ((status & UART_SR_TXRDY) && (HWUART->UART_IMR & UART_IMR_TXRDY)) _tx_thr_empty_irq();
- }
-
- // Acknowledge errors
- if ((status & UART_SR_OVRE) || (status & UART_SR_FRAME)) {
- if (Cfg::DROPPED_RX && (status & UART_SR_OVRE) && !++rx_dropped_bytes) --rx_dropped_bytes;
- if (Cfg::RX_OVERRUNS && (status & UART_SR_OVRE) && !++rx_buffer_overruns) --rx_buffer_overruns;
- if (Cfg::RX_FRAMING_ERRORS && (status & UART_SR_FRAME) && !++rx_framing_errors) --rx_framing_errors;
-
- // TODO: error reporting outside ISR
- HWUART->UART_CR = UART_CR_RSTSTA;
- }
-}
-
-// Public Methods
-template
-void MarlinSerial::begin(const long baud_setting) {
-
- // Disable UART interrupt in NVIC
- NVIC_DisableIRQ( HWUART_IRQ );
-
- // We NEED memory barriers to ensure Interrupts are actually disabled!
- // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
- __DSB();
- __ISB();
-
- // Disable clock
- pmc_disable_periph_clk( HWUART_IRQ_ID );
-
- // Configure PMC
- pmc_enable_periph_clk( HWUART_IRQ_ID );
-
- // Disable PDC channel
- HWUART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
-
- // Reset and disable receiver and transmitter
- HWUART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
-
- // Configure mode: 8bit, No parity, 1 bit stop
- HWUART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
-
- // Configure baudrate (asynchronous, no oversampling)
- HWUART->UART_BRGR = (SystemCoreClock / (baud_setting << 4));
-
- // Configure interrupts
- HWUART->UART_IDR = 0xFFFFFFFF;
- HWUART->UART_IER = UART_IER_RXRDY | UART_IER_OVRE | UART_IER_FRAME;
-
- // Install interrupt handler
- install_isr(HWUART_IRQ, UART_ISR);
-
- // Configure priority. We need a very high priority to avoid losing characters
- // and we need to be able to preempt the Stepper ISR and everything else!
- // (this could probably be fixed by using DMA with the Serial port)
- NVIC_SetPriority(HWUART_IRQ, 1);
-
- // Enable UART interrupt in NVIC
- NVIC_EnableIRQ(HWUART_IRQ);
-
- // Enable receiver and transmitter
- HWUART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
-
- if (Cfg::TX_SIZE > 0) _written = false;
-}
-
-template
-void MarlinSerial::end() {
- // Disable UART interrupt in NVIC
- NVIC_DisableIRQ( HWUART_IRQ );
-
- // We NEED memory barriers to ensure Interrupts are actually disabled!
- // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
- __DSB();
- __ISB();
-
- pmc_disable_periph_clk( HWUART_IRQ_ID );
-}
-
-template
-int MarlinSerial::peek() {
- const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail];
- return v;
-}
-
-template
-int MarlinSerial::read() {
-
- const ring_buffer_pos_t h = rx_buffer.head;
- ring_buffer_pos_t t = rx_buffer.tail;
-
- if (h == t) return -1;
-
- int v = rx_buffer.buffer[t];
- t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1);
-
- // Advance tail
- rx_buffer.tail = t;
-
- if (Cfg::XONOFF) {
- // If the XOFF char was sent, or about to be sent...
- if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) {
- // Get count of bytes in the RX buffer
- const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1);
- // When below 10% of RX buffer capacity, send XON before running out of RX buffer bytes
- if (rx_count < (Cfg::RX_SIZE) / 10) {
- if (Cfg::TX_SIZE > 0) {
- // Signal we want an XON character to be sent.
- xon_xoff_state = XON_CHAR;
- // Enable TX isr.
- HWUART->UART_IER = UART_IER_TXRDY;
- }
- else {
- // If not using TX interrupts, we must send the XON char now
- xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT;
- while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier();
- HWUART->UART_THR = XON_CHAR;
- }
- }
- }
- }
-
- return v;
-}
-
-template
-typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() {
- const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail;
- return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1);
-}
-
-template
-void MarlinSerial::flush() {
- rx_buffer.tail = rx_buffer.head;
-
- if (Cfg::XONOFF) {
- if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) {
- if (Cfg::TX_SIZE > 0) {
- // Signal we want an XON character to be sent.
- xon_xoff_state = XON_CHAR;
- // Enable TX isr.
- HWUART->UART_IER = UART_IER_TXRDY;
- }
- else {
- // If not using TX interrupts, we must send the XON char now
- xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT;
- while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier();
- HWUART->UART_THR = XON_CHAR;
- }
- }
- }
-}
-
-template
-size_t MarlinSerial::write(const uint8_t c) {
- _written = true;
-
- if (Cfg::TX_SIZE == 0) {
- while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier();
- HWUART->UART_THR = c;
- }
- else {
-
- // If the TX interrupts are disabled and the data register
- // is empty, just write the byte to the data register and
- // be done. This shortcut helps significantly improve the
- // effective datarate at high (>500kbit/s) bitrates, where
- // interrupt overhead becomes a slowdown.
- // Yes, there is a race condition between the sending of the
- // XOFF char at the RX isr, but it is properly handled there
- if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
- HWUART->UART_THR = c;
- return 1;
- }
-
- const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
-
- // If global interrupts are disabled (as the result of being called from an ISR)...
- if (!hal.isr_state()) {
-
- // Make room by polling if it is possible to transmit, and do so!
- while (i == tx_buffer.tail) {
- // If we can transmit another byte, do it.
- if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq();
- // Make sure compiler rereads tx_buffer.tail
- sw_barrier();
- }
- }
- else {
- // Interrupts are enabled, just wait until there is space
- while (i == tx_buffer.tail) sw_barrier();
- }
-
- // Store new char. head is always safe to move
- tx_buffer.buffer[tx_buffer.head] = c;
- tx_buffer.head = i;
-
- // Enable TX isr - Non atomic, but it will eventually enable TX isr
- HWUART->UART_IER = UART_IER_TXRDY;
- }
- return 1;
-}
-
-template
-void MarlinSerial::flushTX() {
- // TX
-
- if (Cfg::TX_SIZE == 0) {
- // No bytes written, no need to flush. This special case is needed since there's
- // no way to force the TXC (transmit complete) bit to 1 during initialization.
- if (!_written) return;
-
- // Wait until everything was transmitted
- while (!(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier();
-
- // At this point nothing is queued anymore (DRIE is disabled) and
- // the hardware finished transmission (TXC is set).
-
- }
- else {
- // If we have never written a byte, no need to flush. This special
- // case is needed since there is no way to force the TXC (transmit
- // complete) bit to 1 during initialization
- if (!_written) return;
-
- // If global interrupts are disabled (as the result of being called from an ISR)...
- if (!hal.isr_state()) {
-
- // Wait until everything was transmitted - We must do polling, as interrupts are disabled
- while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) {
- // If there is more space, send an extra character
- if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq();
- sw_barrier();
- }
-
- }
- else {
- // Wait until everything was transmitted
- while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier();
- }
-
- // At this point nothing is queued anymore (DRIE is disabled) and
- // the hardware finished transmission (TXC is set).
- }
-}
-
-
-// If not using the USB port as serial port
-#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
- template class MarlinSerial< MarlinSerialCfg >;
- MSerialT1 customizedSerial1(MarlinSerialCfg::EMERGENCYPARSER);
-#endif
-
-#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
- template class MarlinSerial< MarlinSerialCfg >;
- MSerialT2 customizedSerial2(MarlinSerialCfg::EMERGENCYPARSER);
-#endif
-
-#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
- template class MarlinSerial< MarlinSerialCfg >;
- MSerialT3 customizedSerial3(MarlinSerialCfg::EMERGENCYPARSER);
-#endif
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h
deleted file mode 100644
index 5a61bffee0da..000000000000
--- a/Marlin/src/HAL/DUE/MarlinSerial.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * MarlinSerial_Due.h - Hardware serial library for Arduino DUE
- * Copyright (c) 2017 Eduardo José Tagle. All right reserved
- * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
- */
-
-#include
-
-#include "../../inc/MarlinConfigPre.h"
-#include "../../core/serial_hook.h"
-
-// Define constants and variables for buffering incoming serial data. We're
-// using a ring buffer (I think), in which rx_buffer_head is the index of the
-// location to which to write the next incoming character and rx_buffer_tail
-// is the index of the location from which to read.
-// 256 is the max limit due to uint8_t head and tail. Use only powers of 2. (...,16,32,64,128,256)
-#ifndef RX_BUFFER_SIZE
- #define RX_BUFFER_SIZE 128
-#endif
-#ifndef TX_BUFFER_SIZE
- #define TX_BUFFER_SIZE 32
-#endif
-
-//#if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024
-// #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops."
-//#elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE))
-// #error "RX_BUFFER_SIZE must be a power of 2 greater than 1."
-//#elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE))
-// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256."
-//#endif
-
-// Templated type selector
-template struct TypeSelector { typedef T type;} ;
-template struct TypeSelector { typedef F type; };
-
-// Templated structure wrapper
-template struct StructWrapper {
- constexpr StructWrapper(int) {}
- FORCE_INLINE S* operator->() const { return (S*)addr; }
-};
-
-template
-class MarlinSerial {
-protected:
- // Information for all supported UARTs
- static constexpr uint32_t BASES[] = {0x400E0800U, 0x40098000U, 0x4009C000U, 0x400A0000U, 0x400A4000U};
- static constexpr IRQn_Type IRQS[] = { UART_IRQn, USART0_IRQn, USART1_IRQn, USART2_IRQn, USART3_IRQn};
- static constexpr int IRQ_IDS[] = { ID_UART, ID_USART0, ID_USART1, ID_USART2, ID_USART3};
-
- // Alias for shorter code
- static constexpr StructWrapper HWUART = 0;
- static constexpr IRQn_Type HWUART_IRQ = IRQS[Cfg::PORT];
- static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT];
-
- // Base size of type on buffer size
- typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t;
-
- struct ring_buffer_r {
- volatile ring_buffer_pos_t head, tail;
- unsigned char buffer[Cfg::RX_SIZE];
- };
-
- struct ring_buffer_t {
- volatile uint8_t head, tail;
- unsigned char buffer[Cfg::TX_SIZE];
- };
-
- static ring_buffer_r rx_buffer;
- static ring_buffer_t tx_buffer;
- static bool _written;
-
- static constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent
- XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send
-
- // XON / XOFF character definitions
- static constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19;
- static uint8_t xon_xoff_state,
- rx_dropped_bytes,
- rx_buffer_overruns,
- rx_framing_errors;
- static ring_buffer_pos_t rx_max_enqueued;
-
- FORCE_INLINE static void store_rxd_char();
- FORCE_INLINE static void _tx_thr_empty_irq();
- static void UART_ISR();
-
-public:
- MarlinSerial() {};
- static void begin(const long);
- static void end();
- static int peek();
- static int read();
- static void flush();
- static ring_buffer_pos_t available();
- static size_t write(const uint8_t c);
- static void flushTX();
-
- static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
-
- FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
- FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
- FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
- FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
-};
-
-// Serial port configuration
-template
-struct MarlinSerialCfg {
- static constexpr int PORT = serial;
- static constexpr unsigned int RX_SIZE = RX_BUFFER_SIZE;
- static constexpr unsigned int TX_SIZE = TX_BUFFER_SIZE;
- static constexpr bool XONOFF = ENABLED(SERIAL_XON_XOFF);
- static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
- static constexpr bool DROPPED_RX = ENABLED(SERIAL_STATS_DROPPED_RX);
- static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS);
- static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
- static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
-};
-
-#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
- typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT1;
- extern MSerialT1 customizedSerial1;
-#endif
-
-#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
- typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT2;
- extern MSerialT2 customizedSerial2;
-#endif
-
-#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
- typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT3;
- extern MSerialT3 customizedSerial3;
-#endif
diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp
deleted file mode 100644
index 8de2dc7924a0..000000000000
--- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#ifdef ARDUINO_ARCH_SAM
-
-/**
- * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
- * Copyright (c) 2017 Eduardo José Tagle. All right reserved
- * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
- */
-
-#include "../../inc/MarlinConfig.h"
-
-#if HAS_USB_SERIAL
-
-#include "MarlinSerialUSB.h"
-
-// Imports from Atmel USB Stack/CDC implementation
-extern "C" {
- bool usb_task_cdc_isenabled();
- bool usb_task_cdc_dtr_active();
- bool udi_cdc_is_rx_ready();
- int udi_cdc_getc();
- bool udi_cdc_is_tx_ready();
- int udi_cdc_putc(int value);
-}
-
-// Pending character
-static int pending_char = -1;
-
-// Public Methods
-void MarlinSerialUSB::begin(const long) {}
-
-void MarlinSerialUSB::end() {}
-
-int MarlinSerialUSB::peek() {
- if (pending_char >= 0)
- return pending_char;
-
- // If USB CDC not enumerated or not configured on the PC side
- if (!usb_task_cdc_isenabled())
- return -1;
-
- // If no bytes sent from the PC
- if (!udi_cdc_is_rx_ready())
- return -1;
-
- pending_char = udi_cdc_getc();
-
- TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast(this)->emergency_state, (char)pending_char));
-
- return pending_char;
-}
-
-int MarlinSerialUSB::read() {
- if (pending_char >= 0) {
- int ret = pending_char;
- pending_char = -1;
- return ret;
- }
-
- // If USB CDC not enumerated or not configured on the PC side
- if (!usb_task_cdc_isenabled())
- return -1;
-
- // If no bytes sent from the PC
- if (!udi_cdc_is_rx_ready())
- return -1;
-
- int c = udi_cdc_getc();
-
- TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast(this)->emergency_state, (char)c));
-
- return c;
-}
-
-int MarlinSerialUSB::available() {
- if (pending_char > 0) return pending_char;
- return pending_char == 0 ||
- // or USB CDC enumerated and configured on the PC side and some bytes where sent to us */
- (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
-}
-
-void MarlinSerialUSB::flush() { }
-
-size_t MarlinSerialUSB::write(const uint8_t c) {
-
- /* Do not even bother sending anything if USB CDC is not enumerated
- or not configured on the PC side or there is no program on the PC
- listening to our messages */
- if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
- return 0;
-
- /* Wait until the PC has read the pending to be sent data */
- while (usb_task_cdc_isenabled() &&
- usb_task_cdc_dtr_active() &&
- !udi_cdc_is_tx_ready()) {
- };
-
- /* Do not even bother sending anything if USB CDC is not enumerated
- or not configured on the PC side or there is no program on the PC
- listening to our messages at this point */
- if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
- return 0;
-
- // Fifo full
- // udi_cdc_signal_overrun();
- udi_cdc_putc(c);
- return 1;
-}
-
-// Preinstantiate
-#if SERIAL_PORT == -1
- MSerialT1 customizedSerial1(TERN0(EMERGENCY_PARSER, true));
-#endif
-#if SERIAL_PORT_2 == -1
- MSerialT2 customizedSerial2(TERN0(EMERGENCY_PARSER, true));
-#endif
-#if SERIAL_PORT_3 == -1
- MSerialT3 customizedSerial3(TERN0(EMERGENCY_PARSER, true));
-#endif
-
-#endif // HAS_USB_SERIAL
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h
deleted file mode 100644
index 6da1ef8c08f6..000000000000
--- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * MarlinSerialUSB_Due.h - Hardware Serial over USB (CDC) library for Arduino DUE
- * Copyright (c) 2017 Eduardo José Tagle. All right reserved
- */
-
-#include "../../inc/MarlinConfig.h"
-#include "../../core/serial_hook.h"
-
-#include
-
-struct MarlinSerialUSB {
- void begin(const long);
- void end();
- int peek();
- int read();
- void flush();
- int available();
- size_t write(const uint8_t c);
-
- #if ENABLED(SERIAL_STATS_DROPPED_RX)
- FORCE_INLINE uint32_t dropped() { return 0; }
- #endif
-
- #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
- FORCE_INLINE int rxMaxEnqueued() { return 0; }
- #endif
-};
-
-#if SERIAL_PORT == -1
- typedef Serial1Class MSerialT1;
- extern MSerialT1 customizedSerial1;
-#endif
-
-#if SERIAL_PORT_2 == -1
- typedef Serial1Class MSerialT2;
- extern MSerialT2 customizedSerial2;
-#endif
-
-#if SERIAL_PORT_3 == -1
- typedef Serial1Class MSerialT3;
- extern MSerialT3 customizedSerial3;
-#endif
diff --git a/Marlin/src/HAL/DUE/MinSerial.cpp b/Marlin/src/HAL/DUE/MinSerial.cpp
deleted file mode 100644
index e5b3dbfe6f36..000000000000
--- a/Marlin/src/HAL/DUE/MinSerial.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2021 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 .
- *
- */
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfigPre.h"
-
-#if ENABLED(POSTMORTEM_DEBUGGING)
-
-#include "../shared/MinSerial.h"
-
-#include
-
-static void TXBegin() {
- // Disable UART interrupt in NVIC
- NVIC_DisableIRQ( UART_IRQn );
-
- // We NEED memory barriers to ensure Interrupts are actually disabled!
- // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
- __DSB();
- __ISB();
-
- // Disable clock
- pmc_disable_periph_clk( ID_UART );
-
- // Configure PMC
- pmc_enable_periph_clk( ID_UART );
-
- // Disable PDC channel
- UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
-
- // Reset and disable receiver and transmitter
- UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
-
- // Configure mode: 8bit, No parity, 1 bit stop
- UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
-
- // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
- UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
-
- // Enable receiver and transmitter
- UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
-}
-
-// A SW memory barrier, to ensure GCC does not overoptimize loops
-#define sw_barrier() __asm__ volatile("": : :"memory");
-static void TX(char c) {
- while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
- UART->UART_THR = c;
-}
-
-void install_min_serial() {
- HAL_min_serial_init = &TXBegin;
- HAL_min_serial_out = &TX;
-}
-
-#if DISABLED(DYNAMIC_VECTORTABLE)
-extern "C" {
- __attribute__((naked)) void JumpHandler_ASM() {
- __asm__ __volatile__ (
- "b CommonHandler_ASM\n"
- );
- }
- void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
- void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
- void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
- void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
- void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
-}
-#endif
-
-#endif // POSTMORTEM_DEBUGGING
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/Servo.cpp b/Marlin/src/HAL/DUE/Servo.cpp
deleted file mode 100644
index 2dab88238dd6..000000000000
--- a/Marlin/src/HAL/DUE/Servo.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/*
- Copyright (c) 2013 Arduino LLC. All right reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-
-#if HAS_SERVOS
-
-#include "../shared/servo.h"
-#include "../shared/servo_private.h"
-
-static Flags<_Nbr_16timers> DisablePending; // ISR should disable the timer at the next timer reset
-
-// ------------------------
-/// Interrupt handler for the TC0 channel 1.
-// ------------------------
-void Servo_Handler(const timer16_Sequence_t, Tc*, const uint8_t);
-
-#ifdef _useTimer1
- void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); }
-#endif
-#ifdef _useTimer2
- void HANDLER_FOR_TIMER2() { Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); }
-#endif
-#ifdef _useTimer3
- void HANDLER_FOR_TIMER3() { Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); }
-#endif
-#ifdef _useTimer4
- void HANDLER_FOR_TIMER4() { Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); }
-#endif
-#ifdef _useTimer5
- void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); }
-#endif
-
-void Servo_Handler(const timer16_Sequence_t timer, Tc *tc, const uint8_t channel) {
- static int8_t Channel[_Nbr_16timers]; // Servo counters to pulse (or -1 for refresh interval)
- int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
- if (cho < 0) { // Channel -1 indicates the refresh interval completed...
- tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // ...so reset the timer
- if (DisablePending[timer]) {
- // Disabling only after the full servo period expires prevents
- // pulses being too close together if immediately re-enabled.
- DisablePending.clear(timer);
- TC_Stop(tc, channel);
- tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
- return;
- }
- }
- else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
- extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
-
- Channel[timer] = ++cho; // go to the next channel (or 0)
- if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
- tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer, cho).ticks;
- if (SERVO(timer, cho).Pin.isActive) // activated?
- extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
- }
- else {
- // finished all channels so wait for the refresh period to expire before starting over
- const unsigned int cval = tc->TC_CHANNEL[channel].TC_CV + 128 / (SERVO_TIMER_PRESCALER), // allow 128 cycles to ensure the next CV not missed
- ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
- tc->TC_CHANNEL[channel].TC_RA = max(cval, ival);
-
- Channel[timer] = -1; // reset the timer CCR on the next call
- }
-
- tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
-}
-
-static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) {
- pmc_enable_periph_clk(id);
- TC_Configure(tc, channel,
- TC_CMR_WAVE // Waveform mode
- | TC_CMR_WAVSEL_UP_RC // Counter running up and reset when equal to RC
- | (SERVO_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0) // MCK/2
- | (SERVO_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0) // MCK/8
- | (SERVO_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0) // MCK/32
- | (SERVO_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0) // MCK/128
- );
-
- // Wait 1ms before the first ISR
- TC_SetRA(tc, channel, (F_CPU) / (SERVO_TIMER_PRESCALER) / 1000UL); // 1ms
-
- // Configure and enable interrupt
- NVIC_EnableIRQ(irqn);
- tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; // TC_IER_CPAS: RA Compare
-
- // Enables the timer clock and performs a software reset to start the counting
- TC_Start(tc, channel);
-}
-
-void initISR(const timer16_Sequence_t timer_index) {
- CRITICAL_SECTION_START();
- const bool disable_soon = DisablePending[timer_index];
- DisablePending.clear(timer_index);
- CRITICAL_SECTION_END();
-
- if (!disable_soon) switch (timer_index) {
- default: break;
- #ifdef _useTimer1
- case _timer1: return _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1);
- #endif
- #ifdef _useTimer2
- case _timer2: return _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2);
- #endif
- #ifdef _useTimer3
- case _timer3: return _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3);
- #endif
- #ifdef _useTimer4
- case _timer4: return _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4);
- #endif
- #ifdef _useTimer5
- case _timer5: return _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5);
- #endif
- }
-}
-
-void finISR(const timer16_Sequence_t timer_index) {
- // Timer is disabled from the ISR, to ensure proper final pulse length.
- DisablePending.set(timer_index);
-}
-
-#endif // HAS_SERVOS
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/ServoTimers.h b/Marlin/src/HAL/DUE/ServoTimers.h
deleted file mode 100644
index 95bd404c8061..000000000000
--- a/Marlin/src/HAL/DUE/ServoTimers.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * Copyright (c) 2013 Arduino LLC. All right reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * Defines for 16 bit timers used with Servo library
- *
- * If _useTimerX is defined then TimerX is a 32 bit timer on the current board
- * timer16_Sequence_t enumerates the sequence that the timers should be allocated
- * _Nbr_16timers indicates how many timers are available.
- */
-
-/**
- * SAM Only definitions
- * --------------------
- */
-
-// For SAM3X:
-//!#define _useTimer1
-//!#define _useTimer2
-#define _useTimer3
-//!#define _useTimer4
-#define _useTimer5
-
-#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
-#define SERVO_TIMER_PRESCALER 2 // timer prescaler
-
-/*
- TC0, chan 0 => TC0_Handler
- TC0, chan 1 => TC1_Handler
- TC0, chan 2 => TC2_Handler
- TC1, chan 0 => TC3_Handler
- TC1, chan 1 => TC4_Handler
- TC1, chan 2 => TC5_Handler
- TC2, chan 0 => TC6_Handler
- TC2, chan 1 => TC7_Handler
- TC2, chan 2 => TC8_Handler
- */
-
-#ifdef _useTimer1
- #define TC_FOR_TIMER1 TC1
- #define CHANNEL_FOR_TIMER1 0
- #define ID_TC_FOR_TIMER1 ID_TC3
- #define IRQn_FOR_TIMER1 TC3_IRQn
- #define HANDLER_FOR_TIMER1 TC3_Handler
-#endif
-#ifdef _useTimer2
- #define TC_FOR_TIMER2 TC1
- #define CHANNEL_FOR_TIMER2 1
- #define ID_TC_FOR_TIMER2 ID_TC4
- #define IRQn_FOR_TIMER2 TC4_IRQn
- #define HANDLER_FOR_TIMER2 TC4_Handler
-#endif
-#ifdef _useTimer3
- #define TC_FOR_TIMER3 TC1
- #define CHANNEL_FOR_TIMER3 2
- #define ID_TC_FOR_TIMER3 ID_TC5
- #define IRQn_FOR_TIMER3 TC5_IRQn
- #define HANDLER_FOR_TIMER3 TC5_Handler
-#endif
-#ifdef _useTimer4
- #define TC_FOR_TIMER4 TC0
- #define CHANNEL_FOR_TIMER4 2
- #define ID_TC_FOR_TIMER4 ID_TC2
- #define IRQn_FOR_TIMER4 TC2_IRQn
- #define HANDLER_FOR_TIMER4 TC2_Handler
-#endif
-#ifdef _useTimer5
- #define TC_FOR_TIMER5 TC0
- #define CHANNEL_FOR_TIMER5 0
- #define ID_TC_FOR_TIMER5 ID_TC0
- #define IRQn_FOR_TIMER5 TC0_IRQn
- #define HANDLER_FOR_TIMER5 TC0_Handler
-#endif
-
-typedef enum : unsigned char {
- #ifdef _useTimer1
- _timer1,
- #endif
- #ifdef _useTimer2
- _timer2,
- #endif
- #ifdef _useTimer3
- _timer3,
- #endif
- #ifdef _useTimer4
- _timer4,
- #endif
- #ifdef _useTimer5
- _timer5,
- #endif
- _Nbr_16timers
-} timer16_Sequence_t;
diff --git a/Marlin/src/HAL/DUE/Tone.cpp b/Marlin/src/HAL/DUE/Tone.cpp
deleted file mode 100644
index 4bc8142aba27..000000000000
--- a/Marlin/src/HAL/DUE/Tone.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- *
- * Based on Sprinter and grbl.
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
- *
- * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician)
- *
- * 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 .
- *
- */
-
-/**
- * Description: Tone function for Arduino Due and compatible (SAM3X8E)
- * Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-#include "HAL.h"
-
-static pin_t tone_pin;
-volatile static int32_t toggles;
-
-void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration/*=0*/) {
- tone_pin = _pin;
- toggles = 2 * frequency * duration / 1000;
- HAL_timer_start(MF_TIMER_TONE, 2 * frequency);
-}
-
-void noTone(const pin_t _pin) {
- HAL_timer_disable_interrupt(MF_TIMER_TONE);
- extDigitalWrite(_pin, LOW);
-}
-
-HAL_TONE_TIMER_ISR() {
- static uint8_t pin_state = 0;
- HAL_timer_isr_prologue(MF_TIMER_TONE);
-
- if (toggles) {
- toggles--;
- extDigitalWrite(tone_pin, (pin_state ^= 1));
- }
- else noTone(tone_pin); // turn off interrupt
-}
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
deleted file mode 100644
index 68f6a5c1a7cb..000000000000
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Based on u8g_com_msp430_hw_spi.c
- *
- * Universal 8bit Graphics Library
- *
- * Copyright (c) 2012, olikraus@gmail.com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __SAM3X8E__
-
-#include "../../../inc/MarlinConfigPre.h"
-
-#if HAS_MARLINUI_U8GLIB
-
-#include
-
-#include "../../../MarlinCore.h"
-
-#ifndef LCD_SPI_SPEED
- #define LCD_SPI_SPEED SPI_QUARTER_SPEED
-#endif
-
-#include "../../shared/HAL_SPI.h"
-#include "../fastio.h"
-
-void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
- PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1,
- g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT
-}
-
-void u8g_SetPILevel_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index, uint8_t level) {
- volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort;
- uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin;
- if (level) port->PIO_SODR = mask;
- else port->PIO_CODR = mask;
-}
-
-uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
- switch (msg) {
- case U8G_COM_MSG_STOP:
- break;
-
- case U8G_COM_MSG_INIT:
- u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, 1);
- u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, 1);
-
- u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_CS);
- u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_A0);
-
- u8g_Delay(5);
-
- spiBegin();
-
- spiInit(LCD_SPI_SPEED);
- break;
-
- case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
- u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, arg_val);
- break;
-
- case U8G_COM_MSG_CHIP_SELECT:
- u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, (arg_val ? 0 : 1));
- break;
-
- case U8G_COM_MSG_RESET:
- break;
-
- case U8G_COM_MSG_WRITE_BYTE:
-
- spiSend((uint8_t)arg_val);
- break;
-
- case U8G_COM_MSG_WRITE_SEQ: {
- uint8_t *ptr = (uint8_t*) arg_ptr;
- while (arg_val > 0) {
- spiSend(*ptr++);
- arg_val--;
- }
- }
- break;
-
- case U8G_COM_MSG_WRITE_SEQ_P: {
- uint8_t *ptr = (uint8_t*) arg_ptr;
- while (arg_val > 0) {
- spiSend(*ptr++);
- arg_val--;
- }
- }
- break;
- }
- return 1;
-}
-
-#endif // HAS_MARLINUI_U8GLIB
-
-#endif // __SAM3X8E__
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
deleted file mode 100644
index 8268cf307e08..000000000000
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Based on u8g_com_st7920_hw_spi.c
- *
- * Universal 8bit Graphics Library
- *
- * Copyright (c) 2011, olikraus@gmail.com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../../inc/MarlinConfigPre.h"
-
-#if IS_U8GLIB_ST7920
-
-#include "../../../inc/MarlinConfig.h"
-#include "../../shared/Delay.h"
-
-#include
-
-#include "u8g_com_HAL_DUE_sw_spi_shared.h"
-
-#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0
-
-static uint8_t rs_last_state = 255;
-
-static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
- if (rs != rs_last_state) { // time to send a command/data byte
- rs_last_state = rs;
- SPISEND_SW_DUE(rs ? 0x0FA : 0x0F8); // Command or Data
- DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe
- }
- SPISEND_SW_DUE(val & 0xF0);
- SPISEND_SW_DUE(val << 4);
-}
-
-uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
- switch (msg) {
- case U8G_COM_MSG_INIT:
- SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort;
- SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin;
- MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort;
- MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin;
-
- u8g_SetPILevel_DUE(u8g, U8G_PI_CS, 0);
- u8g_SetPIOutput_DUE(u8g, U8G_PI_CS);
- u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0);
- u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK);
- u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0);
- u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI);
-
- SCK_pPio->PIO_CODR = SCK_dwMask; //SCK low - needed at power up but not after reset
- MOSI_pPio->PIO_CODR = MOSI_dwMask; //MOSI low - needed at power up but not after reset
-
- u8g_Delay(5);
-
- u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: command mode */
- break;
-
- case U8G_COM_MSG_STOP:
- break;
-
- case U8G_COM_MSG_RESET:
- if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val);
- break;
-
- case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
- u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
- break;
-
- case U8G_COM_MSG_CHIP_SELECT:
- if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS])
- u8g_SetPILevel_DUE(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select
- break;
-
- case U8G_COM_MSG_WRITE_BYTE:
-
- u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val);
- break;
-
- case U8G_COM_MSG_WRITE_SEQ: {
- uint8_t *ptr = (uint8_t*) arg_ptr;
- while (arg_val > 0) {
- u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
- arg_val--;
- }
- }
- break;
-
- case U8G_COM_MSG_WRITE_SEQ_P: {
- uint8_t *ptr = (uint8_t*) arg_ptr;
- while (arg_val > 0) {
- u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
- arg_val--;
- }
- }
- break;
- }
- return 1;
-}
-
-#if ENABLED(LIGHTWEIGHT_UI)
- #include "../../../lcd/marlinui.h"
- #include "../../shared/HAL_ST7920.h"
-
- #define ST7920_CS_PIN LCD_PINS_RS
-
- #if DOGM_SPI_DELAY_US > 0
- #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US)
- #else
- #define U8G_DELAY() DELAY_US(10)
- #endif
-
- void ST7920_cs() {
- WRITE(ST7920_CS_PIN, HIGH);
- U8G_DELAY();
- }
-
- void ST7920_ncs() {
- WRITE(ST7920_CS_PIN, LOW);
- }
-
- void ST7920_set_cmd() {
- SPISEND_SW_DUE(0xF8);
- DELAY_US(40);
- }
-
- void ST7920_set_dat() {
- SPISEND_SW_DUE(0xFA);
- DELAY_US(40);
- }
-
- void ST7920_write_byte(const uint8_t val) {
- SPISEND_SW_DUE(val & 0xF0);
- SPISEND_SW_DUE(val << 4);
- }
-#endif // LIGHTWEIGHT_UI
-
-#endif // IS_U8GLIB_ST7920
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
deleted file mode 100644
index 68e3e74a45a0..000000000000
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Based on u8g_com_std_sw_spi.c
- *
- * Universal 8bit Graphics Library
- *
- * Copyright (c) 2015, olikraus@gmail.com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../../inc/MarlinConfigPre.h"
-
-#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
-
-#include "u8g_com_HAL_DUE_sw_spi_shared.h"
-
-#include "../../shared/Marduino.h"
-#include "../../shared/Delay.h"
-
-#include
-
-#if ENABLED(FYSETC_MINI_12864)
- #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
-#else
- #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0
-#endif
-
-uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
- switch (msg) {
- case U8G_COM_MSG_INIT:
- SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort;
- SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin;
- MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort;
- MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin;
- u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK);
- u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI);
- u8g_SetPIOutput_DUE(u8g, U8G_PI_CS);
- u8g_SetPIOutput_DUE(u8g, U8G_PI_A0);
- if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput_DUE(u8g, U8G_PI_RESET);
- u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0);
- u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0);
- break;
-
- case U8G_COM_MSG_STOP:
- break;
-
- case U8G_COM_MSG_RESET:
- if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val);
- break;
-
- case U8G_COM_MSG_CHIP_SELECT:
- #if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
- if (arg_val) { // SCK idle state needs to be set to the proper idle state before
- // the next chip select goes active
- u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 1); //set SCK to mode 3 idle state before CS goes active
- u8g_SetPILevel_DUE(u8g, U8G_PI_CS, LOW);
- }
- else {
- u8g_SetPILevel_DUE(u8g, U8G_PI_CS, HIGH);
- u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); //set SCK to mode 0 idle state after CS goes inactive
- }
- #else
- u8g_SetPILevel_DUE(u8g, U8G_PI_CS, !arg_val);
- #endif
- break;
-
- case U8G_COM_MSG_WRITE_BYTE:
- SPISEND_SW_DUE(arg_val);
- break;
-
- case U8G_COM_MSG_WRITE_SEQ: {
- uint8_t *ptr = (uint8_t *)arg_ptr;
- while (arg_val > 0) {
- SPISEND_SW_DUE(*ptr++);
- arg_val--;
- }
- }
- break;
-
- case U8G_COM_MSG_WRITE_SEQ_P: {
- uint8_t *ptr = (uint8_t *)arg_ptr;
- while (arg_val > 0) {
- SPISEND_SW_DUE(u8g_pgm_read(ptr));
- ptr++;
- arg_val--;
- }
- }
- break;
-
- case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
- u8g_SetPILevel_DUE(u8g, U8G_PI_A0, arg_val);
- break;
- }
- return 1;
-}
-
-#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
deleted file mode 100644
index 904924793b4c..000000000000
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Based on u8g_com_st7920_hw_spi.c
- *
- * Universal 8bit Graphics Library
- *
- * Copyright (c) 2011, olikraus@gmail.com
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../../inc/MarlinConfigPre.h"
-
-#if HAS_MARLINUI_U8GLIB
-
-#include "../../../inc/MarlinConfig.h"
-#include "../../shared/Delay.h"
-
-#include
-
-#include "u8g_com_HAL_DUE_sw_spi_shared.h"
-
-void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) {
- PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1,
- g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT
-}
-
-void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) {
- volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort;
- uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin;
- if (level) port->PIO_SODR = mask; else port->PIO_CODR = mask;
-}
-
-Pio *SCK_pPio, *MOSI_pPio;
-uint32_t SCK_dwMask, MOSI_dwMask;
-
-void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
- LOOP_L_N(i, 8) {
- if (val & 0x80)
- MOSI_pPio->PIO_SODR = MOSI_dwMask;
- else
- MOSI_pPio->PIO_CODR = MOSI_dwMask;
- DELAY_NS(48);
- SCK_pPio->PIO_SODR = SCK_dwMask;
- DELAY_NS(905);
- val <<= 1;
- SCK_pPio->PIO_CODR = SCK_dwMask;
- }
-}
-
-void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
- LOOP_L_N(i, 8) {
- SCK_pPio->PIO_CODR = SCK_dwMask;
- DELAY_NS(50);
- if (val & 0x80)
- MOSI_pPio->PIO_SODR = MOSI_dwMask;
- else
- MOSI_pPio->PIO_CODR = MOSI_dwMask;
- val <<= 1;
- DELAY_NS(10);
- SCK_pPio->PIO_SODR = SCK_dwMask;
- DELAY_NS(70);
- }
-}
-
-#endif // HAS_MARLINUI_U8GLIB
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h
deleted file mode 100644
index 45231fd091eb..000000000000
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-#include "../../../inc/MarlinConfigPre.h"
-#include "../../shared/Marduino.h"
-#include
-
-void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
-void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
-
-void u8g_spiSend_sw_DUE_mode_0(uint8_t val);
-void u8g_spiSend_sw_DUE_mode_3(uint8_t val);
-
-extern Pio *SCK_pPio, *MOSI_pPio;
-extern uint32_t SCK_dwMask, MOSI_dwMask;
diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp
deleted file mode 100644
index 607764155b0a..000000000000
--- a/Marlin/src/HAL/DUE/eeprom_flash.cpp
+++ /dev/null
@@ -1,998 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- *
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
- * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
- *
- * 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 .
- *
- */
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-
-#if ENABLED(FLASH_EEPROM_EMULATION)
-
-/* EEPROM emulation over flash with reduced wear
- *
- * We will use 2 contiguous groups of pages as main and alternate.
- * We want an structure that allows to read as fast as possible,
- * without the need of scanning the whole FLASH memory.
- *
- * FLASH bits default erased state is 1, and can be set to 0
- * on a per bit basis. To reset them to 1, a full page erase
- * is needed.
- *
- * Values are stored as differences that should be applied to a
- * completely erased EEPROM (filled with 0xFFs). We just encode
- * the starting address of the values to change, the length of
- * the block of new values, and the values themselves. All diffs
- * are accumulated into a RAM buffer, compacted into the least
- * amount of non overlapping diffs possible and sorted by starting
- * address before being saved into the next available page of FLASH
- * of the current group.
- * Once the current group is completely full, we compact it and save
- * it into the other group, then erase the current group and switch
- * to that new group and set it as current.
- *
- * The FLASH endurance is about 1/10 ... 1/100 of an EEPROM
- * endurance, but EEPROM endurance is specified per byte, not
- * per page. We can't emulate EE endurance with FLASH for all
- * bytes, but we can emulate endurance for a given percent of
- * bytes.
- */
-
-//#define EE_EMU_DEBUG
-
-#define EEPROMSize 4096
-#define PagesPerGroup 128
-#define GroupCount 2
-#define PageSize 256U
-
- /* Flash storage */
-typedef struct FLASH_SECTOR {
- uint8_t page[PageSize];
-} FLASH_SECTOR_T;
-
-#define PAGE_FILL \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
-
-#define FLASH_INIT_FILL \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \
- PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL
-
-/* This is the FLASH area used to emulate a 2Kbyte EEPROM -- We need this buffer aligned
- to a 256 byte boundary. */
-static const uint8_t flashStorage[PagesPerGroup * GroupCount * PageSize] __attribute__ ((aligned (PageSize))) = { FLASH_INIT_FILL };
-
-/* Get the address of an specific page */
-static const FLASH_SECTOR_T* getFlashStorage(int page) {
- return (const FLASH_SECTOR_T*)&flashStorage[page*PageSize];
-}
-
-static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes
- curPage = 0, // Current FLASH page inside the group
- curGroup = 0xFF; // Current FLASH group
-
-#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
-#include "../../core/debug_out.h"
-
-static void ee_Dump(const int page, const void *data) {
-
- #ifdef EE_EMU_DEBUG
-
- const uint8_t *c = (const uint8_t*) data;
- char buffer[80];
-
- sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
- DEBUG_ECHO(buffer);
-
- char* p = &buffer[0];
- for (int i = 0; i< PageSize; ++i) {
- if ((i & 0xF) == 0) p += sprintf_P(p, PSTR("%04x] "), i);
-
- p += sprintf_P(p, PSTR(" %02x"), c[i]);
- if ((i & 0xF) == 0xF) {
- *p++ = '\n';
- *p = 0;
- DEBUG_ECHO(buffer);
- p = &buffer[0];
- }
- }
-
- #else
- UNUSED(page);
- UNUSED(data);
- #endif
-}
-
-/* Flash Writing Protection Key */
-#define FWP_KEY 0x5Au
-
-#if SAM4S_SERIES
- #define EEFC_FCR_FCMD(value) \
- ((EEFC_FCR_FCMD_Msk & ((value) << EEFC_FCR_FCMD_Pos)))
- #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE | EEFC_FSR_FLERR)
-#else
- #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE)
-#endif
-
-/**
- * Writes the contents of the specified page (no previous erase)
- * @param page (page #)
- * @param data (pointer to the data buffer)
- */
-__attribute__ ((long_call, section (".ramfunc")))
-static bool ee_PageWrite(uint16_t page, const void *data) {
-
- uint16_t i;
- uint32_t addrflash = uint32_t(getFlashStorage(page));
-
- // Read the flash contents
- uint32_t pageContents[PageSize>>2];
- memcpy(pageContents, (void*)addrflash, PageSize);
-
- // We ONLY want to toggle bits that have changed, and that have changed to 0.
- // SAM3X8E tends to destroy contiguous bits if reprogrammed without erasing, so
- // we try by all means to avoid this. That is why it says: "The Partial
- // Programming mode works only with 128-bit (or higher) boundaries. It cannot
- // be used with boundaries lower than 128 bits (8, 16 or 32-bit for example)."
- // All bits that did not change, set them to 1.
- for (i = 0; i > 2; i++)
- pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
-
- DEBUG_ECHO_MSG("EEPROM PageWrite ", page);
- DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
- DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
- DEBUG_FLUSH();
-
- // Get the page relative to the start of the EFC controller, and the EFC controller to use
- Efc *efc;
- uint16_t fpage;
- if (addrflash >= IFLASH1_ADDR) {
- efc = EFC1;
- fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE;
- }
- else {
- efc = EFC0;
- fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE;
- }
-
- // Get the page that must be unlocked, then locked
- uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1));
-
- // Disable all interrupts
- __disable_irq();
-
- // Get the FLASH wait states
- uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos;
-
- // Set wait states to 6 (SAM errata)
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(6);
-
- // Unlock the flash page
- uint32_t status;
- efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB);
- while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) {
- // force compiler to not optimize this -- NOPs don't work!
- __asm__ __volatile__("");
- };
-
- if ((status & EEFC_ERROR_FLAGS) != 0) {
-
- // Restore original wait states
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS);
-
- // Reenable interrupts
- __enable_irq();
-
- DEBUG_ECHO_MSG("EEPROM Unlock failure for page ", page);
- return false;
- }
-
- // Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption.
- const uint32_t * aligned_src = (const uint32_t *) &pageContents[0]; /*data;*/
- uint32_t * p_aligned_dest = (uint32_t *) addrflash;
- for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) {
- *p_aligned_dest++ = *aligned_src++;
- }
- efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_WPL);
- while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) {
- // force compiler to not optimize this -- NOPs don't work!
- __asm__ __volatile__("");
- };
-
- if ((status & EEFC_ERROR_FLAGS) != 0) {
-
- // Restore original wait states
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS);
-
- // Reenable interrupts
- __enable_irq();
-
- DEBUG_ECHO_MSG("EEPROM Write failure for page ", page);
-
- return false;
- }
-
- // Restore original wait states
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS);
-
- // Reenable interrupts
- __enable_irq();
-
- // Compare contents
- if (memcmp(getFlashStorage(page),data,PageSize)) {
-
- #ifdef EE_EMU_DEBUG
- DEBUG_ECHO_MSG("EEPROM Verify Write failure for page ", page);
-
- ee_Dump( page, (uint32_t *)addrflash);
- ee_Dump(-page, data);
-
- // Calculate count of changed bits
- uint32_t *p1 = (uint32_t*)addrflash;
- uint32_t *p2 = (uint32_t*)data;
- int count = 0;
- for (i =0; i> 2; i++) {
- if (p1[i] != p2[i]) {
- uint32_t delta = p1[i] ^ p2[i];
- while (delta) {
- if ((delta&1) != 0)
- count++;
- delta >>= 1;
- }
- }
- }
- DEBUG_ECHOLNPGM("--> Differing bits: ", count);
- #endif
-
- return false;
- }
-
- return true;
-}
-
-/**
- * Erases the contents of the specified page
- * @param page (page #)
- */
-__attribute__ ((long_call, section (".ramfunc")))
-static bool ee_PageErase(uint16_t page) {
-
- uint16_t i;
- uint32_t addrflash = uint32_t(getFlashStorage(page));
-
- DEBUG_ECHO_MSG("EEPROM PageErase ", page);
- DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
- DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
- DEBUG_FLUSH();
-
- // Get the page relative to the start of the EFC controller, and the EFC controller to use
- Efc *efc;
- uint16_t fpage;
- if (addrflash >= IFLASH1_ADDR) {
- efc = EFC1;
- fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE;
- }
- else {
- efc = EFC0;
- fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE;
- }
-
- // Get the page that must be unlocked, then locked
- uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1));
-
- // Disable all interrupts
- __disable_irq();
-
- // Get the FLASH wait states
- uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos;
-
- // Set wait states to 6 (SAM errata)
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(6);
-
- // Unlock the flash page
- uint32_t status;
- efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB);
- while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) {
- // force compiler to not optimize this -- NOPs don't work!
- __asm__ __volatile__("");
- };
- if ((status & EEFC_ERROR_FLAGS) != 0) {
-
- // Restore original wait states
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS);
-
- // Reenable interrupts
- __enable_irq();
-
- DEBUG_ECHO_MSG("EEPROM Unlock failure for page ",page);
-
- return false;
- }
-
- // Erase Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption.
- uint32_t * p_aligned_dest = (uint32_t *) addrflash;
- for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) {
- *p_aligned_dest++ = 0xFFFFFFFF;
- }
- efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_EWPL);
- while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) {
- // force compiler to not optimize this -- NOPs don't work!
- __asm__ __volatile__("");
- };
- if ((status & EEFC_ERROR_FLAGS) != 0) {
-
- // Restore original wait states
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS);
-
- // Reenable interrupts
- __enable_irq();
-
- DEBUG_ECHO_MSG("EEPROM Erase failure for page ",page);
-
- return false;
- }
-
- // Restore original wait states
- efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS);
-
- // Reenable interrupts
- __enable_irq();
-
- // Check erase
- uint32_t * aligned_src = (uint32_t *) addrflash;
- for (i = 0; i < PageSize >> 2; i++) {
- if (*aligned_src++ != 0xFFFFFFFF) {
- DEBUG_ECHO_MSG("EEPROM Verify Erase failure for page ",page);
- ee_Dump(page, (uint32_t *)addrflash);
- return false;
- }
- }
-
- return true;
-}
-
-static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) {
-
- uint32_t baddr;
- uint32_t blen;
-
- // If we were requested an address outside of the emulated range, fail now
- if (address >= EEPROMSize)
- return false;
-
- // Check that the value is not contained in the RAM buffer
- if (!excludeRAMBuffer) {
- uint16_t i = 0;
- while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
-
- // Get the address of the block
- baddr = buffer[i] | (buffer[i + 1] << 8);
-
- // Get the length of the block
- blen = buffer[i + 2];
-
- // If we reach the end of the list, break loop
- if (blen == 0xFF)
- break;
-
- // Check if data is contained in this block
- if (address >= baddr &&
- address < (baddr + blen)) {
-
- // Yes, it is contained. Return it!
- return buffer[i + 3 + address - baddr];
- }
-
- // As blocks are always sorted, if the starting address of this block is higher
- // than the address we are looking for, break loop now - We wont find the value
- // associated to the address
- if (baddr > address)
- break;
-
- // Jump to the next block
- i += 3 + blen;
- }
- }
-
- // It is NOT on the RAM buffer. It could be stored in FLASH. We are
- // ensured on a given FLASH page, address contents are never repeated
- // but on different pages, there is no such warranty, so we must go
- // backwards from the last written FLASH page to the first one.
- for (int page = curPage - 1; page >= 0; --page) {
-
- // Get a pointer to the flash page
- uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
-
- uint16_t i = 0;
- while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
-
- // Get the address of the block
- baddr = pflash[i] | (pflash[i + 1] << 8);
-
- // Get the length of the block
- blen = pflash[i + 2];
-
- // If we reach the end of the list, break loop
- if (blen == 0xFF)
- break;
-
- // Check if data is contained in this block
- if (address >= baddr && address < (baddr + blen))
- return pflash[i + 3 + address - baddr]; // Yes, it is contained. Return it!
-
- // As blocks are always sorted, if the starting address of this block is higher
- // than the address we are looking for, break loop now - We wont find the value
- // associated to the address
- if (baddr > address) break;
-
- // Jump to the next block
- i += 3 + blen;
- }
- }
-
- // If reached here, value is not stored, so return its default value
- return 0xFF;
-}
-
-static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) {
- uint32_t baddr,
- blen,
- nextAddr = 0xFFFF,
- nextRange = 0;
-
- // Check that the value is not contained in the RAM buffer
- if (!excludeRAMBuffer) {
- uint16_t i = 0;
- while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
-
- // Get the address of the block
- baddr = buffer[i] | (buffer[i + 1] << 8);
-
- // Get the length of the block
- blen = buffer[i + 2];
-
- // If we reach the end of the list, break loop
- if (blen == 0xFF) break;
-
- // Check if address and address + 1 is contained in this block
- if (address >= baddr && address < (baddr + blen))
- return address | ((blen - address + baddr) << 16); // Yes, it is contained. Return it!
-
- // Otherwise, check if we can use it as a limit
- if (baddr > address && baddr < nextAddr) {
- nextAddr = baddr;
- nextRange = blen;
- }
-
- // As blocks are always sorted, if the starting address of this block is higher
- // than the address we are looking for, break loop now - We wont find the value
- // associated to the address
- if (baddr > address) break;
-
- // Jump to the next block
- i += 3 + blen;
- }
- }
-
- // It is NOT on the RAM buffer. It could be stored in FLASH. We are
- // ensured on a given FLASH page, address contents are never repeated
- // but on different pages, there is no such warranty, so we must go
- // backwards from the last written FLASH page to the first one.
- for (int page = curPage - 1; page >= 0; --page) {
-
- // Get a pointer to the flash page
- uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
-
- uint16_t i = 0;
- while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
-
- // Get the address of the block
- baddr = pflash[i] | (pflash[i + 1] << 8);
-
- // Get the length of the block
- blen = pflash[i + 2];
-
- // If we reach the end of the list, break loop
- if (blen == 0xFF) break;
-
- // Check if data is contained in this block
- if (address >= baddr && address < (baddr + blen))
- return address | ((blen - address + baddr) << 16); // Yes, it is contained. Return it!
-
- // Otherwise, check if we can use it as a limit
- if (baddr > address && baddr < nextAddr) {
- nextAddr = baddr;
- nextRange = blen;
- }
-
- // As blocks are always sorted, if the starting address of this block is higher
- // than the address we are looking for, break loop now - We wont find the value
- // associated to the address
- if (baddr > address) break;
-
- // Jump to the next block
- i += 3 + blen;
- }
- }
-
- // If reached here, we will return the next valid address
- return nextAddr | (nextRange << 16);
-}
-
-static bool ee_IsPageClean(int page) {
- uint32_t *pflash = (uint32_t*) getFlashStorage(page);
- for (uint16_t i = 0; i < (PageSize >> 2); ++i)
- if (*pflash++ != 0xFFFFFFFF) return false;
- return true;
-}
-
-static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData=0xFF) {
-
- // Check if RAM buffer has something to be written
- bool isEmpty = true;
- uint32_t *p = (uint32_t*) &buffer[0];
- for (uint16_t j = 0; j < (PageSize >> 2); j++) {
- if (*p++ != 0xFFFFFFFF) {
- isEmpty = false;
- break;
- }
- }
-
- // If something has to be written, do so!
- if (!isEmpty) {
-
- // Write the current ram buffer into FLASH
- ee_PageWrite(curPage + curGroup * PagesPerGroup, buffer);
-
- // Clear the RAM buffer
- memset(buffer, 0xFF, sizeof(buffer));
-
- // Increment the page to use the next time
- ++curPage;
- }
-
- // Did we reach the maximum count of available pages per group for storage ?
- if (curPage < PagesPerGroup) {
-
- // Do we have an override address ?
- if (overrideAddress < EEPROMSize) {
-
- // Yes, just store the value into the RAM buffer
- buffer[0] = overrideAddress & 0xFF;
- buffer[0 + 1] = (overrideAddress >> 8) & 0xFF;
- buffer[0 + 2] = 1;
- buffer[0 + 3] = overrideData;
- }
-
- // Done!
- return true;
- }
-
- // We have no space left on the current group - We must compact the values
- uint16_t i = 0;
-
- // Compute the next group to use
- int curwPage = 0, curwGroup = curGroup + 1;
- if (curwGroup >= GroupCount) curwGroup = 0;
-
- uint32_t rdAddr = 0;
- do {
-
- // Get the next valid range
- uint32_t addrRange = ee_GetAddrRange(rdAddr, true);
-
- // Make sure not to skip the override address, if specified
- int rdRange;
- if (overrideAddress < EEPROMSize &&
- rdAddr <= overrideAddress &&
- (addrRange & 0xFFFF) > overrideAddress) {
-
- rdAddr = overrideAddress;
- rdRange = 1;
- }
- else {
- rdAddr = addrRange & 0xFFFF;
- rdRange = addrRange >> 16;
- }
-
- // If no range, break loop
- if (rdRange == 0)
- break;
-
- do {
-
- // Get the value
- uint8_t rdValue = overrideAddress == rdAddr ? overrideData : ee_Read(rdAddr, true);
-
- // Do not bother storing default values
- if (rdValue != 0xFF) {
-
- // If we have room, add it to the buffer
- if (buffer[i + 2] == 0xFF) {
-
- // Uninitialized buffer, just add it!
- buffer[i] = rdAddr & 0xFF;
- buffer[i + 1] = (rdAddr >> 8) & 0xFF;
- buffer[i + 2] = 1;
- buffer[i + 3] = rdValue;
-
- }
- else {
- // Buffer already has contents. Check if we can extend it
-
- // Get the address of the block
- uint32_t baddr = buffer[i] | (buffer[i + 1] << 8);
-
- // Get the length of the block
- uint32_t blen = buffer[i + 2];
-
- // Can we expand it ?
- if (rdAddr == (baddr + blen) &&
- i < (PageSize - 4) && /* This block has a chance to contain data AND */
- buffer[i + 2] < (PageSize - i - 3)) {/* There is room for this block to be expanded */
-
- // Yes, do it
- ++buffer[i + 2];
-
- // And store the value
- buffer[i + 3 + rdAddr - baddr] = rdValue;
-
- }
- else {
-
- // No, we can't expand it - Skip the existing block
- i += 3 + blen;
-
- // Can we create a new slot ?
- if (i > (PageSize - 4)) {
-
- // Not enough space - Write the current buffer to FLASH
- ee_PageWrite(curwPage + curwGroup * PagesPerGroup, buffer);
-
- // Advance write page (as we are compacting, should never overflow!)
- ++curwPage;
-
- // Clear RAM buffer
- memset(buffer, 0xFF, sizeof(buffer));
-
- // Start fresh */
- i = 0;
- }
-
- // Enough space, add the new block
- buffer[i] = rdAddr & 0xFF;
- buffer[i + 1] = (rdAddr >> 8) & 0xFF;
- buffer[i + 2] = 1;
- buffer[i + 3] = rdValue;
- }
- }
- }
-
- // Go to the next address
- ++rdAddr;
-
- // Repeat for bytes of this range
- } while (--rdRange);
-
- // Repeat until we run out of ranges
- } while (rdAddr < EEPROMSize);
-
- // We must erase the previous group, in preparation for the next swap
- for (int page = 0; page < curPage; page++) {
- ee_PageErase(page + curGroup * PagesPerGroup);
- }
-
- // Finally, Now the active group is the created new group
- curGroup = curwGroup;
- curPage = curwPage;
-
- // Done!
- return true;
-}
-
-static bool ee_Write(uint32_t address, uint8_t data) {
-
- // If we were requested an address outside of the emulated range, fail now
- if (address >= EEPROMSize) return false;
-
- // Lets check if we have a block with that data previously defined. Block
- // start addresses are always sorted in ascending order
- uint16_t i = 0;
- while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
-
- // Get the address of the block
- uint32_t baddr = buffer[i] | (buffer[i + 1] << 8);
-
- // Get the length of the block
- uint32_t blen = buffer[i + 2];
-
- // If we reach the end of the list, break loop
- if (blen == 0xFF)
- break;
-
- // Check if data is contained in this block
- if (address >= baddr &&
- address < (baddr + blen)) {
-
- // Yes, it is contained. Just modify it
- buffer[i + 3 + address - baddr] = data;
-
- // Done!
- return true;
- }
-
- // Maybe we could add it to the front or to the back
- // of this block ?
- if ((address + 1) == baddr || address == (baddr + blen)) {
-
- // Potentially, it could be done. But we must ensure there is room
- // so we can expand the block. Lets find how much free space remains
- uint32_t iend = i;
- do {
- uint32_t ln = buffer[iend + 2];
- if (ln == 0xFF) break;
- iend += 3 + ln;
- } while (iend <= (PageSize - 4)); /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
-
- // Here, inxt points to the first free address in the buffer. Do we have room ?
- if (iend < PageSize) {
- // Yes, at least a byte is free - We can expand the block
-
- // Do we have to insert at the beginning ?
- if ((address + 1) == baddr) {
-
- // Insert at the beginning
-
- // Make room at the beginning for our byte
- memmove(&buffer[i + 3 + 1], &buffer[i + 3], iend - i - 3);
-
- // Adjust the header and store the data
- buffer[i] = address & 0xFF;
- buffer[i + 1] = (address >> 8) & 0xFF;
- buffer[i + 2]++;
- buffer[i + 3] = data;
-
- }
- else {
-
- // Insert at the end - There is a very interesting thing that could happen here:
- // Maybe we could coalesce the next block with this block. Let's try to do it!
- uint16_t inext = i + 3 + blen;
- if (inext <= (PageSize - 4) &&
- (buffer[inext] | uint16_t(buffer[inext + 1] << 8)) == (baddr + blen + 1)) {
- // YES! ... we can coalesce blocks! . Do it!
-
- // Adjust this block header to include the next one
- buffer[i + 2] += buffer[inext + 2] + 1;
-
- // Store data at the right place
- buffer[i + 3 + blen] = data;
-
- // Remove the next block header and append its data
- memmove(&buffer[inext + 1], &buffer[inext + 3], iend - inext - 3);
-
- // Finally, as we have saved 2 bytes at the end, make sure to clean them
- buffer[iend - 2] = 0xFF;
- buffer[iend - 1] = 0xFF;
-
- }
- else {
- // NO ... No coalescing possible yet
-
- // Make room at the end for our byte
- memmove(&buffer[i + 3 + blen + 1], &buffer[i + 3 + blen], iend - i - 3 - blen);
-
- // And add the data to the block
- buffer[i + 2]++;
- buffer[i + 3 + blen] = data;
- }
- }
-
- // Done!
- return true;
- }
- }
-
- // As blocks are always sorted, if the starting address of this block is higher
- // than the address we are looking for, break loop now - We wont find the value
- // associated to the address
- if (baddr > address) break;
-
- // Jump to the next block
- i += 3 + blen;
- }
-
- // Value is not stored AND we can't expand previous block to contain it. We must create a new block
-
- // First, lets find how much free space remains
- uint32_t iend = i;
- while (iend <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
- uint32_t ln = buffer[iend + 2];
- if (ln == 0xFF) break;
- iend += 3 + ln;
- }
-
- // If there is room for a new block, insert it at the proper place
- if (iend <= (PageSize - 4)) {
-
- // We have room to create a new block. Do so --- But add
- // the block at the proper position, sorted by starting
- // address, so it will be possible to compact it with other blocks.
-
- // Make space
- memmove(&buffer[i + 4], &buffer[i], iend - i);
-
- // And add the block
- buffer[i] = address & 0xFF;
- buffer[i + 1] = (address >> 8) & 0xFF;
- buffer[i + 2] = 1;
- buffer[i + 3] = data;
-
- // Done!
- return true;
- }
-
- // Not enough room to store this information on this FLASH page - Perform a
- // flush and override the address with the specified contents
- return ee_Flush(address, data);
-}
-
-static void ee_Init() {
-
- // Just init once!
- if (curGroup != 0xFF) return;
-
- // Clean up the SRAM buffer
- memset(buffer, 0xFF, sizeof(buffer));
-
- // Now, we must find out the group where settings are stored
- for (curGroup = 0; curGroup < GroupCount; curGroup++)
- if (!ee_IsPageClean(curGroup * PagesPerGroup)) break;
-
- // If all groups seem to be used, default to first group
- if (curGroup >= GroupCount) curGroup = 0;
-
- DEBUG_ECHO_MSG("EEPROM Current Group: ",curGroup);
- DEBUG_FLUSH();
-
- // Now, validate that all the other group pages are empty
- for (int grp = 0; grp < GroupCount; grp++) {
- if (grp == curGroup) continue;
-
- for (int page = 0; page < PagesPerGroup; page++) {
- if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
- DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on group ", grp);
- DEBUG_FLUSH();
- ee_PageErase(grp * PagesPerGroup + page);
- }
- }
- }
-
- // Finally, for the active group, determine the first unused page
- // and also validate that all the other ones are clean
- for (curPage = 0; curPage < PagesPerGroup; curPage++) {
- if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) {
- ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage));
- break;
- }
- }
-
- DEBUG_ECHO_MSG("EEPROM Active page: ", curPage);
- DEBUG_FLUSH();
-
- // Make sure the pages following the first clean one are also clean
- for (int page = curPage + 1; page < PagesPerGroup; page++) {
- if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
- DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on active group ", curGroup);
- DEBUG_FLUSH();
- ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
- ee_PageErase(curGroup * PagesPerGroup + page);
- }
- }
-}
-
-/* PersistentStore -----------------------------------------------------------*/
-
-#include "../shared/eeprom_api.h"
-
-#ifndef MARLIN_EEPROM_SIZE
- #define MARLIN_EEPROM_SIZE 0x1000 // 4KB
-#endif
-size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
-bool PersistentStore::access_start() { ee_Init(); return true; }
-bool PersistentStore::access_finish() { ee_Flush(); return true; }
-
-bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
- uint16_t written = 0;
- while (size--) {
- uint8_t * const p = (uint8_t * const)pos;
- uint8_t v = *value;
- if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
- ee_Write(uint32_t(p), v);
- if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
- if (ee_Read(uint32_t(p)) != v) {
- SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
- return true;
- }
- }
- crc16(crc, &v, 1);
- pos++;
- value++;
- }
- return false;
-}
-
-bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
- do {
- uint8_t c = ee_Read(uint32_t(pos));
- if (writing) *value = c;
- crc16(crc, &c, 1);
- pos++;
- value++;
- } while (--size);
- return false;
-}
-
-#endif // FLASH_EEPROM_EMULATION
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp
deleted file mode 100644
index 557a2f2cffa5..000000000000
--- a/Marlin/src/HAL/DUE/eeprom_wired.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- *
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
- * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
- *
- * 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 .
- *
- */
-#ifdef ARDUINO_ARCH_SAM
-
-#include "../../inc/MarlinConfig.h"
-
-#if USE_WIRED_EEPROM
-
-/**
- * PersistentStore for Arduino-style EEPROM interface
- * with simple implementations supplied by Marlin.
- */
-
-#include "../shared/eeprom_if.h"
-#include "../shared/eeprom_api.h"
-
-#ifndef MARLIN_EEPROM_SIZE
- #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
-#endif
-size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
-bool PersistentStore::access_start() { eeprom_init(); return true; }
-bool PersistentStore::access_finish() { return true; }
-
-bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
- uint16_t written = 0;
- while (size--) {
- uint8_t * const p = (uint8_t * const)pos;
- uint8_t v = *value;
- if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
- eeprom_write_byte(p, v);
- if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
- if (eeprom_read_byte(p) != v) {
- SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
- return true;
- }
- }
- crc16(crc, &v, 1);
- pos++;
- value++;
- }
- return false;
-}
-
-bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
- do {
- uint8_t c = eeprom_read_byte((uint8_t*)pos);
- if (writing) *value = c;
- crc16(crc, &c, 1);
- pos++;
- value++;
- } while (--size);
- return false;
-}
-
-#endif // USE_WIRED_EEPROM
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/endstop_interrupts.h b/Marlin/src/HAL/DUE/endstop_interrupts.h
deleted file mode 100644
index c1bbcb121bdc..000000000000
--- a/Marlin/src/HAL/DUE/endstop_interrupts.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Endstop Interrupts
- *
- * Without endstop interrupts the endstop pins must be polled continually in
- * the temperature-ISR via endstops.update(), most of the time finding no change.
- * With this feature endstops.update() is called only when we know that at
- * least one endstop has changed state, saving valuable CPU cycles.
- *
- * This feature only works when all used endstop pins can generate an 'external interrupt'.
- *
- * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'.
- * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino)
- */
-
-#include "../../module/endstops.h"
-
-// One ISR for all EXT-Interrupts
-void endstop_ISR() { endstops.update(); }
-
-/**
- * Endstop interrupts for Due based targets.
- * On Due, all pins support external interrupt capability.
- */
-
-void setup_endstop_interrupts() {
- #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
- TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
- TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
- TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
- TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
- TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
- TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
- TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
- TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
- TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
- TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
- TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
- TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
- TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
- TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
- TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
- TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
- TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
- TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
- TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
- TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
- TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
- TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
- TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
- TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
- TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
- TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
- TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
- TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
- TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
-}
diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h
deleted file mode 100644
index a609210d8130..000000000000
--- a/Marlin/src/HAL/DUE/fastio.h
+++ /dev/null
@@ -1,565 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Fast I/O Routines for SAM3X8E
- * Use direct port manipulation to save scads of processor time.
- * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al.
- */
-
-/**
- * Description: Fast IO functions for Arduino Due and compatible (SAM3X8E)
- *
- * For ARDUINO_ARCH_SAM
- * Note the code here was specifically crafted by disassembling what GCC produces
- * out of it, so GCC is able to optimize it out as much as possible to the least
- * amount of instructions. Be very careful if you modify them, as "clean code"
- * leads to less efficient compiled code!!
- */
-
-#include
-
-#include "../../inc/MarlinConfigPre.h"
-
-/**
- * Utility functions
- */
-
-// Due has 12 PWMs assigned to logical pins 2-13.
-// 6, 7, 8 & 9 come from the PWM controller. The others come from the timers.
-#define PWM_PIN(P) WITHIN(P, 2, 13)
-
-#ifndef MASK
- #define MASK(PIN) _BV(PIN)
-#endif
-
-/**
- * Magic I/O routines
- *
- * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW);
- *
- * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
- */
-
-// Read a pin
-#define _READ(IO) bool(DIO ## IO ## _WPORT -> PIO_PDSR & MASK(DIO ## IO ## _PIN))
-
-// Write to a pin
-#define _WRITE(IO,V) do { \
- volatile Pio* port = (DIO ## IO ## _WPORT); \
- const uint32_t mask = MASK(DIO ## IO ## _PIN); \
- if (V) port->PIO_SODR = mask; \
- else port->PIO_CODR = mask; \
-}while(0)
-
-// Toggle a pin
-#define _TOGGLE(IO) _WRITE(IO, !READ(IO))
-
-#if MB(PRINTRBOARD_G2)
-
- #include "fastio/G2_pins.h"
-
- // Set pin as input
- #define _SET_INPUT(IO) do{ \
- pmc_enable_periph_clk(G2_g_APinDescription[IO].ulPeripheralId); \
- PIO_Configure((DIO ## IO ## _WPORT), PIO_INPUT, MASK(DIO ## IO ## _PIN), 0); \
- }while(0)
-
- // Set pin as output
- #define _SET_OUTPUT(IO) do{ \
- uint32_t mask = MASK(G2_g_APinDescription[IO].ulPeripheralId); \
- if ((PMC->PMC_PCSR0 & mask) != (mask)) PMC->PMC_PCER0 = mask; \
- volatile Pio* port = (DIO ## IO ## _WPORT); \
- mask = MASK(DIO ## IO ## _PIN); \
- if (_READ(IO)) port->PIO_SODR = mask; \
- else port->PIO_CODR = mask; \
- port->PIO_IDR = mask; \
- const uint32_t pin_config = G2_g_APinDescription[IO].ulPinConfiguration; \
- if (pin_config & PIO_PULLUP) port->PIO_PUER = mask; \
- else port->PIO_PUDR = mask; \
- if (pin_config & PIO_OPENDRAIN) port->PIO_MDER = mask; \
- else port->PIO_MDDR = mask; \
- port->PIO_PER = mask; \
- port->PIO_OER = mask; \
- g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \
- }while(0)
-
- /**
- * Set pin as output with comments
- * #define _SET_OUTPUT(IO) do{ \
- * uint32_t mask = MASK(G2_g_APinDescription[IO].ulPeripheralId); \
- * if ((PMC->PMC_PCSR0 & mask ) != (mask)) PMC->PMC_PCER0 = mask; \ // enable PIO clock if not already enabled
- *
- * volatile Pio* port = (DIO ## IO ## _WPORT); \
- * const uint32_t mask = MASK(DIO ## IO ## _PIN); \
- * if (_READ(IO)) port->PIO_SODR = mask; \ // set output to match input BEFORE setting direction or will glitch the output
- * else port->PIO_CODR = mask; \
- *
- * port->PIO_IDR = mask; \ // disable interrupt
- *
- * uint32_t pin_config = G2_g_APinDescription[IO].ulPinConfiguration; \
- * if (pin_config & PIO_PULLUP) pPio->PIO_PUER = mask; \ // enable pullup if necessary
- * else pPio->PIO_PUDR = mask; \
- *
- * if (pin_config & PIO_OPENDRAIN) port->PIO_MDER = mask; \ // Enable multi-drive if necessary
- * else port->PIO_MDDR = mask; \
- *
- * port->PIO_PER = mask; \
- * port->PIO_OER = mask; \ // set to output
- *
- * g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \
- * }while(0)
- */
-
-#else
-
- // Set pin as input
- #define _SET_INPUT(IO) do{ \
- pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \
- PIO_Configure(digitalPinToPort(IO), PIO_INPUT, digitalPinToBitMask(IO), 0); \
- }while(0)
-
- // Set pin as output
- #define _SET_OUTPUT(IO) do{ \
- pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \
- PIO_Configure(digitalPinToPort(IO), _READ(IO) ? PIO_OUTPUT_1 : PIO_OUTPUT_0, digitalPinToBitMask(IO), g_APinDescription[IO].ulPinConfiguration); \
- g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \
- }while(0)
-#endif
-
-// Set pin as input with pullup mode
-#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT)
-
-// Read a pin (wrapper)
-#define READ(IO) _READ(IO)
-
-// Write to a pin (wrapper)
-#define WRITE(IO,V) _WRITE(IO,V)
-
-// Toggle a pin (wrapper)
-#define TOGGLE(IO) _TOGGLE(IO)
-
-// Set pin as input (wrapper)
-#define SET_INPUT(IO) _SET_INPUT(IO)
-// Set pin as input with pullup (wrapper)
-#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
-// Set pin as input with pulldown (substitution)
-#define SET_INPUT_PULLDOWN SET_INPUT
-
-// Set pin as output (wrapper) - reads the pin and sets the output to that value
-#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
-// Set pin as PWM
-#define SET_PWM SET_OUTPUT
-
-// Check if pin is an input
-#define IS_INPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) == 0)
-// Check if pin is an output
-#define IS_OUTPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) != 0)
-
-// Shorthand
-#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0)
-
-// digitalRead/Write wrappers
-#define extDigitalRead(IO) digitalRead(IO)
-#define extDigitalWrite(IO,V) digitalWrite(IO,V)
-
-/**
- * Ports and functions
- * Added as necessary or if I feel like it- not a comprehensive list!
- */
-
-// UART
-#define RXD DIO0
-#define TXD DIO1
-
-// TWI (I2C)
-#define SCL DIO21
-#define SDA DIO20
-
-/**
- * pins
- */
-
-#define DIO0_PIN 8
-#define DIO0_WPORT PIOA
-
-#define DIO1_PIN 9
-#define DIO1_WPORT PIOA
-
-#define DIO2_PIN 25
-#define DIO2_WPORT PIOB
-
-#define DIO3_PIN 28
-#define DIO3_WPORT PIOC
-
-#define DIO4_PIN 26
-#define DIO4_WPORT PIOC
-
-#define DIO5_PIN 25
-#define DIO5_WPORT PIOC
-
-#define DIO6_PIN 24
-#define DIO6_WPORT PIOC
-
-#define DIO7_PIN 23
-#define DIO7_WPORT PIOC
-
-#define DIO8_PIN 22
-#define DIO8_WPORT PIOC
-
-#define DIO9_PIN 21
-#define DIO9_WPORT PIOC
-
-#define DIO10_PIN 29
-#define DIO10_WPORT PIOC
-
-#define DIO11_PIN 7
-#define DIO11_WPORT PIOD
-
-#define DIO12_PIN 8
-#define DIO12_WPORT PIOD
-
-#define DIO13_PIN 27
-#define DIO13_WPORT PIOB
-
-#define DIO14_PIN 4
-#define DIO14_WPORT PIOD
-
-#define DIO15_PIN 5
-#define DIO15_WPORT PIOD
-
-#define DIO16_PIN 13
-#define DIO16_WPORT PIOA
-
-#define DIO17_PIN 12
-#define DIO17_WPORT PIOA
-
-#define DIO18_PIN 11
-#define DIO18_WPORT PIOA
-
-#define DIO19_PIN 10
-#define DIO19_WPORT PIOA
-
-#define DIO20_PIN 12
-#define DIO20_WPORT PIOB
-
-#define DIO21_PIN 13
-#define DIO21_WPORT PIOB
-
-#define DIO22_PIN 26
-#define DIO22_WPORT PIOB
-
-#define DIO23_PIN 14
-#define DIO23_WPORT PIOA
-
-#define DIO24_PIN 15
-#define DIO24_WPORT PIOA
-
-#define DIO25_PIN 0
-#define DIO25_WPORT PIOD
-
-#define DIO26_PIN 1
-#define DIO26_WPORT PIOD
-
-#define DIO27_PIN 2
-#define DIO27_WPORT PIOD
-
-#define DIO28_PIN 3
-#define DIO28_WPORT PIOD
-
-#define DIO29_PIN 6
-#define DIO29_WPORT PIOD
-
-#define DIO30_PIN 9
-#define DIO30_WPORT PIOD
-
-#define DIO31_PIN 7
-#define DIO31_WPORT PIOA
-
-#define DIO32_PIN 10
-#define DIO32_WPORT PIOD
-
-#define DIO33_PIN 1
-#define DIO33_WPORT PIOC
-
-#if !MB(PRINTRBOARD_G2) // normal DUE pin mapping
-
- #define DIO34_PIN 2
- #define DIO34_WPORT PIOC
-
- #define DIO35_PIN 3
- #define DIO35_WPORT PIOC
-
- #define DIO36_PIN 4
- #define DIO36_WPORT PIOC
-
- #define DIO37_PIN 5
- #define DIO37_WPORT PIOC
-
- #define DIO38_PIN 6
- #define DIO38_WPORT PIOC
-
- #define DIO39_PIN 7
- #define DIO39_WPORT PIOC
-
- #define DIO40_PIN 8
- #define DIO40_WPORT PIOC
-
- #define DIO41_PIN 9
- #define DIO41_WPORT PIOC
-
-#endif // !PRINTRBOARD_G2
-
-#define DIO42_PIN 19
-#define DIO42_WPORT PIOA
-
-#define DIO43_PIN 20
-#define DIO43_WPORT PIOA
-
-#define DIO44_PIN 19
-#define DIO44_WPORT PIOC
-
-#define DIO45_PIN 18
-#define DIO45_WPORT PIOC
-
-#define DIO46_PIN 17
-#define DIO46_WPORT PIOC
-
-#define DIO47_PIN 16
-#define DIO47_WPORT PIOC
-
-#define DIO48_PIN 15
-#define DIO48_WPORT PIOC
-
-#define DIO49_PIN 14
-#define DIO49_WPORT PIOC
-
-#define DIO50_PIN 13
-#define DIO50_WPORT PIOC
-
-#define DIO51_PIN 12
-#define DIO51_WPORT PIOC
-
-#define DIO52_PIN 21
-#define DIO52_WPORT PIOB
-
-#define DIO53_PIN 14
-#define DIO53_WPORT PIOB
-
-#define DIO54_PIN 16
-#define DIO54_WPORT PIOA
-
-#define DIO55_PIN 24
-#define DIO55_WPORT PIOA
-
-#define DIO56_PIN 23
-#define DIO56_WPORT PIOA
-
-#define DIO57_PIN 22
-#define DIO57_WPORT PIOA
-
-#define DIO58_PIN 6
-#define DIO58_WPORT PIOA
-
-#define DIO59_PIN 4
-#define DIO59_WPORT PIOA
-
-#define DIO60_PIN 3
-#define DIO60_WPORT PIOA
-
-#define DIO61_PIN 2
-#define DIO61_WPORT PIOA
-
-#define DIO62_PIN 17
-#define DIO62_WPORT PIOB
-
-#define DIO63_PIN 18
-#define DIO63_WPORT PIOB
-
-#define DIO64_PIN 19
-#define DIO64_WPORT PIOB
-
-#define DIO65_PIN 20
-#define DIO65_WPORT PIOB
-
-#define DIO66_PIN 15
-#define DIO66_WPORT PIOB
-
-#define DIO67_PIN 16
-#define DIO67_WPORT PIOB
-
-#define DIO68_PIN 1
-#define DIO68_WPORT PIOA
-
-#define DIO69_PIN 0
-#define DIO69_WPORT PIOA
-
-#define DIO70_PIN 17
-#define DIO70_WPORT PIOA
-
-#define DIO71_PIN 18
-#define DIO71_WPORT PIOA
-
-#define DIO72_PIN 30
-#define DIO72_WPORT PIOC
-
-#define DIO73_PIN 21
-#define DIO73_WPORT PIOA
-
-#define DIO74_PIN 25
-#define DIO74_WPORT PIOA
-
-#define DIO75_PIN 26
-#define DIO75_WPORT PIOA
-
-#define DIO76_PIN 27
-#define DIO76_WPORT PIOA
-
-#define DIO77_PIN 28
-#define DIO77_WPORT PIOA
-
-#define DIO78_PIN 23
-#define DIO78_WPORT PIOB
-
-#define DIO79_PIN 17
-#define DIO79_WPORT PIOA
-
-#define DIO80_PIN 12
-#define DIO80_WPORT PIOB
-
-#define DIO81_PIN 8
-#define DIO81_WPORT PIOA
-
-#define DIO82_PIN 11
-#define DIO82_WPORT PIOA
-
-#define DIO83_PIN 13
-#define DIO83_WPORT PIOA
-
-#define DIO84_PIN 4
-#define DIO84_WPORT PIOD
-
-#define DIO85_PIN 11
-#define DIO85_WPORT PIOB
-
-#define DIO86_PIN 21
-#define DIO86_WPORT PIOB
-
-#define DIO87_PIN 29
-#define DIO87_WPORT PIOA
-
-#define DIO88_PIN 15
-#define DIO88_WPORT PIOB
-
-#define DIO89_PIN 14
-#define DIO89_WPORT PIOB
-
-#define DIO90_PIN 1
-#define DIO90_WPORT PIOA
-
-#define DIO91_PIN 15
-#define DIO91_WPORT PIOB
-
-#ifdef ARDUINO_SAM_ARCHIM
-
- #define DIO92_PIN 11
- #define DIO92_WPORT PIOC
-
- #define DIO93_PIN 2
- #define DIO93_WPORT PIOB
-
- #define DIO94_PIN 1
- #define DIO94_WPORT PIOB
-
- #define DIO95_PIN 0
- #define DIO95_WPORT PIOB
-
- #define DIO96_PIN 10
- #define DIO96_WPORT PIOC
-
- #define DIO97_PIN 24
- #define DIO97_WPORT PIOB
-
- #define DIO98_PIN 7
- #define DIO98_WPORT PIOB
-
- #define DIO99_PIN 6
- #define DIO99_WPORT PIOB
-
- #define DIO100_PIN 8
- #define DIO100_WPORT PIOB
-
- #define DIO101_PIN 5
- #define DIO101_WPORT PIOB
-
- #define DIO102_PIN 4
- #define DIO102_WPORT PIOB
-
- #define DIO103_PIN 3
- #define DIO103_WPORT PIOB
-
- #define DIO104_PIN 20
- #define DIO104_WPORT PIOC
-
- #define DIO105_PIN 22
- #define DIO105_WPORT PIOB
-
- #define DIO106_PIN 27
- #define DIO106_WPORT PIOC
-
- #define DIO107_PIN 10
- #define DIO107_WPORT PIOB
-
- #define DIO108_PIN 9
- #define DIO108_WPORT PIOB
-
-#else // !ARDUINO_SAM_ARCHIM
-
- #define DIO92_PIN 5
- #define DIO92_WPORT PIOA
-
- #define DIO93_PIN 12
- #define DIO93_WPORT PIOB
-
- #define DIO94_PIN 22
- #define DIO94_WPORT PIOB
-
- #define DIO95_PIN 23
- #define DIO95_WPORT PIOB
-
- #define DIO96_PIN 24
- #define DIO96_WPORT PIOB
-
- #define DIO97_PIN 20
- #define DIO97_WPORT PIOC
-
- #define DIO98_PIN 27
- #define DIO98_WPORT PIOC
-
- #define DIO99_PIN 10
- #define DIO99_WPORT PIOC
-
- #define DIO100_PIN 11
- #define DIO100_WPORT PIOC
-
-#endif // !ARDUINO_SAM_ARCHIM
diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp
deleted file mode 100644
index 800915ff692b..000000000000
--- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * The PWM module is only used to generate interrupts at specified times. It
- * is NOT used to directly toggle pins. The ISR writes to the pin assigned to
- * that interrupt.
- *
- * All PWMs use the same repetition rate. The G2 needs about 10kHz min in order to
- * not have obvious ripple on the Vref signals.
- *
- * The data structures are setup to minimize the computation done by the ISR which
- * minimizes ISR execution time. Execution times are 0.8 to 1.1 microseconds.
- *
- * FIve PWM interrupt sources are used. Channel 0 sets the base period. All Vref
- * signals are set active when this counter overflows and resets to zero. The compare
- * values in channels 1-4 are set to give the desired duty cycle for that Vref pin.
- * When counter 0 matches the compare value then that channel generates an interrupt.
- * The ISR checks the source of the interrupt and sets the corresponding pin inactive.
- *
- * Some jitter in the Vref signal is OK so the interrupt priority is left at its default value.
- */
-
-#include "../../../inc/MarlinConfig.h"
-
-#if MB(PRINTRBOARD_G2)
-
-#include "G2_PWM.h"
-
-#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
- #define G2_PWM_X 1
-#else
- #define G2_PWM_X 0
-#endif
-#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y)
- #define G2_PWM_Y 1
-#else
- #define G2_PWM_Y 0
-#endif
-#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
- #define G2_PWM_Z 1
-#else
- #define G2_PWM_Z 0
-#endif
-#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
- #define G2_PWM_E 1
-#else
- #define G2_PWM_E 0
-#endif
-#define G2_MASK_X(V) (G2_PWM_X * (V))
-#define G2_MASK_Y(V) (G2_PWM_Y * (V))
-#define G2_MASK_Z(V) (G2_PWM_Z * (V))
-#define G2_MASK_E(V) (G2_PWM_E * (V))
-
-volatile uint32_t *SODR_A = &PIOA->PIO_SODR,
- *SODR_B = &PIOB->PIO_SODR,
- *CODR_A = &PIOA->PIO_CODR,
- *CODR_B = &PIOB->PIO_CODR;
-
-PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT;
-
-void Stepper::digipot_init() {
-
- #if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
- OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins
- #endif
- #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y)
- OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0);
- #endif
- #if G2_PWM_Z
- OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0);
- #endif
- #if G2_PWM_E
- OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0);
- #endif
-
- #define WPKEY (0x50574D << 8) // “PWM” in ASCII
- #define WPCMD_DIS_SW 0 // command to disable Write Protect SW
- #define WPRG_ALL (PWM_WPCR_WPRG0 | PWM_WPCR_WPRG1 | PWM_WPCR_WPRG2 | PWM_WPCR_WPRG3 | PWM_WPCR_WPRG4 | PWM_WPCR_WPRG5) // all Write Protect Groups
-
- #define PWM_CLOCK_F F_CPU / 1000000UL // set clock to 1MHz
-
- PMC->PMC_PCER1 = PMC_PCER1_PID36; // enable PWM controller clock (disabled on power up)
-
- PWM->PWM_WPCR = WPKEY | WPRG_ALL | WPCMD_DIS_SW; // enable setting of all PWM registers
- PWM->PWM_CLK = PWM_CLOCK_F; // enable CLK_A and set it to 1MHz, leave CLK_B disabled
- PWM->PWM_CH_NUM[0].PWM_CMR = 0b1011; // set channel 0 to Clock A input & to left aligned
- if (G2_PWM_X) PWM->PWM_CH_NUM[1].PWM_CMR = 0b1011; // set channel 1 to Clock A input & to left aligned
- if (G2_PWM_Y) PWM->PWM_CH_NUM[2].PWM_CMR = 0b1011; // set channel 2 to Clock A input & to left aligned
- if (G2_PWM_Z) PWM->PWM_CH_NUM[3].PWM_CMR = 0b1011; // set channel 3 to Clock A input & to left aligned
- if (G2_PWM_E) PWM->PWM_CH_NUM[4].PWM_CMR = 0b1011; // set channel 4 to Clock A input & to left aligned
-
- PWM->PWM_CH_NUM[0].PWM_CPRD = PWM_PERIOD_US; // set channel 0 Period
-
- PWM->PWM_IER2 = PWM_IER1_CHID0; // generate interrupt when counter0 overflows
- PWM->PWM_IER2 = PWM_IER2_CMPM0
- | G2_MASK_X(PWM_IER2_CMPM1)
- | G2_MASK_Y(PWM_IER2_CMPM2)
- | G2_MASK_Z(PWM_IER2_CMPM3)
- | G2_MASK_E(PWM_IER2_CMPM4)
- ; // generate interrupt on compare event
-
- if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[0])); // interrupt when counter0 == CMPV - used to set Motor 1 PWM inactive
- if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[0])); // interrupt when counter0 == CMPV - used to set Motor 2 PWM inactive
- if (G2_PWM_Z) PWM->PWM_CMP[3].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[1])); // interrupt when counter0 == CMPV - used to set Motor 3 PWM inactive
- if (G2_PWM_E) PWM->PWM_CMP[4].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[2])); // interrupt when counter0 == CMPV - used to set Motor 4 PWM inactive
-
- if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPM = 0x0001; // enable compare event
- if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPM = 0x0001; // enable compare event
- if (G2_PWM_Z) PWM->PWM_CMP[3].PWM_CMPM = 0x0001; // enable compare event
- if (G2_PWM_E) PWM->PWM_CMP[4].PWM_CMPM = 0x0001; // enable compare event
-
- PWM->PWM_SCM = PWM_SCM_UPDM_MODE0 | PWM_SCM_SYNC0
- | G2_MASK_X(PWM_SCM_SYNC1)
- | G2_MASK_Y(PWM_SCM_SYNC2)
- | G2_MASK_Z(PWM_SCM_SYNC3)
- | G2_MASK_E(PWM_SCM_SYNC4)
- ; // sync 1-4 with 0, use mode 0 for updates
-
- PWM->PWM_ENA = PWM_ENA_CHID0
- | G2_MASK_X(PWM_ENA_CHID1)
- | G2_MASK_Y(PWM_ENA_CHID2)
- | G2_MASK_Z(PWM_ENA_CHID3)
- | G2_MASK_E(PWM_ENA_CHID4)
- ; // enable channels used by G2
-
- PWM->PWM_IER1 = PWM_IER1_CHID0
- | G2_MASK_X(PWM_IER1_CHID1)
- | G2_MASK_Y(PWM_IER1_CHID2)
- | G2_MASK_Z(PWM_IER1_CHID3)
- | G2_MASK_E(PWM_IER1_CHID4)
- ; // enable interrupts for channels used by G2
-
- NVIC_EnableIRQ(PWM_IRQn); // Enable interrupt handler
- NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals)
-}
-
-void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) {
-
- if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed
-
- switch (driver) {
- case 0:
- if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update X & Y
- if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current));
- if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPMUPD = 0x0001; // enable compare event
- if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPMUPD = 0x0001; // enable compare event
- if (G2_PWM_X || G2_PWM_Y) PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle
- break;
- case 1:
- if (G2_PWM_Z) {
- PWM->PWM_CMP[3].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update Z
- PWM->PWM_CMP[3].PWM_CMPMUPD = 0x0001; // enable compare event
- PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle
- }
- break;
- default:
- if (G2_PWM_E) {
- PWM->PWM_CMP[4].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update E
- PWM->PWM_CMP[4].PWM_CMPMUPD = 0x0001; // enable compare event
- PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle
- }
- break;
- }
-}
-
-volatile uint32_t PWM_ISR1_STATUS, PWM_ISR2_STATUS;
-
-void PWM_Handler() {
- PWM_ISR1_STATUS = PWM->PWM_ISR1;
- PWM_ISR2_STATUS = PWM->PWM_ISR2;
- if (PWM_ISR1_STATUS & PWM_IER1_CHID0) { // CHAN_0 interrupt
- if (G2_PWM_X) *ISR_table[0].set_register = ISR_table[0].write_mask; // set X to active
- if (G2_PWM_Y) *ISR_table[1].set_register = ISR_table[1].write_mask; // set Y to active
- if (G2_PWM_Z) *ISR_table[2].set_register = ISR_table[2].write_mask; // set Z to active
- if (G2_PWM_E) *ISR_table[3].set_register = ISR_table[3].write_mask; // set E to active
- }
- else {
- if (G2_PWM_X && (PWM_ISR2_STATUS & PWM_IER2_CMPM1)) *ISR_table[0].clr_register = ISR_table[0].write_mask; // set X to inactive
- if (G2_PWM_Y && (PWM_ISR2_STATUS & PWM_IER2_CMPM2)) *ISR_table[1].clr_register = ISR_table[1].write_mask; // set Y to inactive
- if (G2_PWM_Z && (PWM_ISR2_STATUS & PWM_IER2_CMPM3)) *ISR_table[2].clr_register = ISR_table[2].write_mask; // set Z to inactive
- if (G2_PWM_E && (PWM_ISR2_STATUS & PWM_IER2_CMPM4)) *ISR_table[3].clr_register = ISR_table[3].write_mask; // set E to inactive
- }
- return;
-}
-
-#endif // PRINTRBOARD_G2
diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.h b/Marlin/src/HAL/DUE/fastio/G2_PWM.h
deleted file mode 100644
index dc4edffff851..000000000000
--- a/Marlin/src/HAL/DUE/fastio/G2_PWM.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * This module is stripped down version of the LPC1768_PWM.h file from
- * PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs.
- */
-
-#include "../../../inc/MarlinConfigPre.h"
-#include "../../../module/stepper.h"
-//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\module\stepper.h
-//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\HAL\HAL_DUE\G2_PWM.h
-
-#define PWM_PERIOD_US 100 // base repetition rate in micro seconds
-
-typedef struct { // holds the data needed by the ISR to control the Vref pin
- volatile uint32_t* set_register;
- volatile uint32_t* clr_register;
- uint32_t write_mask;
-} PWM_map;
-
-#define G2_VREF(I) (uint32_t)(I * 5 * 0.15) // desired Vref * 1000 (scaled so don't loose accuracy in next step)
-
-#define G2_VREF_COUNT(Q) (uint32_t)map(constrain(Q, 500, 3.3 * 1000), 0, 3.3 * 1000, 0, PWM_PERIOD_US) // under 500 the results are very non-linear
-
-extern volatile uint32_t *SODR_A, *SODR_B, *CODR_A, *CODR_B;
-
-#define _PIN(IO) (DIO ## IO ## _PIN)
-
-#define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) }
-
-
-#define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \
- PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \
- PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \
- PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_E_PIN, 'A'), \
- };
-
-#define NUM_PWMS 4
-
-extern PWM_map ISR_table[NUM_PWMS];
-
-extern uint32_t motor_current_setting[3];
-
-#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4)
-#define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0)
-
-#define PWM_MR0 19999 // base repetition rate minus one count - 20mS
-#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output
-#define PWM_PCLKSEL0 0x00 // select clock source for prescaler - defaults to 25MHz on power up
- // 0: 25MHz, 1: 100MHz, 2: 50MHz, 3: 12.5MHZ to PWM1 prescaler
-#define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up
-
-extern bool PWM_table_swap; // flag to tell the ISR that the tables have been swapped
-
-#define HAL_G2_PWM_ISR void PWM_Handler()
-
-extern volatile uint32_t PWM_ISR1_STATUS, PWM_ISR2_STATUS;
diff --git a/Marlin/src/HAL/DUE/fastio/G2_pins.h b/Marlin/src/HAL/DUE/fastio/G2_pins.h
deleted file mode 100644
index 80c87bd39296..000000000000
--- a/Marlin/src/HAL/DUE/fastio/G2_pins.h
+++ /dev/null
@@ -1,278 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-#include
-
-/**
- * This file contains the custom port/pin definitions for the PRINTRBOARD_G2
- * motherboard. This motherboard uses the SAM3X8C which is a subset of the
- * SAM3X8E used in the DUE board. It uses port/pin pairs that are not
- * available using the DUE definitions.
- *
- * The first part is a copy of the pin descriptions in the
- * "variants\arduino_due_x\variant.cpp" file but with pins 34-41 replaced by
- * the G2 pins.
- *
- * The second part is the FASTIO port/pin definitions.
- *
- * THESE PINS CAN ONLY BE ACCESSED VIA FASTIO COMMANDS.
- */
-
-/*
- Copyright (c) 2011 Arduino. All right reserved.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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 Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-typedef struct _G2_PinDescription {
- Pio* pPort;
- uint32_t ulPin;
- uint32_t ulPeripheralId;
- EPioType ulPinType;
- uint32_t ulPinConfiguration;
- uint32_t ulPinAttribute;
- EAnalogChannel ulAnalogChannel; /* Analog pin in the Arduino context (label on the board) */
- EAnalogChannel ulADCChannelNumber; /* ADC Channel number in the SAM device */
- EPWMChannel ulPWMChannel;
- ETCChannel ulTCChannel;
-} G2_PinDescription;
-
-/**
- * This section is a copy of the pin descriptions in the "variants\arduino_due_x\variant.cpp" file
- * with pins 34-41 replaced by the G2 pins.
- */
-
-/**
- * Pins descriptions
- */
-const G2_PinDescription G2_g_APinDescription[] = {
- // 0 .. 53 - Digital pins
- // ----------------------
- // 0/1 - UART (Serial)
- { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD
- { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD
-
- // 2
- { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0
- { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7
- { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6
-
- // 5
- { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6
- { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7
- { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6
- { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5
- { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4
- // 10
- { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7
- { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8
- { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8
-
- // 13 - AMBER LED
- { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0
-
- // 14/15 - USART3 (Serial3)
- { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3
- { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3
-
- // 16/17 - USART1 (Serial2)
- { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1
- { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1
-
- // 18/19 - USART0 (Serial1)
- { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0
- { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0
-
- // 20/21 - TWI1
- { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0
- { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0
-
- // 22
- { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22
- { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23
- { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24
- { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25
-
- // 26
- { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26
- { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27
- { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28
- { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29
-
- // 30
- { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30
- { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31
- { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32
- { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33
-
- // 34
-
- // start of custom pins
- { PIOA, PIO_PA29, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 Y_STEP_PIN
- { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 Y_DIR_PIN
- { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 Y_ENABLE_PIN
- { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 E0_ENABLE_PIN
- { PIOB, PIO_PB11, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 E0_MS1_PIN
- { PIOB, PIO_PB10, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 E0_MS3_PIN
- { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 HEATER_0_PIN
- { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 HEATER_BED_PIN
- // end of custom pins
-
- // 42
- { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42
- { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43
- { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44
- { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45
-
- // 46
- { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46
- { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47
- { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48
- { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49
-
- // 50
- { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50
- { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51
- { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52
- { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53
-
-
- // 54 .. 65 - Analog pins
- // ----------------------
- { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0
- { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1
- { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2
- { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3
- // 58
- { PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4
- { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5
- { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6
- { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7
- // 62
- { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8
- { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9
- { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10
- { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11
-
- // 66/67 - DAC0/DAC1
- { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0
- { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1
-
- // 68/69 - CANRX0/CANTX0
- { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX
- { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX
-
- // 70/71 - TWI0
- { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1
- { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1
-
- // 72/73 - LEDs
- { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL
- { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL
-
- // 74/75/76 - SPI
- { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO
- { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI
- { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK
-
- // 77 - SPI CS0
- { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0
-
- // 78 - SPI CS3 (unconnected)
- { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3
-
- // 79 .. 84 - "All pins" masks
-
- // 79 - TWI0 all pins
- { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
- // 80 - TWI1 all pins
- { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
- // 81 - UART (Serial) all pins
- { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
- // 82 - USART0 (Serial1) all pins
- { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
- // 83 - USART1 (Serial2) all pins
- { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
- // 84 - USART3 (Serial3) all pins
- { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
-
- // 85 - USB
- { PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF
-
- // 86 - SPI CS2
- { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2
-
- // 87 - SPI CS1
- { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1
-
- // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53)
- { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1
- { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1
-
- // 90 .. 91 - "All CAN pins" masks
- // 90 - CAN0 all pins
- { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
- // 91 - CAN1 all pins
- { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER },
-
- // END
- { nullptr, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }
-};
-
-// This section replaces the FASTIO definitions of pins 34-41
-
-#define DIO34_PIN 29
-#define DIO34_WPORT PIOA // only available via FASTIO // 34 PA29 - Y_STEP_PIN
-
-#define DIO35_PIN 1
-#define DIO35_WPORT PIOB // only available via FASTIO // 35 PAB1 - Y_DIR_PIN
-
-#define DIO36_PIN 0
-#define DIO36_WPORT PIOB // only available via FASTIO // 36 PB0 - Y_ENABLE_PIN
-
-#define DIO37_PIN 22
-#define DIO37_WPORT PIOB // only available via FASTIO // 37 PB22 - E0_ENABLE_PIN
-
-#define DIO38_PIN 11
-#define DIO38_WPORT PIOB // only available via FASTIO // 38 PB11 - E0_MS1_PIN
-
-#define DIO39_PIN 10
-#define DIO39_WPORT PIOB // only available via FASTIO // 39 PB10 - E0_MS3_PIN
-
-#define DIO40_PIN 5
-#define DIO40_WPORT PIOA // only available via FASTIO // 40 PA5 - HEATER_0_PIN
-
-#define DIO41_PIN 24
-#define DIO41_WPORT PIOB // only available via FASTIO // 41 PB24 - HEATER_BED_PIN
diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h
deleted file mode 100644
index 58674144470c..000000000000
--- a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-#if HAS_SPI_TFT || HAS_FSMC_TFT
- #error "Sorry! TFT displays are not available for HAL/DUE."
-#endif
diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h b/Marlin/src/HAL/DUE/inc/Conditionals_adv.h
deleted file mode 100644
index 5f1c4b16019d..000000000000
--- a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_post.h b/Marlin/src/HAL/DUE/inc/Conditionals_post.h
deleted file mode 100644
index ce6d3fdde27f..000000000000
--- a/Marlin/src/HAL/DUE/inc/Conditionals_post.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-#if USE_FALLBACK_EEPROM
- #define FLASH_EEPROM_EMULATION
-#elif EITHER(I2C_EEPROM, SPI_EEPROM)
- #define USE_SHARED_EEPROM 1
-#endif
diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h
deleted file mode 100644
index 13484f7029d1..000000000000
--- a/Marlin/src/HAL/DUE/inc/SanityCheck.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Test Arduino Due specific configuration values for errors at compile-time.
- */
-
-/**
- * Check for common serial pin conflicts
- */
-#define CHECK_SERIAL_PIN(N) ( \
- X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
- || X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
- || X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
- || X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
- || X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
- || X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
-)
-#if CONF_SERIAL_IS(0) // D0-D1. No known conflicts.
-#endif
-#if CONF_SERIAL_IS(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
- #error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
-#endif
-#if CONF_SERIAL_IS(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
- #error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
-#endif
-#if CONF_SERIAL_IS(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
- #error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
-#endif
-#undef CHECK_SERIAL_PIN
-
-/**
- * HARDWARE VS. SOFTWARE SPI COMPATIBILITY
- *
- * DUE selects hardware vs. software SPI depending on whether one of the hardware-controllable SDSS pins is in use.
- *
- * The hardware SPI controller doesn't allow software SPIs to control any shared pins.
- *
- * When DUE software SPI is used then Trinamic drivers must use the TMC softSPI.
- *
- * When DUE hardware SPI is used then a Trinamic driver can use either its hardware SPI or, if there are no shared
- * pins, its software SPI.
- *
- * Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
- * as the TMC2130 soft SPI the most common setup.
- */
-#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
-
-#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
- #if ENABLED(TMC_USE_SW_SPI)
- #if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK))
- #error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs."
- #endif
- #elif ENABLED(DUE_SOFTWARE_SPI)
- #error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix."
- #endif
-#endif
-
-#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
- #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE."
-#endif
-
-#if HAS_TMC_SW_SERIAL
- #error "TMC220x Software Serial is not supported on the DUE platform."
-#endif
-
-#if USING_PULLDOWNS
- #error "PULLDOWN pin mode is not available on DUE boards."
-#endif
diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h
deleted file mode 100644
index df1ba415e918..000000000000
--- a/Marlin/src/HAL/DUE/pinsDebug.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-
-/**
- * Support routines for Due
- */
-
-/**
- * Translation of routines & variables used by pinsDebug.h
- */
-
-#include "../shared/Marduino.h"
-
-/**
- * Due/Marlin quirks
- *
- * a) determining the state of a pin
- * The Due/Arduino status definitions for the g_pinStatus[pin] array are:
- * #define PIN_STATUS_DIGITAL_INPUT_PULLUP (0x01)
- * #define PIN_STATUS_DIGITAL_INPUT (0x02)
- * #define PIN_STATUS_DIGITAL_OUTPUT (0x03)
- * #define PIN_STATUS_ANALOG (0x04)
- * #define PIN_STATUS_PWM (0x05)
- * #define PIN_STATUS_TIMER (0x06)
- *
- * These are only valid if the following Due/Arduino provided functions are used:
- * analogRead
- * analogWrite
- * digitalWrite
- * pinMode
- *
- * The FASTIO routines do not touch the g_pinStatus[pin] array.
- *
- * The net result is that both the g_pinStatus[pin] array and the PIO_OSR register
- * needs to be looked at when determining if a pin is an input or an output.
- *
- * b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1kHz
- *
- * c) NUM_DIGITAL_PINS does not include the analog pins
- *
- * d) Pins 0-78 are defined for Due but 78 has a comment of "unconnected!". 78 is
- * included just in case.
- */
-
-#define NUMBER_PINS_TOTAL PINS_COUNT
-
-#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
-#define PRINT_PORT(p)
-#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
-#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
-#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
-#define GET_ARRAY_PIN(p) pin_array[p].pin
-#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
-#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
-#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
-#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
-#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
- ((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM))
-#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin
-
-bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
- volatile Pio* port = g_APinDescription[pin].pPort;
- uint32_t mask = g_APinDescription[pin].ulPin;
- uint8_t pin_status = g_pinStatus[pin] & 0xF;
- return ( (pin_status == 0 && (port->PIO_OSR & mask))
- || pin_status == PIN_STATUS_DIGITAL_OUTPUT
- || pwm_status(pin));
-}
-
-void pwm_details(int32_t pin) {
- if (pwm_status(pin)) {
- uint32_t chan = g_APinDescription[pin].ulPWMChannel;
- SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
- }
-}
-
-/**
- * DUE Board pin | PORT | Label
- * ----------------+--------+-------
- * 0 | PA8 | "RX0"
- * 1 | PA9 | "TX0"
- * 2 TIOA0 | PB25 |
- * 3 TIOA7 | PC28 |
- * 4 NPCS1 | PA29 |
- * TIOB6 | PC26 |
- * 5 TIOA6 | PC25 |
- * 6 PWML7 | PC24 |
- * 7 PWML6 | PC23 |
- * 8 PWML5 | PC22 |
- * 9 PWML4 | PC21 |
- * 10 NPCS0 | PA28 |
- * TIOB7 | PC29 |
- * 11 TIOA8 | PD7 |
- * 12 TIOB8 | PD8 |
- * 13 TIOB0 | PB27 | LED AMBER "L"
- * 14 TXD3 | PD4 | "TX3"
- * 15 RXD3 | PD5 | "RX3"
- * 16 TXD1 | PA13 | "TX2"
- * 17 RXD1 | PA12 | "RX2"
- * 18 TXD0 | PA11 | "TX1"
- * 19 RXD0 | PA10 | "RX1"
- * 20 | PB12 | "SDA"
- * 21 | PB13 | "SCL"
- * 22 | PB26 |
- * 23 | PA14 |
- * 24 | PA15 |
- * 25 | PD0 |
- * 26 | PD1 |
- * 27 | PD2 |
- * 28 | PD3 |
- * 29 | PD6 |
- * 30 | PD9 |
- * 31 | PA7 |
- * 32 | PD10 |
- * 33 | PC1 |
- * 34 | PC2 |
- * 35 | PC3 |
- * 36 | PC4 |
- * 37 | PC5 |
- * 38 | PC6 |
- * 39 | PC7 |
- * 40 | PC8 |
- * 41 | PC9 |
- * 42 | PA19 |
- * 43 | PA20 |
- * 44 | PC19 |
- * 45 | PC18 |
- * 46 | PC17 |
- * 47 | PC16 |
- * 48 | PC15 |
- * 49 | PC14 |
- * 50 | PC13 |
- * 51 | PC12 |
- * 52 NPCS2 | PB21 |
- * 53 | PB14 |
- * 54 | PA16 | "A0"
- * 55 | PA24 | "A1"
- * 56 | PA23 | "A2"
- * 57 | PA22 | "A3"
- * 58 TIOB2 | PA6 | "A4"
- * 69 | PA4 | "A5"
- * 60 TIOB1 | PA3 | "A6"
- * 61 TIOA1 | PA2 | "A7"
- * 62 | PB17 | "A8"
- * 63 | PB18 | "A9"
- * 64 | PB19 | "A10"
- * 65 | PB20 | "A11"
- * 66 | PB15 | "DAC0"
- * 67 | PB16 | "DAC1"
- * 68 | PA1 | "CANRX"
- * 69 | PA0 | "CANTX"
- * 70 | PA17 | "SDA1"
- * 71 | PA18 | "SCL1"
- * 72 | PC30 | LED AMBER "RX"
- * 73 | PA21 | LED AMBER "TX"
- * 74 MISO | PA25 |
- * 75 MOSI | PA26 |
- * 76 SCLK | PA27 |
- * 77 NPCS0 | PA28 |
- * 78 NPCS3 | PB23 | unconnected!
- *
- * USB pin | PORT
- * ----------------+--------
- * ID | PB11
- * VBOF | PB10
- */
diff --git a/Marlin/src/HAL/DUE/spi_pins.h b/Marlin/src/HAL/DUE/spi_pins.h
deleted file mode 100644
index cec22c2c374a..000000000000
--- a/Marlin/src/HAL/DUE/spi_pins.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 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 .
- *
- */
-#pragma once
-
-/**
- * Define SPI Pins: SCK, MISO, MOSI, SS
- *
- * Available chip select pins for HW SPI are 4 10 52 77
- */
-#if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87
- #if SDSS == 4
- #define SPI_PIN 87
- #define SPI_CHAN 1
- #elif SDSS == 10
- #define SPI_PIN 77
- #define SPI_CHAN 0
- #elif SDSS == 52
- #define SPI_PIN 86
- #define SPI_CHAN 2
- #elif SDSS == 77
- #define SPI_PIN 77
- #define SPI_CHAN 0
- #else
- #define SPI_PIN 87
- #define SPI_CHAN 1
- #endif
- #define SD_SCK_PIN 76
- #define SD_MISO_PIN 74
- #define SD_MOSI_PIN 75
-#else
- // defaults
- #define DUE_SOFTWARE_SPI
- #ifndef SD_SCK_PIN
- #define SD_SCK_PIN 52
- #endif
- #ifndef SD_MISO_PIN
- #define SD_MISO_PIN 50
- #endif
- #ifndef SD_MOSI_PIN
- #define SD_MOSI_PIN 51
- #endif
-#endif
-
-/* A.28, A.29, B.21, C.26, C.29 */
-#define SD_SS_PIN SDSS
diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp
deleted file mode 100644
index e5647817b6f0..000000000000
--- a/Marlin/src/HAL/DUE/timers.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- *
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
- *
- * 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 .
- *
- */
-
-/**
- * HAL Timers for Arduino Due and compatible (SAM3X8E)
- */
-
-#ifdef ARDUINO_ARCH_SAM
-
-// ------------------------
-// Includes
-// ------------------------
-#include "../../inc/MarlinConfig.h"
-#include "HAL.h"
-
-// ------------------------
-// Local defines
-// ------------------------
-
-#define NUM_HARDWARE_TIMERS 9
-
-// ------------------------
-// Private Variables
-// ------------------------
-
-const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = {
- { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5]
- { TC0, 1, TC1_IRQn, 0}, // 1
- { TC0, 2, TC2_IRQn, 2}, // 2 - stepper
- { TC1, 0, TC3_IRQn, 0}, // 3 - stepper for BOARD_ARCHIM1
- { TC1, 1, TC4_IRQn, 15}, // 4 - temperature
- { TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3]
- { TC2, 0, TC6_IRQn, 14}, // 6 - tone
- { TC2, 1, TC7_IRQn, 0}, // 7
- { TC2, 2, TC8_IRQn, 0}, // 8
-};
-
-// ------------------------
-// Public functions
-// ------------------------
-
-/*
- Timer_clock1: Prescaler 2 -> 42MHz
- Timer_clock2: Prescaler 8 -> 10.5MHz
- Timer_clock3: Prescaler 32 -> 2.625MHz
- Timer_clock4: Prescaler 128 -> 656.25kHz
-*/
-
-void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
- Tc *tc = timer_config[timer_num].pTimerRegs;
- IRQn_Type irq = timer_config[timer_num].IRQ_Id;
- uint32_t channel = timer_config[timer_num].channel;
-
- // Disable interrupt, just in case it was already enabled
- NVIC_DisableIRQ(irq);
-
- // We NEED memory barriers to ensure Interrupts are actually disabled!
- // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
- __DSB();
- __ISB();
-
- // Disable timer interrupt
- tc->TC_CHANNEL[channel].TC_IDR = TC_IDR_CPCS;
-
- // Stop timer, just in case, to be able to reconfigure it
- TC_Stop(tc, channel);
-
- pmc_set_writeprotect(false);
- pmc_enable_periph_clk((uint32_t)irq);
- NVIC_SetPriority(irq, timer_config[timer_num].priority);
-
- // wave mode, reset counter on match with RC,
- TC_Configure(tc, channel,
- TC_CMR_WAVE
- | TC_CMR_WAVSEL_UP_RC
- | (HAL_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0)
- | (HAL_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0)
- | (HAL_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0)
- | (HAL_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0)
- );
-
- // Set compare value
- TC_SetRC(tc, channel, VARIANT_MCK / (HAL_TIMER_PRESCALER) / frequency);
-
- // And start timer
- TC_Start(tc, channel);
-
- // enable interrupt on RC compare
- tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS;
-
- // Finally, enable IRQ
- NVIC_EnableIRQ(irq);
-}
-
-void HAL_timer_enable_interrupt(const uint8_t timer_num) {
- IRQn_Type irq = timer_config[timer_num].IRQ_Id;
- NVIC_EnableIRQ(irq);
-}
-
-void HAL_timer_disable_interrupt(const uint8_t timer_num) {
- IRQn_Type irq = timer_config[timer_num].IRQ_Id;
- NVIC_DisableIRQ(irq);
-
- // We NEED memory barriers to ensure Interrupts are actually disabled!
- // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
- __DSB();
- __ISB();
-}
-
-// missing from CMSIS: Check if interrupt is enabled or not
-static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
- return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
-}
-
-bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
- IRQn_Type irq = timer_config[timer_num].IRQ_Id;
- return NVIC_GetEnabledIRQ(irq);
-}
-
-#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/timers.h b/Marlin/src/HAL/DUE/timers.h
deleted file mode 100644
index dc35c77e6384..000000000000
--- a/Marlin/src/HAL/DUE/timers.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Marlin 3D Printer Firmware
- *
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- *
- * 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 .
- *
- */
-#pragma once
-
-/**
- * HAL Timers for Arduino Due and compatible (SAM3X8E)
- */
-
-#include
-
-// ------------------------
-// Defines
-// ------------------------
-
-#define FORCE_INLINE __attribute__((always_inline)) inline
-
-typedef uint32_t hal_timer_t;
-#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
-
-#define HAL_TIMER_PRESCALER 2
-#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
-
-#ifndef MF_TIMER_STEP
- #define MF_TIMER_STEP 2 // Timer Index for Stepper
-#endif
-#ifndef MF_TIMER_PULSE
- #define MF_TIMER_PULSE MF_TIMER_STEP
-#endif
-#ifndef MF_TIMER_TEMP
- #define MF_TIMER_TEMP 4 // Timer Index for Temperature
-#endif
-#ifndef MF_TIMER_TONE
- #define MF_TIMER_TONE 6 // index of timer to use for beeper tones
-#endif
-
-#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
-
-#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
-#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
-#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
-
-#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
-#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
-#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
-
-#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
-#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
-#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
-
-#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
-#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
-
-#ifndef HAL_STEP_TIMER_ISR
- #define HAL_STEP_TIMER_ISR() void TC2_Handler()
-#endif
-#ifndef HAL_TEMP_TIMER_ISR
- #define HAL_TEMP_TIMER_ISR() void TC4_Handler()
-#endif
-#ifndef HAL_TONE_TIMER_ISR
- #define HAL_TONE_TIMER_ISR() void TC6_Handler()
-#endif
-
-// ------------------------
-// Types
-// ------------------------
-
-typedef struct {
- Tc *pTimerRegs;
- uint16_t channel;
- IRQn_Type IRQ_Id;
- uint8_t priority;
-} tTimerConfig;
-
-// ------------------------
-// Public Variables
-// ------------------------
-
-extern const tTimerConfig timer_config[];
-
-// ------------------------
-// Public functions
-// ------------------------
-
-void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
-
-FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
- const tTimerConfig * const pConfig = &timer_config[timer_num];
- pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare;
-}
-
-FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
- const tTimerConfig * const pConfig = &timer_config[timer_num];
- return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC;
-}
-
-FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
- const tTimerConfig * const pConfig = &timer_config[timer_num];
- return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV;
-}
-
-void HAL_timer_enable_interrupt(const uint8_t timer_num);
-void HAL_timer_disable_interrupt(const uint8_t timer_num);
-bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
-
-FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
- const tTimerConfig * const pConfig = &timer_config[timer_num];
- // Reading the status register clears the interrupt flag
- pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
-}
-
-#define HAL_timer_isr_epilogue(T) NOOP
diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py
deleted file mode 100644
index 4f7a494512b2..000000000000
--- a/Marlin/src/HAL/DUE/upload_extra_script.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Set upload_command
-#
-# Windows: bossac.exe
-# Other: leave unchanged
-#
-import pioutil
-if pioutil.is_pio_build():
- import platform
- current_OS = platform.system()
-
- if current_OS == 'Windows':
-
- Import("env")
-
- # Use bossac.exe on Windows
- env.Replace(
- UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
- )
diff --git a/Marlin/src/HAL/DUE/usb/arduino_due_x.h b/Marlin/src/HAL/DUE/usb/arduino_due_x.h
deleted file mode 100644
index e7b6f3dcb303..000000000000
--- a/Marlin/src/HAL/DUE/usb/arduino_due_x.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * \file
- *
- * \brief Arduino Due/X Board Definition.
- *
- * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved.
- *
- * \asf_license_start
- *
- * \page License
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. The name of Atmel may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * 4. This software may only be redistributed and used in connection with an
- * Atmel microcontroller product.
- *
- * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
- * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * \asf_license_stop
- *
- */
-#pragma once
-
-/**
- * Support and FAQ: visit Atmel Support
- */
-
-/**
- * \page arduino_due_x_opfreq "Arduino Due/X - Operating frequencies"
- * This page lists several definition related to the board operating frequency
- *
- * \section Definitions
- * - \ref BOARD_FREQ_*
- * - \ref BOARD_MCK
- */
-
-/*! Board oscillator settings */
-#define BOARD_FREQ_SLCK_XTAL (32768U)
-#define BOARD_FREQ_SLCK_BYPASS (32768U)
-#define BOARD_FREQ_MAINCK_XTAL (12000000U)
-#define BOARD_FREQ_MAINCK_BYPASS (12000000U)
-
-/*! Master clock frequency */
-#define BOARD_MCK CHIP_FREQ_CPU_MAX
-#define BOARD_NO_32K_XTAL
-
-/** board main clock xtal startup time */
-#define BOARD_OSC_STARTUP_US 15625
-
-/* ------------------------------------------------------------------------ */
-
-/**
- * \page arduino_due_x_board_info "Arduino Due/X - Board information"
- * This page lists several definition related to the board description.
- *
- */
-
-/* ------------------------------------------------------------------------ */
-/* USB */
-/* ------------------------------------------------------------------------ */
-/*! USB OTG VBus On/Off: Bus Power Control Port. */
-#define PIN_UOTGHS_VBOF { PIO_PB10, PIOB, ID_PIOB, PIO_PERIPH_A, PIO_PULLUP }
-/*! USB OTG Identification: Mini Connector Identification Port. */
-#define PIN_UOTGHS_ID { PIO_PB11, PIOB, ID_PIOB, PIO_PERIPH_A, PIO_PULLUP }
-
-/*! Multiplexed pin used for USB_ID: */
-#define USB_ID PIO_PB11_IDX
-#define USB_ID_GPIO (PIO_PB11_IDX)
-#define USB_ID_FLAGS (PIO_PERIPH_A | PIO_DEFAULT)
-/*! Multiplexed pin used for USB_VBOF: */
-#define USB_VBOF PIO_PB10_IDX
-#define USB_VBOF_GPIO (PIO_PB10_IDX)
-#define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT)
-/*! Active level of the USB_VBOF output pin. */
-#define USB_VBOF_ACTIVE_STATE LOW
-/* ------------------------------------------------------------------------ */
diff --git a/Marlin/src/HAL/DUE/usb/compiler.h b/Marlin/src/HAL/DUE/usb/compiler.h
deleted file mode 100644
index 633197914eef..000000000000
--- a/Marlin/src/HAL/DUE/usb/compiler.h
+++ /dev/null
@@ -1,1150 +0,0 @@
-/**
- * \file
- *
- * \brief Commonly used includes, types and macros.
- *
- * Copyright (c) 2010-2016 Atmel Corporation. All rights reserved.
- *
- * \asf_license_start
- *
- * \page License
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. The name of Atmel may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * 4. This software may only be redistributed and used in connection with an
- * Atmel microcontroller product.
- *
- * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
- * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * \asf_license_stop
- *
- */
-/*
- * Support and FAQ: visit Atmel Support
- */
-
-#ifndef UTILS_COMPILER_H
-#define UTILS_COMPILER_H
-
-#include
-#include
-#include "arduino_due_x.h"
-#include "conf_clock.h"
-#ifdef SAM3XA_SERIES
-#define SAM3XA 1
-#endif
-#define UDD_NO_SLEEP_MGR 1
-#define pmc_is_wakeup_clocks_restored() true
-
-#undef udd_get_endpoint_size_max
-#define UDD_USB_INT_FUN USBD_ISR
-
-/**
- * \defgroup group_sam_utils Compiler abstraction layer and code utilities
- *
- * Compiler abstraction layer and code utilities for AT91SAM.
- * This module provides various abstraction layers and utilities to make code compatible between different compilers.
- *
- * \{
- */
-#include
-
-#if (defined __ICCARM__)
-# include
-#endif
-
-#include
-#include "preprocessor.h"
-
-//_____ D E C L A R A T I O N S ____________________________________________
-
-#ifndef __ASSEMBLY__ // Not defined for assembling.
-
-#include
-#include
-#include
-#include
-
-#ifdef __ICCARM__
-/*! \name Compiler Keywords
- *
- * Port of some keywords from GCC to IAR Embedded Workbench.
- */
-//! @{
-#define __asm__ asm
-#define __inline__ inline
-#define __volatile__
-//! @}
-
-#endif
-
-#define FUNC_PTR void *
-/**
- * \def UNUSED
- * \brief Marking \a v as a unused parameter or value.
- */
-#ifndef UNUSED
- #define UNUSED(x) ((void)(x))
-#endif
-
-/**
- * \def unused
- * \brief Marking \a v as a unused parameter or value.
- */
-#define unused(v) do { (void)(v); }while(0)
-
-/**
- * \def barrier
- * \brief Memory barrier
- */
-#define barrier() __DMB()
-
-/**
- * \brief Emit the compiler pragma \a arg.
- *
- * \param arg The pragma directive as it would appear after \e \#pragma
- * (i.e. not stringified).
- */
-#define COMPILER_PRAGMA(arg) _Pragma(#arg)
-
-/**
- * \def COMPILER_PACK_SET(alignment)
- * \brief Set maximum alignment for subsequent struct and union
- * definitions to \a alignment.
- */
-#define COMPILER_PACK_SET(alignment) COMPILER_PRAGMA(pack(alignment))
-
-/**
- * \def COMPILER_PACK_RESET()
- * \brief Set default alignment for subsequent struct and union
- * definitions.
- */
-#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack())
-
-
-/**
- * \brief Set aligned boundary.
- */
-#if (defined __GNUC__) || (defined __CC_ARM)
-# define COMPILER_ALIGNED(a) __attribute__((__aligned__(a)))
-#elif (defined __ICCARM__)
-# define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a)
-#endif
-
-/**
- * \brief Set word-aligned boundary.
- */
-#if (defined __GNUC__) || defined(__CC_ARM)
-#define COMPILER_WORD_ALIGNED __attribute__((__aligned__(4)))
-#elif (defined __ICCARM__)
-#define COMPILER_WORD_ALIGNED COMPILER_PRAGMA(data_alignment = 4)
-#endif
-
-/**
- * \def __always_inline
- * \brief The function should always be inlined.
- *
- * This annotation instructs the compiler to ignore its inlining
- * heuristics and inline the function no matter how big it thinks it
- * becomes.
- */
-#ifdef __CC_ARM
-# define __always_inline __forceinline
-#elif (defined __GNUC__)
-#ifdef __always_inline
-# undef __always_inline
-#endif
-# define __always_inline inline __attribute__((__always_inline__))
-#elif (defined __ICCARM__)
-# define __always_inline _Pragma("inline=forced")
-#endif
-
-/**
- * \def __no_inline
- * \brief The function should not be inlined.
- *
- * This annotation instructs the compiler to ignore its inlining
- * heuristics and not inline the function.
- */
-#ifdef __CC_ARM
-# define __no_inline __attribute__((noinline))
-#elif (defined __GNUC__)
-# define __no_inline __attribute__((__noinline__))
-#elif (defined __ICCARM__)
-# define __no_inline _Pragma("inline=never")
-#endif
-
-/*! \brief This macro is used to test fatal errors.
- *
- * The macro tests if the expression is false. If it is, a fatal error is
- * detected and the application hangs up. If TEST_SUITE_DEFINE_ASSERT_MACRO
- * is defined, a unit test version of the macro is used, to allow execution
- * of further tests after a false expression.
- *
- * \param expr Expression to evaluate and supposed to be nonzero.
- */
-#ifdef _ASSERT_ENABLE_
-# if defined(TEST_SUITE_DEFINE_ASSERT_MACRO)
- // Assert() is defined in unit_test/suite.h
-# include "unit_test/suite.h"
-# else
-#undef TEST_SUITE_DEFINE_ASSERT_MACRO
-# define Assert(expr) \
- {\
- if (!(expr)) while (true);\
- }
-# endif
-#else
-# define Assert(expr) ((void) 0)
-#endif
-
-/* Define WEAK attribute */
-#if defined ( __CC_ARM ) /* Keil µVision 4 */
-# define WEAK __attribute__ ((weak))
-#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
-# define WEAK __weak
-#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
-# define WEAK __attribute__ ((weak))
-#endif
-
-/* Define NO_INIT attribute */
-#if 0 //ndef NO_INIT
-#ifdef __CC_ARM
-# define NO_INIT __attribute__((zero_init))
-#elif defined ( __ICCARM__ )
-# define NO_INIT __no_init
-#elif defined ( __GNUC__ )
-# define NO_INIT __attribute__((section(".no_init")))
-#endif
-#endif
-
-/* Define RAMFUNC attribute */
-#if defined ( __CC_ARM ) /* Keil µVision 4 */
-# define RAMFUNC __attribute__ ((section(".ramfunc")))
-#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
-# define RAMFUNC __ramfunc
-#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
-# define RAMFUNC __attribute__ ((section(".ramfunc")))
-#endif
-
-/* Define OPTIMIZE_HIGH attribute */
-#if defined ( __CC_ARM ) /* Keil µVision 4 */
-# define OPTIMIZE_HIGH _Pragma("O3")
-#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
-# define OPTIMIZE_HIGH _Pragma("optimize=high")
-#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
-# define OPTIMIZE_HIGH __attribute__((optimize("s")))
-#endif
-
-/*! \name Usual Types
- */
-//! @{
-typedef unsigned char Bool; //!< Boolean.
-#ifndef __cplusplus
-#ifndef __bool_true_false_are_defined
-typedef unsigned char bool; //!< Boolean.
-#endif
-#endif
-typedef int8_t S8 ; //!< 8-bit signed integer.
-typedef uint8_t U8 ; //!< 8-bit unsigned integer.
-typedef int16_t S16; //!< 16-bit signed integer.
-typedef uint16_t U16; //!< 16-bit unsigned integer.
-typedef uint16_t le16_t;
-typedef uint16_t be16_t;
-typedef int32_t S32; //!< 32-bit signed integer.
-typedef uint32_t U32; //!< 32-bit unsigned integer.
-typedef uint32_t le32_t;
-typedef uint32_t be32_t;
-typedef int64_t S64; //!< 64-bit signed integer.
-typedef uint64_t U64; //!< 64-bit unsigned integer.
-typedef float F32; //!< 32-bit floating-point number.
-typedef double F64; //!< 64-bit floating-point number.
-typedef uint32_t iram_size_t;
-//! @}
-
-
-/*! \name Status Types
- */
-//! @{
-typedef bool Status_bool_t; //!< Boolean status.
-typedef U8 Status_t; //!< 8-bit-coded status.
-//! @}
-
-
-/*! \name Aliasing Aggregate Types
- */
-//! @{
-
-//! 16-bit union.
-typedef union
-{
- S16 s16 ;
- U16 u16 ;
- S8 s8 [2];
- U8 u8 [2];
-} Union16;
-
-//! 32-bit union.
-typedef union
-{
- S32 s32 ;
- U32 u32 ;
- S16 s16[2];
- U16 u16[2];
- S8 s8 [4];
- U8 u8 [4];
-} Union32;
-
-//! 64-bit union.
-typedef union
-{
- S64 s64 ;
- U64 u64 ;
- S32 s32[2];
- U32 u32[2];
- S16 s16[4];
- U16 u16[4];
- S8 s8 [8];
- U8 u8 [8];
-} Union64;
-
-//! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers.
-typedef union
-{
- S64 *s64ptr;
- U64 *u64ptr;
- S32 *s32ptr;
- U32 *u32ptr;
- S16 *s16ptr;
- U16 *u16ptr;
- S8 *s8ptr ;
- U8 *u8ptr ;
-} UnionPtr;
-
-//! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers.
-typedef union
-{
- volatile S64 *s64ptr;
- volatile U64 *u64ptr;
- volatile S32 *s32ptr;
- volatile U32 *u32ptr;
- volatile S16 *s16ptr;
- volatile U16 *u16ptr;
- volatile S8 *s8ptr ;
- volatile U8 *u8ptr ;
-} UnionVPtr;
-
-//! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers.
-typedef union
-{
- const S64 *s64ptr;
- const U64 *u64ptr;
- const S32 *s32ptr;
- const U32 *u32ptr;
- const S16 *s16ptr;
- const U16 *u16ptr;
- const S8 *s8ptr ;
- const U8 *u8ptr ;
-} UnionCPtr;
-
-//! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers.
-typedef union
-{
- const volatile S64 *s64ptr;
- const volatile U64 *u64ptr;
- const volatile S32 *s32ptr;
- const volatile U32 *u32ptr;
- const volatile S16 *s16ptr;
- const volatile U16 *u16ptr;
- const volatile S8 *s8ptr ;
- const volatile U8 *u8ptr ;
-} UnionCVPtr;
-
-//! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers.
-typedef struct
-{
- S64 *s64ptr;
- U64 *u64ptr;
- S32 *s32ptr;
- U32 *u32ptr;
- S16 *s16ptr;
- U16 *u16ptr;
- S8 *s8ptr ;
- U8 *u8ptr ;
-} StructPtr;
-
-//! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers.
-typedef struct
-{
- volatile S64 *s64ptr;
- volatile U64 *u64ptr;
- volatile S32 *s32ptr;
- volatile U32 *u32ptr;
- volatile S16 *s16ptr;
- volatile U16 *u16ptr;
- volatile S8 *s8ptr ;
- volatile U8 *u8ptr ;
-} StructVPtr;
-
-//! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers.
-typedef struct
-{
- const S64 *s64ptr;
- const U64 *u64ptr;
- const S32 *s32ptr;
- const U32 *u32ptr;
- const S16 *s16ptr;
- const U16 *u16ptr;
- const S8 *s8ptr ;
- const U8 *u8ptr ;
-} StructCPtr;
-
-//! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers.
-typedef struct
-{
- const volatile S64 *s64ptr;
- const volatile U64 *u64ptr;
- const volatile S32 *s32ptr;
- const volatile U32 *u32ptr;
- const volatile S16 *s16ptr;
- const volatile U16 *u16ptr;
- const volatile S8 *s8ptr ;
- const volatile U8 *u8ptr ;
-} StructCVPtr;
-
-//! @}
-
-#endif // #ifndef __ASSEMBLY__
-
-/*! \name Usual Constants
- */
-//! @{
-#define DISABLE 0
-#define ENABLE 1
-#ifndef __cplusplus
-#ifndef __bool_true_false_are_defined
-#define false (1==0)
-#define true (1==1)
-#endif
-#endif
-#ifndef PASS
-#define PASS 0
-#endif
-#ifndef FAIL
-#define FAIL 1
-#endif
-#ifndef LOW
-#define LOW 0x0
-#endif
-#ifndef HIGH
-#define HIGH 0x1
-#endif
-//! @}
-
-
-#ifndef __ASSEMBLY__ // not for assembling.
-
-//! \name Optimization Control
-//@{
-
-/**
- * \def likely(exp)
- * \brief The expression \a exp is likely to be true
- */
-#ifndef likely
-# define likely(exp) (exp)
-#endif
-
-/**
- * \def unlikely(exp)
- * \brief The expression \a exp is unlikely to be true
- */
-#ifndef unlikely
-# define unlikely(exp) (exp)
-#endif
-
-/**
- * \def is_constant(exp)
- * \brief Determine if an expression evaluates to a constant value.
- *
- * \param exp Any expression
- *
- * \return true if \a exp is constant, false otherwise.
- */
-#if (defined __GNUC__) || (defined __CC_ARM)
-# define is_constant(exp) __builtin_constant_p(exp)
-#else
-# define is_constant(exp) (0)
-#endif
-
-//! @}
-
-/*! \name Bit-Field Handling
- */
-//! @{
-
-/*! \brief Reads the bits of a value specified by a given bit-mask.
- *
- * \param value Value to read bits from.
- * \param mask Bit-mask indicating bits to read.
- *
- * \return Read bits.
- */
-#define Rd_bits( value, mask) ((value) & (mask))
-
-/*! \brief Writes the bits of a C lvalue specified by a given bit-mask.
- *
- * \param lvalue C lvalue to write bits to.
- * \param mask Bit-mask indicating bits to write.
- * \param bits Bits to write.
- *
- * \return Resulting value with written bits.
- */
-#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\
- ((bits ) & (mask)))
-
-/*! \brief Tests the bits of a value specified by a given bit-mask.
- *
- * \param value Value of which to test bits.
- * \param mask Bit-mask indicating bits to test.
- *
- * \return \c 1 if at least one of the tested bits is set, else \c 0.
- */
-#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0)
-
-/*! \brief Clears the bits of a C lvalue specified by a given bit-mask.
- *
- * \param lvalue C lvalue of which to clear bits.
- * \param mask Bit-mask indicating bits to clear.
- *
- * \return Resulting value with cleared bits.
- */
-#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask))
-
-/*! \brief Sets the bits of a C lvalue specified by a given bit-mask.
- *
- * \param lvalue C lvalue of which to set bits.
- * \param mask Bit-mask indicating bits to set.
- *
- * \return Resulting value with set bits.
- */
-#define Set_bits(lvalue, mask) ((lvalue) |= (mask))
-
-/*! \brief Toggles the bits of a C lvalue specified by a given bit-mask.
- *
- * \param lvalue C lvalue of which to toggle bits.
- * \param mask Bit-mask indicating bits to toggle.
- *
- * \return Resulting value with toggled bits.
- */
-#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask))
-
-/*! \brief Reads the bit-field of a value specified by a given bit-mask.
- *
- * \param value Value to read a bit-field from.
- * \param mask Bit-mask indicating the bit-field to read.
- *
- * \return Read bit-field.
- */
-#define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask))
-
-/*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask.
- *
- * \param lvalue C lvalue to write a bit-field to.
- * \param mask Bit-mask indicating the bit-field to write.
- * \param bitfield Bit-field to write.
- *
- * \return Resulting value with written bit-field.
- */
-#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask)))
-
-//! @}
-
-
-/*! \name Zero-Bit Counting
- *
- * Under GCC, __builtin_clz and __builtin_ctz behave like macros when
- * applied to constant expressions (values known at compile time), so they are
- * more optimized than the use of the corresponding assembly instructions and
- * they can be used as constant expressions e.g. to initialize objects having
- * static storage duration, and like the corresponding assembly instructions
- * when applied to non-constant expressions (values unknown at compile time), so
- * they are more optimized than an assembly periphrasis. Hence, clz and ctz
- * ensure a possible and optimized behavior for both constant and non-constant
- * expressions.
- */
-//! @{
-
-/*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer.
- *
- * \param u Value of which to count the leading zero bits.
- *
- * \return The count of leading zero bits in \a u.
- */
-#ifndef clz
-#if (defined __GNUC__) || (defined __CC_ARM)
-# define clz(u) ((u) ? __builtin_clz(u) : 32)
-#elif (defined __ICCARM__)
-# define clz(u) ((u) ? __CLZ(u) : 32)
-#else
-# define clz(u) (((u) == 0) ? 32 : \
- ((u) & (1UL << 31)) ? 0 : \
- ((u) & (1UL << 30)) ? 1 : \
- ((u) & (1UL << 29)) ? 2 : \
- ((u) & (1UL << 28)) ? 3 : \
- ((u) & (1UL << 27)) ? 4 : \
- ((u) & (1UL << 26)) ? 5 : \
- ((u) & (1UL << 25)) ? 6 : \
- ((u) & (1UL << 24)) ? 7 : \
- ((u) & (1UL << 23)) ? 8 : \
- ((u) & (1UL << 22)) ? 9 : \
- ((u) & (1UL << 21)) ? 10 : \
- ((u) & (1UL << 20)) ? 11 : \
- ((u) & (1UL << 19)) ? 12 : \
- ((u) & (1UL << 18)) ? 13 : \
- ((u) & (1UL << 17)) ? 14 : \
- ((u) & (1UL << 16)) ? 15 : \
- ((u) & (1UL << 15)) ? 16 : \
- ((u) & (1UL << 14)) ? 17 : \
- ((u) & (1UL << 13)) ? 18 : \
- ((u) & (1UL << 12)) ? 19 : \
- ((u) & (1UL << 11)) ? 20 : \
- ((u) & (1UL << 10)) ? 21 : \
- ((u) & (1UL << 9)) ? 22 : \
- ((u) & (1UL << 8)) ? 23 : \
- ((u) & (1UL << 7)) ? 24 : \
- ((u) & (1UL << 6)) ? 25 : \
- ((u) & (1UL << 5)) ? 26 : \
- ((u) & (1UL << 4)) ? 27 : \
- ((u) & (1UL << 3)) ? 28 : \
- ((u) & (1UL << 2)) ? 29 : \
- ((u) & (1UL << 1)) ? 30 : \
- 31)
-#endif
-#endif
-
-/*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer.
- *
- * \param u Value of which to count the trailing zero bits.
- *
- * \return The count of trailing zero bits in \a u.
- */
-#ifndef ctz
-#if (defined __GNUC__) || (defined __CC_ARM)
-# define ctz(u) ((u) ? __builtin_ctz(u) : 32)
-#else
-# define ctz(u) ((u) & (1UL << 0) ? 0 : \
- (u) & (1UL << 1) ? 1 : \
- (u) & (1UL << 2) ? 2 : \
- (u) & (1UL << 3) ? 3 : \
- (u) & (1UL << 4) ? 4 : \
- (u) & (1UL << 5) ? 5 : \
- (u) & (1UL << 6) ? 6 : \
- (u) & (1UL << 7) ? 7 : \
- (u) & (1UL << 8) ? 8 : \
- (u) & (1UL << 9) ? 9 : \
- (u) & (1UL << 10) ? 10 : \
- (u) & (1UL << 11) ? 11 : \
- (u) & (1UL << 12) ? 12 : \
- (u) & (1UL << 13) ? 13 : \
- (u) & (1UL << 14) ? 14 : \
- (u) & (1UL << 15) ? 15 : \
- (u) & (1UL << 16) ? 16 : \
- (u) & (1UL << 17) ? 17 : \
- (u) & (1UL << 18) ? 18 : \
- (u) & (1UL << 19) ? 19 : \
- (u) & (1UL << 20) ? 20 : \
- (u) & (1UL << 21) ? 21 : \
- (u) & (1UL << 22) ? 22 : \
- (u) & (1UL << 23) ? 23 : \
- (u) & (1UL << 24) ? 24 : \
- (u) & (1UL << 25) ? 25 : \
- (u) & (1UL << 26) ? 26 : \
- (u) & (1UL << 27) ? 27 : \
- (u) & (1UL << 28) ? 28 : \
- (u) & (1UL << 29) ? 29 : \
- (u) & (1UL << 30) ? 30 : \
- (u) & (1UL << 31) ? 31 : \
- 32)
-#endif
-#endif
-
-//! @}
-
-
-/*! \name Bit Reversing
- */
-//! @{
-
-/*! \brief Reverses the bits of \a u8.
- *
- * \param u8 U8 of which to reverse the bits.
- *
- * \return Value resulting from \a u8 with reversed bits.
- */
-#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24))
-
-/*! \brief Reverses the bits of \a u16.
- *
- * \param u16 U16 of which to reverse the bits.
- *
- * \return Value resulting from \a u16 with reversed bits.
- */
-#define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16))
-
-/*! \brief Reverses the bits of \a u32.
- *
- * \param u32 U32 of which to reverse the bits.
- *
- * \return Value resulting from \a u32 with reversed bits.
- */
-#define bit_reverse32(u32) __RBIT(u32)
-
-/*! \brief Reverses the bits of \a u64.
- *
- * \param u64 U64 of which to reverse the bits.
- *
- * \return Value resulting from \a u64 with reversed bits.
- */
-#define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\
- ((U64)bit_reverse32((U64)(u64)) << 32)))
-
-//! @}
-
-
-/*! \name Alignment
- */
-//! @{
-
-/*! \brief Tests alignment of the number \a val with the \a n boundary.
- *
- * \param val Input value.
- * \param n Boundary.
- *
- * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0.
- */
-#define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) )
-
-/*! \brief Gets alignment of the number \a val with respect to the \a n boundary.
- *
- * \param val Input value.
- * \param n Boundary.
- *
- * \return Alignment of the number \a val with respect to the \a n boundary.
- */
-#define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) )
-
-/*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary.
- *
- * \param lval Input/output lvalue.
- * \param n Boundary.
- * \param alg Alignment.
- *
- * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary.
- */
-#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) )
-
-/*! \brief Aligns the number \a val with the upper \a n boundary.
- *
- * \param val Input value.
- * \param n Boundary.
- *
- * \return Value resulting from the number \a val aligned with the upper \a n boundary.
- */
-#define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1))
-
-/*! \brief Aligns the number \a val with the lower \a n boundary.
- *
- * \param val Input value.
- * \param n Boundary.
- *
- * \return Value resulting from the number \a val aligned with the lower \a n boundary.
- */
-#define Align_down(val, n ) ( (val) & ~((n) - 1))
-
-//! @}
-
-/*! \brief Calls the routine at address \a addr.
- *
- * It generates a long call opcode.
- *
- * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if
- * it is invoked from the CPU supervisor mode.
- *
- * \param addr Address of the routine to call.
- *
- * \note It may be used as a long jump opcode in some special cases.
- */
-#define Long_call(addr) ((*(void (*)(void))(addr))())
-
-
-/*! \name MCU Endianism Handling
- * ARM is MCU little endianism.
- */
-//! @{
-#define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16.
-#define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16.
-
-#define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32.
-#define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32.
-#define MSB0W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 1st rank of \a u32.
-#define MSB1W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 2nd rank of \a u32.
-#define MSB2W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 3rd rank of \a u32.
-#define MSB3W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 4th rank of \a u32.
-#define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32.
-#define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32.
-#define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32.
-#define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32.
-
-#define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64.
-#define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64.
-#define MSH0(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 1st rank of \a u64.
-#define MSH1(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 2nd rank of \a u64.
-#define MSH2(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 3rd rank of \a u64.
-#define MSH3(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 4th rank of \a u64.
-#define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64.
-#define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64.
-#define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64.
-#define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64.
-#define MSB0D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 1st rank of \a u64.
-#define MSB1D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 2nd rank of \a u64.
-#define MSB2D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 3rd rank of \a u64.
-#define MSB3D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 4th rank of \a u64.
-#define MSB4D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 5th rank of \a u64.
-#define MSB5D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 6th rank of \a u64.
-#define MSB6D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 7th rank of \a u64.
-#define MSB7D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 8th rank of \a u64.
-#define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64.
-#define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64.
-#define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64.
-#define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64.
-#define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64.
-#define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64.
-#define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64.
-#define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64.
-
-#define BE16(x) swap16(x)
-#define LE16(x) (x)
-
-#define le16_to_cpu(x) (x)
-#define cpu_to_le16(x) (x)
-#define LE16_TO_CPU(x) (x)
-#define CPU_TO_LE16(x) (x)
-
-#define be16_to_cpu(x) swap16(x)
-#define cpu_to_be16(x) swap16(x)
-#define BE16_TO_CPU(x) swap16(x)
-#define CPU_TO_BE16(x) swap16(x)
-
-#define le32_to_cpu(x) (x)
-#define cpu_to_le32(x) (x)
-#define LE32_TO_CPU(x) (x)
-#define CPU_TO_LE32(x) (x)
-
-#define be32_to_cpu(x) swap32(x)
-#define cpu_to_be32(x) swap32(x)
-#define BE32_TO_CPU(x) swap32(x)
-#define CPU_TO_BE32(x) swap32(x)
-//! @}
-
-
-/*! \name Endianism Conversion
- *
- * The same considerations as for clz and ctz apply here but GCC's
- * __builtin_bswap_32 and __builtin_bswap_64 do not behave like macros when
- * applied to constant expressions, so two sets of macros are defined here:
- * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known
- * at compile time);
- * - swap16, swap32 and swap64 to apply to non-constant expressions (values
- * unknown at compile time).
- */
-//! @{
-
-/*! \brief Toggles the endianism of \a u16 (by swapping its bytes).
- *
- * \param u16 U16 of which to toggle the endianism.
- *
- * \return Value resulting from \a u16 with toggled endianism.
- *
- * \note More optimized if only used with values known at compile time.
- */
-#define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\
- ((U16)(u16) << 8)))
-
-/*! \brief Toggles the endianism of \a u32 (by swapping its bytes).
- *
- * \param u32 U32 of which to toggle the endianism.
- *
- * \return Value resulting from \a u32 with toggled endianism.
- *
- * \note More optimized if only used with values known at compile time.
- */
-#define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\
- ((U32)Swap16((U32)(u32)) << 16)))
-
-/*! \brief Toggles the endianism of \a u64 (by swapping its bytes).
- *
- * \param u64 U64 of which to toggle the endianism.
- *
- * \return Value resulting from \a u64 with toggled endianism.
- *
- * \note More optimized if only used with values known at compile time.
- */
-#define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\
- ((U64)Swap32((U64)(u64)) << 32)))
-
-/*! \brief Toggles the endianism of \a u16 (by swapping its bytes).
- *
- * \param u16 U16 of which to toggle the endianism.
- *
- * \return Value resulting from \a u16 with toggled endianism.
- *
- * \note More optimized if only used with values unknown at compile time.
- */
-#define swap16(u16) Swap16(u16)
-
-/*! \brief Toggles the endianism of \a u32 (by swapping its bytes).
- *
- * \param u32 U32 of which to toggle the endianism.
- *
- * \return Value resulting from \a u32 with toggled endianism.
- *
- * \note More optimized if only used with values unknown at compile time.
- */
-#if (defined __GNUC__)
-# define swap32(u32) ((U32)__builtin_bswap32((U32)(u32)))
-#else
-# define swap32(u32) Swap32(u32)
-#endif
-
-/*! \brief Toggles the endianism of \a u64 (by swapping its bytes).
- *
- * \param u64 U64 of which to toggle the endianism.
- *
- * \return Value resulting from \a u64 with toggled endianism.
- *
- * \note More optimized if only used with values unknown at compile time.
- */
-#if (defined __GNUC__)
-# define swap64(u64) ((U64)__builtin_bswap64((U64)(u64)))
-#else
-# define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\
- ((U64)swap32((U64)(u64)) << 32)))
-#endif
-
-//! @}
-
-
-/*! \name Target Abstraction
- */
-//! @{
-
-#define _GLOBEXT_ extern //!< extern storage-class specifier.
-#define _CONST_TYPE_ const //!< const type qualifier.
-#define _MEM_TYPE_SLOW_ //!< Slow memory type.
-#define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type.
-#define _MEM_TYPE_FAST_ //!< Fast memory type.
-
-typedef U8 Byte; //!< 8-bit unsigned integer.
-
-#define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM.
-#define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM.
-#define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM.
-#define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM.
-
-#define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32.
-#define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32.
-#define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32.
-#define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32.
-#define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32.
-#define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32.
-#define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32.
-#define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32.
-
-//! @}
-
-/**
- * \brief Calculate \f$ \left\lceil \frac{a}{b} \right\rceil \f$ using
- * integer arithmetic.
- *
- * \param a An integer
- * \param b Another integer
- *
- * \return (\a a / \a b) rounded up to the nearest integer.
- */
-#define div_ceil(a, b) (((a) + (b) - 1) / (b))
-
-#endif // #ifndef __ASSEMBLY__
-
-
-#ifdef __ICCARM__
-#define SHORTENUM __packed
-#elif defined(__GNUC__)
-#define SHORTENUM __attribute__((packed))
-#endif
-
-/* No operation */
-#ifdef __ICCARM__
-#define nop() __no_operation()
-#elif defined(__GNUC__)
-#define nop() (__NOP())
-#endif
-
-#define FLASH_DECLARE(x) const x
-#define FLASH_EXTERN(x) extern const x
-#define PGM_READ_BYTE(x) *(x)
-#define PGM_READ_WORD(x) *(x)
-#define PGM_READ_DWORD(x) *(x)
-#define MEMCPY_ENDIAN memcpy
-#define PGM_READ_BLOCK(dst, src, len) memcpy((dst), (src), (len))
-
-/*Defines the Flash Storage for the request and response of MAC*/
-#define CMD_ID_OCTET (0)
-
-/* Converting of values from CPU endian to little endian. */
-#define CPU_ENDIAN_TO_LE16(x) (x)
-#define CPU_ENDIAN_TO_LE32(x) (x)
-#define CPU_ENDIAN_TO_LE64(x) (x)
-
-/* Converting of values from little endian to CPU endian. */
-#define LE16_TO_CPU_ENDIAN(x) (x)
-#define LE32_TO_CPU_ENDIAN(x) (x)
-#define LE64_TO_CPU_ENDIAN(x) (x)
-
-/* Converting of constants from little endian to CPU endian. */
-#define CLE16_TO_CPU_ENDIAN(x) (x)
-#define CLE32_TO_CPU_ENDIAN(x) (x)
-#define CLE64_TO_CPU_ENDIAN(x) (x)
-
-/* Converting of constants from CPU endian to little endian. */
-#define CCPU_ENDIAN_TO_LE16(x) (x)
-#define CCPU_ENDIAN_TO_LE32(x) (x)
-#define CCPU_ENDIAN_TO_LE64(x) (x)
-
-#define ADDR_COPY_DST_SRC_16(dst, src) ((dst) = (src))
-#define ADDR_COPY_DST_SRC_64(dst, src) ((dst) = (src))
-
-/**
- * @brief Converts a 64-Bit value into a 8 Byte array
- *
- * @param[in] value 64-Bit value
- * @param[out] data Pointer to the 8 Byte array to be updated with 64-Bit value
- * @ingroup apiPalApi
- */
-static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data)
-{
- uint8_t val_index = 0;
-
- while (val_index < 8)
- {
- data[val_index++] = value & 0xFF;
- value >>= 8;
- }
-}
-
-/**
- * @brief Converts a 16-Bit value into a 2 Byte array
- *
- * @param[in] value 16-Bit value
- * @param[out] data Pointer to the 2 Byte array to be updated with 16-Bit value
- * @ingroup apiPalApi
- */
-static inline void convert_16_bit_to_byte_array(uint16_t value, uint8_t *data)
-{
- data[0] = value & 0xFF;
- data[1] = (value >> 8) & 0xFF;
-}
-
-/* Converts a 16-Bit value into a 2 Byte array */
-static inline void convert_spec_16_bit_to_byte_array(uint16_t value, uint8_t *data)
-{
- data[0] = value & 0xFF;
- data[1] = (value >> 8) & 0xFF;
-}
-
-/* Converts a 16-Bit value into a 2 Byte array */
-static inline void convert_16_bit_to_byte_address(uint16_t value, uint8_t *data)
-{
- data[0] = value & 0xFF;
- data[1] = (value >> 8) & 0xFF;
-}
-
-/*
- * @brief Converts a 2 Byte array into a 16-Bit value
- *
- * @param data Specifies the pointer to the 2 Byte array
- *
- * @return 16-Bit value
- * @ingroup apiPalApi
- */
-static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data)
-{
- return (data[0] | ((uint16_t)data[1] << 8));
-}
-
-/* Converts a 8 Byte array into a 32-Bit value */
-static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data)
-{
- union
- {
- uint32_t u32;
- uint8_t u8[8];
- }long_addr;
- uint8_t index;
- for (index = 0; index < 4; index++) {
- long_addr.u8[index] = *data++;
- }
- return long_addr.u32;
-}
-
-/**
- * @brief Converts a 8 Byte array into a 64-Bit value
- *
- * @param data Specifies the pointer to the 8 Byte array
- *
- * @return 64-Bit value
- * @ingroup apiPalApi
- */
-static inline uint64_t convert_byte_array_to_64_bit(uint8_t *data)
-{
- union
- {
- uint64_t u64;
- uint8_t u8[8];
- } long_addr;
-
- uint8_t val_index;
-
- for (val_index = 0; val_index < 8; val_index++)
- {
- long_addr.u8[val_index] = *data++;
- }
-
- return long_addr.u64;
-}
-/**
- * \}
- */
-
-#endif /* UTILS_COMPILER_H */
diff --git a/Marlin/src/HAL/DUE/usb/conf_access.h b/Marlin/src/HAL/DUE/usb/conf_access.h
deleted file mode 100644
index f401685223cb..000000000000
--- a/Marlin/src/HAL/DUE/usb/conf_access.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * \file
- *
- * \brief Memory access control configuration file.
- *
- * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved.
- *
- * \asf_license_start
- *
- * \page License
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. The name of Atmel may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * 4. This software may only be redistributed and used in connection with an
- * Atmel microcontroller product.
- *
- * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
- * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * \asf_license_stop
- *
- */
-/*
- * Support and FAQ: visit