Compare commits

..

21 Commits

Author SHA1 Message Date
7a96b06a6f Config: adjust PLA Temperatures 2021-08-19 16:59:27 +02:00
a6865b9233 Config: enable G26 mesh validation 2021-08-19 16:58:51 +02:00
281a576ff7 Config: refine bed size 2021-08-19 16:57:52 +02:00
09c3ddad95 Config: installed bed temp sensor 2021-08-19 16:57:05 +02:00
6af009537b New lead screws, set config 2021-08-14 16:16:31 +02:00
fed8104ce5 Config: use LCD SD-card for printing menu
Firmware will still be loaded from onboard sd card only.
2021-08-14 11:53:41 +02:00
993d4e3527 Config: adjust homing feedrate and backoff 2021-08-14 11:53:05 +02:00
ee75f64085 Config: enable menu items
- unified bed leveling
- bed trimming: calibrate bed corner height
- enable/disable soft endstops
2021-08-14 11:51:40 +02:00
ad91ef8e1b Config: extruder settings
- fix extruder direction
- enable load/unload filament menu items
2021-08-14 11:49:17 +02:00
0a1ec65583 Config: set z steps per mm and probe z offset 2021-08-14 11:41:13 +02:00
69e35e913d Config: fix endstop setting
The z endstop is not used due to a probe being present. Should it be
used however this is the right setting.
2021-08-14 11:37:46 +02:00
f629552fb1 Config: fix axis swap and CoreXY setting
Y stepper was set to be reversed by default. This alone swapped the X
and Y axis. The first fix was to enable COREYX instead of COREXY. With
the correct Y direction the printer will run with the correct axis in
COREXY mode.
2021-08-14 11:36:52 +02:00
c51f7e094c Config: enable USB serial port 2021-08-14 08:05:06 +02:00
3f65d4bfb6 Config: set extruder fan
FAN1_PIN is the HE1 ferrule connector. By setting the E0_AUTO_FAN_PIN
the fan only turns on at the specified temperature (50).
2021-08-12 14:43:57 +02:00
bf05e1f393 Config: enable sensorless homing 2021-08-12 14:18:10 +02:00
fc5045d361 Config: configure Z Probe for homing 2021-08-12 14:17:45 +02:00
f1e03c2e1c Config: setup tft display
- Config based on
  https://github.com/bigtreetech/BIGTREETECH-TouchScreenFirmware#marlin-dependencies
2021-08-12 07:56:32 +02:00
53997c0f44 Config: specify installed components
- Temp sensor on hotend
- 4, Stepper drivers: X, Y, Z and E0
- BLTOUCH and offset
2021-08-12 07:40:34 +02:00
56ff450de2 Config: alter basic settings
- Author, Printer Name, Machine UUID
- Mechanical type, CoreYX
- Bed size
- enable EEPROM and SD-Card
2021-08-12 07:36:21 +02:00
841b8abbed Set board env for platformio
Chipset for BTT SKR 1.4 Turbo is LPC1769
2021-08-11 16:36:55 +02:00
cac4d1f941 Backup configuration files 2021-08-11 16:36:55 +02:00
1280 changed files with 35433 additions and 122437 deletions

View File

@ -7,7 +7,7 @@ name: Bump Distribution Date
on: on:
schedule: schedule:
- cron: '0 */6 * * *' - cron: '0 0 * * *'
jobs: jobs:
bump_date: bump_date:
@ -26,13 +26,11 @@ jobs:
- name: Bump Distribution Date - name: Bump Distribution Date
run: | run: |
# Inline Bump Script # Inline Bump Script
if [[ ! "$( git log -1 --pretty=%B )" =~ ^\[cron\] ]]; then DIST=$( date +"%Y-%m-%d" )
DIST=$( date +"%Y-%m-%d" ) eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \ eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/Version.h" && \
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/Version.h" && \ git config user.name "${GITHUB_ACTOR}" && \
git config user.name "${GITHUB_ACTOR}" && \ git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \ git add . && \
git add . && \ git commit -m "[cron] Bump distribution date ($DIST)" && \
git commit -m "[cron] Bump distribution date ($DIST)" && \ git push
git push
fi

View File

@ -6,8 +6,7 @@
name: PR Bad Target name: PR Bad Target
on: on:
pull_request_target: pull_request:
types: [opened]
branches: branches:
- 1.0.x - 1.0.x
- 1.1.x - 1.1.x

View File

@ -97,7 +97,6 @@ jobs:
- REMRAM_V1 - REMRAM_V1
- BTT_SKR_SE_BX - BTT_SKR_SE_BX
- chitu_f103 - chitu_f103
- Index_Mobo_Rev03
# Put lengthy tests last # Put lengthy tests last

20
.gitignore vendored
View File

