Compare commits

...

467 Commits

Author SHA1 Message Date
Scott Lahteine dc6d166567 Merge remote-tracking branch 'upstream/bugfix-2.1.x' into pr/26944 2025-12-02 12:14:56 -06:00
thinkyhead 333608a692 [cron] Bump distribution date (2025-12-02) 2025-12-02 00:33:25 +00:00
Scott Lahteine e99d801e6b 🧑‍💻 Add a "Marlin" class 2025-11-30 20:07:48 -06:00
Scott Lahteine 0ac1435a8c 🧑‍💻 Reduction via TERF 2025-11-30 20:07:48 -06:00
Scott Lahteine 584abc5835 🎨 "controllerfan" 2025-11-30 20:07:48 -06:00
Scott Lahteine 73fa80f128 🎨 Pretty up timers 2025-11-30 20:07:48 -06:00
Scott Lahteine 7fcc605595 🧑‍💻 Relocate G38 data 2025-11-30 20:07:48 -06:00
Harald Wagener 35319049fe FT_MOTION > FTM_POLYS (#28197) 2025-11-30 20:05:45 -06:00
thinkyhead 544cde20fb [cron] Bump distribution date (2025-12-01) 2025-12-01 00:40:21 +00:00
Scott Lahteine 084b065f46 🩹 Fix MMU2 menu 2025-11-30 17:24:23 -06:00
Scott Lahteine ec8a6fc7e2 🔧 Uppercase PID options (#27891) 2025-11-30 08:43:23 -06:00
thinkyhead 3d7f84dbb6 [cron] Bump distribution date (2025-11-30) 2025-11-30 00:38:07 +00:00
Scott Lahteine 7b70e39ff6 🧑‍💻 Clarify PID tuning macros 2025-11-28 21:23:00 -06:00
Scott Lahteine 58bce3781e 📝 Usage for run_tests 2025-11-28 19:15:06 -06:00
thinkyhead 578ee04243 [cron] Bump distribution date (2025-11-29) 2025-11-29 00:31:12 +00:00
Scott Lahteine d061e6dbd6 📝 Motion comments
w/r/t https://github.com/MarlinFirmware/Marlin/issues/27918#issuecomment-3145339116
2025-11-28 13:28:28 -06:00
Vovodroid 12ac094992 PLR_HEAT_BED_ON_REBOOT (#26691) 2025-11-27 19:27:48 -06:00
thinkyhead ac0fc603ae [cron] Bump distribution date (2025-11-28) 2025-11-28 00:53:52 +00:00
ellensp e3ef8d2089 BOARD_RASPBERRY_PI_PICO (and other RP2040 updates) (#28181) 2025-11-27 17:28:32 -06:00
Vovodroid b9f0c68e3c ️ Minimize M190 annealing code (#26888) 2025-11-27 16:41:20 -06:00
Axel Sepúlveda 64182d60aa 🎨 Patches for README (#28194)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-11-27 14:38:04 -06:00
thinkyhead 3e4344ad7a [cron] Bump distribution date (2025-11-27) 2025-11-27 06:11:36 +00:00
Scott Lahteine efb58a9a0d 🧑‍💻 Consolidate repetitious items 2025-11-26 23:04:31 -06:00
Scott Lahteine 2700af52c8 🧑‍💻 TERF - Single line shorthand 2025-11-26 21:42:16 -06:00
Scott Lahteine c420a0b96a 🎨 Comments, refinements 2025-11-26 21:34:42 -06:00
Scott Lahteine 1832500eca 🧑‍💻 Single endstop state 2025-11-26 21:34:22 -06:00
thinkyhead 5bbf953711 [cron] Bump distribution date (2025-11-26) 2025-11-26 00:32:42 +00:00
Scott Lahteine 1f38b509e1 🔧 Update FAN pins 2025-11-25 14:36:51 -06:00
thinkyhead 38d9b97bbd [cron] Bump distribution date (2025-11-25) 2025-11-25 06:29:28 +00:00
Giuliano c1908c865e 🩹 Fix case light menu build (2) (#28185)
Followup to #28143
2025-11-24 22:43:18 -06:00
David Buezas ba34902610 🔧 Recommend FTM_SMOOTHING + FTM_SHAPER_E (#28190) 2025-11-24 22:40:27 -06:00
Andrew e35bedab48 🔨 Importable configuration.py for mc-apply.py (#28182) 2025-11-24 19:57:47 -06:00
Andrew 50297c65d4 🚸 Update/fix JyersUI/ProUI park, leveling (#28183) 2025-11-24 19:56:11 -06:00
Scott Lahteine fe1d6f93e2 🔨 STM32 build with -std=gnu++17 (#28188) 2025-11-24 19:55:30 -06:00
thinkyhead 46ee5b0a08 [cron] Bump distribution date (2025-11-24) 2025-11-24 00:35:08 +00:00
Scott Lahteine 9da6b580d9 🚸 Immediate Buttons and Menu Items (2)
Followup to #28180
2025-11-23 13:51:51 -06:00
Scott Lahteine ccc69582ef 🧑‍💻 Warn about language features 2025-11-23 13:27:17 -06:00
thinkyhead 8dee0c1281 [cron] Bump distribution date (2025-11-20) 2025-11-20 06:10:58 +00:00
Scott Lahteine 06c6c479dd 🚸 Immediate Buttons and Menu Items (#28180) 2025-11-19 22:01:42 -06:00
thinkyhead 402aab968c [cron] Bump distribution date (2025-11-19) 2025-11-19 00:33:07 +00:00
Scott Lahteine bf7433c937 make a friend 2025-11-18 12:15:12 -06:00
Scott Lahteine 81a9eb27ad use handlers 2025-11-18 12:05:18 -06:00
Scott Lahteine 6ed3ea9a6b ws 2025-11-18 11:11:24 -06:00
Scott Lahteine 371ab1eea2 Add BUTTON*_IMMEDIATE option 2025-11-18 11:02:10 -06:00
Scott Lahteine e38075710d Menu item to run a G-code now 2025-11-18 10:48:36 -06:00
Scott Lahteine ea2e832dc8 Merge branch 'bugfix-2.1.x' into pr/26944 2025-11-18 10:25:09 -06:00
Scott Lahteine 85b82e3ab6 🎨 Misc. ws and formatting 2025-11-17 19:16:15 -06:00
Giuliano 543af426ef 🌐 Update Italian translation (#28177) 2025-11-17 18:40:59 -06:00
thinkyhead 646f4c7d69 [cron] Bump distribution date (2025-11-18) 2025-11-18 00:38:53 +00:00
Scott Lahteine 9788a35107 🩹 Commas for devcontainer.json 2025-11-17 18:08:09 -06:00
Scott Lahteine 2774ee8290 🎨 Misc patches from ProUI (2) 2025-11-17 18:04:19 -06:00
Scott Lahteine 4f39b9c09d 🎨 Misc patches from ProUI
Co-Authored-By: Miguel Risco-Castillo <mriscoc@users.noreply.github.com>
2025-11-17 17:28:13 -06:00
thinkyhead e6a615d882 [cron] Bump distribution date (2025-11-17) 2025-11-17 00:33:44 +00:00
Andrew 9d55440d38 🚸 'G27 P' parameter check (#28172)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-11-16 13:19:59 -06:00
ellensp c7e6b7924a 🚸🌡️ Refactor AUTOTEMP (2) (#28175)
Followup to #28155
2025-11-16 12:54:52 -06:00
ellensp c6f4bc1aa1 GCODE_MACROS_IN_EEPROM (2) (#28174) 2025-11-16 12:24:09 -06:00
Vedran 98c72a3b65 DIFFERENTIAL_EXTRUDER (#28023) 2025-11-16 12:22:03 -06:00
Harald Wagener ef8873d6ef 🔧 FLY D5 — Servo and Probe pins (#28166) 2025-11-16 09:12:38 -06:00
thinkyhead eb2b8a1ddb [cron] Bump distribution date (2025-11-16) 2025-11-16 00:35:14 +00:00
Steven Haigh a1a9904d32 🔨 Enhance mc-apply.py (#28157)
Enhance `mc-apply.py` with `configuration.py` features and value normalization:
- Verbose logging system with `--verbose` flag (0-2 levels)
- `fetch_example()` to download configs from GitHub (`examples/path` or URLs)
- `disable_all_options()` to comment out all `#define` statements
- Special directives support via directives JSON key
- Support for `[disable]`, `examples/path`, and direct URL directives

Implement value normalization for consistent behavior:
- "on", "true", true, "" => enable (uncomment `#define`)
- "off", "false", false => disable (comment out `#define`)
- All other values => set value (`#define OPTION value`)

Update example marlin_config.json to demonstrate different value formats and directive usage. Changes are fully backward compatible with existing JSON configuration files.
2025-11-15 15:44:16 -06:00
Scott Lahteine 1f3309ac06 🔨 Use config_dump 1 for mc.zip embedding 2025-11-14 23:47:20 -06:00
Andrew b9e89a5378 🩹 Fix NeoPixel for stm32f1-maple (#28128) 2025-11-14 19:11:00 -06:00
Skruppy e2250ce037 🩹 Fix case light menu build (#28143) 2025-11-14 19:06:22 -06:00
thinkyhead f872750b70 [cron] Bump distribution date (2025-11-15) 2025-11-15 00:31:14 +00:00
nanctil c9488b4f63 🐛 Fix Teensy 4.x stepper timing via HAL_timer_set_compare (#28169) 2025-11-14 13:52:34 -06:00
Scott Lahteine 8cd9c06084 🩹 Teensy 4.x timer mods 2025-11-14 13:46:37 -06:00
Scott Lahteine 1c6b723ee6 🧑‍💻 Timer general cleanup
erps
2025-11-14 13:45:55 -06:00
thinkyhead 0f044f76ec [cron] Bump distribution date (2025-11-14) 2025-11-14 06:10:47 +00:00
Axel Sepúlveda 8342a5a83e 🐛 Fix TPARA kinematics (#28068) 2025-11-13 20:14:57 -06:00
thinkyhead e3fa27ac9f [cron] Bump distribution date (2025-11-13) 2025-11-13 00:31:59 +00:00
narno2202 3293b2780e 🩹 Prevent ÷ 0 in FT Motion (#28150) 2025-11-12 16:06:36 -06:00
thinkyhead ebf9aa5c82 [cron] Bump distribution date (2025-11-12) 2025-11-12 06:11:20 +00:00
Scott Lahteine 54fe84ea32 🧑‍💻 Missed some
Followup to ba8b685ede
2025-11-11 22:01:38 -06:00
Scott Lahteine b0f6155d99 🧑‍💻 FTM trajectory code tweaks 2025-11-11 21:47:58 -06:00
Scott Lahteine ba8b685ede 🧑‍💻 Old macros cleanup 2025-11-11 21:47:58 -06:00
ellensp 579545177d GCODE_MACROS_IN_EEPROM (#28114) 2025-11-11 19:51:22 -06:00
thinkyhead 10009b018d [cron] Bump distribution date (2025-11-11) 2025-11-11 00:32:37 +00:00
Scott Lahteine 689c7b83e1 🎨 Move bubblesort string 2025-11-10 12:01:45 -06:00
Scott Lahteine 9393c1ed1b 🩹 Fix MBL + FT Motion build 2025-11-10 12:01:31 -06:00
Scott Lahteine cda684b6fd 🎨 LCD cosmetic, babystep size 2025-11-10 00:18:11 -06:00
David Buezas a420e3c155 🔧 PROBE_WAKEUP_TIME_MS 30 for BIQU probes (#28153) 2025-11-09 23:43:37 -06:00
Scott Lahteine 88a4e55945 🩹 Fix SMOOTH_SET
Followup to ce7edc6223
2025-11-09 21:25:46 -06:00
Scott Lahteine 27dcfe0ea8 New rule in use_example_configs 2025-11-09 18:37:18 -06:00
thinkyhead cf609152c2 [cron] Bump distribution date (2025-11-10) 2025-11-10 00:34:05 +00:00
Scott Lahteine 6e01ba3ce8 🧑‍💻 Probe code refinements 2025-11-09 17:34:18 -06:00
thinkyhead cf9f205030 [cron] Bump distribution date (2025-11-09) 2025-11-09 01:43:06 +00:00
ellensp 59cee1cb87 🔧 Custom boot screen for Graphical TFT (#28160) 2025-11-08 17:20:58 -06:00
ellensp e53f2a3d82 🩹 Fix __ARM_ARCH check to omit M0+ (#28162) 2025-11-08 17:03:05 -06:00
narno2202 412513be43 FTM_RESONANCE_TEST (3) (#28164) 2025-11-08 17:01:05 -06:00
Mihai f946b60670 S_CURVE_FACTOR (#27101) 2025-11-08 16:48:09 -06:00
Scott Lahteine 90363cefd0 🎨 Conditional HAS_VOLUMETRIC_EXTRUSION 2025-11-08 16:41:53 -06:00
Scott Lahteine 07630e6559 🎨 per => pct 2025-11-08 16:15:20 -06:00
Scott Lahteine 5b34686dda FTM_RESONANCE_TEST (2) 2025-11-08 16:04:40 -06:00
narno2202 667aa15b87 FTM_RESONANCE_TEST (#28158) 2025-11-08 15:16:06 -06:00
thinkyhead f48aa53d7c [cron] Bump distribution date (2025-11-08) 2025-11-08 00:30:09 +00:00
Scott Lahteine dd3c3d09f2 🩹 Quieter FTM build (2) 2025-11-07 12:43:38 -06:00
Scott Lahteine d1f2b2d27b 🩹 Quieter FTM build 2025-11-07 01:43:22 -06:00
Scott Lahteine 2073b67e45 FT Motion test EXTRUDERS > 1 (2) 2025-11-07 00:21:09 -06:00
Scott Lahteine e176df1e6d 🎨 FT Motion comments, style
Resolves #28151
2025-11-06 23:14:43 -06:00
thinkyhead f6dbb59748 [cron] Bump distribution date (2025-11-07) 2025-11-07 00:31:58 +00:00
Scott Lahteine 39697628e7 FT Motion test EXTRUDERS > 1 2025-11-06 16:36:45 -06:00
thinkyhead e9c5b99722 [cron] Bump distribution date (2025-11-06) 2025-11-06 06:10:44 +00:00
Scott Lahteine 8e9e039672 🧑‍💻 Rename Trajectory Gen 2025-11-05 19:19:58 -06:00
Scott Lahteine ce7edc6223 🧑‍💻 Save some string space 2025-11-05 19:18:33 -06:00
Scott Lahteine 924c2ca0fe 🎨 Fix style snafus 2025-11-05 19:18:18 -06:00
thinkyhead e0f0a9491d [cron] Bump distribution date (2025-11-05) 2025-11-05 00:32:26 +00:00
ellensp 8547f4f5b9 🔨🐛 Don't use broken 'board = fysetc_f6_13' (#28159) 2025-11-04 01:31:57 -06:00
Scott Lahteine ac5836a2a2 🔨 Bring Makefile up to date 2025-11-04 01:16:23 -06:00
thinkyhead 6b14b948a9 [cron] Bump distribution date (2025-11-04) 2025-11-04 00:31:21 +00:00
Scott Lahteine 1774dbd539 🩹 Fix 'interval' type warning
Resolves #28156
2025-11-03 17:51:55 -06:00
zzcatvs e9810691ec FYSETC Spider King V1.1 (STM32H723ZG) (#27125) 2025-11-03 14:09:08 -06:00
Scott Lahteine 29ad078fda 🚸🌡️ Refactor AUTOTEMP, apply to LCD temp change (#28155)
Fixes #28154
2025-11-02 21:48:24 -06:00
narno2202 0c4beea9be 🩹 Fix FT_MOTION + DISTINCT_E_FACTORS (#28106)
Fixes #28105
2025-11-02 21:16:44 -06:00
thinkyhead 79bd65be35 [cron] Bump distribution date (2025-11-03) 2025-11-03 00:34:02 +00:00
Scott Lahteine 150425e480 🔨 Update MarlinSimUI commit ID 2025-11-02 16:25:42 -06:00
Scott Lahteine 61cc3cdf09 🩹 Followup fix SD Quicksort, FT Motion, Simulator 2025-11-02 15:53:08 -06:00
David Buezas 252085f462 🐛 Fix some FT Motion probing issues (#28096)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-11-02 01:19:03 -06:00
David Buezas 1ead60ec46 ️ FT Motion trajectories, smoothing, optimization (#28115)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
Co-authored-by: narno2202 <130909513+narno2202@users.noreply.github.com>
2025-11-01 23:50:48 -05:00
Scott Lahteine 5a0923ed28 🔧 Unified Linear Advance K
Part of #21827
2025-11-01 19:38:06 -05:00
Scott Lahteine 40beddeaa3 🚸 Simplified M493
Part of #21827
2025-11-01 19:38:06 -05:00
Scott Lahteine 05a64e2013 🚸 Fix 'M493 G', collisions 'E' 'O' (and 'M'), 'W' report
Part of #21827
2025-11-01 19:38:06 -05:00
thinkyhead 3fc45df62f [cron] Bump distribution date (2025-11-02) 2025-11-02 00:34:34 +00:00
Scott Lahteine 9c3d74f6d1 🩹 ProUI: Edit K for active E (2) 2025-11-01 18:57:12 -05:00
Scott Lahteine bdfb0cc63f 🩹 ProUI: Edit K for active E 2025-11-01 16:25:17 -05:00
Scott Lahteine 8bf127afe6 🎨 Aesthetic tweaks 2025-11-01 16:21:52 -05:00
Scott Lahteine 33ad711ee8 Update some CI tests 2025-10-31 20:20:05 -05:00
Scott Lahteine 20e99497dd 🎨 AxisEnum style 2025-10-31 20:20:05 -05:00
Scott Lahteine baa20d9ea2 🎨 Misc. HAL types, planner sq, etc. 2025-10-31 20:20:05 -05:00
Scott Lahteine 367bcedea7 🧑‍💻 Reuse FTM smoothing edit item macro 2025-10-31 20:20:05 -05:00
Scott Lahteine 5d59779a80 🧑‍💻 Combine G60-G61 (#28149) 2025-10-31 20:17:18 -05:00
thinkyhead 1c19cfcbc7 [cron] Bump distribution date (2025-11-01) 2025-11-01 00:34:02 +00:00
ellensp 14a83342e1 🔨 Add LIB_MAX31855 ini link (#28146) 2025-10-31 18:08:50 -05:00
Scott Lahteine f11f42a23e 🐛 Fix MMU3 resume position (#28148) 2025-10-31 18:02:05 -05:00
thinkyhead 4bfbe70d66 [cron] Bump distribution date (2025-10-30) 2025-10-30 00:32:29 +00:00
Skruppy 93394f1ff5 Use TMC SoftwareSerial only if required (#28145) 2025-10-28 21:01:17 -05:00
Scott Lahteine fa4b73ee04 📝 Document Marlin config includes 2025-10-28 19:45:50 -05:00
thinkyhead 5249d10369 [cron] Bump distribution date (2025-10-29) 2025-10-29 00:32:37 +00:00
Scott Lahteine 89a43a8b1a 🧑‍💻 Same types conversion suite 2025-10-27 21:59:23 -05:00
Scott Lahteine db279967da 🧑‍💻 Simpler type conversion (defer!) 2025-10-27 20:57:50 -05:00
thinkyhead 41c860dce1 [cron] Bump distribution date (2025-10-28) 2025-10-28 00:30:25 +00:00
Scott Lahteine bfb5430217 🔨 Comments for newer compilers 2025-10-27 17:27:56 -05:00
Scott Lahteine e1e13ad72c 🎨 The Ultraviolet Apostrophe 2025-10-27 17:27:56 -05:00
Scott Lahteine c941ce1a5b 🧑‍💻 Simpler type conversion 2025-10-27 17:27:56 -05:00
Scott Lahteine 7c760bd232 🧑‍💻 Misc. MMU3 tweaks, less STL 2025-10-27 17:27:56 -05:00
Scott Lahteine 42dc89ad32 🔨 Use 'which' in Makefile
Fixes #28141
2025-10-27 11:40:00 -05:00
Scott Lahteine 3a9394c308 🧑‍💻 Sync blocks 'const' hint 2025-10-27 11:13:40 -05:00
Scott Lahteine 97b5c2d3ea 🧑‍💻 Fix, extend 'types.h' operators 2025-10-27 11:12:44 -05:00
Scott Lahteine f635a9d0c3 🎨 Negation without repetition 2025-10-26 23:37:39 -05:00
thinkyhead d7550018e3 [cron] Bump distribution date (2025-10-27) 2025-10-27 00:43:00 +00:00
Scott Lahteine 6918959c07 📝 Comment for 'M900 U' 2025-10-26 16:07:17 -05:00
Scott Lahteine 908d30d4ce 🎨 Some chmod ug-x 2025-10-26 01:36:21 -05:00
ellensp 49b11f9490 🔧 ZONESTAR ZM3E2 shared MS1|2 pins (#28126) 2025-10-25 22:00:33 -05:00
thinkyhead d09bf9d088 [cron] Bump distribution date (2025-10-26) 2025-10-26 00:33:31 +00:00
Scott Lahteine 47727cf0ae 🩹 Fix TFT Color UI (#28140)
Followup to #28103
2025-10-25 15:56:55 -05:00
Scott Lahteine 51ce1a147d 🔧 FT Motion n00b warnings 2025-10-25 01:48:10 -05:00
Scott Lahteine 0f6f125724 🧑‍💻 Fix, improve test scripts [3] 2025-10-25 01:18:27 -05:00
Scott Lahteine 52a4954b8a 🐛 FT Motion respect linearAdvEna flag 2025-10-25 01:13:41 -05:00
Scott Lahteine 4cab99e1d1 🧑‍💻 Fix, improve test scripts (2) 2025-10-24 22:43:24 -05:00
thinkyhead 2c57b184da [cron] Bump distribution date (2025-10-25) 2025-10-25 00:30:02 +00:00
Andrew 14b5d5ba84 🧑‍💻 Fix, improve test scripts (#28136)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-10-24 19:05:59 -05:00
ellensp 5bd28cd840 🩹 Fix ZONESTAR_12864OLED build (et.al.) (#28137) 2025-10-24 12:04:16 -05:00
thinkyhead fbc2c76870 [cron] Bump distribution date (2025-10-24) 2025-10-24 00:28:38 +00:00
Scott Lahteine 4349f4ab0c 🧑‍💻 Add 'make clean' 2025-10-23 17:44:23 -05:00
Harald Wagener 9eea88bbfc Update README.md (#28135)
* Update README.md

- Add some details about configuration branches
- Link to the download page
- Reword sections on 8 bit boards
- Add a short section on 32 bit boards
- Update Paragraph on HALs

* Update README.md

fix typo

Co-authored-by: David Buezas <dbuezas@users.noreply.github.com>

* code formatting with prettier, remove https URI to be consistent with other links

* expand on HALs

---------

Co-authored-by: David Buezas <dbuezas@users.noreply.github.com>
2025-10-23 13:56:03 -05:00
Scott Lahteine 3a77a7eefd 🐛 Fix SDSORT_QUICK with stack
Followup to #28069
2025-10-23 00:04:25 -05:00
thinkyhead 788e86ccc6 [cron] Bump distribution date (2025-10-23) 2025-10-23 00:30:51 +00:00
Scott Lahteine 27da1995f3 🚸 FT Motion toggle() more safely 2025-10-22 15:06:28 -05:00
Scott Lahteine e3a5319e3c 🎨 Misc. cleanup, probe FR 2025-10-22 15:04:42 -05:00
Scott Lahteine e4bc675fbf 🚸 Exit M122 S/P without report 2025-10-22 15:04:28 -05:00
Scott Lahteine 898dd19175 🔧 Update config.ini 2025-10-22 14:08:08 -05:00
thinkyhead 1b307f7c99 [cron] Bump distribution date (2025-10-22) 2025-10-22 06:34:59 +00:00
ellensp d5977e7e2d 🔧 Separate Teensy 4.0 / 4.1 (#28122)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-10-22 00:41:38 -05:00
thinkyhead 7aaaaec355 [cron] Bump distribution date (2025-10-21) 2025-10-21 00:32:13 +00:00
Scott Lahteine 8acd39c494 ️ Prefer multiply over divide 2025-10-20 19:13:17 -05:00
narno2202 cfac549240 🚸 Fix MKS H43 float display (#28121) 2025-10-20 12:54:13 -05:00
Scott Lahteine 0279f9cf09 🧑‍💻 Use Marlin maths macros 2025-10-20 11:56:16 -05:00
Scott Lahteine 37b5b49cce 📝 Remove old reference 2025-10-20 02:25:57 -05:00
thinkyhead 1a5550f643 [cron] Bump distribution date (2025-10-20) 2025-10-20 00:33:32 +00:00
Scott Lahteine a3929b435b Moved BIQU/BX config 2025-10-19 19:01:04 -05:00
thinkyhead 7e6e25929b [cron] Bump distribution date (2025-10-19) 2025-10-19 00:34:38 +00:00
Scott Lahteine f2b2389b8f 🔨 Rename to change case (2) 2025-10-18 18:30:43 -05:00
Scott Lahteine 9012b9a993 🔨 Rename to change case (1) 2025-10-18 18:30:39 -05:00
vicitacal fde861ab8c 🚸 Fix MKS UI Decrease Feed Rate (#28109) 2025-10-18 18:20:23 -05:00
ellensp 9f0fa5a040 M265 I2C_SCANNER (#28117) 2025-10-18 18:18:02 -05:00
Scott Lahteine fb95e66652 📝 (s) for FTM_MAX_SMOOTHING_TIME 2025-10-18 17:51:04 -05:00
narno2202 c44b9c1c28 🐛 Fix PLR with FT_MOTION (#28116)
Fixes #28102
2025-10-18 17:21:19 -05:00
ellensp 3753cb9a94 🧑‍💻 Fill in debuggable pins (#28119) 2025-10-18 17:17:11 -05:00
thinkyhead 81d8663f1f [cron] Bump distribution date (2025-10-18) 2025-10-18 00:28:29 +00:00
Andrew 2860d048e6 🧑‍💻 Fix linux_native_test (#28113) 2025-10-16 20:10:45 -05:00
thinkyhead cc20b30775 [cron] Bump distribution date (2025-10-17) 2025-10-17 00:30:50 +00:00
Andrew 21f0333b43 SDSORT_QUICK (#28069) 2025-10-16 17:30:22 -05:00
Scott Lahteine 70d910ac8e 🚸 Fix Color UI menu item extra touch 2025-10-16 15:43:23 -05:00
Scott Lahteine 23e7905b20 ️ Optimize Graphical TFT (#28103) 2025-10-16 13:42:39 -05:00
thinkyhead 5e1a1fffcf [cron] Bump distribution date (2025-10-09) 2025-10-09 00:29:59 +00:00
Scott Lahteine e48dd40b53 🧑‍💻 Misc. LCD pins corrections 2025-10-07 21:53:05 -05:00
David Buezas 4ddf626d46 🐛 FT Motion trajectory fixes (#28101) 2025-10-07 19:50:16 -05:00
thinkyhead 991fc9cf63 [cron] Bump distribution date (2025-10-08) 2025-10-08 00:29:44 +00:00
ellensp ef3e9134dc 🔨 More compatible Makefile (#28094) 2025-10-07 02:30:06 -05:00
Scott Lahteine 35da223f0a 🧑‍💻 Py scripts refinements 2025-10-07 02:26:49 -05:00
Scott Lahteine 0937fe55a4 🎨 Fix echoes, dialect, etc. 2025-10-07 00:51:46 -05:00
Scott Lahteine de98df1651 🎨 Apply sq, cu, const 2025-10-06 23:28:38 -05:00
thinkyhead d7156decdc [cron] Bump distribution date (2025-10-07) 2025-10-07 00:30:11 +00:00
ThomasToka e43c2752c7 🧑‍💻 Update Docker setup (#27998) 2025-10-06 14:36:36 -05:00
thinkyhead bdf8b0703a [cron] Bump distribution date (2025-10-05) 2025-10-05 00:33:18 +00:00
Sylvain a506701a8b WANHAO_D9 (need EXP) (#28073) 2025-10-04 14:23:40 -05:00
Scott Lahteine b60838508b 🧑‍💻 Simplify some flag params 2025-10-03 23:17:51 -05:00
thinkyhead 0f76f17f16 [cron] Bump distribution date (2025-10-04) 2025-10-04 00:28:11 +00:00
Scott Lahteine c00415b017 🧑‍💻 Simpler M260 R S 2025-10-03 18:49:40 -05:00
Scott Lahteine 3b149c3505 Skip zero length homing_move (#28090)
Fixes #23227

Co-authored-by: Alexey Melnikov <917089+sorgelig@users.noreply.github.com>
2025-10-03 14:16:07 -05:00
Scott Lahteine d20d1f8712 🔨 Extend misplaced config check (#28093) 2025-10-03 11:41:55 -05:00
Scott Lahteine c626e3efb2 🩹 BLTouch raise before deploy
Fixes #28092
2025-10-03 09:57:53 -05:00
thinkyhead 1cea29598c [cron] Bump distribution date (2025-10-03) 2025-10-03 00:29:01 +00:00
Scott Lahteine cb0706f9cc 🔨 Fix misplaced config files check
Fixes #28091
2025-10-02 13:44:37 -05:00
Scott Lahteine dadbedc4fd 📝 Prettier FINDA protocol 2025-10-02 01:15:12 -05:00
Scott Lahteine 3165beeba0 🩹 Mitigate watchdog timeout for file ops
See #28064, #28069
2025-10-02 00:53:25 -05:00
narno2202 1c9b1240ec 🔧 Option to use FT_MOTION for homing / probing (#28030)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-10-01 23:51:11 -05:00
Scott Lahteine 122dfa13a2 🧑‍💻 Compatible sorted 'find' 2025-10-01 21:29:34 -05:00
thinkyhead b32a818f37 [cron] Bump distribution date (2025-10-02) 2025-10-02 00:29:06 +00:00
Scott Lahteine d8b83160ab 🔧 Configurator options TFT_FONT / TFT_THEME 2025-10-01 18:54:40 -05:00
ellensp 98d79fb8bb 🐛 Fix 'T' tool index handling (#28086) 2025-10-01 18:21:14 -05:00
David Buezas eaefa299fb ️ FTMotion Trajectory: Fix for short blocks (silent curves), add S-curve (#28082) 2025-10-01 17:27:47 -05:00
ellensp ba840750a0 🔨 Fix font data script #include handling (#28085) 2025-10-01 17:26:11 -05:00
Andrew cdc960fd1d 🔨 Remove (BSD) -d flag from 'find' (#28013) 2025-10-01 15:47:10 -05:00
Scott Lahteine c0a544d385 🚸 Filament Sensor, M412 changes 2025-10-01 14:46:44 -05:00
thinkyhead 84b22fcc1d [cron] Bump distribution date (2025-09-30) 2025-09-30 00:30:12 +00:00
Scott Lahteine c6cd10a92d 🧑‍💻 Shaped axis macros, etc. (#28084) 2025-09-29 15:24:58 -05:00
thinkyhead d08a7d4fd2 [cron] Bump distribution date (2025-09-29) 2025-09-29 00:31:25 +00:00
David Buezas 0ee1c1e4e1 🐛🚸 Fix stale LA block flag, FT Motion reporting (#28078) 2025-09-28 18:14:14 -05:00
David Buezas dc9e57464f FTMotion Z shaping, axis sync, axis smoothing (#28055) 2025-09-27 19:42:33 -05:00
thinkyhead 657929740f [cron] Bump distribution date (2025-09-28) 2025-09-28 00:34:33 +00:00
Bob Kuhn 6e74409c14 🐛 Fix STM32 I2C 2-wire LCD, Soft I2C impl. (#26433) 2025-09-27 02:25:03 -05:00
thinkyhead 5af8425776 [cron] Bump distribution date (2025-09-27) 2025-09-27 00:29:05 +00:00
ThomasToka 0ca860b292 🧑‍💻 Resolve unused ftm_active warning (#28076) 2025-09-26 16:16:39 -05:00
ellensp 4dd5b713eb 🚸 M402 Report (BLTouch HS Mode) (#28072) 2025-09-26 04:03:53 -05:00
12oclocker 0628573fc3 🩹 Prevent RAMPS default X_MAX_PIN messing up AnyCubic i3 Mega (#28038) 2025-09-26 03:21:43 -05:00
Scott Lahteine 52cc705e60 🧑‍💻 Use basic PGM string with "S_FMT" 2025-09-26 02:40:28 -05:00
Scott Lahteine 2f987accaa 🧑‍💻 Pass Z to UBL::shift_mesh_height
Co-Authored-By: Selali <17497673+selalipop@users.noreply.github.com>
2025-09-25 23:52:57 -05:00
Scott Lahteine 66aa848b2f 🐛 Trigger instant runout on filament jam (#28074) 2025-09-25 23:39:52 -05:00
Scott Lahteine 6f3de26a4d 🧑‍💻 Prefer float over float& (#25716) 2025-09-25 23:32:32 -05:00
Scott Lahteine b723e3fd02 🩹 Resume motion tracking on runout.reset()
Fix an issue where the filament motion sensor is ignored after a runout is resolved.
2025-09-25 22:18:15 -05:00
thinkyhead 7e4c6db12d [cron] Bump distribution date (2025-09-26) 2025-09-26 00:29:25 +00:00
narno2202 e228a222a3 🩹 Fix LA block flag for FTMotion (2) (#28070) 2025-09-25 15:47:31 -05:00
thinkyhead fdac56da15 [cron] Bump distribution date (2025-09-25) 2025-09-25 12:12:25 +00:00
BeowulfNode42 7e62b60c94 🔧 Allow CHITU3D V6 override of Z_STOP_PIN (#28059) 2025-09-25 03:09:21 -05:00
Andrew b6b0fccd5f 🚸 ProUI updates for Linear Advance (#28067) 2025-09-25 02:27:46 -05:00
thinkyhead f2f6b6bd85 [cron] Bump distribution date (2025-09-23) 2025-09-23 18:09:48 +00:00
David Buezas 6ff18a942c 🩹 Fix LA block flag for FTMotion (#28065) 2025-09-23 13:02:44 -05:00
thinkyhead 25a2a89517 [cron] Bump distribution date (2025-09-22) 2025-09-22 00:33:02 +00:00
David Buezas 5917aa73b5 ️ Fix K, improve FTMotion linear advance (#28058) 2025-09-21 17:21:53 -05:00
thinkyhead d0dc3b619f [cron] Bump distribution date (2025-09-15) 2025-09-15 00:32:42 +00:00
ThomasToka d628d7de44 🔨 Improve build output (#28051)
- Respect bootloader offset for `maximum_flash_size` output
- Match the .elf name to the firmware name.
2025-09-14 18:58:00 -05:00
ellensp 8fe6bc6745 LIGHTWEIGHT_UI for Native/Simulator (#28049) 2025-09-14 18:31:14 -05:00
Andrew dcbcbb54f9 🧑‍💻 Update datetime on same config rebuild (#28020) 2025-09-14 16:15:38 -05:00
ellensp 41f9eec4df 🩹 Retain TMC_DEBUG wrappers (#28052) 2025-09-14 14:47:14 -05:00
ellensp 33e942514b 📌 U8glib-HAL v0.5.5 (#28044) 2025-09-14 14:22:45 -05:00
thinkyhead 2aa9f70f5e [cron] Bump distribution date (2025-09-14) 2025-09-14 06:09:43 +00:00
Scott Lahteine 8aac26275e 🎨 Clean up FTM, etc. 2025-09-13 23:05:41 -05:00
thinkyhead 294903439a [cron] Bump distribution date (2025-09-11) 2025-09-11 00:29:48 +00:00
David Buezas daa68d560e 🐛 Fix FT Motion step rate instability (#28043) 2025-09-10 18:24:32 -05:00
thinkyhead 4ce809380b [cron] Bump distribution date (2025-09-09) 2025-09-09 00:30:19 +00:00
Scott Lahteine a614352fcf 🧑‍💻 Some FT Motion renames
To reduce changes in #28043
2025-09-07 22:42:06 -05:00
narno2202 a54daeeb39 ️ Optimize FT Motion load block data (#27991) 2025-09-07 20:38:37 -05:00
thinkyhead fc4abd1335 [cron] Bump distribution date (2025-09-08) 2025-09-08 00:32:06 +00:00
Scott Lahteine 881ee69f34 SENSORLESS_STALLGUARD_DELAY 2025-09-06 21:50:35 -05:00
thinkyhead 5a8b9d649a [cron] Bump distribution date (2025-09-07) 2025-09-07 00:32:58 +00:00
ellensp e80d8e9dcf 🐛 Fix UART pins for GD32 MFL (#28011) 2025-09-06 13:22:45 -05:00
thinkyhead 950d141958 [cron] Bump distribution date (2025-09-06) 2025-09-06 06:08:36 +00:00
Thijs Triemstra 52ea53a3dd 🎨 Spelling corrections (#28026) 2025-09-05 22:14:09 -05:00
Andrew 7526309ccf 🧑‍💻 Tweaks to our aging Arduino SdFat Library code (#28031)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-09-05 22:00:28 -05:00
ellensp 4342a0f512 🩹 Fix RAMPS MINIPANEL BEEPER_PIN (#28033) 2025-09-05 21:13:16 -05:00
Scott Lahteine 4bca73dc5a Validate source formatting (#28028) 2025-09-05 20:30:39 -05:00
ellensp 67dc3e432f 🔧 Fix bad Config.h sanity-check (#28027) 2025-09-05 20:27:16 -05:00
thinkyhead 349c3a7243 [cron] Bump distribution date (2025-08-26) 2025-08-26 18:09:58 +00:00
Vovodroid 1bee2dab60 🩹 Fix PLR Z move precision (#27965) 2025-08-26 12:33:28 -05:00
Keith Bennett 1e51ff1306 🔧 Creality UI string heading & title options (#27944) 2025-08-26 12:28:49 -05:00
ellensp aa0558eb3a Creality v252 board (2) (#28016)
Followup to #27996
2025-08-26 12:17:27 -05:00
thinkyhead 0878147f31 [cron] Bump distribution date (2025-08-18) 2025-08-18 00:35:57 +00:00
Andrew 7086ca632f 🧑‍💻 Omit unused ADC pins (#28007)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-08-16 20:41:37 -05:00
thinkyhead 93783e993b [cron] Bump distribution date (2025-08-17) 2025-08-17 00:36:32 +00:00
ellensp ab69f87989 Creality v252 board (#27996) 2025-08-16 18:26:59 -05:00
narno2202 b0c0074092 🔧 Support EXTRUDERS 0 with FT_MOTION (#27984) 2025-08-16 18:21:27 -05:00
Scott Lahteine 2110215a16 🧑‍💻 Add *_AXIS_PAIRED_LIST macros 2025-08-16 17:24:20 -05:00
ellensp 50d847a2fe 🔧 Support more CONTROLLER_FAN pins (2) (#28012)
Followup to #27961
2025-08-16 16:19:19 -05:00
thinkyhead 61c57825d7 [cron] Bump distribution date (2025-08-14) 2025-08-14 12:13:12 +00:00
Hannes f81ca65a16 🐛 Provide 'M20 F' (list binary files) as needed (#27977)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-08-14 02:23:01 -05:00
thinkyhead a020a09903 [cron] Bump distribution date (2025-08-13) 2025-08-13 18:34:14 +00:00
Marcio T. 6361146f0f 🩹 Fix FILAMENT_MOTION_SENSOR + MarlinUI build (#27994) 2025-08-13 12:37:23 -05:00
Andrew 4fb984e960 🔨 Clean up and improve some Python scripts (#27752) 2025-08-13 12:33:09 -05:00
ellensp 081458a3c8 🔧 Support more CONTROLLER_FAN pins (#27961) 2025-08-13 12:26:51 -05:00
ellensp 02fe1ff95e 🩹 Distinct types for LEDs 1/2 (#27959) 2025-08-13 12:04:16 -05:00
thinkyhead beb3a0fc4b [cron] Bump distribution date (2025-08-09) 2025-08-09 00:32:28 +00:00
ellensp 71834e204b 🔧 Sanity check PID_MAX, MAX_BED_POWER (#27979) 2025-08-08 14:08:48 -05:00
ellensp 9417af14e9 🩹 Fix G29_RETRY_AND_RECOVER + ExtUI (#27973) 2025-08-08 13:58:23 -05:00
ellensp 84448a78be 🩹 Fix Origin UI second extruder (#27974) 2025-08-08 13:50:00 -05:00
ellensp 1244a21a21 🔧 Extend bad merge checking (#27990) 2025-08-08 13:38:52 -05:00
thinkyhead eff0de499f [cron] Bump distribution date (2025-07-30) 2025-07-30 00:35:08 +00:00
Scott Lahteine de1b97a0ce Small checkout for each test 2025-07-29 13:13:15 -05:00
thinkyhead 624f429086 [cron] Bump distribution date (2025-07-29) 2025-07-29 06:11:28 +00:00
Vovodroid 0303a1bfb0 🔧 Configurable filament runout motion sensor distance (#27836) 2025-07-28 23:26:42 -05:00
Scott Lahteine 573c21e690 🩹 Fix EEPROM size sign warning 2025-07-28 23:23:13 -05:00
Scott Lahteine 80b8e66189 🎨 Tweak an LCD note 2025-07-28 22:46:34 -05:00
thinkyhead 8ec9c37940 [cron] Bump distribution date (2025-07-23) 2025-07-23 00:34:52 +00:00
Darsey Litzenberger 2e8833e315 🩹 Allow Nozzle Wipe odd linear count (2) (#27987) 2025-07-22 17:44:36 -05:00
thinkyhead c403381172 [cron] Bump distribution date (2025-07-19) 2025-07-19 06:09:45 +00:00
Darsey Litzenberger 02e5225e10 🩹 Allow Nozzle Wipe odd linear count (#27952) 2025-07-19 00:48:08 -05:00
Keith Bennett 28839c60da ✏️ Fix Creality UI PLR typo (#27943) 2025-07-18 23:07:46 -05:00
RainMotorsports e7ac0d14cd 🩹 Prevent BED_TRAMMING_Z_HOP too far (#27939) 2025-07-18 22:42:26 -05:00
thinkyhead 9a23bcec0b [cron] Bump distribution date (2025-07-18) 2025-07-18 00:33:57 +00:00
Scott Lahteine 6b9ec417b6 🩹 Fix various typos 2025-07-17 15:18:07 -05:00
thinkyhead 66474f6a13 [cron] Bump distribution date (2025-07-12) 2025-07-12 06:09:26 +00:00
Scott Lahteine 4f0329bb43 📝 Update links to Fysetc Mini12864_Panel 2025-07-11 21:05:37 -05:00
thinkyhead dc6f23e435 [cron] Bump distribution date (2025-06-29) 2025-06-29 00:37:16 +00:00
Scott Lahteine c7fc6eeb1e 🚸 Match M920 indexing to M919 2025-06-28 16:37:08 -05:00
thinkyhead 72c0437b48 [cron] Bump distribution date (2025-06-25) 2025-06-25 00:32:59 +00:00
Scott Lahteine a6377e5215 🐛 Fix misc. build issues 2025-06-24 16:59:56 -05:00
thinkyhead 0459407a8e [cron] Bump distribution date (2025-06-23) 2025-06-23 00:35:18 +00:00
ellensp 685ccf3fdf 🔧 Fix TEMP_SENSOR_BED_USES_SW_SPI (#27938)
Followup to #26441
2025-06-22 12:40:29 -05:00
thinkyhead de219dcd63 [cron] Bump distribution date (2025-06-22) 2025-06-22 12:38:05 -05:00
ellensp cdc996dd68 🔧 Fix SPI_FLASH_BACKUP flag (#27934)
Followup to #27373
2025-06-22 12:38:05 -05:00
Vovodroid fe6eb1745f 🐛 Fix NONLINEAR_EXTRUSION enabled check (#27926)
Followup to #27819
2025-06-21 16:36:22 -05:00
erril007 533d752707 EVENT_GCODE_(BEFORE|AFTER)_G34 (#27930) 2025-06-20 20:50:13 -05:00
thinkyhead 037b0096e2 [cron] Bump distribution date (2025-06-21) 2025-06-21 00:32:24 +00:00
ellensp eefd63e408 🐛 Fix Hotend > 0 Preheat (#27932) 2025-06-20 16:18:40 -05:00
Scott Lahteine 5e410e35ab 🩹 Minor fixes, updates, comments 2025-06-20 16:05:06 -05:00
thinkyhead 62bb61b3d9 [cron] Bump distribution date (2025-06-17) 2025-06-17 00:32:42 +00:00
Andrew a7f12169b9 📝 Review & update G-code comments (#27921) 2025-06-16 14:23:17 -05:00
thinkyhead 29ceba972c [cron] Bump distribution date (2025-06-15) 2025-06-15 00:36:55 +00:00
Keith Bennett 7965e066c7 🧑‍💻 Some TMC2240 updates (2) (#27919)
Followup to #27901
2025-06-14 16:22:29 -05:00
ellensp f499735280 🩹 Fix Ender-3 S1 pin EXP3-4 (#27915) 2025-06-13 22:27:05 -05:00
Scott Lahteine 1e03f696f5 🧑‍💻 Some TMC2240 updates (#27901) 2025-06-13 22:13:09 -05:00
thinkyhead 7ac308fe4d [cron] Bump distribution date (2025-06-14) 2025-06-14 00:31:29 +00:00
Scott Lahteine 54a7ce999f 🎨 Update MPC sanity checka
Followup to #27911
2025-06-13 19:28:45 -05:00
tombrazier 89416a583c MPC_PTC (#27911) 2025-06-13 19:10:03 -05:00
Scott Lahteine 9ad9323aac 🎨 Minor ternary style tweak 2025-06-13 18:10:34 -05:00
thinkyhead cf7f5bcdee [cron] Bump distribution date (2025-06-11) 2025-06-11 00:32:31 +00:00
Andrew 950f492ce7 🩹 Fix ProUI edit Lin.Adv.K (#27895) 2025-06-10 15:34:54 -05:00
narno2202 1bb1603886 🎨 FT Motion cleanup (#27910) 2025-06-10 15:31:02 -05:00
Scott Lahteine 68dc89cf75 🎨 Align Bed PID 2025-06-10 15:29:22 -05:00
thinkyhead c2d586cf5f [cron] Bump distribution date (2025-06-10) 2025-06-10 00:32:33 +00:00
Scott Lahteine fbce327402 🧑‍💻 TMCStepper => 0.8.7 2025-06-09 13:55:42 -05:00
staff1010 c09638f821 🚸 Improve XPT2046 touch, MKS UI calibration (#27892) 2025-06-09 13:37:38 -05:00
Scott Lahteine 348099dabb 🎨 MKS UI name adjustments 2025-06-09 13:35:34 -05:00
David Buezas fbee2a2ff7 ️ SMOOTH_LIN_ADVANCE + S_CURVE_ACCELERATION (#27827) 2025-06-09 13:26:57 -05:00
thinkyhead 781d9c470e [cron] Bump distribution date (2025-06-09) 2025-06-09 06:10:43 +00:00
RainMotorsports 5a5354107b E3D BigBox Rumba board (#27897) 2025-06-08 22:18:35 -05:00
thinkyhead 127bc94891 [cron] Bump distribution date (2025-06-05) 2025-06-05 00:32:27 +00:00
Andrew fca60335e1 🩹 Fix Nonlinear Extrusion build (#27906)
Fixes #27902
2025-06-03 19:54:22 -05:00
thinkyhead 27621290b8 [cron] Bump distribution date (2025-06-04) 2025-06-04 00:33:43 +00:00
Scott Lahteine 951b8be3a1 🩹 Update Creality CR4NS
Followup to #27003
2025-06-03 18:48:33 -05:00
thinkyhead f1bb46f5b8 [cron] Bump distribution date (2025-06-03) 2025-06-03 00:32:58 +00:00
David Buezas 3bb9364c44 🧑‍💻 Add TMC2240 temperature reading (#27903) 2025-06-02 18:59:01 -05:00
Scott Lahteine 7df503de93 🩹 Fix FLY D5 / D7 serial for TMC2208
See MarlinFirmware/TMCStepper#5
2025-06-02 18:23:17 -05:00
David Buezas 098e0961dc 🩹 TMC2240 diag0 push-pull active HIGH (#27907) 2025-06-02 17:34:02 -05:00
Scott Lahteine 6ea4a16212 🌐 Automated README translations 2025-06-02 16:51:07 -05:00
Scott Lahteine 9f6cafbae3 🩹 Fix Nozzle Cleaning wait for pre-set temp
Fixes #27882
2025-06-01 20:47:55 -05:00
thinkyhead 8c6e9526b0 [cron] Bump distribution date (2025-06-02) 2025-06-02 00:34:11 +00:00
Scott Lahteine cc05123a80 🩹 Fix EXP3_03_PIN for CREALITY_V24S1_301F4
Fixes #27904

Co-Authored-By: Nexrem <kristiana2000@abv.bg>
2025-06-01 16:31:04 -05:00
thinkyhead 823014868c [cron] Bump distribution date (2025-06-01) 2025-06-01 01:15:51 +00:00
Scott Lahteine 7c30124f80 📌 Versions for adafruit "SdFat", "Adafruit SPIFlash" 2025-05-31 18:17:43 -05:00
Scott Lahteine 3ddf728333 🩹 Fix some missed ONBOARD_SDIO 2025-05-31 16:54:57 -05:00
Scott Lahteine 9dbce712fc 🧑‍💻 TMCStepper => 0.8.5 2025-05-31 16:14:04 -05:00
Scott Lahteine b59251c388 🧑‍💻 Macros for larger sets 2025-05-31 16:06:20 -05:00
Scott Lahteine c377237fd8 🧑‍💻 Tweak G90 / G91 declaration 2025-05-31 16:06:19 -05:00
thinkyhead a2452a577b [cron] Bump distribution date (2025-05-31) 2025-05-31 06:08:46 +00:00
Vovodroid a6bfdf351f NONLINEAR_EXTRUSION_DEFAULT_ON (#27819)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-30 22:53:21 -05:00
thinkyhead e8f2430dac [cron] Bump distribution date (2025-05-30) 2025-05-30 00:32:05 +00:00
Scott Lahteine 8f19e2d7d4 🧑‍💻 TMCStepper => 0.8.4 2025-05-29 13:24:40 -05:00
thinkyhead a270cc36e6 [cron] Bump distribution date (2025-05-29) 2025-05-29 00:31:57 +00:00
Scott Lahteine fa25737a9f 🧑‍💻 TMCStepper => 0.8.3 2025-05-28 14:08:07 -05:00
thinkyhead 38eee76839 [cron] Bump distribution date (2025-05-28) 2025-05-28 00:32:03 +00:00
Giuliano 5b59424447 🌐 Fix Italian typo, etc. (#27890)
Followup to #27877

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-27 15:15:55 -05:00
staff1010 c20c6b61f1 🚸 Improve MKS UI with LVGL v6.1.2 (#27889) 2025-05-27 14:49:19 -05:00
David Buezas d0e8edad3c 🐛 More robust Smooth Linear Advance (#27862)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-27 13:15:38 -05:00
ellensp 88d368ad9d 🩹 Misc temp sensor fixups (#27884)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-27 13:01:01 -05:00
Keith Bennett 843f79589c 🔧 Update BTT002 SPI driver conditionals (#27887)
Counterpart to #27886
2025-05-27 12:58:49 -05:00
Andrew 3494482cb0 🎨 Misc. cleanup, tweak unused LED_GraduallyControl (#27422)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-27 01:05:01 -05:00
Scott Lahteine 09e336f78c Merge branch 'bugfix-2.1.x' into pr/26944 2025-05-27 00:09:04 -05:00
vehystrix 3572fd75b5 🐛 Fix M201 with XY_FREQUENCY_LIMIT (#27859)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-26 23:46:46 -05:00
Keith Bennett ebecd76492 🔧 Update BIQU BX SPI driver conditionals (#27886) 2025-05-26 22:51:41 -05:00
thinkyhead 3f3c8257f7 [cron] Bump distribution date (2025-05-27) 2025-05-27 00:35:13 +00:00
Vovodroid e9ae5208cb EVENT_GCODE_AFTER_MPC_TUNE (#27865)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-26 19:16:45 -05:00
narno2202 fde0eaf1e7 ️ Remove FT Motion extraneous code (#27881) 2025-05-26 17:36:14 -05:00
Andrew 122c4116f2 🚸 Misc. optimizations, cleanup, DWIN fixes… (#27858)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-26 16:36:55 -05:00
Scott Lahteine 21559b0c59 🩹 Call SERIAL_IMPL.msgDone() after M105 2025-05-26 16:34:17 -05:00
Scott Lahteine 0916d32589 🧑‍💻 Serial ON_OFF, TRUE_FALSE 2025-05-26 15:33:26 -05:00
thinkyhead af7b126edc [cron] Bump distribution date (2025-05-26) 2025-05-26 18:09:01 +00:00
Giuliano bc990ccca6 🌐 Update Italian language (#27877) 2025-05-26 11:43:47 -05:00
Scott Lahteine c7bcbf944e 🌐 Specific USB-FD strings 2025-05-26 11:32:00 -05:00
ellensp 7f9eb688ad 🐛 TMC2240: The Sequel (#27880)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-26 10:50:22 -05:00
thinkyhead dbd60fb38e [cron] Bump distribution date (2025-05-25) 2025-05-25 00:35:29 +00:00
B 6a871b2879 🧑‍💻 Get E axis in FTMotion::loadBlockData (#27870)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-24 19:21:06 -05:00
Scott Lahteine bd9d7a3c4d 🩹 Fix MKS UI E Max Feedrate items 2025-05-24 17:17:49 -05:00
Scott Lahteine 2976bb48ed 🔨 Better FT Motion menu string code 2025-05-24 16:57:03 -05:00
ellensp 4f93f31af0 🔨 Fix Windows/ReARM upload (#27872) 2025-05-24 16:53:52 -05:00
ellensp d76c8c1fbd 🩹 Fix ProUI Linear Advance menu (#27878)
Followup to #27818
2025-05-24 16:49:44 -05:00
Keith Bennett 86c564121e 🩹 Fix Bluesky badge (#27879) 2025-05-24 15:38:51 -05:00
Scott Lahteine db137df6df 🔨 TMC2240 Makefile update 2025-05-24 03:14:28 -05:00
Scott Lahteine 202ec4b58f Trinamic TMC2240 (SPI) (#25974)
Co-Authored-By: David Buezas <david.buezas@gmail.com>
Co-Authored-By: z1996xm <102506464+z1996xm@users.noreply.github.com>
2025-05-23 21:11:50 -05:00
thinkyhead 1258657b8d [cron] Bump distribution date (2025-05-24) 2025-05-24 00:30:50 +00:00
Scott Lahteine f49e730b23 🔧 Allow TMCStepper with Zonestar ZM3 E2xx 2025-05-23 01:28:20 -05:00
thinkyhead aa02bb05d3 [cron] Bump distribution date (2025-05-23) 2025-05-23 00:32:07 +00:00
Scott Lahteine e7662920a6 🩹 Fix delay µs > 32767
Fixes #27753
2025-05-22 13:41:59 -05:00
thinkyhead 9c9ed690f7 [cron] Bump distribution date (2025-05-21) 2025-05-21 00:32:16 +00:00
Scott Lahteine a4382b4dcd 🧑‍💻 Fix max_isr_rate sign warnings 2025-05-20 16:24:20 -05:00
Vovodroid d5723fcafd 🔧 Allow SMOOTH_LIN_ADVANCE + NONLINEAR_EXTRUSION (#27861) 2025-05-20 14:52:51 -05:00
Scott Lahteine af553d5fbd 🔨 Solve a linker error
Fixes #27864
2025-05-19 20:08:56 -05:00
thinkyhead 3cd945ab5d [cron] Bump distribution date (2025-05-20) 2025-05-20 00:32:44 +00:00
Scott Lahteine ade6dbf01e 🔧 Fix Speed/Flow edit options (#27863)
Fixes #27849
2025-05-18 21:13:30 -05:00
Fly3DTeam 88a8e2127d 🔧 TMC Baud Rate for FLY D5/D7 (#27860) 2025-05-18 21:12:07 -05:00
thinkyhead fe747ae4bf [cron] Bump distribution date (2025-05-19) 2025-05-19 00:37:46 +00:00
Scott Lahteine bd4900d6cd Pre-fetch configs for CI tests 2025-05-18 18:56:32 -05:00
thinkyhead 8643fa0afb [cron] Bump distribution date (2025-05-16) 2025-05-16 00:32:02 +00:00
Scott Lahteine 487542083b 🧑‍💻 Update Sim, fix Mac native gcc 2025-05-15 15:54:17 -05:00
thinkyhead b79f7f203a [cron] Bump distribution date (2025-05-15) 2025-05-15 00:30:52 +00:00
Matheus Mösken Diegues 0927e49756 🌐 README in Portuguese (Brazil) (#27854) 2025-05-14 15:23:04 -05:00
Keith Bennett fbea4c6048 ✏️ Fix variant docs typo (#27850) 2025-05-14 15:18:53 -05:00
Scott Lahteine 4a0b3d1c9b 🧑‍💻 Consolidate MIN/MAX/STOP endstop pin assign (#27839) 2025-05-14 15:17:58 -05:00
ellensp 8e0f271f55 🔨 ESP3DLib update for compatibility (#27851) 2025-05-14 13:57:18 -05:00
Giuliano 8f13c1ecb2 🌐 Shorten Italian messages (#27855) 2025-05-14 13:55:45 -05:00
ellensp 10ecea62c1 🩹 Fix 'PIN_EXIST' typo (#27856) 2025-05-14 13:54:48 -05:00
thinkyhead 7a841cd8cf [cron] Bump distribution date (2025-05-14) 2025-05-14 00:31:35 +00:00
Scott Lahteine c8265d61d5 🚸 Include 'R' in M208 report
Followup to #21335
2025-05-13 17:14:57 -05:00
Scott Lahteine eaa836b6fc 🎨 May 13 code format 2025-05-13 16:52:54 -05:00
Scott Lahteine 5a88a80690 🚸 Extend M360 (a Repetier code) 2025-05-13 16:50:41 -05:00
David Buezas 12fdde24d8 ️ Optimize Smooth Linear Advance (via fixed-point) (#27818) 2025-05-13 16:14:04 -05:00
InsanityAutomation 471228018a Merge branch 'bugfix-2.1.x' into ParseSafetyCommandsEvenWithEParser 2025-05-13 16:17:41 -04:00
thinkyhead 4de6d655ac [cron] Bump distribution date (2025-05-10) 2025-05-10 00:30:25 +00:00
Scott Lahteine b12028f4dd 🧑‍💻 ALIM(I,ARR) macro 2025-05-09 16:37:06 -05:00
Scott Lahteine 54c1a1df4e 🧑‍💻 Singleton notation 2025-05-09 16:23:37 -05:00
Scott Lahteine fad7bc66e9 🧑‍💻 Use 'DISTINCT_E_FACTORS' 2025-05-09 16:23:14 -05:00
Scott Lahteine 6cda10de0f 🧑‍💻 Relocate some factory reset, etc. 2025-05-09 16:21:29 -05:00
B b22df8b189 🧑‍💻 Fix GD32 EEPROM timings (#27846) 2025-05-09 11:58:25 -05:00
thinkyhead 94e2558e6c [cron] Bump distribution date (2025-05-09) 2025-05-09 00:31:31 +00:00
B fd117480d2 ️ GD32: Fast GPIO optimization (#27845) 2025-05-08 16:17:47 -05:00
Scott Lahteine 72f3a4ac31 ️ Optimal recalculate_max_e_jerk 2025-05-08 13:46:02 -05:00
thinkyhead aa7af2e2ea [cron] Bump distribution date (2025-05-08) 2025-05-08 00:31:45 +00:00
ellensp a4d254ee62 🚸 Fix 16x4 SD Print Progress display (#27844) 2025-05-07 13:36:06 -05:00
David Buezas 222efe1382 🔧 No SMOOTH_LIN_ADVANCE + NONLINEAR_EXTRUSION (#27817) 2025-05-06 22:15:44 -05:00
Scott Lahteine d806175a80 OTA_FIRMWARE_UPDATE (Creality STM32F401RE)
Followup to #25773
2025-05-06 22:10:44 -05:00
thinkyhead 5266ffb922 [cron] Bump distribution date (2025-05-07) 2025-05-07 00:31:25 +00:00
Scott Lahteine b7a1681d38 🔨 Fix some build_flags inheritance 2025-05-05 22:15:22 -05:00
Scott Lahteine 3a3c3b8a22 🔨 Fix build flags for env:mks_monster8_usb_flash_drive 2025-05-05 20:32:02 -05:00
Andrew 67948ad6c6 🚸 Fix ProUI LCD wake up (2) (#27835)
Followup to #27832
2025-05-05 20:19:52 -05:00
thinkyhead e2583b4f85 [cron] Bump distribution date (2025-05-06) 2025-05-06 00:31:19 +00:00
B c9e7d6f55c 🧑‍💻 Update GD32 MFL Platform, Arduino Core (#27830) 2025-05-05 13:08:45 -05:00
Scott Lahteine 735cd9a092 🩹 Fix TH3D EZ V2 sensorless homing 2025-05-05 12:28:11 -05:00
thinkyhead 555b080d85 [cron] Bump distribution date (2025-05-05) 2025-05-05 00:33:33 +00:00
Scott Lahteine 44ef6e2b70 🩹 Fix Y_STOP_PIN alias for Y_MAX_PIN 2025-05-04 15:20:21 -05:00
Scott Lahteine 9bbbcd439b 🧑‍💻 Clarify parking_extruder_unpark_after_homing 2025-05-04 13:55:50 -05:00
Scott Lahteine cbe8a6867c 🧑‍💻 Fix mac_gcc HOMEBREW_PATH 2025-05-03 21:56:33 -05:00
MrKuskov 1f31027fd2 FILAMENT_MOTION_DISTANCE_MM (#27812)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2025-05-03 21:11:23 -05:00
InsanityAutomation 4e1e7fa1b0 SWITCHING_NOZZLE_LIFT_TO_PROBE (#27804) 2025-05-03 21:07:40 -05:00
Andrew 414951e42c 🚸 Fix ProUI LCD wake up (#27832) 2025-05-03 20:08:27 -05:00
Scott Lahteine a8d18a0554 🎨 ProUI code style 2025-05-03 20:03:26 -05:00
thinkyhead b9ffe93d1f [cron] Bump distribution date (2025-05-04) 2025-05-04 00:34:56 +00:00
B 0c72dc376c 🔨 Creality V4.2.7 (GD32) (#27796) 2025-05-03 15:20:29 -05:00
InsanityAutomation 766210b8f1 Merge branch 'ParseSafetyCommandsEvenWithEParser' of https://github.com/InsanityAutomation/Marlin into ParseSafetyCommandsEvenWithEParser 2025-04-18 13:39:47 -04:00
InsanityAutomation b5c05e32ea Update M876.cpp 2025-04-18 13:39:36 -04:00
InsanityAutomation 1d702b3601 Merge branch 'bugfix-2.1.x' into ParseSafetyCommandsEvenWithEParser 2025-04-18 13:38:14 -04:00
InsanityAutomation 2e7b7c8b72 Update pause.cpp 2025-04-18 13:36:38 -04:00
Scott Lahteine a4fbbf9075 clean up 2025-03-17 19:46:43 -05:00
Scott Lahteine 25e6852022 Merge branch 'bugfix-2.1.x' into pr/26944 2025-03-17 18:06:41 -05:00
Scott Lahteine 5edec5b3a3 tweak 2025-03-17 18:06:18 -05:00
InsanityAutomation 0bfa253b73 Use getter 2024-04-10 15:15:24 -04:00
InsanityAutomation 1117aff777 Merge branch 'MarlinFirmware:bugfix-2.1.x' into ParseSafetyCommandsEvenWithEParser 2024-04-07 18:59:07 -04:00
InsanityAutomation b616b0a67a Update Conditionals_adv.h 2024-04-07 13:24:13 -04:00
InsanityAutomation bca0f55a5e Always parse safety commands at all levels 2024-04-07 13:13:15 -04:00
780 changed files with 17388 additions and 11325 deletions
+4 -4
View File
@@ -38,14 +38,14 @@
"platformio.platformio-ide", "platformio.platformio-ide",
"marlinfirmware.auto-build", "marlinfirmware.auto-build",
"editorconfig.editorconfig" "editorconfig.editorconfig"
], ]
// Use 'forwardPorts' to make a list of ports inside the container available locally. // Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [], // , "forwardPorts": []
// Use 'postCreateCommand' to run commands after the container is created. // Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "pip3 install --user -r requirements.txt", // , "postCreateCommand": "pip3 install --user -r requirements.txt"
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
// "remoteUser": "vscode" // , "remoteUser": "vscode"
} }
+5 -1
View File
@@ -21,6 +21,7 @@ on:
branches: branches:
- bugfix-2.1.x - bugfix-2.1.x
- 2.1.x - 2.1.x
- release-*
paths-ignore: paths-ignore:
- config/** - config/**
- data/** - data/**
@@ -36,6 +37,9 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
env:
CONFIG_BRANCH: ${{ github.base_ref || github.ref_name }}
strategy: strategy:
fail-fast: true fail-fast: true
matrix: matrix:
@@ -54,7 +58,7 @@ jobs:
- at90usb1286_dfu - at90usb1286_dfu
# AVR Extended # AVR Extended
- FYSETC_F6 - mega2560ext
- melzi_optiboot - melzi_optiboot
- rambo - rambo
- sanguino1284p - sanguino1284p
+21 -21
View File
@@ -9,14 +9,14 @@ name: CI - Validate boards.h
on: on:
pull_request: pull_request:
branches: branches:
- bugfix-2.1.x - bugfix-2.1.x
paths: paths:
- 'Marlin/src/core/boards.h' - "Marlin/src/core/boards.h"
push: push:
branches: branches:
- bugfix-2.1.x - bugfix-2.1.x
paths: paths:
- 'Marlin/src/core/boards.h' - "Marlin/src/core/boards.h"
jobs: jobs:
validate_pins_files: validate_pins_files:
@@ -26,23 +26,23 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: Check out the PR - name: Check out the PR
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Cache pip - name: Cache pip
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ~/.cache/pip path: ~/.cache/pip
key: ${{ runner.os }}-pip-boards-v1 key: ${{ runner.os }}-pip-validation-v1
restore-keys: | restore-keys: |
${{ runner.os }}-pip-boards- ${{ runner.os }}-pip-validation-
- name: Select Python 3.9 - name: Select Python 3.9
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: "3.9"
architecture: 'x64' architecture: "x64"
- name: Validate core/boards.h - name: Validate core/boards.h
run: | run: |
make validate-boards -j make validate-boards -j
+40
View File
@@ -0,0 +1,40 @@
#
# ci-validate-lines.yml
# Validate that all text files are unchanged by linesformat.py
#
name: CI - Validate Source Files
on:
pull_request:
branches:
- bugfix-2.1.x
- 2.1.x
push:
branches:
- bugfix-2.1.x
- 2.1.x
jobs:
validate_source_files:
name: Validate Source Files
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-22.04
steps:
- name: Check out the PR
uses: actions/checkout@v4
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-npm-lines-v1
restore-keys: |
${{ runner.os }}-npm-lines-
- name: Validate text file formatting
run: |
npm install --save-dev prettier
make validate-lines -j
+21 -21
View File
@@ -8,18 +8,18 @@ name: CI - Validate Pins Files
on: on:
pull_request: pull_request:
branches: branches:
- bugfix-2.1.x - bugfix-2.1.x
# Cannot be enabled on 2.1.x until it contains the unit test framework # Cannot be enabled on 2.1.x until it contains the unit test framework
#- 2.1.x #- 2.1.x
paths: paths:
- 'Marlin/src/pins/*/**' - "Marlin/src/pins/*/**"
push: push:
branches: branches:
- bugfix-2.1.x - bugfix-2.1.x
# Cannot be enabled on 2.1.x until it contains the unit test framework # Cannot be enabled on 2.1.x until it contains the unit test framework
#- 2.1.x #- 2.1.x
paths: paths:
- 'Marlin/src/pins/*/**' - "Marlin/src/pins/*/**"
jobs: jobs:
validate_pins_files: validate_pins_files:
@@ -29,23 +29,23 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- name: Check out the PR - name: Check out the PR
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Cache pip - name: Cache pip
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ~/.cache/pip path: ~/.cache/pip
key: ${{ runner.os }}-pip-pins-v1 key: ${{ runner.os }}-pip-validation-v1
restore-keys: | restore-keys: |
${{ runner.os }}-pip-pins- ${{ runner.os }}-pip-validation-
- name: Select Python 3.9 - name: Select Python 3.9
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: '3.9' python-version: "3.9"
architecture: 'x64' architecture: "x64"
- name: Validate all pins files - name: Validate all pins files
run: | run: |
make validate-pins -j make validate-pins -j
Executable → Regular
+5
View File
@@ -31,6 +31,11 @@ out-language/
*.gen *.gen
*.sublime-workspace *.sublime-workspace
# npm
node_modules/
package.json
package-lock.json
# OS # OS
applet/ applet/
.DS_Store .DS_Store
+10
View File
@@ -0,0 +1,10 @@
# Prettier Ignore file
*.min.js
web-ui/
buildroot/share/PlatformIO/boards
buildroot/share/PlatformIO/variants
*.sublime-project
*.sublime-syntax
.github
.vscode
launch.json
+67 -9
View File
@@ -4,10 +4,36 @@ CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
CONTAINER_IMAGE := marlin-dev CONTAINER_IMAGE := marlin-dev
UNIT_TEST_CONFIG ?= default UNIT_TEST_CONFIG ?= default
# Find a Python 3 interpreter
ifeq ($(OS),Windows_NT)
# Windows: use `where` fall back through the three common names
PYTHON := $(shell which python 2>nul || which python3 2>nul || which py 2>nul)
# Windows: Use cmd tools to find pins files
PINS_RAW := $(shell cmd //c "dir /s /b Marlin\src\pins\*.h 2>nul | findstr /r ".*Marlin\\\\src\\\\pins\\\\.*\\\\pins_.*\.h"")
PINS := $(subst \,/,$(PINS_RAW))
else
# POSIX: use `command -v` prefer python3 over python
PYTHON := $(shell command -v python3 2>/dev/null || command -v python 2>/dev/null)
# Unix/Linux: Use find command
PINS := $(shell find Marlin/src/pins -mindepth 2 -name 'pins_*.h')
endif
# Check that the found interpreter is Python 3
# Error if there's no Python 3 available
ifneq ($(strip $(PYTHON)),)
PYTHON_VERSION := $(shell $(PYTHON) -c "import sys; print(sys.version_info[0])" 2>/dev/null)
ifneq ($(PYTHON_VERSION),3)
$(error $(PYTHON) is not Python 3 install a Python3.x interpreter or adjust your PATH)
endif
else
$(error No Python executable found install Python 3.x and make sure it is in your PATH)
endif
help: help:
@echo "Tasks for local development:" @echo "Tasks for local development:"
@echo "make marlin : Build Marlin for the configured board" @echo "make marlin : Build Marlin for the configured board"
@echo "make format-pins -j : Reformat all pins files (-j for parallel execution)" @echo "make format-pins -j : Reformat all pins files (-j for parallel execution)"
@echo "make validate-lines -j : Validate line endings, fails on trailing whitespace, etc."
@echo "make validate-pins -j : Validate all pins files, fails if any require reformatting" @echo "make validate-pins -j : Validate all pins files, fails if any require reformatting"
@echo "make validate-boards -j : Validate boards.h and pins.h for standards compliance" @echo "make validate-boards -j : Validate boards.h and pins.h for standards compliance"
@echo "make tests-single-ci : Run a single test from inside the CI" @echo "make tests-single-ci : Run a single test from inside the CI"
@@ -19,7 +45,7 @@ help:
@echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker" @echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker"
@echo "make unit-test-all-local : Run all code tests locally" @echo "make unit-test-all-local : Run all code tests locally"
@echo "make unit-test-all-local-docker : Run all code tests locally, using docker" @echo "make unit-test-all-local-docker : Run all code tests locally, using docker"
@echo "make setup-local-docker : Setup local docker using buildx" @echo "make setup-local-docker : Setup local docker"
@echo "" @echo ""
@echo "Options for testing:" @echo "Options for testing:"
@echo " TEST_TARGET Set when running tests-single-*, to select the" @echo " TEST_TARGET Set when running tests-single-*, to select the"
@@ -40,6 +66,9 @@ marlin:
./buildroot/bin/mftest -a ./buildroot/bin/mftest -a
.PHONY: marlin .PHONY: marlin
clean:
rm -rf .pio/build*
tests-single-ci: tests-single-ci:
export GIT_RESET_HARD=true export GIT_RESET_HARD=true
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
@@ -56,10 +85,10 @@ tests-single-local-docker:
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)" $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
tests-all-local: tests-all-local:
@python -c "import yaml" 2>/dev/null || (echo 'pyyaml module is not installed. Install it with "python -m pip install pyyaml"' && exit 1) @$(PYTHON) -c "import yaml" 2>/dev/null || (echo 'pyyaml module is not installed. Install it with "$(PYTHON) -m pip install pyyaml"' && exit 1)
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \ export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
&& for TEST_TARGET in $$(python $(SCRIPTS_DIR)/get_test_targets.py) ; do \ && for TEST_TARGET in $$($(PYTHON) $(SCRIPTS_DIR)/get_test_targets.py) ; do \
if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \ if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \
echo "Skipping tests for $$TEST_TARGET on macOS" ; \ echo "Skipping tests for $$TEST_TARGET on macOS" ; \
continue ; \ continue ; \
@@ -87,27 +116,56 @@ unit-test-all-local-docker:
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi @if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local $(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local
setup-local-docker: USERNAME := $(shell whoami)
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile . USER_ID := $(shell id -u)
GROUP_ID := $(shell id -g)
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h') .PHONY: setup-local-docker setup-local-docker-old
setup-local-docker:
@echo "Building marlin-dev Docker image..."
$(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) \
--build-arg USERNAME=$(USERNAME) \
--build-arg USER_ID=$(USER_ID) \
--build-arg GROUP_ID=$(GROUP_ID) \
-f docker/Dockerfile .
@echo
@echo "To run all tests in Docker:"
@echo " make tests-all-local-docker"
@echo "To run a single test in Docker:"
@echo " make tests-single-local-docker TEST_TARGET=mega2560"
setup-local-docker-old:
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
.PHONY: $(PINS) format-pins validate-pins .PHONY: $(PINS) format-pins validate-pins
$(PINS): %: $(PINS): %:
@echo "Formatting $@" @echo "Formatting pins $@"
@python $(SCRIPTS_DIR)/pinsformat.py $< $@ @$(PYTHON) $(SCRIPTS_DIR)/pinsformat.py $< $@
format-pins: $(PINS) format-pins: $(PINS)
@echo "Processed $(words $(PINS)) pins files"
validate-pins: format-pins validate-pins: format-pins
@echo "Validating pins files" @echo "Validating pins files"
@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1) @git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
.PHONY: format-lines validate-lines
format-lines:
@echo "Formatting all sources"
@$(PYTHON) $(SCRIPTS_DIR)/linesformat.py buildroot
@$(PYTHON) $(SCRIPTS_DIR)/linesformat.py Marlin
validate-lines:
@echo "Validating text formatting"
@npx prettier --check . --editorconfig --object-wrap preserve
BOARDS_FILE := Marlin/src/core/boards.h BOARDS_FILE := Marlin/src/core/boards.h
.PHONY: validate-boards .PHONY: validate-boards
validate-boards: validate-boards:
@echo "Validating boards.h file" @echo "Validating boards.h file"
@python $(SCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1) @$(PYTHON) $(SCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1)
+84 -27
View File
@@ -148,9 +148,9 @@
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100, * Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
* TMC2660, TMC2660_STANDALONE, TMC5130, TMC5130_STANDALONE, * TMC2240, TMC2660, TMC2660_STANDALONE,
* TMC5160, TMC5160_STANDALONE * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
*/ */
#define X_DRIVER_TYPE A4988 #define X_DRIVER_TYPE A4988
#define Y_DRIVER_TYPE A4988 #define Y_DRIVER_TYPE A4988
@@ -260,6 +260,7 @@
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }. #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
// For Dual Servo use two pairs: { { lower, raise }, { lower, raise } } // For Dual Servo use two pairs: { { lower, raise }, { lower, raise } }
#define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move #define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move
#define SWITCHING_NOZZLE_LIFT_TO_PROBE // Lift toolheads out of the way while probing
#endif #endif
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#. // Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
@@ -304,6 +305,18 @@
#endif #endif
/**
* Differential Extruder
*
* The X and E steppers work together to create a differential drive system.
* Simple : E steps = X + E ; X steps = X (E drives a loop, X stays the same)
* Balanced: E steps = X + E/2 ; X steps = X - E/2 (Dual loop system)
*/
//#define DIFFERENTIAL_EXTRUDER
#if ENABLED(DIFFERENTIAL_EXTRUDER)
//#define BALANCED_DIFFERENTIAL_EXTRUDER
#endif
/** /**
* Switching Toolhead * Switching Toolhead
* *
@@ -705,13 +718,13 @@
#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 up to one value per hotend here, according to your setup.
// If there are fewer values, the last one applies to the remaining hotends. // If there are fewer values, the last one applies to the remaining hotends.
#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 }
#else #else
#define DEFAULT_Kp 22.20 #define DEFAULT_KP 22.20
#define DEFAULT_Ki 1.08 #define DEFAULT_KI 1.08
#define DEFAULT_Kd 114.00 #define DEFAULT_KD 114.00
#endif #endif
#else #else
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current #define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
@@ -734,7 +747,12 @@
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash) //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
#define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active. #define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active.
#define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers. #define MPC_HEATER_POWER { 40.0f } // (W) Nominal heat cartridge powers.
//#define MPC_PTC // Hotend power changes with temperature (e.g., PTC heat cartridges).
#if ENABLED(MPC_PTC)
#define MPC_HEATER_ALPHA { 0.0028f } // Temperature coefficient of resistance of the heat cartridges.
#define MPC_HEATER_REFTEMP { 20 } // (°C) Reference temperature for MPC_HEATER_POWER and MPC_HEATER_ALPHA.
#endif
#define MPC_INCLUDE_FAN // Model the fan speed? #define MPC_INCLUDE_FAN // Model the fan speed?
@@ -766,6 +784,7 @@
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height. #define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position. #define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
//#define EVENT_GCODE_AFTER_MPC_TUNE "M84" // G-code to execute after MPC tune finished and Z raised.
#endif #endif
//=========================================================================== //===========================================================================
@@ -803,9 +822,9 @@
// 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
// from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
#define DEFAULT_bedKp 10.00 #define DEFAULT_BED_KP 10.00
#define DEFAULT_bedKi .023 #define DEFAULT_BED_KI 0.023
#define DEFAULT_bedKd 305.4 #define DEFAULT_BED_KD 305.4
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
#else #else
@@ -886,9 +905,9 @@
// Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element
// and placed inside the small Creality printer enclosure tent. // and placed inside the small Creality printer enclosure tent.
#define DEFAULT_chamberKp 37.04 #define DEFAULT_CHAMBER_KP 37.04
#define DEFAULT_chamberKi 1.40 #define DEFAULT_CHAMBER_KI 1.40
#define DEFAULT_chamberKd 655.17 #define DEFAULT_CHAMBER_KD 655.17
// M309 P37.04 I1.04 D655.17 // M309 P37.04 I1.04 D655.17
// FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles. // FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
@@ -935,7 +954,7 @@
* protect against a broken or disconnected thermistor wire. * protect against a broken or disconnected thermistor wire.
* *
* The issue: If a thermistor falls out, it will report the much lower * The issue: If a thermistor falls out, it will report the much lower
* temperature of the air in the room, and the the firmware will keep * temperature of the air in the room, and the firmware will keep
* the heater on. * the heater on.
* *
* If you get "Thermal Runaway" or "Heating failed" errors the * If you get "Thermal Runaway" or "Heating failed" errors the
@@ -1046,7 +1065,8 @@
// Delta radius and diagonal rod adjustments // Delta radius and diagonal rod adjustments
//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
#endif
#endif // DELTA
// @section scara // @section scara
@@ -1102,17 +1122,37 @@
#define TPARA_LINKAGE_1 120 // (mm) #define TPARA_LINKAGE_1 120 // (mm)
#define TPARA_LINKAGE_2 120 // (mm) #define TPARA_LINKAGE_2 120 // (mm)
// TPARA tower offset (position of Tower relative to bed zero position) // Height of the Shoulder axis (pivot) relative to the tower floor
#define TPARA_SHOULDER_AXIS_HEIGHT 135.0 // (mm)
// The position of the last linkage relative to the robot arm origin
// (intersection of the base axis and floor) when at the home position
#define TPARA_ARM_X_HOME_POS 28.75 // (mm) Measured from shoulder axis to tool holder axis in home position
#define TPARA_ARM_Y_HOME_POS 0 // (mm)
#define TPARA_ARM_Z_HOME_POS 250.00 // (mm) Measured from tool holder axis to the floor
// TPARA Workspace offset relative to the tower (position of workspace origin relative to robot Tower origin )
// This needs to be reasonably accurate as it defines the printbed position in the TPARA space. // This needs to be reasonably accurate as it defines the printbed position in the TPARA space.
#define TPARA_OFFSET_X 0 // (mm) #define TPARA_OFFSET_X 127.0 // (mm) to coincide with minimum radius MIDDLE_DEAD_ZONE_R, and W(0,0,0) is reachable
#define TPARA_OFFSET_Y 0 // (mm) #define TPARA_OFFSET_Y 0.0 // (mm)
#define TPARA_OFFSET_Z 0 // (mm) #define TPARA_OFFSET_Z 0.0 // (mm)
// TPARA tool connection point offset, relative to the tool moving frame origin which is in the last linkage axis,
// (TCP: tool center/connection point) of the robot,
// the plane of measured offset must be alligned with home position plane
#define TPARA_TCP_OFFSET_X 27.0 // (mm) Tool flange: 27 (distance from pivot to bolt holes), extruder tool: 50.0,
#define TPARA_TCP_OFFSET_Y 0.0 // (mm)
#define TPARA_TCP_OFFSET_Z -65.0 // (mm) Tool flange (bottom): -6 (caution as Z 0 posiion will crash second linkage to the floor, -35 is safe for testing with no tool), extruder tool (depends on extruder): -65.0
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly #define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
// Radius around the center where the arm cannot reach // Radius around the center where the arm cannot reach
#define MIDDLE_DEAD_ZONE_R 0 // (mm) // For now use a hardcoded uniform limit, although it should be calculated, or fix a limit for each axis angle
#endif #define MIDDLE_DEAD_ZONE_R 100 // (mm)
// Max angle between L1 and L2
#define TPARA_MAX_L1L2_ANGLE 140.0f // (degrees)
#endif // AXEL_TPARA
// @section polar // @section polar
@@ -1388,6 +1428,11 @@
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
*/ */
//#define S_CURVE_ACCELERATION //#define S_CURVE_ACCELERATION
#if ENABLED(S_CURVE_ACCELERATION)
// Define to use 4th instead of 6th order motion curve
//#define S_CURVE_FACTOR 0.25 // Initial and final acceleration factor, ideally 0.1 to 0.4.
// Shouldn't generally require tuning.
#endif
//=========================================================================== //===========================================================================
//============================= Z Probe Options ============================= //============================= Z Probe Options =============================
@@ -1660,6 +1705,8 @@
//#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change //#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change
#endif #endif
//#define PROBE_WAKEUP_TIME_MS 30 // (ms) Time for the probe to wake up
// 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.
#define PROBING_MARGIN 10 #define PROBING_MARGIN 10
@@ -2036,8 +2083,11 @@
//#define FILAMENT_MOTION_SENSOR //#define FILAMENT_MOTION_SENSOR
#if ENABLED(FILAMENT_MOTION_SENSOR) #if ENABLED(FILAMENT_MOTION_SENSOR)
//#define FILAMENT_SWITCH_AND_MOTION //#define FILAMENT_SWITCH_AND_MOTION // Define separate pins below to sense motion
#if ENABLED(FILAMENT_SWITCH_AND_MOTION) #if ENABLED(FILAMENT_SWITCH_AND_MOTION)
#define FILAMENT_MOTION_DISTANCE_MM 3.0 // (mm) Missing distance required to trigger runout
#define NUM_MOTION_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_MOTION#_PIN for each. #define NUM_MOTION_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_MOTION#_PIN for each.
//#define FIL_MOTION1_PIN -1 //#define FIL_MOTION1_PIN -1
@@ -2073,7 +2123,7 @@
//#define FIL_MOTION8_STATE LOW //#define FIL_MOTION8_STATE LOW
//#define FIL_MOTION8_PULLUP //#define FIL_MOTION8_PULLUP
//#define FIL_MOTION8_PULLDOWN //#define FIL_MOTION8_PULLDOWN
#endif #endif // FILAMENT_SWITCH_AND_MOTION
#endif // FILAMENT_MOTION_SENSOR #endif // FILAMENT_MOTION_SENSOR
#endif // FILAMENT_RUNOUT_DISTANCE_MM #endif // FILAMENT_RUNOUT_DISTANCE_MM
#endif // FILAMENT_RUNOUT_SENSOR #endif // FILAMENT_RUNOUT_SENSOR
@@ -3108,7 +3158,7 @@
// //
// FYSETC variant of the MINI12864 graphic controller with SD support // FYSETC variant of the MINI12864 graphic controller with SD support
// https://wiki.fysetc.com/Mini12864_Panel/ // https://wiki.fysetc.com/docs/Mini12864Panel
// //
//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default //#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default
//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) //#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on)
@@ -3458,6 +3508,7 @@
* NOTOSANS - Default font with anti-aliasing. Supports Latin Extended and non-Latin characters. * NOTOSANS - Default font with anti-aliasing. Supports Latin Extended and non-Latin characters.
* UNIFONT - Lightweight font, no anti-aliasing. Supports Latin Extended and non-Latin characters. * UNIFONT - Lightweight font, no anti-aliasing. Supports Latin Extended and non-Latin characters.
* HELVETICA - Lightweight font, no anti-aliasing. Supports Basic Latin (0x0020-0x007F) and Latin-1 Supplement (0x0080-0x00FF) characters only. * HELVETICA - Lightweight font, no anti-aliasing. Supports Basic Latin (0x0020-0x007F) and Latin-1 Supplement (0x0080-0x00FF) characters only.
* :['NOTOSANS', 'UNIFONT', 'HELVETICA']
*/ */
#define TFT_FONT NOTOSANS #define TFT_FONT NOTOSANS
@@ -3467,6 +3518,7 @@
* BLUE_MARLIN - Default theme with 'midnight blue' background * BLUE_MARLIN - Default theme with 'midnight blue' background
* BLACK_MARLIN - Theme with 'black' background * BLACK_MARLIN - Theme with 'black' background
* ANET_BLACK - Theme used for Anet ET4/5 * ANET_BLACK - Theme used for Anet ET4/5
* :['BLUE_MARLIN', 'BLACK_MARLIN', 'ANET_BLACK']
*/ */
#define TFT_THEME BLACK_MARLIN #define TFT_THEME BLACK_MARLIN
@@ -3504,6 +3556,11 @@
//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation) //#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation) //#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
#if ENABLED(DWIN_CREALITY_LCD)
//#define USE_STRING_HEADINGS // Use string headings for Creality UI instead of images
//#define USE_STRING_TITLES // Use string titles for Creality UI instead of images
#endif
// //
// Touch Screen Settings // Touch Screen Settings
// //
+168 -89
View File
@@ -297,7 +297,7 @@
* protect against a broken or disconnected thermistor wire. * protect against a broken or disconnected thermistor wire.
* *
* The issue: If a thermistor falls out, it will report the much lower * The issue: If a thermistor falls out, it will report the much lower
* temperature of the air in the room, and the the firmware will keep * temperature of the air in the room, and the firmware will keep
* the heater on. * the heater on.
* *
* The solution: Once the temperature reaches the target, start observing. * The solution: Once the temperature reaches the target, start observing.
@@ -415,14 +415,19 @@
// A well-chosen Kc value should add just enough power to melt the increased material volume. // A well-chosen Kc value should add just enough power to melt the increased material volume.
//#define PID_EXTRUSION_SCALING //#define PID_EXTRUSION_SCALING
#if ENABLED(PID_EXTRUSION_SCALING) #if ENABLED(PID_EXTRUSION_SCALING)
#define DEFAULT_Kc (100) // heating power = Kc * e_speed
#define LPQ_MAX_LEN 50 #define LPQ_MAX_LEN 50
#define DEFAULT_KC 100 // heating power = Kc * e_speed
#if ENABLED(PID_PARAMS_PER_HOTEND)
// Specify up to one value per hotend here, according to your setup.
// If there are fewer values, the last one applies to the remaining hotends.
#define DEFAULT_KC_LIST { DEFAULT_KC, DEFAULT_KC } // heating power = Kc * e_speed
#endif
#endif #endif
/** /**
* Add an additional term to the heater power, proportional to the fan speed. * Add an additional term to the heater power, proportional to the fan speed.
* A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan. * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
* You can either just add a constant compensation with the DEFAULT_Kf value * You can either just add a constant compensation with the DEFAULT_KF value
* or follow the instruction below to get speed-dependent compensation. * or follow the instruction below to get speed-dependent compensation.
* *
* Constant compensation (use only with fan speeds of 0% and 100%) * Constant compensation (use only with fan speeds of 0% and 100%)
@@ -453,21 +458,26 @@
#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION) #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
// The alternative definition is used for an easier configuration. // The alternative definition is used for an easier configuration.
// Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED. // Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED.
// DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly. // DEFAULT_KF and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
#define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_KF
#define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_KF
#define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
#define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED) #define DEFAULT_KF (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
#define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0 #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_KF)/255.0
#else #else
#define PID_FAN_SCALING_LIN_FACTOR (0) // Power-loss due to cooling = Kf * (fan_speed) #define PID_FAN_SCALING_LIN_FACTOR (0) // Power-loss due to cooling = Kf * (fan_speed)
#define DEFAULT_Kf 10 // A constant value added to the PID-tuner #define DEFAULT_KF 10 // A constant value added to the PID-tuner
#define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING #define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
#endif #endif
#endif #endif
#if ENABLED(PID_PARAMS_PER_HOTEND)
// Specify up to one value per hotend here, according to your setup.
// If there are fewer values, the last one applies to the remaining hotends.
#define DEFAULT_KF_LIST { DEFAULT_KF, DEFAULT_KF }
#endif
#endif #endif
/** /**
@@ -486,15 +496,15 @@
#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 // Factor used to weight previous readings (0.0 < value < 1.0)
#define AUTOTEMP_MIN 210 #define AUTOTEMP_MIN 210
#define AUTOTEMP_MAX 250 #define AUTOTEMP_MAX 250
#define AUTOTEMP_FACTOR 0.1f #define AUTOTEMP_FACTOR 0.1f
// 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)
#define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature #define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature
#define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature #define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature
#define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F) #define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F)
#endif #endif
#endif #endif
@@ -778,7 +788,7 @@
// @section endstops // @section endstops
// If you want endstops to stay on (by default) even when not homing // If you want endstops to stay on (by default) even when not homing,
// enable this option. Override at any time with M120, M121. // enable this option. Override at any time with M120, M121.
//#define ENDSTOPS_ALWAYS_ON_DEFAULT //#define ENDSTOPS_ALWAYS_ON_DEFAULT
@@ -1081,11 +1091,26 @@
#define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle
#define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment
#define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this
#define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done? #define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done?
// After G34, re-home Z (G28 Z) or just calculate it from the last probe heights? // After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed. // Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
#define HOME_AFTER_G34 #define HOME_AFTER_G34
#endif
/**
* Commands to execute at the start of G34 probing,
* after switching to the PROBING_TOOL.
*/
//#define EVENT_GCODE_BEFORE_G34 "M300 P440 S200"
/**
* Commands to execute at the end of G34 probing.
* Useful to retract or move the Z probe out of the way.
*/
//#define EVENT_GCODE_AFTER_G34 "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10"
#endif // Z_STEPPER_AUTO_ALIGN
/** /**
* Assisted Tramming * Assisted Tramming
@@ -1128,67 +1153,76 @@
/** /**
* Fixed-time-based Motion Control -- BETA FEATURE * Fixed-time-based Motion Control -- BETA FEATURE
* Enable/disable and set parameters with G-code M493. * Enable/disable and set parameters with G-code M493 and M494.
* See ft_types.h for named values used by FTM options. * See ft_types.h for named values used by FTM options.
*/ */
//#define FT_MOTION //#define FT_MOTION
#if ENABLED(FT_MOTION) #if ENABLED(FT_MOTION)
//#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default? //#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default?
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 and M494 parameters
//#define FTM_HOME_AND_PROBE // Use FT Motion for homing / probing. Disable if FT Motion breaks these functions.
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED) #define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV) #define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis #define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers #define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers #define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
#define FTM_LINEAR_ADV_DEFAULT_ENA false // Default linear advance enable (true) or disable (false) #define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
#define FTM_LINEAR_ADV_DEFAULT_K 0.0f // Default linear advance gain. (Acceleration-based scaling factor.)
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis //#define FTM_SHAPER_Z // Include Z shaping support
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis #define FTM_DEFAULT_SHAPER_Z ftMotionShaper_NONE // Default shaper mode on Z axis
#define FTM_SHAPING_DEFAULT_FREQ_Z 21.0f // (Hz) Default peak frequency used by input shapers
#define FTM_SHAPING_ZETA_Z 0.03f // Zeta used by input shapers for Z axis
#define FTM_SHAPING_V_TOL_Z 0.05f // Vibration tolerance used by EI input shapers for Z axis
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 parameters //#define FTM_SHAPER_E // Include E shaping support
// Required to synchronize extruder with XYZ (better quality)
#define FTM_DEFAULT_SHAPER_E ftMotionShaper_NONE // Default shaper mode on Extruder axis
#define FTM_SHAPING_DEFAULT_FREQ_E 21.0f // (Hz) Default peak frequency used by input shapers
#define FTM_SHAPING_ZETA_E 0.03f // Zeta used by input shapers for E axis
#define FTM_SHAPING_V_TOL_E 0.05f // Vibration tolerance used by EI input shapers for E axis
//#define FTM_RESONANCE_TEST // Sine sweep motion for resonance study
//#define FTM_SMOOTHING // Smoothing can reduce artifacts and make steppers quieter
// on sharp corners, but too much will round corners.
#if ENABLED(FTM_SMOOTHING)
#define FTM_MAX_SMOOTHING_TIME 0.10f // (s) Maximum smoothing time. Higher values consume more RAM.
// Increase smoothing time to reduce jerky motion, ghosting and noises.
#define FTM_SMOOTHING_TIME_X 0.00f // (s) Smoothing time for X axis. Zero means disabled.
#define FTM_SMOOTHING_TIME_Y 0.00f // (s) Smoothing time for Y axis
#define FTM_SMOOTHING_TIME_Z 0.00f // (s) Smoothing time for Z axis
#define FTM_SMOOTHING_TIME_E 0.02f // (s) Smoothing time for E axis. Prevents noise/skipping from LA by
// smoothing acceleration peaks, which may also smooth curved surfaces.
#endif
#define FTM_POLYS // Disable POLY5/6 to save ~3k of Flash. Preserves TRAPEZOIDAL.
#if ENABLED(FTM_POLYS)
#define FTM_TRAJECTORY_TYPE TRAPEZOIDAL // Block acceleration profile (TRAPEZOIDAL, POLY5, POLY6)
// TRAPEZOIDAL: Continuous Velocity. Max acceleration is respected.
// POLY5: Like POLY6 with 1.5x but uses less CPU.
// POLY6: Continuous Acceleration (aka S_CURVE).
// POLY trajectories not only reduce resonances without rounding corners, but also
// reduce extruder strain due to linear advance.
#define FTM_POLY6_ACCELERATION_OVERSHOOT 1.875f // Max acceleration overshoot factor for POLY6 (1.25 to 1.875)
#endif
/** /**
* Advanced configuration * Advanced configuration
*/ */
#define FTM_UNIFIED_BWS // DON'T DISABLE unless you use Ulendo FBS (not implemented) #define FTM_BUFFER_SIZE 128 // Window size for trajectory generation, must be a power of 2 (e.g 64, 128, 256, ...)
#if ENABLED(FTM_UNIFIED_BWS) // The total buffered time in seconds is (FTM_BUFFER_SIZE/FTM_FS)
#define FTM_BW_SIZE 100 // Unified Window and Batch size with a ratio of 2 #define FTM_FS 1000 // (Hz) Frequency for trajectory generation.
#else #define FTM_STEPPER_FS 2'000'000 // (Hz) Time resolution of stepper I/O update. Shouldn't affect CPU much (slower board testing needed)
#define FTM_WINDOW_SIZE 200 // Custom Window size for trajectory generation needed by Ulendo FBS #define FTM_MIN_SHAPE_FREQ 20 // (Hz) Minimum shaping frequency, lower consumes more RAM
#define FTM_BATCH_SIZE 100 // Custom Batch size for trajectory generation needed by Ulendo FBS
#endif
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation. (Reciprocal of FTM_TS) #endif // FT_MOTION
#define FTM_TS 0.001f // (s) Time step for trajectory generation. (Reciprocal of FTM_FS)
#if DISABLED(COREXY)
#define FTM_STEPPER_FS 20000 // (Hz) Frequency for stepper I/O update
// Use this to adjust the time required to consume the command buffer.
// Try increasing this value if stepper motion is choppy.
#define FTM_STEPPERCMD_BUFF_SIZE 3000 // Size of the stepper command buffers
#else
// CoreXY motion needs a larger buffer size. These values are based on our testing.
#define FTM_STEPPER_FS 30000
#define FTM_STEPPERCMD_BUFF_SIZE 6000
#endif
#define FTM_STEPS_PER_UNIT_TIME (FTM_STEPPER_FS / FTM_FS) // Interpolated stepper commands per unit time
#define FTM_CTS_COMPARE_VAL (FTM_STEPS_PER_UNIT_TIME / 2) // Comparison value used in interpolation algorithm
#define FTM_MIN_TICKS ((STEPPER_TIMER_RATE) / (FTM_STEPPER_FS)) // Minimum stepper ticks between steps
#define FTM_MIN_SHAPE_FREQ 10 // Minimum shaping frequency
#define FTM_RATIO (FTM_FS / FTM_MIN_SHAPE_FREQ) // Factor for use in FTM_ZMAX. DON'T CHANGE.
#define FTM_ZMAX (FTM_RATIO * 2) // Maximum delays for shaping functions (even numbers only!)
// Calculate as:
// ZV : FTM_RATIO / 2
// ZVD, MZV : FTM_RATIO
// 2HEI : FTM_RATIO * 3 / 2
// 3HEI : FTM_RATIO * 2
#endif
/** /**
* Input Shaping * Input Shaping
@@ -1394,7 +1428,7 @@
* Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates. * Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates.
* This allows higher feedrates than the MCU could otherwise support. * This allows higher feedrates than the MCU could otherwise support.
*/ */
#define MULTISTEPPING_LIMIT 16 //: [1, 2, 4, 8, 16, 32, 64, 128] #define MULTISTEPPING_LIMIT 16 // :[1, 2, 4, 8, 16, 32, 64, 128]
/** /**
* Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
@@ -1607,7 +1641,7 @@
#if HAS_MARLINUI_U8GLIB #if HAS_MARLINUI_U8GLIB
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash. //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
#endif #endif
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780) #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780, HAS_GRAPHICAL_TFT)
//#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup. //#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup.
#endif #endif
#endif #endif
@@ -1673,11 +1707,12 @@
#endif // HAS_DISPLAY #endif // HAS_DISPLAY
#if HAS_FEEDRATE_EDIT // Some displays offer Feedrate / Flow editing.
#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN, ULTIPANEL_FEEDMULTIPLY)
#define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum #define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum
#define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum #define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum
#endif #endif
#if HAS_FLOW_EDIT #if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum #define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum #define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
#endif #endif
@@ -1773,6 +1808,8 @@
//#define POWER_LOSS_RECOVERY //#define POWER_LOSS_RECOVERY
#if ENABLED(POWER_LOSS_RECOVERY) #if ENABLED(POWER_LOSS_RECOVERY)
#define PLR_ENABLED_DEFAULT false // Power-Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) #define PLR_ENABLED_DEFAULT false // Power-Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
//#define PLR_HEAT_BED_ON_REBOOT // Heat up bed immediately on reboot to mitigate object detaching/warping.
//#define PLR_HEAT_BED_EXTRA 0 // (°C) Relative increase of bed temperature for better adhesion (limited by max temp).
//#define PLR_BED_THRESHOLD BED_MAXTEMP // (°C) Skip user confirmation at or above this bed temperature (0 to disable) //#define PLR_BED_THRESHOLD BED_MAXTEMP // (°C) Skip user confirmation at or above this bed temperature (0 to disable)
//#define POWER_LOSS_PIN 44 // Pin to detect power-loss. Set to -1 to disable default pin on boards without module, or comment to use board default. //#define POWER_LOSS_PIN 44 // Pin to detect power-loss. Set to -1 to disable default pin on boards without module, or comment to use board default.
@@ -1836,6 +1873,7 @@
#define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
#define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
#define SDSORT_QUICK true // Use Quick Sort as a sorting algorithm. Otherwise use Bubble Sort.
#endif #endif
// Allow international symbols in long filenames. To display correctly, the // Allow international symbols in long filenames. To display correctly, the
@@ -1938,6 +1976,9 @@
//#define CUSTOM_FIRMWARE_UPLOAD //#define CUSTOM_FIRMWARE_UPLOAD
#endif #endif
// "Over-the-air" Firmware Update with M936 - Required to set EEPROM flag
//#define OTA_FIRMWARE_UPDATE
/** /**
* Set this option to one of the following (or the board's defaults apply): * Set this option to one of the following (or the board's defaults apply):
* *
@@ -2343,13 +2384,17 @@
* See https://marlinfw.org/docs/features/lin_advance.html for full instructions. * See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
*/ */
//#define LIN_ADVANCE //#define LIN_ADVANCE
#if ENABLED(LIN_ADVANCE)
#if ANY(LIN_ADVANCE, FT_MOTION)
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder #define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder. Override with 'M900 T<tool> K<mm>'.
#else #else
#define ADVANCE_K 0.22 // (mm) Compression length applying to all extruders #define ADVANCE_K 0.22 // (mm) Compression length for all extruders. Override with 'M900 K<mm>'.
#endif #endif
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with M900 L. //#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with 'M900 L'.
#endif
#if ENABLED(LIN_ADVANCE)
//#define LA_DEBUG // Print debug information to serial during operation. Disable for production use. //#define LA_DEBUG // Print debug information to serial during operation. Disable for production use.
//#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz. //#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz.
@@ -2363,11 +2408,11 @@
* Higher k and higher XY acceleration may require larger ADVANCE_TAU to avoid skipping steps. * Higher k and higher XY acceleration may require larger ADVANCE_TAU to avoid skipping steps.
*/ */
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
#define ADVANCE_TAU { 0.01 } // (s) Smoothing time to reduce extruder acceleration, per extruder #define ADVANCE_TAU { 0.02 } // (s) Smoothing time to reduce extruder acceleration, per extruder
#else #else
#define ADVANCE_TAU 0.01 // (s) Smoothing time to reduce extruder acceleration #define ADVANCE_TAU 0.02 // (s) Smoothing time to reduce extruder acceleration
#endif #endif
#define SMOOTH_LIN_ADV_HZ 5000 // (Hz) How often to update extruder speed #define SMOOTH_LIN_ADV_HZ 1000 // (Hz) How often to update extruder speed
#define INPUT_SHAPING_E_SYNC // Synchronize the extruder-shaped XY axes (to increase precision) #define INPUT_SHAPING_E_SYNC // Synchronize the extruder-shaped XY axes (to increase precision)
#endif #endif
#endif #endif
@@ -2380,6 +2425,9 @@
* For better results also enable ADAPTIVE_STEP_SMOOTHING. * For better results also enable ADAPTIVE_STEP_SMOOTHING.
*/ */
//#define NONLINEAR_EXTRUSION //#define NONLINEAR_EXTRUSION
#if ENABLED(NONLINEAR_EXTRUSION)
//#define NONLINEAR_EXTRUSION_DEFAULT_ON // Enable if NLE should be ON by default
#endif
// @section leveling // @section leveling
@@ -2993,7 +3041,7 @@
/** /**
* Trinamic Smart Drivers * Trinamic Smart Drivers
* *
* To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode: * To use TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
* - Connect your SPI pins to the Hardware SPI interface on the board. * - Connect your SPI pins to the Hardware SPI interface on the board.
* Some boards have simple jumper connections! See your board's documentation. * Some boards have simple jumper connections! See your board's documentation.
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file. * - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
@@ -3023,6 +3071,14 @@
*/ */
#define INTERPOLATE true #define INTERPOLATE true
#if HAS_DRIVER(TMC2240)
#define TMC2240_RREF 12000 // (Ω) 12000 .. 60000. (FLY TMC2240 = 12300)
// Max Current. Lower for more internal resolution. Raise to run cooler.
#define TMC2240_CURRENT_RANGE 1 // :{ 0:'RMS=690mA PEAK=1A', 1:'RMS=1410mA PEAK=2A', 2:'RMS=2120mA PEAK=3A', 3:'RMS=2110mA PEAK=3A' }
// Slope Control: Lower is more silent. Higher runs cooler.
#define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/µs', 1:'200V/µs', 2:'400V/µs', 3:'800V/µs' }
#endif
#if AXIS_IS_TMC_CONFIG(X) #if AXIS_IS_TMC_CONFIG(X)
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.) #define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
@@ -3245,7 +3301,7 @@
// @section tmc/spi // @section tmc/spi
/** /**
* Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. * Override default SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160 drivers here.
* The default pins can be found in your board's pins file. * The default pins can be found in your board's pins file.
*/ */
//#define X_CS_PIN -1 //#define X_CS_PIN -1
@@ -3272,7 +3328,7 @@
//#define E7_CS_PIN -1 //#define E7_CS_PIN -1
/** /**
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160).
* The default SW SPI pins are defined the respective pins files, * The default SW SPI pins are defined the respective pins files,
* but you can override or define them here. * but you can override or define them here.
*/ */
@@ -3331,7 +3387,7 @@
// @section tmc/stealthchop // @section tmc/stealthchop
/** /**
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only * TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
* Use Trinamic's ultra quiet stepping mode. * Use Trinamic's ultra quiet stepping mode.
* When disabled, Marlin will use spreadCycle stepping mode. * When disabled, Marlin will use spreadCycle stepping mode.
*/ */
@@ -3410,7 +3466,7 @@
// @section tmc/hybrid // @section tmc/hybrid
/** /**
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only * TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
* This mode allows for faster movements at the expense of higher noise levels. * This mode allows for faster movements at the expense of higher noise levels.
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
@@ -3444,20 +3500,20 @@
/** /**
* Use StallGuard to home / probe X, Y, Z. * Use StallGuard to home / probe X, Y, Z.
* *
* TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only * TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, TMC5130, and TMC5160 only
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
* X, Y, and Z homing will always be done in spreadCycle mode. * X, Y, and Z homing will always be done in spreadCycle mode.
* *
* X/Y/Z_STALL_SENSITIVITY is the default stall threshold. * X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
* Use M914 X Y Z to set the stall threshold at runtime: * Use M914 X Y Z to set the stall threshold at runtime:
* *
* Sensitivity TMC2209 Others * Sensitivity TMC2209 Others
* HIGHEST 255 -64 (Too sensitive => False positive) * HIGHEST 255 -64 (Too sensitive => False positive)
* LOWEST 0 63 (Too insensitive => No trigger) * LOWEST 0 63 (Too insensitive => No trigger)
* *
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }. * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
* *
* SPI_ENDSTOPS *** TMC2130/TMC5160 Only *** * SPI_ENDSTOPS *** TMC2130, TMC2240, and TMC5160 Only ***
* Poll the driver through SPI to determine load when homing. * Poll the driver through SPI to determine load when homing.
* Removes the need for a wire from DIAG1 to an endstop pin. * Removes the need for a wire from DIAG1 to an endstop pin.
* *
@@ -3485,8 +3541,9 @@
//#define U_STALL_SENSITIVITY 8 //#define U_STALL_SENSITIVITY 8
//#define V_STALL_SENSITIVITY 8 //#define V_STALL_SENSITIVITY 8
//#define W_STALL_SENSITIVITY 8 //#define W_STALL_SENSITIVITY 8
//#define SPI_ENDSTOPS // TMC2130/TMC5160 only //#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
//#define IMPROVE_HOMING_RELIABILITY //#define IMPROVE_HOMING_RELIABILITY
//#define SENSORLESS_STALLGUARD_DELAY 0 // (ms) Delay to allow drivers to settle
#endif #endif
// @section tmc/config // @section tmc/config
@@ -3974,7 +4031,7 @@
#endif #endif
/** /**
* M115 - Report capabilites. Disable to save ~1150 bytes of flash. * M115 - Report capabilities. Disable to save ~1150 bytes of flash.
* Some hosts (and serial TFT displays) rely on this feature. * Some hosts (and serial TFT displays) rely on this feature.
*/ */
#define CAPABILITIES_REPORT #define CAPABILITIES_REPORT
@@ -4049,13 +4106,17 @@
/** /**
* G-code Macros * G-code Macros
* *
* Add G-codes M810-M819 to define and run G-code macros. * Add G-codes M810-M819 to define and run G-code macros
* Macros are not saved to EEPROM. * and M820 to report the current set of macros.
* Macros are not saved to EEPROM unless enabled below.
*/ */
//#define GCODE_MACROS //#define GCODE_MACROS
#if ENABLED(GCODE_MACROS) #if ENABLED(GCODE_MACROS)
#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
#define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
#if ENABLED(EEPROM_SETTINGS)
//#define GCODE_MACROS_IN_EEPROM // Include macros in EEPROM
#endif
#endif #endif
/** /**
@@ -4077,22 +4138,27 @@
#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info" #define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
#define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W" #define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W"
//#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action //#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
//#define MAIN_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
#define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL #define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL
#define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) #define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
//#define MAIN_MENU_ITEM_2_CONFIRM //#define MAIN_MENU_ITEM_2_CONFIRM
//#define MAIN_MENU_ITEM_2_IMMEDIATE
//#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL //#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL
//#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) //#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
//#define MAIN_MENU_ITEM_3_CONFIRM //#define MAIN_MENU_ITEM_3_CONFIRM
//#define MAIN_MENU_ITEM_3_IMMEDIATE
//#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level" //#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level"
//#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" //#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
//#define MAIN_MENU_ITEM_4_CONFIRM //#define MAIN_MENU_ITEM_4_CONFIRM
//#define MAIN_MENU_ITEM_4_IMMEDIATE
//#define MAIN_MENU_ITEM_5_DESC "Home & Info" //#define MAIN_MENU_ITEM_5_DESC "Home & Info"
//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503" //#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
//#define MAIN_MENU_ITEM_5_CONFIRM //#define MAIN_MENU_ITEM_5_CONFIRM
//#define MAIN_MENU_ITEM_5_IMMEDIATE
#endif #endif
// @section custom config menu // @section custom config menu
@@ -4109,22 +4175,27 @@
#define CONFIG_MENU_ITEM_1_DESC "Wifi ON" #define CONFIG_MENU_ITEM_1_DESC "Wifi ON"
#define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678" #define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678"
//#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action //#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
//#define CONFIG_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
#define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON" #define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON"
#define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678" #define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678"
//#define CONFIG_MENU_ITEM_2_CONFIRM //#define CONFIG_MENU_ITEM_2_CONFIRM
//#define CONFIG_MENU_ITEM_2_IMMEDIATE
//#define CONFIG_MENU_ITEM_3_DESC "Radio OFF" //#define CONFIG_MENU_ITEM_3_DESC "Radio OFF"
//#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678" //#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678"
//#define CONFIG_MENU_ITEM_3_CONFIRM //#define CONFIG_MENU_ITEM_3_CONFIRM
//#define CONFIG_MENU_ITEM_3_IMMEDIATE
//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????" //#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????" //#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
//#define CONFIG_MENU_ITEM_4_CONFIRM //#define CONFIG_MENU_ITEM_4_CONFIRM
//#define CONFIG_MENU_ITEM_4_IMMEDIATE
//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????" //#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????" //#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
//#define CONFIG_MENU_ITEM_5_CONFIRM //#define CONFIG_MENU_ITEM_5_CONFIRM
//#define CONFIG_MENU_ITEM_5_IMMEDIATE
#endif #endif
// @section custom buttons // @section custom buttons
@@ -4141,6 +4212,7 @@
#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
#define BUTTON1_GCODE "G28" #define BUTTON1_GCODE "G28"
#define BUTTON1_DESC "Homing" // Optional string to set the LCD status #define BUTTON1_DESC "Homing" // Optional string to set the LCD status
//#define BUTTON1_IMMEDIATE // Skip the queue and run the G-code immediately. Rarely needed.
#endif #endif
//#define BUTTON2_PIN -1 //#define BUTTON2_PIN -1
@@ -4149,6 +4221,7 @@
#define BUTTON2_WHEN_PRINTING false #define BUTTON2_WHEN_PRINTING false
#define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
#define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
//#define BUTTON2_IMMEDIATE
#endif #endif
//#define BUTTON3_PIN -1 //#define BUTTON3_PIN -1
@@ -4157,6 +4230,7 @@
#define BUTTON3_WHEN_PRINTING false #define BUTTON3_WHEN_PRINTING false
#define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
#define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
//#define BUTTON3_IMMEDIATE
#endif #endif
#endif #endif
@@ -4229,7 +4303,7 @@
//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
// steps per full revolution (motor steps/rev * microstepping) // steps per full revolution (motor steps/rev * microstepping)
//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error correction.
#define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the
// printer will attempt to correct the error; errors // printer will attempt to correct the error; errors
// smaller than this are ignored to minimize effects of // smaller than this are ignored to minimize effects of
@@ -4661,6 +4735,11 @@
// //
//#define PINS_DEBUGGING //#define PINS_DEBUGGING
//
// M265 - I2C Scanner
//
//#define I2C_SCANNER
// Enable Tests that will run at startup and produce a report // Enable Tests that will run at startup and produce a report
//#define MARLIN_TEST_BUILD //#define MARLIN_TEST_BUILD
+70 -61
View File
@@ -188,15 +188,15 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1033)
else ifeq ($(HARDWARE_MOTHERBOARD),1034) else ifeq ($(HARDWARE_MOTHERBOARD),1034)
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed) # RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1035) else ifeq ($(HARDWARE_MOTHERBOARD),1040)
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed) # RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1036) else ifeq ($(HARDWARE_MOTHERBOARD),1041)
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1) # RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
else ifeq ($(HARDWARE_MOTHERBOARD),1037) else ifeq ($(HARDWARE_MOTHERBOARD),1042)
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan) # RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
else ifeq ($(HARDWARE_MOTHERBOARD),1038) else ifeq ($(HARDWARE_MOTHERBOARD),1043)
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan) # RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
else ifeq ($(HARDWARE_MOTHERBOARD),1039) else ifeq ($(HARDWARE_MOTHERBOARD),1044)
# #
# RAMPS Derivatives - ATmega1280, ATmega2560 # RAMPS Derivatives - ATmega1280, ATmega2560
@@ -286,59 +286,62 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1138)
else ifeq ($(HARDWARE_MOTHERBOARD),1139) else ifeq ($(HARDWARE_MOTHERBOARD),1139)
# Creality: CR10S, CR20, CR-X # Creality: CR10S, CR20, CR-X
else ifeq ($(HARDWARE_MOTHERBOARD),1140) else ifeq ($(HARDWARE_MOTHERBOARD),1140)
# Dagoma F5 # Creality CR-10 V2, CR-10 V3
else ifeq ($(HARDWARE_MOTHERBOARD),1141) else ifeq ($(HARDWARE_MOTHERBOARD),1141)
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC) # Dagoma F5
else ifeq ($(HARDWARE_MOTHERBOARD),1142) else ifeq ($(HARDWARE_MOTHERBOARD),1142)
# FYSETC F6 1.3 # Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
else ifeq ($(HARDWARE_MOTHERBOARD),1143) else ifeq ($(HARDWARE_MOTHERBOARD),1143)
# FYSETC F6 1.4 # FYSETC F6 1.3
else ifeq ($(HARDWARE_MOTHERBOARD),1144) else ifeq ($(HARDWARE_MOTHERBOARD),1144)
# Wanhao Duplicator i3 Plus # FYSETC F6 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1145) else ifeq ($(HARDWARE_MOTHERBOARD),1145)
# VORON Design # Wanhao Duplicator i3 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1146) else ifeq ($(HARDWARE_MOTHERBOARD),1146)
# Tronxy TRONXY-V3-1.0 # VORON Design
else ifeq ($(HARDWARE_MOTHERBOARD),1147) else ifeq ($(HARDWARE_MOTHERBOARD),1147)
# Z-Bolt X Series # Tronxy TRONXY-V3-1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1148) else ifeq ($(HARDWARE_MOTHERBOARD),1148)
# TT OSCAR # Z-Bolt X Series
else ifeq ($(HARDWARE_MOTHERBOARD),1149) else ifeq ($(HARDWARE_MOTHERBOARD),1149)
# BIQU Tango V1 # TT OSCAR
else ifeq ($(HARDWARE_MOTHERBOARD),1150) else ifeq ($(HARDWARE_MOTHERBOARD),1150)
# MKS GEN L V2 # BIQU Tango V1
else ifeq ($(HARDWARE_MOTHERBOARD),1151) else ifeq ($(HARDWARE_MOTHERBOARD),1151)
# MKS GEN L V2.1 # MKS GEN L V2
else ifeq ($(HARDWARE_MOTHERBOARD),1152) else ifeq ($(HARDWARE_MOTHERBOARD),1152)
# Copymaster 3D # MKS GEN L V2.1
else ifeq ($(HARDWARE_MOTHERBOARD),1153) else ifeq ($(HARDWARE_MOTHERBOARD),1153)
# Ortur 4 # Copymaster 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1154) else ifeq ($(HARDWARE_MOTHERBOARD),1154)
# Tenlog D3 Hero IDEX printer # Ortur 4
else ifeq ($(HARDWARE_MOTHERBOARD),1155) else ifeq ($(HARDWARE_MOTHERBOARD),1155)
# Tenlog D3, D5, D6 IDEX Printer # Tenlog D3 Hero IDEX printer
else ifeq ($(HARDWARE_MOTHERBOARD),1156) else ifeq ($(HARDWARE_MOTHERBOARD),1156)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) # Tenlog D3, D5, D6 IDEX Printer
else ifeq ($(HARDWARE_MOTHERBOARD),1157) else ifeq ($(HARDWARE_MOTHERBOARD),1157)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1158) else ifeq ($(HARDWARE_MOTHERBOARD),1158)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1159) else ifeq ($(HARDWARE_MOTHERBOARD),1159)
# Longer LK1 PRO / Alfawise U20 Pro (PRO version) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1160) else ifeq ($(HARDWARE_MOTHERBOARD),1160)
# Longer LKx PRO / Alfawise Uxx Pro (PRO version) # Longer LK1 PRO / Alfawise U20 Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1161) else ifeq ($(HARDWARE_MOTHERBOARD),1161)
# Pxmalion Core I3 # Longer LKx PRO / Alfawise Uxx Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1162) else ifeq ($(HARDWARE_MOTHERBOARD),1162)
# Panowin Cutlass (as found in the Panowin F1) # Pxmalion Core I3
else ifeq ($(HARDWARE_MOTHERBOARD),1163) else ifeq ($(HARDWARE_MOTHERBOARD),1163)
# Kodama Bardo V1.x (as found in the Kodama Trinus) # Panowin Cutlass (as found in the Panowin F1)
else ifeq ($(HARDWARE_MOTHERBOARD),1164) else ifeq ($(HARDWARE_MOTHERBOARD),1164)
# XTLW MFF V1.0 # Kodama Bardo V1.x (as found in the Kodama Trinus)
else ifeq ($(HARDWARE_MOTHERBOARD),1165) else ifeq ($(HARDWARE_MOTHERBOARD),1165)
# XTLW MFF V2.0 # XTLW MFF V1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1166) else ifeq ($(HARDWARE_MOTHERBOARD),1166)
# XTLW MFF V2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1167)
# E3D Rumba BigBox
else ifeq ($(HARDWARE_MOTHERBOARD),1168)
# #
# RAMBo and derivatives # RAMBo and derivatives
@@ -407,32 +410,34 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1319)
else ifeq ($(HARDWARE_MOTHERBOARD),1320) else ifeq ($(HARDWARE_MOTHERBOARD),1320)
# Geeetech GT2560 Rev B for A20(M/T/D) # Geeetech GT2560 Rev B for A20(M/T/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1321) else ifeq ($(HARDWARE_MOTHERBOARD),1321)
# Einstart retrofit
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
# Wanhao 0ne+ i3 Mini
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
# Overlord/Overlord Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
# ADIMLab Gantry v1
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
# ADIMLab Gantry v2
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
# Leapfrog Xeed 2015
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
# PICA Shield (original version)
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
# PICA Shield (rev C or later)
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
# Intamsys 4.0 (Funmat HT)
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
# Mega controller & Protoneer CNC Shield V3.00
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
# Geeetech GT2560 V4.1B for A10(M/T/D) # Geeetech GT2560 V4.1B for A10(M/T/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
# Einstart retrofit
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
# Wanhao 0ne+ i3 Mini
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
# Wanhao D9 MK2
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
# Overlord/Overlord Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
# ADIMLab Gantry v1
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
# ADIMLab Gantry v2
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
# Leapfrog Xeed 2015
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
# PICA Shield (original version)
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
# PICA Shield (rev C or later)
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
# Intamsys 4.0 (Funmat HT)
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
# Malyan M180 Mainboard Version 2
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
# Mega controller & Protoneer CNC Shield V3.00
else ifeq ($(HARDWARE_MOTHERBOARD),1334) else ifeq ($(HARDWARE_MOTHERBOARD),1334)
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
else ifeq ($(HARDWARE_MOTHERBOARD),1335)
# #
# ATmega1281, ATmega2561 # ATmega1281, ATmega2561
@@ -512,7 +517,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1511)
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p PROG_MCU ?= m1284p
# ZoneStar ZMIB V2 # ZoneStar ZMIB V2
else ifeq ($(HARDWARE_MOTHERBOARD),1511) else ifeq ($(HARDWARE_MOTHERBOARD),1512)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p PROG_MCU ?= m1284p
@@ -626,6 +631,10 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1707)
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286 PROG_MCU ?= usb1286
#
# SAM3X8E ARM Cortex-M3
#
# UltiMachine Archim1 (with DRV8825 drivers) # UltiMachine Archim1 (with DRV8825 drivers)
else ifeq ($(HARDWARE_MOTHERBOARD),3023) else ifeq ($(HARDWARE_MOTHERBOARD),3023)
HARDWARE_VARIANT ?= archim HARDWARE_VARIANT ?= archim
@@ -798,10 +807,10 @@ endif
ifeq ($(TMC), 1) ifeq ($(TMC), 1)
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \ LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \ CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp \
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \ GLOBAL_SCALER.cpp SLAVECONF.cpp IOIN.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp \
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \ SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp TMC2209Stepper.cpp TMC2240Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
endif endif
ifeq ($(RELOC_WORKAROUND), 1) ifeq ($(RELOC_WORKAROUND), 1)
+1 -1
View File
@@ -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 "2025-05-02" //#define STRING_DISTRIBUTION_DATE "2025-12-02"
/** /**
* The protocol for communication to the host. Protocol indicates communication * The protocol for communication to the host. Protocol indicates communication
+32 -22
View File
@@ -86,13 +86,14 @@ heater_0_maxtemp = 275
pidtemp = on pidtemp = on
pid_k1 = 0.95 pid_k1 = 0.95
pid_max = 255 pid_max = 255
pid_functional_range = 10 pid_functional_range = 20
default_kp = 22.20 default_kp = 22.20
default_ki = 1.08 default_ki = 1.08
default_kd = 114.00 default_kd = 114.00
temp_sensor_bed = 1 temp_sensor_bed = 1
bed_check_interval = 5000
bed_mintemp = 5 bed_mintemp = 5
bed_maxtemp = 150 bed_maxtemp = 150
@@ -163,18 +164,28 @@ min_steps_per_segment = 6
default_minsegmenttime = 20000 default_minsegmenttime = 20000
[config:basic] [config:basic]
hotend_overshoot = 15
bed_overshoot = 10 bed_overshoot = 10
max_bed_power = 255
busy_while_heating = on busy_while_heating = on
host_keepalive_feature = on
default_keepalive_interval = 2 default_keepalive_interval = 2
printjob_timer_autostart = on
jd_handle_small_segments = on
validate_homing_endstops = on
editable_steps_per_unit = on
eeprom_boot_silent = on eeprom_boot_silent = on
eeprom_chitchat = on eeprom_chitchat = on
endstoppullups = on endstoppullups = on
extrude_maxlength = 200
prevent_cold_extrusion = on
extrude_mintemp = 170 extrude_mintemp = 170
host_keepalive_feature = on prevent_lengthy_extrude = on
hotend_overshoot = 15 extrude_maxlength = 200
jd_handle_small_segments = on
max_bed_power = 255
min_software_endstops = on min_software_endstops = on
max_software_endstops = on max_software_endstops = on
@@ -195,21 +206,19 @@ preheat_2_temp_hotend = 240
preheat_2_temp_bed = 110 preheat_2_temp_bed = 110
preheat_2_fan_speed = 0 preheat_2_fan_speed = 0
prevent_cold_extrusion = on
prevent_lengthy_extrude = on
printjob_timer_autostart = on
temp_bed_hysteresis = 3 temp_bed_hysteresis = 3
temp_bed_residency_time = 10 temp_bed_residency_time = 10
temp_bed_window = 1 temp_bed_window = 1
temp_residency_time = 10 temp_residency_time = 10
temp_window = 1 temp_window = 1
validate_homing_endstops = on
editable_steps_per_unit = on
[config:advanced] [config:advanced]
arc_support = on arc_support = on
min_arc_segment_mm = 0.1
max_arc_segment_mm = 1.0
min_circle_segments = 72
n_arc_correction = 25
auto_report_temperatures = on auto_report_temperatures = on
autotemp = on autotemp = on
@@ -223,22 +232,23 @@ disable_idle_x = on
disable_idle_y = on disable_idle_y = on
disable_idle_z = on disable_idle_z = on
disable_idle_e = on disable_idle_e = on
e0_auto_fan_pin = -1 e0_auto_fan_pin = -1
faster_gcode_parser = on faster_gcode_parser = on
debug_flags_gcode = on debug_flags_gcode = on
homing_bump_mm = { 5, 5, 2 } homing_bump_mm = { 5, 5, 2 }
max_arc_segment_mm = 1.0
min_arc_segment_mm = 0.1
min_circle_segments = 72
n_arc_correction = 25
serial_overrun_protection = on
slowdown = on slowdown = on
slowdown_divisor = 2 slowdown_divisor = 2
tx_buffer_size = 0 multistepping_limit = 16
bed_check_interval = 5000 serial_overrun_protection = on
watch_bed_temp_increase = 2 tx_buffer_size = 0
watch_bed_temp_period = 60
watch_temp_increase = 2 watch_temp_increase = 2
watch_temp_period = 40 watch_temp_period = 40
watch_bed_temp_increase = 2
watch_bed_temp_period = 60
+1 -2
View File
@@ -119,7 +119,6 @@ void MarlinHAL::reboot() {
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
#include <avr/wdt.h> #include <avr/wdt.h>
#include "../../MarlinCore.h"
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. // Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
void MarlinHAL::watchdog_init() { void MarlinHAL::watchdog_init() {
@@ -154,7 +153,7 @@ void MarlinHAL::reboot() {
ISR(WDT_vect) { ISR(WDT_vect) {
sei(); // With the interrupt driven serial we need to allow interrupts. sei(); // With the interrupt driven serial we need to allow interrupts.
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED); SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
minkill(); // interrupt-safe final kill and infinite loop marlin.minkill(); // interrupt-safe final kill and infinite loop
} }
#endif #endif
+1 -1
View File
@@ -206,7 +206,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask() {} static void idletask() {}
// Reset // Reset
-1
View File
@@ -41,7 +41,6 @@
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) #if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
#include "MarlinSerial.h" #include "MarlinSerial.h"
#include "../../MarlinCore.h"
#if ENABLED(DIRECT_STEPPING) #if ENABLED(DIRECT_STEPPING)
#include "../../feature/direct_stepping.h" #include "../../feature/direct_stepping.h"
+3 -3
View File
@@ -241,7 +241,7 @@ uint8_t extDigitalRead(const int8_t pin) {
* *
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse. * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
*/ */
uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) { uint16_t set_pwm_frequency_hz(const float hz, const float dca, const float dcb, const float dcc) {
float count = 0; float count = 0;
if (hz > 0 && (dca || dcb || dcc)) { if (hz > 0 && (dca || dcb || dcc)) {
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq. count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
@@ -254,7 +254,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
else { prescaler = 1; SET_CS(5, PRESCALER_1); } else { prescaler = 1; SET_CS(5, PRESCALER_1); }
count /= float(prescaler); count /= float(prescaler);
const float pwm_top = round(count); // Get the rounded count const float pwm_top = roundf(count); // Get the rounded count
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
OCR5A = pwm_top * ABS(dca); // Update and scale DCs OCR5A = pwm_top * ABS(dca); // Update and scale DCs
@@ -280,7 +280,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
OCR5A = OCR5B = OCR5C = 0; OCR5A = OCR5B = OCR5C = 0;
} }
return round(count); return roundf(count);
} }
#endif #endif
+1 -1
View File
@@ -95,7 +95,7 @@
/** /**
* The Trinamic library includes SoftwareSerial.h, leading to a compile error. * The Trinamic library includes SoftwareSerial.h, leading to a compile error.
*/ */
#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE) #if ALL(HAS_TMC_SW_SERIAL, ENDSTOP_INTERRUPTS_FEATURE)
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
#endif #endif
+4 -4
View File
@@ -93,15 +93,15 @@ namespace AVRHelpers {
typedef T type; typedef T type;
}; };
template <typename T> template <typename T>
struct voltype <T, 1u> { struct voltype <T, 1U> {
typedef uint8_t type; typedef uint8_t type;
}; };
template <typename T> template <typename T>
struct voltype <T, 2u> { struct voltype <T, 2U> {
typedef uint16_t type; typedef uint16_t type;
}; };
template <typename T> template <typename T>
struct voltype <T, 4u> { struct voltype <T, 4U> {
typedef uint32_t type; typedef uint32_t type;
}; };
@@ -2007,7 +2007,7 @@ inline void _ATmega_resetperipherals() {
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM05__) #if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM05__)
_EEAR._EEAR = 0; _EEAR._EEAR = 0;
dwrite(_EEDR, (uint8_t)0u); dwrite(_EEDR, (uint8_t)0U);
#endif #endif
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__) #if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__)
+10 -10
View File
@@ -28,7 +28,7 @@
// ------------------------ // ------------------------
typedef uint16_t hal_timer_t; typedef uint16_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFU
// ------------------------ // ------------------------
// Defines // Defines
@@ -46,15 +46,15 @@ typedef uint16_t hal_timer_t;
#define MF_TIMER_TEMP 0 #define MF_TIMER_TEMP 0
#endif #endif
#define TEMP_TIMER_FREQUENCY (((F_CPU) + 0x2000) / 0x4000) #define TEMP_TIMER_FREQUENCY (((F_CPU) + 0x2000) / 0x4000)
#define STEPPER_TIMER_RATE HAL_TIMER_RATE #define STEPPER_TIMER_RATE HAL_TIMER_RATE
#define STEPPER_TIMER_PRESCALE 8 #define STEPPER_TIMER_PRESCALE 8
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL)
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) #define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) #define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
@@ -111,8 +111,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) NOOP inline void HAL_timer_isr_prologue(const uint8_t) {}
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
-1
View File
@@ -27,7 +27,6 @@
#ifdef ARDUINO_ARCH_SAM #ifdef ARDUINO_ARCH_SAM
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#include "../../MarlinCore.h"
#include <Wire.h> #include <Wire.h>
#include "usb/usb_task.h" #include "usb/usb_task.h"
+1 -1
View File
@@ -132,7 +132,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask(); static void idletask();
// Reset // Reset
-1
View File
@@ -31,7 +31,6 @@
#include "MarlinSerial.h" #include "MarlinSerial.h"
#include "InterruptVectors.h" #include "InterruptVectors.h"
#include "../../MarlinCore.h"
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_r MarlinSerial<Cfg>::rx_buffer = { 0, 0, { 0 } }; template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_r MarlinSerial<Cfg>::rx_buffer = { 0, 0, { 0 } };
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_t MarlinSerial<Cfg>::tx_buffer = { 0 }; template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_t MarlinSerial<Cfg>::tx_buffer = { 0 };
+9 -9
View File
@@ -34,7 +34,7 @@
#define FORCE_INLINE __attribute__((always_inline)) inline #define FORCE_INLINE __attribute__((always_inline)) inline
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
#define HAL_TIMER_PRESCALER 2 #define HAL_TIMER_PRESCALER 2
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals #define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
@@ -52,19 +52,19 @@ typedef uint32_t hal_timer_t;
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones #define MF_TIMER_TONE 6 // index of timer to use for beeper tones
#endif #endif
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR 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 // (Hz) Frequency of Stepper Timer ISR (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) / 1000000UL) // (MHz) 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 // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
@@ -127,4 +127,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR; pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
} }
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
+1 -1
View File
@@ -229,7 +229,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void);
* - USB Device Controller (UDC) provides USB chapter 9 compliance * - USB Device Controller (UDC) provides USB chapter 9 compliance
* - USB Device Interface (UDI) provides USB Class compliance * - USB Device Interface (UDI) provides USB Class compliance
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU * - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
*
* Many USB Device applications can be implemented on Atmel MCU. * Many USB Device applications can be implemented on Atmel MCU.
* Atmel provides many application notes for different applications: * Atmel provides many application notes for different applications:
* - AVR4900, provides general information about Device Stack * - AVR4900, provides general information about Device Stack
+3 -3
View File
@@ -523,7 +523,7 @@ static bool udd_ep_interrupt(void);
* \internal * \internal
* \brief Function called by UOTGHS interrupt to manage USB Device interrupts * \brief Function called by UOTGHS interrupt to manage USB Device interrupts
* *
* USB Device interrupt events are splited in three parts: * USB Device interrupt events are split in three parts:
* - USB line events (SOF, reset, suspend, resume, wakeup) * - USB line events (SOF, reset, suspend, resume, wakeup)
* - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall) * - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
* - bulk/interrupt/isochronous endpoints events (end of data transfer) * - bulk/interrupt/isochronous endpoints events (end of data transfer)
@@ -1567,7 +1567,7 @@ static void udd_ctrl_out_received(void)
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 intermediate callback
// in case of data receiv generate a stall // in case of data receive 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) {
if (!udd_g_ctrlreq.over_under_run()) { if (!udd_g_ctrlreq.over_under_run()) {
@@ -1808,7 +1808,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
} }
if (ptr_job->buf_cnt != ptr_job->buf_size) { if (ptr_job->buf_cnt != ptr_job->buf_size) {
// Need to send or receiv other data // Need to send or receive other data
next_trans = ptr_job->buf_size - ptr_job->buf_cnt; next_trans = ptr_job->buf_size - ptr_job->buf_cnt;
if (UDD_ENDPOINT_MAX_TRANS < next_trans) { if (UDD_ENDPOINT_MAX_TRANS < next_trans) {
+7 -6
View File
@@ -242,12 +242,13 @@ void MarlinHAL::adc_init() {
TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db)); TERN_(HAS_FILWIDTH_ADC, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
TERN_(HAS_FILWIDTH2_ADC, adc1_set_attenuation(get_channel(FILWIDTH2_PIN), ADC_ATTEN_11db));
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail. // Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
// That's why we're not setting it up here. // That's why we're not setting it up here.
+5 -5
View File
@@ -64,10 +64,10 @@
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock) #define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
#define PWM_FREQUENCY 1000u // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency() #define PWM_FREQUENCY 1000U // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
#define PWM_RESOLUTION 10u // Default PWM bit resolution #define PWM_RESOLUTION 10U // Default PWM bit resolution
#define CHANNEL_MAX_NUM 15u // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high) #define CHANNEL_MAX_NUM 15U // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
#define MAX_PWM_IOPIN 33u // hardware pwm pins < 34 #define MAX_PWM_IOPIN 33U // hardware pwm pins < 34
#ifndef MAX_EXPANDER_BITS #ifndef MAX_EXPANDER_BITS
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32) #define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
#endif #endif
@@ -194,7 +194,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask(); static void idletask();
// Reset // Reset
+1 -1
View File
@@ -35,7 +35,7 @@ Servo::Servo() {}
int8_t Servo::attach(const int inPin) { int8_t Servo::attach(const int inPin) {
if (inPin > 0) pin = inPin; if (inPin > 0) pin = inPin;
channel = get_pwm_channel(pin, 50u, 16u); channel = get_pwm_channel(pin, 50U, 16U);
return channel; // -1 if no PWM avail. return channel; // -1 if no PWM avail.
} }
+2 -2
View File
@@ -78,8 +78,8 @@ void IRAM_ATTR timer_isr(void *para) {
/** /**
* Enable and initialize the timer * Enable and initialize the timer
* @param timer_num timer number to initialize * @param timer_num timer number to initialize
* @param frequency frequency of the timer * @param frequency frequency of the timer
*/ */
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) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = timer_config[timer_num];
+20 -19
View File
@@ -30,41 +30,46 @@
#define FORCE_INLINE __attribute__((always_inline)) inline #define FORCE_INLINE __attribute__((always_inline)) inline
typedef uint64_t hal_timer_t; typedef uint64_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL #define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
#ifndef MF_TIMER_STEP #ifndef MF_TIMER_STEP
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define MF_TIMER_STEP 0 // Timer Index for Stepper
#endif #endif
#ifndef MF_TIMER_PULSE #ifndef MF_TIMER_PULSE
#define MF_TIMER_PULSE MF_TIMER_STEP #define MF_TIMER_PULSE MF_TIMER_STEP // Timer Index for Pulse interval
#endif #endif
#ifndef MF_TIMER_TEMP #ifndef MF_TIMER_TEMP
#define MF_TIMER_TEMP 1 // Timer Index for Temperature #define MF_TIMER_TEMP 1 // Timer Index for Temperature
#endif #endif
#ifndef MF_TIMER_PWM #ifndef MF_TIMER_PWM
#define MF_TIMER_PWM 2 // index of timer to use for PWM outputs #define MF_TIMER_PWM 2 // Timer Index for PWM outputs
#endif #endif
#ifndef MF_TIMER_TONE #ifndef MF_TIMER_TONE
#define MF_TIMER_TONE 3 // index of timer for beeper tones #define MF_TIMER_TONE 3 // Timer Index 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
#define TEMP_TIMER_PRESCALE 1000 // Prescaler for setting Temp Timer, 72Khz
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
#if ENABLED(I2S_STEPPER_STREAM) #if ENABLED(I2S_STEPPER_STREAM)
#define STEPPER_TIMER_PRESCALE 1 #define STEPPER_TIMER_PRESCALE 1
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock #define STEPPER_TIMER_RATE 250'000 // 250khz, 4µs pulses of i2s word clock
#define STEPPER_TIMER_TICKS_PER_US 0.25 // (MHz) Stepper Timer ticks per µs
#else #else
#define STEPPER_TIMER_PRESCALE 40 #define STEPPER_TIMER_PRESCALE 40
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz #define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // (Hz) Frequency of Stepper Timer ISR, 2MHz
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1'000'000UL) // (MHz) Stepper Timer ticks per µs
#endif #endif
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts #define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz #define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
#define PWM_TIMER_PRESCALE 10 #define PWM_TIMER_PRESCALE 10
#if ENABLED(FAST_PWM_FAN) #if ENABLED(FAST_PWM_FAN)
@@ -74,13 +79,9 @@ typedef uint64_t hal_timer_t;
#endif #endif
#define MAX_PWM_PINS 32 // Number of PWM pin-slots #define MAX_PWM_PINS 32 // Number of PWM pin-slots
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
@@ -135,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) NOOP inline void HAL_timer_isr_prologue(const uint8_t) {}
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
+6 -3
View File
@@ -53,12 +53,15 @@ uint16_t MarlinHAL::adc_result;
// Initializes the Marlin HAL // Initializes the Marlin HAL
void MarlinHAL::init() { void MarlinHAL::init() {
// Ensure F_CPU is a constant expression.
// If the compiler breaks here, it means that delay code that should compute at compile time will not work.
// So better safe than sorry here.
constexpr unsigned int cpuFreq = F_CPU; constexpr unsigned int cpuFreq = F_CPU;
UNUSED(cpuFreq); UNUSED(cpuFreq);
#if PIN_EXISTS(LED) #if PIN_EXISTS(LED)
OUT_WRITE(LED_PIN, LOW); OUT_WRITE(LED_PIN, LOW);
#endif #endif
SetTimerInterruptPriorities(); SetTimerInterruptPriorities();
+1 -1
View File
@@ -105,7 +105,7 @@ extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char
class MarlinHAL { class MarlinHAL {
public: public:
// Before setup() // Before setup()
MarlinHAL() {} MarlinHAL() = default;
// Watchdog // Watchdog
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {}); static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
+3 -3
View File
@@ -33,8 +33,8 @@
using namespace arduino; using namespace arduino;
MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) { auto MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) -> MarlinSerial& {
UsartSerial& serial = UsartSerial::get_instance(Base, rxPin, txPin); auto& serial = UsartSerial::get_instance(Base, rxPin, txPin);
return *reinterpret_cast<MarlinSerial*>(&serial); return *reinterpret_cast<MarlinSerial*>(&serial);
} }
@@ -61,7 +61,7 @@ MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPi
static void emergency_callback() { static void emergency_callback() {
if (!current_serial_instance) return; if (!current_serial_instance) return;
const uint8_t last_data = current_serial_instance->get_last_data(); const auto last_data = current_serial_instance->get_last_data();
emergency_parser.update(current_serial_instance->emergency_state, last_data); emergency_parser.update(current_serial_instance->emergency_state, last_data);
} }
+2 -2
View File
@@ -43,7 +43,7 @@
using namespace arduino; using namespace arduino;
struct MarlinSerial : public UsartSerial { struct MarlinSerial : public UsartSerial {
static MarlinSerial& get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN); static auto get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN) -> MarlinSerial&;
void begin(unsigned long baudrate, uint16_t config); void begin(unsigned long baudrate, uint16_t config);
inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); } inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); }
@@ -57,7 +57,7 @@ struct MarlinSerial : public UsartSerial {
EmergencyParser::State emergency_state; EmergencyParser::State emergency_state;
// Accessor method to get the last received byte // Accessor method to get the last received byte
uint8_t get_last_data() { return usart_.get_last_data(); } auto get_last_data() -> uint8_t { return usart_.get_last_data(); }
// Register the emergency callback // Register the emergency callback
void register_emergency_callback(void (*callback)()); void register_emergency_callback(void (*callback)());
+2 -1
View File
@@ -3,6 +3,7 @@
This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library. This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library.
Currently it supports: Currently it supports:
* GD32F303RET6
- GD32F303RET6
Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL). Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL).
@@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
// so only write bytes that have changed! // so only write bytes that have changed!
if (v != eeprom_read_byte(p)) { if (v != eeprom_read_byte(p)) {
eeprom_write_byte(p, v); eeprom_write_byte(p, v);
if (++written & 0x7F) delay(4); else safe_delay(4); if (++written & 0x7F) delay(2); else safe_delay(2);
if (eeprom_read_byte(p) != v) { if (eeprom_read_byte(p) != v) {
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
return true; return true;
@@ -42,7 +42,7 @@ void eeprom_init() {
void eeprom_write_byte(uint8_t *pos, uint8_t value) { void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos; const unsigned eeprom_address = (unsigned)pos;
return BL24CXX::writeOneByte(eeprom_address, value); BL24CXX::writeOneByte(eeprom_address, value);
} }
uint8_t eeprom_read_byte(uint8_t *pos) { uint8_t eeprom_read_byte(uint8_t *pos) {
+11 -10
View File
@@ -21,26 +21,27 @@
*/ */
#pragma once #pragma once
// Fast I/O interfaces for GD32F303RE // Fast I/O interfaces for GD32
#include <GPIO.hpp> #include <GPIO.hpp>
#include <variant.h>
#include <PinOps.hpp> #include <PinOps.hpp>
#include <PinOpsMap.hpp> #include <PinOpsMap.hpp>
template<typename T> template<typename T>
static inline void fast_write_pin_wrapper(pin_size_t IO, T V) { FORCE_INLINE static void fast_write_pin_wrapper(pin_size_t IO, T V) {
auto port = getPortFromPin(IO); const PortPinPair& pp = port_pin_map[IO];
auto pin = getPinInPort(IO); gpio::fast_write_pin(pp.port, pp.pin, static_cast<bool>(V));
if (static_cast<bool>(V)) gpio::fast_set_pin(port, pin);
else gpio::fast_clear_pin(port, pin);
} }
static inline bool fast_read_pin_wrapper(pin_size_t IO) { FORCE_INLINE static auto fast_read_pin_wrapper(pin_size_t IO) -> bool {
return gpio::fast_read_pin(getPortFromPin(IO), getPinInPort(IO)); const PortPinPair& pp = port_pin_map[IO];
return gpio::fast_read_pin(pp.port, pp.pin);
} }
static inline void fast_toggle_pin_wrapper(pin_size_t IO) { FORCE_INLINE static void fast_toggle_pin_wrapper(pin_size_t IO) {
gpio::fast_toggle_pin(getPortFromPin(IO), getPinInPort(IO)); const PortPinPair& pp = port_pin_map[IO];
gpio::fast_toggle_pin(pp.port, pp.pin);
} }
// ------------------------ // ------------------------
+6 -4
View File
@@ -70,8 +70,9 @@ bool isAnalogPin(const pin_t pin) {
if (!isValidPin(pin)) return false; if (!isValidPin(pin)) return false;
if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) { if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) {
auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); const PortPinPair& pp = port_pin_map[pin];
return instance.get_pin_mode(getPinInPort(pin)) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin); auto& instance = gpio::GPIO::get_instance(pp.port).value();
return instance.get_pin_mode(pp.pin) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin);
} }
return false; return false;
@@ -80,8 +81,9 @@ bool isAnalogPin(const pin_t pin) {
bool getValidPinMode(const pin_t pin) { bool getValidPinMode(const pin_t pin) {
if (!isValidPin(pin)) return false; if (!isValidPin(pin)) return false;
auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); const PortPinPair& pp = port_pin_map[pin];
gpio::Pin_Mode mode = instance.get_pin_mode(getPinInPort(pin)); auto& instance = gpio::GPIO::get_instance(pp.port).value();
gpio::Pin_Mode mode = instance.get_pin_mode(pp.pin);
return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING && return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING &&
mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN; mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN;
+123 -123
View File
@@ -28,7 +28,7 @@
namespace sdio { namespace sdio {
CardDMA& CardDMA::get_instance() { auto CardDMA::get_instance() -> CardDMA& {
static CardDMA instance; static CardDMA instance;
return instance; return instance;
} }
@@ -38,9 +38,7 @@ CardDMA::CardDMA() :
sdcard_cid_{0U, 0U, 0U, 0U}, sdcard_cid_{0U, 0U, 0U, 0U},
sdcard_scr_{0U, 0U}, sdcard_scr_{0U, 0U},
desired_clock_(Default_Desired_Clock), desired_clock_(Default_Desired_Clock),
stop_condition_(0U),
total_bytes_(0U), total_bytes_(0U),
count_(0U),
sdio_(SDIO::get_instance()), sdio_(SDIO::get_instance()),
config_(sdio_.get_config()), config_(sdio_.get_config()),
dmaBase_(dma::DMA_Base::DMA1_BASE), dmaBase_(dma::DMA_Base::DMA1_BASE),
@@ -50,15 +48,15 @@ CardDMA::CardDMA() :
transfer_error_(SDIO_Error_Type::OK), transfer_error_(SDIO_Error_Type::OK),
interface_version_(Interface_Version::UNKNOWN), interface_version_(Interface_Version::UNKNOWN),
card_type_(Card_Type::UNKNOWN), card_type_(Card_Type::UNKNOWN),
current_state_(Operational_State::READY),
transfer_end_(false), transfer_end_(false),
is_rx_(false),
multiblock_(false), multiblock_(false),
current_state_(Operational_State::READY) is_rx_(false)
{ {
} }
// Initialize card and put in standby state // Initialize card and put in standby state
SDIO_Error_Type CardDMA::init() { auto CardDMA::init() -> SDIO_Error_Type {
// Reset SDIO peripheral // Reset SDIO peripheral
sdio_.reset(); sdio_.reset();
sync_domains(); sync_domains();
@@ -79,7 +77,7 @@ SDIO_Error_Type CardDMA::init() {
} }
// Startup command procedure according to SDIO specification // Startup command procedure according to SDIO specification
SDIO_Error_Type CardDMA::begin_startup_procedure() { auto CardDMA::begin_startup_procedure() -> SDIO_Error_Type {
sdio_.set_power_mode(Power_Control::POWER_ON); sdio_.set_power_mode(Power_Control::POWER_ON);
sdio_.set_clock_enable(true); sdio_.set_clock_enable(true);
sync_domains(); sync_domains();
@@ -124,12 +122,12 @@ SDIO_Error_Type CardDMA::begin_startup_procedure() {
} }
// Voltage validation // Voltage validation
SDIO_Error_Type CardDMA::validate_voltage() { auto CardDMA::validate_voltage() -> SDIO_Error_Type {
uint32_t response = 0U; uint32_t response = 0U;
uint32_t count = 0U; uint32_t count = 0U;
bool valid_voltage = false; bool valid_voltage = false;
while ((count < Max_Voltage_Checks) && (valid_voltage == false)) { while (count < Max_Voltage_Checks && valid_voltage == false) {
if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT,
Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() {
return get_r1_result(cmd); return get_r1_result(cmd);
@@ -144,7 +142,7 @@ SDIO_Error_Type CardDMA::validate_voltage() {
return SDIO_Error_Type::ACMD41_FAILED; return SDIO_Error_Type::ACMD41_FAILED;
} }
response = sdio_.get_response(Response_Type::RESPONSE0); response = sdio_.get_response(Response_Type::RESPONSE0);
valid_voltage = (((response >> 31U) == 1U) ? true : false); valid_voltage = ((response >> 31U) == 1U);
count++; count++;
} }
@@ -171,7 +169,7 @@ void CardDMA::begin_shutdown_procedure() {
} }
// Initialize card // Initialize card
SDIO_Error_Type CardDMA::card_init() { auto CardDMA::card_init() -> SDIO_Error_Type {
if (sdio_.get_power_mode() == static_cast<uint32_t>(Power_Control::POWER_OFF)) { if (sdio_.get_power_mode() == static_cast<uint32_t>(Power_Control::POWER_OFF)) {
return SDIO_Error_Type::INVALID_OPERATION; return SDIO_Error_Type::INVALID_OPERATION;
} }
@@ -221,7 +219,7 @@ SDIO_Error_Type CardDMA::card_init() {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::store_cid() { auto CardDMA::store_cid() -> SDIO_Error_Type {
// Store the CID register values // Store the CID register values
sdcard_cid_[0] = sdio_.get_response(Response_Type::RESPONSE0); sdcard_cid_[0] = sdio_.get_response(Response_Type::RESPONSE0);
sdcard_cid_[1] = sdio_.get_response(Response_Type::RESPONSE1); sdcard_cid_[1] = sdio_.get_response(Response_Type::RESPONSE1);
@@ -231,7 +229,7 @@ SDIO_Error_Type CardDMA::store_cid() {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::store_csd() { auto CardDMA::store_csd() -> SDIO_Error_Type {
// Store the CSD register values // Store the CSD register values
sdcard_csd_[0] = sdio_.get_response(Response_Type::RESPONSE0); sdcard_csd_[0] = sdio_.get_response(Response_Type::RESPONSE0);
sdcard_csd_[1] = sdio_.get_response(Response_Type::RESPONSE1); sdcard_csd_[1] = sdio_.get_response(Response_Type::RESPONSE1);
@@ -241,7 +239,7 @@ SDIO_Error_Type CardDMA::store_csd() {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) { auto CardDMA::set_hardware_bus_width(Bus_Width width) -> SDIO_Error_Type {
if (card_type_ == Card_Type::SD_MMC || width == Bus_Width::WIDTH_8BIT) { if (card_type_ == Card_Type::SD_MMC || width == Bus_Width::WIDTH_8BIT) {
return SDIO_Error_Type::UNSUPPORTED_FUNCTION; return SDIO_Error_Type::UNSUPPORTED_FUNCTION;
} }
@@ -283,7 +281,7 @@ SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) {
return SDIO_Error_Type::UNSUPPORTED_FUNCTION; return SDIO_Error_Type::UNSUPPORTED_FUNCTION;
} }
SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) { auto CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type {
if (current_state_ == Operational_State::READY) { if (current_state_ == Operational_State::READY) {
transfer_error_ = SDIO_Error_Type::OK; transfer_error_ = SDIO_Error_Type::OK;
current_state_ = Operational_State::BUSY; current_state_ = Operational_State::BUSY;
@@ -340,7 +338,7 @@ SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) {
} }
} }
SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) { auto CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type {
// Enable the interrupts // Enable the interrupts
sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true);
sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true);
@@ -363,7 +361,7 @@ SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) {
// CMD25/CMD24 (WRITE_MULTIPLE_BLOCK/WRITE_BLOCK) send write command // CMD25/CMD24 (WRITE_MULTIPLE_BLOCK/WRITE_BLOCK) send write command
Command_Index write_cmd = (count > 1U) ? Command_Index::CMD25 : Command_Index::CMD24; Command_Index write_cmd = (count > 1U) ? Command_Index::CMD25 : Command_Index::CMD24;
if (send_command_and_check(write_cmd, address, Command_Response::RSP_SHORT, if (send_command_and_check(write_cmd, address, Command_Response::RSP_SHORT,
Wait_Type::WT_NONE, [this, cmd = write_cmd]() { Wait_Type::WT_NONE, [this, cmd = write_cmd]() {
return get_r1_result(cmd); return get_r1_result(cmd);
}) != SDIO_Error_Type::OK) { }) != SDIO_Error_Type::OK) {
sdio_.clear_multiple_interrupt_flags(clear_common_flags); sdio_.clear_multiple_interrupt_flags(clear_common_flags);
@@ -379,16 +377,16 @@ SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) {
Block_Size block_size = get_data_block_size_index(total_bytes_); Block_Size block_size = get_data_block_size_index(total_bytes_);
sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size,
Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true); Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true);
while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { while (dma_.get_flag(dma::Status_Flags::FLAG_FTFIF) || dma_.get_flag(dma::Status_Flags::FLAG_ERRIF)) {
// Wait for the IRQ handler to clear // Wait for the IRQ handler to clear
} }
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::erase(uint32_t address_start, uint32_t address_end) { auto CardDMA::erase(uint32_t address_start, uint32_t address_end) -> SDIO_Error_Type {
SDIO_Error_Type result = SDIO_Error_Type::OK; SDIO_Error_Type result = SDIO_Error_Type::OK;
// Card command classes CSD // Card command classes CSD
@@ -459,9 +457,11 @@ void CardDMA::handle_interrupts() {
disable_all_interrupts(); disable_all_interrupts();
sdio_.set_data_state_machine_enable(false); sdio_.set_data_state_machine_enable(false);
if ((multiblock_) && (!is_rx_)) { if (multiblock_ && !is_rx_) {
transfer_error_ = stop_transfer(); transfer_error_ = stop_transfer();
if (transfer_error_ != SDIO_Error_Type::OK) {} if (transfer_error_ != SDIO_Error_Type::OK) {
return;
}
} }
if (!is_rx_) { if (!is_rx_) {
@@ -497,7 +497,7 @@ void CardDMA::handle_interrupts() {
} }
} }
SDIO_Error_Type CardDMA::select_deselect() { auto CardDMA::select_deselect() -> SDIO_Error_Type {
// CMD7 (SELECT/DESELECT_CARD) // CMD7 (SELECT/DESELECT_CARD)
if (send_command_and_check(Command_Index::CMD7, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift), if (send_command_and_check(Command_Index::CMD7, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD7]() { Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD7]() {
@@ -508,7 +508,7 @@ SDIO_Error_Type CardDMA::select_deselect() {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) { auto CardDMA::get_card_interface_status(uint32_t* status) -> SDIO_Error_Type {
if (status == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; if (status == nullptr) return SDIO_Error_Type::INVALID_PARAMETER;
// CMD13 (SEND_STATUS) // CMD13 (SEND_STATUS)
@@ -524,7 +524,7 @@ SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::get_sdcard_status(uint32_t* status) { auto CardDMA::get_sdcard_status(uint32_t* status) -> SDIO_Error_Type {
uint32_t count = 0U; uint32_t count = 0U;
// CMD16 (SET_BLOCKLEN) // CMD16 (SET_BLOCKLEN)
@@ -599,7 +599,7 @@ void CardDMA::check_dma_complete() {
} }
} }
SDIO_Error_Type CardDMA::stop_transfer() { auto CardDMA::stop_transfer() -> SDIO_Error_Type {
// CMD12 (STOP_TRANSMISSION) // CMD12 (STOP_TRANSMISSION)
if (send_command_and_check(Command_Index::CMD12, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD12]() { if (send_command_and_check(Command_Index::CMD12, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD12]() {
return get_r1_result(cmd); return get_r1_result(cmd);
@@ -609,7 +609,7 @@ SDIO_Error_Type CardDMA::stop_transfer() {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
Transfer_State CardDMA::get_transfer_state() { auto CardDMA::get_transfer_state() -> Transfer_State {
Transfer_State transfer_state = Transfer_State::IDLE; Transfer_State transfer_state = Transfer_State::IDLE;
if (sdio_.get_flag(Status_Flags::FLAG_TXRUN) | sdio_.get_flag(Status_Flags::FLAG_RXRUN)) { if (sdio_.get_flag(Status_Flags::FLAG_TXRUN) | sdio_.get_flag(Status_Flags::FLAG_RXRUN)) {
transfer_state = Transfer_State::BUSY; transfer_state = Transfer_State::BUSY;
@@ -618,7 +618,7 @@ Transfer_State CardDMA::get_transfer_state() {
return transfer_state; return transfer_state;
} }
uint32_t CardDMA::get_card_capacity() const { [[nodiscard]] auto CardDMA::get_card_capacity() const -> uint32_t {
auto extract_bits = [](uint32_t value, uint8_t start_bit, uint8_t length) -> uint32_t { auto extract_bits = [](uint32_t value, uint8_t start_bit, uint8_t length) -> uint32_t {
return (value >> start_bit) & ((1U << length) - 1U); return (value >> start_bit) & ((1U << length) - 1U);
}; };
@@ -665,7 +665,7 @@ uint32_t CardDMA::get_card_capacity() const {
return capacity; return capacity;
} }
SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) { auto CardDMA::get_card_specific_data(Card_Info* info) -> SDIO_Error_Type {
if (info == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; if (info == nullptr) return SDIO_Error_Type::INVALID_PARAMETER;
// Store basic card information // Store basic card information
@@ -735,28 +735,20 @@ SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
constexpr Block_Size CardDMA::get_data_block_size_index(uint16_t size) { constexpr auto CardDMA::get_data_block_size_index(uint16_t size) -> Block_Size {
switch (size) { if (size < 1 || size > 16384) return Block_Size::BYTES_1;
case 1: return Block_Size::BYTES_1;
case 2: return Block_Size::BYTES_2; // Check if size is a power of two
case 4: return Block_Size::BYTES_4; if ((size & (size - 1)) != 0) return Block_Size::BYTES_1;
case 8: return Block_Size::BYTES_8;
case 16: return Block_Size::BYTES_16; // Count trailing zeros to find the index
case 32: return Block_Size::BYTES_32; uint16_t index = 0;
case 64: return Block_Size::BYTES_64; while ((size >>= 1) != 0) ++index;
case 128: return Block_Size::BYTES_128;
case 256: return Block_Size::BYTES_256; return static_cast<Block_Size>(index);
case 512: return Block_Size::BYTES_512;
case 1024: return Block_Size::BYTES_1024;
case 2048: return Block_Size::BYTES_2048;
case 4096: return Block_Size::BYTES_4096;
case 8192: return Block_Size::BYTES_8192;
case 16384: return Block_Size::BYTES_16384;
default: return Block_Size::BYTES_1;
}
} }
SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) { auto CardDMA::get_card_state(Card_State* card_state) -> SDIO_Error_Type {
// CMD13 (SEND_STATUS) // CMD13 (SEND_STATUS)
if (send_command_and_check(Command_Index::CMD13, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift), if (send_command_and_check(Command_Index::CMD13, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() {
@@ -773,7 +765,7 @@ SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) {
if (response & All_R1_Error_Bits) { if (response & All_R1_Error_Bits) {
for (const auto& entry : errorTableR1) { for (const auto& entry : errorTableR1) {
if (response & entry.mask) { if (TEST(response, entry.bit_position)) {
return entry.errorType; return entry.errorType;
} }
} }
@@ -783,23 +775,28 @@ SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::get_command_sent_result() { auto CardDMA::get_command_sent_result() -> SDIO_Error_Type {
volatile uint32_t timeout = 0x00FFFFFFU; constexpr uint32_t MAX_TIMEOUT = 0x00FFFFFFU;
uint32_t timeout = MAX_TIMEOUT;
while ((sdio_.get_flag(Status_Flags::FLAG_CMDSEND) == false) && (timeout != 0U)) { // Wait for command sent flag or timeout
timeout = timeout - 1U; while (!sdio_.get_flag(Status_Flags::FLAG_CMDSEND) && timeout) {
--timeout;
} }
if (timeout == 0U) return SDIO_Error_Type::RESPONSE_TIMEOUT;
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
// Check if timeout occurred
if (timeout == 0U) {
return SDIO_Error_Type::RESPONSE_TIMEOUT;
}
// Clear command flags and return success
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) { auto CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) -> SDIO_Error_Type {
// Wait until one of the relevant flags is set // Wait until one of the relevant flags is set
bool flag_set = sdio_.wait_cmd_flags(); if (!sdio_.wait_cmd_flags()) {
if (!flag_set) {
return SDIO_Error_Type::RESPONSE_TIMEOUT; return SDIO_Error_Type::RESPONSE_TIMEOUT;
} }
@@ -810,56 +807,55 @@ SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index
// If cmd was received, check the index // If cmd was received, check the index
// Responses that dont do an index check will send an invalid cmd index // Responses that dont do an index check will send an invalid cmd index
if (check_index && (index != Command_Index::INVALID)) { if (check_index && (index != Command_Index::INVALID)) {
uint8_t idx = sdio_.get_command_index(); uint8_t received_idx = sdio_.get_command_index();
if (idx != static_cast<uint8_t>(index)) { if (received_idx != static_cast<uint8_t>(index)) {
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
return SDIO_Error_Type::ILLEGAL_COMMAND; return SDIO_Error_Type::ILLEGAL_COMMAND;
} }
} }
// Clear all flags before returning
// Command received successfully
sdio_.clear_multiple_interrupt_flags(clear_command_flags); sdio_.clear_multiple_interrupt_flags(clear_command_flags);
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
// Timeout check // Check for timeout
if (sdio_.get_flag(Status_Flags::FLAG_CMDTMOUT)) { if (sdio_.get_flag(Status_Flags::FLAG_CMDTMOUT)) {
sdio_.clear_flag(Clear_Flags::FLAG_CMDTMOUTC); sdio_.clear_flag(Clear_Flags::FLAG_CMDTMOUTC);
return SDIO_Error_Type::RESPONSE_TIMEOUT; return SDIO_Error_Type::RESPONSE_TIMEOUT;
} }
// CRC check // Check for CRC error if not ignored
if (!ignore_crc) { if (!ignore_crc && sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) {
if (sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) { sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC);
sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC); return SDIO_Error_Type::COMMAND_CRC_ERROR;
return SDIO_Error_Type::COMMAND_CRC_ERROR;
}
} }
// Responses that dont do an index check will send an invalid cmd index // Final index check (redundant with the first check, but keeping for safety)
// This code path should rarely be taken due to the earlier checks
if (check_index && (index != Command_Index::INVALID)) { if (check_index && (index != Command_Index::INVALID)) {
uint8_t idx = sdio_.get_command_index(); uint8_t received_idx = sdio_.get_command_index();
if (idx != static_cast<uint8_t>(index)) { if (received_idx != static_cast<uint8_t>(index)) {
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
return SDIO_Error_Type::ILLEGAL_COMMAND; return SDIO_Error_Type::ILLEGAL_COMMAND;
} }
} }
// Clear all flags before returning // Clear all flags and return success
sdio_.clear_multiple_interrupt_flags(clear_command_flags); sdio_.clear_multiple_interrupt_flags(clear_command_flags);
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) { auto CardDMA::get_r1_result(Command_Index index) -> SDIO_Error_Type {
SDIO_Error_Type result = check_sdio_status(index, true, false); SDIO_Error_Type result = check_sdio_status(index, true, false);
if (result != SDIO_Error_Type::OK) { if (result != SDIO_Error_Type::OK) return result;
return result;
}
// Get the R1 response and check for errors // Get the R1 response and check for errors
uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); uint32_t response = sdio_.get_response(Response_Type::RESPONSE0);
if (response & All_R1_Error_Bits) { if (response & All_R1_Error_Bits) {
for (const auto& entry : errorTableR1) { for (const auto& entry : errorTableR1) {
if (response & entry.mask) { if (TEST(response, entry.bit_position)) {
return entry.errorType; return entry.errorType;
} }
} }
@@ -869,7 +865,7 @@ SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) { auto CardDMA::get_r6_result(Command_Index index, uint16_t* rca) -> SDIO_Error_Type {
SDIO_Error_Type result = check_sdio_status(index, true, false); SDIO_Error_Type result = check_sdio_status(index, true, false);
if (result != SDIO_Error_Type::OK) return result; if (result != SDIO_Error_Type::OK) return result;
@@ -877,7 +873,7 @@ SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) {
if (response & R6_Error_Bits) { if (response & R6_Error_Bits) {
for (const auto& entry : errorTableR6) { for (const auto& entry : errorTableR6) {
if (response & entry.mask) { if (TEST(response, entry.bit_position)) {
return entry.errorType; return entry.errorType;
} }
} }
@@ -888,18 +884,13 @@ SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) {
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
SDIO_Error_Type CardDMA::get_r7_result() { auto CardDMA::get_scr(uint16_t rca, uint32_t* scr) -> SDIO_Error_Type {
return check_sdio_status(Command_Index::INVALID, false, false);
}
SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
uint32_t temp_scr[2] = {0U, 0U}; uint32_t temp_scr[2] = {0U, 0U};
uint32_t index_scr = 0U; uint32_t index_scr = 0U;
uint32_t* src_data = scr;
// CMD16 (SET_BLOCKLEN) // CMD16 (SET_BLOCKLEN)
if (send_command_and_check(Command_Index::CMD16, 8U, Command_Response::RSP_SHORT, if (send_command_and_check(Command_Index::CMD16, 8U, Command_Response::RSP_SHORT,
Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() {
return get_r1_result(cmd); return get_r1_result(cmd);
}) != SDIO_Error_Type::OK) { }) != SDIO_Error_Type::OK) {
return SDIO_Error_Type::CMD16_FAILED; return SDIO_Error_Type::CMD16_FAILED;
@@ -907,7 +898,7 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
// CMD55 (APP_CMD) // CMD55 (APP_CMD)
if (send_command_and_check(Command_Index::CMD55, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift), if (send_command_and_check(Command_Index::CMD55, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() {
return get_r1_result(cmd); return get_r1_result(cmd);
}) != SDIO_Error_Type::OK) { }) != SDIO_Error_Type::OK) {
return SDIO_Error_Type::CMD55_FAILED; return SDIO_Error_Type::CMD55_FAILED;
@@ -919,7 +910,7 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
// ACMD51 (SEND_SCR) // ACMD51 (SEND_SCR)
if (send_command_and_check(Command_Index::ACMD51, 0U, Command_Response::RSP_SHORT, if (send_command_and_check(Command_Index::ACMD51, 0U, Command_Response::RSP_SHORT,
Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() { Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() {
return get_r1_result(cmd); return get_r1_result(cmd);
}) != SDIO_Error_Type::OK) { }) != SDIO_Error_Type::OK) {
return SDIO_Error_Type::ACMD51_FAILED; return SDIO_Error_Type::ACMD51_FAILED;
@@ -928,36 +919,41 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
// Store SCR // Store SCR
while (!sdio_.check_scr_flags()) { while (!sdio_.check_scr_flags()) {
if (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { if (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) {
*(temp_scr + index_scr) = sdio_.read_fifo_word(); temp_scr[index_scr++] = sdio_.read_fifo_word();
++index_scr;
} }
} }
// Check for errors
if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) {
sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC);
return SDIO_Error_Type::DATA_TIMEOUT; return SDIO_Error_Type::DATA_TIMEOUT;
} else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { }
else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) {
sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC);
return SDIO_Error_Type::DATA_CRC_ERROR; return SDIO_Error_Type::DATA_CRC_ERROR;
} else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { }
else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) {
sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); sdio_.clear_flag(Clear_Flags::FLAG_RXOREC);
return SDIO_Error_Type::RX_FIFO_OVERRUN; return SDIO_Error_Type::RX_FIFO_OVERRUN;
} }
sdio_.clear_multiple_interrupt_flags(clear_data_flags); sdio_.clear_multiple_interrupt_flags(clear_data_flags);
constexpr uint32_t Zero_Seven = (0xFFU << 0U); constexpr uint32_t BYTE0_MASK = 0xFFU;
constexpr uint32_t Eight_Fifteen = (0xFFU << 8U); constexpr uint32_t BYTE1_MASK = 0xFF00U;
constexpr uint32_t Sixteen_Twentythree = (0xFFU << 16U); constexpr uint32_t BYTE2_MASK = 0xFF0000U;
constexpr uint32_t TwentyFour_Thirtyone = (0xFFU << 24U); constexpr uint32_t BYTE3_MASK = 0xFF000000U;
// adjust SCR value // Byte-swap the SCR values (convert from big-endian to little-endian)
*src_data = ((temp_scr[1] & Zero_Seven) << 24U) | ((temp_scr[1] & Eight_Fifteen) << 8U) | scr[0] = ((temp_scr[1] & BYTE0_MASK) << 24) |
((temp_scr[1] & Sixteen_Twentythree) >> 8U) | ((temp_scr[1] & TwentyFour_Thirtyone) >> 24U); ((temp_scr[1] & BYTE1_MASK) << 8) |
((temp_scr[1] & BYTE2_MASK) >> 8) |
((temp_scr[1] & BYTE3_MASK) >> 24);
src_data = src_data + 1U; scr[1] = ((temp_scr[0] & BYTE0_MASK) << 24) |
*src_data = ((temp_scr[0] & Zero_Seven) << 24U) | ((temp_scr[0] & Eight_Fifteen) << 8U) | ((temp_scr[0] & BYTE1_MASK) << 8) |
((temp_scr[0] & Sixteen_Twentythree) >> 8U) | ((temp_scr[0] & TwentyFour_Thirtyone) >> 24U); ((temp_scr[0] & BYTE2_MASK) >> 8) |
((temp_scr[0] & BYTE3_MASK) >> 24);
return SDIO_Error_Type::OK; return SDIO_Error_Type::OK;
} }
@@ -965,23 +961,22 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
// DMA for rx/tx is always DMA1 channel 3 // DMA for rx/tx is always DMA1 channel 3
void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) { void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) {
constexpr uint32_t flag_bits = (1U << static_cast<uint32_t>(dma::INTF_Bits::GIF3)); constexpr uint32_t flag_bits = (1U << static_cast<uint32_t>(dma::INTF_Bits::GIF3));
dma_.clear_flags(flag_bits); dma_.clear_flags(flag_bits);
// Disable and reset DMA // Disable and reset DMA
dma_.set_channel_enable(false); dma_.set_channel_enable(false);
dma_.clear_channel(); dma_.clear_channel();
dma_.init({ dma_.init(dma::DMA_Config{
count, .count = count,
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(buf)), .memory_address = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(buf)),
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(sdio_.reg_address(SDIO_Regs::FIFO))), .peripheral_address = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(sdio_.reg_address(SDIO_Regs::FIFO))),
dma::Bit_Width::WIDTH_32BIT, .peripheral_bit_width = dma::Bit_Width::WIDTH_32BIT,
dma::Bit_Width::WIDTH_32BIT, .memory_bit_width = dma::Bit_Width::WIDTH_32BIT,
dma::Increase_Mode::INCREASE_DISABLE, .peripheral_increase = dma::Increase_Mode::INCREASE_DISABLE,
dma::Increase_Mode::INCREASE_ENABLE, .memory_increase = dma::Increase_Mode::INCREASE_ENABLE,
dma::Channel_Priority::MEDIUM_PRIORITY, .channel_priority = dma::Channel_Priority::MEDIUM_PRIORITY,
is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M .direction = is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M
}); });
dma_.set_memory_to_memory_enable(false); dma_.set_memory_to_memory_enable(false);
@@ -995,24 +990,29 @@ void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) {
dma_.set_channel_enable(true); dma_.set_channel_enable(true);
} }
SDIO_Error_Type CardDMA::wait_for_card_ready() { auto CardDMA::wait_for_card_ready() -> SDIO_Error_Type {
volatile uint32_t timeout = 0x00FFFFFFU; constexpr uint32_t MAX_TIMEOUT = 0x00FFFFFFU;
uint32_t timeout = MAX_TIMEOUT;
uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); uint32_t response = sdio_.get_response(Response_Type::RESPONSE0);
while (((response & static_cast<uint32_t>(R1_Status::READY_FOR_DATA)) == 0U) && (timeout != 0U)) { // Poll until card is ready for data or timeout occurs
// Continue to send CMD13 to poll the state of card until buffer empty or timeout while (((response & static_cast<uint32_t>(R1_Status::READY_FOR_DATA)) == 0U) && timeout) {
timeout = timeout - 1U; --timeout;
// CMD13 (SEND_STATUS) // CMD13 (SEND_STATUS)
if (send_command_and_check(Command_Index::CMD13, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift), if (send_command_and_check(Command_Index::CMD13, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() {
return get_r1_result(cmd); return get_r1_result(cmd);
}) != SDIO_Error_Type::OK) { }) != SDIO_Error_Type::OK) {
return SDIO_Error_Type::CMD13_FAILED; return SDIO_Error_Type::CMD13_FAILED;
} }
// Get updated response
response = sdio_.get_response(Response_Type::RESPONSE0); response = sdio_.get_response(Response_Type::RESPONSE0);
} }
return (timeout == 0U) ? SDIO_Error_Type::ERROR : SDIO_Error_Type::OK; // Return error if timeout occurred, otherwise success
return timeout ? SDIO_Error_Type::OK : SDIO_Error_Type::ERROR;
} }
} // namespace sdio } // namespace sdio
+103 -95
View File
@@ -26,76 +26,82 @@ class DMA;
class CardDMA { class CardDMA {
public: public:
static CardDMA& get_instance(); static auto get_instance() -> CardDMA&;
SDIO_Error_Type init(); // Initialization
SDIO_Error_Type card_init(); auto init() -> SDIO_Error_Type;
SDIO_Error_Type begin_startup_procedure(); auto card_init() -> SDIO_Error_Type;
// Startup and shutdown procedures
auto begin_startup_procedure() -> SDIO_Error_Type;
void begin_shutdown_procedure(); void begin_shutdown_procedure();
// Configuration // Configuration
SDIO_Error_Type set_hardware_bus_width(Bus_Width width); auto set_hardware_bus_width(Bus_Width width) -> SDIO_Error_Type;
// Main read/write functions for single and multiblock transfers auto send_bus_width_command(uint32_t width_value) -> SDIO_Error_Type;
SDIO_Error_Type read(uint8_t* buf, uint32_t address, uint32_t count);
SDIO_Error_Type write(uint8_t* buf, uint32_t address, uint32_t count); // Main read/write/erase functions
// DMA transfers auto read(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type;
// Other card functions auto write(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type;
SDIO_Error_Type erase(uint32_t address_start, uint32_t address_end); auto erase(uint32_t address_start, uint32_t address_end) -> SDIO_Error_Type;
// Interrupt handler
void handle_interrupts();
// Card select // Card select
SDIO_Error_Type select_deselect(); auto select_deselect() -> SDIO_Error_Type;
SDIO_Error_Type get_card_interface_status(uint32_t* status); // Status and state
SDIO_Error_Type get_sdcard_status(uint32_t* status); auto get_card_interface_status(uint32_t* status) -> SDIO_Error_Type;
auto get_sdcard_status(uint32_t* status) -> SDIO_Error_Type;
auto get_transfer_state() -> Transfer_State;
auto get_card_state(Card_State* card_state) -> SDIO_Error_Type;
auto check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false) -> SDIO_Error_Type;
void check_dma_complete(); // DMA
SDIO_Error_Type stop_transfer();
Transfer_State get_transfer_state();
uint32_t get_card_capacity() const;
SDIO_Error_Type send_bus_width_command(uint32_t width_value);
SDIO_Error_Type get_card_specific_data(Card_Info* info);
constexpr Block_Size get_data_block_size_index(uint16_t size);
SDIO_Error_Type get_card_state(Card_State* card_state);
SDIO_Error_Type check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false);
// DMA configuration
void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write); void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write);
void check_dma_complete();
// Stop transfer
auto stop_transfer() -> SDIO_Error_Type;
// Card information
auto get_card_specific_data(Card_Info* info) -> SDIO_Error_Type;
constexpr auto get_data_block_size_index(uint16_t size) -> Block_Size;
[[nodiscard]] auto get_card_capacity() const -> uint32_t;
// SDIO configuration // SDIO configuration
void sdio_configure(const SDIO_Config config) { sdio_.init(config); } void sdio_configure(const SDIO_Config config) { sdio_.init(config); }
// Varaible stored parameters // Interrupt handler
SDIO_Error_Type get_scr(uint16_t rca, uint32_t* scr); void handle_interrupts();
SDIO_Error_Type store_cid();
SDIO_Error_Type store_csd();
// Accessor methods // Variable stored parameters
SDIO_Config& get_config() { return config_; } auto get_scr(uint16_t rca, uint32_t* scr) -> SDIO_Error_Type;
dma::DMA& get_dma_instance() { return dma_; } auto store_cid() -> SDIO_Error_Type;
auto store_csd() -> SDIO_Error_Type;
// Inlined accessor methods
auto get_config() -> SDIO_Config& { return config_; }
auto get_dma_instance() -> dma::DMA& { return dma_; }
void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); } void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); }
void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); } void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); }
bool get_is_sdio_rx() { return is_rx_; } auto get_is_sdio_rx() -> bool { return is_rx_; }
void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); } void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); }
void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); } void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); }
void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); } void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); }
Operational_State get_state() { return current_state_; } auto get_state() -> Operational_State { return current_state_; }
void set_state(Operational_State state) { current_state_ = state; } void set_state(Operational_State state) { current_state_ = state; }
void set_transfer_end(bool value) { transfer_end_ = value; }
void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; } void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; }
void set_transfer_end(bool end) { transfer_end_ = end; };
inline SDIO_Error_Type set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) { auto set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) -> SDIO_Error_Type {
sdio_.init({ sdio_.init(SDIO_Config{
desired_clock, .desired_clock = desired_clock,
Clock_Edge::RISING_EDGE, .enable_bypass = false,
wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT, .enable_powersave = low_power,
false, .enable_hwclock = false,
low_power, .clock_edge = Clock_Edge::RISING_EDGE,
false .width = wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT
}); });
sync_domains(); sync_domains();
desired_clock_ = desired_clock; desired_clock_ = desired_clock;
@@ -107,19 +113,17 @@ private:
// Prevent copying or assigning // Prevent copying or assigning
CardDMA(const CardDMA&) = delete; CardDMA(const CardDMA&) = delete;
CardDMA& operator=(const CardDMA&) = delete; auto operator=(const CardDMA&) -> CardDMA& = delete;
// Helper function // Helper function
SDIO_Error_Type wait_for_card_ready(); auto wait_for_card_ready() -> SDIO_Error_Type;
// Member variables // Member variables
alignas(4) uint32_t sdcard_csd_[4]; alignas(4) uint32_t sdcard_csd_[4];
alignas(4) uint32_t sdcard_cid_[4]; alignas(4) uint32_t sdcard_cid_[4];
alignas(4) uint32_t sdcard_scr_[2]; alignas(4) uint32_t sdcard_scr_[2];
uint32_t desired_clock_; uint32_t desired_clock_;
uint32_t stop_condition_;
uint32_t total_bytes_; uint32_t total_bytes_;
uint32_t count_;
SDIO& sdio_; SDIO& sdio_;
SDIO_Config& config_; SDIO_Config& config_;
const dma::DMA_Base dmaBase_; const dma::DMA_Base dmaBase_;
@@ -129,66 +133,70 @@ private:
SDIO_Error_Type transfer_error_; SDIO_Error_Type transfer_error_;
Interface_Version interface_version_; Interface_Version interface_version_;
Card_Type card_type_; Card_Type card_type_;
volatile bool transfer_end_; Operational_State current_state_;
volatile bool is_rx_; bool transfer_end_;
volatile bool multiblock_; bool multiblock_;
volatile Operational_State current_state_; bool is_rx_;
// Private helper methods // Private helper methods
SDIO_Error_Type validate_voltage(); auto validate_voltage() -> SDIO_Error_Type;
SDIO_Error_Type get_r1_result(Command_Index index); auto get_command_sent_result() -> SDIO_Error_Type;
//SDIO_Error_Type get_r2_r3_result(); auto get_r1_result(Command_Index index) -> SDIO_Error_Type;
SDIO_Error_Type get_r6_result(Command_Index index, uint16_t* rca); auto get_r6_result(Command_Index index, uint16_t* rca) -> SDIO_Error_Type;
SDIO_Error_Type get_r7_result(); auto get_r7_result() -> SDIO_Error_Type { return check_sdio_status(Command_Index::INVALID, false, false); };
//SDIO_Error_Type get_r1_error_type(uint32_t response); void sync_domains() { delayMicroseconds(8); }
SDIO_Error_Type get_command_sent_result();
inline void sync_domains() { auto validate_transfer_params(uint32_t* buf, uint16_t size) -> bool {
delayMicroseconds(8);
}
inline bool validate_transfer_params(uint32_t* buf, uint16_t size) {
if (buf == nullptr) return false; if (buf == nullptr) return false;
// Size must be > 0, <= 2048 and power of 2 // Size must be > 0, <= 2048 and power of 2
if ((size == 0U) || (size > 2048U) || (size & (size - 1U))) { return size > 0U && size <= 2048U && !(size & (size - 1U));
return false;
}
return true;
} }
void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
info->csd.device_size = (static_cast<uint32_t>(csd_bytes[6] & 0x03U) << 10U) | const uint32_t device_size = ((csd_bytes[6] & 0x3U) << 10) |
(static_cast<uint32_t>(csd_bytes[7]) << 2U) | (csd_bytes[7] << 2) |
(static_cast<uint32_t>((csd_bytes[8] & 0xC0U) >> 6U)); ((csd_bytes[8] >> 6) & 0x3U);
info->csd.device_size_multiplier = static_cast<uint8_t>((csd_bytes[9] & 0x03U) << 1U |
(csd_bytes[10] & 0x80U) >> 7U);
info->block_size = static_cast<uint32_t>(1 << info->csd.read_block_length); const uint8_t device_size_multiplier = ((csd_bytes[9] & 0x3U) << 1) |
info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) * ((csd_bytes[10] >> 7) & 0x1U);
(1U << (info->csd.device_size_multiplier + 2U)) *
info->block_size); // Store calculated values
info->csd.device_size = device_size;
info->csd.device_size_multiplier = device_size_multiplier;
// Calculate block size and capacity
info->block_size = 1U << info->csd.read_block_length;
info->capacity = (device_size + 1U) *
(1U << (device_size_multiplier + 2U)) *
info->block_size;
} }
void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
info->csd.device_size = static_cast<uint32_t>((csd_bytes[7] & 0x3FU) << 16U) | info->csd.device_size = static_cast<uint32_t>((csd_bytes[7] & 0x3FU) << 16) |
static_cast<uint32_t>((csd_bytes[8]) << 8U) | static_cast<uint32_t>((csd_bytes[8]) << 8) |
static_cast<uint32_t>(csd_bytes[9]); static_cast<uint32_t>(csd_bytes[9]);
// Set block size and calculate capacity
info->block_size = BLOCK_SIZE; info->block_size = BLOCK_SIZE;
info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) * info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) *
BLOCK_SIZE * KILOBYTE); BLOCK_SIZE * KILOBYTE);
} }
void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) { void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) {
info->csd.sector_size = static_cast<uint8_t>(((csd_bytes[9] & 0x3FU) << 1U) | // Calculate sector_size
(csd_bytes[10] & 0x80U) >> 7U); info->csd.sector_size = static_cast<uint8_t>(((csd_bytes[9] & 0x3FU) << 1) |
info->csd.speed_factor = static_cast<uint8_t>((csd_bytes[11] & 0x1CU) >> 2U); (csd_bytes[10] & 0x80U) >> 7);
info->csd.write_block_length = static_cast<uint8_t>(((csd_bytes[11] & 0x03U) << 2U) |
((csd_bytes[12] & 0xC0U) >> 6U)); // Calculate speed_factor and write_block_length
info->csd.checksum = static_cast<uint8_t>((csd_bytes[15] & 0xFEU) >> 1U); info->csd.speed_factor = static_cast<uint8_t>((csd_bytes[11] & 0x1CU) >> 2);
info->csd.write_block_length = static_cast<uint8_t>(((csd_bytes[11] & 0x3U) << 2) |
((csd_bytes[12] & 0xC0U) >> 6));
// Calculate checksum
info->csd.checksum = static_cast<uint8_t>((csd_bytes[15] & 0xFEU) >> 1);
} }
inline void disable_all_interrupts() { void disable_all_interrupts() {
sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false); sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false);
sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false); sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false);
sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false); sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false);
@@ -200,8 +208,8 @@ private:
} }
template <typename CheckFunc> template <typename CheckFunc>
inline SDIO_Error_Type send_command_and_check(Command_Index command, uint32_t argument, auto send_command_and_check(Command_Index command, uint32_t argument,
Command_Response response, Wait_Type type, CheckFunc check_result) { Command_Response response, Wait_Type type, CheckFunc check_result) -> SDIO_Error_Type {
sdio_.set_command_state_machine(command, argument, response, type); sdio_.set_command_state_machine(command, argument, response, type);
sync_domains(); sync_domains();
sdio_.set_command_state_machine_enable(true); sdio_.set_command_state_machine_enable(true);
+1 -1
View File
@@ -47,7 +47,7 @@ inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES;
Card_State cardState = Card_State::READY; Card_State cardState = Card_State::READY;
bool SDIO_SetBusWidth(Bus_Width width) { auto SDIO_SetBusWidth(Bus_Width width) -> bool {
return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK); return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK);
} }
+1 -1
View File
@@ -32,5 +32,5 @@
#define SDIO_CMD_PIN PD2 #define SDIO_CMD_PIN PD2
void sdio_mfl_init(); void sdio_mfl_init();
bool SDIO_SetBusWidth(sdio::Bus_Width width); auto SDIO_SetBusWidth(sdio::Bus_Width width) -> bool;
void DMA1_IRQHandler(dma::DMA_Channel channel); void DMA1_IRQHandler(dma::DMA_Channel channel);
+1 -1
View File
@@ -26,4 +26,4 @@
#define TS_TYPICAL_SLOPE 4.5 #define TS_TYPICAL_SLOPE 4.5
// TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable) // TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable)
#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP) #define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) * 0.001f)) / ((TS_TYPICAL_SLOPE) * 0.001f) + TS_TYPICAL_TEMP)
+8 -1
View File
@@ -92,7 +92,9 @@ bool is_temp_timer_initialized = false;
// Retrieves the clock frequency of the stepper timer // Retrieves the clock frequency of the stepper timer
uint32_t GetStepperTimerClkFreq() { uint32_t GetStepperTimerClkFreq() {
return Step_Timer.getTimerClockFrequency(); // Cache result
static uint32_t clkFreq = Step_Timer.getTimerClockFrequency();
return clkFreq;
} }
/** /**
@@ -191,10 +193,12 @@ void SetTimerInterruptPriorities() {
// Detect timer conflicts // Detect timer conflicts
// ------------------------ // ------------------------
TERN_(HAS_TMC_SW_SERIAL, static constexpr timer::TIMER_Base timer_serial[] = {static_cast<timer::TIMER_Base>(TIMER_SERIAL)});
TERN_(SPEAKER, static constexpr timer::TIMER_Base timer_tone[] = {static_cast<timer::TIMER_Base>(TIMER_TONE)}); TERN_(SPEAKER, static constexpr timer::TIMER_Base timer_tone[] = {static_cast<timer::TIMER_Base>(TIMER_TONE)});
TERN_(HAS_SERVOS, static constexpr timer::TIMER_Base timer_servo[] = {static_cast<timer::TIMER_Base>(TIMER_SERVO)}); TERN_(HAS_SERVOS, static constexpr timer::TIMER_Base timer_servo[] = {static_cast<timer::TIMER_Base>(TIMER_SERVO)});
enum TimerPurpose { enum TimerPurpose {
PURPOSE_SERIAL,
PURPOSE_TONE, PURPOSE_TONE,
PURPOSE_SERVO, PURPOSE_SERVO,
PURPOSE_STEP, PURPOSE_STEP,
@@ -205,6 +209,9 @@ enum TimerPurpose {
// Includes the timer purpose to ease debugging when evaluating at build-time // Includes the timer purpose to ease debugging when evaluating at build-time
// This cannot yet account for timers used for PWM output, such as for fans // This cannot yet account for timers used for PWM output, such as for fans
static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = { static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = {
#if HAS_TMC_SW_SERIAL
{ PURPOSE_SERIAL, timer_base_to_index(timer_serial[0]) }, // Set in variant.h
#endif
#if ENABLED(SPEAKER) #if ENABLED(SPEAKER)
{ PURPOSE_TONE, timer_base_to_index(timer_tone[0]) }, // Set in variant.h { PURPOSE_TONE, timer_base_to_index(timer_tone[0]) }, // Set in variant.h
#endif #endif
+14 -13
View File
@@ -29,10 +29,6 @@
// Defines // Defines
// ------------------------ // ------------------------
// Timer configuration constants
#define STEPPER_TIMER_RATE 2000000
#define TEMP_TIMER_FREQUENCY 1000
// Timer instance definitions // Timer instance definitions
#define MF_TIMER_STEP 3 #define MF_TIMER_STEP 3
#define MF_TIMER_TEMP 1 #define MF_TIMER_TEMP 1
@@ -43,12 +39,17 @@
extern uint32_t GetStepperTimerClkFreq(); extern uint32_t GetStepperTimerClkFreq();
// Timer configuration constants
#define STEPPER_TIMER_RATE 2000000
#define TEMP_TIMER_FREQUENCY 1000
// Timer prescaler calculations // Timer prescaler calculations
#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30 #define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // (MHz) Stepper Timer ticks per µs
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
// Timer interrupt priorities // Timer interrupt priorities
#define STEP_TIMER_IRQ_PRIORITY 2 #define STEP_TIMER_IRQ_PRIORITY 2
@@ -57,7 +58,7 @@ extern uint32_t GetStepperTimerClkFreq();
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
extern void Step_Handler(); extern void Step_Handler();
@@ -89,7 +90,7 @@ static inline constexpr struct {timer::TIMER_Base base; uint8_t timer_number;} b
}; };
// Converts a timer base to an integer timer index. // Converts a timer base to an integer timer index.
constexpr int timer_base_to_index(timer::TIMER_Base base) { constexpr auto timer_base_to_index(timer::TIMER_Base base) -> int {
for (const auto& timer : base_to_index) { for (const auto& timer : base_to_index) {
if (timer.base == base) { if (timer.base == base) {
return static_cast<int>(timer.timer_number); return static_cast<int>(timer.timer_number);
@@ -131,7 +132,7 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_number)
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const hal_timer_t value) { FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const hal_timer_t value) {
if (!HAL_timer_initialized(timer_number)) return; if (!HAL_timer_initialized(timer_number)) return;
const uint32_t new_value = static_cast<uint32_t>(value + 1U); const auto new_value = static_cast<uint32_t>(value + 1U);
GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer;
if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) { if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) {
@@ -141,5 +142,5 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const
} }
} }
#define HAL_timer_isr_prologue(T) NOOP inline void HAL_timer_isr_prologue(const uint8_t) {}
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
+1 -1
View File
@@ -67,7 +67,7 @@ public:
static void delay_ms(const int ms); static void delay_ms(const int ms);
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask(); static void idletask();
// Reset // Reset
+3 -3
View File
@@ -37,9 +37,9 @@ public:
MarlinServo(); MarlinServo();
/** /**
* @brief attach the pin to the servo, set pin mode, return channel number * @brief attach the pin to the servo, set pin mode, return channel number
* @param pin pin to attach to * @param pin pin to attach to
* @return channel number, -1 if failed * @return channel number, -1 if failed
*/ */
int8_t attach(const pin_t apin); int8_t attach(const pin_t apin);
+1 -1
View File
@@ -39,7 +39,7 @@ void eeprom_init() {
void eeprom_write_byte(uint8_t *pos, unsigned char value) { void eeprom_write_byte(uint8_t *pos, unsigned char value) {
const unsigned eeprom_address = (unsigned)pos; const unsigned eeprom_address = (unsigned)pos;
return BL24CXX::writeOneByte(eeprom_address, value); BL24CXX::writeOneByte(eeprom_address, value);
} }
uint8_t eeprom_read_byte(uint8_t *pos) { uint8_t eeprom_read_byte(uint8_t *pos) {
+1 -1
View File
@@ -53,7 +53,7 @@ bool PersistentStore::access_start() {
int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE); int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE);
if (bytes_read < 0) return false; if (bytes_read < 0) return false;
for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++) for (; bytes_read < long(MARLIN_EEPROM_SIZE); bytes_read++)
HAL_eeprom_data[bytes_read] = 0xFF; HAL_eeprom_data[bytes_read] = 0xFF;
file.close(); file.close();
+1 -1
View File
@@ -83,7 +83,7 @@
#error "POSTMORTEM_DEBUGGING requires CORE_DISABLE_FAULT_HANDLER to be set." #error "POSTMORTEM_DEBUGGING requires CORE_DISABLE_FAULT_HANDLER to be set."
#endif #endif
#if defined(PANIC_ENABLE) #ifdef PANIC_ENABLE
#if defined(PANIC_USART1_TX_PIN) || defined(PANIC_USART2_TX_PIN) || defined(PANIC_USART3_TX_PIN) || defined(PANIC_USART3_TX_PIN) #if defined(PANIC_USART1_TX_PIN) || defined(PANIC_USART2_TX_PIN) || defined(PANIC_USART3_TX_PIN) || defined(PANIC_USART3_TX_PIN)
#error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN." #error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN."
#endif #endif
+1 -1
View File
@@ -171,7 +171,7 @@ void core_hook_sysclock_init() {
panic("HRC is not 16 MHz"); panic("HRC is not 16 MHz");
} }
#if defined(BOARD_XTAL_FREQUENCY) #ifdef BOARD_XTAL_FREQUENCY
#warning "No valid XTAL frequency defined, falling back to HRC." #warning "No valid XTAL frequency defined, falling back to HRC."
#endif #endif
+8 -8
View File
@@ -35,19 +35,19 @@ Timer0 temp_timer(&TIMER02A_config, &Temp_Handler);
*/ */
Timer0 step_timer(&TIMER02B_config, &Step_Handler); Timer0 step_timer(&TIMER02B_config, &Step_Handler);
void HAL_timer_start(const timer_channel_t timer_num, const uint32_t frequency) { void HAL_timer_start(const timer_channel_t timer_ch, const uint32_t frequency) {
if (timer_num == TEMP_TIMER_NUM) { if (timer_ch == MF_TIMER_TEMP) {
CORE_DEBUG_PRINTF("HAL_timer_start: temp timer, f=%ld\n", long(frequency)); CORE_DEBUG_PRINTF("HAL_timer_start: temp timer, f=%ld\n", long(frequency));
timer_num->start(frequency, TEMP_TIMER_PRESCALE); timer_ch->start(frequency, TEMP_TIMER_PRESCALE);
timer_num->setCallbackPriority(TEMP_TIMER_PRIORITY); timer_ch->setCallbackPriority(TEMP_TIMER_PRIORITY);
} }
else if (timer_num == STEP_TIMER_NUM) { else if (timer_ch == MF_TIMER_STEP) {
CORE_DEBUG_PRINTF("HAL_timer_start: step timer, f=%ld\n", long(frequency)); CORE_DEBUG_PRINTF("HAL_timer_start: step timer, f=%ld\n", long(frequency));
timer_num->start(frequency, STEPPER_TIMER_PRESCALE); timer_ch->start(frequency, STEPPER_TIMER_PRESCALE);
timer_num->setCallbackPriority(STEP_TIMER_PRIORITY); timer_ch->setCallbackPriority(STEP_TIMER_PRIORITY);
} }
else { else {
CORE_ASSERT_FAIL("HAL_timer_start: invalid timer_num") CORE_ASSERT_FAIL("HAL_timer_start: invalid timer_ch")
} }
} }
+30 -37
View File
@@ -27,7 +27,7 @@
// //
typedef Timer0 *timer_channel_t; typedef Timer0 *timer_channel_t;
typedef uint16_t hal_timer_t; typedef uint16_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFU
// //
// Timer instances // Timer instances
@@ -49,80 +49,73 @@ extern Timer0 step_timer;
* See https://github.com/MarlinFirmware/Marlin/pull/27099 for more information. * See https://github.com/MarlinFirmware/Marlin/pull/27099 for more information.
* *
* NOTE: If the 'constexpr' requirement is ever lifted, TIMER0_BASE_FREQUENCY could * NOTE: If the 'constexpr' requirement is ever lifted, TIMER0_BASE_FREQUENCY could
* be used instead. Tho this would probably not make any noticable difference. * be used instead. Tho this would probably not make any noticeable difference.
*/ */
#define HAL_TIMER_RATE F_PCLK1 #define HAL_TIMER_RATE F_PCLK1
// Temperature timer // Temperature timer
#define TEMP_TIMER_NUM (&temp_timer) #define MF_TIMER_TEMP (&temp_timer)
#define TEMP_TIMER_PRIORITY DDL_IRQ_PRIORITY_02 #define TEMP_TIMER_PRIORITY DDL_IRQ_PRIORITY_02
#define TEMP_TIMER_PRESCALE 16UL // 12.5MHz #define TEMP_TIMER_PRESCALE 16UL // 12.5MHz
#define TEMP_TIMER_RATE 1000 // 1kHz #define TEMP_TIMER_RATE 1000 // 1kHz
#define TEMP_TIMER_FREQUENCY TEMP_TIMER_RATE // 1kHz also #define TEMP_TIMER_FREQUENCY TEMP_TIMER_RATE // 1kHz also
// Stepper timer // Stepper timer
#define STEP_TIMER_NUM (&step_timer) #define MF_TIMER_STEP (&step_timer)
#define STEP_TIMER_PRIORITY DDL_IRQ_PRIORITY_00 // Top priority, nothing else uses it #define STEP_TIMER_PRIORITY DDL_IRQ_PRIORITY_00 // Top priority, nothing else uses it
#define STEPPER_TIMER_PRESCALE 16UL // 12.5MHz #define STEPPER_TIMER_PRESCALE 16UL // 12.5MHz
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 50MHz / 16 = 3.125MHz #define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 50MHz / 16 = 3.125MHz
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000UL) // Integer 3 #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // Integer 3
// Pulse timer (== stepper timer) // Pulse timer (== stepper timer)
#define PULSE_TIMER_NUM STEP_TIMER_NUM #define MF_TIMER_PULSE MF_TIMER_STEP
#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
//
// Channel aliases
//
#define MF_TIMER_TEMP TEMP_TIMER_NUM
#define MF_TIMER_STEP STEP_TIMER_NUM
#define MF_TIMER_PULSE PULSE_TIMER_NUM
// //
// HAL functions // HAL functions
// //
void HAL_timer_start(const timer_channel_t timer_num, const uint32_t frequency); void HAL_timer_start(const timer_channel_t timer_ch, const uint32_t frequency);
// Inlined since they are somewhat critical // Inlined since they are somewhat critical
#define MARLIN_HAL_TIMER_INLINE_ATTR __attribute__((always_inline)) inline #define MARLIN_HAL_TIMER_INLINE_ATTR __attribute__((always_inline)) inline
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_enable_interrupt(const timer_channel_t timer_num) { MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_enable_interrupt(const timer_channel_t timer_ch) {
timer_num->resume(); timer_ch->resume();
} }
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_disable_interrupt(const timer_channel_t timer_num) { MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_disable_interrupt(const timer_channel_t timer_ch) {
timer_num->pause(); timer_ch->pause();
} }
MARLIN_HAL_TIMER_INLINE_ATTR bool HAL_timer_interrupt_enabled(const timer_channel_t timer_num) { MARLIN_HAL_TIMER_INLINE_ATTR bool HAL_timer_interrupt_enabled(const timer_channel_t timer_ch) {
return timer_num->isPaused(); return timer_ch->isPaused();
} }
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_set_compare(const timer_channel_t timer_num, const hal_timer_t compare) { MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_set_compare(const timer_channel_t timer_ch, const hal_timer_t compare) {
timer_num->setCompareValue(compare); timer_ch->setCompareValue(compare);
} }
MARLIN_HAL_TIMER_INLINE_ATTR hal_timer_t HAL_timer_get_count(const timer_channel_t timer_num) { MARLIN_HAL_TIMER_INLINE_ATTR hal_timer_t HAL_timer_get_count(const timer_channel_t timer_ch) {
return timer_num->getCount(); return timer_ch->getCount();
} }
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_isr_prologue(const timer_channel_t timer_num) { MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_isr_prologue(const timer_channel_t timer_ch) {
timer_num->clearInterruptFlag(); timer_ch->clearInterruptFlag();
} }
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_isr_epilogue(const timer_channel_t timer_num) {} inline void HAL_timer_isr_epilogue(const timer_channel_t) {}
// //
// HAL function aliases // HAL function aliases
// //
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM); #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP);
// //
// HAL ISR callbacks // HAL ISR callbacks
@@ -131,8 +124,8 @@ void Step_Handler();
void Temp_Handler(); void Temp_Handler();
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() void Step_Handler() #define HAL_STEP_TIMER_ISR() void Step_Handler()
#endif #endif
#ifndef HAL_TEMP_TIMER_ISR #ifndef HAL_TEMP_TIMER_ISR
#define HAL_TEMP_TIMER_ISR() void Temp_Handler() #define HAL_TEMP_TIMER_ISR() void Temp_Handler()
#endif #endif
+1 -1
View File
@@ -126,7 +126,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask() {} static void idletask() {}
// Reset // Reset
+1 -1
View File
@@ -45,7 +45,7 @@ bool PersistentStore::access_start() {
fseek(eeprom_file, 0L, SEEK_END); fseek(eeprom_file, 0L, SEEK_END);
std::size_t file_size = ftell(eeprom_file); std::size_t file_size = ftell(eeprom_file);
if (file_size < MARLIN_EEPROM_SIZE) { if (file_size < long(MARLIN_EEPROM_SIZE)) {
memset(buffer + file_size, eeprom_erase_value, MARLIN_EEPROM_SIZE - file_size); memset(buffer + file_size, eeprom_erase_value, MARLIN_EEPROM_SIZE - file_size);
} }
else { else {
+14 -14
View File
@@ -34,7 +34,7 @@
#define FORCE_INLINE __attribute__((always_inline)) inline #define FORCE_INLINE __attribute__((always_inline)) inline
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals #define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
@@ -49,21 +49,21 @@ typedef uint32_t hal_timer_t;
#endif #endif
#define TEMP_TIMER_RATE 1000000 #define TEMP_TIMER_RATE 1000000
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR 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 // (Hz) Frequency of Stepper Timer ISR (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) / 1000000UL) // (MHz) 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 // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
@@ -93,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) NOOP inline void HAL_timer_isr_prologue(const uint8_t) {}
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
+1 -1
View File
@@ -160,7 +160,7 @@ public:
static bool watchdog_timed_out() IF_DISABLED(USE_WATCHDOG, { return false; }); static bool watchdog_timed_out() IF_DISABLED(USE_WATCHDOG, { return false; });
static void watchdog_clear_timeout_flag() IF_DISABLED(USE_WATCHDOG, {}); static void watchdog_clear_timeout_flag() IF_DISABLED(USE_WATCHDOG, {});
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask(); static void idletask();
// Reset // Reset
+2
View File
@@ -49,6 +49,8 @@
#include <Servo.h> #include <Servo.h>
#include "../../MarlinCore.h"
class libServo: public Servo { class libServo: public Servo {
public: public:
void move(const int value) { void move(const int value) {
@@ -74,7 +74,7 @@ bool PersistentStore::access_start() {
if (status == CMD_SUCCESS) { if (status == CMD_SUCCESS) {
// sector is blank so nothing stored yet // sector is blank so nothing stored yet
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EEPROM_ERASE; for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = EEPROM_ERASE;
current_slot = EEPROM_SLOTS; current_slot = EEPROM_SLOTS;
} }
else { else {
@@ -82,7 +82,7 @@ bool PersistentStore::access_start() {
current_slot = first_nblank_loc / (MARLIN_EEPROM_SIZE); current_slot = first_nblank_loc / (MARLIN_EEPROM_SIZE);
uint8_t *eeprom_data = SLOT_ADDRESS(EEPROM_SECTOR, current_slot); uint8_t *eeprom_data = SLOT_ADDRESS(EEPROM_SECTOR, current_slot);
// load current settings // load current settings
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = eeprom_data[i];
} }
eeprom_dirty = false; eeprom_dirty = false;
@@ -29,6 +29,6 @@
// LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785) // LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785)
// TODO: Which other boards are incompatible? // TODO: Which other boards are incompatible?
#if defined(MCU_LPC1768) && ENABLED(FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0 #if ALL(MCU_LPC1768, FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
#define PRINTCOUNTER_SYNC #define PRINTCOUNTER_SYNC
#endif #endif
+15 -15
View File
@@ -57,9 +57,9 @@
#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T) #define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T)
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
#define HAL_TIMER_RATE ((F_CPU) / 4) // frequency of timers peripherals #define HAL_TIMER_RATE ((F_CPU) / 4) // (Hz) Frequency of timers peripherals
#ifndef MF_TIMER_STEP #ifndef MF_TIMER_STEP
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define MF_TIMER_STEP 0 // Timer Index for Stepper
@@ -74,22 +74,22 @@ typedef uint32_t hal_timer_t;
#define MF_TIMER_PWM 3 // Timer Index for PWM #define MF_TIMER_PWM 3 // Timer Index for PWM
#endif #endif
#define TEMP_TIMER_RATE 1000000 #define TEMP_TIMER_RATE 1000000 // 1MHz
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR 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 // (Hz) 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) / 1000000UL) // (MHz) 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 // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
@@ -171,4 +171,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
} }
} }
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
@@ -27,7 +27,7 @@
* *
* Couldn't just call exact copies because the overhead killed the LCD update speed * Couldn't just call exact copies because the overhead killed the LCD update speed
* With an intermediate level the softspi was running in the 10-20kHz range which * With an intermediate level the softspi was running in the 10-20kHz range which
* resulted in using about about 25% of the CPU's time. * resulted in using about 25% of the CPU's time.
*/ */
#ifdef TARGET_LPC1768 #ifdef TARGET_LPC1768
@@ -28,7 +28,7 @@
* *
* Couldn't just call exact copies because the overhead killed the LCD update speed * Couldn't just call exact copies because the overhead killed the LCD update speed
* With an intermediate level the softspi was running in the 10-20kHz range which * With an intermediate level the softspi was running in the 10-20kHz range which
* resulted in using about about 25% of the CPU's time. * resulted in using about 25% of the CPU's time.
*/ */
void u8g_SetPinOutput(uint8_t internal_pin_number); void u8g_SetPinOutput(uint8_t internal_pin_number);
+13 -6
View File
@@ -54,18 +54,25 @@ if pioutil.is_pio_build():
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 vol ' + 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: else:
if target_drive in volume_info and not target_file_found: # set upload if not found target file yet if target_drive in volume_info: # set upload
target_drive_found = True
upload_disk = PureWindowsPath(final_drive_name) upload_disk = PureWindowsPath(final_drive_name)
if target_filename in volume_info: target_drive_found = True
if not target_file_found: break
try:
dir_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
except Exception as e:
print ('error:{}'.format(e))
continue
else:
if target_filename in dir_info:
upload_disk = PureWindowsPath(final_drive_name) upload_disk = PureWindowsPath(final_drive_name)
target_file_found = True target_file_found = True
break
elif current_OS == 'Linux': elif current_OS == 'Linux':
# #
+1 -1
View File
@@ -197,7 +197,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask(); static void idletask();
// Reset // Reset
+2
View File
@@ -28,6 +28,8 @@
#include "../shared/Marduino.h" #include "../shared/Marduino.h"
#include <pinmapping.h> #include <pinmapping.h>
#define NO_COMPILE_TIME_PWM
#define SET_DIR_INPUT(IO) Gpio::setDir(IO, 1) #define SET_DIR_INPUT(IO) Gpio::setDir(IO, 1)
#define SET_DIR_OUTPUT(IO) Gpio::setDir(IO, 0) #define SET_DIR_OUTPUT(IO) Gpio::setDir(IO, 0)
+14 -14
View File
@@ -34,7 +34,7 @@
#define FORCE_INLINE __attribute__((always_inline)) inline #define FORCE_INLINE __attribute__((always_inline)) inline
typedef uint64_t hal_timer_t; typedef uint64_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals #define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
@@ -52,22 +52,22 @@ typedef uint64_t hal_timer_t;
#endif #endif
#define SYSTICK_TIMER_FREQUENCY 1000 #define SYSTICK_TIMER_FREQUENCY 1000
#define TEMP_TIMER_RATE 1000000 #define TEMP_TIMER_RATE 1'000'000 // (Hz) Temperature Timer count rate
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR call 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 // (Hz) 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) / 1'000'000) // (MHz) 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 // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
@@ -88,5 +88,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) NOOP inline void HAL_timer_isr_prologue(const uint8_t) {}
#define HAL_timer_isr_epilogue(T) NOOP inline void HAL_timer_isr_epilogue(const uint8_t) {}
@@ -27,7 +27,7 @@
* *
* Couldn't just call exact copies because the overhead killed the LCD update speed * Couldn't just call exact copies because the overhead killed the LCD update speed
* With an intermediate level the softspi was running in the 10-20kHz range which * With an intermediate level the softspi was running in the 10-20kHz range which
* resulted in using about about 25% of the CPU's time. * resulted in using about 25% of the CPU's time.
*/ */
#ifdef __PLAT_NATIVE_SIM__ #ifdef __PLAT_NATIVE_SIM__
@@ -28,7 +28,7 @@
* *
* Couldn't just call exact copies because the overhead killed the LCD update speed * Couldn't just call exact copies because the overhead killed the LCD update speed
* With an intermediate level the softspi was running in the 10-20kHz range which * With an intermediate level the softspi was running in the 10-20kHz range which
* resulted in using about about 25% of the CPU's time. * resulted in using about 25% of the CPU's time.
*/ */
#ifdef __cplusplus #ifdef __cplusplus
@@ -71,13 +71,13 @@ static uint8_t SPI_speed = 0;
static uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) { static uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) {
for (uint8_t i = 0; i < 8; i++) { for (uint8_t i = 0; i < 8; i++) {
WRITE_PIN(mosi_pin, !!(b & 0x80)); WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, LOW, HIGH));
DELAY_CYCLES(SPI_SPEED); DELAY_CYCLES(SPI_SPEED);
WRITE_PIN(sck_pin, HIGH); WRITE_PIN(mosi_pin, !!(b & 0x80));
DELAY_CYCLES(SPI_SPEED); DELAY_CYCLES(SPI_SPEED);
b <<= 1; b <<= 1;
if (miso_pin >= 0 && READ_PIN(miso_pin)) b |= 1; if (miso_pin >= 0 && READ_PIN(miso_pin)) b |= 1;
WRITE_PIN(sck_pin, LOW); WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, HIGH, LOW));
DELAY_CYCLES(SPI_SPEED); DELAY_CYCLES(SPI_SPEED);
} }
return b; return b;
@@ -85,7 +85,7 @@ static uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck
static uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) { static uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) {
WRITE_PIN(mosi_pin, HIGH); WRITE_PIN(mosi_pin, HIGH);
WRITE_PIN(sck_pin, LOW); WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, HIGH, LOW));
return spiRate; return spiRate;
} }
@@ -93,11 +93,11 @@ static void u8g_com_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
static uint8_t rs_last_state = 255; static uint8_t rs_last_state = 255;
if (rs != rs_last_state) { if (rs != rs_last_state) {
// Transfer Data (FA) or Command (F8) // Transfer Data (FA) or Command (F8)
swSpiTransfer(rs ? 0x0FA : 0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); swSpiTransfer(rs ? 0xFA : 0xF8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
rs_last_state = rs; rs_last_state = rs;
DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe
} }
swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); swSpiTransfer(val & 0xF0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
} }
@@ -169,5 +169,32 @@ uint8_t u8g_com_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
} }
#endif #endif
#if ENABLED(LIGHTWEIGHT_UI)
#define ST7920_CS() { WRITE(LCD_PINS_RS, HIGH); }
#define ST7920_NCS() { WRITE(LCD_PINS_RS, LOW); }
#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); }
#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); }
#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); }
#define ST7920_DAT(V) !!((V) & 0x80)
#define ST7920_SND_BIT(...) do{ \
WRITE(LCD_PINS_D4, LOW); \
WRITE(LCD_PINS_EN, ST7920_DAT(val)); \
WRITE(LCD_PINS_D4, HIGH); \
val <<= 1; }while(0);
void ST7920_SWSPI_SND_8BIT(uint8_t val) {
REPEAT(8, ST7920_SND_BIT);
}
void ST7920_cs() { ST7920_CS(); }
void ST7920_ncs() { ST7920_NCS(); }
void ST7920_set_cmd() { ST7920_SET_CMD(); }
void ST7920_set_dat() { ST7920_SET_DAT(); }
void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); }
#endif // LIGHTWEIGHT_UI
#endif // IS_U8GLIB_ST7920 #endif // IS_U8GLIB_ST7920
#endif // __PLAT_NATIVE_SIM__ #endif // __PLAT_NATIVE_SIM__
@@ -127,7 +127,7 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck
static uint8_t SPI_speed = 0; static uint8_t SPI_speed = 0;
static uint8_t swSpiInit(const uint8_t spi_speed, const uint8_t clk_pin, const uint8_t mosi_pin) { static uint8_t swSpiInit(const uint8_t spi_speed, const uint8_t clk_pin, const uint8_t mosi_pin) {
return spi_speed; return spi_speed;
} }
static void u8g_sw_spi_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { static void u8g_sw_spi_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) {
+148 -31
View File
@@ -32,17 +32,123 @@
extern "C" { extern "C" {
#include "pico/bootrom.h" #include "pico/bootrom.h"
#include "hardware/watchdog.h" #include "hardware/watchdog.h"
#include "pico/multicore.h"
#include "hardware/adc.h"
#include "pico/time.h"
} }
#if HAS_SD_HOST_DRIVE #if HAS_SD_HOST_DRIVE
#include "msc_sd.h" #include "msc_sd.h"
#include "usbd_cdc_if.h"
#endif #endif
// Core 1 watchdog configuration
#define CORE1_MAX_RESETS 5 // Maximum number of Core 1 resets before halting system
// ------------------------ // ------------------------
// Public Variables // Public Variables
// ------------------------ // ------------------------
volatile uint32_t adc_accumulators[5] = {0}; // Accumulators for oversampling (sum of readings)
volatile uint8_t adc_counts[5] = {0}; // Count of readings accumulated per channel
volatile uint16_t adc_values[5] = {512, 512, 512, 512, 512}; // Final oversampled ADC values (averages) - initialized to mid-range
// Core 1 watchdog monitoring
volatile uint32_t core1_last_heartbeat = 0; // Timestamp of Core 1's last activity
volatile bool core1_watchdog_triggered = false; // Flag to indicate Core 1 reset
volatile uint8_t core1_reset_count = 0; // Count of Core 1 resets - halt system if >= CORE1_MAX_RESETS
volatile uint8_t current_pin;
volatile bool MarlinHAL::adc_has_result;
volatile uint8_t adc_channels_enabled[5] = {false}; // Track which ADC channels are enabled
// Helper function for LED blinking patterns
void blink_led_pattern(uint8_t blink_count, uint32_t blink_duration_us = 100000) {
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
for (uint8_t i = 0; i < blink_count; i++) {
WRITE(LED_PIN, HIGH);
busy_wait_us(blink_duration_us);
WRITE(LED_PIN, LOW);
if (i < blink_count - 1) { // Don't delay after the last blink
busy_wait_us(blink_duration_us);
}
}
#endif
}
// Core 1 ADC reading task - dynamically reads all enabled channels with oversampling
void core1_adc_task() {
static uint32_t last_led_toggle = 0;
const uint8_t OVERSAMPLENR = 16; // Standard Marlin oversampling count
// Signal successful Core 1 startup/restart
SERIAL_ECHO_MSG("Core 1 ADC task started");
while (true) {
// Update heartbeat timestamp at start of each scan cycle
core1_last_heartbeat = time_us_32();
// Scan all enabled ADC channels
for (uint8_t channel = 0; channel < 5; channel++) {
if (!adc_channels_enabled[channel]) continue;
// Enable temperature sensor if reading channel 4
if (channel == 4) {
adc_set_temp_sensor_enabled(true);
}
// Select and read the channel
adc_select_input(channel);
busy_wait_us(100); // Settling delay
adc_fifo_drain();
adc_run(true);
// Wait for conversion with timeout
uint32_t timeout = 10000;
while (adc_fifo_is_empty() && timeout--) {
busy_wait_us(1);
}
adc_run(false);
uint16_t reading = adc_fifo_is_empty() ? 0 : adc_fifo_get();
// Accumulate readings for oversampling
adc_accumulators[channel] += reading;
adc_counts[channel]++;
// Update the averaged value with current accumulation (provides immediate valid data)
adc_values[channel] = adc_accumulators[channel] / adc_counts[channel];
// When we reach the full oversampling count, reset accumulator for next cycle
if (adc_counts[channel] >= OVERSAMPLENR) {
adc_accumulators[channel] = 0;
adc_counts[channel] = 0;
}
// Disable temp sensor after reading to save power
if (channel == 4) {
adc_set_temp_sensor_enabled(false);
}
}
// Core 1 LED indicator: Double blink every 2 seconds to show Core 1 is active
uint32_t now = time_us_32();
if (now - last_led_toggle >= 2000000) { // 2 seconds
last_led_toggle = now;
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
// Triple blink pattern if watchdog was triggered (shows Core 1 was reset)
if (core1_watchdog_triggered) {
core1_watchdog_triggered = false; // Clear flag
blink_led_pattern(3); // Triple blink for watchdog reset
} else {
blink_led_pattern(2); // Normal double blink
}
#endif
}
// Delay between full scan cycles
busy_wait_us(10000); // 10ms between scans
}
}
volatile uint16_t adc_result; volatile uint16_t adc_result;
// ------------------------ // ------------------------
@@ -56,10 +162,10 @@ void MarlinHAL::init() {
// Ensure F_CPU is a constant expression. // Ensure F_CPU is a constant expression.
// If the compiler breaks here, it means that delay code that should compute at compile time will not work. // If the compiler breaks here, it means that delay code that should compute at compile time will not work.
// So better safe than sorry here. // So better safe than sorry here.
constexpr int cpuFreq = F_CPU; constexpr unsigned int cpuFreq = F_CPU;
UNUSED(cpuFreq); UNUSED(cpuFreq);
#if HAS_MEDIA && DISABLED(SDIO_SUPPORT) && PIN_EXISTS(SD_SS) #if HAS_MEDIA && DISABLED(ONBOARD_SDIO) && PIN_EXISTS(SD_SS)
OUT_WRITE(SD_SS_PIN, HIGH); // Try to set SD_SS_PIN inactive before any other SPI users start up OUT_WRITE(SD_SS_PIN, HIGH); // Try to set SD_SS_PIN inactive before any other SPI users start up
#endif #endif
@@ -112,15 +218,34 @@ void MarlinHAL::reboot() { watchdog_reboot(0, 0, 1); }
void MarlinHAL::watchdog_init() { void MarlinHAL::watchdog_init() {
#if DISABLED(DISABLE_WATCHDOG_INIT) #if DISABLED(DISABLE_WATCHDOG_INIT)
static_assert(WDT_TIMEOUT_US > 1000, "WDT Timout is too small, aborting"); static_assert(WDT_TIMEOUT_US > 1000, "WDT Timeout is too small, aborting");
watchdog_enable(WDT_TIMEOUT_US/1000, true); watchdog_enable(WDT_TIMEOUT_US/1000, true);
#endif #endif
} }
void MarlinHAL::watchdog_refresh() { void MarlinHAL::watchdog_refresh() {
// If Core 1 has reset CORE1_MAX_RESETS+ times, stop updating watchdog to halt system
if (core1_reset_count >= CORE1_MAX_RESETS) {
SERIAL_ECHO_MSG("Core 1 reset limit exceeded (", core1_reset_count, " resets) - halting system for safety");
return; // Don't update watchdog - system will halt
}
watchdog_update(); watchdog_update();
// Check Core 1 watchdog (15 second timeout)
uint32_t now = time_us_32();
if (now - core1_last_heartbeat > 15000000) { // 15 seconds
// Core 1 appears stuck - reset it
multicore_reset_core1();
multicore_launch_core1(core1_adc_task);
core1_watchdog_triggered = true; // Signal for LED indicator
core1_reset_count++; // Increment reset counter
SERIAL_ECHO_MSG("Core 1 ADC watchdog triggered - resetting Core 1 (attempt ", core1_reset_count, ")");
}
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator // Core 0 LED indicator: Single toggle every watchdog refresh (shows Core 0 activity)
TOGGLE(LED_PIN);
#endif #endif
} }
@@ -130,43 +255,35 @@ void MarlinHAL::reboot() { watchdog_reboot(0, 0, 1); }
// ADC // ADC
// ------------------------ // ------------------------
volatile bool MarlinHAL::adc_has_result = false;
void MarlinHAL::adc_init() { void MarlinHAL::adc_init() {
analogReadResolution(HAL_ADC_RESOLUTION); analogReadResolution(HAL_ADC_RESOLUTION);
::adc_init(); ::adc_init();
adc_fifo_setup(true, false, 1, false, false); adc_fifo_setup(true, false, 1, false, false);
irq_set_exclusive_handler(ADC_IRQ_FIFO, adc_exclusive_handler); // Launch Core 1 for continuous ADC reading
irq_set_enabled(ADC_IRQ_FIFO, true); multicore_launch_core1(core1_adc_task);
adc_irq_set_enabled(true); adc_has_result = true; // Results are always available with continuous sampling
} }
void MarlinHAL::adc_enable(const pin_t pin) { void MarlinHAL::adc_enable(const pin_t pin) {
if (pin >= A0 && pin <= A3) if (pin >= A0 && pin <= A3) {
adc_gpio_init(pin); adc_gpio_init(pin);
else if (pin == HAL_ADC_MCU_TEMP_DUMMY_PIN) adc_channels_enabled[pin - A0] = true; // Mark this channel as enabled
adc_set_temp_sensor_enabled(true); }
} else if (pin == HAL_ADC_MCU_TEMP_DUMMY_PIN) {
adc_channels_enabled[4] = true; // Mark MCU temp channel as enabled
void MarlinHAL::adc_start(const pin_t pin) {
adc_has_result = false;
// Select an ADC input. 0...3 are GPIOs 26...29 respectively.
adc_select_input(pin == HAL_ADC_MCU_TEMP_DUMMY_PIN ? 4 : pin - A0);
adc_run(true);
}
void MarlinHAL::adc_exclusive_handler() {
adc_run(false); // Disable since we only want one result
irq_clear(ADC_IRQ_FIFO); // Clear the IRQ
if (adc_fifo_get_level() >= 1) {
adc_result = adc_fifo_get(); // Pop the result
adc_fifo_drain();
adc_has_result = true; // Signal the end of the conversion
} }
} }
uint16_t MarlinHAL::adc_value() { return adc_result; } void MarlinHAL::adc_start(const pin_t pin) {
// Just store which pin we need to read - values are continuously updated by Core 1
current_pin = pin;
}
uint16_t MarlinHAL::adc_value() {
// Return the latest ADC value from Core 1's continuous readings
const uint8_t channel = (current_pin == HAL_ADC_MCU_TEMP_DUMMY_PIN) ? 4 : (current_pin - A0);
return adc_values[channel];
}
// Reset the system to initiate a firmware flash // Reset the system to initiate a firmware flash
void flashFirmware(const int16_t) { hal.reboot(); } void flashFirmware(const int16_t) { hal.reboot(); }
+6 -6
View File
@@ -40,6 +40,11 @@
#include "msc_sd.h" #include "msc_sd.h"
#endif #endif
// ADC index 4 is the MCU temperature
#define HAL_ADC_MCU_TEMP_DUMMY_PIN 127
#define TEMP_SOC_PIN HAL_ADC_MCU_TEMP_DUMMY_PIN // ADC4 is internal temp sensor
#include "temp_soc.h"
// //
// Serial Ports // Serial Ports
// //
@@ -85,8 +90,6 @@ typedef libServo hal_servo_t;
#else #else
#define HAL_ADC_RESOLUTION 12 #define HAL_ADC_RESOLUTION 12
#endif #endif
// ADC index 4 is the MCU temperature
#define HAL_ADC_MCU_TEMP_DUMMY_PIN 127
// //
// Pin Mapping for M42, M43, M226 // Pin Mapping for M42, M43, M226
@@ -141,7 +144,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask() { TERN_(HAS_SD_HOST_DRIVE, tuh_task()); } static void idletask() { TERN_(HAS_SD_HOST_DRIVE, tuh_task()); }
// Reset // Reset
@@ -164,9 +167,6 @@ public:
// Begin ADC sampling on the given pin. Called from Temperature::isr! // Begin ADC sampling on the given pin. Called from Temperature::isr!
static void adc_start(const pin_t pin); static void adc_start(const pin_t pin);
// This ADC runs a periodic task
static void adc_exclusive_handler();
// Is the ADC ready for reading? // Is the ADC ready for reading?
static volatile bool adc_has_result; static volatile bool adc_has_result;
static bool adc_ready() { return adc_has_result; } static bool adc_ready() { return adc_has_result; }
+31 -11
View File
@@ -31,28 +31,48 @@
// NOTE: The Bigtreetech SKR Pico has an onboard W25Q16 flash module // NOTE: The Bigtreetech SKR Pico has an onboard W25Q16 flash module
// Use EEPROM.h for compatibility, for now. // RP2040 Flash-based EEPROM emulation using internal flash memory
#include <EEPROM.h> #include <hardware/flash.h>
#include <hardware/sync.h>
static bool eeprom_data_written = false; // Flash sector size is already defined in hardware/flash.h as FLASH_SECTOR_SIZE
// Place EEPROM emulation at the end of flash, before the filesystem
// This assumes 2MB flash, adjust if using different flash size
#define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE)
#ifndef MARLIN_EEPROM_SIZE #ifndef MARLIN_EEPROM_SIZE
#define MARLIN_EEPROM_SIZE size_t(E2END + 1) #define MARLIN_EEPROM_SIZE size_t(E2END + 1)
#endif #endif
static uint8_t eeprom_buffer[MARLIN_EEPROM_SIZE];
static bool eeprom_data_written = false;
static bool eeprom_initialized = false;
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
bool PersistentStore::access_start() { bool PersistentStore::access_start() {
EEPROM.begin(); // Avoid EEPROM.h warning (do nothing) if (!eeprom_initialized) {
eeprom_buffer_fill(); // Read from flash into buffer
const uint8_t *flash_data = (const uint8_t *)(XIP_BASE + FLASH_TARGET_OFFSET);
memcpy(eeprom_buffer, flash_data, MARLIN_EEPROM_SIZE);
eeprom_initialized = true;
}
return true; return true;
} }
bool PersistentStore::access_finish() { bool PersistentStore::access_finish() {
if (eeprom_data_written) { if (eeprom_data_written) {
TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT()); TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT());
hal.isr_off();
eeprom_buffer_flush(); // Disable interrupts during flash write
hal.isr_on(); const uint32_t intstate = save_and_disable_interrupts();
// Erase and program the sector
flash_range_erase(FLASH_TARGET_OFFSET, FLASH_SECTOR_SIZE);
flash_range_program(FLASH_TARGET_OFFSET, eeprom_buffer, MARLIN_EEPROM_SIZE);
// Restore interrupts
restore_interrupts(intstate);
TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT()); TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT());
eeprom_data_written = false; eeprom_data_written = false;
} }
@@ -62,8 +82,8 @@ bool PersistentStore::access_finish() {
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
while (size--) { while (size--) {
uint8_t v = *value; uint8_t v = *value;
if (v != eeprom_buffered_read_byte(pos)) { if (pos < (int)MARLIN_EEPROM_SIZE && v != eeprom_buffer[pos]) {
eeprom_buffered_write_byte(pos, v); eeprom_buffer[pos] = v;
eeprom_data_written = true; eeprom_data_written = true;
} }
crc16(crc, &v, 1); crc16(crc, &v, 1);
@@ -75,7 +95,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
do { do {
const uint8_t c = eeprom_buffered_read_byte(pos); const uint8_t c = (pos < (int)MARLIN_EEPROM_SIZE) ? eeprom_buffer[pos] : 0xFF;
if (writing) *value = c; if (writing) *value = c;
crc16(crc, &c, 1); crc16(crc, &c, 1);
pos++; pos++;
+69 -48
View File
@@ -25,7 +25,7 @@
#include "HAL.h" #include "HAL.h"
#ifndef NUM_DIGITAL_PINS #ifndef NUM_DIGITAL_PINS
#error "Expected NUM_DIGITAL_PINS not found" #error "Expected NUM_DIGITAL_PINS not found."
#endif #endif
/** /**
@@ -74,6 +74,27 @@
* signal. The Arduino pin number is listed by the M43 I command. * signal. The Arduino pin number is listed by the M43 I command.
*/ */
/**
* Pins Debugging for RP2040
*
* - NUMBER_PINS_TOTAL
* - MULTI_NAME_PAD
* - getPinByIndex(index)
* - printPinNameByIndex(index)
* - getPinIsDigitalByIndex(index)
* - digitalPinToAnalogIndex(pin)
* - getValidPinMode(pin)
* - isValidPin(pin)
* - isAnalogPin(pin)
* - digitalRead_mod(pin)
* - pwm_status(pin)
* - printPinPWM(pin)
* - printPinPort(pin)
* - printPinNumber(pin)
* - printPinAnalog(pin)
*/
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
#define NUM_ANALOG_FIRST A0 #define NUM_ANALOG_FIRST A0
#define MODE_PIN_INPUT 0 // Input mode (reset state) #define MODE_PIN_INPUT 0 // Input mode (reset state)
@@ -81,66 +102,66 @@
#define MODE_PIN_ALT 2 // Alternate function mode #define MODE_PIN_ALT 2 // Alternate function mode
#define MODE_PIN_ANALOG 3 // Analog mode #define MODE_PIN_ANALOG 3 // Analog mode
#define PIN_NUM(P) (P & 0x000F) #define getPinByIndex(x) pin_array[x].pin
#define PIN_NUM_ALPHA_LEFT(P) (((P & 0x000F) < 10) ? ('0' + (P & 0x000F)) : '1') #define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
#define PIN_NUM_ALPHA_RIGHT(P) (((P & 0x000F) > 9) ? ('0' + (P & 0x000F) - 10) : 0 ) #define getPinIsDigitalByIndex(x) pin_array[x].is_digital
#define PORT_NUM(P) ((P >> 4) & 0x0007) #define digitalPinToAnalogIndex(P) digital_pin_to_analog_pin(P)
#define PORT_ALPHA(P) ('A' + (P >> 4))
/** uint8_t get_pin_mode(const pin_t pin) {
* Translation of routines & variables used by pinsDebug.h // Check if pin is in alternate function mode (I2C, SPI, etc.)
*/ const uint32_t gpio_func = gpio_get_function(pin);
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
#define VALID_PIN(ANUM) (pin_t(ANUM) >= 0 && pin_t(ANUM) < NUMBER_PINS_TOTAL)
#define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads
#define PRINT_PIN(Q)
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
#define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine
// x is a variable used to search pin_array // GPIO_FUNC_I2C is typically function 3 on RP2040
#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) if ( gpio_func == GPIO_FUNC_I2C
#define GET_ARRAY_PIN(x) ((pin_t) pin_array[x].pin) || gpio_func == GPIO_FUNC_SPI
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) || gpio_func == GPIO_FUNC_UART
#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin || gpio_func == GPIO_FUNC_PWM
) {
uint8_t get_pin_mode(const pin_t Ard_num) { return MODE_PIN_ALT;
}
uint dir = gpio_get_dir( Ard_num);
if (dir) return MODE_PIN_OUTPUT;
else return MODE_PIN_INPUT;
// For GPIO mode, check direction
return gpio_get_dir(pin) ? MODE_PIN_OUTPUT : MODE_PIN_INPUT;
} }
bool getValidPinMode(const pin_t Ard_num) { bool getValidPinMode(const pin_t pin) {
const uint8_t pin_mode = get_pin_mode(Ard_num); const uint8_t pin_mode = get_pin_mode(pin);
return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM
} }
int8_t digital_pin_to_analog_pin(pin_t Ard_num) { #define isValidPin(P) WITHIN(P, 0, pin_t(NUMBER_PINS_TOTAL - 1))
Ard_num -= NUM_ANALOG_FIRST;
return (Ard_num >= 0 && Ard_num < NUM_ANALOG_INPUTS) ? Ard_num : -1; int8_t digital_pin_to_analog_pin(pin_t pin) {
pin -= NUM_ANALOG_FIRST;
return (WITHIN(pin, 0, NUM_ANALOG_INPUTS - 1)) ? pin : -1;
} }
bool isAnalogPin(const pin_t Ard_num) { bool isAnalogPin(const pin_t pin) {
return digital_pin_to_analog_pin(Ard_num) != -1; return digital_pin_to_analog_pin(pin) != -1;
} }
bool is_digital(const pin_t x) { #define digitalRead_mod(A) extDigitalRead(A) // must use Arduino pin numbers when doing reads
const uint8_t pin_mode = get_pin_mode(x); #define printPinNumber(P) do{ sprintf_P(buffer, PSTR("%3d "), P); SERIAL_ECHO(buffer); }while(0)
return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT; #define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin
//bool is_digital(const pin_t pin) {
// const uint8_t pin_mode = get_pin_mode(pin);
// return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT;
//}
bool pwm_status(const pin_t pin) {
// Check if this pin is configured for PWM
return PWM_PIN(pin) && get_pin_mode(pin) == MODE_PIN_ALT;
} }
void printPinPort(const pin_t Ard_num) { void printPinPWM(const pin_t pin) {
SERIAL_ECHOPGM("Pin: "); if (pwm_status(pin)) {
SERIAL_ECHO(Ard_num); // RP2040 has hardware PWM on specific pins
} char buffer[22];
sprintf_P(buffer, PSTR("PWM: pin %d "), pin);
bool pwm_status(const pin_t Ard_num) { SERIAL_ECHO(buffer);
return get_pin_mode(Ard_num) == MODE_PIN_ALT;
}
void printPinPWM(const pin_t Ard_num) {
if (PWM_PIN(Ard_num)) {
} }
} }
void printPinPort(const pin_t pin) {}
+30
View File
@@ -0,0 +1,30 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2025 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
// RP2040 internal temperature sensor
// Formula: T = 27 - (ADC_voltage - 0.706) / 0.001721
// ADC_voltage = (RAW / OVERSAMPLENR) * 3.3 / 4096 (RAW is accumulated over OVERSAMPLENR samples)
// T = 27 - ((RAW / OVERSAMPLENR) * 3.3 / 4096 - 0.706) / 0.001721
// Simplified: T = 437.423 - (RAW / OVERSAMPLENR) * 0.46875
#define TEMP_SOC_SENSOR(RAW) (437.423f - ((RAW) / OVERSAMPLENR) * 0.46875f)
+21 -33
View File
@@ -41,9 +41,9 @@
#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T) #define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T)
typedef uint64_t hal_timer_t; typedef uint64_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
#define HAL_TIMER_RATE (1000000ull) // fixed value as we use a microsecond timesource #define HAL_TIMER_RATE (1'000'000ULL) // fixed value as we use a microsecond timesource
#ifndef MF_TIMER_STEP #ifndef MF_TIMER_STEP
#define MF_TIMER_STEP 0 // Timer Index for Stepper #define MF_TIMER_STEP 0 // Timer Index for Stepper
#endif #endif
@@ -58,21 +58,21 @@ typedef uint64_t hal_timer_t;
#endif #endif
#define TEMP_TIMER_RATE HAL_TIMER_RATE #define TEMP_TIMER_RATE HAL_TIMER_RATE
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
#define STEPPER_TIMER_RATE HAL_TIMER_RATE / 10 // 100khz roughly #define STEPPER_TIMER_RATE HAL_TIMER_RATE / 10 // 100khz roughly
#define STEPPER_TIMER_TICKS_PER_US (0.1) // fixed value as we use a microsecond timesource #define STEPPER_TIMER_TICKS_PER_US (0.1) // fixed value as we use a microsecond timesource
#define STEPPER_TIMER_PRESCALE (10) #define STEPPER_TIMER_PRESCALE (10)
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP) #define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
@@ -86,10 +86,10 @@ typedef uint64_t hal_timer_t;
//#define STEP_TIMER_PTR _HAL_TIMER(MF_TIMER_STEP) //#define STEP_TIMER_PTR _HAL_TIMER(MF_TIMER_STEP)
//#define TEMP_TIMER_PTR _HAL_TIMER(MF_TIMER_TEMP) //#define TEMP_TIMER_PTR _HAL_TIMER(MF_TIMER_TEMP)
extern alarm_pool_t* HAL_timer_pool_0; extern alarm_pool_t *HAL_timer_pool_0;
extern alarm_pool_t* HAL_timer_pool_1; extern alarm_pool_t *HAL_timer_pool_1;
extern alarm_pool_t* HAL_timer_pool_2; extern alarm_pool_t *HAL_timer_pool_2;
extern alarm_pool_t* HAL_timer_pool_3; extern alarm_pool_t *HAL_timer_pool_3;
extern struct repeating_timer HAL_timer_0; extern struct repeating_timer HAL_timer_0;
@@ -120,28 +120,23 @@ void HAL_timer_stop(const uint8_t timer_num);
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t compare) { FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t compare) {
if (timer_num == MF_TIMER_STEP){ if (timer_num == MF_TIMER_STEP && compare == HAL_TIMER_TYPE_MAX) {
if (compare == HAL_TIMER_TYPE_MAX){ HAL_timer_stop(timer_num);
HAL_timer_stop(timer_num); return;
return;
}
} }
compare = compare *10; //Dirty fix, figure out a proper way compare *= 10; // Dirty fix, figure out a proper way
switch (timer_num) { switch (timer_num) {
case 0: case 0:
alarm_pool_add_alarm_in_us(HAL_timer_pool_0, compare, HAL_timer_alarm_pool_0_callback, 0, false); alarm_pool_add_alarm_in_us(HAL_timer_pool_0, compare, HAL_timer_alarm_pool_0_callback, 0, false);
break; break;
case 1: case 1:
alarm_pool_add_alarm_in_us(HAL_timer_pool_1, compare, HAL_timer_alarm_pool_1_callback, 0, false); alarm_pool_add_alarm_in_us(HAL_timer_pool_1, compare, HAL_timer_alarm_pool_1_callback, 0, false);
break; break;
case 2: case 2:
alarm_pool_add_alarm_in_us(HAL_timer_pool_2, compare, HAL_timer_alarm_pool_2_callback, 0, false); alarm_pool_add_alarm_in_us(HAL_timer_pool_2, compare, HAL_timer_alarm_pool_2_callback, 0, false);
break; break;
case 3: case 3:
alarm_pool_add_alarm_in_us(HAL_timer_pool_3, compare, HAL_timer_alarm_pool_3_callback, 0, false); alarm_pool_add_alarm_in_us(HAL_timer_pool_3, compare, HAL_timer_alarm_pool_3_callback, 0, false);
break; break;
@@ -151,27 +146,20 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_time
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) {
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) {
if (timer_num == MF_TIMER_STEP) return 0ull; if (timer_num == MF_TIMER_STEP) return 0ull;
return time_us_64(); return time_us_64();
} }
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) {
HAL_timer_irq_en[timer_num] = 1; HAL_timer_irq_en[timer_num] = 1;
} }
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) {
HAL_timer_irq_en[timer_num] = 0; HAL_timer_irq_en[timer_num] = 0;
} }
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) {
return HAL_timer_irq_en[timer_num]; //lucky coincidence that timer_num and rp2040 irq num matches return HAL_timer_irq_en[timer_num]; // Lucky coincidence that timer_num and rp2040 IRQ num matches
} }
FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { inline void HAL_timer_isr_prologue(const uint8_t) {}
return; inline void HAL_timer_isr_epilogue(const uint8_t) {}
}
#define HAL_timer_isr_epilogue(T) NOOP
+28
View File
@@ -0,0 +1,28 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2025 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
/**
* RP2040 LCD-specific defines
*/
uint8_t u8g_com_rp2040_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); // u8g_com_rp2040_ssd_i2c.cpp
#define U8G_COM_SSD_I2C_HAL u8g_com_rp2040_ssd_i2c_fn
@@ -0,0 +1,108 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2025 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/>.
*
*/
/**
* 2-Wire I2C COM Driver
*
* Handles Hardware I2C on valid pin combinations.
* Wire library is used for Hardware I2C.
*
* Hardware I2C uses pins defined in pins_arduino.h.
*/
#ifdef __PLAT_RP2040__
#include "../../../inc/MarlinConfig.h"
#if HAS_U8GLIB_I2C_OLED
#include <U8glib-HAL.h>
#include <Wire.h>
#ifndef MASTER_ADDRESS
#define MASTER_ADDRESS 0x01
#endif
/**
* BUFFER_LENGTH is defined in libraries\Wire\utility\WireBase.h
* Default value is 32
* Increase this value to 144 to send U8G_COM_MSG_WRITE_SEQ in single block
*/
#ifndef BUFFER_LENGTH
#define BUFFER_LENGTH 32
#endif
#if BUFFER_LENGTH > 144
#error "BUFFER_LENGTH should not be greater than 144."
#endif
#define I2C_MAX_LENGTH (BUFFER_LENGTH - 1)
uint8_t u8g_com_rp2040_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
// Hardware I2C flag
//static bool i2c_initialized = false; // Flag to only run init/linking code once
//if (!i2c_initialized) { // Init runtime linkages
// i2c_initialized = true; // Only do this once
//}
static uint8_t control;
// Use the global Wire instance (already initialized with correct pins for RP2040)
switch (msg) {
case U8G_COM_MSG_INIT:
Wire.setClock(400000);
// Wire already initialized in MarlinUI::init(), no need to call begin() again
break;
case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1)
control = arg_val ? 0x40 : 0x00;
break;
case U8G_COM_MSG_WRITE_BYTE:
::Wire.beginTransmission(0x3C);
::Wire.write(control);
::Wire.write(arg_val);
::Wire.endTransmission();
break;
case U8G_COM_MSG_WRITE_SEQ: {
uint8_t* dataptr = (uint8_t*)arg_ptr;
while (arg_val > 0) {
::Wire.beginTransmission(0x3C);
::Wire.write(control);
if (arg_val <= I2C_MAX_LENGTH) {
::Wire.write(dataptr, arg_val);
arg_val = 0;
}
else {
::Wire.write(dataptr, I2C_MAX_LENGTH);
arg_val -= I2C_MAX_LENGTH;
dataptr += I2C_MAX_LENGTH;
}
::Wire.endTransmission();
}
break;
}
}
return 1;
}
#endif // HAS_U8GLIB_I2C_OLED
#endif // __PLAT_RP2040__
+1 -1
View File
@@ -144,7 +144,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask() {} static void idletask() {}
// Reset // Reset
@@ -83,7 +83,7 @@ bool PersistentStore::access_start() {
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC; NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC;
while (NVMCTRL->INTFLAG.bit.READY == 0) { } while (NVMCTRL->INTFLAG.bit.READY == 0) { }
PAGE_SIZE = pow(2,3 + NVMCTRL->PARAM.bit.PSZ); PAGE_SIZE = POW(2, 3 + NVMCTRL->PARAM.bit.PSZ);
ROW_SIZE= PAGE_SIZE * 4; ROW_SIZE= PAGE_SIZE * 4;
/*NVMCTRL->SEECFG.reg = NVMCTRL_SEECFG_WMODE_BUFFERED; // Buffered mode and segment reallocation active /*NVMCTRL->SEECFG.reg = NVMCTRL_SEECFG_WMODE_BUFFERED; // Buffered mode and segment reallocation active
if (NVMCTRL->SEESTAT.bit.RLOCK) if (NVMCTRL->SEESTAT.bit.RLOCK)
+2 -2
View File
@@ -165,7 +165,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
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
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_TC4_TC5)) ; GCLK->CLKCTRL.reg = uint16_t(GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_TC4_TC5));
SYNC (GCLK->STATUS.bit.SYNCBUSY); SYNC (GCLK->STATUS.bit.SYNCBUSY);
tcReset(tc); // reset TC tcReset(tc); // reset TC
@@ -176,7 +176,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
tc->COUNT32.CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ; tc->COUNT32.CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ;
//set prescaler //set prescaler
//the clock normally counts at the GCLK_TC frequency, but we can set it to divide that frequency to slow it down //the clock normally counts at the GCLK_TC frequency, but we can set it to divide that frequency to slow it down
//you can use different prescaler divisons here like TC_CTRLA_PRESCALER_DIV1 to get a different range //you can use different prescaler divisions here like TC_CTRLA_PRESCALER_DIV1 to get a different range
tc->COUNT32.CTRLA.reg |= TC_CTRLA_PRESCALER_DIV1 | TC_CTRLA_ENABLE; //it will divide GCLK_TC frequency by 1024 tc->COUNT32.CTRLA.reg |= TC_CTRLA_PRESCALER_DIV1 | TC_CTRLA_ENABLE; //it will divide GCLK_TC frequency by 1024
//set the compare-capture register. //set the compare-capture register.
//The counter will count up to this value (it's a 16bit counter so we use uint16_t) //The counter will count up to this value (it's a 16bit counter so we use uint16_t)
+8 -8
View File
@@ -33,7 +33,7 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals #define HAL_TIMER_RATE F_CPU // frequency of timers peripherals
@@ -49,15 +49,15 @@ typedef uint32_t hal_timer_t;
#define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature #define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature
#endif #endif
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR 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 // (Hz) Frequency of Stepper Timer ISR (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) // (MHz) 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 #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
@@ -157,4 +157,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
} }
} }
#define HAL_timer_isr_epilogue(timer_num) inline void HAL_timer_isr_epilogue(const uint8_t) {}
+1 -1
View File
@@ -32,7 +32,7 @@
* *
* Couldn't just call exact copies because the overhead killed the LCD update speed * Couldn't just call exact copies because the overhead killed the LCD update speed
* With an intermediate level the softspi was running in the 10-20kHz range which * With an intermediate level the softspi was running in the 10-20kHz range which
* resulted in using about about 25% of the CPU's time. * resulted in using about 25% of the CPU's time.
*/ */
#ifdef __SAMD21__ #ifdef __SAMD21__
+1 -1
View File
@@ -33,7 +33,7 @@
* *
* Couldn't just call exact copies because the overhead killed the LCD update speed * Couldn't just call exact copies because the overhead killed the LCD update speed
* With an intermediate level the softspi was running in the 10-20kHz range which * With an intermediate level the softspi was running in the 10-20kHz range which
* resulted in using about about 25% of the CPU's time. * resulted in using about 25% of the CPU's time.
*/ */
void u8g_SetPinOutput(uint8_t internal_pin_number); void u8g_SetPinOutput(uint8_t internal_pin_number);
+21 -2
View File
@@ -61,7 +61,8 @@
#define GET_COOLER_ADC() TERN(HAS_TEMP_ADC_COOLER, PIN_TO_ADC(TEMP_COOLER_PIN), -1) #define GET_COOLER_ADC() TERN(HAS_TEMP_ADC_COOLER, PIN_TO_ADC(TEMP_COOLER_PIN), -1)
#define GET_BOARD_ADC() TERN(HAS_TEMP_ADC_BOARD, PIN_TO_ADC(TEMP_BOARD_PIN), -1) #define GET_BOARD_ADC() TERN(HAS_TEMP_ADC_BOARD, PIN_TO_ADC(TEMP_BOARD_PIN), -1)
#define GET_SOC_ADC() TERN(HAS_TEMP_ADC_BOARD, PIN_TO_ADC(TEMP_BOARD_PIN), -1) #define GET_SOC_ADC() TERN(HAS_TEMP_ADC_BOARD, PIN_TO_ADC(TEMP_BOARD_PIN), -1)
#define GET_FILAMENT_WIDTH_ADC() TERN(FILAMENT_WIDTH_SENSOR, PIN_TO_ADC(FILWIDTH_PIN), -1) #define GET_FILAMENT_WIDTH_ADC() TERN(HAS_FILWIDTH_ADC, PIN_TO_ADC(FILWIDTH_PIN), -1)
#define GET_FILAMENT2_WIDTH_ADC() TERN(HAS_FILWIDTH2_ADC, PIN_TO_ADC(FILWIDTH2_PIN), -1)
#define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1) #define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1)
#define GET_JOY_ADC_X() TERN(HAS_JOY_ADC_X, PIN_TO_ADC(JOY_X_PIN), -1) #define GET_JOY_ADC_X() TERN(HAS_JOY_ADC_X, PIN_TO_ADC(JOY_X_PIN), -1)
#define GET_JOY_ADC_Y() TERN(HAS_JOY_ADC_Y, PIN_TO_ADC(JOY_Y_PIN), -1) #define GET_JOY_ADC_Y() TERN(HAS_JOY_ADC_Y, PIN_TO_ADC(JOY_Y_PIN), -1)
@@ -77,7 +78,7 @@
|| GET_PROBE_ADC() == n \ || GET_PROBE_ADC() == n \
|| GET_COOLER_ADC() == n \ || GET_COOLER_ADC() == n \
|| GET_BOARD_ADC() == n || GET_SOC_ADC() == n \ || GET_BOARD_ADC() == n || GET_SOC_ADC() == n \
|| GET_FILAMENT_WIDTH_ADC() == n \ || GET_FILAMENT_WIDTH_ADC() == n || GET_FILAMENT2_WIDTH_ADC() == n \
|| GET_BUTTONS_ADC() == n \ || GET_BUTTONS_ADC() == n \
|| GET_JOY_ADC_X() == n || GET_JOY_ADC_Y() == n || GET_JOY_ADC_Z() == n \ || GET_JOY_ADC_X() == n || GET_JOY_ADC_Y() == n || GET_JOY_ADC_Z() == n \
|| GET_POWERMON_ADC_CURRENT() == n || GET_POWERMON_ADC_VOLTS() == n \ || GET_POWERMON_ADC_CURRENT() == n || GET_POWERMON_ADC_VOLTS() == n \
@@ -146,6 +147,9 @@ enum ADCIndex {
#if GET_FILAMENT_WIDTH_ADC() == 0 #if GET_FILAMENT_WIDTH_ADC() == 0
FILWIDTH, FILWIDTH,
#endif #endif
#if GET_FILAMENT2_WIDTH_ADC() == 0
FILWIDTH2,
#endif
#if GET_BUTTONS_ADC() == 0 #if GET_BUTTONS_ADC() == 0
ADC_KEY, ADC_KEY,
#endif #endif
@@ -212,6 +216,9 @@ enum ADCIndex {
#if GET_FILAMENT_WIDTH_ADC() == 1 #if GET_FILAMENT_WIDTH_ADC() == 1
FILWIDTH, FILWIDTH,
#endif #endif
#if GET_FILAMENT2_WIDTH_ADC() == 1
FILWIDTH2,
#endif
#if GET_BUTTONS_ADC() == 1 #if GET_BUTTONS_ADC() == 1
ADC_KEY, ADC_KEY,
#endif #endif
@@ -334,6 +341,9 @@ enum ADCIndex {
#if GET_FILAMENT_WIDTH_ADC() == 0 #if GET_FILAMENT_WIDTH_ADC() == 0
FILWIDTH_PIN, FILWIDTH_PIN,
#endif #endif
#if GET_FILAMENT2_WIDTH_ADC() == 0
FILWIDTH2_PIN,
#endif
#if GET_BUTTONS_ADC() == 0 #if GET_BUTTONS_ADC() == 0
ADC_KEYPAD_PIN, ADC_KEYPAD_PIN,
#endif #endif
@@ -400,6 +410,9 @@ enum ADCIndex {
#if GET_FILAMENT_WIDTH_ADC() == 1 #if GET_FILAMENT_WIDTH_ADC() == 1
FILWIDTH_PIN, FILWIDTH_PIN,
#endif #endif
#if GET_FILAMENT2_WIDTH_ADC() == 1
FILWIDTH2_PIN,
#endif
#if GET_BUTTONS_ADC() == 1 #if GET_BUTTONS_ADC() == 1
ADC_KEYPAD_PIN, ADC_KEYPAD_PIN,
#endif #endif
@@ -471,6 +484,9 @@ enum ADCIndex {
#if GET_FILAMENT_WIDTH_ADC() == 0 #if GET_FILAMENT_WIDTH_ADC() == 0
{ PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, { PIN_TO_INPUTCTRL(FILWIDTH_PIN) },
#endif #endif
#if GET_FILAMENT2_WIDTH_ADC() == 0
{ PIN_TO_INPUTCTRL(FILWIDTH2_PIN) },
#endif
#if GET_BUTTONS_ADC() == 0 #if GET_BUTTONS_ADC() == 0
{ PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) }, { PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) },
#endif #endif
@@ -543,6 +559,9 @@ enum ADCIndex {
#if GET_FILAMENT_WIDTH_ADC() == 1 #if GET_FILAMENT_WIDTH_ADC() == 1
{ PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, { PIN_TO_INPUTCTRL(FILWIDTH_PIN) },
#endif #endif
#if GET_FILAMENT2_WIDTH_ADC() == 1
{ PIN_TO_INPUTCTRL(FILWIDTH2_PIN) },
#endif
#if GET_BUTTONS_ADC() == 1 #if GET_BUTTONS_ADC() == 1
{ PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) }, { PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) },
#endif #endif
+1 -1
View File
@@ -121,7 +121,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask() {} static void idletask() {}
// Reset // Reset
+8 -8
View File
@@ -32,7 +32,7 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals #define HAL_TIMER_RATE F_CPU // frequency of timers peripherals
@@ -48,15 +48,15 @@ typedef uint32_t hal_timer_t;
#define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature #define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature
#endif #endif
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency #define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR 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 // (Hz) Frequency of Stepper Timer ISR (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) // (MHz) 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 #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
#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 PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP) #define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP) #define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
@@ -145,4 +145,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
} }
} }
#define HAL_timer_isr_epilogue(timer_num) inline void HAL_timer_isr_epilogue(const uint8_t) {}
+3 -3
View File
@@ -66,7 +66,7 @@ void MarlinHAL::init() {
// Ensure F_CPU is a constant expression. // Ensure F_CPU is a constant expression.
// If the compiler breaks here, it means that delay code that should compute at compile time will not work. // If the compiler breaks here, it means that delay code that should compute at compile time will not work.
// So better safe than sorry here. // So better safe than sorry here.
constexpr int cpuFreq = F_CPU; constexpr unsigned int cpuFreq = F_CPU;
UNUSED(cpuFreq); UNUSED(cpuFreq);
#if HAS_MEDIA && DISABLED(ONBOARD_SDIO) && PIN_EXISTS(SD_SS) #if HAS_MEDIA && DISABLED(ONBOARD_SDIO) && PIN_EXISTS(SD_SS)
@@ -114,7 +114,7 @@ void MarlinHAL::idletask() {
void MarlinHAL::reboot() { NVIC_SystemReset(); } void MarlinHAL::reboot() { NVIC_SystemReset(); }
uint8_t MarlinHAL::get_reset_source() { uint8_t MarlinHAL::get_reset_source() {
return return (
#ifdef RCC_FLAG_IWDGRST // Some sources may not exist... #ifdef RCC_FLAG_IWDGRST // Some sources may not exist...
RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ? RST_WATCHDOG : RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ? RST_WATCHDOG :
#endif #endif
@@ -134,7 +134,7 @@ uint8_t MarlinHAL::get_reset_source() {
RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) ? RST_POWER_ON : RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) ? RST_POWER_ON :
#endif #endif
0 0
; );
} }
void MarlinHAL::clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } void MarlinHAL::clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); }
+1 -1
View File
@@ -157,7 +157,7 @@ public:
static void delay_ms(const int ms) { delay(ms); } static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle() // Tasks, called from marlin.idle()
static void idletask(); static void idletask();
// Reset // Reset
+1 -1
View File
@@ -209,7 +209,7 @@ HAL_HardwareSerial::HAL_HardwareSerial(void *peripheral) {
} }
#endif #endif
else { // else get the pins of the first peripheral occurence in PinMap else { // else get the pins of the first peripheral occurrence in PinMap
_serial.pin_rx = pinmap_pin(peripheral, PinMap_UART_RX); _serial.pin_rx = pinmap_pin(peripheral, PinMap_UART_RX);
_serial.pin_tx = pinmap_pin(peripheral, PinMap_UART_TX); _serial.pin_tx = pinmap_pin(peripheral, PinMap_UART_TX);
} }
+5 -4
View File
@@ -3,9 +3,10 @@
This HAL is intended to act as the generic STM32 HAL for all STM32 chips (The whole F, H and L family). This HAL is intended to act as the generic STM32 HAL for all STM32 chips (The whole F, H and L family).
Currently it supports: Currently it supports:
* STM32F0xx
* STM32F1xx - STM32F0xx
* STM32F4xx - STM32F1xx
* STM32F7xx - STM32F4xx
- STM32F7xx
Targeting the official [Arduino STM32 Core](https://github.com/stm32duino/Arduino_Core_STM32). Targeting the official [Arduino STM32 Core](https://github.com/stm32duino/Arduino_Core_STM32).
+2 -2
View File
@@ -39,8 +39,8 @@ static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM
static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO); static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
// This must be called after the STM32 Servo class has initialized the timer. // This must be called after the STM32 Servo class has initialized the timer.
// It may only be needed after the first call to attach(), but it is possible // It may only be needed after the first call to attach(), but it's possible
// that is is necessary after every detach() call. To be safe this is currently // that this is needed after every detach() call. To be safe this is currently
// called after every call to attach(). // called after every call to attach().
static void fixServoTimerInterruptPriority() { static void fixServoTimerInterruptPriority() {
NVIC_SetPriority(getTimerUpIrq(TIMER_SERVO), servo_interrupt_priority); NVIC_SetPriority(getTimerUpIrq(TIMER_SERVO), servo_interrupt_priority);
+2 -2
View File
@@ -125,13 +125,13 @@ bool PersistentStore::access_start() {
} }
if (current_slot == -1) { if (current_slot == -1) {
// We didn't find anything, so we'll just initialize to empty // We didn't find anything, so we'll just initialize to empty
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8; for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = EMPTY_UINT8;
current_slot = EEPROM_SLOTS; current_slot = EEPROM_SLOTS;
} }
else { else {
// load current settings // load current settings
uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot); uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot);
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = eeprom_data[i];
DEBUG_ECHOLNPGM("EEPROM loaded from slot ", current_slot, "."); DEBUG_ECHOLNPGM("EEPROM loaded from slot ", current_slot, ".");
} }
eeprom_data_written = false; eeprom_data_written = false;
@@ -44,7 +44,7 @@ void eeprom_init() { BL24CXX::init(); }
void eeprom_write_byte(uint8_t *pos, uint8_t value) { void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos; const unsigned eeprom_address = (unsigned)pos;
return BL24CXX::writeOneByte(eeprom_address, value); BL24CXX::writeOneByte(eeprom_address, value);
} }
uint8_t eeprom_read_byte(uint8_t *pos) { uint8_t eeprom_read_byte(uint8_t *pos) {
@@ -54,7 +54,7 @@ bool PersistentStore::access_start() {
int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE); int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE);
if (bytes_read < 0) return false; if (bytes_read < 0) return false;
for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++) for (; bytes_read < long(MARLIN_EEPROM_SIZE); bytes_read++)
HAL_eeprom_data[bytes_read] = 0xFF; HAL_eeprom_data[bytes_read] = 0xFF;
file.close(); file.close();
return true; return true;
+1 -1
View File
@@ -29,6 +29,6 @@
#endif #endif
// Some STM32F4 boards may lose steps when saving to EEPROM during print (PR #17946) // Some STM32F4 boards may lose steps when saving to EEPROM during print (PR #17946)
#if defined(STM32F4xx) && ENABLED(FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0 #if ALL(STM32F4xx, FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
#define PRINTCOUNTER_SYNC #define PRINTCOUNTER_SYNC
#endif #endif
+4 -7
View File
@@ -136,10 +136,8 @@ const XrefInfo pin_xref[] PROGMEM = {
#define printPinNumber(Q) #define printPinNumber(Q)
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0) #define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
#define digitalPinToAnalogIndex(P) -1 // will report analog pin number in the print port routine #define digitalPinToAnalogIndex(P) -1 // will report analog pin number in the print port routine
#define getPinIsDigitalByIndex(x) bool(pin_array[x].is_digital)
// x is a variable used to search pin_array #define getPinByIndex(x) pin_t(pin_array[x].pin)
#define getPinIsDigitalByIndex(x) ((bool) pin_array[x].is_digital)
#define getPinByIndex(x) ((pin_t) pin_array[x].pin)
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin #define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin
@@ -150,7 +148,7 @@ const XrefInfo pin_xref[] PROGMEM = {
#ifndef M43_NEVER_TOUCH #ifndef M43_NEVER_TOUCH
#define _M43_NEVER_TOUCH(x) WITHIN(x, 9, 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP) #define _M43_NEVER_TOUCH(x) WITHIN(x, 9, 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP)
#ifdef KILL_PIN #if PIN_EXISTS(KILL)
#define M43_NEVER_TOUCH(x) m43_never_touch(x) #define M43_NEVER_TOUCH(x) m43_never_touch(x)
bool m43_never_touch(const pin_t index) { bool m43_never_touch(const pin_t index) {
@@ -229,8 +227,7 @@ void printPinPort(const pin_t pin) {
calc_p -= NUM_ANALOG_FIRST; calc_p -= NUM_ANALOG_FIRST;
if (calc_p > 7) calc_p += 8; if (calc_p > 7) calc_p += 8;
} }
SERIAL_ECHOPGM(" M42 P", calc_p); SERIAL_ECHO(F(" M42 P"), calc_p, C(' '));
SERIAL_CHAR(' ');
if (calc_p < 100) { if (calc_p < 100) {
SERIAL_CHAR(' '); SERIAL_CHAR(' ');
if (calc_p < 10) if (calc_p < 10)

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