@ -22,16 +22,12 @@
# Generated files # Generated files
_Version.h _Version.h
bdf2u8g bdf2u8g
marlin_config.json
mczip.h
*.gen
*.sublime-workspace
# #
# OS # OS
# #
applet/ applet/
.DS_Store *.DS_Store
# #
# Misc # Misc
@ -41,6 +37,7 @@ applet/
*.rej *.rej
*.bak *.bak
*.idea *.idea
*.s
*.i *.i
*.ii *.ii
*.swp *.swp
@ -140,19 +137,20 @@ __vm/
vc-fileutils.settings vc-fileutils.settings
# Visual Studio Code # Visual Studio Code
.vscode/* .vscode
!.vscode/extensions.json .vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/*.db
#Simulation #Simulation
imgui.ini imgui.ini
eeprom.dat eeprom.dat
spi_flash.bin
#cmake #cmake
CMakeLists.txt CMakeLists.txt
src/CMakeLists.txt src/CMakeLists.txt
CMakeListsPrivate.txt CMakeListsPrivate.txt
build/
# CLion # CLion
cmake-build-* cmake-build-*
@ -169,3 +167,7 @@ __pycache__
# IOLogger logs # IOLogger logs
*_log.csv *_log.csv
# Simulation / Native
eeprom.dat
imgui.ini

View File

@ -1,8 +0,0 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"marlinfirmware.auto-build",
"platformio.platformio-ide"
]
}

View File

@ -35,7 +35,7 @@
* *
* Advanced settings can be found in Configuration_adv.h * Advanced settings can be found in Configuration_adv.h
*/ */
#define CONFIGURATION_H_VERSION 02000903 #define CONFIGURATION_H_VERSION 02000901
//=========================================================================== //===========================================================================
//============================= Getting Started ============================= //============================= Getting Started =============================
@ -94,11 +94,6 @@
// @section machine // @section machine
// Choose the name from boards.h that matches your setup
#ifndef MOTHERBOARD
#define MOTHERBOARD BOARD_RAMPS_14_EFB
#endif
/** /**
* Select the serial port on the board to use for communication with the host. * Select the serial port on the board to use for communication with the host.
* This allows the connection of wireless adapters (for instance) to non-default port pins. * This allows the connection of wireless adapters (for instance) to non-default port pins.
@ -265,6 +260,7 @@
#define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders #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 #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder
//#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381
#if ENABLED(PARKING_EXTRUDER) #if ENABLED(PARKING_EXTRUDER)
@ -346,7 +342,6 @@
#define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 #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 DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands
//#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD //#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) #if ENABLED(GRADIENT_MIX)
//#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias //#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias
#endif #endif
@ -371,9 +366,6 @@
//#define PSU_NAME "Power Supply" //#define PSU_NAME "Power Supply"
#if ENABLED(PSU_CONTROL) #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_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_DEFAULT_OFF // Keep power off until enabled directly with M80
@ -457,7 +449,6 @@
* 67 : 500 SliceEngineering 450°C Thermistor * 67 : 500 SliceEngineering 450°C Thermistor
* 70 : 100 bq Hephestos 2 * 70 : 100 bq Hephestos 2
* 75 : 100 Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32 * 75 : 100 Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32
* 2000 : 100 Ultimachine Rambo TDK NTCG104LH104KT1 NTC100K motherboard Thermistor
* *
* Analog Thermistors - 1 pullup - Atypical, and requires changing out the 4.7 pullup for 1. * Analog Thermistors - 1 pullup - Atypical, and requires changing out the 4.7 pullup for 1.
* ------- (but gives greater accuracy and more stable PID) * ------- (but gives greater accuracy and more stable PID)
@ -481,7 +472,7 @@
* NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C. * NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
* 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
* *
* Custom/Dummy/Other Thermal Sensors * Custom/Dummy/Other Thermos
* ------ * ------
* 0 : not used * 0 : not used
* 1000 : Custom - Specify parameters in Configuration_adv.h * 1000 : Custom - Specify parameters in Configuration_adv.h
@ -503,7 +494,6 @@
#define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_PROBE 0
#define TEMP_SENSOR_CHAMBER 0 #define TEMP_SENSOR_CHAMBER 0
#define TEMP_SENSOR_COOLER 0 #define TEMP_SENSOR_COOLER 0
#define TEMP_SENSOR_BOARD 0
#define TEMP_SENSOR_REDUNDANT 0 #define TEMP_SENSOR_REDUNDANT 0
// Dummy thermistor constant temperature readings, for use with 998 and 999 // Dummy thermistor constant temperature readings, for use with 998 and 999
@ -536,11 +526,17 @@
* the print will be aborted. Whichever sensor is selected will have its normal functions disabled; i.e. selecting * the print will be aborted. Whichever sensor is selected will have its normal functions disabled; i.e. selecting
* the Bed sensor (-1) will disable bed heating/monitoring. * the Bed sensor (-1) will disable bed heating/monitoring.
* *
* For selecting source/target use: COOLER, PROBE, BOARD, CHAMBER, BED, E0, E1, E2, E3, E4, E5, E6, E7 * Use the following to select temp sensors:
* -5 : Cooler
* -4 : Probe
* -3 : not used
* -2 : Chamber
* -1 : Bed
* 0-7 : E0 through E7
*/ */
#if TEMP_SENSOR_REDUNDANT #if TEMP_SENSOR_REDUNDANT
#define TEMP_SENSOR_REDUNDANT_SOURCE E1 // The sensor that will provide the redundant reading. #define TEMP_SENSOR_REDUNDANT_SOURCE 1 // 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_TARGET 0 // 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_MAX_DIFF 10 // (°C) Temperature difference that will trigger a print abort.
#endif #endif
@ -599,8 +595,8 @@
// Set/get with gcode: M301 E[extruder number, 0-2] // Set/get with gcode: M301 E[extruder number, 0-2]
#if ENABLED(PID_PARAMS_PER_HOTEND) #if ENABLED(PID_PARAMS_PER_HOTEND)
// Specify up to one value per hotend here, according to your setup. // Specify between 1 and HOTENDS values per array.
// If there are fewer values, the last one applies to the remaining hotends. // If fewer than EXTRUDER values are provided, the last element will be repeated.
#define DEFAULT_Kp_LIST { 22.20, 22.20 } #define DEFAULT_Kp_LIST { 22.20, 22.20 }
#define DEFAULT_Ki_LIST { 1.08, 1.08 } #define DEFAULT_Ki_LIST { 1.08, 1.08 }
#define DEFAULT_Kd_LIST { 114.00, 114.00 } #define DEFAULT_Kd_LIST { 114.00, 114.00 }
@ -761,17 +757,6 @@
//#define COREZX //#define COREZX
//#define COREZY //#define COREZY
//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042 //#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
//=========================================================================== //===========================================================================
//============================== Endstop Settings =========================== //============================== Endstop Settings ===========================
@ -799,18 +784,18 @@
#define ENDSTOPPULLUPS #define ENDSTOPPULLUPS
#if DISABLED(ENDSTOPPULLUPS) #if DISABLED(ENDSTOPPULLUPS)
// Disable ENDSTOPPULLUPS to set pullups individually // 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_XMAX //#define ENDSTOPPULLUP_XMAX
//#define ENDSTOPPULLUP_YMAX //#define ENDSTOPPULLUP_YMAX
//#define ENDSTOPPULLUP_ZMAX //#define ENDSTOPPULLUP_ZMAX
//#define ENDSTOPPULLUP_IMAX //#define ENDSTOPPULLUP_IMAX
//#define ENDSTOPPULLUP_JMAX //#define ENDSTOPPULLUP_JMAX
//#define ENDSTOPPULLUP_KMAX //#define ENDSTOPPULLUP_KMAX
//#define ENDSTOPPULLUP_XMIN
//#define ENDSTOPPULLUP_YMIN
//#define ENDSTOPPULLUP_ZMIN
//#define ENDSTOPPULLUP_IMIN
//#define ENDSTOPPULLUP_JMIN
//#define ENDSTOPPULLUP_KMIN
//#define ENDSTOPPULLUP_ZMIN_PROBE //#define ENDSTOPPULLUP_ZMIN_PROBE
#endif #endif
@ -818,18 +803,18 @@
//#define ENDSTOPPULLDOWNS //#define ENDSTOPPULLDOWNS
#if DISABLED(ENDSTOPPULLDOWNS) #if DISABLED(ENDSTOPPULLDOWNS)
// Disable ENDSTOPPULLDOWNS to set pulldowns individually // 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_XMAX //#define ENDSTOPPULLDOWN_XMAX
//#define ENDSTOPPULLDOWN_YMAX //#define ENDSTOPPULLDOWN_YMAX
//#define ENDSTOPPULLDOWN_ZMAX //#define ENDSTOPPULLDOWN_ZMAX
//#define ENDSTOPPULLDOWN_IMAX //#define ENDSTOPPULLDOWN_IMAX
//#define ENDSTOPPULLDOWN_JMAX //#define ENDSTOPPULLDOWN_JMAX
//#define ENDSTOPPULLDOWN_KMAX //#define ENDSTOPPULLDOWN_KMAX
//#define ENDSTOPPULLDOWN_XMIN
//#define ENDSTOPPULLDOWN_YMIN
//#define ENDSTOPPULLDOWN_ZMIN
//#define ENDSTOPPULLDOWN_IMIN
//#define ENDSTOPPULLDOWN_JMIN
//#define ENDSTOPPULLDOWN_KMIN
//#define ENDSTOPPULLDOWN_ZMIN_PROBE //#define ENDSTOPPULLDOWN_ZMIN_PROBE
#endif #endif
@ -932,7 +917,7 @@
* Override with M92 * Override with M92
* X, Y, Z [, I [, J [, K]]], E0 [, E1[, E2...]] * X, Y, Z [, I [, J [, K]]], E0 [, E1[, E2...]]
*/ */
#define DEFAULT_AXIS_STEPS_PER_UNIT { 79, 79, 400, 415 } #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 500 }
/** /**
* Default Max Feed Rate (mm/s) * Default Max Feed Rate (mm/s)
@ -1126,7 +1111,7 @@
#endif #endif
// Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J // 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. // When the pin is defined you can use M672 to set/reset the probe sensivity.
//#define DUET_SMART_EFFECTOR //#define DUET_SMART_EFFECTOR
#if ENABLED(DUET_SMART_EFFECTOR) #if ENABLED(DUET_SMART_EFFECTOR)
#define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin #define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin
@ -1184,7 +1169,7 @@
* | [-] | * | [-] |
* O-- FRONT --+ * O-- FRONT --+
*/ */
#define NOZZLE_TO_PROBE_OFFSET { -20, 14, -1.475 } #define NOZZLE_TO_PROBE_OFFSET { -20, 13, -1.49 }
// Most probes should stay away from the edges of the bed, but // 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. // with NOZZLE_AS_PROBE this can be negative for a wider probing area.
@ -1226,15 +1211,6 @@
#endif #endif
#endif #endif
/**
* Probe Enable / Disable
* The probe only provides a triggered signal when enabled.
*/
//#define PROBE_ENABLE_DISABLE
#if ENABLED(PROBE_ENABLE_DISABLE)
//#define PROBE_ENABLE_PIN -1 // Override the default pin here
#endif
/** /**
* Multiple Probing * Multiple Probing
* *
@ -1388,7 +1364,7 @@
// Travel limits (mm) after homing, corresponding to endstop positions. // Travel limits (mm) after homing, corresponding to endstop positions.
#define X_MIN_POS -7 #define X_MIN_POS -7
#define Y_MIN_POS -17 #define Y_MIN_POS -2
#define Z_MIN_POS 0 #define Z_MIN_POS 0
#define X_MAX_POS X_BED_SIZE #define X_MAX_POS X_BED_SIZE
#define Y_MAX_POS Y_BED_SIZE #define Y_MAX_POS Y_BED_SIZE
@ -1647,13 +1623,13 @@
//========================= 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 MESH_INSET 1 // Set Mesh bounds as an inset region of the bed
#define GRID_MAX_POINTS_X 15 // Don't use more than 15 points per axis, implementation limited. #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 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_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_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500
@ -1842,7 +1818,6 @@
#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load #define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load
#if ENABLED(EEPROM_SETTINGS) #if ENABLED(EEPROM_SETTINGS)
//#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. //#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors.
//#define EEPROM_INIT_NOW // Init EEPROM on first boot after a new build.
#endif #endif
// //
@ -2066,10 +2041,10 @@
* *
* Select the language to display on the LCD. These languages are available: * Select the language to display on the LCD. These languages are available:
* *
* en, an, bg, ca, cz, da, de, el, el_CY, es, eu, fi, fr, gl, hr, hu, it, * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it,
* jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW
* *
* :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek (Greece)', 'el_CY':'Greek (Cyprus)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' } * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
*/ */
#define LCD_LANGUAGE en #define LCD_LANGUAGE en
@ -2181,7 +2156,6 @@
// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. // 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_MENU
//#define INDIVIDUAL_AXIS_HOMING_SUBMENU
// //
// SPEAKER/BUZZER // SPEAKER/BUZZER
@ -2391,11 +2365,6 @@
//#define VIKI2 //#define VIKI2
//#define miniVIKI //#define miniVIKI
//
// Alfawise Ex8 printer LCD marked as WYH L12864 COG
//
//#define WYH_L12864
// //
// MakerLab Mini Panel with graphic // MakerLab Mini Panel with graphic
// controller and SD support - https://reprap.org/wiki/Mini_panel // controller and SD support - https://reprap.org/wiki/Mini_panel
@ -2465,11 +2434,6 @@
//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel 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. //#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 // Factory display for Creality CR-10
// https://www.aliexpress.com/item/32833148327.html // https://www.aliexpress.com/item/32833148327.html
@ -2573,39 +2537,12 @@
// DGUS Touch Display with DWIN OS. (Choose one.) // DGUS Touch Display with DWIN OS. (Choose one.)
// ORIGIN : https://www.aliexpress.com/item/32993409517.html // ORIGIN : https://www.aliexpress.com/item/32993409517.html
// FYSETC : https://www.aliexpress.com/item/32961471929.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_ORIGIN
//#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_FYSETC
//#define DGUS_LCD_UI_HIPRECY //#define DGUS_LCD_UI_HIPRECY
//#define DGUS_LCD_UI_MKS //#define DGUS_LCD_UI_MKS
//#define DGUS_LCD_UI_RELOADED
#if ENABLED(DGUS_LCD_UI_MKS) #if ENABLED(DGUS_LCD_UI_MKS)
#define USE_MKS_GREEN_UI #define USE_MKS_GREEN_UI
#endif #endif
@ -2662,32 +2599,32 @@
*/ */
// //
// 480x320, 3.5", SPI Display with Rotary Encoder from MKS // 480x320, 3.5", SPI Display From MKS
// Usually paired with MKS Robin Nano V2 & V3 // Normally used in MKS Robin Nano V2
// //
//#define MKS_TS35_V2_0 //#define MKS_TS35_V2_0
// //
// 320x240, 2.4", FSMC Display From MKS // 320x240, 2.4", FSMC Display From MKS
// Usually paired with MKS Robin Nano V1.2 // Normally used in MKS Robin Nano V1.2
// //
//#define MKS_ROBIN_TFT24 //#define MKS_ROBIN_TFT24
// //
// 320x240, 2.8", FSMC Display From MKS // 320x240, 2.8", FSMC Display From MKS
// Usually paired with MKS Robin Nano V1.2 // Normally used in MKS Robin Nano V1.2
// //
//#define MKS_ROBIN_TFT28 //#define MKS_ROBIN_TFT28
// //
// 320x240, 3.2", FSMC Display From MKS // 320x240, 3.2", FSMC Display From MKS
// Usually paired with MKS Robin Nano V1.2 // Normally used in MKS Robin Nano V1.2
// //
//#define MKS_ROBIN_TFT32 //#define MKS_ROBIN_TFT32
// //
// 480x320, 3.5", FSMC Display From MKS // 480x320, 3.5", FSMC Display From MKS
// Usually paired with MKS Robin Nano V1.2 // Normally used in MKS Robin Nano V1.2
// //
//#define MKS_ROBIN_TFT35 //#define MKS_ROBIN_TFT35
@ -2698,7 +2635,7 @@
// //
// 320x240, 3.2", FSMC Display From MKS // 320x240, 3.2", FSMC Display From MKS
// Usually paired with MKS Robin // Normally used in MKS Robin
// //
//#define MKS_ROBIN_TFT_V1_1R //#define MKS_ROBIN_TFT_V1_1R
@ -2728,15 +2665,10 @@
//#define ANET_ET5_TFT35 //#define ANET_ET5_TFT35
// //
// 1024x600, 7", RGB Stock Display with Rotary Encoder from BIQU-BX // 1024x600, 7", RGB Stock Display from BIQU-BX
// //
//#define BIQU_BX_TFT70 //#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 // Generic TFT with detailed options
// //
@ -2753,7 +2685,6 @@
//#define TFT_RES_320x240 //#define TFT_RES_320x240
//#define TFT_RES_480x272 //#define TFT_RES_480x272
//#define TFT_RES_480x320 //#define TFT_RES_480x320
//#define TFT_RES_1024x600
#endif #endif
/** /**
@ -2791,11 +2722,7 @@
// //
// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. // Ender-3 v2 OEM display. A DWIN display with Rotary Encoder.
// //
//#define DWIN_CREALITY_LCD // Creality UI //#define DWIN_CREALITY_LCD
//#define DWIN_CREALITY_LCD_ENHANCED // Enhanced UI
//#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 // Touch Screen Settings
@ -2805,8 +2732,6 @@
#define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens
#define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
//#define TOUCH_IDLE_SLEEP 300 // (secs) Turn off the TFT backlight if set (5mn)
#define TOUCH_SCREEN_CALIBRATION #define TOUCH_SCREEN_CALIBRATION
//#define TOUCH_CALIBRATION_X 12316 //#define TOUCH_CALIBRATION_X 12316
@ -2831,11 +2756,6 @@
//#define REPRAPWORLD_KEYPAD //#define REPRAPWORLD_KEYPAD
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press //#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
//============================================================================= //=============================================================================
//=============================== Extra Features ============================== //=============================== Extra Features ==============================
//============================================================================= //=============================================================================
@ -2846,6 +2766,9 @@
// :[1,2,3,4,5,6,7,8] // :[1,2,3,4,5,6,7,8]
//#define NUM_M106_FANS 1 //#define NUM_M106_FANS 1
// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino
//#define FAST_PWM_FAN
// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
// which is not as annoying as with the hardware PWM. On the other hand, if this frequency // which is not as annoying as with the hardware PWM. On the other hand, if this frequency
// is too low, you should also increment SOFT_PWM_SCALE. // is too low, you should also increment SOFT_PWM_SCALE.
@ -2963,9 +2886,9 @@
* Set this manually if there are extra servos needing manual control. * Set this manually if there are extra servos needing manual control.
* Set to 0 to turn off servo support. * 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 3 // Servo index starts with 0 for M280 command
// (ms) Delay before the next move will start, to give the servo time to reach its target angle. // (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. // 300ms is a good value but you can try less delay.
// If the servo can't reach the requested position, increase it. // If the servo can't reach the requested position, increase it.
#define SERVO_DELAY { 300 } #define SERVO_DELAY { 300 }
@ -2975,6 +2898,3 @@
// Edit servo angles with M281 and save to EEPROM with M500 // Edit servo angles with M281 and save to EEPROM with M500
//#define EDITABLE_SERVO_ANGLES //#define EDITABLE_SERVO_ANGLES
// Disable servo with M282 to reduce power consumption, noise, and heat when not in use
//#define SERVO_DETACH_GCODE

View File

@ -30,7 +30,7 @@
* *
* Basic settings can be found in Configuration.h * Basic settings can be found in Configuration.h
*/ */
#define CONFIGURATION_ADV_H_VERSION 02000903 #define CONFIGURATION_ADV_H_VERSION 02000901
//=========================================================================== //===========================================================================
//============================= Thermal Settings ============================ //============================= Thermal Settings ============================
@ -125,12 +125,6 @@
#define PROBE_BETA 3950 // Beta value #define PROBE_BETA 3950 // Beta value
#endif #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
#endif
#if TEMP_SENSOR_REDUNDANT == 1000 #if TEMP_SENSOR_REDUNDANT == 1000
#define REDUNDANT_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor #define REDUNDANT_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor
#define REDUNDANT_RESISTANCE_25C_OHMS 100000 // Resistance at 25C #define REDUNDANT_RESISTANCE_25C_OHMS 100000 // Resistance at 25C
@ -142,20 +136,11 @@
* FORCE_HW_SPI: Ignore SCK/MOSI/MISO pins and just use the CS pin & default SPI bus. * FORCE_HW_SPI: Ignore SCK/MOSI/MISO pins and just use the CS pin & default SPI bus.
* MAX31865_WIRES: Set the number of wires for the probe connected to a MAX31865 board, 2-4. Default: 2 * MAX31865_WIRES: Set the number of wires for the probe connected to a MAX31865 board, 2-4. Default: 2
* MAX31865_50HZ: Enable 50Hz filter instead of the default 60Hz. * MAX31865_50HZ: Enable 50Hz filter instead of the default 60Hz.
* MAX31865_USE_READ_ERROR_DETECTION: Detects random read errors from value spikes (a 20°C difference in less than 1sec)
* MAX31865_USE_AUTO_MODE: Faster and more frequent reads than 1-shot, but bias voltage always on, slightly affecting RTD temperature.
* MAX31865_MIN_SAMPLING_TIME_MSEC: in 1-shot mode, the minimum time between subsequent reads. This reduces the effect of bias voltage by leaving the sensor unpowered for longer intervals.
* MAX31865_WIRE_OHMS: In 2-wire configurations, manually set the wire resistance for more accurate readings
*/ */
//#define TEMP_SENSOR_FORCE_HW_SPI //#define TEMP_SENSOR_FORCE_HW_SPI
//#define MAX31865_SENSOR_WIRES_0 2 //#define MAX31865_SENSOR_WIRES_0 2
//#define MAX31865_SENSOR_WIRES_1 2 //#define MAX31865_SENSOR_WIRES_1 2
//#define MAX31865_50HZ_FILTER //#define MAX31865_50HZ_FILTER
//#define MAX31865_USE_READ_ERROR_DETECTION
//#define MAX31865_USE_AUTO_MODE
//#define MAX31865_MIN_SAMPLING_TIME_MSEC 100
//#define MAX31865_WIRE_OHMS_0 0.0f
//#define MAX31865_WIRE_OHMS_1 0.0f
/** /**
* Hephestos 2 24V heated bed upgrade kit. * Hephestos 2 24V heated bed upgrade kit.
@ -195,8 +180,7 @@
//#define CHAMBER_FAN // Enable a fan on the chamber //#define CHAMBER_FAN // Enable a fan on the chamber
#if ENABLED(CHAMBER_FAN) #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.
#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 #if CHAMBER_FAN_MODE == 0
#define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255)
#elif CHAMBER_FAN_MODE == 1 #elif CHAMBER_FAN_MODE == 1
@ -240,18 +224,6 @@
#endif #endif
#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
#endif
// //
// Laser Coolant Flow Meter // Laser Coolant Flow Meter
// //
@ -339,14 +311,14 @@
* Thermal Protection parameters for the laser cooler. * Thermal Protection parameters for the laser cooler.
*/ */
#if ENABLED(THERMAL_PROTECTION_COOLER) #if ENABLED(THERMAL_PROTECTION_COOLER)
#define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds #define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds
#define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius #define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius
/** /**
* Laser cooling watch settings (M143/M193). * Laser cooling watch settings (M143/M193).
*/ */
#define WATCH_COOLER_TEMP_PERIOD 60 // Seconds #define WATCH_COOLER_TEMP_PERIOD 60 // Seconds
#define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius #define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius
#endif #endif
#if ENABLED(PIDTEMP) #if ENABLED(PIDTEMP)
@ -424,7 +396,7 @@
*/ */
#define AUTOTEMP #define AUTOTEMP
#if ENABLED(AUTOTEMP) #if ENABLED(AUTOTEMP)
#define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0) #define AUTOTEMP_OLDWEIGHT 0.98
// Turn on AUTOTEMP on M104/M109 by default using proportions set here // Turn on AUTOTEMP on M104/M109 by default using proportions set here
//#define AUTOTEMP_PROPORTIONAL //#define AUTOTEMP_PROPORTIONAL
#if ENABLED(AUTOTEMP_PROPORTIONAL) #if ENABLED(AUTOTEMP_PROPORTIONAL)
@ -508,20 +480,16 @@
*/ */
//#define USE_CONTROLLER_FAN //#define USE_CONTROLLER_FAN
#if ENABLED(USE_CONTROLLER_FAN) #if ENABLED(USE_CONTROLLER_FAN)
//#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the 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_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 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_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_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_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 #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors
//#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings
// 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) #if ENABLED(CONTROLLER_FAN_EDITABLE)
#define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu
#endif #endif
#endif #endif
@ -549,21 +517,18 @@
//#define FAN_MAX_PWM 128 //#define FAN_MAX_PWM 128
/** /**
* Fan Fast PWM * FAST PWM FAN Settings
* *
* Combinations of PWM Modes, prescale values and TOP resolutions are used internally * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h)
* to produce a frequency as close as possible to the desired frequency. * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a
* frequency as close as possible to the desired frequency.
* *
* FAST_PWM_FAN_FREQUENCY * FAST_PWM_FAN_FREQUENCY [undefined by default]
* Set this to your desired frequency. * Set this to your desired frequency.
* For AVR, if left undefined this defaults to F = F_CPU/(2*255*1) * If left undefined this defaults to F = F_CPU/(2*255*1)
* i.e., F = 31.4kHz on 16MHz microcontrollers or F = 39.2kHz on 20MHz microcontrollers. * i.e., F = 31.4kHz on 16MHz microcontrollers or F = 39.2kHz on 20MHz microcontrollers.
* For non AVR, if left undefined this defaults to F = 1Khz. * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required
* This F value is only to protect the hardware from an absence of configuration
* and not to complete it when users are not aware that the frequency must be specifically set to support the target board.
*
* NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior.
* Setting very high frequencies can damage your hardware.
* *
* USE_OCR2A_AS_TOP [undefined by default] * USE_OCR2A_AS_TOP [undefined by default]
* Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2:
@ -573,17 +538,9 @@
* PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) * 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. * 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
#if ENABLED(FAST_PWM_FAN) #if ENABLED(FAST_PWM_FAN)
//#define FAST_PWM_FAN_FREQUENCY 31400 // Define here to override the defaults below //#define FAST_PWM_FAN_FREQUENCY 31400
//#define USE_OCR2A_AS_TOP //#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 #endif
/** /**
@ -624,40 +581,6 @@
#define COOLER_AUTO_FAN_TEMPERATURE 18 #define COOLER_AUTO_FAN_TEMPERATURE 18
#define COOLER_AUTO_FAN_SPEED 255 #define COOLER_AUTO_FAN_SPEED 255
/**
* Hotend Cooling Fans tachometers
*
* Define one or more tachometer pins to enable fan speed
* monitoring, and reporting of fan speeds with M123.
*
* NOTE: Only works with fans up to 7000 RPM.
*/
//#define FOURWIRES_FANS // Needed with AUTO_FAN when 4-wire PWM fans are installed
//#define E0_FAN_TACHO_PIN -1
//#define E0_FAN_TACHO_PULLUP
//#define E0_FAN_TACHO_PULLDOWN
//#define E1_FAN_TACHO_PIN -1
//#define E1_FAN_TACHO_PULLUP
//#define E1_FAN_TACHO_PULLDOWN
//#define E2_FAN_TACHO_PIN -1
//#define E2_FAN_TACHO_PULLUP
//#define E2_FAN_TACHO_PULLDOWN
//#define E3_FAN_TACHO_PIN -1
//#define E3_FAN_TACHO_PULLUP
//#define E3_FAN_TACHO_PULLDOWN
//#define E4_FAN_TACHO_PIN -1
//#define E4_FAN_TACHO_PULLUP
//#define E4_FAN_TACHO_PULLDOWN
//#define E5_FAN_TACHO_PIN -1
//#define E5_FAN_TACHO_PULLUP
//#define E5_FAN_TACHO_PULLDOWN
//#define E6_FAN_TACHO_PIN -1
//#define E6_FAN_TACHO_PULLUP
//#define E6_FAN_TACHO_PULLDOWN
//#define E7_FAN_TACHO_PIN -1
//#define E7_FAN_TACHO_PULLUP
//#define E7_FAN_TACHO_PULLDOWN
/** /**
* Part-Cooling Fan Multiplexer * Part-Cooling Fan Multiplexer
* *
@ -908,14 +831,12 @@
//#define BLTOUCH_FORCE_MODE_SET //#define BLTOUCH_FORCE_MODE_SET
/** /**
* Enable "HIGH SPEED" option for probing. * Use "HIGH SPEED" mode for probing.
* Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. * 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 * 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. * 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 //#define BLTOUCH_HS_MODE
// Safety: Enable voltage mode settings in the LCD menu. // Safety: Enable voltage mode settings in the LCD menu.
//#define BLTOUCH_LCD_VOLTAGE_MENU //#define BLTOUCH_LCD_VOLTAGE_MENU
@ -1253,7 +1174,7 @@
// @section lcd // @section lcd
#if ANY(HAS_LCD_MENU, EXTENSIBLE_UI, HAS_DWIN_E3V2) #if EITHER(IS_ULTIPANEL, EXTENSIBLE_UI)
#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 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 #define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines
#if IS_ULTIPANEL #if IS_ULTIPANEL
@ -1292,22 +1213,6 @@
// Set a convenient position to do the calibration (probing point and nozzle/bed-distance) // Set a convenient position to do the calibration (probing point and nozzle/bed-distance)
//#define PROBE_OFFSET_WIZARD_XY_POS { X_CENTER, Y_CENTER } //#define PROBE_OFFSET_WIZARD_XY_POS { X_CENTER, Y_CENTER }
#endif #endif
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Add a calibration procedure in the Probe Offsets menu
// to compensate for twist in the X-axis.
//#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.
*/
#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
#endif
#endif
#endif #endif
// Include a page of printer information in the LCD Main Menu // Include a page of printer information in the LCD Main Menu
@ -1319,6 +1224,9 @@
// BACK menu items keep the highlight at the top // BACK menu items keep the highlight at the top
//#define TURBO_BACK_MENU_ITEM //#define TURBO_BACK_MENU_ITEM
// Add a mute option to the LCD menu
//#define SOUND_MENU_ITEM
/** /**
* LED Control Menu * LED Control Menu
* Add LED Control to the LCD menu * Add LED Control to the LCD menu
@ -1350,11 +1258,7 @@
#endif // HAS_LCD_MENU #endif // HAS_LCD_MENU
#if ANY(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED, DWIN_CREALITY_LCD_JYERSUI) #if HAS_DISPLAY
//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
#endif
#if EITHER(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED)
// The timeout (in ms) to return to the status screen from sub-menus // The timeout (in ms) to return to the status screen from sub-menus
//#define LCD_TIMEOUT_TO_STATUS 15000 //#define LCD_TIMEOUT_TO_STATUS 15000
@ -1378,14 +1282,11 @@
//#define LCD_SHOW_E_TOTAL //#define LCD_SHOW_E_TOTAL
#endif #endif
// LCD Print Progress options #if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL, EXTENSIBLE_UI)
#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) //#define SHOW_REMAINING_TIME // Display estimated time to completion
#if CAN_SHOW_REMAINING_TIME #if ENABLED(SHOW_REMAINING_TIME)
//#define SHOW_REMAINING_TIME // Display estimated time to completion //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation
#if ENABLED(SHOW_REMAINING_TIME) //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining 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 #endif
#if EITHER(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI) #if EITHER(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI)
@ -1606,14 +1507,6 @@
#define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
#endif #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' // Add an optimized binary file transfer mode, initiated with 'M28 B1'
//#define BINARY_FILE_TRANSFER //#define BINARY_FILE_TRANSFER
@ -1661,10 +1554,16 @@
* printing performance versus fast display updates. * printing performance versus fast display updates.
*/ */
#if HAS_MARLINUI_U8GLIB #if HAS_MARLINUI_U8GLIB
// Show SD percentage next to the progress bar
//#define DOGM_SD_PERCENT
// Save many cycles by drawing a hollow frame or no frame on the Info Screen // Save many cycles by drawing a hollow frame or no frame on the Info Screen
//#define XYZ_NO_FRAME //#define XYZ_NO_FRAME
#define XYZ_HOLLOW_FRAME #define XYZ_HOLLOW_FRAME
// Enable to save many cycles by drawing a hollow frame on Menu Screens
#define MENU_HOLLOW_FRAME
// A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM.
// Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese.
//#define USE_BIG_EDIT_FONT //#define USE_BIG_EDIT_FONT
@ -1673,6 +1572,9 @@
// Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese.
//#define USE_SMALL_INFOFONT //#define USE_SMALL_INFOFONT
// Swap the CW/CCW indicators in the graphics overlay
//#define OVERLAY_GFX_REVERSE
/** /**
* ST7920-based LCDs can emulate a 16 x 4 character display using * ST7920-based LCDs can emulate a 16 x 4 character display using
* the ST7920 character-generator for very fast screen updates. * the ST7920 character-generator for very fast screen updates.
@ -1685,7 +1587,7 @@
* Set STATUS_EXPIRE_SECONDS to zero to never clear the status. * Set STATUS_EXPIRE_SECONDS to zero to never clear the status.
* This will prevent position updates from being displayed. * This will prevent position updates from being displayed.
*/ */
#if IS_U8GLIB_ST7920 #if ENABLED(U8GLIB_ST7920)
// Enable this option and reduce the value to optimize screen updates. // 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. // The normal delay is 10µs. Use the lowest value that still gives a reliable display.
//#define DOGM_SPI_DELAY_US 5 //#define DOGM_SPI_DELAY_US 5
@ -1714,7 +1616,7 @@
//#define STATUS_ALT_FAN_BITMAP // Use the alternative fan 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_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar //#define STATUS_HEAT_PERCENT // Show heating in a progress bar
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of PROGMEM. //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of PROGMEM.
// Frivolous Game Options // Frivolous Game Options
//#define MARLIN_BRICKOUT //#define MARLIN_BRICKOUT
@ -1724,17 +1626,6 @@
#endif // HAS_MARLINUI_U8GLIB #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 // Additional options for DGUS / DWIN displays
// //
@ -1800,7 +1691,7 @@
// //
// Specify additional languages for the UI. Default specified by LCD_LANGUAGE. // Specify additional languages for the UI. Default specified by LCD_LANGUAGE.
// //
#if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) #if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE)
//#define LCD_LANGUAGE_2 fr //#define LCD_LANGUAGE_2 fr
//#define LCD_LANGUAGE_3 de //#define LCD_LANGUAGE_3 de
//#define LCD_LANGUAGE_4 es //#define LCD_LANGUAGE_4 es
@ -1819,7 +1710,7 @@
//#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272)
//#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272)
//#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480)
//#define LCD_LULZBOT_CLCD_UI // LulzBot Color LCD UI //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI
//#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480)
//#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815 //#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815
//#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813 //#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813
@ -1830,8 +1721,8 @@
//#define TOUCH_UI_800x480 //#define TOUCH_UI_800x480
// Mappings for boards with a standard RepRapDiscount Display connector // Mappings for boards with a standard RepRapDiscount Display connector
//#define AO_EXP1_PINMAP // LulzBot CLCD UI EXP1 mapping //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping
//#define AO_EXP2_PINMAP // LulzBot CLCD UI EXP2 mapping //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping
//#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping
//#define S6_TFT_PINMAP // FYSETC S6 pin mapping //#define S6_TFT_PINMAP // FYSETC S6 pin mapping
//#define F6_TFT_PINMAP // FYSETC F6 pin mapping //#define F6_TFT_PINMAP // FYSETC F6 pin mapping
@ -1942,7 +1833,7 @@
* *
* Warning: Does not respect endstops! * Warning: Does not respect endstops!
*/ */
#define BABYSTEPPING //#define BABYSTEPPING
#if ENABLED(BABYSTEPPING) #if ENABLED(BABYSTEPPING)
//#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR
//#define BABYSTEP_WITHOUT_HOMING //#define BABYSTEP_WITHOUT_HOMING
@ -1963,7 +1854,7 @@
#endif #endif
#endif #endif
#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28
//#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping
#if ENABLED(BABYSTEP_ZPROBE_OFFSET) #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
@ -1995,7 +1886,6 @@
#define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed #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 LA_DEBUG // If enabled, this will generate debug information output over USB.
//#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration //#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 #endif
// @section leveling // @section leveling
@ -2071,69 +1961,59 @@
/** /**
* Thermal Probe Compensation * Thermal Probe Compensation
* * Probe measurements are adjusted to compensate for temperature distortion.
* Adjust probe measurements to compensate for distortion associated with the temperature * Use G76 to calibrate this feature. Use M871 to set values manually.
* of the probe, bed, and/or hotend. * For a more detailed explanation of the process see G76_M871.cpp.
* Use G76 to automatically calibrate this feature for probe and bed temperatures.
* (Extruder temperature/offset values must be calibrated manually.)
* Use M871 to set temperature/offset values manually.
* For more details see https://marlinfw.org/docs/features/probe_temp_compensation.html
*/ */
//#define PTC_PROBE // Compensate based on probe temperature #if HAS_BED_PROBE && TEMP_SENSOR_PROBE && TEMP_SENSOR_BED
//#define PTC_BED // Compensate based on bed temperature // Enable thermal first layer compensation using bed and probe temperatures
//#define PTC_HOTEND // Compensate based on hotend temperature #define PROBE_TEMP_COMPENSATION
#if ANY(PTC_PROBE, PTC_BED, PTC_HOTEND) // Add additional compensation depending on hotend temperature
/** // Note: this values cannot be calibrated and have to be set manually
* If the probe is outside the defined range, use linear extrapolation with the closest #if ENABLED(PROBE_TEMP_COMPENSATION)
* 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 // Park position to wait for probe cooldown
#define PTC_PARK_POS { 0, 0, 100 } #define PTC_PARK_POS { 0, 0, 100 }
// Probe position to probe and wait for probe to reach target temperature // 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 } #define PTC_PROBE_POS { 90, 100 }
// The temperature the probe should be at while taking measurements during // Enable additional compensation using hotend temperature
// bed temperature calibration. // Note: this values cannot be calibrated automatically but have to be set manually
#define PTC_PROBE_TEMP 30 // (°C) //#define USE_TEMP_EXT_COMPENSATION
// Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START
// (e.g., 30), in steps of PTC_SAMPLE_RES (e.g., 5) with PTC_SAMPLE_COUNT (e.g., 10) samples.
//#define PTC_SAMPLE_START 30 // (°C)
//#define PTC_SAMPLE_RES 5 // (°C)
//#define PTC_SAMPLE_COUNT 10
// Bed temperature calibration builds a similar table.
//#define BTC_SAMPLE_START 60 // (°C)
//#define BTC_SAMPLE_RES 5 // (°C)
//#define BTC_SAMPLE_COUNT 10
// The temperature the probe should be at while taking measurements during bed temperature
// calibration.
//#define BTC_PROBE_TEMP 30 // (°C)
// Height above Z=0.0 to raise the nozzle. Lowering this can help the probe to heat faster. // 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). // Note: the Z=0.0 offset is determined by the probe offset which can be set using M851.
#define PTC_PROBE_HEATING_OFFSET 0.5 //#define PTC_PROBE_HEATING_OFFSET 0.5
// Height to raise the Z-probe between heating and taking the next measurement. Some probes
// may fail to untrigger if they have been triggered for a long time, which can be solved by
// increasing the height the probe is raised to.
//#define PTC_PROBE_RAISE 15
// If the probe is outside of the defined range, use linear extrapolation using the closest
// point and the PTC_LINEAR_EXTRAPOLATION'th next point. E.g. if set to 4 it will use data[0]
// and data[4] to perform linear extrapolation for values below PTC_SAMPLE_START.
//#define PTC_LINEAR_EXTRAPOLATION 4
#endif #endif
#endif // PTC_PROBE || PTC_BED || PTC_HOTEND #endif
// @section extras // @section extras
@ -2145,23 +2025,20 @@
// //
// G2/G3 Arc Support // G2/G3 Arc Support
// //
#define ARC_SUPPORT // Requires ~3226 bytes #define ARC_SUPPORT // Disable this feature to save ~3226 bytes
#if ENABLED(ARC_SUPPORT) #if ENABLED(ARC_SUPPORT)
#define MIN_ARC_SEGMENT_MM 0.1 // (mm) Minimum length of each arc segment #define MM_PER_ARC_SEGMENT 1 // (mm) Length (or minimum length) of each arc segment
#define MAX_ARC_SEGMENT_MM 1.0 // (mm) Maximum length of each arc segment //#define ARC_SEGMENTS_PER_R 1 // Max segment length, MM_PER = Min
#define MIN_CIRCLE_SEGMENTS 72 // Minimum number of segments in a complete circle #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle
//#define ARC_SEGMENTS_PER_SEC 50 // Use the feedrate to choose the segment length //#define ARC_SEGMENTS_PER_SEC 50 // Use feedrate to choose segment length (with MM_PER_ARC_SEGMENT as the minimum)
#define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections
//#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles //#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 CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes
//#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure
#endif #endif
// G5 Bézier Curve Support with XYZE destination and IJPQ offsets // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes.
//#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes //#define BEZIER_CURVE_SUPPORT
#if EITHER(ARC_SUPPORT, BEZIER_CURVE_SUPPORT)
//#define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes
#endif
/** /**
* Direct Stepping * Direct Stepping
@ -2406,7 +2283,6 @@
*/ */
//#define EVENT_GCODE_TOOLCHANGE_T0 "G28 A\nG1 A0" // Extra G-code to run while executing tool-change command T0 //#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_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. * Tool Sensors detect when tools have been picked up or dropped.
@ -2429,7 +2305,7 @@
// Longer prime to clean out a SINGLENOZZLE // Longer prime to clean out a SINGLENOZZLE
#define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length #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_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. #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/min) Retract before cooling for less stringing, better wipe, etc.
// Cool after prime to reduce stringing // Cool after prime to reduce stringing
#define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip #define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip
@ -2489,7 +2365,7 @@
// This short retract is done immediately, before parking the nozzle. // 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_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_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate.
#define FILAMENT_CHANGE_UNLOAD_LENGTH 95 // (mm) The length of filament for a complete unload. #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 Bowden, the full length of the tube and nozzle.
// For direct drive, the full length of the nozzle. // For direct drive, the full length of the nozzle.
// Set to 0 for manual unloading. // Set to 0 for manual unloading.
@ -2519,8 +2395,6 @@
#define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. #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 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 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 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 HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change
@ -2690,7 +2564,6 @@
#define X_RSENSE 0.11 #define X_RSENSE 0.11
#define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ... #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_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 #endif
#if AXIS_IS_TMC(X2) #if AXIS_IS_TMC(X2)
@ -2700,7 +2573,6 @@
#define X2_RSENSE 0.11 #define X2_RSENSE 0.11
#define X2_CHAIN_POS -1 #define X2_CHAIN_POS -1
//#define X2_INTERPOLATE true //#define X2_INTERPOLATE true
//#define X2_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(Y) #if AXIS_IS_TMC(Y)
@ -2710,7 +2582,6 @@
#define Y_RSENSE 0.11 #define Y_RSENSE 0.11
#define Y_CHAIN_POS -1 #define Y_CHAIN_POS -1
//#define Y_INTERPOLATE true //#define Y_INTERPOLATE true
//#define Y_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(Y2) #if AXIS_IS_TMC(Y2)
@ -2720,7 +2591,6 @@
#define Y2_RSENSE 0.11 #define Y2_RSENSE 0.11
#define Y2_CHAIN_POS -1 #define Y2_CHAIN_POS -1
//#define Y2_INTERPOLATE true //#define Y2_INTERPOLATE true
//#define Y2_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
@ -2730,7 +2600,6 @@
#define Z_RSENSE 0.11 #define Z_RSENSE 0.11
#define Z_CHAIN_POS -1 #define Z_CHAIN_POS -1
//#define Z_INTERPOLATE true //#define Z_INTERPOLATE true
//#define Z_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
@ -2740,7 +2609,6 @@
#define Z2_RSENSE 0.11 #define Z2_RSENSE 0.11
#define Z2_CHAIN_POS -1 #define Z2_CHAIN_POS -1
//#define Z2_INTERPOLATE true //#define Z2_INTERPOLATE true
//#define Z2_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(Z3) #if AXIS_IS_TMC(Z3)
@ -2750,7 +2618,6 @@
#define Z3_RSENSE 0.11 #define Z3_RSENSE 0.11
#define Z3_CHAIN_POS -1 #define Z3_CHAIN_POS -1
//#define Z3_INTERPOLATE true //#define Z3_INTERPOLATE true
//#define Z3_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(Z4) #if AXIS_IS_TMC(Z4)
@ -2760,7 +2627,6 @@
#define Z4_RSENSE 0.11 #define Z4_RSENSE 0.11
#define Z4_CHAIN_POS -1 #define Z4_CHAIN_POS -1
//#define Z4_INTERPOLATE true //#define Z4_INTERPOLATE true
//#define Z4_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(I) #if AXIS_IS_TMC(I)
@ -2770,7 +2636,6 @@
#define I_RSENSE 0.11 #define I_RSENSE 0.11
#define I_CHAIN_POS -1 #define I_CHAIN_POS -1
//#define I_INTERPOLATE true //#define I_INTERPOLATE true
//#define I_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(J) #if AXIS_IS_TMC(J)
@ -2780,7 +2645,6 @@
#define J_RSENSE 0.11 #define J_RSENSE 0.11
#define J_CHAIN_POS -1 #define J_CHAIN_POS -1
//#define J_INTERPOLATE true //#define J_INTERPOLATE true
//#define J_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(K) #if AXIS_IS_TMC(K)
@ -2790,7 +2654,6 @@
#define K_RSENSE 0.11 #define K_RSENSE 0.11
#define K_CHAIN_POS -1 #define K_CHAIN_POS -1
//#define K_INTERPOLATE true //#define K_INTERPOLATE true
//#define K_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E0) #if AXIS_IS_TMC(E0)
@ -2799,7 +2662,6 @@
#define E0_RSENSE 0.11 #define E0_RSENSE 0.11
#define E0_CHAIN_POS -1 #define E0_CHAIN_POS -1
//#define E0_INTERPOLATE true //#define E0_INTERPOLATE true
//#define E0_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E1) #if AXIS_IS_TMC(E1)
@ -2808,7 +2670,6 @@
#define E1_RSENSE 0.11 #define E1_RSENSE 0.11
#define E1_CHAIN_POS -1 #define E1_CHAIN_POS -1
//#define E1_INTERPOLATE true //#define E1_INTERPOLATE true
//#define E1_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E2) #if AXIS_IS_TMC(E2)
@ -2817,7 +2678,6 @@
#define E2_RSENSE 0.11 #define E2_RSENSE 0.11
#define E2_CHAIN_POS -1 #define E2_CHAIN_POS -1
//#define E2_INTERPOLATE true //#define E2_INTERPOLATE true
//#define E2_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E3) #if AXIS_IS_TMC(E3)
@ -2826,7 +2686,6 @@
#define E3_RSENSE 0.11 #define E3_RSENSE 0.11
#define E3_CHAIN_POS -1 #define E3_CHAIN_POS -1
//#define E3_INTERPOLATE true //#define E3_INTERPOLATE true
//#define E3_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E4) #if AXIS_IS_TMC(E4)
@ -2835,7 +2694,6 @@
#define E4_RSENSE 0.11 #define E4_RSENSE 0.11
#define E4_CHAIN_POS -1 #define E4_CHAIN_POS -1
//#define E4_INTERPOLATE true //#define E4_INTERPOLATE true
//#define E4_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E5) #if AXIS_IS_TMC(E5)
@ -2844,7 +2702,6 @@
#define E5_RSENSE 0.11 #define E5_RSENSE 0.11
#define E5_CHAIN_POS -1 #define E5_CHAIN_POS -1
//#define E5_INTERPOLATE true //#define E5_INTERPOLATE true
//#define E5_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E6) #if AXIS_IS_TMC(E6)
@ -2853,7 +2710,6 @@
#define E6_RSENSE 0.11 #define E6_RSENSE 0.11
#define E6_CHAIN_POS -1 #define E6_CHAIN_POS -1
//#define E6_INTERPOLATE true //#define E6_INTERPOLATE true
//#define E6_HOLD_MULTIPLIER 0.5
#endif #endif
#if AXIS_IS_TMC(E7) #if AXIS_IS_TMC(E7)
@ -2862,7 +2718,6 @@
#define E7_RSENSE 0.11 #define E7_RSENSE 0.11
#define E7_CHAIN_POS -1 #define E7_CHAIN_POS -1
//#define E7_INTERPOLATE true //#define E7_INTERPOLATE true
//#define E7_HOLD_MULTIPLIER 0.5
#endif #endif
/** /**
@ -2975,9 +2830,6 @@
//#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z //#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z
//#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z //#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z
//#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z //#define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z
//#define CHOPPER_TIMING_I CHOPPER_TIMING
//#define CHOPPER_TIMING_J CHOPPER_TIMING
//#define CHOPPER_TIMING_K CHOPPER_TIMING
//#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below) //#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below)
//#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E //#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E
//#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E //#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E
@ -3441,13 +3293,11 @@
//#define SPINDLE_FEATURE //#define SPINDLE_FEATURE
//#define LASER_FEATURE //#define LASER_FEATURE
#if EITHER(SPINDLE_FEATURE, 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_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH
#define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power
#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_USE_PWM // Enable if your controller supports setting the speed/power #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC)
#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 and LPC)
#endif
//#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11 //#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11
#if ENABLED(AIR_EVACUATION) #if ENABLED(AIR_EVACUATION)
@ -3503,21 +3353,17 @@
* Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE * 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 * 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_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage #define SPEED_POWER_MIN 5000 // (RPM)
#define SPEED_POWER_MIN 5000 // (RPM) #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 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)
#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
#endif
#else #else
#if ENABLED(SPINDLE_LASER_USE_PWM) #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
#define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage #define SPEED_POWER_MIN 0 // (%) 0-100
#define SPEED_POWER_MIN 0 // (%) 0-100 #define SPEED_POWER_MAX 100 // (%) 0-100
#define SPEED_POWER_MAX 100 // (%) 0-100 #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
#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 the minimum and maximum test pulse time values for a laser test fire function
#define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu #define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu
@ -3710,12 +3556,6 @@
*/ */
//#define CNC_COORDINATE_SYSTEMS //#define CNC_COORDINATE_SYSTEMS
/**
* Auto-report fan speed with M123 S<seconds>
* Requires fans with tachometer pins
*/
//#define AUTO_REPORT_FANS
/** /**
* Auto-report temperatures with M155 S<seconds> * Auto-report temperatures with M155 S<seconds>
*/ */
@ -3957,10 +3797,8 @@
*/ */
#define HOST_ACTION_COMMANDS #define HOST_ACTION_COMMANDS
#if ENABLED(HOST_ACTION_COMMANDS) #if ENABLED(HOST_ACTION_COMMANDS)
//#define HOST_PAUSE_M76
#define HOST_PROMPT_SUPPORT #define HOST_PROMPT_SUPPORT
//#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start //#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 #endif
/** /**
@ -4048,7 +3886,7 @@
*/ */
#define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. #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. // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise.
#define I2CPE_ERR_ROLLING_AVERAGE #define I2CPE_ERR_ROLLING_AVERAGE
#endif // I2C_POSITION_ENCODERS #endif // I2C_POSITION_ENCODERS
@ -4314,14 +4152,6 @@
// Enable Marlin dev mode which adds some special commands // Enable Marlin dev mode which adds some special commands
//#define MARLIN_DEV_MODE //#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
#endif
/** /**
* Postmortem Debugging captures misbehavior and outputs the CPU status and backtrace to serial. * Postmortem Debugging captures misbehavior and outputs the CPU status and backtrace to serial.
* When running in the debugger it will break for debugging. This is useful to help understand * When running in the debugger it will break for debugging. This is useful to help understand
@ -4334,6 +4164,3 @@
*/ */
//#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 //#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

View File

@ -110,7 +110,7 @@ LIQUID_TWI2 ?= 0
WIRE ?= 0 WIRE ?= 0
# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h) # This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h)
# Disabling this (and SPEAKER) saves approximately 350 bytes of memory. # Disabling this (and SPEAKER) saves approximatively 350 bytes of memory.
TONE ?= 1 TONE ?= 1
# This defines if U8GLIB is needed (may require RELOC_WORKAROUND) # This defines if U8GLIB is needed (may require RELOC_WORKAROUND)
@ -191,134 +191,6 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1034)
# RAMPS Derivatives - ATmega1280, ATmega2560 # RAMPS Derivatives - ATmega1280, ATmega2560
# #
# 3Drag Controller
else ifeq ($(HARDWARE_MOTHERBOARD),1100)
# Velleman K8200 Controller (derived from 3Drag Controller)
else ifeq ($(HARDWARE_MOTHERBOARD),1101)
# Velleman K8400 Controller (derived from 3Drag Controller)
else ifeq ($(HARDWARE_MOTHERBOARD),1102)
# Velleman K8600 Controller (Vertex Nano)
else ifeq ($(HARDWARE_MOTHERBOARD),1103)
# Velleman K8800 Controller (Vertex Delta)
else ifeq ($(HARDWARE_MOTHERBOARD),1104)
# 2PrintBeta BAM&DICE with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1105)
# 2PrintBeta BAM&DICE Due with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
# MKS BASE v1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
# MKS BASE v1.4 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
# MKS BASE v1.5 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
# MKS BASE v1.6 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
# MKS GEN v1.3 or 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
# MKS GEN L
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
# BigTreeTech or BIQU KFB2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
# zrib V2.0 (Chinese RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
# zrib V5.2 (Chinese RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
# Felix 2.0+ Electronics Board (RAMPS like)
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
# Invent-A-Part RigidBoard
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
# Invent-A-Part RigidBoard V2
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
# Sainsmart 2-in-1 board
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
# Ultimaker
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
MCU ?= atmega1280
PROG_MCU ?= m1280
# Azteeg X3
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
# Azteeg X3 Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
# Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
# Raise3D N series Rumba derivative
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
# Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
# Formbot T-Rex 2 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
# Formbot T-Rex 3
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
# Formbot Raptor
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
# Formbot Raptor 2
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
# bq ZUM Mega 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
# MakeBoard Mini v2.1.2 by MicroMake
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
# TriGorilla Anycubic version 1.3-based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
# ... Ver 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
# ... Rev 1.1 (new servo pin order)
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
# Creality: Ender-4, CR-8
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
# Creality: CR10S, CR20, CR-X
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
# Dagoma F5
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
# FYSETC F6 1.3
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
# FYSETC F6 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
# Wanhao Duplicator i3 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
# VORON Design
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
# Tronxy TRONXY-V3-1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
# Z-Bolt X Series
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
# TT OSCAR
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
# Overlord/Overlord Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
# ADIMLab Gantry v1
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
# ADIMLab Gantry v2
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
# BIQU Tango V1
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
# MKS GEN L V2
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
# MKS GEN L V2.1
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
# Copymaster 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
# Ortur 4
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
# Tenlog D3 Hero IDEX printer
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
# 3Drag Controller # 3Drag Controller
else ifeq ($(HARDWARE_MOTHERBOARD),1100) else ifeq ($(HARDWARE_MOTHERBOARD),1100)
# Velleman K8200 Controller (derived from 3Drag Controller) # Velleman K8200 Controller (derived from 3Drag Controller)
@ -486,38 +358,20 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1311)
else ifeq ($(HARDWARE_MOTHERBOARD),1312) else ifeq ($(HARDWARE_MOTHERBOARD),1312)
# Mega controller # Mega controller
else ifeq ($(HARDWARE_MOTHERBOARD),1313) else ifeq ($(HARDWARE_MOTHERBOARD),1313)
# Geeetech GT2560 Rev A
else ifeq ($(HARDWARE_MOTHERBOARD),1314)
# Geeetech GT2560 Rev A+ (with auto level probe)
else ifeq ($(HARDWARE_MOTHERBOARD),1315)
# Geeetech GT2560 Rev B
else ifeq ($(HARDWARE_MOTHERBOARD),1316)
# Geeetech GT2560 Rev B for A10(M/T/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1317)
# Geeetech GT2560 Rev B for A10(M/T/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1318)
# Geeetech GT2560 Rev B for Mecreator2 # Geeetech GT2560 Rev B for Mecreator2
else ifeq ($(HARDWARE_MOTHERBOARD),1319) else ifeq ($(HARDWARE_MOTHERBOARD),1314)
# Geeetech GT2560 Rev B for A20(M/T/D) # Geeetech GT2560 Rev. A
else ifeq ($(HARDWARE_MOTHERBOARD),1320) else ifeq ($(HARDWARE_MOTHERBOARD),1315)
# Geeetech GT2560 Rev. A+ (with auto level probe)
else ifeq ($(HARDWARE_MOTHERBOARD),1316)
# Geeetech GT2560 Rev B for A10(M/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1317)
# Geeetech GT2560 Rev B for A20(M/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1318)
# Einstart retrofit # Einstart retrofit
else ifeq ($(HARDWARE_MOTHERBOARD),1321) else ifeq ($(HARDWARE_MOTHERBOARD),1319)
# Wanhao 0ne+ i3 Mini # Wanhao 0ne+ i3 Mini
else ifeq ($(HARDWARE_MOTHERBOARD),1322) else ifeq ($(HARDWARE_MOTHERBOARD),1320)
# Leapfrog Xeed 2015
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
# PICA Shield (original version)
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
# PICA Shield (rev C or later)
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
# Intamsys 4.0 (Funmat HT)
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
# Malyan M180 Mainboard Version 2 (no display function, direct gcode only)
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
# Geeetech GT2560 Rev B for A20(M/T/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
# Mega controller & Protoneer CNC Shield V3.00
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
# #
# ATmega1281, ATmega2561 # ATmega1281, ATmega2561
@ -591,11 +445,6 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1510)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p PROG_MCU ?= m1284p
# ZoneStar ZMIB V2
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p
PROG_MCU ?= m1284p
# #
# Other ATmega644P, ATmega644, ATmega1284P # Other ATmega644P, ATmega644, ATmega1284P

View File

@ -28,7 +28,7 @@
/** /**
* Marlin release version identifier * Marlin release version identifier
*/ */
//#define SHORT_BUILD_VERSION "2.0.9.3" //#define SHORT_BUILD_VERSION "2.0.9.1"
/** /**
* Verbose version identifier which should contain a reference to the location * Verbose version identifier which should contain a reference to the location
@ -41,7 +41,7 @@
* here we define this default string as the date where the latest release * here we define this default string as the date where the latest release
* version was tagged. * version was tagged.
*/ */
//#define STRING_DISTRIBUTION_DATE "2021-12-25" //#define STRING_DISTRIBUTION_DATE "2021-06-27"
/** /**
* Defines a generic printer name to be output to the LCD after booting Marlin. * Defines a generic printer name to be output to the LCD after booting Marlin.

View File

@ -35,31 +35,12 @@
// Public Variables // Public Variables
// ------------------------ // ------------------------
// Don't initialize/override variable (which would happen in .init4) //uint8_t MCUSR;
uint8_t reset_reason __attribute__((section(".noinit")));
// ------------------------ // ------------------------
// Public functions // 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 HAL_save_reset_reason() {
#if ENABLED(OPTIBOOT_RESET_REASON)
__asm__ __volatile__(
A("STS %0, r2")
: "=m"(reset_reason)
);
#else
reset_reason = MCUSR;
#endif
// Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop
MCUSR = 0;
wdt_disable();
}
void HAL_init() { void HAL_init() {
// Init Servo Pins // Init Servo Pins
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)

View File

@ -39,19 +39,6 @@
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <avr/io.h> #include <avr/io.h>
//
// 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 #ifndef pgm_read_ptr
// Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for // 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 // Windows Subsystem for Linux on Windows 10 as of 10/18/2019
@ -91,7 +78,7 @@ typedef int8_t pin_t;
// Public Variables // Public Variables
// ------------------------ // ------------------------
extern uint8_t reset_reason; //extern uint8_t MCUSR;
// Serial ports // Serial ports
#ifdef USBCON #ifdef USBCON
@ -152,19 +139,21 @@ void HAL_init();
//void _delay_ms(const int delay); //void _delay_ms(const int delay);
inline void HAL_clear_reset_source() { } inline void HAL_clear_reset_source() { MCUSR = 0; }
inline uint8_t HAL_get_reset_source() { return reset_reason; } inline uint8_t HAL_get_reset_source() { return MCUSR; }
void HAL_reboot(); void HAL_reboot();
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
extern "C" int freeMemory(); extern "C" int freeMemory();
#pragma GCC diagnostic pop #if GCC_VERSION <= 50000
#pragma GCC diagnostic pop
#endif
// ADC // ADC
#ifdef DIDR2 #ifdef DIDR2
@ -221,7 +210,7 @@ void set_pwm_frequency(const pin_t pin, int f_desired);
/** /**
* set_pwm_duty * set_pwm_duty
* Set the PWM duty cycle of the provided pin to the provided value * Sets the PWM duty cycle of the provided pin to the provided value
* Optionally allows inverting the duty cycle [default = false] * Optionally allows inverting the duty cycle [default = false]
* Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255]
*/ */

View File

@ -34,9 +34,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
void spiBegin() { void spiBegin() {
#if PIN_EXISTS(SD_SS) OUT_WRITE(SD_SS_PIN, HIGH);
OUT_WRITE(SD_SS_PIN, HIGH);
#endif
SET_OUTPUT(SD_SCK_PIN); SET_OUTPUT(SD_SCK_PIN);
SET_INPUT(SD_MISO_PIN); SET_INPUT(SD_MISO_PIN);
SET_OUTPUT(SD_MOSI_PIN); SET_OUTPUT(SD_MOSI_PIN);
@ -76,8 +74,7 @@ void spiBegin() {
#elif defined(PRR0) #elif defined(PRR0)
PRR0 PRR0
#endif #endif
, PRSPI , PRSPI);
);
SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);

View File

@ -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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <SPI.h>
using MarlinSPI = SPIClass;

View File

@ -217,7 +217,7 @@
#endif #endif
enum { HasEmergencyParser = Cfg::EMERGENCYPARSER }; enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } static inline 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 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 buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }

View File

@ -22,10 +22,11 @@
#ifdef __AVR__ #ifdef __AVR__
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#include "HAL.h"
#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM #if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
#include "HAL.h"
struct Timer { struct Timer {
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per 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* OCRnQ[3]; // max 3 OCR registers per timer
@ -54,8 +55,8 @@ Timer get_pwm_timer(const pin_t pin) {
case TIMER1A: case TIMER1B: case TIMER1A: case TIMER1B:
#endif #endif
break; break;
#if HAS_TCCR2 || defined(TCCR2A) #if defined(TCCR2) || defined(TCCR2A)
#if HAS_TCCR2 #ifdef TCCR2
case TIMER2: { case TIMER2: {
Timer timer = { Timer timer = {
/*TCCRnQ*/ { &TCCR2, nullptr, nullptr }, /*TCCRnQ*/ { &TCCR2, nullptr, nullptr },
@ -152,7 +153,7 @@ Timer get_pwm_timer(const pin_t pin) {
void set_pwm_frequency(const pin_t pin, int f_desired) { void set_pwm_frequency(const pin_t pin, int f_desired) {
Timer timer = get_pwm_timer(pin); Timer timer = get_pwm_timer(pin);
if (timer.n == 0) return; // Don't proceed if protected timer or not recognized if (timer.n == 0) return; // Don't proceed if protected timer or not recognised
uint16_t size; uint16_t size;
if (timer.n == 2) size = 255; else size = 65535; if (timer.n == 2) size = 255; else size = 65535;
@ -200,10 +201,16 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
res = res_temp_fast; res = res_temp_fast;
j = i; j = i;
// Set the Wave Generation Mode to FAST PWM // Set the Wave Generation Mode to FAST PWM
if (timer.n == 2) if (timer.n == 2) {
wgm = TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM); wgm = (
else #if ENABLED(USE_OCR2A_AS_TOP)
wgm = WGM_FAST_PWM_ICRn; WGM2_FAST_PWM_OCR2A
#else
WGM2_FAST_PWM
#endif
);
}
else wgm = WGM_FAST_PWM_ICRn;
} }
// If PHASE CORRECT values are closes to desired f // If PHASE CORRECT values are closes to desired f
else if (f_phase_diff < f_diff) { else if (f_phase_diff < f_diff) {
@ -211,10 +218,16 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
res = res_temp_phase_correct; res = res_temp_phase_correct;
j = i; j = i;
// Set the Wave Generation Mode to PWM PHASE CORRECT // Set the Wave Generation Mode to PWM PHASE CORRECT
if (timer.n == 2) if (timer.n == 2) {
wgm = TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_FAST_PWM); wgm = (
else #if ENABLED(USE_OCR2A_AS_TOP)
wgm = WGM_PWM_PC_ICRn; WGM2_PWM_PC_OCR2A
#else
WGM2_PWM_PC
#endif
);
}
else wgm = WGM_PWM_PC_ICRn;
} }
} }
} }
@ -222,39 +235,48 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
_SET_CSn(timer.TCCRnQ, j); _SET_CSn(timer.TCCRnQ, j);
if (timer.n == 2) { if (timer.n == 2) {
TERN_(USE_OCR2A_AS_TOP, _SET_OCRnQ(timer.OCRnQ, 0, res)); // Set OCR2A value (TOP) = res #if ENABLED(USE_OCR2A_AS_TOP)
_SET_OCRnQ(timer.OCRnQ, 0, res); // Set OCR2A value (TOP) = res
#endif
} }
else else
_SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res _SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res
} }
#endif // NEEDS_HARDWARE_PWM
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
#if NEEDS_HARDWARE_PWM // 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 {
Timer timer = get_pwm_timer(pin);
if (timer.n == 0) return; // Don't proceed if protected timer or not recognised
// Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted)
_SET_COMnQ(timer.TCCRnQ, (timer.q
#ifdef TCCR2
+ (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro
#endif
), COM_CLEAR_SET + invert
);
// If v is 0 or v_size (max), digitalWrite to LOW or HIGH. uint16_t top;
// Note that digitalWrite also disables pwm output for us (sets COM bit to 0) if (timer.n == 2) { // if TIMER2
if (v == 0) top = (
digitalWrite(pin, invert); #if ENABLED(USE_OCR2A_AS_TOP)
else if (v == v_size) *timer.OCRnQ[0] // top = OCR2A
digitalWrite(pin, !invert); #else
else { 255 // top = 0xFF (max)
Timer timer = get_pwm_timer(pin); #endif
if (timer.n == 0) return; // Don't proceed if protected timer or not recognized );
// Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted)
_SET_COMnQ(timer.TCCRnQ, timer.q TERN_(HAS_TCCR2, + (timer.q == 2)), COM_CLEAR_SET + invert); // COM20 is on bit 4 of TCCR2, so +1 for q==2
const uint16_t top = timer.n == 2 ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn;
_SET_OCRnQ(timer.OCRnQ, timer.q, uint16_t(uint32_t(v) * top / v_size)); // Scale 8/16-bit v to top value
} }
else
top = *timer.ICRn; // top = ICRn
#else _SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value
}
analogWrite(pin, v);
UNUSED(v_size);
UNUSED(invert);
#endif
} }
#endif // NEEDS_HARDWARE_PWM
#endif // __AVR__ #endif // __AVR__

View File

@ -267,11 +267,11 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP
//SERIAL_ECHOLNPGM("Timer 5 Settings:"); //SERIAL_ECHOLNPGM("Timer 5 Settings:");
//SERIAL_ECHOLNPGM(" Prescaler=", prescaler); //SERIAL_ECHOLNPAIR(" Prescaler=", prescaler);
//SERIAL_ECHOLNPGM(" TOP=", ICR5); //SERIAL_ECHOLNPAIR(" TOP=", ICR5);
//SERIAL_ECHOLNPGM(" OCR5A=", OCR5A); //SERIAL_ECHOLNPAIR(" OCR5A=", OCR5A);
//SERIAL_ECHOLNPGM(" OCR5B=", OCR5B); //SERIAL_ECHOLNPAIR(" OCR5B=", OCR5B);
//SERIAL_ECHOLNPGM(" OCR5C=", OCR5C); //SERIAL_ECHOLNPAIR(" OCR5C=", OCR5C);
} }
else { else {
// Restore the default for Timer 5 // Restore the default for Timer 5

View File

@ -211,32 +211,32 @@ enum ClockSource2 : char {
// Set Clock Select bits // Set Clock Select bits
// Ex: SET_CS3(PRESCALER_64); // 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_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_CS0(V) _SET_CS(0,V)
#define _SET_CS1(V) _SET_CS(1,V) #define _SET_CS1(V) _SET_CS(1,V)
#ifdef TCCR2
#define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20))
#else
#define _SET_CS2(V) _SET_CS(2,V)
#endif
#define _SET_CS3(V) _SET_CS(3,V) #define _SET_CS3(V) _SET_CS(3,V)
#define _SET_CS4(V) _SET_CS(4,V) #define _SET_CS4(V) _SET_CS(4,V)
#define _SET_CS5(V) _SET_CS(5,V) #define _SET_CS5(V) _SET_CS(5,V)
#define SET_CS0(V) _SET_CS0(CS_##V) #define SET_CS0(V) _SET_CS0(CS_##V)
#define SET_CS1(V) _SET_CS1(CS_##V) #define SET_CS1(V) _SET_CS1(CS_##V)
#ifdef TCCR2
#if HAS_TCCR2
#define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20))
#define SET_CS2(V) _SET_CS2(CS2_##V) #define SET_CS2(V) _SET_CS2(CS2_##V)
#else #else
#define _SET_CS2(V) _SET_CS(2,V)
#define SET_CS2(V) _SET_CS2(CS_##V) #define SET_CS2(V) _SET_CS2(CS_##V)
#endif #endif
#define SET_CS3(V) _SET_CS3(CS_##V) #define SET_CS3(V) _SET_CS3(CS_##V)
#define SET_CS4(V) _SET_CS4(CS_##V) #define SET_CS4(V) _SET_CS4(CS_##V)
#define SET_CS5(V) _SET_CS5(CS_##V) #define SET_CS5(V) _SET_CS5(CS_##V)
#define SET_CS(T,V) SET_CS##T(V) #define SET_CS(T,V) SET_CS##T(V)
// Runtime (see set_pwm_frequency) // Runtime (see set_pwm_frequency)
#define _SET_CSn(TCCRnQ, V) (*(TCCRnQ)[1] = (*(TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0)) #define _SET_CSn(TCCRnQ, V) do{ \
(*(TCCRnQ)[1] = (*(TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0)); \
}while(0)
// Set Compare Mode bits // Set Compare Mode bits
// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET); // Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET);
@ -247,15 +247,21 @@ enum ClockSource2 : char {
#define SET_COMC(T,V) SET_COM(T,C,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) #define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0)
// Runtime (see set_pwm_duty) // Runtime (see set_pwm_duty)
#define _SET_COMnQ(TCCRnQ, Q, V) (*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q)))) #define _SET_COMnQ(TCCRnQ, Q, V) do{ \
(*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q)))); \
}while(0)
// Set OCRnQ register // Set OCRnQ register
// Runtime (see set_pwm_duty): // Runtime (see set_pwm_duty):
#define _SET_OCRnQ(OCRnQ, Q, V) (*(OCRnQ)[Q] = int(V) & 0xFFFF) #define _SET_OCRnQ(OCRnQ, Q, V) do{ \
(*(OCRnQ)[(Q)] = (0x0000) | (int(V) & 0xFFFF)); \
}while(0)
// Set ICRn register (one per timer) // Set ICRn register (one per timer)
// Runtime (see set_pwm_frequency) // Runtime (see set_pwm_frequency)
#define _SET_ICRn(ICRn, V) (*(ICRn) = int(V) & 0xFFFF) #define _SET_ICRn(ICRn, V) do{ \
(*(ICRn) = (0x0000) | (int(V) & 0xFFFF)); \
}while(0)
// Set Noise Canceler bit // Set Noise Canceler bit
// Ex: SET_ICNC(2,1) // Ex: SET_ICNC(2,1)
@ -278,7 +284,7 @@ enum ClockSource2 : char {
* PWM availability macros * PWM availability macros
*/ */
// Determine which hardware PWMs are already in use // Determine which harware 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) #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) #if PIN_EXISTS(CONTROLLER_FAN)
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN) #define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)

View File

@ -28,14 +28,14 @@
/** /**
* Checks for FAST PWM * Checks for FAST PWM
*/ */
#if ALL(FAST_PWM_FAN, USE_OCR2A_AS_TOP, HAS_TCCR2) #if ENABLED(FAST_PWM_FAN) && (ENABLED(USE_OCR2A_AS_TOP) && defined(TCCR2))
#error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2" #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2"
#endif #endif
/** /**
* Sanity checks for Spindle / Laser PWM * Sanity checks for Spindle / Laser PWM
*/ */
#if ENABLED(SPINDLE_LASER_USE_PWM) #if ENABLED(SPINDLE_LASER_PWM)
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3) #include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) #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." #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
@ -43,7 +43,7 @@
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
#endif #endif
#elif defined(SPINDLE_LASER_FREQUENCY) #elif defined(SPINDLE_LASER_FREQUENCY)
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM." #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_PWM."
#endif #endif
/** /**

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -102,7 +99,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
return true; \ return true; \
} else return false } else return false
#define ABTEST(N) defined(TCCR##N##A) && defined(COM##N##A1)
/** /**
* Print a pin's PWM status. * Print a pin's PWM status.
@ -113,7 +110,7 @@ static bool pwm_status(uint8_t pin) {
switch (digitalPinToTimer_DEBUG(pin)) { switch (digitalPinToTimer_DEBUG(pin)) {
#if ABTEST(0) #if defined(TCCR0A) && defined(COM0A1)
#ifdef TIMER0A #ifdef TIMER0A
#if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
PWM_CASE(0, A); PWM_CASE(0, A);
@ -122,20 +119,20 @@ static bool pwm_status(uint8_t pin) {
PWM_CASE(0, B); PWM_CASE(0, B);
#endif #endif
#if ABTEST(1) #if defined(TCCR1A) && defined(COM1A1)
PWM_CASE(1, A); PWM_CASE(1, A);
PWM_CASE(1, B); PWM_CASE(1, B);
#if defined(COM1C1) && defined(TIMER1C) #if defined(COM1C1) && defined(TIMER1C)
PWM_CASE(1, C); PWM_CASE(1, C);
#endif #endif
#endif #endif
#if ABTEST(2) #if defined(TCCR2A) && defined(COM2A1)
PWM_CASE(2, A); PWM_CASE(2, A);
PWM_CASE(2, B); PWM_CASE(2, B);
#endif #endif
#if ABTEST(3) #if defined(TCCR3A) && defined(COM3A1)
PWM_CASE(3, A); PWM_CASE(3, A);
PWM_CASE(3, B); PWM_CASE(3, B);
#ifdef COM3C1 #ifdef COM3C1
@ -149,7 +146,7 @@ static bool pwm_status(uint8_t pin) {
PWM_CASE(4, C); PWM_CASE(4, C);
#endif #endif
#if ABTEST(5) #if defined(TCCR5A) && defined(COM5A1)
PWM_CASE(5, A); PWM_CASE(5, A);
PWM_CASE(5, B); PWM_CASE(5, B);
PWM_CASE(5, C); PWM_CASE(5, C);
@ -166,16 +163,16 @@ static bool pwm_status(uint8_t pin) {
const volatile uint8_t* const PWM_other[][3] PROGMEM = { const volatile uint8_t* const PWM_other[][3] PROGMEM = {
{ &TCCR0A, &TCCR0B, &TIMSK0 }, { &TCCR0A, &TCCR0B, &TIMSK0 },
{ &TCCR1A, &TCCR1B, &TIMSK1 }, { &TCCR1A, &TCCR1B, &TIMSK1 },
#if ABTEST(2) #if defined(TCCR2A) && defined(COM2A1)
{ &TCCR2A, &TCCR2B, &TIMSK2 }, { &TCCR2A, &TCCR2B, &TIMSK2 },
#endif #endif
#if ABTEST(3) #if defined(TCCR3A) && defined(COM3A1)
{ &TCCR3A, &TCCR3B, &TIMSK3 }, { &TCCR3A, &TCCR3B, &TIMSK3 },
#endif #endif
#ifdef TCCR4A #ifdef TCCR4A
{ &TCCR4A, &TCCR4B, &TIMSK4 }, { &TCCR4A, &TCCR4B, &TIMSK4 },
#endif #endif
#if ABTEST(5) #if defined(TCCR5A) && defined(COM5A1)
{ &TCCR5A, &TCCR5B, &TIMSK5 }, { &TCCR5A, &TCCR5B, &TIMSK5 },
#endif #endif
}; };
@ -195,11 +192,11 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
{ (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 }, { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 },
#endif #endif
#if ABTEST(2) #if defined(TCCR2A) && defined(COM2A1)
{ &OCR2A, &OCR2B, 0 }, { &OCR2A, &OCR2B, 0 },
#endif #endif
#if ABTEST(3) #if defined(TCCR3A) && defined(COM3A1)
#ifdef COM3C1 #ifdef COM3C1
{ (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C }, { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C },
#else #else
@ -211,7 +208,7 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
{ (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C }, { (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C },
#endif #endif
#if ABTEST(5) #if defined(TCCR5A) && defined(COM5A1)
{ (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C }, { (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C },
#endif #endif
}; };
@ -238,9 +235,9 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin");
inline void com_print(const uint8_t N, const uint8_t Z) { inline void com_print(const uint8_t N, const uint8_t Z) {
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
SERIAL_ECHOPGM(" COM", AS_DIGIT(N)); SERIAL_ECHOPAIR(" COM", AS_CHAR('0' + N));
SERIAL_CHAR(Z); SERIAL_CHAR(Z);
SERIAL_ECHOPGM(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03)); SERIAL_ECHOPAIR(": ", 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 void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
@ -250,7 +247,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1)))); uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1); if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
SERIAL_ECHOPGM(" TIMER", AS_DIGIT(T)); SERIAL_ECHOPAIR(" TIMER", AS_CHAR(T + '0'));
SERIAL_CHAR(L); SERIAL_CHAR(L);
SERIAL_ECHO_SP(3); SERIAL_ECHO_SP(3);
@ -262,14 +259,14 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A'); const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A');
PWM_PRINT(*OCRVAL16); PWM_PRINT(*OCRVAL16);
} }
SERIAL_ECHOPGM(" WGM: ", WGM); SERIAL_ECHOPAIR(" WGM: ", WGM);
com_print(T,L); com_print(T,L);
SERIAL_ECHOPGM(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) )); SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "A: ", *TCCRA); SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "A: ", *TCCRA);
SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "B: ", *TCCRB); SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "B: ", *TCCRB);
const uint8_t *TMSK = (uint8_t*)TIMSK(T); const uint8_t *TMSK = (uint8_t*)TIMSK(T);
SERIAL_ECHOPGM(" TIMSK", AS_DIGIT(T), ": ", *TMSK); SERIAL_ECHOPAIR(" TIMSK", AS_CHAR(T + '0'), ": ", *TMSK);
const uint8_t OCIE = L - 'A' + 1; const uint8_t OCIE = L - 'A' + 1;
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); } if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
@ -281,7 +278,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
static void pwm_details(uint8_t pin) { static void pwm_details(uint8_t pin) {
switch (digitalPinToTimer_DEBUG(pin)) { switch (digitalPinToTimer_DEBUG(pin)) {
#if ABTEST(0) #if defined(TCCR0A) && defined(COM0A1)
#ifdef TIMER0A #ifdef TIMER0A
#if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
case TIMER0A: timer_prefix(0, 'A', 3); break; case TIMER0A: timer_prefix(0, 'A', 3); break;
@ -290,7 +287,7 @@ static void pwm_details(uint8_t pin) {
case TIMER0B: timer_prefix(0, 'B', 3); break; case TIMER0B: timer_prefix(0, 'B', 3); break;
#endif #endif
#if ABTEST(1) #if defined(TCCR1A) && defined(COM1A1)
case TIMER1A: timer_prefix(1, 'A', 4); break; case TIMER1A: timer_prefix(1, 'A', 4); break;
case TIMER1B: timer_prefix(1, 'B', 4); break; case TIMER1B: timer_prefix(1, 'B', 4); break;
#if defined(COM1C1) && defined(TIMER1C) #if defined(COM1C1) && defined(TIMER1C)
@ -298,12 +295,12 @@ static void pwm_details(uint8_t pin) {
#endif #endif
#endif #endif
#if ABTEST(2) #if defined(TCCR2A) && defined(COM2A1)
case TIMER2A: timer_prefix(2, 'A', 3); break; case TIMER2A: timer_prefix(2, 'A', 3); break;
case TIMER2B: timer_prefix(2, 'B', 3); break; case TIMER2B: timer_prefix(2, 'B', 3); break;
#endif #endif
#if ABTEST(3) #if defined(TCCR3A) && defined(COM3A1)
case TIMER3A: timer_prefix(3, 'A', 4); break; case TIMER3A: timer_prefix(3, 'A', 4); break;
case TIMER3B: timer_prefix(3, 'B', 4); break; case TIMER3B: timer_prefix(3, 'B', 4); break;
#ifdef COM3C1 #ifdef COM3C1
@ -317,7 +314,7 @@ static void pwm_details(uint8_t pin) {
case TIMER4C: timer_prefix(4, 'C', 4); break; case TIMER4C: timer_prefix(4, 'C', 4); break;
#endif #endif
#if ABTEST(5) #if defined(TCCR5A) && defined(COM5A1)
case TIMER5A: timer_prefix(5, 'A', 4); break; case TIMER5A: timer_prefix(5, 'A', 4); break;
case TIMER5B: timer_prefix(5, 'B', 4); break; case TIMER5B: timer_prefix(5, 'B', 4); break;
case TIMER5C: timer_prefix(5, 'C', 4); break; case TIMER5C: timer_prefix(5, 'C', 4); break;
@ -351,6 +348,7 @@ static void pwm_details(uint8_t pin) {
#endif #endif
} // pwm_details } // pwm_details
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs #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 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); const uint8_t port = digitalPinToPort_DEBUG(pin);
@ -395,6 +393,3 @@ static void pwm_details(uint8_t pin) {
#endif #endif
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) #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

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or

View File

@ -34,14 +34,14 @@ typedef uint16_t hal_timer_t;
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz #define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
#ifndef MF_TIMER_STEP #ifndef STEP_TIMER_NUM
#define MF_TIMER_STEP 1 #define STEP_TIMER_NUM 1
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP 0 #define TEMP_TIMER_NUM 0
#endif #endif
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) #define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
@ -64,7 +64,7 @@ typedef uint16_t hal_timer_t;
FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) { FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: case STEP_TIMER_NUM:
// waveform generation = 0100 = CTC // waveform generation = 0100 = CTC
SET_WGM(1, CTC_OCRnA); SET_WGM(1, CTC_OCRnA);
@ -84,7 +84,7 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
TCNT1 = 0; TCNT1 = 0;
break; break;
case MF_TIMER_TEMP: case TEMP_TIMER_NUM:
// Use timer0 for temperature measurement // Use timer0 for temperature measurement
// Interleave temperature interrupt with millies interrupt // Interleave temperature interrupt with millies interrupt
OCR0B = 128; OCR0B = 128;
@ -109,8 +109,8 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
* (otherwise, characters will be lost due to UART overflow). * (otherwise, characters will be lost due to UART overflow).
* Then: Stepper, Endstops, Temperature, and -finally- all others. * Then: Stepper, Endstops, Temperature, and -finally- all others.
*/ */
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(TIMER_NUM)
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(TIMER_NUM)
/* 18 cycles maximum latency */ /* 18 cycles maximum latency */
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR

View File

@ -64,8 +64,8 @@
#include <U8glib-HAL.h> #include <U8glib-HAL.h>
static uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock; uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
static volatile uint8_t *u8g_outData, *u8g_outClock; volatile uint8_t *u8g_outData, *u8g_outClock;
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) { static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
u8g_outData = portOutputRegister(digitalPinToPort(dataPin)); u8g_outData = portOutputRegister(digitalPinToPort(dataPin));

View File

@ -144,11 +144,6 @@ inline void HAL_adc_init() {}//todo
void HAL_adc_start_conversion(const uint8_t ch); void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result(); uint16_t HAL_adc_get_result();
//
// PWM
//
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
// //
// Pin Map // Pin Map
// //
@ -173,14 +168,16 @@ void HAL_init();
// //
void _delay_ms(const int delay); void _delay_ms(const int delay);
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
int freeMemory(); int freeMemory();
#pragma GCC diagnostic pop #if GCC_VERSION <= 50000
#pragma GCC diagnostic pop
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -437,7 +437,7 @@
} while (--todo); } while (--todo);
} }
// Pointers to generic functions for block transfers // Pointers to generic functions for block tranfers
static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
@ -594,14 +594,18 @@
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS); SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
SPI_Enable(SPI0); SPI_Enable(SPI0);
SET_OUTPUT(DAC0_SYNC_PIN); SET_OUTPUT(DAC0_SYNC);
#if HAS_MULTI_EXTRUDER #if HAS_MULTI_EXTRUDER
OUT_WRITE(DAC1_SYNC_PIN, HIGH); SET_OUTPUT(DAC1_SYNC);
WRITE(DAC1_SYNC, HIGH);
#endif #endif
WRITE(DAC0_SYNC_PIN, HIGH); SET_OUTPUT(SPI_EEPROM1_CS);
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH); SET_OUTPUT(SPI_EEPROM2_CS);
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH); SET_OUTPUT(SPI_FLASH_CS);
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); WRITE(DAC0_SYNC, HIGH);
WRITE(SPI_EEPROM1_CS, HIGH);
WRITE(SPI_EEPROM2_CS, HIGH);
WRITE(SPI_FLASH_CS, HIGH);
WRITE(SD_SS_PIN, HIGH); WRITE(SD_SS_PIN, HIGH);
OUT_WRITE(SDSS, LOW); OUT_WRITE(SDSS, LOW);

View File

@ -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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <SPI.h>
using MarlinSPI = SPIClass;

View File

@ -118,7 +118,7 @@ public:
static size_t write(const uint8_t c); static size_t write(const uint8_t c);
static void flushTX(); static void flushTX();
static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } static inline 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 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 buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }

View File

@ -41,7 +41,7 @@ extern "C" {
int udi_cdc_getc(); int udi_cdc_getc();
bool udi_cdc_is_tx_ready(); bool udi_cdc_is_tx_ready();
int udi_cdc_putc(int value); int udi_cdc_putc(int value);
} };
// Pending character // Pending character
static int pending_char = -1; static int pending_char = -1;

View File

@ -38,17 +38,17 @@ volatile static int32_t toggles;
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) {
tone_pin = _pin; tone_pin = _pin;
toggles = 2 * frequency * duration / 1000; toggles = 2 * frequency * duration / 1000;
HAL_timer_start(MF_TIMER_TONE, 2 * frequency); HAL_timer_start(TONE_TIMER_NUM, 2 * frequency);
} }
void noTone(const pin_t _pin) { void noTone(const pin_t _pin) {
HAL_timer_disable_interrupt(MF_TIMER_TONE); HAL_timer_disable_interrupt(TONE_TIMER_NUM);
extDigitalWrite(_pin, LOW); extDigitalWrite(_pin, LOW);
} }
HAL_TONE_TIMER_ISR() { HAL_TONE_TIMER_ISR() {
static uint8_t pin_state = 0; static uint8_t pin_state = 0;
HAL_timer_isr_prologue(MF_TIMER_TONE); HAL_timer_isr_prologue(TONE_TIMER_NUM);
if (toggles) { if (toggles) {
toggles--; toggles--;

View File

@ -20,6 +20,7 @@
* *
*/ */
/** /**
* Based on u8g_com_msp430_hw_spi.c * Based on u8g_com_msp430_hw_spi.c
* *

View File

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if IS_U8GLIB_ST7920 #if ENABLED(U8GLIB_ST7920)
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
#include "../../shared/Delay.h" #include "../../shared/Delay.h"
@ -182,5 +182,5 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
} }
#endif // LIGHTWEIGHT_UI #endif // LIGHTWEIGHT_UI
#endif // IS_U8GLIB_ST7920 #endif // U8GLIB_ST7920
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View File

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920 #if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#include "u8g_com_HAL_DUE_sw_spi_shared.h" #include "u8g_com_HAL_DUE_sw_spi_shared.h"
@ -141,5 +141,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
return 1; return 1;
} }
#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920 #endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View File

@ -200,9 +200,9 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i])); pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM PageWrite ", page); DEBUG_ECHOLNPAIR("EEPROM PageWrite ", page);
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash); DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0)); DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0));
DEBUG_FLUSH(); DEBUG_FLUSH();
// Get the page relative to the start of the EFC controller, and the EFC controller to use // Get the page relative to the start of the EFC controller, and the EFC controller to use
@ -246,7 +246,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Unlock failure for page ", page); DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ", page);
return false; return false;
} }
@ -271,7 +271,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Write failure for page ", page); DEBUG_ECHOLNPAIR("EEPROM Write failure for page ", page);
return false; return false;
} }
@ -287,7 +287,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
#ifdef EE_EMU_DEBUG #ifdef EE_EMU_DEBUG
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Verify Write failure for page ", page); DEBUG_ECHOLNPAIR("EEPROM Verify Write failure for page ", page);
ee_Dump( page, (uint32_t *)addrflash); ee_Dump( page, (uint32_t *)addrflash);
ee_Dump(-page, data); ee_Dump(-page, data);
@ -306,7 +306,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
} }
} }
} }
DEBUG_ECHOLNPGM("--> Differing bits: ", count); DEBUG_ECHOLNPAIR("--> Differing bits: ", count);
#endif #endif
return false; return false;
@ -326,9 +326,9 @@ static bool ee_PageErase(uint16_t page) {
uint32_t addrflash = uint32_t(getFlashStorage(page)); uint32_t addrflash = uint32_t(getFlashStorage(page));
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM PageErase ", page); DEBUG_ECHOLNPAIR("EEPROM PageErase ", page);
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash); DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0)); DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0));
DEBUG_FLUSH(); DEBUG_FLUSH();
// Get the page relative to the start of the EFC controller, and the EFC controller to use // Get the page relative to the start of the EFC controller, and the EFC controller to use
@ -371,7 +371,7 @@ static bool ee_PageErase(uint16_t page) {
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Unlock failure for page ",page); DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ",page);
return false; return false;
} }
@ -395,7 +395,7 @@ static bool ee_PageErase(uint16_t page) {
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Erase failure for page ",page); DEBUG_ECHOLNPAIR("EEPROM Erase failure for page ",page);
return false; return false;
} }
@ -411,7 +411,7 @@ static bool ee_PageErase(uint16_t page) {
for (i = 0; i < PageSize >> 2; i++) { for (i = 0; i < PageSize >> 2; i++) {
if (*aligned_src++ != 0xFFFFFFFF) { if (*aligned_src++ != 0xFFFFFFFF) {
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Verify Erase failure for page ",page); DEBUG_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page);
ee_Dump(page, (uint32_t *)addrflash); ee_Dump(page, (uint32_t *)addrflash);
return false; return false;
} }
@ -922,7 +922,7 @@ static void ee_Init() {
if (curGroup >= GroupCount) curGroup = 0; if (curGroup >= GroupCount) curGroup = 0;
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Current Group: ",curGroup); DEBUG_ECHOLNPAIR("EEPROM Current Group: ",curGroup);
DEBUG_FLUSH(); DEBUG_FLUSH();
// Now, validate that all the other group pages are empty // Now, validate that all the other group pages are empty
@ -932,7 +932,7 @@ static void ee_Init() {
for (int page = 0; page < PagesPerGroup; page++) { for (int page = 0; page < PagesPerGroup; page++) {
if (!ee_IsPageClean(grp * PagesPerGroup + page)) { if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Page ", page, " not clean on group ", grp); DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp);
DEBUG_FLUSH(); DEBUG_FLUSH();
ee_PageErase(grp * PagesPerGroup + page); ee_PageErase(grp * PagesPerGroup + page);
} }
@ -949,14 +949,14 @@ static void ee_Init() {
} }
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Active page: ", curPage); DEBUG_ECHOLNPAIR("EEPROM Active page: ", curPage);
DEBUG_FLUSH(); DEBUG_FLUSH();
// Make sure the pages following the first clean one are also clean // Make sure the pages following the first clean one are also clean
for (int page = curPage + 1; page < PagesPerGroup; page++) { for (int page = curPage + 1; page < PagesPerGroup; page++) {
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) { if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
DEBUG_ECHO_START(); DEBUG_ECHO_START();
DEBUG_ECHOLNPGM("EEPROM Page ", page, " not clean on active group ", curGroup); DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup);
DEBUG_FLUSH(); DEBUG_FLUSH();
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page)); ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
ee_PageErase(curGroup * PagesPerGroup + page); ee_PageErase(curGroup * PagesPerGroup + page);

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -67,7 +64,6 @@
#define PRINT_PORT(p) #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_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(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_PIN(p) pin_array[p].pin
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital #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 VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
@ -90,7 +86,7 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
void pwm_details(int32_t pin) { void pwm_details(int32_t pin) {
if (pwm_status(pin)) { if (pwm_status(pin)) {
uint32_t chan = g_APinDescription[pin].ulPWMChannel; uint32_t chan = g_APinDescription[pin].ulPWMChannel;
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY); SERIAL_ECHOPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
} }
} }

View File

@ -42,7 +42,7 @@
// Private Variables // Private Variables
// ------------------------ // ------------------------
const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = { const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
{ TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5] { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5]
{ TC0, 1, TC1_IRQn, 0}, // 1 { TC0, 1, TC1_IRQn, 0}, // 1
{ TC0, 2, TC2_IRQn, 2}, // 2 - stepper { TC0, 2, TC2_IRQn, 2}, // 2 - stepper
@ -66,9 +66,9 @@ const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = {
*/ */
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
Tc *tc = timer_config[timer_num].pTimerRegs; Tc *tc = TimerConfig[timer_num].pTimerRegs;
IRQn_Type irq = timer_config[timer_num].IRQ_Id; IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
uint32_t channel = timer_config[timer_num].channel; uint32_t channel = TimerConfig[timer_num].channel;
// Disable interrupt, just in case it was already enabled // Disable interrupt, just in case it was already enabled
NVIC_DisableIRQ(irq); NVIC_DisableIRQ(irq);
@ -86,7 +86,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
pmc_set_writeprotect(false); pmc_set_writeprotect(false);
pmc_enable_periph_clk((uint32_t)irq); pmc_enable_periph_clk((uint32_t)irq);
NVIC_SetPriority(irq, timer_config[timer_num].priority); NVIC_SetPriority(irq, TimerConfig [timer_num].priority);
// wave mode, reset counter on match with RC, // wave mode, reset counter on match with RC,
TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1);
@ -105,12 +105,12 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
} }
void HAL_timer_enable_interrupt(const uint8_t timer_num) { void HAL_timer_enable_interrupt(const uint8_t timer_num) {
IRQn_Type irq = timer_config[timer_num].IRQ_Id; IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
NVIC_EnableIRQ(irq); NVIC_EnableIRQ(irq);
} }
void HAL_timer_disable_interrupt(const uint8_t timer_num) { void HAL_timer_disable_interrupt(const uint8_t timer_num) {
IRQn_Type irq = timer_config[timer_num].IRQ_Id; IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
NVIC_DisableIRQ(irq); NVIC_DisableIRQ(irq);
// We NEED memory barriers to ensure Interrupts are actually disabled! // We NEED memory barriers to ensure Interrupts are actually disabled!
@ -125,7 +125,7 @@ static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
} }
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
IRQn_Type irq = timer_config[timer_num].IRQ_Id; IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
return NVIC_GetEnabledIRQ(irq); return NVIC_GetEnabledIRQ(irq);
} }

View File

@ -37,35 +37,35 @@ typedef uint32_t hal_timer_t;
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals #define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
#ifndef MF_TIMER_STEP #ifndef STEP_TIMER_NUM
#define MF_TIMER_STEP 2 // Timer Index for Stepper #define STEP_TIMER_NUM 2 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP 4 // Timer Index for Temperature #define TEMP_TIMER_NUM 4 // Timer Index for Temperature
#endif #endif
#ifndef MF_TIMER_TONE #ifndef TONE_TIMER_NUM
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones #define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
#endif #endif
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #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_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_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 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_RATE STEPPER_TIMER_RATE // frequency of pulse timer
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() void TC2_Handler() #define HAL_STEP_TIMER_ISR() void TC2_Handler()
@ -92,7 +92,7 @@ typedef struct {
// Public Variables // Public Variables
// ------------------------ // ------------------------
extern const tTimerConfig timer_config[]; extern const tTimerConfig TimerConfig[];
// ------------------------ // ------------------------
// Public functions // Public functions
@ -101,17 +101,17 @@ extern const tTimerConfig timer_config[];
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); 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) { 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]; const tTimerConfig * const pConfig = &TimerConfig[timer_num];
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare; pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare;
} }
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
const tTimerConfig * const pConfig = &timer_config[timer_num]; const tTimerConfig * const pConfig = &TimerConfig[timer_num];
return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC;
} }
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
const tTimerConfig * const pConfig = &timer_config[timer_num]; const tTimerConfig * const pConfig = &TimerConfig[timer_num];
return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV;
} }
@ -120,9 +120,9 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num);
bool HAL_timer_interrupt_enabled(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) { FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
const tTimerConfig * const pConfig = &timer_config[timer_num]; const tTimerConfig * const pConfig = &TimerConfig[timer_num];
// Reading the status register clears the interrupt flag // Reading the status register clears the interrupt flag
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR; pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
} }
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(TIMER_NUM)

View File

@ -4,16 +4,15 @@
# Windows: bossac.exe # Windows: bossac.exe
# Other: leave unchanged # Other: leave unchanged
# #
import pioutil
if pioutil.is_pio_build():
import platform
current_OS = platform.system()
if current_OS == 'Windows': import platform
current_OS = platform.system()
Import("env") if current_OS == 'Windows':
# Use bossac.exe on Windows Import("env")
env.Replace(
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" # Use bossac.exe on Windows
) env.Replace(
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
)

View File

@ -71,7 +71,7 @@
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/** /**
* \page arduino_due_x_board_info "Arduino Due/X - Board information" * \page arduino_due_x_board_info "Arduino Due/X - Board informations"
* This page lists several definition related to the board description. * This page lists several definition related to the board description.
* *
*/ */

View File

@ -10,7 +10,7 @@
#include "../../../sd/cardreader.h" #include "../../../sd/cardreader.h"
extern "C" { extern "C" {
#include "sd_mmc_spi_mem.h" #include "sd_mmc_spi_mem.h"
} }
#define SD_MMC_BLOCK_SIZE 512 #define SD_MMC_BLOCK_SIZE 512

View File

@ -90,7 +90,7 @@ typedef struct {
//! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer)
uint8_t *payload; uint8_t *payload;
//! Size of buffer to send or fill, and content the number of byte transferred //! Size of buffer to send or fill, and content the number of byte transfered
uint16_t payload_size; uint16_t payload_size;
//! Callback called after reception of ZLP from setup request //! Callback called after reception of ZLP from setup request
@ -132,7 +132,7 @@ typedef void (*udd_callback_halt_cleared_t)(void);
* *
* \param status UDD_EP_TRANSFER_OK, if transfer is complete * \param status UDD_EP_TRANSFER_OK, if transfer is complete
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
* \param n number of data transferred * \param n number of data transfered
*/ */
typedef void (*udd_callback_trans_t) (udd_ep_status_t status, typedef void (*udd_callback_trans_t) (udd_ep_status_t status,
iram_size_t nb_transferred, udd_ep_id_t ep); iram_size_t nb_transferred, udd_ep_id_t ep);
@ -303,7 +303,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
* The driver uses a specific DMA USB to transfer data * The driver uses a specific DMA USB to transfer data
* from internal RAM to endpoint, if this one is available. * from internal RAM to endpoint, if this one is available.
* When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called.
* The \a callback returns the transfer status and eventually the number of byte transferred. * The \a callback returns the transfer status and eventually the number of byte transfered.
* Note: The control endpoint is not authorized. * Note: The control endpoint is not authorized.
* *
* \param ep The ID of the endpoint to use * \param ep The ID of the endpoint to use

View File

@ -162,7 +162,7 @@ static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep);
* *
* \param status UDD_EP_TRANSFER_OK, if transfer finished * \param status UDD_EP_TRANSFER_OK, if transfer finished
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
* \param n number of data transferred * \param n number of data transfered
*/ */
static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
@ -200,7 +200,7 @@ static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_
* *
* \param status UDD_EP_TRANSFER_OK, if transfer finished * \param status UDD_EP_TRANSFER_OK, if transfer finished
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
* \param n number of data transferred * \param n number of data transfered
*/ */
static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);

View File

@ -106,7 +106,7 @@ extern "C" {
*/ */
//@{ //@{
# if UDI_CDC_PORT_NB > 2 # if UDI_CDC_PORT_NB > 2
# error USBB, UDP, UDPHS and UOTGHS interfaces have not enough endpoints. # error USBB, UDP, UDPHS and UOTGHS interfaces have not enought endpoints.
# endif # endif
#define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX
#define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX

View File

@ -173,7 +173,7 @@ static void udi_msc_cbw_wait(void);
* *
* \param status UDD_EP_TRANSFER_OK, if transfer is finished * \param status UDD_EP_TRANSFER_OK, if transfer is finished
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
* \param nb_received number of data transferred * \param nb_received number of data transfered
*/ */
static void udi_msc_cbw_received(udd_ep_status_t status, static void udi_msc_cbw_received(udd_ep_status_t status,
iram_size_t nb_received, udd_ep_id_t ep); iram_size_t nb_received, udd_ep_id_t ep);
@ -211,7 +211,7 @@ static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size);
* *
* \param status UDD_EP_TRANSFER_OK, if transfer finish * \param status UDD_EP_TRANSFER_OK, if transfer finish
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
* \param nb_sent number of data transferred * \param nb_sent number of data transfered
*/ */
static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
udd_ep_id_t ep); udd_ep_id_t ep);
@ -244,7 +244,7 @@ void udi_msc_csw_send(void);
* *
* \param status UDD_EP_TRANSFER_OK, if transfer is finished * \param status UDD_EP_TRANSFER_OK, if transfer is finished
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
* \param nb_sent number of data transferred * \param nb_sent number of data transfered
*/ */
static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
udd_ep_id_t ep); udd_ep_id_t ep);
@ -463,7 +463,7 @@ uint8_t udi_msc_getsetting(void)
static void udi_msc_cbw_invalid(void) static void udi_msc_cbw_invalid(void)
{ {
if (!udi_msc_b_cbw_invalid) if (!udi_msc_b_cbw_invalid)
return; // Don't re-stall endpoint if error reset by setup return; // Don't re-stall endpoint if error reseted by setup
udd_ep_set_halt(UDI_MSC_EP_OUT); udd_ep_set_halt(UDI_MSC_EP_OUT);
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it // If stall cleared then re-stall it. Only Setup MSC Reset can clear it
udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid); udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid);
@ -472,7 +472,7 @@ static void udi_msc_cbw_invalid(void)
static void udi_msc_csw_invalid(void) static void udi_msc_csw_invalid(void)
{ {
if (!udi_msc_b_cbw_invalid) if (!udi_msc_b_cbw_invalid)
return; // Don't re-stall endpoint if error reset by setup return; // Don't re-stall endpoint if error reseted by setup
udd_ep_set_halt(UDI_MSC_EP_IN); udd_ep_set_halt(UDI_MSC_EP_IN);
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it // If stall cleared then re-stall it. Only Setup MSC Reset can clear it
udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid); udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid);

View File

@ -325,7 +325,7 @@ static void udd_sleep_mode(bool b_idle)
/** /**
* \name Control endpoint low level management routine. * \name Control endpoint low level management routine.
* *
* This function performs control endpoint management. * This function performs control endpoint mangement.
* It handle the SETUP/DATA/HANDSHAKE phases of a control transaction. * It handle the SETUP/DATA/HANDSHAKE phases of a control transaction.
*/ */
//@{ //@{
@ -397,9 +397,9 @@ static void udd_ctrl_endofrequest(void);
/** /**
* \brief Main interrupt routine for control endpoint * \brief Main interrupt routine for control endpoint
* *
* This switches control endpoint events to correct sub function. * This switchs control endpoint events to correct sub function.
* *
* \return \c 1 if an event about control endpoint is occurred, otherwise \c 0. * \return \c 1 if an event about control endpoint is occured, otherwise \c 0.
*/ */
static bool udd_ctrl_interrupt(void); static bool udd_ctrl_interrupt(void);
@ -410,7 +410,7 @@ static bool udd_ctrl_interrupt(void);
* \name Management of bulk/interrupt/isochronous endpoints * \name Management of bulk/interrupt/isochronous endpoints
* *
* The UDD manages the data transfer on endpoints: * The UDD manages the data transfer on endpoints:
* - Start data transfer on endpoint with USB Device DMA * - Start data tranfer on endpoint with USB Device DMA
* - Send a ZLP packet if requested * - Send a ZLP packet if requested
* - Call callback registered to signal end of transfer * - Call callback registered to signal end of transfer
* The transfer abort and stall feature are supported. * The transfer abort and stall feature are supported.
@ -431,7 +431,7 @@ typedef struct {
uint8_t *buf; uint8_t *buf;
//! Size of buffer to send or fill //! Size of buffer to send or fill
iram_size_t buf_size; iram_size_t buf_size;
//!< Size of data transferred //!< Size of data transfered
iram_size_t buf_cnt; iram_size_t buf_cnt;
//!< Size of data loaded (or prepared for DMA) last time //!< Size of data loaded (or prepared for DMA) last time
iram_size_t buf_load; iram_size_t buf_load;
@ -486,7 +486,7 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
#ifdef UDD_EP_DMA_SUPPORTED #ifdef UDD_EP_DMA_SUPPORTED
/** /**
* \brief Start the next transfer if necessary or complete the job associated. * \brief Start the next transfer if necessary or complet the job associated.
* *
* \param ep endpoint number without direction flag * \param ep endpoint number without direction flag
*/ */
@ -496,9 +496,9 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
/** /**
* \brief Main interrupt routine for bulk/interrupt/isochronous endpoints * \brief Main interrupt routine for bulk/interrupt/isochronous endpoints
* *
* This switches endpoint events to correct sub function. * This switchs endpoint events to correct sub function.
* *
* \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occurred, otherwise \c 0. * \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occured, otherwise \c 0.
*/ */
static bool udd_ep_interrupt(void); static bool udd_ep_interrupt(void);
@ -520,7 +520,7 @@ static bool udd_ep_interrupt(void);
* *
* Note: * Note:
* Here, the global interrupt mask is not clear when an USB interrupt is enabled * Here, the global interrupt mask is not clear when an USB interrupt is enabled
* because this one can not be occurred during the USB ISR (=during INTX is masked). * because this one can not be occured during the USB ISR (=during INTX is masked).
* See Technical reference $3.8.3 Masking interrupt requests in peripheral modules. * See Technical reference $3.8.3 Masking interrupt requests in peripheral modules.
*/ */
#ifdef UHD_ENABLE #ifdef UHD_ENABLE
@ -787,7 +787,7 @@ void udd_attach(void)
udd_sleep_mode(true); udd_sleep_mode(true);
otg_unfreeze_clock(); otg_unfreeze_clock();
// This section of clock check can be improved with a check of // This section of clock check can be improved with a chek of
// USB clock source via sysclk() // USB clock source via sysclk()
// Check USB clock because the source can be a PLL // Check USB clock because the source can be a PLL
while (!Is_otg_clock_usable()); while (!Is_otg_clock_usable());
@ -803,7 +803,7 @@ void udd_attach(void)
#ifdef USB_DEVICE_HS_SUPPORT #ifdef USB_DEVICE_HS_SUPPORT
udd_enable_msof_interrupt(); udd_enable_msof_interrupt();
#endif #endif
// Reset following interrupts flag // Reset following interupts flag
udd_ack_reset(); udd_ack_reset();
udd_ack_sof(); udd_ack_sof();
udd_ack_msof(); udd_ack_msof();
@ -902,7 +902,7 @@ bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes,
} }
dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize); dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize);
// Bank choice // Bank choise
switch (bmAttributes & USB_EP_TYPE_MASK) { switch (bmAttributes & USB_EP_TYPE_MASK) {
case USB_EP_TYPE_ISOCHRONOUS: case USB_EP_TYPE_ISOCHRONOUS:
nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep); nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep);
@ -1228,7 +1228,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
if (Is_udd_endpoint_stall_requested(ep) if (Is_udd_endpoint_stall_requested(ep)
|| ptr_job->stall_requested) { || ptr_job->stall_requested) {
// Endpoint halted then registers the callback // Endpoint halted then registes the callback
ptr_job->busy = true; ptr_job->busy = true;
ptr_job->call_nohalt = callback; ptr_job->call_nohalt = callback;
} else { } else {
@ -1386,7 +1386,7 @@ static void udd_ctrl_setup_received(void)
// Decode setup request // Decode setup request
if (udc_process_setup() == false) { if (udc_process_setup() == false) {
// Setup request unknown then stall it // Setup request unknow then stall it
udd_ctrl_stall_data(); udd_ctrl_stall_data();
udd_ack_setup_received(0); udd_ack_setup_received(0);
return; return;
@ -1447,7 +1447,7 @@ static void udd_ctrl_in_sent(void)
udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt; udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt;
if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt) if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt)
|| b_shortpacket) { || b_shortpacket) {
// All data requested are transferred or a short packet has been sent // All data requested are transfered or a short packet has been sent
// then it is the end of data phase. // then it is the end of data phase.
// Generate an OUT ZLP for handshake phase. // Generate an OUT ZLP for handshake phase.
udd_ctrl_send_zlp_out(); udd_ctrl_send_zlp_out();
@ -1516,7 +1516,7 @@ static void udd_ctrl_out_received(void)
// End of SETUP request: // End of SETUP request:
// - Data IN Phase aborted, // - Data IN Phase aborted,
// - or last Data IN Phase hidden by ZLP OUT sending quiclky, // - or last Data IN Phase hidden by ZLP OUT sending quiclky,
// - or ZLP OUT received normally. // - or ZLP OUT received normaly.
udd_ctrl_endofrequest(); udd_ctrl_endofrequest();
} else { } else {
// Protocol error during SETUP request // Protocol error during SETUP request
@ -1544,7 +1544,7 @@ static void udd_ctrl_out_received(void)
(udd_ctrl_prev_payload_buf_cnt + (udd_ctrl_prev_payload_buf_cnt +
udd_ctrl_payload_buf_cnt))) { udd_ctrl_payload_buf_cnt))) {
// End of reception because it is a short packet // End of reception because it is a short packet
// Before send ZLP, call intermediate callback // Before send ZLP, call intermediat calback
// in case of data receiv generate a stall // in case of data receiv generate a stall
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt; udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
if (NULL != udd_g_ctrlreq.over_under_run) { if (NULL != udd_g_ctrlreq.over_under_run) {
@ -1565,7 +1565,7 @@ static void udd_ctrl_out_received(void)
if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) { if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) {
// Overrun then request a new payload buffer // Overrun then request a new payload buffer
if (!udd_g_ctrlreq.over_under_run) { if (!udd_g_ctrlreq.over_under_run) {
// No callback available to request a new payload buffer // No callback availabled to request a new payload buffer
udd_ctrl_stall_data(); udd_ctrl_stall_data();
// Ack reception of OUT to replace NAK by a STALL // Ack reception of OUT to replace NAK by a STALL
udd_ack_out_received(0); udd_ack_out_received(0);
@ -1805,7 +1805,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
// transfer size of UDD_ENDPOINT_MAX_TRANS Bytes // transfer size of UDD_ENDPOINT_MAX_TRANS Bytes
next_trans = UDD_ENDPOINT_MAX_TRANS; next_trans = UDD_ENDPOINT_MAX_TRANS;
// Set 0 to transfer the maximum // Set 0 to tranfer the maximum
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0); udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0);
} else { } else {
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans); udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans);
@ -1850,7 +1850,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
} }
cpu_irq_restore(flags); cpu_irq_restore(flags);
// Here a ZLP has been received // Here a ZLP has been recieved
// and the DMA transfer must be not started. // and the DMA transfer must be not started.
// It is the end of transfer // It is the end of transfer
ptr_job->buf_size = ptr_job->buf_cnt; ptr_job->buf_size = ptr_job->buf_cnt;
@ -1991,13 +1991,13 @@ static bool udd_ep_interrupt(void)
} }
dbg_print("dma%x: ", ep); dbg_print("dma%x: ", ep);
udd_disable_endpoint_dma_interrupt(ep); udd_disable_endpoint_dma_interrupt(ep);
// Save number of data no transferred // Save number of data no transfered
nb_remaining = (udd_endpoint_dma_get_status(ep) & nb_remaining = (udd_endpoint_dma_get_status(ep) &
UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk) UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk)
>> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos; >> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos;
if (nb_remaining) { if (nb_remaining) {
// Transfer no complete (short packet or ZLP) then: // Transfer no complete (short packet or ZLP) then:
// Update number of data transferred // Update number of data transfered
ptr_job->buf_cnt -= nb_remaining; ptr_job->buf_cnt -= nb_remaining;
// Set transfer complete to stop the transfer // Set transfer complete to stop the transfer
ptr_job->buf_size = ptr_job->buf_cnt; ptr_job->buf_size = ptr_job->buf_cnt;
@ -2056,7 +2056,7 @@ static bool udd_ep_interrupt(void)
udd_disable_endpoint_interrupt(ep); udd_disable_endpoint_interrupt(ep);
Assert(ptr_job->stall_requested); Assert(ptr_job->stall_requested);
// A stall has been requested during background transfer // A stall has been requested during backgound transfer
ptr_job->stall_requested = false; ptr_job->stall_requested = false;
udd_disable_endpoint_bank_autoswitch(ep); udd_disable_endpoint_bank_autoswitch(ep);
udd_enable_stall_handshake(ep); udd_enable_stall_handshake(ep);

View File

@ -130,7 +130,7 @@ struct usb_msc_cbw {
struct usb_msc_csw { struct usb_msc_csw {
le32_t dCSWSignature; //!< Must contain 'USBS' le32_t dCSWSignature; //!< Must contain 'USBS'
le32_t dCSWTag; //!< Same as dCBWTag le32_t dCSWTag; //!< Same as dCBWTag
le32_t dCSWDataResidue; //!< Number of bytes not transferred le32_t dCSWDataResidue; //!< Number of bytes not transfered
uint8_t bCSWStatus; //!< Status code uint8_t bCSWStatus; //!< Status code
}; };

View File

@ -28,10 +28,6 @@
#include <esp_adc_cal.h> #include <esp_adc_cal.h>
#include <HardwareSerial.h> #include <HardwareSerial.h>
#if ENABLED(USE_ESP32_TASK_WDT)
#include <esp_task_wdt.h>
#endif
#if ENABLED(WIFISUPPORT) #if ENABLED(WIFISUPPORT)
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include "wifi.h" #include "wifi.h"
@ -94,24 +90,8 @@ volatile int numPWMUsed = 0,
#endif #endif
#if ENABLED(USE_ESP32_EXIO)
HardwareSerial YSerial2(2);
void Write_EXIO(uint8_t IO, uint8_t v) {
if (ISRS_ENABLED()) {
DISABLE_ISRS();
YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
ENABLE_ISRS();
}
else
YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
}
#endif
void HAL_init_board() { void HAL_init_board() {
#if ENABLED(USE_ESP32_TASK_WDT)
esp_task_wdt_init(10, true);
#endif
#if ENABLED(ESP3D_WIFISUPPORT) #if ENABLED(ESP3D_WIFISUPPORT)
esp3dlib.init(); esp3dlib.init();
#elif ENABLED(WIFISUPPORT) #elif ENABLED(WIFISUPPORT)
@ -147,11 +127,7 @@ void HAL_init_board() {
// Initialize the i2s peripheral only if the I2S stepper stream is enabled. // Initialize the i2s peripheral only if the I2S stepper stream is enabled.
// The following initialization is performed after Serial1 and Serial2 are defined as // The following initialization is performed after Serial1 and Serial2 are defined as
// their native pins might conflict with the i2s stream even when they are remapped. // their native pins might conflict with the i2s stream even when they are remapped.
#if ENABLED(USE_ESP32_EXIO) TERN_(I2S_STEPPER_STREAM, i2s_init());
YSerial2.begin(460800 * 3, SERIAL_8N1, 16, 17);
#elif ENABLED(I2S_STEPPER_STREAM)
i2s_init();
#endif
} }
void HAL_idletask() { void HAL_idletask() {
@ -276,7 +252,7 @@ void analogWrite(pin_t pin, int value) {
idx = numPWMUsed; idx = numPWMUsed;
pwmPins[idx] = pin; pwmPins[idx] = pin;
// Start timer on first use // Start timer on first use
if (idx == 0) HAL_timer_start(MF_TIMER_PWM, PWM_TIMER_FREQUENCY); if (idx == 0) HAL_timer_start(PWM_TIMER_NUM, PWM_TIMER_FREQUENCY);
++numPWMUsed; ++numPWMUsed;
} }
@ -287,7 +263,7 @@ void analogWrite(pin_t pin, int value) {
// Handle PWM timer interrupt // Handle PWM timer interrupt
HAL_PWM_TIMER_ISR() { HAL_PWM_TIMER_ISR() {
HAL_timer_isr_prologue(MF_TIMER_PWM); HAL_timer_isr_prologue(PWM_TIMER_NUM);
static uint8_t count = 0; static uint8_t count = 0;
@ -301,7 +277,7 @@ HAL_PWM_TIMER_ISR() {
// 128 for 7 Bit resolution // 128 for 7 Bit resolution
count = (count + 1) & 0x7F; count = (count + 1) & 0x7F;
HAL_timer_isr_epilogue(MF_TIMER_PWM); HAL_timer_isr_epilogue(PWM_TIMER_NUM);
} }
#endif // ARDUINO_ARCH_ESP32 #endif // ARDUINO_ARCH_ESP32

View File

@ -105,14 +105,16 @@ void HAL_reboot();
void _delay_ms(int delay); void _delay_ms(int delay);
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
int freeMemory(); int freeMemory();
#pragma GCC diagnostic pop #if GCC_VERSION <= 50000
#pragma GCC diagnostic pop
#endif
void analogWrite(pin_t pin, int value); void analogWrite(pin_t pin, int value);
@ -129,10 +131,6 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin); void HAL_adc_start_conversion(const uint8_t adc_pin);
// PWM
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
// Pin Map
#define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin #define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
@ -144,10 +142,6 @@ void HAL_idletask();
inline void HAL_init() {} inline void HAL_init() {}
void HAL_init_board(); void HAL_init_board();
#if ENABLED(USE_ESP32_EXIO)
void Write_EXIO(uint8_t IO, uint8_t v);
#endif
// //
// Delay in cycles (used by DELAY_NS / DELAY_US) // Delay in cycles (used by DELAY_NS / DELAY_US)
// //

View File

@ -53,9 +53,11 @@ static SPISettings spiConfig;
// ------------------------ // ------------------------
void spiBegin() { void spiBegin() {
#if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_SS) #if !PIN_EXISTS(SD_SS)
OUT_WRITE(SD_SS_PIN, HIGH); #error "SD_SS_PIN not defined!"
#endif #endif
OUT_WRITE(SD_SS_PIN, HIGH);
} }
void spiInit(uint8_t spiRate) { void spiInit(uint8_t spiRate) {

View File

@ -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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <SPI.h>
using MarlinSPI = SPIClass;

View File

@ -38,16 +38,16 @@ volatile static int32_t toggles;
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) {
tone_pin = _pin; tone_pin = _pin;
toggles = 2 * frequency * duration / 1000; toggles = 2 * frequency * duration / 1000;
HAL_timer_start(MF_TIMER_TONE, 2 * frequency); HAL_timer_start(TONE_TIMER_NUM, 2 * frequency);
} }
void noTone(const pin_t _pin) { void noTone(const pin_t _pin) {
HAL_timer_disable_interrupt(MF_TIMER_TONE); HAL_timer_disable_interrupt(TONE_TIMER_NUM);
WRITE(_pin, LOW); WRITE(_pin, LOW);
} }
HAL_TONE_TIMER_ISR() { HAL_TONE_TIMER_ISR() {
HAL_timer_isr_prologue(MF_TIMER_TONE); HAL_timer_isr_prologue(TONE_TIMER_NUM);
if (toggles) { if (toggles) {
toggles--; toggles--;

View File

@ -1,6 +0,0 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x180000,
app1, app, ota_1, 0x190000, 0x180000,
spiffs, data, spiffs, 0x310000, 0xF0000,
1 # Name Type SubType Offset Size Flags
2 nvs data nvs 0x9000 0x5000
3 otadata data ota 0xe000 0x2000
4 app0 app ota_0 0x10000 0x180000
5 app1 app ota_1 0x190000 0x180000
6 spiffs data spiffs 0x310000 0xF0000

View File

@ -40,19 +40,13 @@
// Set pin as input with pullup mode // Set pin as input with pullup mode
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT) #define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
#if ENABLED(USE_ESP32_EXIO) // Read a pin wrapper
// Read a pin wrapper #define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
#define READ(IO) digitalRead(IO)
// Write to a pin wrapper
#define WRITE(IO, v) (IO >= 100 ? Write_EXIO(IO, v) : digitalWrite(IO, v))
#else
// Read a pin wrapper
#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
// Write to a pin wrapper
#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
#endif
// Set pin as input wrapper (0x80 | (v << 5) | (IO - 100)) // Write to a pin wrapper
#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
// Set pin as input wrapper
#define SET_INPUT(IO) _SET_INPUT(IO) #define SET_INPUT(IO) _SET_INPUT(IO)
// Set pin as input with pullup wrapper // Set pin as input with pullup wrapper

View File

@ -23,8 +23,6 @@
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#if DISABLED(USE_ESP32_EXIO)
#include "i2s.h" #include "i2s.h"
#include "../shared/Marduino.h" #include "../shared/Marduino.h"
@ -64,9 +62,12 @@ uint32_t i2s_port_data = 0;
#define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) #define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num])
static inline void gpio_matrix_out_check(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) { static inline void gpio_matrix_out_check(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) {
PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO); //if pin = -1, do not need to configure
gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT); if (gpio != -1) {
gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv); PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO);
gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT);
gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv);
}
} }
static esp_err_t i2s_reset_fifo(i2s_port_t i2s_num) { static esp_err_t i2s_reset_fifo(i2s_port_t i2s_num) {
@ -253,7 +254,13 @@ int i2s_init() {
I2S0.fifo_conf.dscr_en = 0; I2S0.fifo_conf.dscr_en = 0;
I2S0.conf_chan.tx_chan_mod = TERN(I2S_STEPPER_SPLIT_STREAM, 4, 0); I2S0.conf_chan.tx_chan_mod = (
#if ENABLED(I2S_STEPPER_SPLIT_STREAM)
4
#else
0
#endif
);
I2S0.fifo_conf.tx_fifo_mod = 0; I2S0.fifo_conf.tx_fifo_mod = 0;
I2S0.conf.tx_mono = 0; I2S0.conf.tx_mono = 0;
@ -304,16 +311,9 @@ int i2s_init() {
xTaskCreatePinnedToCore(stepperTask, "StepperTask", 10000, nullptr, 1, nullptr, CONFIG_ARDUINO_RUNNING_CORE); // run I2S stepper task on same core as rest of Marlin xTaskCreatePinnedToCore(stepperTask, "StepperTask", 10000, nullptr, 1, nullptr, CONFIG_ARDUINO_RUNNING_CORE); // run I2S stepper task on same core as rest of Marlin
// Route the i2s pins to the appropriate GPIO // Route the i2s pins to the appropriate GPIO
// If a pin is not defined, no need to configure gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0);
#if defined(I2S_DATA) && I2S_DATA >= 0 gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0);
gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0); gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0);
#endif
#if defined(I2S_BCK) && I2S_BCK >= 0
gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0);
#endif
#if defined(I2S_WS) && I2S_WS >= 0
gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0);
#endif
// Start the I2S peripheral // Start the I2S peripheral
return i2s_start(I2S_NUM_0); return i2s_start(I2S_NUM_0);
@ -340,5 +340,4 @@ void i2s_push_sample() {
dma.current[dma.rw_pos++] = i2s_port_data; dma.current[dma.rw_pos++] = i2s_port_data;
} }
#endif // !USE_ESP32_EXIO
#endif // ARDUINO_ARCH_ESP32 #endif // ARDUINO_ARCH_ESP32

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or

View File

@ -41,7 +41,7 @@
static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1}; static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1};
const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = { const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
{ TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper { TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper
{ TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature { TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature
{ TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM { TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM
@ -53,7 +53,7 @@ const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = {
// ------------------------ // ------------------------
void IRAM_ATTR timer_isr(void *para) { void IRAM_ATTR timer_isr(void *para) {
const tTimerConfig& timer = timer_config[(int)para]; const tTimerConfig& timer = TimerConfig[(int)para];
// Retrieve the interrupt status and the counter value // Retrieve the interrupt status and the counter value
// from the timer that reported the interrupt // from the timer that reported the interrupt
@ -82,7 +82,7 @@ void IRAM_ATTR timer_isr(void *para) {
* @param frequency frequency of the timer * @param frequency frequency of the timer
*/ */
void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) { void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = TimerConfig[timer_num];
timer_config_t config; timer_config_t config;
config.divider = timer.divider; config.divider = timer.divider;
@ -115,7 +115,7 @@ void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) {
* @param count threshold at which the interrupt is triggered * @param count threshold at which the interrupt is triggered
*/ */
void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) { void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = TimerConfig[timer_num];
timer_set_alarm_value(timer.group, timer.idx, count); timer_set_alarm_value(timer.group, timer.idx, count);
} }
@ -125,7 +125,7 @@ void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) {
* @return the timer current threshold for the alarm to be triggered * @return the timer current threshold for the alarm to be triggered
*/ */
hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = TimerConfig[timer_num];
uint64_t alarm_value; uint64_t alarm_value;
timer_get_alarm_value(timer.group, timer.idx, &alarm_value); timer_get_alarm_value(timer.group, timer.idx, &alarm_value);
@ -139,7 +139,7 @@ hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
* @return the current counter of the alarm * @return the current counter of the alarm
*/ */
hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = TimerConfig[timer_num];
uint64_t counter_value; uint64_t counter_value;
timer_get_counter_value(timer.group, timer.idx, &counter_value); timer_get_counter_value(timer.group, timer.idx, &counter_value);
return counter_value; return counter_value;
@ -150,7 +150,7 @@ hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
* @param timer_num timer number to enable interrupts on * @param timer_num timer number to enable interrupts on
*/ */
void HAL_timer_enable_interrupt(const uint8_t timer_num) { void HAL_timer_enable_interrupt(const uint8_t timer_num) {
//const tTimerConfig timer = timer_config[timer_num]; //const tTimerConfig timer = TimerConfig[timer_num];
//timer_enable_intr(timer.group, timer.idx); //timer_enable_intr(timer.group, timer.idx);
} }
@ -159,12 +159,12 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num) {
* @param timer_num timer number to disable interrupts on * @param timer_num timer number to disable interrupts on
*/ */
void HAL_timer_disable_interrupt(const uint8_t timer_num) { void HAL_timer_disable_interrupt(const uint8_t timer_num) {
//const tTimerConfig timer = timer_config[timer_num]; //const tTimerConfig timer = TimerConfig[timer_num];
//timer_disable_intr(timer.group, timer.idx); //timer_disable_intr(timer.group, timer.idx);
} }
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = TimerConfig[timer_num];
return TG[timer.group]->int_ena.val | BIT(timer_num); return TG[timer.group]->int_ena.val | BIT(timer_num);
} }

View File

@ -32,20 +32,20 @@
typedef uint64_t hal_timer_t; typedef uint64_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL
#ifndef MF_TIMER_STEP #ifndef STEP_TIMER_NUM
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define STEP_TIMER_NUM 0 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP 1 // Timer Index for Temperature #define TEMP_TIMER_NUM 1 // Timer Index for Temperature
#endif #endif
#ifndef MF_TIMER_PWM #ifndef PWM_TIMER_NUM
#define MF_TIMER_PWM 2 // index of timer to use for PWM outputs #define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs
#endif #endif
#ifndef MF_TIMER_TONE #ifndef TONE_TIMER_NUM
#define MF_TIMER_TONE 3 // index of timer for beeper tones #define TONE_TIMER_NUM 3 // index of timer for beeper tones
#endif #endif
#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals #define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
@ -79,12 +79,12 @@ typedef uint64_t hal_timer_t;
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#ifndef HAL_TEMP_TIMER_ISR #ifndef HAL_TEMP_TIMER_ISR
#define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler()
@ -121,7 +121,7 @@ typedef struct {
// Public Variables // Public Variables
// ------------------------ // ------------------------
extern const tTimerConfig timer_config[]; extern const tTimerConfig TimerConfig[];
// ------------------------ // ------------------------
// Public functions // Public functions
@ -136,5 +136,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
void HAL_timer_disable_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); bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(TIMER_NUM)
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(TIMER_NUM)

View File

@ -25,7 +25,7 @@
extern "C" { extern "C" {
#endif #endif
esp_err_t esp_task_wdt_reset(); esp_err_t esp_task_wdt_reset();
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -59,7 +59,7 @@ void wifi_init() {
MDNS.addService("http", "tcp", 80); MDNS.addService("http", "tcp", 80);
SERIAL_ECHOLNPGM("Successfully connected to WiFi with SSID '" WIFI_SSID "', hostname: '" WIFI_HOSTNAME "', IP address: ", WiFi.localIP().toString().c_str()); SERIAL_ECHOLNPAIR("Successfully connected to WiFi with SSID '" WIFI_SSID "', hostname: '" WIFI_HOSTNAME "', IP address: ", WiFi.localIP().toString().c_str());
} }
#endif // WIFISUPPORT #endif // WIFISUPPORT

View File

@ -63,9 +63,9 @@ uint8_t _getc();
extern MSerialT usb_serial; extern MSerialT usb_serial;
#define MYSERIAL1 usb_serial #define MYSERIAL1 usb_serial
#define CPU_ST7920_DELAY_1 600 #define ST7920_DELAY_1 DELAY_NS(600)
#define CPU_ST7920_DELAY_2 750 #define ST7920_DELAY_2 DELAY_NS(750)
#define CPU_ST7920_DELAY_3 750 #define ST7920_DELAY_3 DELAY_NS(750)
// //
// Interrupts // Interrupts
@ -79,14 +79,16 @@ extern MSerialT usb_serial;
inline void HAL_init() {} inline void HAL_init() {}
// Utility functions // Utility functions
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
int freeMemory(); int freeMemory();
#pragma GCC diagnostic pop #if GCC_VERSION <= 50000
#pragma GCC diagnostic pop
#endif
// ADC // ADC
#define HAL_ADC_VREF 5.0 #define HAL_ADC_VREF 5.0
@ -101,9 +103,6 @@ void HAL_adc_enable_channel(const uint8_t ch);
void HAL_adc_start_conversion(const uint8_t ch); void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result(); uint16_t HAL_adc_get_result();
// PWM
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
// Reset source // Reset source
inline void HAL_clear_reset_source(void) {} inline void HAL_clear_reset_source(void) {}
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }

View File

@ -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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <SPI.h>
using MarlinSPI = SPIClass;

View File

@ -54,7 +54,7 @@ void Heater::update() {
} }
void Heater::interrupt(GpioEvent ev) { void Heater::interrupt(GpioEvent ev) {
// unused // ununsed
} }
#endif // __PLAT_LINUX__ #endif // __PLAT_LINUX__

View File

@ -26,7 +26,7 @@
*/ */
// Emulating RAMPS // Emulating RAMPS
#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) #if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
#error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
#endif #endif

View File

@ -55,7 +55,7 @@ constexpr bool VALID_PIN(const pin_t p) { return WITHIN(p, 0, NUM_DIGITAL_PINS);
// Test whether the pin is PWM // Test whether the pin is PWM
constexpr bool PWM_PIN(const pin_t p) { return false; } constexpr bool PWM_PIN(const pin_t p) { return false; }
// Test whether the pin is interruptible // Test whether the pin is interruptable
constexpr bool INTERRUPT_PIN(const pin_t p) { return false; } constexpr bool INTERRUPT_PIN(const pin_t p) { return false; }
// Get the pin number at the given index // Get the pin number at the given index

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -19,7 +16,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
* *
*/ */
#ifdef __PLAT_LINUX__ #ifdef __PLAT_LINUX__
//#define GPIO_LOGGING // Full GPIO and Positional Logging //#define GPIO_LOGGING // Full GPIO and Positional Logging

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -37,7 +34,6 @@
#define GET_ARRAY_PIN(p) pin_array[p].pin #define GET_ARRAY_PIN(p) pin_array[p].pin
#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_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("%3d "), p); SERIAL_ECHO(buffer); }while(0) #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)
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin #define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
// active ADC function/mode/code values for PINSEL registers // active ADC function/mode/code values for PINSEL registers

View File

@ -37,14 +37,14 @@ typedef uint32_t hal_timer_t;
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals #define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
#ifndef MF_TIMER_STEP #ifndef STEP_TIMER_NUM
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define STEP_TIMER_NUM 0 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP 1 // Timer Index for Temperature #define TEMP_TIMER_NUM 1 // Timer Index for Temperature
#endif #endif
#define TEMP_TIMER_RATE 1000000 #define TEMP_TIMER_RATE 1000000
@ -58,12 +58,12 @@ typedef uint32_t hal_timer_t;
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() extern "C" void TIMER0_IRQHandler() #define HAL_STEP_TIMER_ISR() extern "C" void TIMER0_IRQHandler()
@ -77,6 +77,7 @@ typedef uint32_t hal_timer_t;
#define HAL_PWM_TIMER_ISR() extern "C" void TIMER3_IRQHandler() #define HAL_PWM_TIMER_ISR() extern "C" void TIMER3_IRQHandler()
#define HAL_PWM_TIMER_IRQn #define HAL_PWM_TIMER_IRQn
void HAL_timer_init(); void HAL_timer_init();
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
@ -92,5 +93,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
void HAL_timer_disable_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); bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(TIMER_NUM)
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(TIMER_NUM)

View File

@ -50,9 +50,15 @@ extern "C" volatile uint32_t _millis;
// //
// Default graphical display delays // Default graphical display delays
// //
#define CPU_ST7920_DELAY_1 600 #ifndef ST7920_DELAY_1
#define CPU_ST7920_DELAY_2 750 #define ST7920_DELAY_1 DELAY_NS(600)
#define CPU_ST7920_DELAY_3 750 #endif
#ifndef ST7920_DELAY_2
#define ST7920_DELAY_2 DELAY_NS(750)
#endif
#ifndef ST7920_DELAY_3
#define ST7920_DELAY_3 DELAY_NS(750)
#endif
typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1; typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1;
extern DefaultSerial1 USBSerial; extern DefaultSerial1 USBSerial;
@ -107,7 +113,7 @@ extern DefaultSerial1 USBSerial;
#error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
#endif #endif
#if HAS_DGUS_LCD #if HAS_DGUS_LCD
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.available() #define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available()
#endif #endif
#endif #endif
@ -123,14 +129,16 @@ extern DefaultSerial1 USBSerial;
// //
// Utility functions // Utility functions
// //
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
int freeMemory(); int freeMemory();
#pragma GCC diagnostic pop #if GCC_VERSION <= 50000
#pragma GCC diagnostic pop
#endif
// //
// ADC API // ADC API
@ -154,17 +162,17 @@ int freeMemory();
using FilteredADC = LPC176x::ADC<ADC_LOWPASS_K_VALUE, ADC_MEDIAN_FILTER_SIZE>; using FilteredADC = LPC176x::ADC<ADC_LOWPASS_K_VALUE, ADC_MEDIAN_FILTER_SIZE>;
extern uint32_t HAL_adc_reading; extern uint32_t HAL_adc_reading;
[[gnu::always_inline]] inline void HAL_adc_start_conversion(const pin_t pin) { [[gnu::always_inline]] inline void HAL_start_adc(const pin_t pin) {
HAL_adc_reading = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits HAL_adc_reading = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits
} }
[[gnu::always_inline]] inline uint16_t HAL_adc_get_result() { [[gnu::always_inline]] inline uint16_t HAL_read_adc() {
return HAL_adc_reading; return HAL_adc_reading;
} }
#define HAL_adc_init() #define HAL_adc_init()
#define HAL_ANALOG_SELECT(pin) FilteredADC::enable_channel(pin) #define HAL_ANALOG_SELECT(pin) FilteredADC::enable_channel(pin)
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) #define HAL_START_ADC(pin) HAL_start_adc(pin)
#define HAL_READ_ADC() HAL_adc_get_result() #define HAL_READ_ADC() HAL_read_adc()
#define HAL_ADC_READY() (true) #define HAL_ADC_READY() (true)
// Test whether the pin is valid // Test whether the pin is valid

View File

@ -46,8 +46,6 @@ public:
void end() {} void end() {}
uint8_t availableForWrite(void) { /* flushTX(); */ return TX_BUFFER_SIZE; }
#if ENABLED(EMERGENCY_PARSER) #if ENABLED(EMERGENCY_PARSER)
bool recv_callback(const char c) override; bool recv_callback(const char c) override;
#endif #endif

View File

@ -1,9 +1,10 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * 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 * 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 * it under the terms of the GNU General Public License as published by
@ -19,19 +20,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
* *
*/ */
/**
* Implementation of EEPROM settings in SD Card
*/
#ifdef TARGET_LPC1768 #ifdef TARGET_LPC1768
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(SDCARD_EEPROM_EMULATION) #if ENABLED(SDCARD_EEPROM_EMULATION)
//#define DEBUG_SD_EEPROM_EMULATION
#include "../shared/eeprom_api.h" #include "../shared/eeprom_api.h"
#include <chanfs/diskio.h> #include <chanfs/diskio.h>
@ -44,11 +38,9 @@ FATFS fat_fs;
FIL eeprom_file; FIL eeprom_file;
bool eeprom_file_open = false; bool eeprom_file_open = false;
#define EEPROM_FILENAME "eeprom.dat"
#ifndef MARLIN_EEPROM_SIZE #ifndef MARLIN_EEPROM_SIZE
#define MARLIN_EEPROM_SIZE size_t(0x1000) // 4KiB of Emulated EEPROM #define MARLIN_EEPROM_SIZE size_t(0x1000) // 4KiB of Emulated EEPROM
#endif #endif
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
bool PersistentStore::access_start() { bool PersistentStore::access_start() {
@ -58,7 +50,7 @@ bool PersistentStore::access_start() {
MSC_Release_Lock(); MSC_Release_Lock();
return false; return false;
} }
FRESULT res = f_open(&eeprom_file, EEPROM_FILENAME, FA_OPEN_ALWAYS | FA_WRITE | FA_READ); FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
if (res) MSC_Release_Lock(); if (res) MSC_Release_Lock();
if (res == FR_OK) { if (res == FR_OK) {
@ -89,20 +81,18 @@ bool PersistentStore::access_finish() {
// This extra chit-chat goes away soon, but is helpful for now // This extra chit-chat goes away soon, but is helpful for now
// to see errors that are happening in read_data / write_data // to see errors that are happening in read_data / write_data
static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) { static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) {
#if ENABLED(DEBUG_SD_EEPROM_EMULATION) PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
FSTR_P const rw_str = write ? F("write") : F("read"); SERIAL_CHAR(' ');
SERIAL_CHAR(' '); SERIAL_ECHOPGM_P(rw_str);
SERIAL_ECHOF(rw_str); SERIAL_ECHOLNPAIR("_data(", pos, ",", value, ",", size, ", ...)");
SERIAL_ECHOLNPGM("_data(", pos, ",", *value, ",", size, ", ...)"); if (total) {
if (total) { SERIAL_ECHOPGM(" f_");
SERIAL_ECHOPGM(" f_"); SERIAL_ECHOPGM_P(rw_str);
SERIAL_ECHOF(rw_str); SERIAL_ECHOPAIR("()=", s, "\n size=", size, "\n bytes_");
SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_"); SERIAL_ECHOLNPAIR_P(write ? PSTR("written=") : PSTR("read="), total);
SERIAL_ECHOLNF(write ? F("written=") : F("read="), total); }
} else
else SERIAL_ECHOLNPAIR(" f_lseek()=", s);
SERIAL_ECHOLNPGM(" f_lseek()=", s);
#endif
} }
// File function return codes for type FRESULT. This goes away soon, but // File function return codes for type FRESULT. This goes away soon, but

View File

@ -22,20 +22,18 @@
#ifdef TARGET_LPC1768 #ifdef TARGET_LPC1768
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#include <pwm.h>
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
if (!LPC176x::pin_is_valid(pin)) return;
if (LPC176x::pwm_attach_pin(pin))
LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); // map 1-254 onto PWM range
}
#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM #if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
void set_pwm_frequency(const pin_t pin, int f_desired) { #include <pwm.h>
LPC176x::pwm_set_frequency(pin, f_desired);
}
#endif void set_pwm_frequency(const pin_t pin, int f_desired) {
LPC176x::pwm_set_frequency(pin, f_desired);
}
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size);
}
#endif // NEEDS_HARDWARE_PWM
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View File

@ -67,7 +67,7 @@ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are in
* Test LPC176x-specific configuration values for errors at compile-time. * Test LPC176x-specific configuration values for errors at compile-time.
*/ */
//#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) //#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" // #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
//#endif //#endif

View File

@ -77,7 +77,7 @@ public:
//uint32_t spiRate() const { return spi_speed; } //uint32_t spiRate() const { return spi_speed; }
static uint32_t spiRate2Clock(uint32_t spiRate) { static inline uint32_t spiRate2Clock(uint32_t spiRate) {
uint32_t Marlin_speed[7]; // CPSR is always 2 uint32_t Marlin_speed[7]; // CPSR is always 2
Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED

View File

@ -2,9 +2,6 @@
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
@ -36,9 +33,8 @@
#define PRINT_PORT(p) #define PRINT_PORT(p)
#define GET_ARRAY_PIN(p) pin_array[p].pin #define GET_ARRAY_PIN(p) pin_array[p].pin
#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_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("P%d_%02d"), LPC176x::pin_port(p), LPC176x::pin_bit(p)); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%d.%02d"), LPC176x::pin_port(p), LPC176x::pin_bit(p)); SERIAL_ECHO(buffer); }while(0)
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR("_A%d "), LPC176x::pin_get_adc_channel(pin)); SERIAL_ECHO(buffer); }while(0) #define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
#define MULTI_NAME_PAD 17 // space needed to be pretty if not first name assigned to a pin
// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities // pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities
#ifndef M43_NEVER_TOUCH #ifndef M43_NEVER_TOUCH
@ -52,4 +48,6 @@ bool GET_PINMODE(const pin_t pin) {
return LPC176x::gpio_direction(pin); return LPC176x::gpio_direction(pin);
} }
#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) bool GET_ARRAY_IS_DIGITAL(const pin_t pin) {
return (!LPC176x::pin_has_adc(pin) || !LPC176x::pin_adc_enabled(pin));
}

View File

@ -26,22 +26,39 @@
#include "tft_spi.h" #include "tft_spi.h"
//TFT_SPI tft;
SPIClass TFT_SPI::SPIx(1); SPIClass TFT_SPI::SPIx(1);
#define TFT_CS_H WRITE(TFT_CS_PIN, HIGH)
#define TFT_CS_L WRITE(TFT_CS_PIN, LOW)
#define TFT_DC_H WRITE(TFT_DC_PIN, HIGH)
#define TFT_DC_L WRITE(TFT_DC_PIN, LOW)
#define TFT_RST_H WRITE(TFT_RESET_PIN, HIGH)
#define TFT_RST_L WRITE(TFT_RESET_PIN, LOW)
#define TFT_BLK_H WRITE(TFT_BACKLIGHT_PIN, HIGH)
#define TFT_BLK_L WRITE(TFT_BACKLIGHT_PIN, LOW)
void TFT_SPI::Init() { void TFT_SPI::Init() {
#if PIN_EXISTS(TFT_RESET) #if PIN_EXISTS(TFT_RESET)
OUT_WRITE(TFT_RESET_PIN, HIGH); SET_OUTPUT(TFT_RESET_PIN);
TFT_RST_H;
delay(100); delay(100);
#endif #endif
#if PIN_EXISTS(TFT_BACKLIGHT) #if PIN_EXISTS(TFT_BACKLIGHT)
OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); SET_OUTPUT(TFT_BACKLIGHT_PIN);
TFT_BLK_H;
#endif #endif
SET_OUTPUT(TFT_DC_PIN); SET_OUTPUT(TFT_DC_PIN);
SET_OUTPUT(TFT_CS_PIN); SET_OUTPUT(TFT_CS_PIN);
WRITE(TFT_DC_PIN, HIGH);
WRITE(TFT_CS_PIN, HIGH); TFT_DC_H;
TFT_CS_H;
/** /**
* STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
@ -80,7 +97,7 @@ void TFT_SPI::Init() {
void TFT_SPI::DataTransferBegin(uint16_t DataSize) { void TFT_SPI::DataTransferBegin(uint16_t DataSize) {
SPIx.setDataSize(DataSize); SPIx.setDataSize(DataSize);
SPIx.begin(); SPIx.begin();
WRITE(TFT_CS_PIN, LOW); TFT_CS_L;
} }
uint32_t TFT_SPI::GetID() { uint32_t TFT_SPI::GetID() {
@ -99,7 +116,7 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) {
SPIx.setDataSize(DATASIZE_8BIT); SPIx.setDataSize(DATASIZE_8BIT);
SPIx.setClock(SPI_CLOCK_DIV64); SPIx.setClock(SPI_CLOCK_DIV64);
SPIx.begin(); SPIx.begin();
WRITE(TFT_CS_PIN, LOW); TFT_CS_L;
WriteReg(Reg); WriteReg(Reg);
LOOP_L_N(i, 4) { LOOP_L_N(i, 4) {
@ -114,15 +131,21 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) {
return data >> 7; return data >> 7;
} }
bool TFT_SPI::isBusy() { return false; } bool TFT_SPI::isBusy() {
return false;
}
void TFT_SPI::Abort() { DataTransferEnd(); } void TFT_SPI::Abort() {
DataTransferEnd();
}
void TFT_SPI::Transmit(uint16_t Data) { SPIx.transfer(Data); } void TFT_SPI::Transmit(uint16_t Data) {
SPIx.transfer(Data);
}
void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) {
DataTransferBegin(DATASIZE_16BIT); DataTransferBegin(DATASIZE_16BIT); //16
WRITE(TFT_DC_PIN, HIGH); TFT_DC_H;
SPIx.dmaSend(Data, Count, MemoryIncrease); SPIx.dmaSend(Data, Count, MemoryIncrease);
DataTransferEnd(); DataTransferEnd();
} }

View File

@ -65,8 +65,8 @@ private:
static uint16_t getRawData(const XPTCoordinate coordinate); static uint16_t getRawData(const XPTCoordinate coordinate);
static bool isTouched(); static bool isTouched();
static void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); };
static void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); };
#if ENABLED(TOUCH_BUTTONS_HW_SPI) #if ENABLED(TOUCH_BUTTONS_HW_SPI)
static uint16_t HardwareIO(uint16_t data); static uint16_t HardwareIO(uint16_t data);
#endif #endif

View File

@ -40,7 +40,7 @@ void HAL_timer_init() {
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: case 0:
LPC_TIM0->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them LPC_TIM0->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them
LPC_TIM0->MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency LPC_TIM0->MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency
LPC_TIM0->TCR = _BV(SBIT_CNTEN); // Counter Enable LPC_TIM0->TCR = _BV(SBIT_CNTEN); // Counter Enable
@ -49,7 +49,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
NVIC_EnableIRQ(TIMER0_IRQn); NVIC_EnableIRQ(TIMER0_IRQn);
break; break;
case MF_TIMER_TEMP: case 1:
LPC_TIM1->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them LPC_TIM1->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them
LPC_TIM1->MR0 = uint32_t(TEMP_TIMER_RATE) / frequency; LPC_TIM1->MR0 = uint32_t(TEMP_TIMER_RATE) / frequency;
LPC_TIM1->TCR = _BV(SBIT_CNTEN); // Counter Enable LPC_TIM1->TCR = _BV(SBIT_CNTEN); // Counter Enable

View File

@ -60,17 +60,17 @@ typedef uint32_t hal_timer_t;
#define HAL_TIMER_RATE ((F_CPU) / 4) // frequency of timers peripherals #define HAL_TIMER_RATE ((F_CPU) / 4) // frequency of timers peripherals
#ifndef MF_TIMER_STEP #ifndef STEP_TIMER_NUM
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define STEP_TIMER_NUM 0 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP 1 // Timer Index for Temperature #define TEMP_TIMER_NUM 1 // Timer Index for Temperature
#endif #endif
#ifndef MF_TIMER_PWM #ifndef PWM_TIMER_NUM
#define MF_TIMER_PWM 3 // Timer Index for PWM #define PWM_TIMER_NUM 3 // Timer Index for PWM
#endif #endif
#define TEMP_TIMER_RATE 1000000 #define TEMP_TIMER_RATE 1000000
@ -84,23 +84,23 @@ typedef uint32_t hal_timer_t;
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(MF_TIMER_STEP) #define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(STEP_TIMER_NUM)
#endif #endif
#ifndef HAL_TEMP_TIMER_ISR #ifndef HAL_TEMP_TIMER_ISR
#define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(MF_TIMER_TEMP) #define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(TEMP_TIMER_NUM)
#endif #endif
// Timer references by index // Timer references by index
#define STEP_TIMER_PTR _HAL_TIMER(MF_TIMER_STEP) #define STEP_TIMER_PTR _HAL_TIMER(STEP_TIMER_NUM)
#define TEMP_TIMER_PTR _HAL_TIMER(MF_TIMER_TEMP) #define TEMP_TIMER_PTR _HAL_TIMER(TEMP_TIMER_NUM)
// ------------------------ // ------------------------
// Public functions // Public functions
@ -110,38 +110,38 @@ 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) { FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: STEP_TIMER_PTR->MR0 = compare; break; // Stepper Timer Match Register 0 case 0: STEP_TIMER_PTR->MR0 = compare; break; // Stepper Timer Match Register 0
case MF_TIMER_TEMP: TEMP_TIMER_PTR->MR0 = compare; break; // Temp Timer Match Register 0 case 1: TEMP_TIMER_PTR->MR0 = compare; break; // Temp Timer Match Register 0
} }
} }
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: return STEP_TIMER_PTR->MR0; // Stepper Timer Match Register 0 case 0: return STEP_TIMER_PTR->MR0; // Stepper Timer Match Register 0
case MF_TIMER_TEMP: return TEMP_TIMER_PTR->MR0; // Temp Timer Match Register 0 case 1: return TEMP_TIMER_PTR->MR0; // Temp Timer Match Register 0
} }
return 0; return 0;
} }
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: return STEP_TIMER_PTR->TC; // Stepper Timer Count case 0: return STEP_TIMER_PTR->TC; // Stepper Timer Count
case MF_TIMER_TEMP: return TEMP_TIMER_PTR->TC; // Temp Timer Count case 1: return TEMP_TIMER_PTR->TC; // Temp Timer Count
} }
return 0; return 0;
} }
FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) { FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: NVIC_EnableIRQ(TIMER0_IRQn); break; // Enable interrupt handler case 0: NVIC_EnableIRQ(TIMER0_IRQn); break; // Enable interrupt handler
case MF_TIMER_TEMP: NVIC_EnableIRQ(TIMER1_IRQn); break; // Enable interrupt handler case 1: NVIC_EnableIRQ(TIMER1_IRQn); break; // Enable interrupt handler
} }
} }
FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) { FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: NVIC_DisableIRQ(TIMER0_IRQn); break; // Disable interrupt handler case 0: NVIC_DisableIRQ(TIMER0_IRQn); break; // Disable interrupt handler
case MF_TIMER_TEMP: NVIC_DisableIRQ(TIMER1_IRQn); break; // Disable interrupt handler case 1: NVIC_DisableIRQ(TIMER1_IRQn); break; // Disable interrupt handler
} }
// We NEED memory barriers to ensure Interrupts are actually disabled! // We NEED memory barriers to ensure Interrupts are actually disabled!
@ -157,17 +157,17 @@ FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) {
FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: return NVIC_GetEnableIRQ(TIMER0_IRQn); // Check if interrupt is enabled or not case 0: return NVIC_GetEnableIRQ(TIMER0_IRQn); // Check if interrupt is enabled or not
case MF_TIMER_TEMP: return NVIC_GetEnableIRQ(TIMER1_IRQn); // Check if interrupt is enabled or not case 1: return NVIC_GetEnableIRQ(TIMER1_IRQn); // Check if interrupt is enabled or not
} }
return false; return false;
} }
FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
switch (timer_num) { switch (timer_num) {
case MF_TIMER_STEP: SBI(STEP_TIMER_PTR->IR, SBIT_CNTEN); break; case 0: SBI(STEP_TIMER_PTR->IR, SBIT_CNTEN); break;
case MF_TIMER_TEMP: SBI(TEMP_TIMER_PTR->IR, SBIT_CNTEN); break; case 1: SBI(TEMP_TIMER_PTR->IR, SBIT_CNTEN); break;
} }
} }
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(TIMER_NUM)

View File

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if IS_U8GLIB_ST7920 #if ENABLED(U8GLIB_ST7920)
#include <U8glib-HAL.h> #include <U8glib-HAL.h>
#include <SoftwareSPI.h> #include <SoftwareSPI.h>
@ -143,5 +143,5 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar
return 1; return 1;
} }
#endif // IS_U8GLIB_ST7920 #endif // U8GLIB_ST7920
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View File

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920 #if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#include <SoftwareSPI.h> #include <SoftwareSPI.h>
#include "../../shared/HAL_SPI.h" #include "../../shared/HAL_SPI.h"
@ -205,5 +205,5 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1; return 1;
} }
#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920 #endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View File

@ -1,127 +1,123 @@
# #
# upload_extra_script.py # sets output_port
# set the output_port
# if target_filename is found then that drive is used # if target_filename is found then that drive is used
# else if target_drive is found then that drive is used # else if target_drive is found then that drive is used
# #
from __future__ import print_function from __future__ import print_function
import pioutil target_filename = "FIRMWARE.CUR"
if pioutil.is_pio_build(): target_drive = "REARM"
target_filename = "FIRMWARE.CUR" import os,getpass,platform
target_drive = "REARM"
import os,getpass,platform current_OS = platform.system()
Import("env")
current_OS = platform.system() def print_error(e):
Import("env") print('\nUnable to find destination disk (%s)\n' \
'Please select it in platformio.ini using the upload_port keyword ' \
'(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \
'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \
%(e, env.get('PIOENV')))
def print_error(e): def before_upload(source, target, env):
print('\nUnable to find destination disk (%s)\n' \ try:
'Please select it in platformio.ini using the upload_port keyword ' \ #
'(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \ # Find a disk for upload
'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \ #
%(e, env.get('PIOENV'))) upload_disk = 'Disk not found'
target_file_found = False
def before_upload(source, target, env): target_drive_found = False
try: if current_OS == 'Windows':
# #
# Find a disk for upload # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
# # Windows - doesn't care about the disk's name, only cares about the drive letter
upload_disk = 'Disk not found' import subprocess,string
target_file_found = False from ctypes import windll
target_drive_found = False
if current_OS == 'Windows':
#
# platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:'
# Windows - doesn't care about the disk's name, only cares about the drive letter
import subprocess,string
from ctypes import windll
# getting list of drives # getting list of drives
# https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python
drives = [] drives = []
bitmask = windll.kernel32.GetLogicalDrives() bitmask = windll.kernel32.GetLogicalDrives()
for letter in string.ascii_uppercase: for letter in string.ascii_uppercase:
if bitmask & 1: if bitmask & 1:
drives.append(letter) drives.append(letter)
bitmask >>= 1 bitmask >>= 1
for drive in drives: for drive in drives:
final_drive_name = drive + ':\\' final_drive_name = drive + ':\\'
# print ('disc check: {}'.format(final_drive_name)) # print ('disc check: {}'.format(final_drive_name))
try: try:
volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)) volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
except Exception as e: except Exception as e:
print ('error:{}'.format(e)) print ('error:{}'.format(e))
continue continue
else:
if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
target_drive_found = True
upload_disk = final_drive_name
if target_filename in volume_info:
if not target_file_found:
upload_disk = final_drive_name
target_file_found = True
elif current_OS == 'Linux':
#
# platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
#
drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
if target_drive in drives: # If target drive is found, use it.
target_drive_found = True
upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep
else: else:
for drive in drives: if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
try: target_drive_found = True
files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive)) upload_disk = final_drive_name
except: if target_filename in volume_info:
continue if not target_file_found:
else: upload_disk = final_drive_name
if target_filename in files: target_file_found = True
upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep
target_file_found = True
break
#
# set upload_port to drive if found
#
if target_file_found or target_drive_found: elif current_OS == 'Linux':
env.Replace( #
UPLOAD_FLAGS="-P$UPLOAD_PORT" # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive'
) #
drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser()))
elif current_OS == 'Darwin': # MAC if target_drive in drives: # If target drive is found, use it.
# target_drive_found = True
# platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep
# else:
drives = os.listdir('/Volumes') # human readable names
if target_drive in drives and not target_file_found: # set upload if not found target file yet
target_drive_found = True
upload_disk = '/Volumes/' + target_drive + '/'
for drive in drives: for drive in drives:
try: try:
filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive))
except: except:
continue continue
else: else:
if target_filename in filenames: if target_filename in files:
if not target_file_found: upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep
upload_disk = '/Volumes/' + drive + '/'
target_file_found = True target_file_found = True
break
#
# set upload_port to drive if found
#
#
# Set upload_port to drive if found
#
if target_file_found or target_drive_found: if target_file_found or target_drive_found:
env.Replace(UPLOAD_PORT=upload_disk) env.Replace(
print('\nUpload disk: ', upload_disk, '\n') UPLOAD_FLAGS="-P$UPLOAD_PORT"
else: )
print_error('Autodetect Error')
except Exception as e: elif current_OS == 'Darwin': # MAC
print_error(str(e)) #
# platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive'
#
drives = os.listdir('/Volumes') # human readable names
if target_drive in drives and not target_file_found: # set upload if not found target file yet
target_drive_found = True
upload_disk = '/Volumes/' + target_drive + '/'
for drive in drives:
try:
filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected
except:
continue
else:
if target_filename in filenames:
if not target_file_found:
upload_disk = '/Volumes/' + drive + '/'
target_file_found = True
env.AddPreAction("upload", before_upload) #
# Set upload_port to drive if found
#
if target_file_found or target_drive_found:
env.Replace(UPLOAD_PORT=upload_disk)
print('\nUpload disk: ', upload_disk, '\n')
else:
print_error('Autodetect Error')
except Exception as e:
print_error(str(e))
env.AddPreAction("upload", before_upload)

View File

@ -99,9 +99,9 @@ extern MSerialT serial_stream_3;
#endif #endif
#define CPU_ST7920_DELAY_1 600 #define ST7920_DELAY_1 DELAY_NS(600)
#define CPU_ST7920_DELAY_2 750 #define ST7920_DELAY_2 DELAY_NS(750)
#define CPU_ST7920_DELAY_3 750 #define ST7920_DELAY_3 DELAY_NS(750)
// //
// Interrupts // Interrupts
@ -133,15 +133,10 @@ void HAL_adc_enable_channel(const uint8_t ch);
void HAL_adc_start_conversion(const uint8_t ch); void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result(); uint16_t HAL_adc_get_result();
// PWM
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
// Reset source // Reset source
inline void HAL_clear_reset_source(void) {} inline void HAL_clear_reset_source(void) {}
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
void HAL_reboot();
/* ---------------- Delay in cycles */ /* ---------------- Delay in cycles */
#define DELAY_CYCLES(x) Kernel::delayCycles(x) #define DELAY_CYCLES(x) Kernel::delayCycles(x)

View File

@ -26,7 +26,7 @@
*/ */
// Emulating RAMPS // Emulating RAMPS
#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) #if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
#error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
#endif #endif

View File

@ -20,6 +20,7 @@
/** /**
* Support routines for X86_64 * Support routines for X86_64
*/ */
#pragma once #pragma once
/** /**
@ -35,7 +36,6 @@
#define GET_ARRAY_PIN(p) pin_array[p].pin #define GET_ARRAY_PIN(p) pin_array[p].pin
#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_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("%3d "), p); SERIAL_ECHO(buffer); }while(0) #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)
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin #define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
// active ADC function/mode/code values for PINSEL registers // active ADC function/mode/code values for PINSEL registers

View File

@ -62,8 +62,8 @@ private:
static uint16_t getRawData(const XPTCoordinate coordinate); static uint16_t getRawData(const XPTCoordinate coordinate);
static bool isTouched(); static bool isTouched();
static void DataTransferBegin(); static inline void DataTransferBegin();
static void DataTransferEnd(); static inline void DataTransferEnd();
#if ENABLED(TOUCH_BUTTONS_HW_SPI) #if ENABLED(TOUCH_BUTTONS_HW_SPI)
static uint16_t HardwareIO(uint16_t data); static uint16_t HardwareIO(uint16_t data);
#endif #endif

View File

@ -37,17 +37,17 @@ typedef uint64_t hal_timer_t;
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals #define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
#ifndef MF_TIMER_STEP #ifndef STEP_TIMER_NUM
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define STEP_TIMER_NUM 0 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP 1 // Timer Index for Temperature #define TEMP_TIMER_NUM 1 // Timer Index for Temperature
#endif #endif
#ifndef MF_TIMER_SYSTICK #ifndef SYSTICK_TIMER_NUM
#define MF_TIMER_SYSTICK 2 // Timer Index for Systick #define SYSTICK_TIMER_NUM 2 // Timer Index for Systick
#endif #endif
#define SYSTICK_TIMER_FREQUENCY 1000 #define SYSTICK_TIMER_FREQUENCY 1000
@ -62,12 +62,12 @@ typedef uint64_t hal_timer_t;
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() extern "C" void TIMER0_IRQHandler() #define HAL_STEP_TIMER_ISR() extern "C" void TIMER0_IRQHandler()
@ -87,5 +87,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
void HAL_timer_disable_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); bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(TIMER_NUM)
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(TIMER_NUM)

View File

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
#if IS_U8GLIB_ST7920 #if ENABLED(U8GLIB_ST7920)
#include <U8glib-HAL.h> #include <U8glib-HAL.h>
#include "../../shared/Delay.h" #include "../../shared/Delay.h"
@ -167,5 +167,5 @@ uint8_t u8g_com_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
} }
#endif #endif
#endif // IS_U8GLIB_ST7920 #endif // U8GLIB_ST7920
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View File

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920 #if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#undef SPI_SPEED #undef SPI_SPEED
#define SPI_SPEED 2 // About 2 MHz #define SPI_SPEED 2 // About 2 MHz
@ -208,11 +208,8 @@ uint8_t u8g_com_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_pt
} }
#endif #endif
#elif NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI, HAS_MARLINUI_HD44780) && HAS_MARLINUI_U8GLIB #elif !ANY(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI, HAS_MARLINUI_HD44780) && HAS_MARLINUI_U8GLIB
#include <U8glib-HAL.h> #include <U8glib-HAL.h>
uint8_t u8g_com_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {return 0;} uint8_t u8g_com_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {return 0;}
#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
#endif // __PLAT_NATIVE_SIM__ #endif // __PLAT_NATIVE_SIM__

View File

@ -98,7 +98,7 @@
// Struct must be 32 bits aligned because of DMA accesses but fields needs to be 8 bits packed // Struct must be 32 bits aligned because of DMA accesses but fields needs to be 8 bits packed
typedef struct __attribute__((aligned(4), packed)) { typedef struct __attribute__((aligned(4), packed)) {
ADC_INPUTCTRL_Type INPUTCTRL; ADC_INPUTCTRL_Type INPUTCTRL;
} HAL_DMA_DAC_Registers; // DMA transferred registers } HAL_DMA_DAC_Registers; // DMA transfered registers
#endif #endif

View File

@ -127,11 +127,6 @@ void HAL_adc_init();
void HAL_adc_start_conversion(const uint8_t adc_pin); void HAL_adc_start_conversion(const uint8_t adc_pin);
//
// PWM
//
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
// //
// Pin Map // Pin Map
// //
@ -158,14 +153,16 @@ void HAL_idletask();
// //
FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); }
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
int freeMemory(); int freeMemory();
#pragma GCC diagnostic pop #if GCC_VERSION <= 50000
#pragma GCC diagnostic pop
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -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 <https://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <SPI.h>
using MarlinSPI = SPIClass;

View File

@ -25,6 +25,7 @@
* *
* Derived from Adafruit_SPIFlash class with no SdFat references * Derived from Adafruit_SPIFlash class with no SdFat references
*/ */
#pragma once #pragma once
#include <Adafruit_SPIFlashBase.h> #include <Adafruit_SPIFlashBase.h>

View File

@ -53,7 +53,7 @@
static volatile int8_t currentServoIndex[_Nbr_16timers]; // index for the servo being pulsed for each timer (or -1 if refresh interval) static volatile int8_t currentServoIndex[_Nbr_16timers]; // index for the servo being pulsed for each timer (or -1 if refresh interval)
FORCE_INLINE static uint16_t getTimerCount() { FORCE_INLINE static uint16_t getTimerCount() {
Tc * const tc = timer_config[SERVO_TC].pTc; Tc * const tc = TimerConfig[SERVO_TC].pTc;
tc->COUNT16.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC; tc->COUNT16.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC;
SYNC(tc->COUNT16.SYNCBUSY.bit.CTRLB || tc->COUNT16.SYNCBUSY.bit.COUNT); SYNC(tc->COUNT16.SYNCBUSY.bit.CTRLB || tc->COUNT16.SYNCBUSY.bit.COUNT);
@ -65,7 +65,7 @@ FORCE_INLINE static uint16_t getTimerCount() {
// Interrupt handler for the TC // Interrupt handler for the TC
// ---------------------------- // ----------------------------
HAL_SERVO_TIMER_ISR() { HAL_SERVO_TIMER_ISR() {
Tc * const tc = timer_config[SERVO_TC].pTc; Tc * const tc = TimerConfig[SERVO_TC].pTc;
const timer16_Sequence_t timer = const timer16_Sequence_t timer =
#ifndef _useTimer1 #ifndef _useTimer1
_timer2 _timer2
@ -125,7 +125,7 @@ HAL_SERVO_TIMER_ISR() {
} }
void initISR(timer16_Sequence_t timer) { void initISR(timer16_Sequence_t timer) {
Tc * const tc = timer_config[SERVO_TC].pTc; Tc * const tc = TimerConfig[SERVO_TC].pTc;
const uint8_t tcChannel = TIMER_TCCHANNEL(timer); const uint8_t tcChannel = TIMER_TCCHANNEL(timer);
static bool initialized = false; // Servo TC has been initialized static bool initialized = false; // Servo TC has been initialized
@ -202,7 +202,7 @@ void initISR(timer16_Sequence_t timer) {
} }
void finISR(timer16_Sequence_t timer) { void finISR(timer16_Sequence_t timer) {
Tc * const tc = timer_config[SERVO_TC].pTc; Tc * const tc = TimerConfig[SERVO_TC].pTc;
const uint8_t tcChannel = TIMER_TCCHANNEL(timer); const uint8_t tcChannel = TIMER_TCCHANNEL(timer);
// Disable the match channel interrupt request // Disable the match channel interrupt request

View File

@ -162,14 +162,12 @@ void setup_endstop_interrupts() {
#error "Z_MIN_PROBE_PIN has no EXTINT line available." #error "Z_MIN_PROBE_PIN has no EXTINT line available."
#endif #endif
_ATTACH(Z_MIN_PROBE_PIN); _ATTACH(Z_MIN_PROBE_PIN);
#endif #elif HAS_I_MAX
#if HAS_I_MAX
#if !AVAILABLE_EILINE(I_MAX_PIN) #if !AVAILABLE_EILINE(I_MAX_PIN)
#error "I_MAX_PIN has no EXTINT line available." #error "I_MAX_PIN has no EXTINT line available."
#endif #endif
attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE); attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE);
#endif #elif HAS_I_MIN
#if HAS_I_MIN
#if !AVAILABLE_EILINE(I_MIN_PIN) #if !AVAILABLE_EILINE(I_MIN_PIN)
#error "I_MIN_PIN has no EXTINT line available." #error "I_MIN_PIN has no EXTINT line available."
#endif #endif
@ -180,8 +178,7 @@ void setup_endstop_interrupts() {
#error "J_MAX_PIN has no EXTINT line available." #error "J_MAX_PIN has no EXTINT line available."
#endif #endif
attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE); attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE);
#endif #elif HAS_J_MIN
#if HAS_J_MIN
#if !AVAILABLE_EILINE(J_MIN_PIN) #if !AVAILABLE_EILINE(J_MIN_PIN)
#error "J_MIN_PIN has no EXTINT line available." #error "J_MIN_PIN has no EXTINT line available."
#endif #endif
@ -192,8 +189,7 @@ void setup_endstop_interrupts() {
#error "K_MAX_PIN has no EXTINT line available." #error "K_MAX_PIN has no EXTINT line available."
#endif #endif
attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE); attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE);
#endif #elif HAS_K_MIN
#if HAS_K_MIN
#if !AVAILABLE_EILINE(K_MIN_PIN) #if !AVAILABLE_EILINE(K_MIN_PIN)
#error "K_MIN_PIN has no EXTINT line available." #error "K_MIN_PIN has no EXTINT line available."
#endif #endif

View File

@ -131,7 +131,7 @@
*/ */
#define PWM_PIN(P) (WITHIN(P, 2, 13) || WITHIN(P, 22, 23) || WITHIN(P, 44, 45) || P == 48) #define PWM_PIN(P) (WITHIN(P, 2, 13) || WITHIN(P, 22, 23) || WITHIN(P, 44, 45) || P == 48)
// Return fulfilled ADCx->INPUTCTRL.reg // Return fullfilled ADCx->INPUTCTRL.reg
#define PIN_TO_INPUTCTRL(P) ( (PIN_TO_AIN(P) == 0) ? ADC_INPUTCTRL_MUXPOS_AIN0 \ #define PIN_TO_INPUTCTRL(P) ( (PIN_TO_AIN(P) == 0) ? ADC_INPUTCTRL_MUXPOS_AIN0 \
: (PIN_TO_AIN(P) == 1) ? ADC_INPUTCTRL_MUXPOS_AIN1 \ : (PIN_TO_AIN(P) == 1) ? ADC_INPUTCTRL_MUXPOS_AIN1 \
: (PIN_TO_AIN(P) == 2) ? ADC_INPUTCTRL_MUXPOS_AIN2 \ : (PIN_TO_AIN(P) == 2) ? ADC_INPUTCTRL_MUXPOS_AIN2 \

View File

@ -36,7 +36,7 @@
#error "OnBoard SPI BUS can't be shared with other devices." #error "OnBoard SPI BUS can't be shared with other devices."
#endif #endif
#if SERVO_TC == MF_TIMER_RTC #if SERVO_TC == RTC_TIMER_NUM
#error "Servos can't use RTC timer" #error "Servos can't use RTC timer"
#endif #endif

View File

@ -26,7 +26,6 @@
#define PRINT_PORT(p) do{ SERIAL_ECHOPGM(" Port: "); sprintf_P(buffer, PSTR("%c%02ld"), 'A' + g_APinDescription[p].ulPort, g_APinDescription[p].ulPin); SERIAL_ECHO(buffer); }while (0) #define PRINT_PORT(p) do{ SERIAL_ECHOPGM(" Port: "); sprintf_P(buffer, PSTR("%c%02ld"), 'A' + g_APinDescription[p].ulPort, g_APinDescription[p].ulPin); SERIAL_ECHO(buffer); }while (0)
#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_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("%3d "), p); SERIAL_ECHO(buffer); }while(0) #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)
#define GET_ARRAY_PIN(p) pin_array[p].pin #define GET_ARRAY_PIN(p) pin_array[p].pin
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital #define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL) #define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL)
@ -48,7 +47,7 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
void pwm_details(int32_t pin) { void pwm_details(int32_t pin) {
if (pwm_status(pin)) { if (pwm_status(pin)) {
//uint32_t chan = g_APinDescription[pin].ulPWMChannel TODO when fast pwm is operative; //uint32_t chan = g_APinDescription[pin].ulPWMChannel TODO when fast pwm is operative;
//SERIAL_ECHOPGM("PWM = ", duty); //SERIAL_ECHOPAIR("PWM = ", duty);
} }
} }

View File

@ -31,13 +31,13 @@
// Local defines // Local defines
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#define NUM_HARDWARE_TIMERS 9 #define NUM_HARDWARE_TIMERS 8
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Private Variables // Private Variables
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = { const tTimerConfig TimerConfig[NUM_HARDWARE_TIMERS+1] = {
{ {.pTc=TC0}, TC0_IRQn, TC_PRIORITY(0) }, // 0 - stepper (assigned priority 2) { {.pTc=TC0}, TC0_IRQn, TC_PRIORITY(0) }, // 0 - stepper (assigned priority 2)
{ {.pTc=TC1}, TC1_IRQn, TC_PRIORITY(1) }, // 1 - stepper (needed by 32 bit timers) { {.pTc=TC1}, TC1_IRQn, TC_PRIORITY(1) }, // 1 - stepper (needed by 32 bit timers)
{ {.pTc=TC2}, TC2_IRQn, 5 }, // 2 - tone (reserved by framework and fixed assigned priority 5) { {.pTc=TC2}, TC2_IRQn, 5 }, // 2 - tone (reserved by framework and fixed assigned priority 5)
@ -67,13 +67,13 @@ FORCE_INLINE void Disable_Irq(IRQn_Type irq) {
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
IRQn_Type irq = timer_config[timer_num].IRQ_Id; IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
// Disable interrupt, just in case it was already enabled // Disable interrupt, just in case it was already enabled
Disable_Irq(irq); Disable_Irq(irq);
if (timer_num == MF_TIMER_RTC) { if (timer_num == RTC_TIMER_NUM) {
Rtc * const rtc = timer_config[timer_num].pRtc; Rtc * const rtc = TimerConfig[timer_num].pRtc;
// Disable timer interrupt // Disable timer interrupt
rtc->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0; rtc->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0;
@ -101,13 +101,13 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
SYNC(rtc->MODE0.SYNCBUSY.bit.ENABLE); SYNC(rtc->MODE0.SYNCBUSY.bit.ENABLE);
} }
else { else {
Tc * const tc = timer_config[timer_num].pTc; Tc * const tc = TimerConfig[timer_num].pTc;
// Disable timer interrupt // Disable timer interrupt
tc->COUNT32.INTENCLR.reg = TC_INTENCLR_OVF; // disable overflow interrupt tc->COUNT32.INTENCLR.reg = TC_INTENCLR_OVF; // disable overflow interrupt
// TCn clock setup // TCn clock setup
const uint8_t clockID = GCLK_CLKCTRL_IDs[TCC_INST_NUM + timer_num]; // TC clock are preceded by TCC ones const uint8_t clockID = GCLK_CLKCTRL_IDs[TCC_INST_NUM + timer_num]; // TC clock are preceeded by TCC ones
GCLK->PCHCTRL[clockID].bit.CHEN = false; GCLK->PCHCTRL[clockID].bit.CHEN = false;
SYNC(GCLK->PCHCTRL[clockID].bit.CHEN); SYNC(GCLK->PCHCTRL[clockID].bit.CHEN);
GCLK->PCHCTRL[clockID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed GCLK->PCHCTRL[clockID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed
@ -141,17 +141,17 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
} }
// Finally, enable IRQ // Finally, enable IRQ
NVIC_SetPriority(irq, timer_config[timer_num].priority); NVIC_SetPriority(irq, TimerConfig[timer_num].priority);
NVIC_EnableIRQ(irq); NVIC_EnableIRQ(irq);
} }
void HAL_timer_enable_interrupt(const uint8_t timer_num) { void HAL_timer_enable_interrupt(const uint8_t timer_num) {
const IRQn_Type irq = timer_config[timer_num].IRQ_Id; const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
NVIC_EnableIRQ(irq); NVIC_EnableIRQ(irq);
} }
void HAL_timer_disable_interrupt(const uint8_t timer_num) { void HAL_timer_disable_interrupt(const uint8_t timer_num) {
const IRQn_Type irq = timer_config[timer_num].IRQ_Id; const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
Disable_Irq(irq); Disable_Irq(irq);
} }
@ -161,7 +161,7 @@ static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
} }
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
const IRQn_Type irq = timer_config[timer_num].IRQ_Id; const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
return NVIC_GetEnabledIRQ(irq); return NVIC_GetEnabledIRQ(irq);
} }

View File

@ -25,22 +25,21 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Defines // Defines
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#define RTC_TIMER_NUM 8 // This is not a TC but a RTC
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals #define HAL_TIMER_RATE F_CPU // frequency of timers peripherals
#define MF_TIMER_RTC 8 // This is not a TC but a RTC #ifndef STEP_TIMER_NUM
#define STEP_TIMER_NUM 0 // Timer Index for Stepper
#ifndef MF_TIMER_STEP
#define MF_TIMER_STEP 0 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef PULSE_TIMER_NUM
#define MF_TIMER_PULSE MF_TIMER_STEP #define PULSE_TIMER_NUM STEP_TIMER_NUM
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef TEMP_TIMER_NUM
#define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature #define TEMP_TIMER_NUM RTC_TIMER_NUM // Timer Index for Temperature
#endif #endif
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
@ -53,29 +52,30 @@ typedef uint32_t hal_timer_t;
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
#define TC_PRIORITY(t) ( t == SERVO_TC ? 1 \ #define TC_PRIORITY(t) t == SERVO_TC ? 1 \
: (t == MF_TIMER_STEP || t == MF_TIMER_PULSE) ? 2 \ : (t == STEP_TIMER_NUM || t == PULSE_TIMER_NUM) ? 2 \
: (t == MF_TIMER_TEMP) ? 6 : 7 ) : (t == TEMP_TIMER_NUM) ? 6 \
: 7
#define _TC_HANDLER(t) void TC##t##_Handler() #define _TC_HANDLER(t) void TC##t##_Handler()
#define TC_HANDLER(t) _TC_HANDLER(t) #define TC_HANDLER(t) _TC_HANDLER(t)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() TC_HANDLER(MF_TIMER_STEP) #define HAL_STEP_TIMER_ISR() TC_HANDLER(STEP_TIMER_NUM)
#endif #endif
#if MF_TIMER_STEP != MF_TIMER_PULSE #if STEP_TIMER_NUM != PULSE_TIMER_NUM
#define HAL_PULSE_TIMER_ISR() TC_HANDLER(MF_TIMER_PULSE) #define HAL_PULSE_TIMER_ISR() TC_HANDLER(PULSE_TIMER_NUM)
#endif #endif
#if MF_TIMER_TEMP == MF_TIMER_RTC #if TEMP_TIMER_NUM == RTC_TIMER_NUM
#define HAL_TEMP_TIMER_ISR() void RTC_Handler() #define HAL_TEMP_TIMER_ISR() void RTC_Handler()
#else #else
#define HAL_TEMP_TIMER_ISR() TC_HANDLER(MF_TIMER_TEMP) #define HAL_TEMP_TIMER_ISR() TC_HANDLER(TEMP_TIMER_NUM)
#endif #endif
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@ -95,7 +95,7 @@ typedef struct {
// Public Variables // Public Variables
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
extern const tTimerConfig timer_config[]; extern const tTimerConfig TimerConfig[];
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Public functions // Public functions
@ -104,20 +104,20 @@ extern const tTimerConfig timer_config[];
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); 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) { FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
// Should never be called with timer MF_TIMER_RTC // Should never be called with timer RTC_TIMER_NUM
Tc * const tc = timer_config[timer_num].pTc; Tc * const tc = TimerConfig[timer_num].pTc;
tc->COUNT32.CC[0].reg = compare; tc->COUNT32.CC[0].reg = compare;
} }
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
// Should never be called with timer MF_TIMER_RTC // Should never be called with timer RTC_TIMER_NUM
Tc * const tc = timer_config[timer_num].pTc; Tc * const tc = TimerConfig[timer_num].pTc;
return (hal_timer_t)tc->COUNT32.CC[0].reg; return (hal_timer_t)tc->COUNT32.CC[0].reg;
} }
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
// Should never be called with timer MF_TIMER_RTC // Should never be called with timer RTC_TIMER_NUM
Tc * const tc = timer_config[timer_num].pTc; Tc * const tc = TimerConfig[timer_num].pTc;
tc->COUNT32.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC; tc->COUNT32.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC;
SYNC(tc->COUNT32.SYNCBUSY.bit.CTRLB || tc->COUNT32.SYNCBUSY.bit.COUNT); SYNC(tc->COUNT32.SYNCBUSY.bit.CTRLB || tc->COUNT32.SYNCBUSY.bit.COUNT);
return tc->COUNT32.COUNT.reg; return tc->COUNT32.COUNT.reg;
@ -128,13 +128,13 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num);
bool HAL_timer_interrupt_enabled(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) { FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
if (timer_num == MF_TIMER_RTC) { if (timer_num == RTC_TIMER_NUM) {
Rtc * const rtc = timer_config[timer_num].pRtc; Rtc * const rtc = TimerConfig[timer_num].pRtc;
// Clear interrupt flag // Clear interrupt flag
rtc->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; rtc->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0;
} }
else { else {
Tc * const tc = timer_config[timer_num].pTc; Tc * const tc = TimerConfig[timer_num].pTc;
// Clear interrupt flag // Clear interrupt flag
tc->COUNT32.INTFLAG.reg = TC_INTFLAG_OVF; tc->COUNT32.INTFLAG.reg = TC_INTFLAG_OVF;
} }

View File

@ -154,7 +154,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRe
uint16_t HAL_adc_get_result() { return HAL_adc_result; } uint16_t HAL_adc_get_result() { return HAL_adc_result; }
// Reset the system to initiate a firmware flash // Reset the system to initiate a firmware flash
WEAK void flashFirmware(const int16_t) { HAL_reboot(); } void flashFirmware(const int16_t) { HAL_reboot(); }
// Maple Compatibility // Maple Compatibility
volatile uint32_t systick_uptime_millis = 0; volatile uint32_t systick_uptime_millis = 0;

View File

@ -37,13 +37,6 @@
#include <stdint.h> #include <stdint.h>
//
// Default graphical display delays
//
#define CPU_ST7920_DELAY_1 300
#define CPU_ST7920_DELAY_2 40
#define CPU_ST7920_DELAY_3 340
// //
// Serial Ports // Serial Ports
// //
@ -130,11 +123,7 @@
// Types // Types
// ------------------------ // ------------------------
#ifdef STM32G0B1xx typedef int16_t pin_t;
typedef int32_t pin_t;
#else
typedef int16_t pin_t;
#endif
#define HAL_SERVO_LIB libServo #define HAL_SERVO_LIB libServo
#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() #define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos()
@ -187,13 +176,8 @@ static inline int freeMemory() {
#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) #define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT)
#ifdef ADC_RESOLUTION
#define HAL_ADC_RESOLUTION ADC_RESOLUTION
#else
#define HAL_ADC_RESOLUTION 12
#endif
#define HAL_ADC_VREF 3.3 #define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION ADC_RESOLUTION // 12
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) #define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC() HAL_adc_result #define HAL_READ_ADC() HAL_adc_result
#define HAL_ADC_READY() true #define HAL_ADC_READY() true

Some files were not shown because too many files have changed in this diff Show More