Compare commits

...

1002 Commits

Author SHA1 Message Date
Scott Lahteine
09d0b4d152 🔖 Version 2.1.2.1 2023-07-01 19:19:17 -05:00
Giuliano Zaro
862d0e9d5d 🐛 Fix G2/G3 limiting_speed (#25988) 2023-07-01 19:19:17 -05:00
Scott Lahteine
cbdc01ef1a 🩹 Prevent Z drop with G28 X/Y 2023-05-29 19:23:24 -05:00
Scott Lahteine
2dffa3994d 🩹 Fix TFT LVGL compile error (#25865)
Fixes regression from #24302
2023-05-21 08:43:15 -05:00
Scott Lahteine
09247e7ea9 🚸 Improve EEPROM validation (#25860) 2023-05-19 23:31:15 -05:00
Scott Lahteine
62a7bba225 🩹 Fix null pwm_details 2023-05-18 19:53:15 -05:00
Scott Lahteine
ce38260dfb 🩹 Improve edit menu rounding 2023-05-17 00:33:18 -05:00
Scott Lahteine
3ad9c0b98c 🧑‍💻 ftdi_language 2023-05-17 00:33:18 -05:00
Scott Lahteine
a0fd588797 📌 TH3D EZBoard SD_DETECT_PIN 27 2023-05-17 00:33:18 -05:00
Chris Bagwell
876f996691 🔧 Fix SHAPING_MIN_FREQ check (#25358) 2023-05-17 00:33:18 -05:00
Scott Lahteine
dba521a9fb 🧑‍💻 M43 updates 2023-05-17 00:33:18 -05:00
Giuliano Zaro
50ad323567 🔧 Move SOFT_PWM_SCALE fallback to cpp (#25800)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-17 00:33:18 -05:00
Scott Lahteine
03149b973e 🚸 Faster default Marlin feedrate 2023-05-17 00:33:18 -05:00
ellensp
6e91f3608b 🔨 MKS Robin2 PIO Env (#25792) 2023-05-17 00:33:18 -05:00
Scott Lahteine
0708275c6a 🎨 Move G28O inside ProUI 2023-05-17 00:33:18 -05:00
Scott Mikutsky
a2040bae21 🐛 Fix STM32 USB disconnect behavior (#25762) 2023-05-17 00:33:18 -05:00
Scott Lahteine
b6c27fbbdb 🔧 Fix X2/Y2 axis pins check 2023-05-17 00:33:18 -05:00
Scott Lahteine
b2acd51bc2 🔧 Move MMU section 2023-05-17 00:33:18 -05:00
Scott Lahteine
6d46a4924c 🩹 Fix TFT sanity error 2023-05-17 00:33:18 -05:00
Scott Lahteine
d959e3b0c4 🧑‍💻 Use NUM_AXIS_ARRAY 2023-05-17 00:33:18 -05:00
Scott Lahteine
f48467b2e3 🔨 Servo Timer 1 with STM32F103RC_fysetc (#25741) 2023-05-17 00:33:18 -05:00
Scott Lahteine
a9c476c55e 🔧 Update config.ini script 2023-05-17 00:33:18 -05:00
Scott Lahteine
61d1ce7d2e 🧑‍💻 Change HAL_PATH macro for easier HAL relocation (#25743) 2023-05-17 00:33:18 -05:00
Scott Lahteine
3c9e8e1e60 🔧 Extra axis endstop defaults 2023-05-17 00:33:18 -05:00
Anson Liu
d5548556d3 🔨 Prevent SlowSoftWire + Wire name conflict (#25707) 2023-05-17 00:33:18 -05:00
Scott Lahteine
44b06d7561 📝 Developer note in boards.h 2023-05-17 00:33:18 -05:00
Scott Lahteine
ffe47a0197 🚸 Improve PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED (#25681) 2023-05-17 00:33:18 -05:00
Scott Lahteine
6a12937dec 🩹 Fix UBL safe measure move with extra axes
Followup to 7e79fc5b
2023-05-17 00:33:18 -05:00
Alexey D. Filimonov
00c96dc3cd 🎨 Clean up TFT Color UI display items (#25712)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-17 00:33:18 -05:00
Keith Bennett
7fb92f4e64 🚸 Permit G38 with Core (#25713) 2023-05-17 00:33:18 -05:00
Jay Robson
a93b3c1222 🐛 Fix G38 with Z, support 9 axes (#25691)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-17 00:33:18 -05:00
Keith Bennett
d75e016f3a 🔧 Check renamed LIN_ADVANCE_K (#25710) 2023-05-17 00:33:18 -05:00
ellensp
5426759a37 🩹 Correctly add JSON to mc.zip (#25706) 2023-05-17 00:33:18 -05:00
Scott Lahteine
a5b5db4819 🧑‍💻 Minor SpindleLaser::set_enabled tweak 2023-05-17 00:33:18 -05:00
Alexey D. Filimonov
15671a46d2 🩹 Fix Spindle/Laser ENA pin test (#25622) 2023-05-17 00:33:18 -05:00
Bob Kuhn
f62d47a165 🩹 Fix laser with no PWM compile (#25290) 2023-05-17 00:33:18 -05:00
Dennis Lawler
5b8be446a0 🚸 Echo G30 out-of-bounds (#25671) 2023-05-17 00:33:18 -05:00
Giuliano Zaro
df7d13a4d0 🩹 Bail on 'mc.zip' write error (#25695)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-17 00:33:18 -05:00
ellensp
8592035474 🔨 Fix, clean up STM32F1 envs (#25697)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-17 00:33:18 -05:00
Giuliano Zaro
5a3806633a 🐛 Fix Configuration Embedding (#25688) 2023-05-17 00:33:18 -05:00
ellensp
0ece7ca66d 🩹 Status / Host Prompt followup (#25720)
Followup to #25679

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-17 00:33:17 -05:00
Scott Lahteine
2fb47afa4a 🧑‍💻 HostUI::continue_prompt method 2023-05-17 00:33:17 -05:00
Scott Lahteine
d2e84e8446 🧑‍💻 Status Message cleanup 2023-05-17 00:33:17 -05:00
Scott Lahteine
3340491f90 🧑‍💻 JyersUI code cleanup 2023-05-17 00:33:17 -05:00
Scott Lahteine
d3991011e4 🧑‍💻 Apply simplified ?: 2023-05-17 00:33:17 -05:00
Scott Lahteine
02178bdcaf 🔧 Trigorilla / Chiron updates
Followup to c3f34e4e
2023-05-17 00:33:17 -05:00
Scott Lahteine
8bc6f7707d 🔨 Improve runout script check 2023-05-17 00:33:17 -05:00
Scott Lahteine
141cfdde2c 🩹 Fix AUTOFAN_CASE
Followup to #25554
2023-05-17 00:33:17 -05:00
Scott Lahteine
4781d57912 🔧 Move FIL_RUNOUT_PIN for Chiron + GLCD 2023-05-17 00:33:17 -05:00
Scott Lahteine
6ebbfa832c 🧑‍💻 Clarify G28 R / R0 2023-05-17 00:33:17 -05:00
Scott Lahteine
cbbcc01b47 🚸 Minor M43 improvements 2023-05-17 00:33:17 -05:00
David Fries
b5ccd65fb5 ️ Skip a redundant BLTouch::command (#25656) 2023-05-17 00:33:17 -05:00
Scott Lahteine
cf1f56f132 🔧 Move TFT sanity checks 2023-05-17 00:33:17 -05:00
Scott Lahteine
1e2de0e036 🎨 Detab some build files 2023-05-17 00:33:17 -05:00
Scott Lahteine
cf28f48481 🎨 Apply const (#25643) 2023-05-17 00:33:17 -05:00
ellensp
69e8f2ee99 🚸 Support CoreXY without Z (#25630) 2023-05-17 00:33:17 -05:00
Scott Lahteine
2be9f98b9f 📝 Update Ender # labels 2023-05-17 00:33:17 -05:00
Scott Lahteine
c2c1ff8da9 🧑‍💻 Update pinsformat.js 2023-05-17 00:33:17 -05:00
Scott Lahteine
e24087478d 🐛 Ensure root for 'M503 C' 2023-05-17 00:33:17 -05:00
Giuliano Zaro
641295032f 🌐 Update Italian language (#25587) 2023-05-17 00:33:17 -05:00
Scott Lahteine
466ce0b8d2 🩹 Fix displayed mix percentages 2023-05-17 00:33:17 -05:00
Scott Lahteine
59a2cb032f 🩹 Fix Ender-3 V2 with no fan 2023-05-17 00:33:17 -05:00
Chris Pepper
85e28f3123 🔨 MarlinSimUI updates (#25589) 2023-05-17 00:33:17 -05:00
John Unland
bbb75ab9b3 🔨 Improve Docker local tests support (#25583) 2023-05-17 00:33:17 -05:00
Andrew
637cd952ca 🎨 Remove unused ProUI : UBLValidMesh (#25591) 2023-05-16 19:54:19 -05:00
Scott Lahteine
d04b3ff802 🔧 Fix up WiFi options (#25586) 2023-05-16 19:54:19 -05:00
Scott Lahteine
51b33ccf90 🔨 INI Updates
Co-Authored-By: Martin Turski <turningtides@outlook.de>
2023-05-16 19:54:19 -05:00
Eduard Sukharev
f452df047d 🐛 Fix M23 long filename support (#25540) 2023-05-16 19:53:15 -05:00
Scott Lahteine
cd0bfcd3f2 🧑‍💻 Auto Fan / Cooler Fan updates (#25554) 2023-05-16 19:53:15 -05:00
Keith Bennett
bcf30988cb 🩹 Fix Touch Calibration first point (#25298) 2023-05-16 19:53:15 -05:00
Scott Lahteine
a40e17d94b 🎨 Timer tweaks 2023-05-16 19:53:15 -05:00
ellensp
d66f4baba6 🩹 Fix Chitu3D V6 default probe pin (#25552) 2023-05-16 19:53:15 -05:00
Scott Lahteine
26cb2d5b08 🩹 Update TRONXY_V10 SPI_FLASH pins 2023-05-16 19:53:15 -05:00
Scott Lahteine
376e940ae9 🎨 LPC_SOFTWARE_SPI => SOFTWARE_SPI
Co-Authored-By: Martin Turski <turningtides@outlook.de>
2023-05-16 19:53:15 -05:00
Scott Lahteine
ebe3fe0818 🎨 Pins header comments
Co-Authored-By: Martin Turski <turningtides@outlook.de>
2023-05-16 19:53:15 -05:00
Martin Turski
0d7e30bcd8 🩹 Reset touch screen calibration on failure (#25334)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-16 19:53:15 -05:00
Scott Lahteine
accfab85a2 🎨 calibration_stage => stage 2023-05-16 19:53:15 -05:00
Scott Lahteine
d68ad9e0b1 🩹 Fix a serial_ternary 2023-05-16 19:53:15 -05:00
ellensp
70c8859e7f 🩹 Fix Ender 2 stock LCD (#25538) 2023-05-16 19:53:15 -05:00
George Fu
980fba810d 🐛 Fix FYSETC Cheetah v2.0 Servo/Probe pins (#24635)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-05-16 19:53:15 -05:00
Scott Lahteine
d0bdb9c281 ️ Misc. optimizations 2023-05-16 19:53:15 -05:00
Davide Rombolà
821d7969f4 🎨 Suppress warning (#25529) 2023-05-16 19:53:15 -05:00
Scott Lahteine
dcbba65962 🧑‍💻 More IntelliSense-friendly declares 2023-05-16 19:53:15 -05:00
Michael Hill
5c3dd467c7 Sovol v1.3.1 (Sovol SV06) (#25267) 2023-05-16 19:53:15 -05:00
dwzg
e50980e32b 🩹 Fix DWIN MarlinUI Fan/E/XY (#25502) 2023-05-16 19:53:15 -05:00
Scott Lahteine
c3b037e0f3 🩹 Fan Menu / Status fixes
Followup to #21888
2023-05-16 19:53:15 -05:00
Abdullah YILMAZ
71e6f701f3 🌐 Update Turkish language (#25447) 2023-05-16 19:53:15 -05:00
Giuliano Zaro
7f9f922d84 🌐 Update Italian language (#25454) 2023-05-16 19:53:14 -05:00
Scott Lahteine
197b3198b5 📝 Fix a comment 2023-05-16 19:53:14 -05:00
jamespearson04
e03dfb8ca1 🐛 Fix UBL 'G29 J' mesh tilt (#25453)
Fix regression from #24214
2023-05-16 19:53:14 -05:00
Marcio T
cba3b2c527 🚸 Improve CocoaPress Touch UI (#25446) 2023-05-16 19:53:14 -05:00
ellensp
a9a6d1f716 📝 Link to archived RA Control Panel page (#25424) 2023-05-16 19:53:14 -05:00
Giuliano Zaro
61ccd4599e 🌐 Update Italian language (#25309) 2023-05-16 19:53:14 -05:00
Roman Moravčík
bab847809c 🌐 Update Slovak language (#25305) 2023-05-16 19:53:14 -05:00
ellensp
011087731a 🧑‍💻 Add IA_CREALITY CI test (#25434) 2023-05-16 19:53:14 -05:00
Scott Lahteine
b7ee06bb29 🔨 Use 'build_src_filter' 2023-05-16 19:52:39 -05:00
Scott Lahteine
5f8df0aa21 🔨 Fix thread-unsafe deque iteration 2023-05-16 15:50:05 -05:00
ellensp
b338159f9d 🐛 Fix MKS Robin Nano 1.3 F4 pin collision (#25838) 2023-05-16 13:56:13 -05:00
ellensp
2399a24466 🔧 Update thermocouple 2 pin sanity check (#25627) 2023-04-10 05:18:36 -05:00
ellensp
d05acb7626 🩹 Fix MARLIN_F446Zx_TRONXY variant (#25659)
Followup to 9be1554f
2023-04-10 04:20:48 -05:00
Chris Pepper
81d4f8f26a 🩹 Fix SD partitionTable packing (#25648) 2023-04-10 04:20:48 -05:00
Jason Smith
b0c3db67f0 🎨 Suppress M122 sign warning (#25613) 2023-04-10 04:18:49 -05:00
Eduard Sukharev
ea6430ddf6 🐛 Fix long filename read/report (#25509) 2023-04-07 18:14:07 -05:00
John Robertson
ccb4d11696 🔧 Sanity-check PRINTCOUNTER_SAVE_INTERVAL + ESP32 I2S Exp (#25527)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-04-07 18:12:07 -05:00
Keith Bennett
176ecf4f82 🐛 Fix Anet ET4 SD_SS_PIN (#25492) 2023-04-07 18:10:46 -05:00
Scott Lahteine
3ec5d6da6e ️ Exit from ISR on AVR already does sei
Co-Authored-By: tombrazier <68918209+tombrazier@users.noreply.github.com>
2023-04-07 18:10:45 -05:00
Keith Bennett
75aa880b63 BTT Octopus Max EZ 1.0, SKR 3.0 / 3.0 EZ (#25387, #25495, #25535) 2023-04-07 18:10:45 -05:00
Sion Williams
a50ff5d7c7 🔨 VSCode + Devcontainer support (#22420) 2023-04-07 17:56:54 -05:00
alextrical
504f09f944 🐛 Fix Flash EEPROM for STM32G0B1CB (#25469) 2023-04-07 17:55:46 -05:00
Hans-Christian Ebke
aae1102c54 🐛 Fix apply_power for SPINDLE_SERVO (#25465) 2023-04-07 17:55:46 -05:00
tombrazier
a40ff1357e 🐛 Fix LA retract/feedrate edge case (#25445)
Followup to #25442
2023-04-07 17:53:06 -05:00
Scott Lahteine
dfd1fb736d 🔨 Improve config.ini example fetch 2023-04-07 17:50:00 -05:00
Scott Lahteine
6d8c9f6ed1 🌐 Regenerate language data 2023-04-07 17:50:00 -05:00
Scott Lahteine
db0c8b31f7 🧑‍💻 Script to make non-accented languages 2023-04-07 17:50:00 -05:00
Scott Lahteine
0e3d951872 🔨 Update font scripts 2023-04-07 17:46:21 -05:00
ellensp
22e6365b2f 🔧 Fix Sensorless Probe sanity-check err (#25417) 2023-04-07 17:45:43 -05:00
tombrazier
abd710b5d6 🐛 Fix Linear Advance E position tracking (#25442)
Fix regression from #24951
2023-04-07 17:44:39 -05:00
tombrazier
d5c312cff0 🐛 Fix ISR_SHAPING_LOOP_CYCLES (#25335) 2023-04-07 17:41:52 -05:00
ellensp
64f9c17f3b 🔨 Fix 'step' type in createTemperatureLookupMarlin.py (#25455) 2023-04-07 17:41:52 -05:00
Keith Bennett
bac334c74e 🔨 Fix env STM32G0B1RE_btt, add …_manta_btt (#25431) 2023-04-07 17:36:33 -05:00
Scott Lahteine
071d54ec70 🎨 Use LIMIT macro 2023-04-07 17:35:39 -05:00
Guðni Már Gilbert
c4ac8a2573 ️ Reduce edit_screen code size (#25420) 2023-04-07 17:35:39 -05:00
Scott Lahteine
53698b8f62 🔧 Fix Einsy Rambo TMC driver check 2023-04-07 17:35:39 -05:00
Scott Lahteine
d5d497f2c5 🔨 Fix marlin_custom.* without lib_deps 2023-04-07 17:34:13 -05:00
tombrazier
e65e38afaf 🐛 Fix AVR maths used by Stepper (#25338) 2023-04-07 17:32:30 -05:00
ellensp
9d56b7f073 🔨 Encrypt some MKS Robin (#25349) 2023-04-07 17:29:53 -05:00
Scott Lahteine
1748abde0a 🧑‍💻 Fix preheat tests (nested macro limit ~256)
Followup to #25407
2023-04-07 17:28:37 -05:00
ellensp
7afd823aa5 🔧 Sanity-check hotend max / preheat temps (#25407)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-04-07 17:28:37 -05:00
ellensp
4a1cbffbe5 📺 Update Re-ARM VIKI2 SPI pins (#25411) 2023-04-07 17:28:37 -05:00
Scott Lahteine
94780bbb54 🚸 Interruptible PLR (#25395) 2023-04-07 17:28:37 -05:00
ellensp
838df37efd 🐛 Fix FastPWM calculations (#25343)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-04-07 17:28:37 -05:00
Trevin Small
7a8c9847e6 ✏️ Fix README typo (#25388) 2023-04-07 17:28:37 -05:00
Scott Lahteine
50f4e6b270 🎨 Tweak VALIDATE_MESH_TILT 2023-04-07 17:22:46 -05:00
Frederik Kemner
db8f501dfe 🚸 SPI endstops for X/Y Dual and Core (#25371) 2023-04-07 17:22:46 -05:00
Radek
255bc3c90c 📝 Fix BTT_MINI_12864_V1 comment (#25366) 2023-04-07 17:19:49 -05:00
Scott Lahteine
38c4c7f4b1 🔨 Suppress native build warnings 2023-04-07 17:18:17 -05:00
EvilGremlin
fecb66779a 🔨 Adjust INI comments (#25183) 2023-04-07 17:18:17 -05:00
Scott Lahteine
f7485cea60 🩹 Extra axis min home with Delta Sensorless Probe 2023-04-07 17:18:17 -05:00
Scott Lahteine
a49d286118 🩹 Extra axes for Tool Change 2023-04-07 17:18:17 -05:00
Scott Lahteine
59c8857564 🩹 Various simple fixes 2023-04-07 17:18:17 -05:00
Scott Lahteine
6e38ec3a3e 🩹 Safe Bed Leveling updates 2023-04-07 17:18:17 -05:00
Scott Lahteine
93c61b1ba8 🩹 Misc. extra axis updates 2023-04-07 17:17:25 -05:00
Scott Lahteine
87d7449952 🩹 Use 'M205 D' when 'B' is an axis 2023-04-07 17:15:17 -05:00
Scott Lahteine
98c9ecd5c5 🔧 Add a test for extra axes 2023-04-07 17:01:32 -05:00
Keith Bennett
8976bc5605 BigTreeTech Manta M4P, M5P, M8P V1.0 / 1.1, E3 EZ (#25001) 2023-04-07 17:01:32 -05:00
Victor Oliveira
e3cff7a28a 🧑‍💻 General 'MediaFile' type alias (#24424) 2023-04-07 17:01:32 -05:00
vyacheslav-shubin
4000db2be3 🧑‍💻 Add SD Card 'hide' method for dev usage (#22425) 2023-04-07 17:01:32 -05:00
Keith Bennett
f9621e2e8e 📝 Fix Z*_ENDSTOP_ADJUSTMENT comments (#25295) 2023-04-07 17:01:32 -05:00
kg333
1a184e5a82 📺 Melzi v4 with BTT SKR Mini E3 (#25321) 2023-04-07 17:01:32 -05:00
Martin Turski
6e427350db 🔨 Fix test build path with spaces (#25329) 2023-04-07 17:01:32 -05:00
Bob Kuhn
79e23752ae 🔧 Fix SD sorting sanity checks (#25318) 2023-04-07 17:01:32 -05:00
Scott Lahteine
858de4ff3f 🔧 Fix build with no Y axis (#25311) 2023-04-07 16:49:35 -05:00
Bob Kuhn
bac0b35b85 🩹 Fix G61 axis parameters with no offset (#25312) 2023-04-07 16:48:57 -05:00
Darren Garnier
60f3857662 🔨 Fix config.ini URL fetch (#25313) 2023-04-07 16:46:17 -05:00
avionix-g
b3c004eed9 🐛 Fix MKS board Ultipanel support (#25278) 2023-04-07 16:44:22 -05:00
xBiohazardx
9e755a25c7 ✏️ Fix probe invert flag (#25282) 2023-04-07 16:43:19 -05:00
Scott Lahteine
0d831183ba 🔧 Refine Input Shaping check (#25280) 2023-04-07 16:39:22 -05:00
Scott Lahteine
0ed083aba8 SDIO retry, hsd clock, etc. 2023-04-07 16:33:39 -05:00
Scott Lahteine
2c39f84888 🔧 Overridable Stepper EN init 2023-04-07 16:33:15 -05:00
Bob Kuhn
b7e421610f 🐛 Fix Ender-2 Stock Display with Melzi (#25258) 2023-04-07 16:30:56 -05:00
MarkMan0
536e8a7d1e 🐛 Fix, Refactor PID scaling (#25096) 2023-04-07 16:28:42 -05:00
John Robertson
8c3425811a 🐛 Fix potential I2S buffer overwrite (#25113) 2023-04-07 16:26:13 -05:00
Scott Lahteine
dd892c6e75 🎨 Heading cleanup 2023-04-07 16:25:33 -05:00
Scott Lahteine
947a9cb000 🎨 Language / menu cleanup 2023-04-07 16:25:33 -05:00
Scott Lahteine
62487c67b6 ✏️ ProUI followup 2023-04-07 16:25:33 -05:00
Scott Lahteine
6cf085d724 🔧 Added MOTHERBOARD error text 2023-04-07 16:20:37 -05:00
Scott Lahteine
c3c6432be4 🎨 Misc. formatting 2023-04-07 16:16:28 -05:00
Scott Lahteine
e7c4a86830 🧑‍💻 Fix D5 warning 2023-01-23 01:36:10 -06:00
Scott Lahteine
dd518f0ce1 🐛 Fix homing_needed_error 2023-01-23 01:36:10 -06:00
Scott Lahteine
d62119ea5b 🔧 Input Shaping sanity checks 2023-01-12 05:24:27 -06:00
Scott Lahteine
71cb723746 🩹 Fix Sim with USE_WATCHDOG disabled 2023-01-12 05:24:27 -06:00
Scott Lahteine
58d94f407b 🔨 Improve config.ini parser 2023-01-12 05:24:17 -06:00
Alex Z
82f7c373c5 🐛 Fix Chitu V6 Z_STOP_PIN (#25227) 2023-01-12 05:24:06 -06:00
Miguel Risco-Castillo
1e9e92368f 🚸 ProUI updates (#25176) 2023-01-12 05:22:17 -06:00
Sebastien BLAISOT
9a22c21b5b 🐛 Fix Neopixel 1 startup (#25203) 2023-01-12 05:20:53 -06:00
Vlad Popescu
885b553416 🩹 Fix E3V2 MarlinUI XYZ frame (#25206) 2023-01-12 05:20:27 -06:00
Richard Layton
9ff2818ce4 📝 Linux Sim apt-get line (#25208) 2023-01-12 05:20:22 -06:00
Richard Layton
5ff467c8c0 📝 More native.ini docs (#25201) 2023-01-12 05:20:02 -06:00
ellensp
f16fdd7814 🩹 Update MKS_GEN_13 MOSFET pins (#25126) 2023-01-12 05:20:02 -06:00
ellensp
e872b575f8 🩹 Replace pow() with _BV() (#25186) 2023-01-12 05:20:02 -06:00
Mike Bignell
8b5014f264 🩹 Fix missing IS_MELZI (#25190) 2023-01-12 05:20:02 -06:00
Ashley 'DrToxic' Devine
9ff1c30745 🎨 Misc. cleanup (#25194)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2023-01-12 05:20:02 -06:00
Vovodroid
a286daf697 🚸 Attach USB media (#25120) 2023-01-12 05:20:02 -06:00
Scott Lahteine
9383c2aa76 🧑‍💻 Add Temperature::is_above_target 2023-01-12 05:20:02 -06:00
Scott Lahteine
58e9dc0cbf 🎨 Rename *_temp_error to *temp_error 2023-01-12 05:20:02 -06:00
Timothy Hoogland
5e69a3dbf4 🩹 Remove extraneous EZBoard V1 autofans (#25182) 2023-01-03 18:53:19 -06:00
Scott Lahteine
c990a35bb0 🎨 Misc. IS cleanup 2023-01-03 04:20:20 -06:00
Giuliano Zaro
f2017d4111 🚸 MarlinUI edit steps/mm to 2 decimal places (#25144) 2023-01-03 04:20:20 -06:00
ellensp
c5f95bfe97 🧑‍💻 Fix type warning (#25149) 2023-01-03 04:20:20 -06:00
ellensp
f13d7f27d1 🔨 FILAMENT_RUNOUT_SCRIPT sanity check (#25150) 2023-01-03 04:20:20 -06:00
Lukas Erlacher
b1099b1c65 🔧 Add H8 to Creality 4.2.2 stepper warning (#25154) 2023-01-03 04:20:20 -06:00
Lukas Erlacher
44e20d2d6a 🚸 Z Servo Probe is HAS_STOWABLE_PROBE (#25158) 2023-01-03 04:20:20 -06:00
Timothy Hoogland
c54c8c2254 🩹 Remove extraneous EZBoard V2 autofans (#25166) 2023-01-03 04:20:20 -06:00
Scott Lahteine
bcb0a370a5 🚸 Hide IS menu while busy 2023-01-03 04:20:20 -06:00
Vlad Popescu
da43218d76 🐛 Avoid lambda for menu items (#25169) 2023-01-03 04:20:20 -06:00
Stefan Kalscheuer
d71a60a14b 🐛 Fix Mesh Bed Leveling Z correction (#25122) 2023-01-03 04:20:15 -06:00
Keith Bennett
246f001521 📝 Fix Configs URL (#25167) 2022-12-30 21:06:35 -06:00
Scott Lahteine
a039081728 🧑‍💻 Fix ONBOARD_FLASH_SIZE 2022-12-20 21:15:14 -06:00
Scott Lahteine
3334582f86 🔖 Version 2.1.2 2022-12-19 14:42:28 -06:00
Scott Lahteine
b2d72de494 📝 Update 2.1.x README 2022-12-19 14:41:09 -06:00
Scott Lahteine
cfa747ed08 🧑‍💻 M593 F "min" freq 2022-12-18 15:49:20 -06:00
Scott Lahteine
92b2076dda 🐛 Fix Melzi encoder 2022-12-18 15:49:20 -06:00
Scott Lahteine
eff6c407a5 🩹 Fix LCD_FOR_MELZI with Tronxy Melzi 2022-12-17 22:17:38 -06:00
EvilGremlin
569bbb18d0 🐛 Fix DOGM time overflow, alignment (#25103) 2022-12-17 22:17:38 -06:00
ellensp
471330b56e 🎨 Suppress warning (#25101) 2022-12-17 22:17:38 -06:00
ellensp
2a724bd94e BTT Octopus with STM32-F407 (#25031) 2022-12-17 22:17:38 -06:00
alextrical
cea2ab1d7f BigTreeTech EBB42 v1.1 (#24964) 2022-12-17 22:17:38 -06:00
ils15
5198a55457 🔧 Use multi-XYZ 'STOP' pins for MIN/MAX (#24855)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-17 22:17:38 -06:00
Scott Lahteine
cbb56e3536 Robin Nano v1 CDC (USB mod)
Followup to #24619
2022-12-17 22:17:38 -06:00
Dipl.-Ing. Raoul Rubien, BSc
b3f4eaf6fd 🩹 Fix M115_GEOMETRY_REPORT (#25092) 2022-12-16 14:23:26 -06:00
ellensp
7815b20051 🩹 Inverted probe pin flag (K8400) (#25085) 2022-12-16 14:23:26 -06:00
Scott Lahteine
ffbf6acd6c 🩹 Fix M502 init of default motion
Fix regression from #25035
2022-12-16 14:23:26 -06:00
alextrical
8bafc1d9ae 🩹 Use custom I2C pins for OLED (#24970) 2022-12-16 14:23:26 -06:00
Bart Meijer
ac05f0cb8b SAMD21 HAL / Minitronics v2.0 (#24976) 2022-12-16 14:23:26 -06:00
Alexander Gavrilenko
ec6349f2ac TFT_COLOR_UI async DMA SPI (#24980) 2022-12-16 14:23:26 -06:00
Scott Lahteine
d082223fee 📝 Replace Twitter with Fosstodon 2022-12-16 14:23:26 -06:00
Simon Pilepich
e07a059b2d 🔧 Anycubic alternate Z1/Z2 wiring (#25071) 2022-12-16 14:23:26 -06:00
Krzysztof Błażewicz
313716e7fc JyersUI TMC Settings (#25048) 2022-12-16 14:23:26 -06:00
Keith Bennett
726555901c 🔧 Custom Menu Sanity Check (#25079) 2022-12-16 14:23:26 -06:00
Scott Lahteine
3ad684b10b 🔨 Updated 'mfconfig init' 2022-12-16 14:23:26 -06:00
ellensp
408a53bcdd 🔨 No env:mega1280 for MIGHTYBOARD_REVE (#25080) 2022-12-16 14:23:26 -06:00
tombrazier
eae339b8dc ️ Better IS buffer size calc (#25035) 2022-12-16 14:23:25 -06:00
Vovodroid
79b88471f0 Two controller fans (#24995) 2022-12-16 14:23:25 -06:00
ellensp
86a3362bf6 📌 Pins updates for Longer LK5, etc. (#25012)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:23:25 -06:00
EvilGremlin
0efeedf262 🚸 Progress display followup (#24879) 2022-12-16 14:23:25 -06:00
Sebastien BLAISOT
c86f20010d M150 S default index (#23066)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:23:25 -06:00
Scott Lahteine
5a97ffc414 🔨 Return error on mftest exit 2022-12-16 14:23:25 -06:00
Scott Lahteine
2737286021 📝 Update config comments 2022-12-16 14:23:25 -06:00
ellensp
86a10dc459 🐛 Fix Fast PWM on AVR (#25030)
Followup to #25005
2022-12-16 14:23:25 -06:00
kisslorand
ecdf07f055 ✏️ Fix missing ) (#25055) 2022-12-16 14:23:25 -06:00
Scott Lahteine
686ce0c0e2 🔨 Fix CI Test clean step (2) 2022-12-16 14:23:25 -06:00
Scott Lahteine
3c550e0f19 🎨 Misc. cleanup 2022-12-16 14:23:25 -06:00
Scott Lahteine
071dae0c28 🔨 Fix CI Test clean step 2022-12-16 14:23:25 -06:00
tombrazier
df2a2488a8 🐛 Fix TMC5160 + Input Shaping overcurrent (#25050) 2022-12-16 14:23:25 -06:00
Taylor Talkington
c3090bd4e8 🩹 Ender 3v2 DWIN MarlinUI Fixup (#24984) 2022-12-16 14:23:25 -06:00
Scott Lahteine
0fadb56150 🎨 Trailing whitespace 2022-12-16 14:23:25 -06:00
ellensp
eb125c95b6 🔨 Update renamed.ini (#25042) 2022-12-16 14:23:25 -06:00
ellensp
26edeefeb9 🩹 Fix MSG_MOVE_N_MM substitution (#25043) 2022-12-16 14:23:25 -06:00
kisslorand
96b8c28376 🚸 G30 move to logical XY (#24953) 2022-12-16 14:23:25 -06:00
Scott Lahteine
db3865520f 🎨 Misc. cleanup 2022-12-16 14:23:25 -06:00
Scott Lahteine
51c1645ceb 🧑‍💻 Use spaces indent for Python 2022-12-16 14:23:25 -06:00
トトも
5eb39d5277 📝 Formatted Team Overview (#25029) 2022-12-16 14:23:25 -06:00
Scott Lahteine
0537e78572 🐛 Fix G-code resend race condition
As pointed out in #24972 by @silycr, but simplified.
2022-12-16 14:23:25 -06:00
Taylor Talkington
95019bf526 Ender-3 V2 DWIN for BTT Octopus V1.1 (#24983) 2022-12-16 14:23:25 -06:00
Chris Bagwell
6f5ad55953 ️ More SCURVE cycles on unoptimized cortex-m0 (#24955) 2022-12-16 14:23:25 -06:00
tombrazier
57f6c93192 ️ Input Shaping improvements (#24951) 2022-12-16 14:23:25 -06:00
Trivalik
d2ece1e713 🐛 Fix missing va_end in UnwPrintf (#25027) 2022-12-16 14:23:25 -06:00
studiodyne
12017887f4 🐛 Fix MILLISECONDS_PREHEAT_TIME / mintemp (#24967) 2022-12-16 14:23:25 -06:00
Marcio T
3a28a1fd1d 🩹 Fix ADVANCE_K + DISTINCT_E_FACTORS sanity check (#25007) 2022-12-16 14:23:25 -06:00
Manuel McLure
360e03797f 🔧 Merge TMC26X with TMC config (#24373) 2022-12-16 14:23:25 -06:00
Radek
6185b50dbe 🐛 Fix SKR mini E2 V2 + BTT_MINI_12864_V1 (#24827)
See https://github.com/bigtreetech/BIGTREETECH-SKR-mini-E3/issues/686#issuecomment-1296545443
2022-12-16 14:23:25 -06:00
Vasily Evseenko
b2b8407a75 🍻 Fix Z increase on toolchange without UBL (#22942) 2022-12-16 14:23:25 -06:00
ellensp
c1684a1dbe 🩹 Fix UBL menu compile (#25020) 2022-12-16 14:23:25 -06:00
mikemerryguy
7d0f1dd17c 🚸 Add 50mm manual move (#24884) 2022-12-16 14:23:25 -06:00
Thomas Buck
b6051fe847 🚸 Optional Cutter/Laser status for HD44780 (#25003) 2022-12-16 14:23:25 -06:00
Tanguy Pruvot
b9bed1ca69 🚸 COLOR_UI sleep timeout / setting (#24994) 2022-12-16 14:23:25 -06:00
ellensp
b8ba9d60bb 🔧 Fix TPARA (…SCARA, DELTA) settings (#25016) 2022-12-16 14:23:25 -06:00
Tanguy Pruvot
8fd42eeeb6 ✏️ Fix Robin nano env typo (#24993) 2022-12-16 14:23:25 -06:00
ellensp
19b73a6f29 📺 FYSETC_MINI_12864_2_1 with BTT_SKR_E3_DIP (#24986) 2022-12-16 14:23:25 -06:00
ellensp
db60e0e7dc 🩹 Fix planner typo (#24977) 2022-12-16 14:23:25 -06:00
ellensp
505d73d2ba 🐛 MKS_MINI_12864 on SKR 1.3 needs FORCE_SOFT_SPI (#24850) 2022-12-16 14:23:25 -06:00
EvilGremlin
d05419a8d9 🔧 Check Delta homing direction (#24865) 2022-12-16 14:23:25 -06:00
phigjm
9772f7806b 🩹 Fix SERVICE_INTERVAL reset (#24888) 2022-12-16 14:23:25 -06:00
Marcio T
473d2b888a Fix FAST_PWM_FAN / TouchUI with NO_MOTION_BEFORE_HOMING (#25005)
Fix regressions from #20323, #23463
2022-12-16 14:23:25 -06:00
ellensp
968f04defb 🩹 Fix 2 thermocouples (#24982)
Followup to #24898
2022-12-16 14:23:25 -06:00
Scott Lahteine
30a885a7ef 🐛 Fix M808 starting count
Reported by adcurtin on Discord
2022-12-16 14:23:25 -06:00
Justin Hartmann
847391cfc1 🩹 Fix Overlord compile (#24947) 2022-12-16 14:23:25 -06:00
Pascal de Bruijn
6ea192abe9 🚸 M306: Indicate MPC Autotune (#24949) 2022-12-16 14:23:25 -06:00
ellensp
0de4ec4099 🩹 Allow max endstops MKS Monster 8 V2 (#24944) 2022-12-16 14:23:25 -06:00
Scott Lahteine
c9fa680db9 🐛 Fix Anycubic / Trigorilla pins, etc. (#24971) 2022-12-16 14:23:25 -06:00
Scott Lahteine
379d388b07 🎨 Prefer axis element over index 2022-12-16 14:23:25 -06:00
Scott Lahteine
7002e72f1c 🩹 Fix EEPROM write for !LIN_ADVANCE
Fixes #24963
Followup to #24821
2022-12-16 14:23:25 -06:00
Scott Lahteine
fc2f3cdf40 🩹 MAX Thermocouple followup
Followup to #24898
2022-12-16 14:23:25 -06:00
Scott Lahteine
7feeffdf06 🩹 leds.update needed for reset_timeout
Followup to #23590
2022-12-16 14:23:25 -06:00
Scott Lahteine
ac5464c37c 🧑‍💻 More direct encoder spin 2022-12-16 14:23:25 -06:00
Scott Lahteine
a121c80e1a 🎨 Update SAMD51 headers 2022-12-16 14:23:25 -06:00
Scott Lahteine
2778b00765 🎨 Format some lib-uhs3 code 2022-12-16 14:23:25 -06:00
ellensp
4737af7d70 📌 ZRIB V52-V53 Servo Pins (#24880) 2022-12-16 14:23:25 -06:00
InsanityAutomation
38375cf7a7 Tenlog MB1V23 IDEX board (#24896) 2022-12-16 14:23:25 -06:00
Giuliano Zaro
ddec5faf5a 🌐 Update Italian language (#24915) 2022-12-16 14:23:25 -06:00
ellensp
cbdafd36e0 📌 Remove unused RX/TX pins (#24932) 2022-12-16 14:23:25 -06:00
Keith Bennett
9f5b0b8567 🔧 Update Display Sleep LCD Check (#24934) 2022-12-16 14:23:25 -06:00
Justin Hartmann
d9ffae6578 🩹 Buttons Followup (#24935)
Followup to #24878
2022-12-16 14:23:25 -06:00
Scott Lahteine
1540e8e1d4 🩹 Allow for last non-servo extruder 2022-12-16 14:23:25 -06:00
ellensp
9a4715f31a 🐛 Fix move_extruder_servo (#24908) 2022-12-16 14:23:25 -06:00
InsanityAutomation
a9969d92ea 🐛 Fix FTDUI Status Screen Timeout (#24899) 2022-12-16 14:23:25 -06:00
Manuel McLure
d87d7474c9 🩹 Fix spurious "bad command" (#24923) 2022-12-16 14:23:25 -06:00
Scott Lahteine
4ce2f1e5ba 🩹 Fix M593 report 2022-12-16 14:23:25 -06:00
kurtis-potier-geofabrica
44636f3b74 🚸 Up to 3 MAX Thermocouples (#24898) 2022-12-16 14:23:24 -06:00
Scott Lahteine
e812540f26 🔧 Clean up unused ESP_WIFI pins 2022-12-16 14:23:24 -06:00
tombrazier
c1f0f26bff 🚀 ZV Input Shaping (#24797) 2022-12-16 14:23:24 -06:00
Scott Lahteine
5765449867 🔨 gcc-12 for macOS native 2022-12-16 14:23:24 -06:00
InsanityAutomation
c8b2d0c0fd Controllerfan PWM scaling, kickstart (#24873) 2022-12-16 14:23:24 -06:00
silycr
bdd5da5098 🚸 Probe pins for Chitu V5 (#24910) 2022-12-16 14:23:24 -06:00
ellensp
4d9bf91edc 🔧 Some STM32 UART Sanity Checks (#24795) 2022-12-16 14:23:24 -06:00
Scott Lahteine
682a9b6fbe 🎨 Misc. variant cleanup, translation
Followup to #24787
2022-12-16 14:23:24 -06:00
InsanityAutomation
a913b2437b 🐛 Fix Print Timer stop with MarlinUI abort (#24902) 2022-12-16 14:23:24 -06:00
ellensp
6b1d738995 🔧 No Native USB on AVR (#24906) 2022-12-16 14:23:24 -06:00
Scott Lahteine
dd224b4eb9 🧑‍💻 Pins and debug list cleanup (#24878) 2022-12-16 14:23:24 -06:00
Scott Lahteine
2e2abbcb48 🎨 CONF_SERIAL_IS => SERIAL_IN_USE 2022-12-16 14:23:24 -06:00
ellensp
485fb77596 Tronxy v10 (#24787) 2022-12-16 14:22:44 -06:00
Keith Bennett
29294007ef 🔧 No Sleep for CR-10 Stock Display (#24875) 2022-12-16 14:22:44 -06:00
karliss
256ac01ca2 🐛 Fix compile without Y/Z (#24858)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:22:44 -06:00
Keith Bennett
ca1968a842 🔧 Check Sensorless Homing on all axes (#24872) 2022-12-16 14:22:44 -06:00
InsanityAutomation
6a084e3704 🐛 Fix bed/chamber PID P edit (#24861) 2022-12-16 14:22:44 -06:00
Scott Lahteine
9ae0789166 🎨 HAS_SPI_FLASH => SPI_FLASH 2022-12-16 14:22:44 -06:00
Dan Royer
031ff2d024 🐛 Fix and improve Polargraph (#24847)
Co-Authored-By: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:22:44 -06:00
ellensp
b3e7d1e91e 🐛 Fix operators for V axis (#24866)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:09:29 -06:00
mjbogusz
f39f4d0288 🩹 Fix TFT LCD in Simulation (#24871) 2022-12-16 14:09:26 -06:00
Scott Lahteine
a4d58e8876 🎨 MMU2 cleanup 2022-12-16 14:09:23 -06:00
Scott Lahteine
c52cf77d0a 🐛 Fix M876 without emergency parser
Fix regression from 1fb2fffdbf
2022-12-16 14:09:19 -06:00
adam3654
bfcb8c704a DOGM Display Sleep (#24829) 2022-12-16 14:09:16 -06:00
EvilGremlin
0047b3064d 🩹 Fix temperature include (#24834) 2022-12-16 14:09:12 -06:00
Scott Lahteine
5c195078ff 🎨 Misc. variant cleanup 2022-12-16 14:09:09 -06:00
Scott Lahteine
1a6f9daee8 🧑‍💻 Min and max for base types 2022-12-16 14:09:06 -06:00
EvilGremlin
505f0a647e MKS SKIPR board (#24791) 2022-12-16 14:08:55 -06:00
Scott Lahteine
62b7db9bb7 🔨 Update mfinfo for 2.1.x 2022-12-16 14:08:52 -06:00
Scott Lahteine
3c870f2d4b 🧑‍💻 Min and max for base types 2022-12-16 14:08:48 -06:00
Giuliano Zaro
0203e32c73 ADVANCE_K per-extruder (#24821)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:08:45 -06:00
EvilGremlin
8481264566 ♻️ Set Progress without LCD (#24767)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:08:40 -06:00
EvilGremlin
b0f02b8f9e 🩹 Fix Color UI touchscreen sleep (#24826) 2022-12-16 14:08:36 -06:00
Adam
d6ff8f0062 🩹 Fix Switching Toolhead compile (#24814) 2022-12-16 14:08:33 -06:00
ellensp
8b37b60e58 🧑‍💻 Einsy Rambo EXP headers (#24825) 2022-12-16 14:08:29 -06:00
ellensp
5c68d26d4e 🔨 Detect feature parsing error (#24824) 2022-12-16 14:08:26 -06:00
ellensp
74435b0dcb Creality v5.2.1 board (#24815)
Followup to #24760
2022-12-16 14:08:23 -06:00
Keith Bennett
f17a07df99 🔧 Thermistor (66) sanity-check (#24803) 2022-12-16 14:08:20 -06:00
Eduardo José Tagle
a58f27763f 🐛 Fix DUE compile and errors (#24809) 2022-12-16 14:08:17 -06:00
Scott Lahteine
5aca6ff4f2 🩹 Fix some vector_3 cast operators 2022-12-16 14:08:13 -06:00
Keith Bennett
7b000966f0 🔧 Update Creality 4.2.2 Driver Warning (#24806) 2022-12-16 14:08:10 -06:00
ellensp
6ae0708840 🩹 Disable DEBUG_DGUSLCD (#24798) 2022-12-16 14:08:04 -06:00
Yuri D'Elia
44e4a9c7b1 🎨 Remove non-const compare operators (#24810) 2022-12-16 14:07:59 -06:00
Plynix / Ben Hartiwch
215fcefc1b Creality v5.2.1 board (#24760) 2022-12-16 14:07:56 -06:00
discip
827f9ae792 Pt1000 with 2k2 pullup (SKR 3 / EZ) (#24790) 2022-12-16 14:07:52 -06:00
ellensp
e44f156535 ✏️ Followup for M524 (#24775)
Followup to #24761
2022-12-16 14:07:49 -06:00
Stuart Pittaway
f1a05d19b0 🚸 UUID fallback to STM32 device SN (#24759)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-12-16 14:07:45 -06:00
Keith Bennett
a7a493d795 📌 Specify MarlinFirmware/U8glib (#24792) 2022-12-16 14:07:38 -06:00
Renaud11232
d9967f5395 🔨 Fix LPC1768 autodetect path on Linux (#24773) 2022-12-16 14:07:34 -06:00
Stefan Kalscheuer
5ee74668cf Anycubic i3 Mega LCD file menu fix (#24752) 2022-12-16 14:07:23 -06:00
studiodyne
be149336f0 M217 G wipe retract length 2022-12-16 14:07:08 -06:00
studiodyne
1f72c8341f XY_COUNTERPART_BACKOFF_MM 2022-12-16 14:07:04 -06:00
studiodyne
3d03f96205 RGB_STARTUP_TEST 2022-12-16 14:06:59 -06:00
tombrazier
c996bfddb7 Permit Linear Advance with I2S Streaming (#24684) 2022-12-16 14:06:54 -06:00
Scott Lahteine
647d459a15 Robin Nano v1 CDC (USB mod)
Followup to #24619
2022-12-16 14:06:19 -06:00
Scott Lahteine
29156ffe5d 🐛 Fix recalculate_max_e_jerk 2022-11-09 20:54:40 -06:00
ellensp
eff60964da 🐛 Fix VW axis fields in types.h (#24780) 2022-09-23 00:17:24 -05:00
Giuliano Zaro
5fe1f66478 🚸 Strict index 2 for M913 / M914 XY (#24680) 2022-09-22 13:27:31 -05:00
Arkadiusz Miśkiewicz
2fc97aa240 🚸 Emergency Parse M524 (#24761) 2022-09-22 13:27:31 -05:00
Giuliano Zaro
aa28358267 🐛 Fix / refactor shared PID (#24673)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-09-22 13:27:31 -05:00
Chris Bagwell
e04e18a590 🧑‍💻 STM32G0B1RE Pins Debugging (#24748) 2022-09-22 13:27:31 -05:00
Eduard Sukharev
bdb7f3af3f 🩹 Fix MKS TinyBee + MKS MINI 12864 SD blank on write (#24670) 2022-09-22 13:27:31 -05:00
Eduard Sukharev
2f24c31454 🚸 Sanity check Integrated Babystepping + I2S stream + ESP32 (#24691) 2022-09-22 13:27:31 -05:00
George Fu
96d050c7ba FYSETC SPIDER KING407 (#24696) 2022-09-22 13:27:31 -05:00
ellensp
aabd3e9e19 BTT SKR Mini E3 V3.0.1 (#24722) 2022-09-22 13:27:31 -05:00
XDA-Bam
38b3105900 ️ Minor planner optimization (#24737) 2022-09-22 13:27:31 -05:00
Arkadiusz Miśkiewicz
02810616cc 🚸 On pause report "SD printing byte X/Y" (#24709) 2022-09-22 13:27:31 -05:00
Arkadiusz Miśkiewicz
7daff755f2 🩹 Report M22 / M23 success / fail (#24706) 2022-09-22 13:27:31 -05:00
Gurmeet Athwal
53564fb6f3 🚸 M115 spindle/laser (#24681, #24747) 2022-09-22 13:27:31 -05:00
ellensp
9d9f303c5e 📺 FYSETC Mini 12864 2.1 pins for Creality V4 (#24624) 2022-09-22 13:27:31 -05:00
FBN
b9428bf087 🚸 More automatic MMU2 load (#24750, #24770) 2022-09-22 13:27:08 -05:00
Yuri D'Elia
0642cd8a83 👷 Array macros to …26 elements (#24789) 2022-09-22 13:26:50 -05:00
Scott Lahteine
d2b1467ab3 🌐 Some short menu strings 2022-09-22 13:26:26 -05:00
Keith Bennett
03aba439f6 ️ Only Sync Emulated EEPROM Print Counter (#24731) 2022-09-22 13:26:26 -05:00
Giuliano Zaro
85a47d61e6 🐛 Fix heater timeout PID output (#24682) 2022-09-22 13:17:54 -05:00
Scott Lahteine
78577b13cb 🧑‍💻 Microsteps to stepper.cpp 2022-09-22 13:17:54 -05:00
hartmannathan
b29cd4c510 📝 Fix example comment (#24744) 2022-09-22 13:17:54 -05:00
Scott Lahteine
0eb6a8d12e 📝 Fix comment 2022-09-22 13:17:54 -05:00
JoaquinBerrios
8a8218a8f2 ️ BTT SKR V3.0 / EZ = 480MHz (#24721) 2022-09-22 13:17:54 -05:00
Scott Lahteine
3a18ba0412 🔨 Fix config-labels.py 2022-09-22 13:17:54 -05:00
Scott Lahteine
2828f1d1db 🔨 Outdent py string 2022-09-22 13:17:54 -05:00
dmitrygribenchuk
63507acf98 🔨 Clean up Python imports (#24736) 2022-09-22 13:17:54 -05:00
ButchMonkey
cc2cc7d081 🔨 Fix config.ini custom items, and 'all' (#24720) 2022-09-22 13:17:54 -05:00
ButchMonkey
b676b43874 🔨 Fix configuration.py with encoding UTF-8 (#24719)
- Opening files with Windows-1252 encoding.
2022-09-22 13:17:54 -05:00
Stephen Hawes
2f1b89bd1f Opulo LumenPnP REV04 (#24718) 2022-09-22 13:17:54 -05:00
Keith Bennett
1a2e591d03 🔨 Update SKR 3 env (#24711) 2022-09-22 13:17:54 -05:00
Scott Lahteine
dc65e299fa 📝 Format some comments 2022-09-22 13:17:53 -05:00
EvilGremlin
033bca1773 🔨 Native USB modified env followup (#24669)
Followup to #24619
2022-09-22 13:17:53 -05:00
Bob Kuhn
e350acb360 🐛 Fix UBL regression (#24622)
Fix regression from #24188
2022-09-22 13:17:53 -05:00
Ruedi Steinmann
7d8d2e2c58 🩹 Fix a BUZZ (#24740) 2022-09-09 15:33:54 -05:00
Scott Lahteine
3c6b3e5af4 🔖 Config version 02010200 2022-08-29 19:25:38 -05:00
EvilGremlin
d5e9b25a31 🐛 Fix back button (#24694) 2022-08-29 19:17:32 -05:00
Scott Lahteine
9313c2fd18 ✏️ Fix http:// links 2022-08-29 19:17:31 -05:00
Lefteris Garyfalakis
d8a280bf53 ✏️ Fix LCD sleep conditional (#24685) 2022-08-29 19:17:31 -05:00
Miguel Risco-Castillo
d244389998 🩹 Constrain UBL within mesh bounds (#24631)
Fixes #24630
2022-08-29 19:17:31 -05:00
Keith Bennett
d140be0281 🚸 Up to 10 Preheat Constants (#24636) 2022-08-29 19:17:31 -05:00
ellensp
27bea56025 🔧 Fix Auto-Fan / Controller-Fan pin conflict check (#24648) 2022-08-29 19:17:31 -05:00
ellensp
98ee3fc2b5 🩹 Fix PID debug output (#24647) 2022-08-29 19:17:31 -05:00
Mark
e8394c391e 🐛 Fix Bed Distance Sensor reading (#24649) 2022-08-29 19:17:31 -05:00
Arkadiusz Miśkiewicz
e24d5f9315 M20_TIMESTAMP_SUPPORT (#24679)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-08-29 19:17:31 -05:00
EvilGremlin
ef1cf0d5a1 ♻️ Display sleep minutes, encoder disable option (#24618)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-08-29 19:17:31 -05:00
DejitaruJin
f088722ae8 🩹 Fix SainSmart LCD (#24672) 2022-08-29 19:17:31 -05:00
Keith Bennett
68c5e97fd7 🩹 Fix Freeze Feature (#24664) 2022-08-29 19:17:31 -05:00
Lefteris Garyfalakis
a8cf886aa5 🔨 Suppressible Creality 4.2.2 warning (#24683) 2022-08-29 19:17:31 -05:00
EvilGremlin
a31e65e30b Robin Nano v1 CDC (USB mod) (#24619) 2022-08-29 19:17:31 -05:00
Alexey Galakhov
d94a41527f 🐛 Fix JyersUI (#24652) 2022-08-29 19:17:31 -05:00
Keith Bennett
37a7da075f 🔧 Fix Skew Correction defaults (#24601) 2022-08-29 19:17:31 -05:00
Scott Lahteine
5145266b0d 🎨 Some automated cleanup 2022-08-29 19:17:31 -05:00
Keith Bennett
bdd5f3678e 📺 Add to MKS UI About Screen (#24610) 2022-08-29 19:17:31 -05:00
Keith Bennett
b4af335b7a 🔧 Remove STM32F4 Print Counter Sanity Check (#24605) 2022-08-29 19:17:31 -05:00
Protomosh
cfe1d52bf2 🐛 Fix DGUS Reloaded + STM32 (#24600) 2022-08-29 19:17:31 -05:00
Scott Lahteine
ff09ea13a4 🧑‍💻 Use spaces indent for Python 2022-08-29 19:17:31 -05:00
Scott Lahteine
d93c41a257 🔨 Misc. schema updates 2022-08-29 19:17:31 -05:00
Graham Reed
98e6aacbef 🔨 Fix LPC1768 automatic upload port (#24599) 2022-08-29 19:17:31 -05:00
Scott Lahteine
0adee8fae0 🩹 Fix strtof interpreting a hex value
Bug introduced in #21532
2022-08-29 19:17:31 -05:00
Scott Lahteine
c154302ece 🔨 Add args to schema.py 2022-08-29 19:17:31 -05:00
Scott Lahteine
b5ccddbe35 🎨 Fix '…if_chain' Uncrustify option 2022-08-29 19:17:31 -05:00
Scott Lahteine
d69893309e 🔨 Misc. config py updates 2022-08-29 19:17:31 -05:00
Scott Lahteine
fc3ea96ff9 🧑‍💻 Add operator== for C++20 2022-08-29 19:17:31 -05:00
Keith Bennett
3892d08b06 🧑‍💻 Fix UBL Build Mesh preheat items (#24598)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-08-29 19:17:31 -05:00
Ivan Kravets
857dc73be5 🔨 Fix a PlatformIO debug issue (#24569) 2022-08-29 19:17:31 -05:00
Scott Lahteine
419a145fa3 🔨 Update schema export 2022-08-08 04:42:19 -05:00
Scott Lahteine
398cae7625 🔖 Version 2.1.1 2022-08-06 18:50:49 -05:00
Scott Lahteine
8192cc12d3 🎨 Misc. config cleanup 2022-08-06 18:50:49 -05:00
ExtNeon
7f2a836251 SD Endstop Abort G-Code (#24461) 2022-08-06 18:50:49 -05:00
Mark
b02c3258b5 Bed Distance Sensor (#24554) 2022-08-06 18:50:49 -05:00
Keith Bennett
a0462eb017 🩹 Fix AUTO_FAN_PIN sanity check (#24593) 2022-08-06 18:50:49 -05:00
Scott Lahteine
a1704c10b9 🩹 G0/G1 S seen => seenval 2022-08-06 18:50:49 -05:00
qwertymodo
7196f13125 M150 K – Keep unspecified components (#24315) 2022-08-06 18:50:49 -05:00
J.C. Nelson
e06340abd1 🔨 Trigorilla Pro disk based update (#24591) 2022-08-06 18:50:49 -05:00
Travis Ziegler
98095ddad6 🩹 Fix LPC176x USB Host Shield (#24588) 2022-08-06 18:50:49 -05:00
Scott Lahteine
2f4b121709 👔 Keep "Needs: More Data" open 2022-08-06 18:50:49 -05:00
Ruedi Steinmann
a0409289c8 🚸 Laser with only PWM pin (#24345) 2022-08-06 18:50:49 -05:00
Scott Lahteine
2ccdc4f9ed 🧑‍💻 MARLIN_TEST_BUILD – for future use (#24077) 2022-08-06 18:50:49 -05:00
Scott Lahteine
bbf2033211 🔧 Config INI, dump options (#24528) 2022-08-06 18:50:49 -05:00
Scott Lahteine
9a42d1e577 🩹 Fix Malyan M300 with S-Curve compile
Fixes #24548
2022-08-05 21:54:27 -05:00
ellensp
17794e18ae 🔧 Update 644p/1284p Serial 1 sanity check (#24575) 2022-08-01 01:59:37 -05:00
Scott Lahteine
3b30951e83 🔨 Simplify scripts with pathlib (#24574) 2022-08-01 01:59:37 -05:00
Mike La Spina
c3f2586445 🐛 Fix laser menu enable_state (#24557) 2022-08-01 01:59:37 -05:00
InsanityAutomation
c0cb7e35af Configurable Switching Nozzle dwell (#24304) 2022-08-01 01:59:37 -05:00
tombrazier
fd319928d2 Fix, improve Linear Advance (#24533) 2022-08-01 01:59:37 -05:00
tombrazier
5dad7e0d03 🩹 Use _MIN/_MAX macros for native compatibility (#24570) 2022-08-01 01:59:37 -05:00
DerAndere
9ee558afe1 🐛 Fix kinematic feedrate (#24568) 2022-08-01 01:59:37 -05:00
Keith Bennett
bbaccd342e Encoder Noise Filter (#24538) 2022-08-01 01:59:37 -05:00
lukasradek
6134d55360 📝 README Updates (#24564) 2022-08-01 01:59:37 -05:00
Scott Lahteine
868e76b965 🎨 Renum boards.h 2022-08-01 01:59:37 -05:00
Scott Lahteine
5f105e254d 🐛 Fix M125 for 9 Axis 2022-08-01 01:59:37 -05:00
Scott Lahteine
9534c6e903 🎨 Misc. 'else' cleanup 2022-08-01 01:59:37 -05:00
Ludy
ec9a2ee557 🌐 Update German language (#24555) 2022-08-01 01:59:37 -05:00
Scott Lahteine
d8db00e31f 🧑‍💻 Update planner/stepper includes 2022-08-01 01:59:37 -05:00
Scott Lahteine
e7c262dc30 🩹 Fix lcd_preheat compile 2022-08-01 01:59:37 -05:00
Scott Lahteine
cee9da6132 🔨 Update build/CI scripts 2022-08-01 01:59:37 -05:00
Scott Lahteine
a24b9e16ff 🎨 PIO scripts cleanup 2022-08-01 01:59:37 -05:00
Keith Bennett
1e9232723d 📺 Fix TFT Classic UI non-Touchscreen 1024x600 (#24541) 2022-08-01 01:59:37 -05:00
Keith Bennett
66369f8236 🩹 Fix JyersUI include (#24540) 2022-08-01 01:59:37 -05:00
Keith Bennett
0ca76bf9ed 📝 Update MPCTEMP G-Code M306 T (#24535)
M306 simply reports current values. M306 T starts autotune process.
2022-08-01 01:59:37 -05:00
Scott Lahteine
0f3c3c419e Reinstate JyersUI 2022-08-01 01:59:37 -05:00
Scott Lahteine
89e9ae0662 🧑‍💻 Give the simulator Stepper access 2022-08-01 01:59:37 -05:00
Scott Lahteine
5b8f7686cb 🧑‍💻 Fix and improve build_all_examples 2022-08-01 01:59:37 -05:00
Scott Lahteine
6e02f15dd6 🔨 Minor build script changes 2022-08-01 01:59:37 -05:00
Scott Lahteine
c9445cfc41 🩹 Fix TFT image PACKED conflict 2022-08-01 01:59:37 -05:00
Frederik Kemner
beacb73d93 🩹 Fix gcode.h include (#24527) 2022-08-01 01:59:37 -05:00
InsanityAutomation
53a57ff7bf 🐛 Fix Archim2 USB Hang (#24314) 2022-08-01 01:59:37 -05:00
Scott Lahteine
d726f641a5 EXP header pin numbers redux (#24525)
Followup to 504fec98
2022-08-01 01:59:37 -05:00
InsanityAutomation
feafa321d7 🚸 Use Tool 0 for G30 (#24511) 2022-08-01 01:59:37 -05:00
ellensp
f5b972bb10 📺 SKR_MINI_SCREEN_ADAPTER for BTT SKR Mini E3 V3 (#24521) 2022-08-01 01:59:37 -05:00
Eduard Sukharev
196795c0cc More ESP32 (MKS TinyBee) tests (#24493) 2022-08-01 01:59:36 -05:00
Keith Bennett
c3085d666f 📝 Update Contributing Guide (#24320) 2022-08-01 01:59:36 -05:00
InsanityAutomation
807f2ef969 🚸 Machine-relative Z_STEPPER_ALIGN_XY (#24261)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-08-01 01:59:36 -05:00
Scott Lahteine
f752fe75ee ♻️ Small sound / buzz refactor (#24520) 2022-08-01 01:59:36 -05:00
Scott Lahteine
97a73147fa 🩹 Fix manual move titles (#24518) 2022-08-01 01:59:36 -05:00
tombrazier
915203f545 🩹 Arc/Planner optimization followup (#24509) 2022-08-01 01:59:36 -05:00
Scott Lahteine
173eb3ff71 🚸 Renumber EXP pins to match schematics/RRF/Klipper 2022-08-01 01:59:36 -05:00
Nikolay-Po
96d3c66b64 Steinhart-Hart C Coeff for Custom Thermistor (#24428) 2022-08-01 01:59:36 -05:00
tombrazier
cc4fc28fe0 ️ Optimize Planner calculations (#24484) 2022-08-01 01:59:36 -05:00
Arthur Masson
0a164a88fe Polargraph M665 settings (#24401) 2022-08-01 01:59:36 -05:00
GHGiampy
c72fe1a2f9 🩹 Add'l ProUI fixes (#24500, #24508) 2022-08-01 01:59:17 -05:00
Christophe Huriaux
2add8ca4eb eMotion-Tech eMotronic (Micro-Delta rework) (#24488) 2022-08-01 01:58:45 -05:00
Scott Lahteine
779c24122d 🔨 Update mfprep comment 2022-08-01 01:58:45 -05:00
Scott Lahteine
6ac3f2738e 🔨 Add mftest --default flag 2022-08-01 01:57:17 -05:00
Scott Lahteine
77c6d9af20 🩹 Fix TFT tImage struct packing 2022-08-01 01:57:11 -05:00
GHGiampy
929e12bf49 🔨 Remove log2file monitor filter (#24502) 2022-08-01 01:57:01 -05:00
Keith Bennett
fd18ac5667 📝 Update board MCU comments (#24486) 2022-07-29 18:42:42 -05:00
Scott Lahteine
06c1409843 🩹 Fix MAX31865 approximations
Followup to #24407
2022-07-29 18:42:42 -05:00
Scott Lahteine
ec95e66ff0 🔧 Base NUM_AXES on defined DRIVER_TYPEs (#24106) 2022-07-29 18:42:42 -05:00
Scott Lahteine
53ee7fce5b 🐛 Fix SDIO for STM32 (#24470)
Followup to #24271
2022-07-29 18:42:42 -05:00
Scott Lahteine
10f5f878ce 🚑️ Fix XYZEval = N not setting E 2022-07-29 18:42:42 -05:00
tombrazier
733ca940c0 🐛 Fix 2d mesh print (#24536) 2022-07-22 23:33:30 -05:00
Scott Lahteine
c880c7ed45 🔨 Fix and update Makefile
Followup to 89fe5f6d
2022-07-15 18:48:15 -05:00
Keith Bennett
e5e4cf920d 📌 Pin ESP32SSDP to 1.1.1 (#24489) 2022-07-15 18:48:15 -05:00
Victor Oliveira
3315f6faa4 Creality3D v4.2.5 / CR200B (#24491) 2022-07-15 18:48:15 -05:00
GHGiampy
4a6ad1c98b 🩹 Fix ProUI LED compile (#24473) 2022-07-15 18:48:15 -05:00
Miguel Risco-Castillo
3c9789fda8 🚸 Fix and update ProUI (#24477) 2022-07-15 18:48:15 -05:00
toomuchwonder
3a19d34c75 🩹 Fix MKS UI extruder speed (#24476) 2022-07-15 18:48:15 -05:00
Bob Kuhn
6b19a58f03 🔥 Drop STM L64** drivers, STEVAL_3DP001V1 (#24427) 2022-07-15 18:48:15 -05:00
Scott Lahteine
9283859b1e 🎨 ANY => EITHER 2022-07-15 18:48:15 -05:00
GHGiampy
e840015cad 🔨 Abort firmware update on transfer error (#24472, #24499) 2022-07-15 18:48:15 -05:00
Scott Lahteine
efe04e1016 🧑‍💻 Update Mac Sim directions 2022-07-15 18:48:15 -05:00
Scott Lahteine
f543b3cb84 📌 Ask for PlatformIO 6.1.1 or newer (#24435) 2022-07-15 18:48:15 -05:00
Keith Bennett
6a86c5bad3 MKS Monster8 V2 (#24483) 2022-07-15 18:48:15 -05:00
Scott Lahteine
7207a32434 🧑‍💻 Add Sim debug with lldb 2022-07-15 18:48:15 -05:00
Keith Bennett
678474d55c 🔧 Assert Probe Temp Comp requirements (#24468) 2022-07-15 18:48:15 -05:00
Mike La Spina
24c211307d 🐛 Fix laser/fan sync (#24460)
Followup to #22690, 307dfb15
2022-07-15 18:48:15 -05:00
tombrazier
0c78a6f657 ️ Optimize G2-G3 Arcs (#24366) 2022-07-15 18:48:15 -05:00
Jason Smith
79a332b57e 🩹 Fix LCD_BACKLIGHT_TIMEOUT compile (#24463) 2022-07-15 18:48:15 -05:00
Pauli Jokela
d9ecbdcdbb 🩹 Fix safe homing sanity-check (#24462) 2022-07-15 18:48:15 -05:00
Farva42
527fe2496a MAG_MOUNTED_PROBE (#24420)
Co-Authored-By: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-07-15 18:48:14 -05:00
Scott Lahteine
6c2ffe9d34 🔥 Remove JyersUI (#24459) 2022-07-15 18:48:14 -05:00
Scott Lahteine
0fdedfa2fb 📝 Configurations 02010100 (#24458) 2022-07-15 18:48:14 -05:00
Meilleur Gars
e93a1dd2fa 🚸 JyersUI updates (#24451) 2022-07-15 18:48:14 -05:00
Christophe Huriaux
03760fd79e 🩹 Fix ST7565 LCD contrast init (#24457) 2022-07-15 18:48:14 -05:00
Bob Kuhn
d3aed23e18 🐛 Fix Sensorless Probing compile (#24455) 2022-07-15 18:48:14 -05:00
Eduard Sukharev
893707711e 🐛 Fix MKS TinyBee compile (#24454) 2022-07-15 18:48:14 -05:00
Mike La Spina
d965303a7a ️ Fix and improve Inline Laser Power (#22690) 2022-07-15 18:48:14 -05:00
Keith Bennett
5b6c46db29 BigTreeTech SKR SE BX V3.0 (#24449)
SKR SE BX V3.0 removes the Reverse Driver Protection feature.
2022-07-15 18:48:14 -05:00
EvilGremlin
8f40a2f257 🔨 Fix OpenBLT encode; no-bootloader envs (#24446) 2022-07-15 18:48:14 -05:00
Scott Lahteine
e4f85e8fbc ♻️ Encapsulate PID in class (#24389) 2022-07-15 18:48:14 -05:00
Victor Oliveira
678955949f 🔨 Disable stack protector on macOS simulator (#24443) 2022-07-15 18:48:14 -05:00
Scott Lahteine
923d34550a 🔨 PlatformIO "--target upload" == "--target exec" 2022-07-15 18:48:14 -05:00
Scott Lahteine
ed643e634f 🔨 Fix Warnings/settings force-recompile 2022-07-15 18:48:14 -05:00
Scott Lahteine
3f4c8c31c6 Fix SDIO for STM32
Followup to #24271
2022-07-09 18:19:47 -05:00
Keith Bennett
171ed66de0 🚸 MPCTEMP: Home before cooling (#24434) 2022-07-04 00:29:53 -05:00
Keith Bennett
5f2e4487e7 🩹 Fix MKS TinyBee ADC Vref (#24432) 2022-07-04 00:29:53 -05:00
Scott Lahteine
80c7abd727 🩹 Remove poison wchar_t macro 2022-07-04 00:29:53 -05:00
Scott Lahteine
814b53750f 🩹 Remove obsolete split_move 2022-07-01 22:05:44 -05:00
Moonglow
23e93c51fd 🐛 Fix M149 (#24430) 2022-07-01 07:54:53 -05:00
tombrazier
afbdcc8eee 🚸 Vertical Max7219::quantity in portrait orientation (#24415) 2022-07-01 07:54:53 -05:00
Scott Lahteine
4820947203 Update path to Ender-3 S1 configs 2022-07-01 07:54:53 -05:00
Scott Lahteine
d44aef8b6b 📝 Index Mobo Rev03 => Opulo Lumen Rev3 2022-06-30 22:10:31 -05:00
Scott Lahteine
c1c0496073 🩹 Fix memset block warning 2022-06-30 22:10:26 -05:00
Keith Bennett
a48831d600 🐛 Fix Axis Homing (#24425)
Followup to 4520a51
2022-06-30 22:10:26 -05:00
John Lagonikas
c076094fa9 🐛 Fix MAX31865 PT1000 normalization (#24407)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-06-30 22:10:26 -05:00
Scott Lahteine
57c137a60f ♻️ reset_acceleration_rates => refresh_… 2022-06-30 22:10:05 -05:00
Scott Lahteine
05bdc5640d ♻️ Planner flags refactor 2022-06-30 22:10:05 -05:00
Scott Lahteine
83784bd8b7 📝 Note about UBL bad splits 2022-06-30 22:10:05 -05:00
Scott Lahteine
23f19e9ce8 🎨 Misc. shorthand operators 2022-06-26 10:02:36 -05:00
Scott Lahteine
0435b2220a 🐛 Fix Manual Move axis selection (#24404) 2022-06-26 06:49:14 -05:00
Shlee
ab2fceda2c 📝 Add STM32F4 example, Ruby (#24399) 2022-06-26 06:39:00 -05:00
Giuliano Zaro
88dc360e9d 🌐 Update Italian language (#24398) 2022-06-26 06:39:00 -05:00
Roman Moravčík
f5bdb8b4d2 🌐 Update Slovak language (#24397) 2022-06-26 06:39:00 -05:00
sgparry
3e01e08989 🩹 Fix LCD contrast with K8800 board 2022-06-26 06:39:00 -05:00
tombrazier
4694a7fe74 MAX7219 idle profiler (#24375) 2022-06-26 06:39:00 -05:00
Scott Lahteine
537af0bb03 🌐 Drop unused delta strings 2022-06-24 22:09:59 -05:00
InsanityAutomation
0dc59311ec 🐛 Resolve DUE Servo pulse issue (#24305)
Co-authored-by: sjasonsmith <20053467+sjasonsmith@users.noreply.github.com>
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-06-24 18:03:19 -05:00
tombrazier
0523874e9c 🐛 Fix G2/G3 Arcs stutter / JD speed (#24362) 2022-06-24 18:03:19 -05:00
Scott Lahteine
106537ff43 ✏️ 9-axis followup (sanity-check) 2022-06-24 18:03:19 -05:00
Bob Kuhn
ad96c36730 🐛 Fix Lerdge build / encrypt (#24391)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-06-24 18:03:19 -05:00
Victor Oliveira
a3629a7c28 Classic UI BIQU BX (#24387) 2022-06-24 18:03:19 -05:00
ellensp
b7e1b6b893 🩹 Fix DGUS (MKS) compile (#24378) 2022-06-24 18:03:19 -05:00
Victor Oliveira
253e35e066 🚑️ Fix BIQU BX touch freeze (#24383) 2022-06-24 18:03:19 -05:00
ellensp
831e1b5ecf 🐛 Fix M423 invocation (#24360)
Followup to #23745
2022-06-24 18:03:19 -05:00
tombrazier
c89ca2deb8 🩹 LCD strings followup, fix warning (#24328) 2022-06-24 18:03:19 -05:00
DerAndere
85e94038aa FOAMCUTTER_XYUV (for RAMPS) (#24325)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-06-24 18:03:19 -05:00
ellensp
7c85f25042 🚑️ Fix SD mount bug (#24319)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-06-24 18:03:19 -05:00
Scott Lahteine
eca5e46d17 🎨 Simplify move menus with substitution 2022-06-24 18:03:19 -05:00
Scott Lahteine
78b42ed387 🎨 Use MAP for home axis items 2022-06-24 18:03:19 -05:00
Scott Lahteine
95339c9561 🧑‍💻 Fix STATIC_ITEM_N arg order 2022-06-24 18:03:19 -05:00
Scott Lahteine
da6c16a9cd 🎨 Fix comments, formatting 2022-06-24 18:03:19 -05:00
ellensp
cc27cfb660 👷 CI test without src filter (emulate Arduino) (#24335) 2022-06-24 01:19:42 -05:00
Keith Bennett
25c0593c9b 👷 Use Biqu BX for CI test (#24331) 2022-06-24 01:19:36 -05:00
Scott Lahteine
5fff7bbef4 👔 Fix and comment use_example_configs 2022-06-24 01:11:07 -05:00
Scott Lahteine
3fd592e64b 👔 Update Marlin actions for 2.1.x 2022-06-24 01:11:07 -05:00
John Robertson
c34dd64469 ️ PWM for ESP32 I2S expander (#24193) 2022-06-24 01:11:07 -05:00
Scott Lahteine
7677368aaf 🔖 Moving to bugfix-2.1.x 2022-06-24 01:11:06 -05:00
Scott Lahteine
ece124fdea 🩹 M919 9-axis update 2022-06-20 21:09:20 -05:00
luzpaz
9aa499dbe9 🌐 Fix LCD string, typos (#24324) 2022-06-20 21:09:20 -05:00
Scott Lahteine
78a3ea0ed4 🧑‍💻 Apply F() to some LCD / TFT strings
Followup to #24228
2022-06-13 21:02:31 -05:00
ellensp
c605c1ebb5 🩹 Fix missing ProUI cpp wrapper (#24313) 2022-06-13 21:02:31 -05:00
ellensp
b2c4fb5f3a 🐛 Fix JGAurora A5S A1 build (#24326) 2022-06-13 04:32:49 -05:00
Steven Haigh
60cedf63f2 🩹 Fix ProUI compile (#24310)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-06-13 04:32:49 -05:00
Scott Lahteine
1156557a47 🧑‍💻 Misc. servo code cleanup 2022-06-13 04:32:49 -05:00
Scott Lahteine
ea22640d78 🧑‍💻 Remove servo macros 2022-06-13 04:32:49 -05:00
lujios
d886320799 🩹 Fix G33 Delta Sensorless Probing compile (#24291) 2022-06-13 04:32:30 -05:00
Scott Lahteine
a65189c637 👔 Fix and comment use_example_configs 2022-06-13 04:31:26 -05:00
tombrazier
dfc8acf376 🩹 Fix Mesh Leveling + Debug compile (#24297) 2022-06-07 02:15:48 -05:00
ellensp
48d03ca0a9 🩹 Media Change followup (#24302)
Followup to #24015
2022-06-07 02:00:38 -05:00
Miguel Risco-Castillo
85e8d1f9fa 🚸 ProUI G-code preview, PID plot (#24282) 2022-06-07 02:00:38 -05:00
Scott Lahteine
679f4608ab 👔 Update mfconfig import 2022-06-06 23:40:26 -05:00
Scott Lahteine
5c225ba887 🔖 Marlin 2.1 2022-06-05 23:11:32 -05:00
ellensp
2685119332 🩹 Fix EXTRUDERS 0 manual move compile (#24255) 2022-06-05 23:11:32 -05:00
tombrazier
fc350701b2 💥 More M306 M => M306 H (#24258)
Followup to #24253
2022-06-05 23:11:32 -05:00
Miguel Risco-Castillo
0ad695d45a 🚸 Fix, improve, update ProUI (#24251) 2022-06-05 23:11:32 -05:00
elimisback
f1802bc7fe 🔨 BTT STM32G0B1RE xfer build (#24245) 2022-06-05 23:11:32 -05:00
Scott Lahteine
d6c673b9de ♻️ More updates for multi-axis 2022-06-05 23:11:32 -05:00
Scott Lahteine
6a2a592c26 🧑‍💻 Combined axis strings 2022-06-05 23:11:32 -05:00
Scott Lahteine
c4ac695c15 🧑‍💻 Forward-compatible axis strings (167672d, #24259) 2022-06-05 23:11:32 -05:00
Keith Bennett
8465818754 🎨 Fix/adjust warnings (#24225) 2022-06-05 23:11:32 -05:00
Scott Lahteine
3c482a9ba1 🧑‍💻 MAP macro for axis lists, etc. (#24191) 2022-06-05 23:11:32 -05:00
DerAndere
ecfe7b6400 🩹 Fix some parameters w/out values (#24051) 2022-06-05 23:11:32 -05:00
DerAndere
85599abba7 🚸 Better M350, M114 with more axes (#23986) 2022-06-05 23:11:32 -05:00
Scott Lahteine
494a2fc80c 🚨 Fix some compiler warnings 2022-06-05 23:11:31 -05:00
Scott Lahteine
f7bea2846f 🏗️ Axis name arrays
Co-Authored-By: DerAndere <26200979+DerAndere1@users.noreply.github.com>
2022-06-05 23:11:31 -05:00
Scott Lahteine
d56731cd07 🏗️ Extend AXIS_CHAR to include E
Co-Authored-By: DerAndere <26200979+DerAndere1@users.noreply.github.com>
2022-06-05 23:11:31 -05:00
DerAndere
0041de1a8a 💥 Update Motor Current G-codes for extra axes (#23975) 2022-06-05 23:11:31 -05:00
ellensp
d58497bc8e 🐛 Fix BACKLASH_COMPENSATION compile (#24072)
Followup to #23826
2022-06-05 23:11:31 -05:00
Scott Lahteine
fd13a928c1 Support for up to 9 axes (#23112, #24036, #24231) 2022-06-05 23:11:31 -05:00
Scott Lahteine
369542db3b 🔖 Marlin 2.0.9.4 2022-06-05 21:33:29 -05:00
Scott Lahteine
40d96c3460 👔 Remove actions from misc. branch 2022-06-05 21:33:29 -05:00
Scott Lahteine
d7a71beaf4 🔧 LEVEL_BED_CORNERS => LCD_BED_TRAMMING 2022-06-05 21:33:29 -05:00
Scott Lahteine
f3b593ae73 🎨 Fix spelling, whitespace 2022-06-05 21:11:27 -05:00
Scott Lahteine
1d8d8dccf4 💥 Num Axes / Multi-Stepper based on Driver Types (#24106, #24120) 2022-06-05 20:58:39 -05:00
Scott Lahteine
1e127a93c4 🧑‍💻 Extend LCD string substitution (#24278) 2022-06-04 00:57:34 -05:00
lujios
fcef8d946c ️ Improve Sensorless homing/probing accuracy for G28, G33, M48 (#24220)
Co-Authored-By: Robby Candra <robbycandra.mail@gmail.com>
Co-Authored-By: ellensp <530024+ellensp@users.noreply.github.com>
2022-06-04 00:57:34 -05:00
Tanguy Pruvot
0253500ccd Use default null args in select_screen 2022-06-04 00:57:34 -05:00
ellensp
0d783a7690 🐛 Init Stepper SPI before PSU Control (#24269) 2022-06-04 00:57:34 -05:00
BIGTREETECH
e784e04132 BigTreeTech SKR3 - STM32H743 (#24271, #24272, #24275)
Co-Authored-By: Alan.Ma <alansayyeah@gmail.com>
2022-06-04 00:57:34 -05:00
bryan065
11d68e3127 🚸 Custom Menu Items for JyersUI (#24270) 2022-06-04 00:57:34 -05:00
ledzepman71
8b8b2a7ed3 📌 Tenlog PSU pin (#24266) 2022-06-04 00:57:34 -05:00
tombrazier
fc1a620b87 🚩 MPC update (#24253) 2022-06-04 00:57:34 -05:00
Keith Bennett
9799907dc9 👔 Configs required to submit a Bug Report (#24256) 2022-06-03 22:06:51 -05:00
Scott Lahteine
6fc4dbbbc4 🚸 Change M201 G to S 2022-06-03 22:06:51 -05:00
Robby Candra
74596ad4d7 🩹 Adjust manage_media for slow/late media init (USB FD) (#24015) 2022-06-03 22:06:51 -05:00
Scott Lahteine
28f8646aa6 ♻️ Apply F() to more LCD code (#24228) 2022-06-03 22:06:51 -05:00
John Robertson
9a74bcd4cf Laser Safety Timeout (#24189) 2022-06-03 22:06:50 -05:00
Scott Lahteine
07cd248b91 ♻️ Move watchdog to MarlinHAL 2022-06-03 22:06:50 -05:00
Scott Lahteine
209c792ef7 🔧 Remove LCD_SERIAL_PORT defaults, warn on auto-assign (#24170) 2022-06-03 22:06:50 -05:00
Scott Lahteine
dbd00d9927 DOGM Display Sleep (#23992)
Co-authored-by: borland1 <barryorlando@hotmail.com>
2022-06-03 22:06:50 -05:00
Ludy
4ae54a6229 🐛 Update German language, Fix FTDI (#24047, #24048, #24227) 2022-06-03 22:06:50 -05:00
tombrazier
ce0af56d0a 🚸 Improve MPC tuning, add menu items (#23984, #24018, #24049, #24059) 2022-06-03 22:06:50 -05:00
Giuliano Zaro
6c557a2480 🐛 Fix Bed/Chamber PID Autotune with MPCTEMP (#23983) 2022-06-03 22:06:50 -05:00
Scott Lahteine
a6ce9bf559 Autoreport Redundant Sensor option (#24014) 2022-06-03 22:06:50 -05:00
tombrazier
21c838cb1b ⚗️ Temperature Model Predictive Control (#23751) 2022-06-03 22:06:50 -05:00
Pauli Jokela
3443a9e18b SOUND_ON_DEFAULT option (#24102) 2022-06-03 22:06:50 -05:00
Robert Brenckman
b2b5b85045 🐛 Fix Tool Change priming (#21142) 2022-06-03 22:06:50 -05:00
Scott Lahteine
2086cc9f4e 📝 Refer to 'PROGMEM' as 'flash' 2022-06-03 22:06:50 -05:00
Scott Lahteine
8eccfd4a6f 🔧 Bed/Chamber PID Autotune menus
Derived from MarlinFirmware/Marlin#23983
2022-06-03 22:06:50 -05:00
Scott Lahteine
9ab654adcb 🐛 Fix min/max temp evaluation
Fixes #24257
2022-06-03 22:06:50 -05:00
Scott Lahteine
0ae982188c 🐛 Fix M203 report 2022-06-03 18:40:06 -05:00
ellensp
bed0788f72 🩹 Fix G60/G61 debug code (#24231) 2022-06-03 01:20:39 -05:00
Scott Lahteine
deb1ba73bb 🎨 Use pos.set method 2022-05-31 17:31:15 -05:00
Scott Lahteine
57f0ac88af 🎨 Misc. boards/pins cleanup 2022-05-31 17:31:14 -05:00
Simon Pilepich
915bce495c 📝 Fix Mightyboard MOSFET comments (#24183) 2022-05-31 17:31:13 -05:00
Scott Lahteine
800a936caa 🎨 Combine serial echos 2022-05-27 17:05:35 -05:00
ellensp
ccf39b1c42 🔨 Add src_filter for I2C_AMMETER (#24242) 2022-05-27 17:05:08 -05:00
Keith Bennett
d19179ce28 ✏️ Fix some motherboard checks (#24238) 2022-05-27 17:04:45 -05:00
ellensp
4a6ae1b64d 🎨 Remove MKS custom pins, TinyBee cleanup (#24186) 2022-05-27 17:04:22 -05:00
ellensp
0daaef589c 📌 Use MarlinSimUI/bugfix-2.0.x (#24232) 2022-05-27 17:04:06 -05:00
Scott Lahteine
4831cbebd8 🎨 Add EXP1/2 headers, adjust TFT pins (#24230) 2022-05-27 17:03:06 -05:00
tombrazier
e0deb75764 🐛 Fix Leveling apply/unapply (#24188)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-27 17:01:38 -05:00
Scott Lahteine
a0fe4f4895 🎨 Minor HAL cleanup 2022-05-27 17:01:20 -05:00
Keith Bennett
4d65d7f142 📝 Add logo, helpful links to README (#24226) 2022-05-23 02:40:38 -05:00
Scott Lahteine
1b879f0ee4 🔨 Fix mfprep string test 2022-05-22 19:52:38 -05:00
Scott Lahteine
b6abc760ce 🔨 Move, tweak maple envs 2022-05-22 19:52:38 -05:00
Keith Bennett
0ae061713c 👔 Move GitHub templates, update README (#24199) 2022-05-22 19:52:18 -05:00
Scott Lahteine
1d12e72bf6 🐛 Fix SEGMENT_LEVELED_MOVES with UBL 2022-05-22 17:06:22 -05:00
Scott Lahteine
c97cf10956 🩹 Fix const warning 2022-05-22 17:02:08 -05:00
Scott Lahteine
b72f9277e9 ♻️ Common Bed Leveling object name, accessors (#24214) 2022-05-21 18:13:30 -05:00
Keith Bennett
06c4a9acdb 🐛 Fix FLSUN Hispeed FIL_RUNOUT_PIN, MKS Robin Mini TFT pins (#24204) 2022-05-21 18:13:30 -05:00
Arthur Masson
8a301196e1 🐛 Fix Polargraph G92 command (#24223) 2022-05-21 14:46:49 -05:00
Marcio T
1e7219f4a6 🐛 Fix FTDI_EVE_TOUCH_UI reboot loop (#24195) 2022-05-19 12:11:03 -05:00
ellensp
02c267f542 🔨 Require PIO >= 6.0.1 (#24205) 2022-05-19 09:29:46 -05:00
Ivan Kravets
fe77fc66c0 🔨 Use PlatformIO Core 6.0 Dev for CI (#24194) 2022-05-17 16:47:34 -05:00
Scott Lahteine
268a16b1ef 🚸 ProUI APRIL2022 updates (#24084) 2022-05-17 15:54:34 -05:00
ellensp
8351b1431f 🩹 Fix MarlinUI allow-cold-extrude (#24176)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-17 03:04:30 -05:00
Oliver Jean Eifler
718806761f 🩹 Suppress ZERO() warning (#24178) 2022-05-17 03:04:30 -05:00
Marcio T
78c7fedcea 🐛 Fix Due cli/sei (#24182)
Followup to #23357
2022-05-16 21:49:30 -05:00
Scott Lahteine
c4b8339b84 🎨 HAL_MinSerial.* => MinSerial.* 2022-05-16 21:49:30 -05:00
Keith Bennett
94ed67e36e 🩹 Run TMC test last in setup (#24160) 2022-05-13 19:53:19 -05:00
Miguel Risco-Castillo
03b819bdb2 🚸 DWIN/DACAI for Creality 4.2.3 (#24132) 2022-05-13 19:53:19 -05:00
Scott Lahteine
2204f05dca 🧑‍💻 Clarify MSerialUSB, drop HardwareSerial workaround 2022-05-13 19:53:19 -05:00
Keith Bennett
a13cceaad1 🚸 Improve MKS SGEN_L V2, Robin Nano V3 pins (#24147) 2022-05-13 19:53:19 -05:00
Dominic
5c25ed60c8 🐛 Fix AIR_ASSIST (#24162) 2022-05-13 19:18:27 -05:00
Keith Bennett
1c516bdd5e 🔧 Allow board & probe dummy thermistors (#24165) 2022-05-13 19:18:27 -05:00
grauerfuchs
425684e2ff 🐛 Fix Mightyboard LED pin, fan override (#24168) 2022-05-13 19:09:55 -05:00
Roxy-3D
63aecad7ee 🔨 BTT Octopus ST-Link programming/debugging 2022-05-13 19:09:55 -05:00
Scott Lahteine
dcd769b4a1 🎨 Nextion cleanup 2022-05-13 01:19:45 -05:00
Scott Lahteine
f9b7f00d1e 🚚 Move speed_lookuptable.h 2022-05-13 01:19:45 -05:00
Keith Bennett
a6ff63d506 🎨 Clean up warnings / extra check (#24163) 2022-05-13 00:42:05 -05:00
ellensp
7d37ae2b2b 🔧 AVR/DUE Serial Port pin conflict checks (#24148)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-13 00:36:57 -05:00
Scott Lahteine
a7d40ec654 Add BOARD_CREALITY_V24S1_301F4
Co-Authored-By: Miguel Risco-Castillo <mriscoc@users.noreply.github.com>
2022-05-13 00:36:57 -05:00
InsanityAutomation
7ed339cfa0 Creality CR-10 SmartPro (#24151)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-13 00:36:57 -05:00
Scott Lahteine
cb4ad020af 🧑‍💻 Misc. LCD cleanup 2022-05-13 00:36:57 -05:00
Scott Lahteine
0805f9bf3f 🩹 Fix ProUI leveling start message 2022-05-12 21:28:52 -05:00
Scott Lahteine
d235bc9e1c 🧑‍💻 General and Axis-based bitfield flags (#23989) 2022-05-12 04:18:02 -05:00
Scott Lahteine
d5f472a6cf 🔨 Fix g++ locator for CI 2022-05-12 04:18:02 -05:00
Scott Lahteine
d67fa98cf6 🩹 Fix accel dividend 2022-05-12 04:17:16 -05:00
Scott Lahteine
d3fe0caa7f 🧑‍💻 Clarify acceleration factor 2022-05-09 18:55:42 -05:00
Scott Lahteine
bd09f8acff 📌 Define RAMPS_SMART EXP headers, AZSMZ_12864
See #23501
2022-05-09 17:46:23 -05:00
Scott Lahteine
a9aca5f5e8 ✏️ Fix spurious UTF 2022-05-09 17:46:23 -05:00
Scott Lahteine
13d1eb7241 🔨 OpenOCD Debug for VSCode 2022-05-09 17:46:23 -05:00
Mike La Spina
238ab1dd06 🩹 Fix Fan Tail Speed Init (#24076)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-09 17:46:23 -05:00
Keith Bennett
a7e4061d12 🔧 Fix Neo RGB sanity check (#24146) 2022-05-09 17:46:23 -05:00
ellensp
31c87adba8 📌 Use ESP3DLib master branch (#24140) 2022-05-09 17:46:23 -05:00
ellensp
727e7e7fd7 ✏️Fix Markforged endstops/G38 (#24141) 2022-05-09 17:46:23 -05:00
Scott Lahteine
975b90c0b7 🎨 Tweak NEOPIXEL_LED format (#24110) 2022-05-07 18:46:20 -05:00
Scott Lahteine
8f0180802a 🔧 Move LASER_COOLANT_FLOW_METER to LASER_FEATURE 2022-05-07 18:46:20 -05:00
Giuliano Zaro
aa4c991755 📝 Obsolete freeze comment (#23964)
Followup to #23944
2022-05-07 18:46:20 -05:00
Scott Lahteine
9ab1a57d72 ♻️ Consolidate DGUSScreenHandler class (#24067) 2022-05-07 18:46:20 -05:00
Robby Candra
044bf8ab7e ⚰️ Clean up dead option (#24006) 2022-05-07 18:46:12 -05:00
Scott Lahteine
4bdec5e993 🚸 More ExtUI events for ABL / UBL 2022-05-07 18:40:42 -05:00
Scott Lahteine
7444933d5d 🩹 Fix ESP32 servos, SD_IGNORE_AT_STARTUP
Fixes #24007
Followup to aaf5bf02
2022-05-07 18:40:42 -05:00
Scott Lahteine
f35404f853 🧑‍💻 Handle PLR in manage_media 2022-05-07 18:40:42 -05:00
Keith Bennett
7fa2dcedda 🐛 Fix ProUI / JyersUI leveling preheat (#24060, #24064)
Co-Authored-By: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 18:40:42 -05:00
Scott Lahteine
4c84769a81 🩹 Fix ADVANCED_PAUSE_RESUME_PRIME check
Fixes #23824
2022-05-07 18:40:42 -05:00
Robby Candra
8fb3074901 🩹 Fix DEBUG_CARDREADER (#24023) 2022-05-07 18:40:42 -05:00
ellensp
230db90b70 🩹 Fix DGUS_PREHEAT_UI enable with DGUS_LCD_CLASSIC (#24066) 2022-05-07 18:40:42 -05:00
Scott Lahteine
28d2bc353e 🎨 Use LEDColor default C-CTOR 2022-05-07 18:27:56 -05:00
Scott Lahteine
7b5e2cd786 🐛 Update M913, M914 report
Followup to #11248, #11249, #23400
2022-05-07 18:27:56 -05:00
Giuliano Zaro
4b456078dd 🌐 Update Italian language (#24019) 2022-05-07 18:27:56 -05:00
Keith Bennett
8d3c84a6d9 ✏️ Fix FYSETC Mini Panel neopixel type (#24011, #24111) 2022-05-07 18:13:09 -05:00
Giuliano Zaro
cbc6f23a8a 🔧 Sanity-check SWITCHING_TOOLHEAD_X_POS (#23985) 2022-05-07 18:13:09 -05:00
Giuliano Zaro
bed8abe5b6 🐛 Fix PID edit menu for Bed, Chamber (#23987) 2022-05-07 18:13:09 -05:00
tombrazier
74565890f3 ♻️ Refactor and fix ABL Bilinear (#23868, #24009, #24107) 2022-05-07 18:13:09 -05:00
Scott Lahteine
4ec9af42b8 💥 Rename ExtUI settings methods 2022-05-07 18:13:09 -05:00
John Robertson
b0d621d8b9 🧑‍💻 Define isr_float_t to assert a non-FPU float (#23969)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 18:13:09 -05:00
Stephen Hawes
995221e68e Add M3426 A<addr> parameter (#24130)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-07 18:13:09 -05:00
LPRtypeCN
54e543872b 🌐 Update Chinese language (#23865) 2022-05-07 18:12:18 -05:00
ellensp
7b39604d6f 🌐 Update Russian language (#23978) 2022-05-07 18:12:18 -05:00
Keith Bennett
01c9c26661 🧑‍💻 Preheat menu improvements (#24017)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 18:11:03 -05:00
ellensp
27b1484428 🐛 Fix Manual Move cold extrude override (#24045)
Followup to #19606

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 18:11:03 -05:00
InsanityAutomation
7f1c5ad7aa 🩹 Fix and clean up E3V2 draw (#23979, #24013) 2022-05-07 18:11:03 -05:00
ellensp
4fd7d1b056 🐛 Fix STM32 Pins Debugging (#22896) 2022-05-07 18:11:03 -05:00
Scott Lahteine
7ffe4de021 🩹 Use LCD_CONTRAST_INIT in pins files 2022-05-07 18:11:03 -05:00
Scott Lahteine
eada17ed69 🩹 Apply 100% leveling correction below the bed
See #24002
2022-05-07 18:11:03 -05:00
Scott Lahteine
cd5c5ea60e 🔨 Fix LPC176x debug build
See #23635
2022-05-07 18:07:01 -05:00
stream2me
e9ea82e78d 🐛 Prefer os.replace, fix TFT_LVGL_UI build (#24001) 2022-05-07 18:07:01 -05:00
ellensp
18b17fc97d 🐛 Fix MKS_MINI_12864 build for ESP32 (#24071) 2022-05-07 18:07:01 -05:00
Scott Lahteine
89d5ed0c9e 🎨 Combine common LPC1768 I2C code 2022-05-07 18:07:01 -05:00
Scott Lahteine
a56bf9045d 🧑‍💻 Simplify BIGTREE_SKR_2_F429 env 2022-05-07 17:59:30 -05:00
Scott Lahteine
c23d035149 🧑‍💻 Strip #errors in Configurations deployment 2022-05-07 17:58:27 -05:00
Scott Lahteine
7ff4b70694 🚸 Prevent accidental button press 2022-05-07 17:56:18 -05:00
Scott Lahteine
421c38ff2e 🐛 Home Z to Max after Z_SAFE_HOMING 2022-05-07 17:56:18 -05:00
Scott Lahteine
ec447dba04 🚸 Home Y before X on belt printers 2022-05-07 17:56:18 -05:00
Christian Piper
be6535e5f7 🩹 Fix PRINTCOUNTER with EXTRUDERS 0 (#24063)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 17:56:04 -05:00
Scott Lahteine
99252cf0cd 🐛 Prevent BABYSTEP freeze
See #22830, #13300
2022-05-07 17:55:13 -05:00
Scott Lahteine
f6f31434b8 🧑‍💻 IS_ULTRA_LCD => HAS_WIRED_LCD 2022-05-07 17:55:13 -05:00
Scott Lahteine
2f3960904e 🎨 Misc. USB flash code cleanup 2022-05-07 17:55:13 -05:00
Scott Lahteine
2dc4c642e7 🎨 Misc. adjustments, spacing 2022-05-07 17:55:08 -05:00
Scott Lahteine
70ea0e7c34 ✏️ Remove extra G29 line
Followup to 85a62bbf
2022-05-07 17:55:02 -05:00
Scott Lahteine
a81fd009f0 🎨 misc. cleanup 2022-05-07 17:54:10 -05:00
Scott Lahteine
e667d4e6e4 🌐 Rename "LCD Timeout" string 2022-05-07 17:34:02 -05:00
Scott Lahteine
2d0af75d37 ✏️ No such pin 2022-05-07 17:34:02 -05:00
ellensp
5e68a86968 🔨 Preflight check old abl files (#24010) 2022-05-07 17:34:02 -05:00
Moritz Wirger
8bd1547c3b enwi ESPNP board support (#24029) 2022-05-07 17:34:02 -05:00
Scott Lahteine
a5e083603f 📝 Fix 'M150 S' comment 2022-05-07 17:34:02 -05:00
Giuliano Zaro
c5f7547e8c 🩹 Fix "elapsed" text on DOGLCD (#24087) 2022-05-07 17:34:02 -05:00
InsanityAutomation
5c5b380fda 🐛 Fix MarlinUI on Ender 3 S1 (#23949) 2022-05-07 17:34:02 -05:00
aegelsky
bb0e0cf7f3 🐛 Fix MKS Gen. L - EEB (#23965) 2022-05-07 16:53:59 -05:00
Jon
5ee99dfc49 🩹 SKR2 Pins DIAG flag (#23968)
Followup to #23050
2022-05-07 16:53:59 -05:00
Keith Bennett
a083b1280e 📌 SKR Mini V1.1 TMC UART Pins (#23970) 2022-05-07 16:53:59 -05:00
grauerfuchs
b7b5cee88b 🐛 Fix MightyBoard Rev. E EX2, extra MOSFETs (#23976) 2022-05-07 16:53:59 -05:00
Keith Bennett
7456fd68a4 ✏️ Fix NOZZLE_PARK_Y_ONLY sanity-check (#23990) 2022-05-07 16:53:59 -05:00
Scott Lahteine
20154718b5 🌐 Clean up languages 2022-05-07 16:49:47 -05:00
Manianac
a6794c1862 🐛 Use ADC_VREF for Filament Width ADC Vref (#23977) 2022-05-07 16:49:47 -05:00
John Lagonikas
bd5c6bf23c ✏️ Fix parking extruder compile (#23961)
Followup to d3e3e6a491
2022-05-07 16:49:21 -05:00
Scott Lahteine
68ee64283a 🎨 INI cleanup 2022-05-07 16:49:21 -05:00
Scott Lahteine
dd29394bbe 🔨 Improved mfprep script 2022-05-07 16:49:21 -05:00
Scott Lahteine
ceb99e89a0 🔨 Prevent build attribute define conflicts 2022-05-07 16:49:21 -05:00
Scott Lahteine
6112277f9b 🔨 Use first g++ in path for 'native' targets 2022-05-07 16:49:21 -05:00
Keith Bennett
81f403025c 🐛 Some EEPROM size fixes (#24113)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-07 16:49:21 -05:00
Scott Lahteine
eeda8b451a 📝 Replace KB with K in pins 2022-05-07 16:47:33 -05:00
Keith Bennett
c7e8ba7857 📝 Fix extraneous URL args (#24125) 2022-05-07 16:47:16 -05:00
Ludy
071e5c336a 🐛 Fix MMU2 buzz (#23950)
Followup to #23943
2022-05-07 16:17:47 -05:00
David Forrest
be08d4c4f0 🔨 Fix Makefile GCC warning (#23957) 2022-05-07 16:17:47 -05:00
ellensp
e99104a004 Configurable FREEZE pin state (#23944, #23948)
Co-Authored-By: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 16:17:47 -05:00
Scott Lahteine
edc4089121 🐛 Fix pulldown sanity check 2022-05-07 16:17:47 -05:00
ellensp
3bce266ef7 🐛 Fix MMU2 buzz (#23943)
Followup to 89a9c3a391
2022-05-07 16:17:47 -05:00
Robby Candra
c89d0114ac STATUS_MESSAGE_TIMEOUT_SEC (#23135)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 16:17:47 -05:00
Scott Lahteine
0e693854d0 🚸 Clear "heating/cooling" message on temp reached 2022-05-07 16:17:47 -05:00
Scott Lahteine
9324132a40 🎨 Format, use status macros 2022-05-07 16:17:47 -05:00
Scott Lahteine
5632ad65f5 🐛 Fix status_printf alert level 2022-05-07 16:17:47 -05:00
Scott Lahteine
eccbfbcede 🩹 Print English to serial out 2022-05-07 16:17:47 -05:00
Scott Lahteine
5ef4fb378e ✏️ Encoder noise followup
Followup to #23925
2022-05-07 16:17:47 -05:00
Oleg Belov
21f0945d2c 📌 Custom cable for Mini 12864 V1 + SKR Mini E3 V3.0 (#23936) 2022-05-07 16:17:47 -05:00
Serhiy-K
b2a318af9a 🌐 Update Ukrainian language (#23935) 2022-05-07 16:17:47 -05:00
ellensp
1c89c0470f 🩹 Wrap endstop_diag.cpp (#23931) 2022-05-07 16:17:47 -05:00
Scott Lahteine
2ee4a667e1 💡 Misc. cleanup, comments 2022-05-07 16:17:47 -05:00
Scott Lahteine
f8e177a43e 🧑‍💻 Improve STATUS_BED_X 2022-05-07 16:01:19 -05:00
Scott Lahteine
9ac1c73041 🎨 General cleanup, comments 2022-05-07 16:01:17 -05:00
Scott Lahteine
4a8b99d505 🧑‍💻 EXTRUDER_LOOP macro 2022-05-07 16:01:13 -05:00
Scott Lahteine
b094a3fc0d 🎨 Clean up tool change with tool sensor 2022-05-07 16:01:10 -05:00
Scott Lahteine
2d99a608fd 🔨 Fix 'mftest -s' 2022-05-07 16:01:08 -05:00
Scott Lahteine
fba8805c0c 🩹 Fix ADC math overflow 2022-05-07 16:01:06 -05:00
Scott Lahteine
039a22649f 🧑‍💻 PIO --silent in build_example 2022-05-07 16:01:03 -05:00
Scott Lahteine
ced0ad8e09 🎨 Apply _TERN where possible 2022-05-07 16:01:01 -05:00
Scott Lahteine
10a0c9a9b3 🔨 Suppress MMU2 resume_position warning 2022-05-07 16:00:59 -05:00
Scott Lahteine
abfb041180 🧑‍💻 Add neo.set_background_color(rgbw) 2022-05-07 16:00:56 -05:00
Scott Lahteine
72f207f489 🔧 Sanity-checks for PULLDOWN, SINGLENOZZLE 2022-05-07 16:00:54 -05:00
Scott Lahteine
7186037f20 🔧 No Switching Nozzle with MMU2 2022-05-07 16:00:51 -05:00
Scott Lahteine
b0a400da72 🩹 No PE_MAGNET_ON_STATE without PARKING_EXTRUDER 2022-05-07 16:00:49 -05:00
Scott Lahteine
cc4c2c2f98 🔨 Allow I2CPE_ENC_n_INVERT set to false 2022-05-07 16:00:46 -05:00
Scott Lahteine
5dae8a6734 🚸 Allow one servo with cutter on RAMPS 2022-05-07 16:00:44 -05:00
Fredrik Andersson
05dea4e30a Encoder button noise filter (#23925) 2022-05-07 16:00:41 -05:00
Mark
7e88ee8c5c 📌 PandaPi V2.9 – Standalone mode (#23908) 2022-05-07 16:00:38 -05:00
John Robertson
cc8e485e1c ESP32 - Hardware PWM for fan, cutter, servos (#23802) 2022-05-07 16:00:36 -05:00
ellensp
c7a2ecc31a 🩹 Fix xatc EEPROM debug (#23911) 2022-05-07 16:00:34 -05:00
tombrazier
260b40d145 ️ Fix noisy ADC - 16x oversampling with 12-bit ADC (#23867) 2022-05-07 16:00:31 -05:00
Ludy
c87eded8f6 🩹 Fix redundant var declaration (#23913) 2022-05-07 16:00:28 -05:00
John Robertson
2f2a999368 🐛 MKS TinyBee - 2.5V ADC Vref (#23903) 2022-05-07 16:00:25 -05:00
Jelmer van der Stel
2558b323e8 🩹 Fix DWIN E3V2 display issues by allowing re-init (#23879) 2022-05-07 15:59:57 -05:00
Mrnt
1db6855939 🧑‍💻 Allow DIGIPOT Rsx / Vrefmax override (#23885) 2022-05-07 15:58:31 -05:00
Julien Staub
62f298aca3 🩹 Fix ExtUI build with Host Keepalive disabled (#23898) 2022-05-07 15:58:31 -05:00
InsanityAutomation
8d20c5aadf 📝 Fix X2_MAX_POS comment (#23873) 2022-05-07 15:58:31 -05:00
Scott Lahteine
61b470249c 📝 Fix DEFAULT_DUAL_X_CARRIAGE_MODE comment 2022-05-07 15:58:31 -05:00
Scott Lahteine
4ffa88f814 🚸 Test LIN_ADVANCE in a pins file 2022-05-07 15:58:31 -05:00
Mathew Winters
8257040faf ️ G12 - Only require used axes to be homed (#23422)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:31 -05:00
Keith Bennett
5d9ab7e71e 🔨 Drop extraneous build flag (#23862) 2022-05-07 15:58:31 -05:00
Nick
1a76d4d467 🐛 Fix Chiron new TFT SD print after reset (#23855) 2022-05-07 15:58:31 -05:00
Scott Lahteine
4028c1cfc7 🩹 Fix FSTR / PSTR usage 2022-05-07 15:58:31 -05:00
Scott Lahteine
c49f26a7ae 🧑‍💻 Add standard BUZZ types 2022-05-07 15:58:31 -05:00
Ludy
f82b133595 🌐 Fix, add some menu labels (#23895) 2022-05-07 15:58:31 -05:00
Scott Lahteine
2c3f2a1471 🐛 Fix UBL 'G29 Q1' bug 2022-05-07 15:58:31 -05:00
Scott Lahteine
4817efcf81 🧑‍💻 Add ExtUI::onLevelingDone, match DWIN to ExtUI 2022-05-07 15:58:31 -05:00
BIGTREETECH
16271377e2 🧑‍💻 STM32G0Bx : Use PLLQ for USB clock (#23870) 2022-05-07 15:58:31 -05:00
kisslorand
61fb382868 🚸 M401 H - Report BLTouch HS State (#23724) 2022-05-07 15:58:31 -05:00
GatCode
7dae720de5 📌 Fix, extend Index Rev03 Mobo (#23851)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:31 -05:00
Giuseppe499
c6f4b38877 🚸 Fix, extend X Axis Twist Compensation (#23745)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:31 -05:00
Miguel Risco-Castillo
eabeac29fd 🚸 Update Ender3 V2/S1 Pro UI (#23878) 2022-05-07 15:58:31 -05:00
ellensp
b045c91f26 fix g29 (#23887) 2022-05-07 15:58:31 -05:00
Scott Lahteine
56955c179d 🐛 Fix UI include
Followup to ~2
2022-05-07 15:58:31 -05:00
ellensp
4eb1326355 📝 Update laser/spindle docs link (#23886) 2022-05-07 15:58:31 -05:00
Scott Lahteine
b669aa49cc 🔧 DWIN_CREALITY_LCD_ENHANCED => DWIN_LCD_PROUI
Followup to #23624
2022-05-07 15:58:31 -05:00
Scott Lahteine
152ec49b8b 🩹 Fix 'hdsl' warning 2022-05-07 15:58:31 -05:00
Scott Lahteine
e4ca822dcf 🚸 Improve M422 error messages 2022-05-07 15:58:30 -05:00
Scott Lahteine
0fafcd20cd 🔧 Mark Thermal Variance Monitor EXPERIMENTAL 2022-05-07 15:58:30 -05:00
Jack Wilsdon
bd72df3bb6 🐛 Emergency Parser with STM32 Mass Storage (#23827) 2022-05-07 15:58:30 -05:00
tombrazier
fd582dc863 🩹 Improve and apply XATC reset() (#23840) 2022-05-07 15:58:30 -05:00
Scott Lahteine
2986bc3b76 ️ Use seen_test in M422 2022-05-07 15:58:30 -05:00
Scott Lahteine
e082a141f6 🚸 Use Z_STEPPER_ALIGN_STEPPER_XY to enable 2022-05-07 15:58:30 -05:00
tombrazier
575c3150f9 🚸 Universal X_AXIS_TWIST_COMPENSATION (#23828) 2022-05-07 15:58:30 -05:00
Scott Lahteine
43d4e30668 🐛 Fix M_State_grbl when G29 calls G28 2022-05-07 15:58:30 -05:00
Julien Staub
9b17699b9b Weedo 62A Tina2 / Monoprice Cadet (#23817) 2022-05-07 15:58:30 -05:00
InsanityAutomation
0337602bbe ️ E3V2 blank bg for S1 compatibility (#23822) 2022-05-07 15:58:30 -05:00
ellensp
fbfe0642b6 🚨 Fix BLTouch 5V pin tolerance checks (#23823) 2022-05-07 15:58:30 -05:00
tombrazier
41a51e9527 🐛 Fix backlash applied steps when config changes (#23826)
Followup to #23814
2022-05-07 15:58:30 -05:00
ellensp
2d648e4dd9 🔨 Fix 'renamed' env (platform = ststm32) (#23831) 2022-05-07 15:58:30 -05:00
Ludy
35d11070b4 🌐 Update German language (#23832) 2022-05-07 15:58:30 -05:00
kisslorand
feafb7d49a M21 P / S / U - Select Volume (#23780)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:30 -05:00
M. FURIC Franck
39001bd8d2 LCD Backlight Timer (#23768)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:30 -05:00
ellensp
3db2fecaa4 🔧 SHOW_CUSTOM_BOOTSCREEN sanity-check (#23807) 2022-05-07 15:58:30 -05:00
sam
c0288590b3 📺 BTT SKR Mini E3 with Fysetc V2.1 / MKS V3 / BTT V1 Mini 12864 (#23793) 2022-05-07 15:58:30 -05:00
ellensp
d2cd3f2e68 MKS Robin Nano 3.1 (#23795) 2022-05-07 15:58:30 -05:00
ellensp
893c662438 🐛 ESP32 _delay_ms, fix u8g_esp32_spi.cpp (#23810) 2022-05-07 15:58:30 -05:00
tombrazier
b0fdbede9c 🐛 Fix steps-to-mm with backlash (#23814)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:30 -05:00
Scott Lahteine
8e11a2bb83 🎨 Move PROPORTIONAL_FONT_RATIO 2022-05-07 15:58:30 -05:00
ellensp
9588f21d2e 🔨 More renamed.ini envs (#23786) 2022-05-07 15:58:30 -05:00
ellensp
80e569015b 🐛 Fix TMC26X CS pins init (#23778) 2022-05-07 15:58:30 -05:00
Keith Bennett
be70352203 🔧 Warning for MK3_FAN_PINS (#23727) 2022-05-07 15:58:30 -05:00
Scott Lahteine
980c009fc7 Dyze Design PT100 Amplifier Board (#23760) 2022-05-07 15:58:30 -05:00
Scott Lahteine
8a02646f52 📝 Update Toolchange FS comments 2022-05-07 15:58:30 -05:00
tombrazier
7ec2167a73 ️ Apply PTC on all probing (#23764)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:30 -05:00
Scott Lahteine
56cec9690a ♻️ Refactor HAL as singleton (#23357, #23871, #23897) 2022-05-07 15:58:30 -05:00
John Robertson
428b67db31 More Nozzle Park move options (#23158)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:30 -05:00
Scott Lahteine
1b2715ccf2 🚸 Enhanced UI => Professional UI - with updates (#23624) 2022-05-07 15:58:30 -05:00
GHGiampy
ac76ed7ece 🚸 Case Light, LED menus for E3V2 DWIN Enhanced UI (#23590) 2022-05-07 15:58:30 -05:00
ellensp
4ba4ab1c75 📌 Creality RAMPS optional SD_DETECT_PIN (#23740)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:58:30 -05:00
GHGiampy
c0f6d2f78c ✏️ Fix getLFNName parameter (#23752) 2022-05-07 15:56:08 -05:00
jefflessard
0b4f5298f5 🚨 Fix TEMP_SENSOR_BOARD warnings (#23754) 2022-05-07 15:56:08 -05:00
Simon Pilepich
195383bc33 🧑‍💻 Update MightyBoard FET pins (#23728) 2022-05-07 15:56:08 -05:00
Scott Lahteine
4199191e99 ♻️ Rename XATC z_values => z_offset 2022-05-07 15:56:08 -05:00
InsanityAutomation
7da28768f7 ♻️ No ui.reinit_lcd on any ExtUI (#23722)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:56:08 -05:00
Scott Lahteine
172cd2eefb 📝 Update conditionals descriptions 2022-05-07 15:55:58 -05:00
Scott Lahteine
341113bcfb 🔧 HAS_LCDPRINT conditional 2022-05-07 15:55:58 -05:00
ellensp
5f0e1a15df ✏️ Fix E3V2 display with BTT SKR Mini E3 v3 (#23719) 2022-05-07 15:55:16 -05:00
ellensp
3abf4de4ae 🚸 Align MKS UI heated bed status with HAS_MULTI_HOTEND (#23718) 2022-05-07 15:55:16 -05:00
Scott Lahteine
cc1a48ad2d 💥 Change 'M42 M' to 'M42 T' 2022-05-07 15:55:16 -05:00
Scott Lahteine
2a584cea96 🎨 Misc. DGUS cleanup 2022-05-07 15:55:08 -05:00
Thomas White
9f57f6f36f Pxmalion Core i3 (#23711) 2022-05-07 15:55:08 -05:00
Scott Lahteine
59548410b8 🧑‍💻 Wrap MMU1 pins 2022-05-07 15:55:08 -05:00
espr14
65c4f14a9e 🩹 Simplify quick homing feedrate (#23714)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-07 15:55:08 -05:00
MOHAMMAD RASIM
3e18cf2b6a 🚸 Fix, Improve Power-Loss Recovery (#22828)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-07 15:55:07 -05:00
ellensp
11071c7472 🚸 Restore active tool after ABL G29 (#23692)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:55:07 -05:00
Scott Lahteine
38484c6eb6 🧑‍💻 Drop hostui.flag 2022-05-07 15:54:55 -05:00
Taylor Talkington
b964d2fff0 Optional HOST_STATUS_NOTIFICATIONS (#22833) 2022-05-07 15:54:55 -05:00
Scott Lahteine
973366e6aa 🔧 Update MIXING_EXTRUDER sanity checks
Fixing #23693
2022-05-07 15:54:55 -05:00
InsanityAutomation
e255e4a69f PLR accessors for Ext UI (#23687) 2022-05-07 15:54:46 -05:00
InsanityAutomation
942f088522 🩹 Fix Maple HAL compile errors (#23685) 2022-05-07 15:54:46 -05:00
ellensp
c4341a4e35 🚨 Cleaner errors for renamed envs (#23690) 2022-05-07 15:54:46 -05:00
InsanityAutomation
6e23ffd12c 🧑‍💻 Generic Maple STM32F103RC envs for devs (#23686) 2022-05-07 15:54:33 -05:00
Bob Kuhn
58239c65cb 🐛 Fix init of delta safe height (for G29, G33, etc.) (#23622) 2022-05-07 15:54:33 -05:00
ellensp
82ae3646cb 🐛 Fix missing u8g_esp32_spi (#23562) 2022-05-07 15:54:33 -05:00
GHGiampy
8799837d75 🔨 Clean up upload.py (#23679) 2022-05-07 15:53:47 -05:00
John Lagonikas
cdcf31453b 🐛 Fix dual MAX31865 initialization issues (#23496) 2022-05-07 15:53:47 -05:00
Bob Kuhn
a23ecf0d2f 🩹 Prevent Z error with UBL + Park unscaled E move (#23568) 2022-05-07 15:53:47 -05:00
ellensp
f5046a41cd 🚨 Deprecate Maple build (#23661)
Update Warnings.cpp
2022-05-07 15:53:06 -05:00
GHGiampy
0d07c49c1d 🩹 Init brightness/contrast later (#23645) 2022-05-07 15:48:34 -05:00
Stephen Hawes
f193729f54 🐛 Fix Index Mobo Rev03 upload (#23676) 2022-05-07 15:48:34 -05:00
Kelroy
22db62d95a SAMD51 Bricolemon / Bricolemon Lite boards (#23658) 2022-05-07 15:48:13 -05:00
Bruno Henrique de Paula
50ffacfb90 📌 Distinct BOARD_CREALITY_V422 (#23674) 2022-05-07 15:48:13 -05:00
Bones
21935b41f0 Add ZRIB v53, patch G35 Z drop, related issues (#23636) 2022-05-07 15:48:13 -05:00
Scott Lahteine
15eabba11d 🧑‍💻 Relocate a variant 2022-05-07 15:48:13 -05:00
Bob Kuhn
b2d0f2fd8c 🐛 Fix RUMBA + MKS Mini12864 Neopixel pin (#23646) 2022-05-07 15:48:13 -05:00
Mike La Spina
a07d7e4b8a 🍻 STM32 set_pwm_duty "on/off" for digital pins (#23665) 2022-05-07 15:48:13 -05:00
Scott Lahteine
d4801461f5 💡 Comment variant timers 2022-05-07 15:48:13 -05:00
Mike La Spina
f42c1b4cae 🔧 Sanity-check AVR D9 Fan PWM / SPEAKER Timer2 (#23672) 2022-05-07 15:48:13 -05:00
ellensp
f8571fc18f 🐛 Creality v4 cleanup, pin correction (#23666) 2022-05-07 15:47:49 -05:00
Scott Lahteine
fbbf556e08 🔨 Workspace file with recommendation 2022-05-07 15:47:08 -05:00
Scott Lahteine
1cdaddaaf2 🔧 Board temp sensor check 2022-05-07 15:38:56 -05:00
ellensp
4d8976bf6b 🐛 Fix FYSETC S6, S6 V2 Serial RX pins (#23642) 2022-05-07 15:38:56 -05:00
Mike La Spina
c02bc3887a 🐛 Fix AVR 644/1284 Timer / PWM conflicts (#23629) 2022-05-07 15:38:56 -05:00
Scott Lahteine
68dfc50564 🧑‍💻 Simplify Fast PWM timer macros 2022-05-07 15:38:56 -05:00
Mike La Spina
c7b0626b02 🐛 Fix SPI DMA and default mode (#23627)
Followup to #23464
2022-05-07 15:38:56 -05:00
Scott Lahteine
30d1f0ba81 📝 Update Creality 4.2.2 driver warning 2022-05-07 15:38:56 -05:00
Keith Bennett
758dc7af9d 🚸 Better "Bed Tramming Done" dialog (#23616)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-07 15:38:56 -05:00
Scott Lahteine
361dab93b3 BOARD_CREALITY_V24S1_301 (#23620)
Co-Authored-By: Miguel Risco-Castillo <mriscoc@users.noreply.github.com>
2022-05-07 15:38:55 -05:00
ellensp
f0f1d33980 FYSETC TFT81050 CI Test (#23604) 2022-05-07 15:38:55 -05:00
Scott Lahteine
38e0e92e9d ✏️ Fix MKS enum 2022-05-07 15:38:55 -05:00
Scott Lahteine
2dcc3ddeed 🧑‍💻 HAS_MARLINUI_MENU, HAS_MANUAL_MOVE_MENU 2022-05-07 15:38:55 -05:00
Timofey Titovets
33c89547f0 ️ Tuned Thermistor 66 (T-D500) (#23585) 2022-05-07 15:38:55 -05:00
Lars
a4ea8bc1e1 🐛 Fix DGUS_Reloaded G-code execution (#23592) 2022-05-07 15:38:55 -05:00
Keith Bennett
9f06079549 🐛 Fix Creality DWIN LCD with SKR Mini E3 V3 (#23593) 2022-05-07 15:38:55 -05:00
DejitaruJin
2f48c30445 🩹 Fix DWIN float debugging (#23601) 2022-05-07 15:38:55 -05:00
Keith Bennett
5090687682 🔨 Creality RCT6 (256K) variants (#23599)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:38:55 -05:00
Scott Lahteine
2d032b734c 🧑‍💻 Fix up some AUX / EXP pins (#23577) 2022-05-07 15:38:55 -05:00
Mike La Spina
2142456a25 🐛 Fix LCD contrast/brightness init (#23567)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:38:55 -05:00
Scott Lahteine
99f3b8b4a8 ♻️ Adjust LCD init, contrast default, settings load 2022-05-07 15:38:55 -05:00
Keith Bennett
de0bc19230 🚸 TH3D EZBoard V2 TMC slave addresses (#23857) 2022-05-07 15:38:55 -05:00
John Lagonikas
17099e7973 🩹 Fix power.h compile (#23573) 2022-05-07 15:38:55 -05:00
Scott Lahteine
63f3e347d9 🩹 BOARD_INIT followup 2022-05-07 15:38:55 -05:00
Scott Lahteine
32ff8c1489 🧑‍💻 Add chmod to mfprep 2022-05-07 15:38:55 -05:00
Scott Lahteine
369ba99fdb 🩹 Fix Robin Nano BOARD_INIT 2022-05-07 15:38:55 -05:00
Scott Lahteine
f33ec4aacf 📝 Tweak G26 Q description 2022-05-07 15:38:55 -05:00
Scott Lahteine
1d0ca179b5 🎨 LCD_SCREEN_ROT_* => LCD_SCREEN_ROTATE 2022-05-07 15:38:55 -05:00
Scott Lahteine
8ea172cafe 🎨 Misc. style and cleanup 2022-05-07 15:27:24 -05:00
John Lagonikas
7b4f5108ac 🐛 Fix conditional M81 suicide (#23549) 2022-05-07 15:27:20 -05:00
Scott Lahteine
6f82d1befb 📌 RAMPS AUX 1-2 headers (#23544) 2022-05-07 15:27:17 -05:00
Fahad Alduraibi
5d5be55ef9 🐛 Fix RAMPS 1.4 Plus EXP headers (#23523) 2022-05-07 15:27:10 -05:00
GHGiampy
e704de9bb0 Long filename open/create/write (#23526)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-05-07 15:26:59 -05:00
A. Herlas
8695f462b7 Z Offset Wizard for TFT_LVGL_UI (English) (#23489) 2022-05-07 15:26:59 -05:00
Ave6683
d8c5e49281 MagLev V4 probe by MDD (#23192) 2022-05-07 15:26:59 -05:00
Salvatore Bramante
4e72df9a28 🐛 Fix Octopus v1.x probe pin (#23548) 2022-05-07 15:26:59 -05:00
Scott Lahteine
ac6c1a9e12 💥 Generalize extra debugging 2022-05-07 15:26:45 -05:00
Taylor Talkington
3f4112aee4 💄 Improve Ender3 v2 DWIN MarlinUI (#23369)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:25:08 -05:00
Keith Bennett
31ec8f2449 🔨 Suppressible CONFIGURATION_EMBEDDING warning (#23545) 2022-05-07 15:25:08 -05:00
John Lagonikas
d18558bbd3 🚸 Suppressible pin warnings (#23530)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:24:42 -05:00
zerkix
70f03ad852 🐛 Finish and organize temp sensors (#23519)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2022-05-07 15:24:42 -05:00
Anson Liu
ab40c99893 🐛 Fix Ultimain 2 E-autofan pin mapping (#23466) 2022-05-07 15:24:42 -05:00
Miguel Risco-Castillo
420f074915 🐛 Fix PLR for E3V2 Enhanced UI (#23543) 2022-05-07 15:14:44 -05:00
Taylor Talkington
4f2ed67324 💄 MarlinUI+DOGM leveled bed bitmaps (#23539) 2022-05-07 15:14:44 -05:00
Sola
a80cafbcfc ️ SPI+DMA+interrupt method (STM32 / MKS UI) (#23464) 2022-05-07 15:13:40 -05:00
Mike La Spina
01cb7c19f9 🐛 Fix, improve PWM on AVR (#23520) 2022-05-07 15:13:40 -05:00
Scott Lahteine
44249b1380 🔧 Skip unused axis names 2022-05-07 15:12:59 -05:00
George Fu
d7287e7db8 🔨 Set upload_command for CHEETAH v20 (#23515) 2022-05-07 15:12:59 -05:00
Scott Lahteine
cf654bbba2 🩹 Followup to extra axes 2022-05-07 15:12:59 -05:00
Scott Lahteine
5617edbb96 🧑‍💻 Misc. updates for extra axes (#23521) 2022-05-07 15:12:45 -05:00
Mike La Spina
39e4310c7b 🐛 Fix, improve PWM on AVR (#23463) 2022-05-07 15:12:45 -05:00
Lefteris Garyfalakis
0204547c09 🚸 Fix E3V2 Enhanced UI time labels (#23502) 2022-05-07 15:12:45 -05:00
Scott Lahteine
7b79d53de0 🎨 Misc. spindle/laser adjustments 2022-05-07 15:12:45 -05:00
Scott Lahteine
c478ed08c8 🧑‍💻 Adjust FastIO AVR timer enums, macros 2022-05-07 15:12:45 -05:00
GHGiampy
67e5298a34 Firmware Upload via Binary Transfer (#23462) 2022-05-07 15:10:28 -05:00
John Lagonikas
2ca1d844d7 Temperature variance monitor (#23373) 2022-05-07 15:10:28 -05:00
mistic100
b435487da7 🚸 Wait for cooldown in MarlinUI power-off (#23476) 2022-05-07 15:10:28 -05:00
Scott Lahteine
d7b7b570c7 🎨 Misc. cleanup, comments 2022-05-07 15:10:19 -05:00
John Lagonikas
2690bb1bc2 M81 D / S - Power-off Delay (#23396, #23455) 2022-05-07 15:10:19 -05:00
Scott Lahteine
b6c37960e8 📝 KHz => kHz (#23512) 2022-05-07 15:10:19 -05:00
Scott Lahteine
c1d3e4634c 💚 Lock CI testing to PlatformIO 5.2.5 2022-05-04 15:00:52 -05:00
Scott Lahteine
9df0dbc981 💚 Use PIO-develop for CI 2022-04-20 04:30:15 -05:00
Scott Lahteine
d418f3bfba 🔨 Skip cron with exit code 0 2022-04-19 19:30:08 -05:00
Scott Lahteine
2893060302 💚 Lock CI testing to PlatformIO 5.2.5 2022-03-29 03:24:30 -05:00
Scott Lahteine
ad945017d6 🔨 Update TMC26XStepper link 2022-03-27 00:40:07 -05:00
Scott Lahteine
52a92ca24e 🔨 Use some v3 actions 2022-03-25 20:35:12 -05:00
Keith Bennett
ba2f6c66d3 🔨 Remove StaleBot age limit (#23907) 2022-03-17 22:19:00 -05:00
Keith Bennett
19e193410e 🔨 Include "More Data" issues in stale check (#23863) 2022-03-12 18:27:18 -06:00
Scott Lahteine
b9cef2e2e3 🚸 12345.6 num-to-string 2022-03-04 16:56:45 -06:00
ellensp
186d2ba6b4 🐛 Fix HAS_TMC26X feature path (#23757) 2022-02-17 18:40:16 -06:00
Scott Lahteine
4dfd398d7d 🐛 Patch Creality RAMPS FET / FAN pins
Improvement for multi-hotend setup by TH3D.
2022-02-17 18:40:16 -06:00
Giuseppe499
bfdb7c7135 🐛 Fix XATC divide-by-zero (#23743) 2022-02-17 18:40:16 -06:00
Mads Ynddal
bf067738f2 🐛 Fix XYZEval::set(XY, Z) and (XY, Z, E) (#23704)
Fix regression in #21953

Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2022-02-10 12:01:51 -06:00
Maeyanie
e028a3c441 🐛 Fix M852 report (#23660) 2022-02-10 12:01:16 -06:00
Timothy Hoogland
9847470b38 🐛 Fix EZBoard V2 Environment for OpenBLT (#23659) 2022-02-01 17:25:02 -06:00
Timothy Hoogland
51209667a5 🐛 Fix EZBoard V2 timer conflict (#23648) 2022-01-30 06:38:49 -06:00
Scott Lahteine
db4172b5fa 🔨 Prevent two [cron] in a row 2022-01-17 04:19:12 -06:00
Jim Watson
242192d03d 🐛 Fix SHOW_REMAINING_TIME compile (#23503) 2022-01-12 10:23:50 -06:00
ellensp
7135c3b185 🚑️ Fix M105 regression (#23505)
Fixes #23504
2022-01-12 10:23:50 -06:00
ellensp
c91d033b5d 🐛 Fix Arduino build issues (#23510) 2022-01-12 10:23:50 -06:00
Scott Lahteine
0470fbe0a1 🧑‍💻 Move PB0 init for MKS_ROBIN_NANO 2022-01-12 10:23:50 -06:00
Scott Lahteine
eb8d819325 🧑‍💻 Fewer string macros 2022-01-10 05:52:02 -06:00
DerAndere
41f80a4498 🚸 Include extra axes in position report (#23490) 2022-01-10 05:52:02 -06:00
David Ross Smith
e0f75d4f06 🚑️ Fix preheat target bug
Fixes Jyers/Marlin#1651
2022-01-09 04:41:07 -06:00
Scott Lahteine
42449b8683 🌐 Update auto home axis strings 2022-01-09 04:40:41 -06:00
Roman Moravčík
e23c696566 🌐 Update Slovak language (#23475) 2022-01-09 04:40:28 -06:00
Scott Lahteine
035f9b8e13 🔨 Rename (not copy) with board_build.rename 2022-01-09 04:34:42 -06:00
Miguel Risco-Castillo
49f8171f7a 🚸 BLTouch HS menu item for DWIN Enhanced UI (#23480) 2022-01-09 04:34:29 -06:00
ClockeNessMnstr
75d0e94d5b 🚸 Do G34 "Z Backoff" at full current 2022-01-09 04:33:24 -06:00
jdegenstein
915f610782 📌 LCD_FOR_MELZI for BTT E3 RRF (#23453) 2022-01-09 04:33:24 -06:00
Lefteris Garyfalakis
2231e00b2c 🌐 Localize E3V2 Enhanced UI (#23424) 2022-01-09 04:33:24 -06:00
Anson Liu
63f2b15396 📺 Tune ULTI_CONTROLLER encoder, enable PCA9632 (#23461) 2022-01-09 04:33:24 -06:00
Kyle Hu
f503722c45 🐛 Fix Artillery Ruby (startup code, build flags) (#23446) 2022-01-09 04:33:24 -06:00
Mike La Spina
4fd1de7fb7 🐛 Define required endstop enums (#23425) 2022-01-09 04:33:24 -06:00
Scott Lahteine
93126c0d02 🔨 Strip CR in mftest > awk 2022-01-09 04:33:24 -06:00
Scott Lahteine
80f77ea807 🐛 Fix strlen_P parameter error
Fixes #23447
2022-01-09 04:33:24 -06:00
Scott Lahteine
9ff8220b8a 🩹 Fix RADDS+RRD encoder button 2022-01-09 04:33:24 -06:00
hwmland
7754860289 🩹 RAMPS FET order overridable, E + Laser (#23428) 2022-01-09 04:33:24 -06:00
Jason Smith
4efe4788af ⬆️ Assert newer GCC in PIO via atmelavr@~3.4 (#23432) 2022-01-09 04:33:24 -06:00
Jason Smith
2faf4e2a99 💚 Fix Teensy CI test (#23433) 2022-01-09 04:33:24 -06:00
Scott Lahteine
9956e62674 🧑‍💻 Apply axis conditionals 2022-01-09 04:33:24 -06:00
Scott Lahteine
a732427329 🚨 Fix M906 warning 2022-01-09 04:33:24 -06:00
Mike La Spina
974883d2f6 🔧 Normal FET layout with Spindle/Laser (#23409) 2022-01-09 04:33:24 -06:00
Jason Smith
1170ed995e 🔧 Update deprecated auto_build.py (#23427) 2022-01-09 04:33:24 -06:00
Johannes Hörmann
24f9c3a777 🔨 Upload to Optiboot at 115200 (#23403) 2022-01-09 04:33:24 -06:00
Scott Lahteine
5ec384f40c M919 : Chopper Timing (#23400) 2022-01-09 04:33:24 -06:00
Jason Smith
6d7ffa6add 🔧 Only warn about enabled CONFIGURATION_EMBEDDING (#23408) 2022-01-09 04:33:24 -06:00
Scott Lahteine
dadd7516b5 🚑️ Fix thermal conditionals, structure 2022-01-09 04:33:24 -06:00
Robby Candra
f99732ba75 🔧 DWIN_MARLINUI sanity checks (#23399) 2022-01-09 04:33:24 -06:00
Scott Lahteine
5a9635aa58 🩺 Assert FAN_SOFT_PWM where required (#23383, #23477) 2022-01-09 04:33:24 -06:00
Lefteris Garyfalakis
1552c6d2a5 🎨 E3V2 corner leveling => tramming (#23375) 2022-01-09 04:33:24 -06:00
Miguel Risco-Castillo
06c2ed3c99 🚸 DWIN Enhanced improve, fix, and extend (#23240)
- Offset icon change to show mesh leveling status
- Reset extruder position when enter to Move menu
- New live end-stop diagnostic page
- Editable firmware retracts settings for Tune and filament settings menu
- Print Statistics page accessible from the Advanced Settings menu
- Reset printer draws the boot image
- Adds individual axes homing menu
- Adds probe deploy/stow to Probe Settings menu
- Updates lock screen
- Rebuilds main buttons to support text caption in other languages
- Increases probe offset limits to 60 mm
- Fix M303 PID variable update
- Fix Resume/Pause button update
- Fix redraw of print done
- Fix very large file name bug
- Fix bug in bed manual leveling
2022-01-09 04:33:24 -06:00
Scott Lahteine
430c5da54c 🚚 Rename L6470 G-code file 2022-01-09 04:33:24 -06:00
Scott Lahteine
5b9f3bd4b1 🧑‍💻 Remove extraneous 'inline' hints 2022-01-09 04:33:17 -06:00
Scott Lahteine
ccc66a8528 🎨 Misc. cleanup 2022-01-09 04:33:01 -06:00
Scott Lahteine
8abe314b18 🔨 Get FIRMWARE_BIN from env 2022-01-09 04:32:43 -06:00
Miguel Risco-Castillo
dc470eb10f 🐛 Fix EEPROM_INIT_NOW build hash test (#23479) 2022-01-09 01:31:03 -06:00
Miguel Risco-Castillo
4c5e57ae89 🩹 Reset DWIN CrealityUI print progress on start (#23481) 2022-01-09 01:31:03 -06:00
Scott Lahteine
5d7328df46 🧑‍💻 Add AXIS_COLLISION to catch broken parameters
\
2022-01-09 01:31:03 -06:00
Scott Lahteine
99c237e05e 🚸 Refine stepper-driver-related G-codes (#23372) 2022-01-09 01:31:03 -06:00
Scott Lahteine
56adbc3ebf 📝 Consistent pin header orientation 2022-01-09 01:31:03 -06:00
Scott Lahteine
4cfe812c18 📌 Define MKS Monster8 pins for MKS_MINI_12864
Fixes #23324
2022-01-09 01:31:03 -06:00
Scott Lahteine
27d2471ea3 🐛 Fix mffp usage 2022-01-09 01:31:03 -06:00
Scott Lahteine
61b9248c35 🎨 Pins and SDIO cleanup 2022-01-09 01:31:03 -06:00
EvilGremlin
c9561a8826 🔧 Check Chiron LCD requirements (#23353)
Co-Authored-By: EvilGremlin <22657714+EvilGremlin@users.noreply.github.com>
2022-01-09 01:31:03 -06:00
Scott Lahteine
58c84f17ba 🎨 Simplify some debug echos 2022-01-09 01:31:03 -06:00
Scott Lahteine
73b8320e9c 🔨 Add .vscode/extensions.json 2022-01-05 04:24:04 -06:00
ellensp
1c3f2498b1 🐛 Fix RRW Keypad & Zonestar buttons (#23388) 2022-01-05 04:24:04 -06:00
GHGiampy
4202baa409 🩹 Fix Enhanced UI max E speed (#23387) 2022-01-05 04:24:04 -06:00
1672 changed files with 110547 additions and 65525 deletions

29
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,29 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/python-3/.devcontainer/base.Dockerfile
# [Choice] Python version: 3, 3.9, 3.8, 3.7, 3.6
ARG VARIANT="3.9.0-buster"
FROM python:${VARIANT}
# [Option] Install Node.js
ARG INSTALL_NODE="true"
ARG NODE_VERSION="lts/*"
RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
# COPY requirements.txt /tmp/pip-tmp/
# RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
# && rm -rf /tmp/pip-tmp
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
# && apt-get -y install --no-install-recommends <your-package-list-here>
# [Optional] Uncomment this line to install global node packages.
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1
RUN pip install -U https://github.com/platformio/platformio-core/archive/develop.zip
RUN platformio update
# To get the test platforms
RUN pip install PyYaml
#ENV PATH /code/buildroot/bin/:/code/buildroot/tests/:${PATH}

View File

@@ -0,0 +1,51 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/python-3
{
"name": "Python 3",
"build": {
"dockerfile": "Dockerfile",
"context": "..",
"args": {
// Update 'VARIANT' to pick a Python version: 3, 3.6, 3.7, 3.8, 3.9
"VARIANT": "3.9.0-buster",
// Options
"INSTALL_NODE": "false",
"NODE_VERSION": "lts/*"
}
},
// Set *default* container specific settings.json values on container create.
"settings": {
"python.pythonPath": "/usr/local/bin/python",
"python.languageServer": "Pylance",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint"
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"platformio.platformio-ide",
"marlinfirmware.auto-build",
"editorconfig.editorconfig"
],
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "pip3 install --user -r requirements.txt",
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
// "remoteUser": "vscode"
}

View File

@@ -14,6 +14,10 @@ end_of_line = lf
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
[{*.py,*.conf,*.sublime-project}] [{*.py}]
indent_style = space
indent_size = 4
[{*.conf,*.sublime-project}]
indent_style = tab indent_style = tab
indent_size = 4 indent_size = 4

View File

@@ -1,169 +0,0 @@
name: 🪲 Report a bug
description: Create a bug report to help improve Marlin Firmware
title: "[BUG] (bug summary)"
body:
- type: markdown
attributes:
value: >
Do you want to ask a question? Are you looking for support? Please use one of the [support links](https://github.com/MarlinFirmware/Marlin/issues/new/choose).
- type: markdown
attributes:
value: |
**Thank you for reporting a bug in Marlin Firmware!**
## Before Reporting a Bug
- Read and understand Marlin's [Code of Conduct](https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md). You are expected to comply with it, including treating everyone with respect.
- Test with the [`bugfix-2.0.x` branch](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.0.x.zip) to see whether the issue still exists.
## Instructions
Please follow the instructions below. Failure to do so may result in your issue being closed. See [Contributing to Marlin](https://github.com/MarlinFirmware/Marlin/blob/2.0.x/.github/contributing.md) for additional guidelines.
1. Provide a good title starting with [BUG].
2. Fill out all sections of this bug report form.
3. Always attach configuration files so we can build and test your setup.
- type: dropdown
attributes:
label: Did you test the latest `bugfix-2.0.x` code?
description: >-
Always try the latest code to make sure the issue you are reporting is not already fixed. To download
the latest code just [click this link](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.0.x.zip).
options:
- Yes, and the problem still exists.
- No, but I will test it now!
validations:
required: true
- type: markdown
attributes:
value: |
# Bug Details
- type: textarea
attributes:
label: Bug Description
description: >-
Describe the bug in this section. Tell us what you were trying to do and what
happened that you did not expect. Provide a clear and concise description of the
problem and include as many details as possible.
placeholder: |
Marlin doesn't work.
validations:
required: true
- type: input
attributes:
label: Bug Timeline
description: Is this a new bug or an old issue? When did it first start?
- type: textarea
attributes:
label: Expected behavior
description: >-
What did you expect to happen?
placeholder: I expected it to move left.
- type: textarea
attributes:
label: Actual behavior
description: What actually happened instead?
placeholder: It moved right instead of left.
- type: textarea
attributes:
label: Steps to Reproduce
description: >-
Please describe the steps needed to reproduce the issue.
placeholder: |
1. [First Step] ...
2. [Second Step] ...
3. [and so on] ...
- type: markdown
attributes:
value: |
# Your Setup
- type: input
attributes:
label: Version of Marlin Firmware
description: "See the About Menu on the LCD or the output of `M115`. NOTE: For older releases we only patch critical bugs."
validations:
required: true
- type: input
attributes:
label: Printer model
description: Creality Ender 3, Prusa mini, or Kossel Delta?
- type: input
attributes:
label: Electronics
description: Stock electronics, upgrade board, or something else?
- type: input
attributes:
label: Add-ons
description: Please list any hardware add-ons that could be involved.
- type: dropdown
attributes:
label: Bed Leveling
description: What kind of bed leveling compensation are you using?
options:
- UBL Bilinear mesh
- ABL Bilinear mesh
- ABL Linear grid
- ABL 3-point
- MBL Manual Bed Leveling
- No Bed Leveling
- type: dropdown
attributes:
label: Your Slicer
description: Do you use Slic3r, Prusa Slicer, Simplify3D, IdeaMaker...?
options:
- Slic3r
- Simplify3D
- Prusa Slicer
- IdeaMaker
- Cura
- Other (explain below)
- type: dropdown
attributes:
label: Host Software
description: Do you use OctoPrint, Repetier Host, Pronterface...?
options:
- SD Card (headless)
- Repetier Host
- OctoPrint
- Pronterface
- Cura
- Same as my slicer
- Other (explain below)
- type: markdown
attributes:
value: >-
## Other things to include
Please also be sure to include these items to help with troubleshooting:
* **A ZIP file** containing your `Configuration.h` and `Configuration_adv.h`.
(Please don't paste lengthy configuration text here.)
* **Log output** from the host. (`M111 S247` for maximum logging.)
* **Images or videos** demonstrating the problem, if it helps to make it clear.
* **A G-Code file** that exposes the problem, if not affecting _all_ G-code.
If you've made any other modifications to the firmware, please describe them in detail in the space provided.
When pasting formatted text into the box below don't forget to put ` ``` ` (on its own line) before and after to make it readable.
- type: textarea
attributes:
label: Additional information & file uploads

View File

@@ -1,20 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: 📖 Marlin Documentation
url: http://marlinfw.org/
about: Lots of documentation on installing and using Marlin.
- name: 👤 MarlinFirmware Facebook group
url: https://www.facebook.com/groups/1049718498464482
about: Please ask and answer questions here.
- name: 🕹 Marlin on Discord
url: https://discord.gg/n5NJ59y
about: Join the Discord server for support and discussion.
- name: 🔗 Marlin Discussion Forum
url: http://forums.reprap.org/list.php?415
about: A searchable web forum hosted by RepRap dot org.
- name: 📺 Marlin Videos on YouTube
url: https://www.youtube.com/results?search_query=marlin+firmware
about: Tutorials and more from Marlin users all around the world. Great for new users!
- name: 💸 Want to donate?
url: https://www.thinkyhead.com/donate-to-marlin
about: Please take a look at the various options to support Marlin Firmware's development financially!

View File

@@ -1,44 +0,0 @@
name: ✨ Request a feature
description: Request a new Marlin Firmware feature
title: "[FR] (feature summary)"
labels: 'T: Feature Request'
body:
- type: markdown
attributes:
value: >
Do you want to ask a question? Are you looking for support? Please use one of the [support links](https://github.com/MarlinFirmware/Marlin/issues/new/choose).
- type: markdown
attributes:
value: >
**Thank you for requesting a new Marlin Firmware feature!**
## Before Requesting a Feature
- Read and understand Marlin's [Code of Conduct](https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md). You are expected to comply with it, including treating everyone with respect.
- Check the latest [`bugfix-2.0.x` branch](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.0.x.zip) to see if the feature already exists.
- Before you proceed with your request, please consider if it is necessary to make it into a firmware feature, or if it may be better suited for a slicer or host feature.
- type: textarea
attributes:
label: Is your feature request related to a problem? Please describe.
description: A clear description of the problem (e.g., "I need X but Marlin can't do it [...]").
- type: textarea
attributes:
label: Are you looking for hardware support?
description: Tell us the printer, board, or peripheral that needs support.
- type: textarea
attributes:
label: Describe the feature you want
description: A clear description of the feature and how you think it should work.
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.

View File

@@ -34,8 +34,11 @@ This project and everyone participating in it is governed by the [Marlin Code of
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions. We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
* [Marlin RepRap forum](https://reprap.org/forum/list.php?415) - [Marlin Documentation](https://marlinfw.org) - Official Marlin documentation
* [MarlinFirmware on Facebook](https://www.facebook.com/groups/1049718498464482/) - Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/)
- RepRap.org [Marlin Forum](https://forums.reprap.org/list.php?415)
- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/)
- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube
If chat is more your speed, you can join the MarlinFirmware Discord server: If chat is more your speed, you can join the MarlinFirmware Discord server:
@@ -50,13 +53,13 @@ If chat is more your speed, you can join the MarlinFirmware Discord server:
This section guides you through submitting a Bug Report for Marlin. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports. This section guides you through submitting a Bug Report for Marlin. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](issue_template.md), the information it asks for helps us resolve issues faster. Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster.
> **Note:** Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888. > **Note:** Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
#### How Do I Submit A (Good) Bug Report? #### How Do I Submit A (Good) Bug Report?
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Use the New Issue button to create an issue and provide the following information by filling in [the template](issue_template.md). Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Use the New Issue button to create an issue and provide the following information by filling in [the template](ISSUE_TEMPLATE/bug_report.yml).
Explain the problem and include additional details to help maintainers reproduce the problem: Explain the problem and include additional details to help maintainers reproduce the problem:
@@ -88,12 +91,12 @@ Include details about your configuration and environment:
This section guides you through submitting a suggestion for Marlin, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions. This section guides you through submitting a suggestion for Marlin, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions.
Before creating a suggestion, please check [this list](#before-submitting-a-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](issue_template.md), including the steps that you imagine you would take if the feature you're requesting existed. Before creating a suggestion, please check [this list](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-feature-request). Fill in [the template](ISSUE_TEMPLATE/feature_request.yml), including the steps that you imagine you would take if the feature you're requesting existed.
#### Before Submitting a Feature Request #### Before Submitting a Feature Request
* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html). * **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
* **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aissue)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. * **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
#### How Do I Submit A (Good) Feature Request? #### How Do I Submit A (Good) Feature Request?
@@ -116,7 +119,7 @@ Unsure where to begin contributing to Marlin? You can start by looking through t
### Pull Requests ### Pull Requests
Pull Requests should always be targeted to working branches (e.g., `bugfix-1.1.x` and/or `bugfix-2.0.x`) and never to release branches (e.g., `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation. Pull Requests should always be targeted to working branches (e.g., `bugfix-2.1.x` and/or `bugfix-1.1.x`) and never to release branches (e.g., `2.0.x` and/or `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
* Fill in [the required template](pull_request_template.md). * Fill in [the required template](pull_request_template.md).
* Don't include issue numbers in the PR title. * Don't include issue numbers in the PR title.

View File

@@ -1,35 +0,0 @@
<!--
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.0.x/.github/code_of_conduct.md
Do you want to ask a question? Are you looking for support? Please don't post here. Instead use one of the following options:
- The Marlin Firmware forum at https://reprap.org/forum/list.php?415
- The MarlinFirmware Facebook Group at https://www.facebook.com/groups/1049718498464482/
- The MarlinFirmware Discord Server at https://discord.gg/n5NJ59y.
Before filing an issue be sure to test the latest "bugfix" branch to see whether the issue is already addressed.
-->
### Description
<!-- Description of the bug or requested feature -->
### Steps to Reproduce
<!-- If this is a Bug Report, please describe the steps needed to reproduce the issue -->
1. [First Step]
2. [Second Step]
3. [and so on...]
**Expected behavior:** [What you expect to happen]
**Actual behavior:** [What actually happens]
#### Additional Information
* Include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files.
* Provide pictures or links to videos that clearly demonstrate the issue.
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.

40
.github/lock.yml vendored
View File

@@ -1,40 +0,0 @@
#
# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app
#
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 60
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels: [ 'no-locking' ]
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue for
related bugs.
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: true
# Limit to only `issues` or `pulls`
# only: issues
# Optionally, specify configuration settings just for `issues` or `pulls`
# issues:
# exemptLabels:
# - help-wanted
# lockLabel: outdated
# pulls:
# daysUntilLock: 30
# Repository to extend settings from
# _extends: repo

View File

@@ -1,36 +0,0 @@
#
# bump-date.yml
# Bump the distribution date once per day
#
name: Bump Distribution Date
on:
schedule:
- cron: '0 0 * * *'
jobs:
bump_date:
name: Bump Distribution Date
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-latest
steps:
- name: Check out bugfix-2.0.x
uses: actions/checkout@v2
with:
ref: bugfix-2.0.x
- name: Bump Distribution Date
run: |
# Inline Bump Script
DIST=$( date +"%Y-%m-%d" )
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/Version.h" && \
git config user.name "${GITHUB_ACTOR}" && \
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \
git add . && \
git commit -m "[cron] Bump distribution date ($DIST)" && \
git push

View File

@@ -1,33 +0,0 @@
#
# check-pr.yml
# Close PRs directed at release branches
#
name: PR Bad Target
on:
pull_request_target:
types: [opened]
branches:
- 1.0.x
- 1.1.x
- 2.0.x
jobs:
bad_target:
name: PR Bad Target
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-latest
steps:
- uses: superbrothers/close-pull-request@v3
with:
comment: >
Thanks for your contribution! Unfortunately we can't accept PRs directed at release branches. We make patches to the bugfix branches and only later do we push them out as releases.
Please redo this PR starting with the `bugfix-2.0.x` branch and be careful to target `bugfix-2.0.x` when resubmitting the PR.
It may help to set your fork's default branch to `bugfix-2.0.x`.
See [this page](http://marlinfw.org/docs/development/getting_started_pull_requests.html) for full instructions.

View File

@@ -1,39 +0,0 @@
#
# clean-closed.yml
# Remove obsolete labels when an Issue or PR is closed
#
name: Clean Closed
on:
pull_request:
types: [closed]
issues:
types: [closed]
jobs:
remove_label:
runs-on: ubuntu-latest
strategy:
matrix:
label:
- "S: Don't Merge"
- "S: Hold for 2.1"
- "S: Please Merge"
- "S: Please Test"
- "help wanted"
- "Needs: Discussion"
- "Needs: Documentation"
- "Needs: More Data"
- "Needs: Patch"
- "Needs: Testing"
- "Needs: Work"
steps:
- uses: actions/checkout@v2
- name: Remove Labels
uses: actions-ecosystem/action-remove-labels@v1
with:
github_token: ${{ github.token }}
labels: ${{ matrix.label }}

View File

@@ -1,28 +0,0 @@
#
# close-stale.yml
# Close open issues after a period of inactivity
#
name: Close Stale Issues
on:
schedule:
- cron: "22 1 * * *"
jobs:
stale:
name: Close Stale Issues
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue has had no activity in the last 60 days. Please add a reply if you want to keep this issue active, otherwise it will be automatically closed within 10 days.'
days-before-stale: 60
days-before-close: 10
stale-issue-label: 'stale-closing-soon'
exempt-all-assignees: true
exempt-issue-labels: 'Bug: Confirmed !,T: Feature Request,Needs: Discussion,Needs: Documentation,Needs: More Data,Needs: Patch,Needs: Work,Needs: Testing,help wanted,no-locking'

View File

@@ -1,32 +0,0 @@
#
# lock-closed.yml
# Lock closed issues after a period of inactivity
#
name: Lock Closed Issues
on:
schedule:
- cron: '0 1/13 * * *'
jobs:
lock:
name: Lock Closed Issues
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
process-only: 'issues'
issue-lock-inactive-days: '60'
issue-exclude-created-before: '2017-07-01T00:00:00Z'
issue-exclude-labels: 'no-locking'
issue-lock-labels: ''
issue-lock-comment: >
This issue has been automatically locked since there
has not been any recent activity after it was closed.
Please open a new issue for related bugs.
issue-lock-reason: ''

View File

@@ -1,145 +0,0 @@
#
# test-builds.yml
# Do test builds to catch compile errors
#
name: CI
on:
pull_request:
branches:
- bugfix-2.0.x
paths-ignore:
- config/**
- data/**
- docs/**
- '**/*.md'
push:
branches:
- bugfix-2.0.x
paths-ignore:
- config/**
- data/**
- docs/**
- '**/*.md'
jobs:
test_builds:
name: Run All Tests
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-latest
strategy:
matrix:
test-platform:
# Base Environments
- DUE
- DUE_archim
- esp32
- linux_native
- mega2560
- at90usb1286_dfu
- teensy31
- teensy35
- teensy41
- SAMD51_grandcentral_m4
# Extended AVR Environments
- FYSETC_F6
- mega1280
- rambo
- sanguino1284p
- sanguino644p
# STM32F1 (Maple) Environments
#- STM32F103RC_btt_maple
- STM32F103RC_btt_USB_maple
- STM32F103RC_fysetc_maple
- STM32F103RC_meeb
- jgaurora_a5s_a1_maple
- STM32F103VE_longer_maple
#- mks_robin_maple
- mks_robin_lite_maple
- mks_robin_pro_maple
#- mks_robin_nano35_maple
#- STM32F103RET6_creality_maple
- STM32F103VE_ZM3E4V2_USB_maple
# STM32 (ST) Environments
- STM32F103RC_btt
#- STM32F103RC_btt_USB
- STM32F103RE_btt
- STM32F103RE_btt_USB
- STM32F103RET6_creality
- STM32F103VE_longer
- STM32F407VE_black
- STM32F401VE_STEVAL
- BIGTREE_BTT002
- BIGTREE_SKR_PRO
- BIGTREE_GTR_V1_0
- mks_robin
- ARMED
- FYSETC_S6
- STM32F070CB_malyan
- STM32F070RB_malyan
- malyan_M300
- FLYF407ZG
- rumba32
- LERDGEX
- LERDGEK
- mks_robin_nano35
- NUCLEO_F767ZI
- REMRAM_V1
- BTT_SKR_SE_BX
- chitu_f103
- Index_Mobo_Rev03
# Put lengthy tests last
- LPC1768
- LPC1769
# Non-working environment tests
#- at90usb1286_cdc
#- STM32F103CB_malyan
#- STM32F103RE
#- mks_robin_mini
steps:
- name: Check out the PR
uses: actions/checkout@v2
- name: Cache pip
uses: actions/cache@v2
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Cache PlatformIO
uses: actions/cache@v2
with:
path: ~/.platformio
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
- name: Select Python 3.7
uses: actions/setup-python@v2
with:
python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax.
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
- name: Install PlatformIO
run: |
pip install -U https://github.com/platformio/platformio-core/archive/develop.zip
platformio update
- name: Run ${{ matrix.test-platform }} Tests
run: |
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}

View File

@@ -1,22 +0,0 @@
#
# unlock-reopened.yml
# Unlock an issue whenever it is re-opened
#
name: "Unlock reopened issue"
on:
issues:
types: [reopened]
jobs:
unlock:
name: Unlock Reopened
if: github.repository == 'MarlinFirmware/Marlin'
runs-on: ubuntu-latest
steps:
- uses: OSDKDev/unlock-issues@v1.1
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"

54
.gitignore vendored
View File

@@ -21,36 +21,18 @@
# Generated files # Generated files
_Version.h _Version.h
bdf2u8g bdf2u8g.exe
genpages.exe
marlin_config.json marlin_config.json
mczip.h mczip.h
*.gen *.gen
*.sublime-workspace *.sublime-workspace
#
# OS # OS
#
applet/ applet/
.DS_Store .DS_Store
# # Compiled C++ Object files
# Misc
#
*~
*.orig
*.rej
*.bak
*.idea
*.s
*.i
*.ii
*.swp
tags
#
# C++
#
# Compiled Object files
*.slo *.slo
*.lo *.lo
*.o *.o
@@ -81,10 +63,7 @@ tags
*.out *.out
*.app *.app
# # Compiled C Object files
# C
#
# Object files
*.o *.o
*.ko *.ko
*.obj *.obj
@@ -141,18 +120,16 @@ __vm/
vc-fileutils.settings vc-fileutils.settings
# Visual Studio Code # Visual Studio Code
.vscode .vscode/*
.vscode/.browse.c_cpp.db* !.vscode/extensions.json
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/*.db
#Simulation # Simulation files
imgui.ini imgui.ini
eeprom.dat eeprom.dat
spi_flash.bin spi_flash.bin
fs.img
#cmake # CMake
CMakeLists.txt CMakeLists.txt
src/CMakeLists.txt src/CMakeLists.txt
CMakeListsPrivate.txt CMakeListsPrivate.txt
@@ -173,3 +150,16 @@ __pycache__
# IOLogger logs # IOLogger logs
*_log.csv *_log.csv
# Misc.
*~
*.orig
*.rej
*.bak
*.idea
*.i
*.ii
*.swp
tags
*.logs
*.bak

11
.vscode/extensions.json vendored Normal file
View File

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

View File

@@ -1,11 +1,16 @@
SCRIPTS_DIR := buildroot/share/scripts
CONTAINER_RT_BIN := docker
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
CONTAINER_IMAGE := marlin-dev
help: help:
@echo "Tasks for local development:" @echo "Tasks for local development:"
@echo "* tests-single-ci: Run a single test from inside the CI" @echo "* tests-single-ci: Run a single test from inside the CI"
@echo "* tests-single-local: Run a single test locally" @echo "* tests-single-local: Run a single test locally"
@echo "* tests-single-local-docker: Run a single test locally, using docker-compose" @echo "* tests-single-local-docker: Run a single test locally, using docker"
@echo "* tests-all-local: Run all tests locally" @echo "* tests-all-local: Run all tests locally"
@echo "* tests-all-local-docker: Run all tests locally, using docker-compose" @echo "* tests-all-local-docker: Run all tests locally, using docker"
@echo "* setup-local-docker: Setup local docker-compose" @echo "* setup-local-docker: Build the local docker image"
@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"
@@ -27,26 +32,28 @@ tests-single-ci:
tests-single-local: tests-single-local:
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \ export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)" && run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
.PHONY: tests-single-local .PHONY: tests-single-local
tests-single-local-docker: tests-single-local-docker:
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)" @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) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
.PHONY: tests-single-local-docker .PHONY: tests-single-local-docker
tests-all-local: tests-all-local:
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 $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done && for TEST_TARGET in $$($(SCRIPTS_DIR)/get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
.PHONY: tests-all-local .PHONY: tests-all-local
tests-all-local-docker: tests-all-local-docker:
docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) @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) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
.PHONY: tests-all-local-docker .PHONY: tests-all-local-docker
setup-local-docker: setup-local-docker:
docker-compose build $(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
.PHONY: setup-local-docker .PHONY: setup-local-docker

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -109,7 +109,7 @@ LIQUID_TWI2 ?= 0
# This defines if Wire is needed # This defines if Wire is needed
WIRE ?= 0 WIRE ?= 0
# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h) # This defines if Tone is needed (i.e., SPEAKER is defined in Configuration.h)
# Disabling this (and SPEAKER) saves approximately 350 bytes of memory. # Disabling this (and SPEAKER) saves approximately 350 bytes of memory.
TONE ?= 1 TONE ?= 1
@@ -132,7 +132,7 @@ CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ )
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ ) CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) ))) CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1) ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
@echo This version of GCC is likely broken. Enabling relocation workaround. $(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
RELOC_WORKAROUND = 1 RELOC_WORKAROUND = 1
endif endif
@@ -307,133 +307,22 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1154)
else ifeq ($(HARDWARE_MOTHERBOARD),1155) else ifeq ($(HARDWARE_MOTHERBOARD),1155)
# Tenlog D3 Hero 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,5,6 Pro IDEX printers
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)
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
# 3Drag Controller # Zonestar zrib V5.3 (Chinese RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1100) else ifeq ($(HARDWARE_MOTHERBOARD),1163)
# Velleman K8200 Controller (derived from 3Drag Controller) # Pxmalion Core I3
else ifeq ($(HARDWARE_MOTHERBOARD),1101) else ifeq ($(HARDWARE_MOTHERBOARD),1164)
# Velleman K8400 Controller (derived from 3Drag Controller)
else ifeq ($(HARDWARE_MOTHERBOARD),1102)
# Velleman K8600 Controller (Vertex Nano)
else ifeq ($(HARDWARE_MOTHERBOARD),1103)
# Velleman K8800 Controller (Vertex Delta)
else ifeq ($(HARDWARE_MOTHERBOARD),1104)
# 2PrintBeta BAM&DICE with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1105)
# 2PrintBeta BAM&DICE Due with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
# MKS BASE v1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
# MKS v1.4 with A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
# MKS v1.5 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
# MKS v1.6 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
# MKS GEN v1.3 or 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
# MKS GEN L
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
# zrib V2.0 control board (Chinese RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
# BigTreeTech or BIQU KFB2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
# Felix 2.0+ Electronics Board (RAMPS like)
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
# Invent-A-Part RigidBoard
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
# Invent-A-Part RigidBoard V2
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
# Sainsmart 2-in-1 board
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
# Ultimaker
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
MCU ?= atmega1280
PROG_MCU ?= m1280
# Azteeg X3
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
# Azteeg X3 Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
# Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
# Raise3D Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
# Rapide Lite RL200 Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
# Formbot T-Rex 2 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
# Formbot T-Rex 3
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
# Formbot Raptor
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
# Formbot Raptor 2
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
# bq ZUM Mega 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
# TriGorilla Anycubic version 1.3 based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
# TriGorilla Anycubic version 1.4 based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
# TriGorilla Anycubic version 1.4 Rev 1.1
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
# Creality: Ender-4, CR-8
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
# Creality: CR10S, CR20, CR-X
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
# Dagoma F5
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
# FYSETC F6 1.3
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
# FYSETC F6 1.5
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
# Duplicator i3 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
# VORON
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
# TRONXY V3 1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
# Z-Bolt X Series
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
# TT OSCAR
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
# Overlord/Overlord Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
# ADIMLab Gantry v1
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
# ADIMLab Gantry v2
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
# BIQU Tango V1
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
# MKS GEN L V2
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
# MKS GEN L V2.1
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
# Copymaster 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
# Ortur 4
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
# Tenlog D3 Hero
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
# #
# RAMBo and derivatives # RAMBo and derivatives
@@ -512,7 +401,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1324)
else ifeq ($(HARDWARE_MOTHERBOARD),1325) else ifeq ($(HARDWARE_MOTHERBOARD),1325)
# Intamsys 4.0 (Funmat HT) # Intamsys 4.0 (Funmat HT)
else ifeq ($(HARDWARE_MOTHERBOARD),1326) else ifeq ($(HARDWARE_MOTHERBOARD),1326)
# Malyan M180 Mainboard Version 2 (no display function, direct gcode only) # Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
else ifeq ($(HARDWARE_MOTHERBOARD),1327) else ifeq ($(HARDWARE_MOTHERBOARD),1327)
# Geeetech GT2560 Rev B for A20(M/T/D) # Geeetech GT2560 Rev B for A20(M/T/D)
else ifeq ($(HARDWARE_MOTHERBOARD),1328) else ifeq ($(HARDWARE_MOTHERBOARD),1328)

View File

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

211
Marlin/config.ini Normal file
View File

@@ -0,0 +1,211 @@
#
# Marlin Firmware
# config.ini - Options to apply before the build
#
[config:base]
ini_use_config = none
# Load all config: sections in this file
;ini_use_config = all
# Load config file relative to Marlin/
;ini_use_config = another.ini
# Download configurations from GitHub
;ini_use_config = example/Creality/Ender-5 Plus @ bugfix-2.1.x
# Download configurations from your server
;ini_use_config = https://me.myserver.com/path/to/configs
# Evaluate config:base and do a config dump
;ini_use_config = base
;config_export = 2
[config:minimal]
motherboard = BOARD_RAMPS_14_EFB
serial_port = 0
baudrate = 250000
use_watchdog = on
thermal_protection_hotends = on
thermal_protection_hysteresis = 4
thermal_protection_period = 40
bufsize = 4
block_buffer_size = 16
max_cmd_size = 96
extruders = 1
temp_sensor_0 = 1
temp_hysteresis = 3
heater_0_mintemp = 5
heater_0_maxtemp = 275
preheat_1_temp_hotend = 180
bang_max = 255
pidtemp = on
pid_k1 = 0.95
pid_max = BANG_MAX
pid_functional_range = 10
default_kp = 22.20
default_ki = 1.08
default_kd = 114.00
x_driver_type = A4988
y_driver_type = A4988
z_driver_type = A4988
e0_driver_type = A4988
x_bed_size = 200
x_min_pos = 0
x_max_pos = X_BED_SIZE
y_bed_size = 200
y_min_pos = 0
y_max_pos = Y_BED_SIZE
z_min_pos = 0
z_max_pos = 200
x_home_dir = -1
y_home_dir = -1
z_home_dir = -1
use_xmin_plug = on
use_ymin_plug = on
use_zmin_plug = on
x_min_endstop_inverting = false
y_min_endstop_inverting = false
z_min_endstop_inverting = false
default_axis_steps_per_unit = { 80, 80, 400, 500 }
axis_relative_modes = { false, false, false, false }
default_max_feedrate = { 300, 300, 5, 25 }
default_max_acceleration = { 3000, 3000, 100, 10000 }
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
homing_bump_divisor = { 2, 2, 4 }
x_enable_on = 0
y_enable_on = 0
z_enable_on = 0
e_enable_on = 0
invert_x_dir = false
invert_y_dir = true
invert_z_dir = false
invert_e0_dir = false
invert_e_step_pin = false
invert_x_step_pin = false
invert_y_step_pin = false
invert_z_step_pin = false
disable_x = false
disable_y = false
disable_z = false
disable_e = false
proportional_font_ratio = 1.0
default_nominal_filament_dia = 1.75
junction_deviation_mm = 0.013
default_acceleration = 3000
default_travel_acceleration = 3000
default_retract_acceleration = 3000
default_minimumfeedrate = 0.0
default_mintravelfeedrate = 0.0
minimum_planner_speed = 0.05
min_steps_per_segment = 6
default_minsegmenttime = 20000
[config:basic]
bed_overshoot = 10
busy_while_heating = on
default_ejerk = 5.0
default_keepalive_interval = 2
default_leveling_fade_height = 0.0
disable_inactive_extruder = on
display_charset_hd44780 = JAPANESE
eeprom_boot_silent = on
eeprom_chitchat = on
endstoppullups = on
extrude_maxlength = 200
extrude_mintemp = 170
host_keepalive_feature = on
hotend_overshoot = 15
jd_handle_small_segments = on
lcd_info_screen_style = 0
lcd_language = en
max_bed_power = 255
mesh_inset = 0
min_software_endstops = on
max_software_endstops = on
min_software_endstop_x = on
min_software_endstop_y = on
min_software_endstop_z = on
max_software_endstop_x = on
max_software_endstop_y = on
max_software_endstop_z = on
preheat_1_fan_speed = 0
preheat_1_label = "PLA"
preheat_1_temp_bed = 70
prevent_cold_extrusion = on
prevent_lengthy_extrude = on
printjob_timer_autostart = on
probing_margin = 10
show_bootscreen = on
soft_pwm_scale = 0
string_config_h_author = "(none, default config)"
temp_bed_hysteresis = 3
temp_bed_residency_time = 10
temp_bed_window = 1
temp_residency_time = 10
temp_window = 1
validate_homing_endstops = on
xy_probe_feedrate = (133*60)
z_clearance_between_probes = 5
z_clearance_deploy_probe = 10
z_clearance_multi_probe = 5
[config:advanced]
arc_support = on
auto_report_temperatures = on
autotemp = on
autotemp_oldweight = 0.98
bed_check_interval = 5000
default_stepper_deactive_time = 120
default_volumetric_extruder_limit = 0.00
disable_inactive_e = true
disable_inactive_x = true
disable_inactive_y = true
disable_inactive_z = true
e0_auto_fan_pin = -1
encoder_100x_steps_per_sec = 80
encoder_10x_steps_per_sec = 30
encoder_rate_multiplier = on
extended_capabilities_report = on
extruder_auto_fan_speed = 255
extruder_auto_fan_temperature = 50
fanmux0_pin = -1
fanmux1_pin = -1
fanmux2_pin = -1
faster_gcode_parser = on
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_divisor = 2
temp_sensor_bed = 0
thermal_protection_bed_hysteresis = 2
thermocouple_max_errors = 15
tx_buffer_size = 0
watch_bed_temp_increase = 2
watch_bed_temp_period = 60
watch_temp_increase = 2
watch_temp_period = 20

View File

@@ -23,6 +23,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#include "HAL.h" #include "HAL.h"
#include <avr/wdt.h>
#ifdef USBCON #ifdef USBCON
DefaultSerial1 MSerial0(false, Serial); DefaultSerial1 MSerial0(false, Serial);
@@ -36,7 +37,7 @@
// ------------------------ // ------------------------
// Don't initialize/override variable (which would happen in .init4) // Don't initialize/override variable (which would happen in .init4)
uint8_t reset_reason __attribute__((section(".noinit"))); uint8_t MarlinHAL::reset_reason __attribute__((section(".noinit")));
// ------------------------ // ------------------------
// Public functions // Public functions
@@ -45,22 +46,22 @@ uint8_t reset_reason __attribute__((section(".noinit")));
__attribute__((naked)) // Don't output function pro- and epilogue __attribute__((naked)) // Don't output function pro- and epilogue
__attribute__((used)) // Output the function, even if "not used" __attribute__((used)) // Output the function, even if "not used"
__attribute__((section(".init3"))) // Put in an early user definable section __attribute__((section(".init3"))) // Put in an early user definable section
void HAL_save_reset_reason() { void save_reset_reason() {
#if ENABLED(OPTIBOOT_RESET_REASON) #if ENABLED(OPTIBOOT_RESET_REASON)
__asm__ __volatile__( __asm__ __volatile__(
A("STS %0, r2") A("STS %0, r2")
: "=m"(reset_reason) : "=m"(hal.reset_reason)
); );
#else #else
reset_reason = MCUSR; hal.reset_reason = MCUSR;
#endif #endif
// Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop // Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop
MCUSR = 0; hal.clear_reset_source();
wdt_disable(); wdt_disable();
} }
void HAL_init() { void MarlinHAL::init() {
// Init Servo Pins // Init Servo Pins
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
#if HAS_SERVO_0 #if HAS_SERVO_0
@@ -75,9 +76,11 @@ void HAL_init() {
#if HAS_SERVO_3 #if HAS_SERVO_3
INIT_SERVO(3); INIT_SERVO(3);
#endif #endif
init_pwm_timers(); // Init user timers to default frequency - 1000HZ
} }
void HAL_reboot() { void MarlinHAL::reboot() {
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
while (1) { /* run out the watchdog */ } while (1) { /* run out the watchdog */ }
#else #else
@@ -86,6 +89,62 @@ void HAL_reboot() {
#endif #endif
} }
// ------------------------
// Watchdog Timer
// ------------------------
#if ENABLED(USE_WATCHDOG)
#include <avr/wdt.h>
#include "../../MarlinCore.h"
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
void MarlinHAL::watchdog_init() {
#if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
#define WDTO_NS WDTO_8S
#else
#define WDTO_NS WDTO_4S
#endif
#if ENABLED(WATCHDOG_RESET_MANUAL)
// Enable the watchdog timer, but only for the interrupt.
// Take care, as this requires the correct order of operation, with interrupts disabled.
// See the datasheet of any AVR chip for details.
wdt_reset();
cli();
_WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
_WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
// So worked for up to WDTO_2S
sei();
wdt_reset();
#else
wdt_enable(WDTO_NS); // The function handles the upper bit correct.
#endif
//delay(10000); // test it!
}
//===========================================================================
//=================================== ISR ===================================
//===========================================================================
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
#if ENABLED(WATCHDOG_RESET_MANUAL)
ISR(WDT_vect) {
sei(); // With the interrupt driven serial we need to allow interrupts.
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
minkill(); // interrupt-safe final kill and infinite loop
}
#endif
// Reset watchdog. MUST be called at least every 4 seconds after the
// first watchdog_init or AVR will go into emergency procedures.
void MarlinHAL::watchdog_refresh() { wdt_reset(); }
#endif // USE_WATCHDOG
// ------------------------
// Free Memory Accessor
// ------------------------
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
#include "../../sd/SdFatUtil.h" #include "../../sd/SdFatUtil.h"
@@ -93,20 +152,20 @@ void HAL_reboot() {
#else // !SDSUPPORT #else // !SDSUPPORT
extern "C" { extern "C" {
extern char __bss_end; extern char __bss_end;
extern char __heap_start; extern char __heap_start;
extern void* __brkval; extern void* __brkval;
int freeMemory() { int freeMemory() {
int free_memory; int free_memory;
if ((int)__brkval == 0) if ((int)__brkval == 0)
free_memory = ((int)&free_memory) - ((int)&__bss_end); free_memory = ((int)&free_memory) - ((int)&__bss_end);
else else
free_memory = ((int)&free_memory) - ((int)__brkval); free_memory = ((int)&free_memory) - ((int)__brkval);
return free_memory; return free_memory;
}
} }
}
#endif // !SDSUPPORT #endif // !SDSUPPORT

View File

@@ -19,17 +19,20 @@
*/ */
#pragma once #pragma once
/**
* HAL for Arduino AVR
*/
#include "../shared/Marduino.h" #include "../shared/Marduino.h"
#include "../shared/HAL_SPI.h" #include "../shared/HAL_SPI.h"
#include "fastio.h" #include "fastio.h"
#include "watchdog.h"
#include "math.h" #include "math.h"
#ifdef USBCON #ifdef USBCON
#include <HardwareSerial.h> #include <HardwareSerial.h>
#else #else
#define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion
#include "MarlinSerial.h" #include "MarlinSerial.h"
#define BOARD_NO_NATIVE_USB
#endif #endif
#include <stdint.h> #include <stdint.h>
@@ -74,9 +77,9 @@
#define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli() #define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli()
#define CRITICAL_SECTION_END() SREG = _sreg #define CRITICAL_SECTION_END() SREG = _sreg
#endif #endif
#define ISRS_ENABLED() TEST(SREG, SREG_I)
#define ENABLE_ISRS() sei() #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
#define DISABLE_ISRS() cli() #define PWM_FREQUENCY 1000 // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
// ------------------------ // ------------------------
// Types // Types
@@ -84,16 +87,15 @@
typedef int8_t pin_t; typedef int8_t pin_t;
#define SHARED_SERVOS HAS_SERVOS #define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
#define HAL_SERVO_LIB Servo
class Servo;
typedef Servo hal_servo_t;
// ------------------------ // ------------------------
// Public Variables
// ------------------------
extern uint8_t reset_reason;
// Serial ports // Serial ports
// ------------------------
#ifdef USBCON #ifdef USBCON
#include "../../core/serial_hook.h" #include "../../core/serial_hook.h"
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
@@ -105,36 +107,36 @@ extern uint8_t reset_reason;
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0) #define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
#else #else
#if !WITHIN(SERIAL_PORT, -1, 3) #if !WITHIN(SERIAL_PORT, 0, 3)
#error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial." #error "SERIAL_PORT must be from 0 to 3."
#endif #endif
#define MYSERIAL1 customizedSerial1 #define MYSERIAL1 customizedSerial1
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if !WITHIN(SERIAL_PORT_2, -1, 3) #if !WITHIN(SERIAL_PORT_2, 0, 3)
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial." #error "SERIAL_PORT_2 must be from 0 to 3."
#endif #endif
#define MYSERIAL2 customizedSerial2 #define MYSERIAL2 customizedSerial2
#endif #endif
#ifdef SERIAL_PORT_3 #ifdef SERIAL_PORT_3
#if !WITHIN(SERIAL_PORT_3, -1, 3) #if !WITHIN(SERIAL_PORT_3, 0, 3)
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial." #error "SERIAL_PORT_3 must be from 0 to 3."
#endif #endif
#define MYSERIAL3 customizedSerial3 #define MYSERIAL3 customizedSerial3
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU2_SERIAL_PORT
#if !WITHIN(MMU2_SERIAL_PORT, -1, 3) #if !WITHIN(MMU2_SERIAL_PORT, 0, 3)
#error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial." #error "MMU2_SERIAL_PORT must be from 0 to 3"
#endif #endif
#define MMU2_SERIAL mmuSerial #define MMU2_SERIAL mmuSerial
#endif #endif
#ifdef LCD_SERIAL_PORT #ifdef LCD_SERIAL_PORT
#if !WITHIN(LCD_SERIAL_PORT, -1, 3) #if !WITHIN(LCD_SERIAL_PORT, 0, 3)
#error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial." #error "LCD_SERIAL_PORT must be from 0 to 3."
#endif #endif
#define LCD_SERIAL lcdSerial #define LCD_SERIAL lcdSerial
#if HAS_DGUS_LCD #if HAS_DGUS_LCD
@@ -142,57 +144,15 @@ extern uint8_t reset_reason;
#endif #endif
#endif #endif
// ------------------------ //
// Public functions
// ------------------------
void HAL_init();
//void cli();
//void _delay_ms(const int delay);
inline void HAL_clear_reset_source() { }
inline uint8_t HAL_get_reset_source() { return reset_reason; }
void HAL_reboot();
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
extern "C" int freeMemory();
#pragma GCC diagnostic pop
// ADC // ADC
#ifdef DIDR2 //
#define HAL_ANALOG_SELECT(ind) do{ if (ind < 8) SBI(DIDR0, ind); else SBI(DIDR2, ind & 0x07); }while(0)
#else
#define HAL_ANALOG_SELECT(ind) SBI(DIDR0, ind);
#endif
inline void HAL_adc_init() {
ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07;
DIDR0 = 0;
#ifdef DIDR2
DIDR2 = 0;
#endif
}
#define SET_ADMUX_ADCSRA(ch) ADMUX = _BV(REFS0) | (ch & 0x07); SBI(ADCSRA, ADSC)
#ifdef MUX5
#define HAL_START_ADC(ch) if (ch > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(ch)
#else
#define HAL_START_ADC(ch) ADCSRB = 0; SET_ADMUX_ADCSRA(ch)
#endif
#define HAL_ADC_VREF 5.0 #define HAL_ADC_VREF 5.0
#define HAL_ADC_RESOLUTION 10 #define HAL_ADC_RESOLUTION 10
#define HAL_READ_ADC() ADC
#define HAL_ADC_READY() !TEST(ADCSRA, ADSC)
//
// Pin Mapping for M42, M43, M226
//
#define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin #define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
@@ -206,23 +166,113 @@ inline void HAL_adc_init() {
// AVR compatibility // AVR compatibility
#define strtof strtod #define strtof strtod
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment // ------------------------
// Free Memory Accessor
// ------------------------
/** #pragma GCC diagnostic push
* set_pwm_frequency #if GCC_VERSION <= 50000
* Sets the frequency of the timer corresponding to the provided pin #pragma GCC diagnostic ignored "-Wunused-function"
* as close as possible to the provided desired frequency. Internally #endif
* calculates the required waveform generation mode, prescaler and
* resolution values required and sets the timer registers accordingly.
* NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B)
* NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST FAN PWM Settings)
*/
void set_pwm_frequency(const pin_t pin, int f_desired);
/** extern "C" int freeMemory();
* set_pwm_duty
* Set the PWM duty cycle of the provided pin to the provided value #pragma GCC diagnostic pop
* Optionally allows inverting the duty cycle [default = false]
* Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] // ------------------------
*/ // MarlinHAL Class
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); // ------------------------
class MarlinHAL {
public:
// Earliest possible init, before setup()
MarlinHAL() {}
// Watchdog
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
static void init(); // Called early in setup()
static void init_board() {} // Called less early in setup()
static void reboot(); // Restart the firmware from 0x0
// Interrupts
static bool isr_state() { return TEST(SREG, SREG_I); }
static void isr_on() { sei(); }
static void isr_off() { cli(); }
static void delay_ms(const int ms) { _delay_ms(ms); }
// Tasks, called from idle()
static void idletask() {}
// Reset
static uint8_t reset_reason;
static uint8_t get_reset_source() { return reset_reason; }
static void clear_reset_source() { MCUSR = 0; }
// Free SRAM
static int freeMemory() { return ::freeMemory(); }
//
// ADC Methods
//
// Called by Temperature::init once at startup
static void adc_init() {
ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07;
DIDR0 = 0;
#ifdef DIDR2
DIDR2 = 0;
#endif
}
// Called by Temperature::init for each sensor at startup
static void adc_enable(const uint8_t ch) {
#ifdef DIDR2
if (ch > 7) { SBI(DIDR2, ch & 0x07); return; }
#endif
SBI(DIDR0, ch);
}
// Begin ADC sampling on the given channel. Called from Temperature::isr!
static void adc_start(const uint8_t ch) {
#ifdef MUX5
ADCSRB = ch > 7 ? _BV(MUX5) : 0;
#else
ADCSRB = 0;
#endif
ADMUX = _BV(REFS0) | (ch & 0x07);
SBI(ADCSRA, ADSC);
}
// Is the ADC ready for reading?
static bool adc_ready() { return !TEST(ADCSRA, ADSC); }
// The current value of the ADC register
static __typeof__(ADC) adc_value() { return ADC; }
/**
* init_pwm_timers
* Set the default frequency for timers 2-5 to 1000HZ
*/
static void init_pwm_timers();
/**
* Set the PWM duty cycle for the pin to the given value.
* Optionally invert the duty cycle [default = false]
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
*/
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
/**
* Set the frequency of the timer for the given pin as close as
* possible to the provided desired frequency. Internally calculate
* the required waveform generation mode, prescaler, and resolution
* values and set timer registers accordingly.
* NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B)
* NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST_PWM_FAN Settings)
*/
static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
};

View File

@@ -35,22 +35,20 @@
void spiBegin() { void spiBegin() {
#if PIN_EXISTS(SD_SS) #if PIN_EXISTS(SD_SS)
OUT_WRITE(SD_SS_PIN, HIGH); // Do not init HIGH for boards with pin 4 used as Fans or Heaters or otherwise, not likely to have multiple SPI devices anyway.
#if defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
// SS must be in output mode even it is not chip select
SET_OUTPUT(SD_SS_PIN);
#else
// set SS high - may be chip select for another SPI device
OUT_WRITE(SD_SS_PIN, HIGH);
#endif
#endif #endif
SET_OUTPUT(SD_SCK_PIN); SET_OUTPUT(SD_SCK_PIN);
SET_INPUT(SD_MISO_PIN); SET_INPUT(SD_MISO_PIN);
SET_OUTPUT(SD_MOSI_PIN); SET_OUTPUT(SD_MOSI_PIN);
#if DISABLED(SOFTWARE_SPI) IF_DISABLED(SOFTWARE_SPI, spiInit(SPI_HALF_SPEED));
// SS must be in output mode even it is not chip select
//SET_OUTPUT(SD_SS_PIN);
// set SS high - may be chip select for another SPI device
//#if SET_SPI_SS_HIGH
//WRITE(SD_SS_PIN, HIGH);
//#endif
// set a default rate
spiInit(1);
#endif
} }
#if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI) #if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI)

View File

@@ -486,7 +486,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
// If global interrupts are disabled (as the result of being called from an ISR)... // If global interrupts are disabled (as the result of being called from an ISR)...
if (!ISRS_ENABLED()) { if (!hal.isr_state()) {
// Make room by polling if it is possible to transmit, and do so! // Make room by polling if it is possible to transmit, and do so!
while (i == tx_buffer.tail) { while (i == tx_buffer.tail) {
@@ -534,7 +534,7 @@ void MarlinSerial<Cfg>::flushTX() {
if (!_written) return; if (!_written) return;
// If global interrupts are disabled (as the result of being called from an ISR)... // If global interrupts are disabled (as the result of being called from an ISR)...
if (!ISRS_ENABLED()) { if (!hal.isr_state()) {
// Wait until everything was transmitted - We must do polling, as interrupts are disabled // Wait until everything was transmitted - We must do polling, as interrupts are disabled
while (tx_buffer.head != tx_buffer.tail || !B_TXC) { while (tx_buffer.head != tx_buffer.tail || !B_TXC) {

View File

@@ -191,13 +191,13 @@
rx_framing_errors; rx_framing_errors;
static ring_buffer_pos_t rx_max_enqueued; static ring_buffer_pos_t rx_max_enqueued;
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_head(); FORCE_INLINE static ring_buffer_pos_t atomic_read_rx_head();
static volatile bool rx_tail_value_not_stable; static volatile bool rx_tail_value_not_stable;
static volatile uint16_t rx_tail_value_backup; static volatile uint16_t rx_tail_value_backup;
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value); FORCE_INLINE static void atomic_set_rx_tail(ring_buffer_pos_t value);
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail(); FORCE_INLINE static ring_buffer_pos_t atomic_read_rx_tail();
public: public:
FORCE_INLINE static void store_rxd_char(); FORCE_INLINE static void store_rxd_char();
@@ -217,7 +217,7 @@
#endif #endif
enum { HasEmergencyParser = Cfg::EMERGENCYPARSER }; enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }

View File

@@ -66,27 +66,26 @@ static volatile int8_t Channel[_Nbr_16timers]; // counter for the s
/************ static functions common to all instances ***********************/ /************ static functions common to all instances ***********************/
static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) { static inline void handle_interrupts(const timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {
if (Channel[timer] < 0) int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
*TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer if (cho < 0) // Channel -1 indicates the refresh interval completed...
else { *TCNTn = 0; // ...so reset the timer
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
}
Channel[timer]++; // increment to the next channel Channel[timer] = ++cho; // Handle the next channel (or 0)
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
*OCRnA = *TCNTn + SERVO(timer, Channel[timer]).ticks; *OCRnA = *TCNTn + SERVO(timer, cho).ticks; // set compare to current ticks plus duration
if (SERVO(timer, Channel[timer]).Pin.isActive) // check if activated if (SERVO(timer, cho).Pin.isActive) // activated?
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
} }
else { else {
// finished all channels so wait for the refresh period to expire before starting over // finished all channels so wait for the refresh period to expire before starting over
if (((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed const unsigned int cval = ((unsigned)*TCNTn) + 32 / (SERVO_TIMER_PRESCALER), // allow 32 cycles to ensure the next OCR1A not missed
*OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL); ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
else *OCRnA = max(cval, ival);
*OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed
Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel Channel[timer] = -1; // reset the timer counter to 0 on the next call
} }
} }
@@ -123,91 +122,102 @@ static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t
/****************** end of static functions ******************************/ /****************** end of static functions ******************************/
void initISR(timer16_Sequence_t timer) { void initISR(const timer16_Sequence_t timer_index) {
#ifdef _useTimer1 switch (timer_index) {
if (timer == _timer1) { default: break;
TCCR1A = 0; // normal counting mode
TCCR1B = _BV(CS11); // set prescaler of 8
TCNT1 = 0; // clear the timer count
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
SBI(TIFR, OCF1A); // clear any pending interrupts;
SBI(TIMSK, OCIE1A); // enable the output compare interrupt
#else
// here if not ATmega8 or ATmega128
SBI(TIFR1, OCF1A); // clear any pending interrupts;
SBI(TIMSK1, OCIE1A); // enable the output compare interrupt
#endif
#ifdef WIRING
timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
#endif
}
#endif
#ifdef _useTimer3 #ifdef _useTimer1
if (timer == _timer3) { case _timer1:
TCCR3A = 0; // normal counting mode TCCR1A = 0; // normal counting mode
TCCR3B = _BV(CS31); // set prescaler of 8 TCCR1B = _BV(CS11); // set prescaler of 8
TCNT3 = 0; // clear the timer count TCNT1 = 0; // clear the timer count
#ifdef __AVR_ATmega128__ #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
SBI(TIFR, OCF3A); // clear any pending interrupts; SBI(TIFR, OCF1A); // clear any pending interrupts;
SBI(ETIMSK, OCIE3A); // enable the output compare interrupt SBI(TIMSK, OCIE1A); // enable the output compare interrupt
#else #else
SBI(TIFR3, OCF3A); // clear any pending interrupts; // here if not ATmega8 or ATmega128
SBI(TIMSK3, OCIE3A); // enable the output compare interrupt SBI(TIFR1, OCF1A); // clear any pending interrupts;
#endif SBI(TIMSK1, OCIE1A); // enable the output compare interrupt
#ifdef WIRING #endif
timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only #ifdef WIRING
#endif timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
} #endif
#endif break;
#endif
#ifdef _useTimer4 #ifdef _useTimer3
if (timer == _timer4) { case _timer3:
TCCR4A = 0; // normal counting mode TCCR3A = 0; // normal counting mode
TCCR4B = _BV(CS41); // set prescaler of 8 TCCR3B = _BV(CS31); // set prescaler of 8
TCNT4 = 0; // clear the timer count TCNT3 = 0; // clear the timer count
TIFR4 = _BV(OCF4A); // clear any pending interrupts; #ifdef __AVR_ATmega128__
TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt SBI(TIFR, OCF3A); // clear any pending interrupts;
} SBI(ETIMSK, OCIE3A); // enable the output compare interrupt
#endif #else
SBI(TIFR3, OCF3A); // clear any pending interrupts;
SBI(TIMSK3, OCIE3A); // enable the output compare interrupt
#endif
#ifdef WIRING
timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only
#endif
break;
#endif
#ifdef _useTimer5 #ifdef _useTimer4
if (timer == _timer5) { case _timer4:
TCCR5A = 0; // normal counting mode TCCR4A = 0; // normal counting mode
TCCR5B = _BV(CS51); // set prescaler of 8 TCCR4B = _BV(CS41); // set prescaler of 8
TCNT5 = 0; // clear the timer count TCNT4 = 0; // clear the timer count
TIFR5 = _BV(OCF5A); // clear any pending interrupts; TIFR4 = _BV(OCF4A); // clear any pending interrupts;
TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt
} break;
#endif #endif
#ifdef _useTimer5
case _timer5:
TCCR5A = 0; // normal counting mode
TCCR5B = _BV(CS51); // set prescaler of 8
TCNT5 = 0; // clear the timer count
TIFR5 = _BV(OCF5A); // clear any pending interrupts;
TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt
break;
#endif
}
} }
void finISR(timer16_Sequence_t timer) { void finISR(const timer16_Sequence_t timer_index) {
// Disable use of the given timer // Disable use of the given timer
#ifdef WIRING #ifdef WIRING
if (timer == _timer1) { switch (timer_index) {
CBI( default: break;
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
TIMSK1 case _timer1:
#else CBI(
TIMSK #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
#endif TIMSK1
, OCIE1A); // disable timer 1 output compare interrupt #else
timerDetach(TIMER1OUTCOMPAREA_INT); TIMSK
} #endif
else if (timer == _timer3) { , OCIE1A // disable timer 1 output compare interrupt
CBI( );
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) timerDetach(TIMER1OUTCOMPAREA_INT);
TIMSK3 break;
#else
ETIMSK case _timer3:
#endif CBI(
, OCIE3A); // disable the timer3 output compare A interrupt #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
timerDetach(TIMER3OUTCOMPAREA_INT); TIMSK3
#else
ETIMSK
#endif
, OCIE3A // disable the timer3 output compare A interrupt
);
timerDetach(TIMER3OUTCOMPAREA_INT);
break;
} }
#else // !WIRING #else // !WIRING
// For arduino - in future: call here to a currently undefined function to reset the timer // For arduino - in future: call here to a currently undefined function to reset the timer
UNUSED(timer); UNUSED(timer_index);
#endif #endif
} }

View File

@@ -213,6 +213,51 @@ void setup_endstop_interrupts() {
pciSetup(K_MIN_PIN); pciSetup(K_MIN_PIN);
#endif #endif
#endif #endif
#if HAS_U_MAX
#if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(U_MAX_PIN);
#else
static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable");
pciSetup(U_MAX_PIN);
#endif
#elif HAS_U_MIN
#if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(U_MIN_PIN);
#else
static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable");
pciSetup(U_MIN_PIN);
#endif
#endif
#if HAS_V_MAX
#if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(V_MAX_PIN);
#else
static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable");
pciSetup(V_MAX_PIN);
#endif
#elif HAS_V_MIN
#if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(V_MIN_PIN);
#else
static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable");
pciSetup(V_MIN_PIN);
#endif
#endif
#if HAS_W_MAX
#if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(W_MAX_PIN);
#else
static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable");
pciSetup(W_MAX_PIN);
#endif
#elif HAS_W_MIN
#if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(W_MIN_PIN);
#else
static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable");
pciSetup(W_MIN_PIN);
#endif
#endif
#if HAS_X2_MAX #if HAS_X2_MAX
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(X2_MAX_PIN); _ATTACH(X2_MAX_PIN);
@@ -301,5 +346,6 @@ void setup_endstop_interrupts() {
pciSetup(Z_MIN_PROBE_PIN); pciSetup(Z_MIN_PROBE_PIN);
#endif #endif
#endif #endif
// If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI. // If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
} }

View File

@@ -21,10 +21,11 @@
*/ */
#ifdef __AVR__ #ifdef __AVR__
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfig.h"
#include "HAL.h"
#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM //#define DEBUG_AVR_FAST_PWM
#define DEBUG_OUT ENABLED(DEBUG_AVR_FAST_PWM)
#include "../../core/debug_out.h"
struct Timer { struct Timer {
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
@@ -32,229 +33,207 @@ struct Timer {
volatile uint16_t* ICRn; // max 1 ICR register per timer volatile uint16_t* ICRn; // max 1 ICR register per timer
uint8_t n; // the timer number [0->5] uint8_t n; // the timer number [0->5]
uint8_t q; // the timer output [0->2] (A->C) uint8_t q; // the timer output [0->2] (A->C)
bool isPWM; // True if pin is a "hardware timer"
bool isProtected; // True if timer is protected
}; };
// Macros for the Timer structure
#define _SET_WGMnQ(T, V) do{ \
*(T.TCCRnQ)[0] = (*(T.TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \
*(T.TCCRnQ)[1] = (*(T.TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \
}while(0)
// Set TCCR CS bits
#define _SET_CSn(T, V) (*(T.TCCRnQ)[1] = (*(T.TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0))
// Set TCCR COM bits
#define _SET_COMnQ(T, Q, V) (*(T.TCCRnQ)[0] = (*(T.TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q))))
// Set OCRnQ register
#define _SET_OCRnQ(T, Q, V) (*(T.OCRnQ)[Q] = int(V) & 0xFFFF)
// Set ICRn register (one per timer)
#define _SET_ICRn(T, V) (*(T.ICRn) = int(V) & 0xFFFF)
/** /**
* get_pwm_timer * Return a Timer struct describing a pin's timer.
* Get the timer information and register of the provided pin.
* Return a Timer struct containing this information.
* Used by set_pwm_frequency, set_pwm_duty
*/ */
Timer get_pwm_timer(const pin_t pin) { const Timer get_pwm_timer(const pin_t pin) {
uint8_t q = 0; uint8_t q = 0;
switch (digitalPinToTimer(pin)) { switch (digitalPinToTimer(pin)) {
// Protect reserved timers (TIMER0 & TIMER1)
#ifdef TCCR0A #ifdef TCCR0A
#if !AVR_AT90USB1286_FAMILY IF_DISABLED(AVR_AT90USB1286_FAMILY, case TIMER0A:)
case TIMER0A:
#endif
case TIMER0B:
#endif #endif
#ifdef TCCR1A #ifdef TCCR1A
case TIMER1A: case TIMER1B: case TIMER1A: case TIMER1B:
#endif #endif
break;
#if HAS_TCCR2 || defined(TCCR2A) break; // Protect reserved timers (TIMER0 & TIMER1)
#if HAS_TCCR2
case TIMER2: { #ifdef TCCR0A
Timer timer = { case TIMER0B: // Protected timer, but allow setting the duty cycle on OCR0B for pin D4 only
/*TCCRnQ*/ { &TCCR2, nullptr, nullptr }, return Timer({ { &TCCR0A, nullptr, nullptr }, { (uint16_t*)&OCR0A, (uint16_t*)&OCR0B, nullptr }, nullptr, 0, 1, true, true });
/*OCRnQ*/ { (uint16_t*)&OCR2, nullptr, nullptr },
/*ICRn*/ nullptr,
/*n, q*/ 2, 0
};
}
#elif defined(TCCR2A)
#if ENABLED(USE_OCR2A_AS_TOP)
case TIMER2A: break; // protect TIMER2A
case TIMER2B: {
Timer timer = {
/*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr },
/*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr },
/*ICRn*/ nullptr,
/*n, q*/ 2, 1
};
return timer;
}
#else
case TIMER2B: ++q;
case TIMER2A: {
Timer timer = {
/*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr },
/*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr },
/*ICRn*/ nullptr,
2, q
};
return timer;
}
#endif
#endif
#endif #endif
#if HAS_TCCR2
case TIMER2:
return Timer({ { &TCCR2, nullptr, nullptr }, { (uint16_t*)&OCR2, nullptr, nullptr }, nullptr, 2, 0, true, false });
#elif ENABLED(USE_OCR2A_AS_TOP)
case TIMER2A: break; // Protect TIMER2A since its OCR is used by TIMER2B
case TIMER2B:
return Timer({ { &TCCR2A, &TCCR2B, nullptr }, { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, nullptr, 2, 1, true, false });
#elif defined(TCCR2A)
case TIMER2B: ++q; case TIMER2A:
return Timer({ { &TCCR2A, &TCCR2B, nullptr }, { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, nullptr, 2, q, true, false });
#endif
#ifdef OCR3C #ifdef OCR3C
case TIMER3C: ++q; case TIMER3C: ++q; case TIMER3B: ++q; case TIMER3A:
case TIMER3B: ++q; return Timer({ { &TCCR3A, &TCCR3B, &TCCR3C }, { &OCR3A, &OCR3B, &OCR3C }, &ICR3, 3, q, true, false });
case TIMER3A: {
Timer timer = {
/*TCCRnQ*/ { &TCCR3A, &TCCR3B, &TCCR3C },
/*OCRnQ*/ { &OCR3A, &OCR3B, &OCR3C },
/*ICRn*/ &ICR3,
/*n, q*/ 3, q
};
return timer;
}
#elif defined(OCR3B) #elif defined(OCR3B)
case TIMER3B: ++q; case TIMER3B: ++q; case TIMER3A:
case TIMER3A: { return Timer({ { &TCCR3A, &TCCR3B, nullptr }, { &OCR3A, &OCR3B, nullptr }, &ICR3, 3, q, true, false });
Timer timer = {
/*TCCRnQ*/ { &TCCR3A, &TCCR3B, nullptr },
/*OCRnQ*/ { &OCR3A, &OCR3B, nullptr },
/*ICRn*/ &ICR3,
/*n, q*/ 3, q
};
return timer;
}
#endif #endif
#ifdef TCCR4A #ifdef TCCR4A
case TIMER4C: ++q; case TIMER4C: ++q; case TIMER4B: ++q; case TIMER4A:
case TIMER4B: ++q; return Timer({ { &TCCR4A, &TCCR4B, &TCCR4C }, { &OCR4A, &OCR4B, &OCR4C }, &ICR4, 4, q, true, false });
case TIMER4A: {
Timer timer = {
/*TCCRnQ*/ { &TCCR4A, &TCCR4B, &TCCR4C },
/*OCRnQ*/ { &OCR4A, &OCR4B, &OCR4C },
/*ICRn*/ &ICR4,
/*n, q*/ 4, q
};
return timer;
}
#endif #endif
#ifdef TCCR5A #ifdef TCCR5A
case TIMER5C: ++q; case TIMER5C: ++q; case TIMER5B: ++q; case TIMER5A:
case TIMER5B: ++q; return Timer({ { &TCCR5A, &TCCR5B, &TCCR5C }, { &OCR5A, &OCR5B, &OCR5C }, &ICR5, 5, q, true, false });
case TIMER5A: {
Timer timer = {
/*TCCRnQ*/ { &TCCR5A, &TCCR5B, &TCCR5C },
/*OCRnQ*/ { &OCR5A, &OCR5B, &OCR5C },
/*ICRn*/ &ICR5,
/*n, q*/ 5, q
};
return timer;
}
#endif #endif
} }
Timer timer = {
/*TCCRnQ*/ { nullptr, nullptr, nullptr }, return Timer();
/*OCRnQ*/ { nullptr, nullptr, nullptr },
/*ICRn*/ nullptr,
0, 0
};
return timer;
} }
void set_pwm_frequency(const pin_t pin, int f_desired) { void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
Timer timer = get_pwm_timer(pin); DEBUG_ECHOLNPGM("set_pwm_frequency(pin=", pin, ", freq=", f_desired, ")");
if (timer.n == 0) return; // Don't proceed if protected timer or not recognized const Timer timer = get_pwm_timer(pin);
uint16_t size; if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized
if (timer.n == 2) size = 255; else size = 65535;
uint16_t res = 255; // resolution (TOP value) const bool is_timer2 = timer.n == 2;
uint8_t j = 0; // prescaler index const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF;
uint8_t wgm = 1; // waveform generation mode
DEBUG_ECHOLNPGM("maxtop=", maxtop);
uint16_t res = 0xFF; // resolution (TOP value)
uint8_t j = CS_NONE; // prescaler index
uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
// Calculating the prescaler and resolution to use to achieve closest frequency // Calculating the prescaler and resolution to use to achieve closest frequency
if (f_desired != 0) { if (f_desired != 0) {
int f = (F_CPU) / (2 * 1024 * size) + 1; // Initialize frequency as lowest (non-zero) achievable constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only
uint16_t prescaler[] = { 0, 1, 8, /*TIMER2 ONLY*/32, 64, /*TIMER2 ONLY*/128, 256, 1024 }; uint16_t f = (F_CPU) / (uint32_t(maxtop) << 11) + 1; // Start with the lowest non-zero frequency achievable (for 16MHz, 1 or 31)
// loop over prescaler values DEBUG_ECHOLNPGM("f=", f);
LOOP_S_L_N(i, 1, 8) { DEBUG_ECHOLNPGM("(prescaler loop)");
uint16_t res_temp_fast = 255, res_temp_phase_correct = 255; LOOP_L_N(i, COUNT(prescaler)) { // Loop through all prescaler values
if (timer.n == 2) { const uint32_t p = prescaler[i]; // Extend to 32 bits for calculations
// No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP DEBUG_ECHOLNPGM("prescaler[", i, "]=", p);
#if ENABLED(USE_OCR2A_AS_TOP) uint16_t res_fast_temp, res_pc_temp;
const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired); if (is_timer2) {
res_temp_fast = rtf - 1; #if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
res_temp_phase_correct = rtf / 2; const uint16_t rft = (F_CPU) / (p * f_desired);
res_fast_temp = rft - 1;
res_pc_temp = rft / 2;
DEBUG_ECHOLNPGM("(Timer2) res_fast_temp=", res_fast_temp, " res_pc_temp=", res_pc_temp);
#else
res_fast_temp = res_pc_temp = maxtop;
DEBUG_ECHOLNPGM("(Timer2) res_fast_temp=", maxtop, " res_pc_temp=", maxtop);
#endif #endif
} }
else { else {
// Skip TIMER2 specific prescalers when not TIMER2 if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
if (i == 3 || i == 5) continue; const uint16_t rft = (F_CPU) / (p * f_desired);
const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired); DEBUG_ECHOLNPGM("(Not Timer 2) F_CPU=" STRINGIFY(F_CPU), " prescaler=", p, " f_desired=", f_desired);
res_temp_fast = rtf - 1; res_fast_temp = rft - 1;
res_temp_phase_correct = rtf / 2; res_pc_temp = rft / 2;
} }
LIMIT(res_temp_fast, 1U, size); LIMIT(res_fast_temp, 1U, maxtop);
LIMIT(res_temp_phase_correct, 1U, size); LIMIT(res_pc_temp, 1U, maxtop);
// Calculate frequencies of test prescaler and resolution values // Calculate frequencies of test prescaler and resolution values
const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)), const uint16_t f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)),
f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct), f_pc_temp = (F_CPU) / ((p * res_pc_temp) << 1),
f_diff = ABS(f - f_desired), f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
f_fast_diff = ABS(f_temp_fast - f_desired), f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired),
f_phase_diff = ABS(f_temp_phase_correct - f_desired); f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired);
// If FAST values are closest to desired f DEBUG_ECHOLNPGM("f_fast_temp=", f_fast_temp, " f_pc_temp=", f_pc_temp, " f_diff=", f_diff, " f_fast_diff=", f_fast_diff, " f_pc_diff=", f_pc_diff);
if (f_fast_diff < f_diff && f_fast_diff <= f_phase_diff) {
// Remember this combination if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
f = f_temp_fast;
res = res_temp_fast;
j = i;
// Set the Wave Generation Mode to FAST PWM // Set the Wave Generation Mode to FAST PWM
if (timer.n == 2) wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn);
wgm = TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM); // Remember this combination
else f = f_fast_temp; res = res_fast_temp; j = i + 1;
wgm = WGM_FAST_PWM_ICRn; DEBUG_ECHOLNPGM("(FAST) updated f=", f);
} }
// If PHASE CORRECT values are closes to desired f else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
else if (f_phase_diff < f_diff) {
f = f_temp_phase_correct;
res = res_temp_phase_correct;
j = i;
// Set the Wave Generation Mode to PWM PHASE CORRECT // Set the Wave Generation Mode to PWM PHASE CORRECT
if (timer.n == 2) wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn);
wgm = TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_FAST_PWM); f = f_pc_temp; res = res_pc_temp; j = i + 1;
else DEBUG_ECHOLNPGM("(PHASE) updated f=", f);
wgm = WGM_PWM_PC_ICRn;
} }
} } // prescaler loop
} }
_SET_WGMnQ(timer.TCCRnQ, wgm);
_SET_CSn(timer.TCCRnQ, j);
if (timer.n == 2) { _SET_WGMnQ(timer, wgm);
TERN_(USE_OCR2A_AS_TOP, _SET_OCRnQ(timer.OCRnQ, 0, res)); // Set OCR2A value (TOP) = res _SET_CSn(timer, j);
if (is_timer2) {
TERN_(USE_OCR2A_AS_TOP, _SET_OCRnQ(timer, 0, res)); // Set OCR2A value (TOP) = res
} }
else else
_SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res _SET_ICRn(timer, res); // Set ICRn value (TOP) = res
} }
#endif // NEEDS_HARDWARE_PWM void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
// If v is 0 or v_size (max), digitalWrite to LOW or HIGH.
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { // Note that digitalWrite also disables PWM output for us (sets COM bit to 0)
#if NEEDS_HARDWARE_PWM if (v == 0)
digitalWrite(pin, invert);
// If v is 0 or v_size (max), digitalWrite to LOW or HIGH. else if (v == v_size)
// Note that digitalWrite also disables pwm output for us (sets COM bit to 0) digitalWrite(pin, !invert);
if (v == 0) else {
digitalWrite(pin, invert); const Timer timer = get_pwm_timer(pin);
else if (v == v_size) if (timer.isPWM) {
digitalWrite(pin, !invert); if (timer.n == 0) {
else { _SET_COMnQ(timer, timer.q, COM_CLEAR_SET); // Only allow a TIMER0B select...
Timer timer = get_pwm_timer(pin); _SET_OCRnQ(timer, timer.q, v); // ...and OCR0B duty update. For output pin D4 no frequency changes are permitted.
if (timer.n == 0) return; // Don't proceed if protected timer or not recognized }
// Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted) else if (!timer.isProtected) {
_SET_COMnQ(timer.TCCRnQ, timer.q TERN_(HAS_TCCR2, + (timer.q == 2)), COM_CLEAR_SET + invert); // COM20 is on bit 4 of TCCR2, so +1 for q==2 const uint16_t top = timer.n == 2 ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn;
const uint16_t top = timer.n == 2 ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn; _SET_COMnQ(timer, SUM_TERN(HAS_TCCR2, timer.q, timer.q == 2), COM_CLEAR_SET + invert); // COM20 is on bit 4 of TCCR2, so +1 for q==2
_SET_OCRnQ(timer.OCRnQ, timer.q, uint16_t(uint32_t(v) * top / v_size)); // Scale 8/16-bit v to top value _SET_OCRnQ(timer, timer.q, uint16_t(uint32_t(v) * top / v_size)); // Scale 8/16-bit v to top value
}
} }
else
digitalWrite(pin, v < v_size / 2 ? LOW : HIGH);
}
}
#else void MarlinHAL::init_pwm_timers() {
// Init some timer frequencies to a default 1KHz
const pin_t pwm_pin[] = {
#ifdef __AVR_ATmega2560__
10, 5, 6, 46
#elif defined(__AVR_ATmega1280__)
12, 31
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284__)
15, 6
#elif defined(__AVR_AT90USB1286__) || defined(__AVR_mega64) || defined(__AVR_mega128)
16, 24
#endif
};
analogWrite(pin, v); LOOP_L_N(i, COUNT(pwm_pin))
UNUSED(v_size); set_pwm_frequency(pwm_pin[i], 1000);
UNUSED(invert);
#endif
} }
#endif // __AVR__ #endif // __AVR__

View File

@@ -245,7 +245,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
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.
uint16_t prescaler; // Range of 30.5Hz (65535) 64.5KHz (>31) uint16_t prescaler; // Range of 30.5Hz (65535) 64.5kHz (>31)
if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); } if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); }
else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); } else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); }
@@ -257,7 +257,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
const float pwm_top = round(count); // Get the rounded count const float pwm_top = round(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
OCR5B = pwm_top * ABS(dcb); OCR5B = pwm_top * ABS(dcb);
OCR5C = pwm_top * ABS(dcc); OCR5C = pwm_top * ABS(dcc);
_SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes _SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes
@@ -277,7 +277,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
// Restore the default for Timer 5 // Restore the default for Timer 5
SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct) SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct)
SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing
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 round(count);

View File

@@ -118,7 +118,7 @@
*/ */
// Waveform Generation Modes // Waveform Generation Modes
enum WaveGenMode : char { enum WaveGenMode : uint8_t {
WGM_NORMAL, // 0 WGM_NORMAL, // 0
WGM_PWM_PC_8, // 1 WGM_PWM_PC_8, // 1
WGM_PWM_PC_9, // 2 WGM_PWM_PC_9, // 2
@@ -138,19 +138,19 @@ enum WaveGenMode : char {
}; };
// Wavefore Generation Modes (Timer 2 only) // Wavefore Generation Modes (Timer 2 only)
enum WaveGenMode2 : char { enum WaveGenMode2 : uint8_t {
WGM2_NORMAL, // 0 WGM2_NORMAL, // 0
WGM2_PWM_PC, // 1 WGM2_PWM_PC, // 1
WGM2_CTC_OCR2A, // 2 WGM2_CTC_OCR2A, // 2
WGM2_FAST_PWM, // 3 WGM2_FAST_PWM, // 3
WGM2_reserved_1, // 4 WGM2_reserved_1, // 4
WGM2_PWM_PC_OCR2A, // 5 WGM2_PWM_PC_OCR2A, // 5
WGM2_reserved_2, // 6 WGM2_reserved_2, // 6
WGM2_FAST_PWM_OCR2A, // 7 WGM2_FAST_PWM_OCR2A, // 7
}; };
// Compare Modes // Compare Modes
enum CompareMode : char { enum CompareMode : uint8_t {
COM_NORMAL, // 0 COM_NORMAL, // 0
COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL
COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down
@@ -158,7 +158,7 @@ enum CompareMode : char {
}; };
// Clock Sources // Clock Sources
enum ClockSource : char { enum ClockSource : uint8_t {
CS_NONE, // 0 CS_NONE, // 0
CS_PRESCALER_1, // 1 CS_PRESCALER_1, // 1
CS_PRESCALER_8, // 2 CS_PRESCALER_8, // 2
@@ -170,7 +170,7 @@ enum ClockSource : char {
}; };
// Clock Sources (Timer 2 only) // Clock Sources (Timer 2 only)
enum ClockSource2 : char { enum ClockSource2 : uint8_t {
CS2_NONE, // 0 CS2_NONE, // 0
CS2_PRESCALER_1, // 1 CS2_PRESCALER_1, // 1
CS2_PRESCALER_8, // 2 CS2_PRESCALER_8, // 2
@@ -203,11 +203,6 @@ enum ClockSource2 : char {
TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \ TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \
}while(0) }while(0)
#define SET_WGM(T,V) _SET_WGM(T,WGM_##V) #define SET_WGM(T,V) _SET_WGM(T,WGM_##V)
// Runtime (see set_pwm_frequency):
#define _SET_WGMnQ(TCCRnQ, V) do{ \
*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \
*(TCCRnQ)[1] = (*(TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \
}while(0)
// Set Clock Select bits // Set Clock Select bits
// Ex: SET_CS3(PRESCALER_64); // Ex: SET_CS3(PRESCALER_64);
@@ -235,8 +230,6 @@ enum ClockSource2 : char {
#define SET_CS4(V) _SET_CS4(CS_##V) #define SET_CS4(V) _SET_CS4(CS_##V)
#define SET_CS5(V) _SET_CS5(CS_##V) #define SET_CS5(V) _SET_CS5(CS_##V)
#define SET_CS(T,V) SET_CS##T(V) #define SET_CS(T,V) SET_CS##T(V)
// Runtime (see set_pwm_frequency)
#define _SET_CSn(TCCRnQ, V) (*(TCCRnQ)[1] = (*(TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0))
// Set Compare Mode bits // Set Compare Mode bits
// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET); // Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET);
@@ -246,16 +239,6 @@ enum ClockSource2 : char {
#define SET_COMB(T,V) SET_COM(T,B,V) #define SET_COMB(T,V) SET_COM(T,B,V)
#define SET_COMC(T,V) SET_COM(T,C,V) #define SET_COMC(T,V) SET_COM(T,C,V)
#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0) #define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0)
// Runtime (see set_pwm_duty)
#define _SET_COMnQ(TCCRnQ, Q, V) (*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q))))
// Set OCRnQ register
// Runtime (see set_pwm_duty):
#define _SET_OCRnQ(OCRnQ, Q, V) (*(OCRnQ)[Q] = int(V) & 0xFFFF)
// Set ICRn register (one per timer)
// Runtime (see set_pwm_frequency)
#define _SET_ICRn(ICRn, V) (*(ICRn) = int(V) & 0xFFFF)
// Set Noise Canceler bit // Set Noise Canceler bit
// Ex: SET_ICNC(2,1) // Ex: SET_ICNC(2,1)
@@ -310,11 +293,11 @@ enum ClockSource2 : char {
#if HAS_MOTOR_CURRENT_PWM #if HAS_MOTOR_CURRENT_PWM
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY) #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E_PIN || P == MOTOR_CURRENT_PWM_E0_PIN || P == MOTOR_CURRENT_PWM_E1_PIN || P == MOTOR_CURRENT_PWM_Z_PIN || P == MOTOR_CURRENT_PWM_XY_PIN)
#elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z) #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E_PIN || P == MOTOR_CURRENT_PWM_E0_PIN || P == MOTOR_CURRENT_PWM_E1_PIN || P == MOTOR_CURRENT_PWM_Z_PIN)
#else #else
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E) #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E_PIN || P == MOTOR_CURRENT_PWM_E0_PIN || P == MOTOR_CURRENT_PWM_E1_PIN)
#endif #endif
#else #else
#define PWM_CHK_MOTOR_CURRENT(P) false #define PWM_CHK_MOTOR_CURRENT(P) false

View File

@@ -27,6 +27,9 @@
* Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100 * Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100
* Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx * Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx
* Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx * Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx
*
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
*/ */
#include "../fastio.h" #include "../fastio.h"

View File

@@ -26,6 +26,9 @@
* *
* Logical Pin: 38 39 40 41 42 43 44 45 16 10 11 12 06 07 08 09 30 31 32 33 34 35 36 37 17 18 19 20 21 22 23 24 00 01 13 05 02 03 14 15 46 47 48 49 50 51 52 53 25 26 27 28 29 04 * Logical Pin: 38 39 40 41 42 43 44 45 16 10 11 12 06 07 08 09 30 31 32 33 34 35 36 37 17 18 19 20 21 22 23 24 00 01 13 05 02 03 14 15 46 47 48 49 50 51 52 53 25 26 27 28 29 04
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5 * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5
*
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
*/ */
#include "../fastio.h" #include "../fastio.h"

View File

@@ -26,6 +26,9 @@
* *
* Logical Pin: 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00 01 02 03 04 05 06 07 * Logical Pin: 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00 01 02 03 04 05 06 07
* Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 * Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7
*
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
*/ */
#include "../fastio.h" #include "../fastio.h"

View File

@@ -26,6 +26,9 @@
* *
* Logical Pin: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 * Logical Pin: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
* Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0 * Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0
*
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
*/ */
/** ATMega644 /** ATMega644

View File

@@ -27,6 +27,9 @@
* Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45 * Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7
* The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3 * The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3
*
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
*/ */
#include "../fastio.h" #include "../fastio.h"

View File

@@ -20,7 +20,3 @@
* *
*/ */
#pragma once #pragma once
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/AVR."
#endif

View File

@@ -25,11 +25,57 @@
* Test AVR-specific configuration values for errors at compile-time. * Test AVR-specific configuration values for errors at compile-time.
*/ */
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/AVR."
#endif
/**
* Check for common serial pin conflicts
*/
#define CHECK_SERIAL_PIN(N) ( \
X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
|| X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
|| X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
|| BTN_EN1 == N || BTN_EN2 == N \
)
#if SERIAL_IN_USE(0)
// D0-D1. No known conflicts.
#endif
#if SERIAL_IN_USE(1)
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
#if CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19)
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
#endif
#else
#if CHECK_SERIAL_PIN(10) || CHECK_SERIAL_PIN(11)
#error "Serial Port 1 pin D10 and/or D11 conflicts with another pin on the board."
#endif
#endif
#endif
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
#endif
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
#endif
#undef CHECK_SERIAL_PIN
/** /**
* Checks for FAST PWM * Checks for FAST PWM
*/ */
#if ALL(FAST_PWM_FAN, USE_OCR2A_AS_TOP, HAS_TCCR2) #if ALL(FAST_PWM_FAN, USE_OCR2A_AS_TOP, HAS_TCCR2)
#error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2" #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2."
#endif
/**
* Checks for SOFT PWM
*/
#if HAS_FAN0 && FAN_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER)
#error "FAN_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)."
#error "Disable SPEAKER or enable FAN_SOFT_PWM."
#endif #endif
/** /**
@@ -42,7 +88,7 @@
#elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) #elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
#endif #endif
#elif defined(SPINDLE_LASER_FREQUENCY) #elif SPINDLE_LASER_FREQUENCY
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM." #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM."
#endif #endif
@@ -63,3 +109,7 @@
#if ENABLED(POSTMORTEM_DEBUGGING) #if ENABLED(POSTMORTEM_DEBUGGING)
#error "POSTMORTEM_DEBUGGING is not supported on AVR boards." #error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
#endif #endif
#if USING_PULLDOWNS
#error "PULLDOWN pin mode is not available on AVR boards."
#endif

View File

@@ -27,15 +27,16 @@
// intRes = longIn1 * longIn2 >> 24 // intRes = longIn1 * longIn2 >> 24
// uses: // uses:
// A[tmp] to store 0 // r1, r0 for the result of mul.
// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result. // [tmp1] to store 0.
// note that the lower two bytes and the upper byte of the 48bit result are not calculated. // [tmp2] to store bits 16-23 of the 56 bit result. The top bit of [tmp2] is used for rounding.
// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones. // Note that the lower two bytes and the upper two bytes of the 56 bit result are not calculated.
// B A are bits 24-39 and are the returned value // This can cause the result to be out by one as the lower bytes may cause carries into the upper ones.
// C B A is longIn1 // [intRes] (A B) is bits 24-39 and is the returned value.
// D C B A is longIn2 // [longIn1] (C B A) is a 24 bit parameter.
// [longIn2] (D C B A) is a 32 bit parameter.
// //
static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) { FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) {
uint8_t tmp1; uint8_t tmp1;
uint8_t tmp2; uint8_t tmp2;
uint16_t intRes; uint16_t intRes;
@@ -66,11 +67,9 @@ static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2
A("add %[tmp2], r1") A("add %[tmp2], r1")
A("adc %A[intRes], %[tmp1]") A("adc %A[intRes], %[tmp1]")
A("adc %B[intRes], %[tmp1]") A("adc %B[intRes], %[tmp1]")
A("lsr %[tmp2]")
A("adc %A[intRes], %[tmp1]")
A("adc %B[intRes], %[tmp1]")
A("mul %D[longIn2], %A[longIn1]") A("mul %D[longIn2], %A[longIn1]")
A("add %A[intRes], r0") A("lsl %[tmp2]")
A("adc %A[intRes], r0")
A("adc %B[intRes], r1") A("adc %B[intRes], r1")
A("mul %D[longIn2], %B[longIn1]") A("mul %D[longIn2], %B[longIn1]")
A("add %B[intRes], r0") A("add %B[intRes], r0")
@@ -85,11 +84,16 @@ static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2
return intRes; return intRes;
} }
// intRes = intIn1 * intIn2 >> 16 // intRes = intIn1 * intIn2 >> 8
// uses: // uses:
// r26 to store 0 // r1, r0 for the result of mul. After the second mul, r0 holds bits 0-7 of the 24 bit result and
// r27 to store the byte 1 of the 24 bit result // the top bit of r0 is used for rounding.
static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) { // [tmp] to store 0.
// [intRes] (A B) is bits 8-15 and is the returned value.
// [charIn1] is an 8 bit parameter.
// [intIn2] (B A) is a 16 bit parameter.
//
FORCE_INLINE static uint16_t MultiU8X16toH16(uint8_t charIn1, uint16_t intIn2) {
uint8_t tmp; uint8_t tmp;
uint16_t intRes; uint16_t intRes;
__asm__ __volatile__ ( __asm__ __volatile__ (
@@ -97,10 +101,8 @@ static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) {
A("mul %[charIn1], %B[intIn2]") A("mul %[charIn1], %B[intIn2]")
A("movw %A[intRes], r0") A("movw %A[intRes], r0")
A("mul %[charIn1], %A[intIn2]") A("mul %[charIn1], %A[intIn2]")
A("add %A[intRes], r1") A("lsl r0")
A("adc %B[intRes], %[tmp]") A("adc %A[intRes], r1")
A("lsr r0")
A("adc %A[intRes], %[tmp]")
A("adc %B[intRes], %[tmp]") A("adc %B[intRes], %[tmp]")
A("clr r1") A("clr r1")
: [intRes] "=&r" (intRes), : [intRes] "=&r" (intRes),

View File

@@ -64,17 +64,19 @@
#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0) #define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
#if AVR_ATmega1284_FAMILY #if AVR_ATmega1284_FAMILY
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P)) #define IS_ANALOG(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0)) #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(IS_ANALOG(P) ? (P) - analogInputToDigitalPin(7) : -1)
#else #else
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0)) #define _ANALOG1(P) WITHIN(P, analogInputToDigitalPin(0), analogInputToDigitalPin(7))
#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7))) #define _ANALOG2(P) WITHIN(P, analogInputToDigitalPin(8), analogInputToDigitalPin(15))
#define IS_ANALOG(P) (_ANALOG1(P) || _ANALOG2(P))
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
#endif #endif
#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin #define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
void PRINT_ARRAY_NAME(uint8_t x) { void PRINT_ARRAY_NAME(uint8_t x) {
char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name); PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
LOOP_L_N(y, MAX_NAME_LENGTH) { LOOP_L_N(y, MAX_NAME_LENGTH) {
char temp_char = pgm_read_byte(name_mem_pointer + y); char temp_char = pgm_read_byte(name_mem_pointer + y);
if (temp_char != 0) if (temp_char != 0)

View File

@@ -44,23 +44,23 @@ typedef uint16_t hal_timer_t;
#define MF_TIMER_TEMP 0 #define MF_TIMER_TEMP 0
#endif #endif
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) #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) // Cannot be of type double #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer #define PULSE_TIMER_RATE STEPPER_TIMER_RATE
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
#define ENABLE_STEPPER_DRIVER_INTERRUPT() 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)
#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) #define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) #define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0A)
#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) #define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0A)
#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) #define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0A)
FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) { FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
switch (timer_num) { switch (timer_num) {
@@ -87,7 +87,7 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
case MF_TIMER_TEMP: case MF_TIMER_TEMP:
// Use timer0 for temperature measurement // Use timer0 for temperature measurement
// Interleave temperature interrupt with millies interrupt // Interleave temperature interrupt with millies interrupt
OCR0B = 128; OCR0A = 128;
break; break;
} }
} }
@@ -109,12 +109,12 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
* (otherwise, characters will be lost due to UART overflow). * (otherwise, characters will be lost due to UART overflow).
* Then: Stepper, Endstops, Temperature, and -finally- all others. * Then: Stepper, Endstops, Temperature, and -finally- all others.
*/ */
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(T) NOOP
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(T) NOOP
/* 18 cycles maximum latency */
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
/* 18 cycles maximum latency */
#define HAL_STEP_TIMER_ISR() \ #define HAL_STEP_TIMER_ISR() \
extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \ extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
@@ -180,7 +180,7 @@ void TIMER1_COMPA_vect() { \
: \ : \
: [timsk0] "i" ((uint16_t)&TIMSK0), \ : [timsk0] "i" ((uint16_t)&TIMSK0), \
[timsk1] "i" ((uint16_t)&TIMSK1), \ [timsk1] "i" ((uint16_t)&TIMSK1), \
[msk0] "M" ((uint8_t)(1<<OCIE0B)),\ [msk0] "M" ((uint8_t)(1<<OCIE0A)),\
[msk1] "M" ((uint8_t)(1<<OCIE1A)) \ [msk1] "M" ((uint8_t)(1<<OCIE1A)) \
: \ : \
); \ ); \
@@ -193,9 +193,9 @@ void TIMER1_COMPA_vect_bottom()
/* 14 cycles maximum latency */ /* 14 cycles maximum latency */
#define HAL_TEMP_TIMER_ISR() \ #define HAL_TEMP_TIMER_ISR() \
extern "C" void TIMER0_COMPB_vect() __attribute__ ((signal, naked, used, externally_visible)); \ extern "C" void TIMER0_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
extern "C" void TIMER0_COMPB_vect_bottom() asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ extern "C" void TIMER0_COMPA_vect_bottom() asm ("TIMER0_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
void TIMER0_COMPB_vect() { \ void TIMER0_COMPA_vect() { \
__asm__ __volatile__ ( \ __asm__ __volatile__ ( \
A("push r16") /* 2 Save R16 */ \ A("push r16") /* 2 Save R16 */ \
A("in r16, __SREG__") /* 1 Get SREG */ \ A("in r16, __SREG__") /* 1 Get SREG */ \
@@ -223,7 +223,7 @@ void TIMER0_COMPB_vect() { \
A("push r30") \ A("push r30") \
A("push r31") \ A("push r31") \
A("clr r1") /* C runtime expects this register to be 0 */ \ A("clr r1") /* C runtime expects this register to be 0 */ \
A("call TIMER0_COMPB_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \ A("call TIMER0_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
A("pop r31") \ A("pop r31") \
A("pop r30") \ A("pop r30") \
A("pop r27") \ A("pop r27") \
@@ -251,10 +251,10 @@ void TIMER0_COMPB_vect() { \
A("reti") /* 4 Return from interrupt */ \ A("reti") /* 4 Return from interrupt */ \
: \ : \
: [timsk0] "i"((uint16_t)&TIMSK0), \ : [timsk0] "i"((uint16_t)&TIMSK0), \
[msk0] "M" ((uint8_t)(1<<OCIE0B)) \ [msk0] "M" ((uint8_t)(1<<OCIE0A)) \
: \ : \
); \ ); \
} \ } \
void TIMER0_COMPB_vect_bottom() void TIMER0_COMPA_vect_bottom()
#endif // HAL_TEMP_TIMER_ISR #endif // HAL_TEMP_TIMER_ISR

View File

@@ -1,70 +0,0 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifdef __AVR__
#include "../../inc/MarlinConfig.h"
#if ENABLED(USE_WATCHDOG)
#include "watchdog.h"
#include "../../MarlinCore.h"
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
void watchdog_init() {
#if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
#define WDTO_NS WDTO_8S
#else
#define WDTO_NS WDTO_4S
#endif
#if ENABLED(WATCHDOG_RESET_MANUAL)
// Enable the watchdog timer, but only for the interrupt.
// Take care, as this requires the correct order of operation, with interrupts disabled.
// See the datasheet of any AVR chip for details.
wdt_reset();
cli();
_WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
_WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
// So worked for up to WDTO_2S
sei();
wdt_reset();
#else
wdt_enable(WDTO_NS); // The function handles the upper bit correct.
#endif
//delay(10000); // test it!
}
//===========================================================================
//=================================== ISR ===================================
//===========================================================================
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
#if ENABLED(WATCHDOG_RESET_MANUAL)
ISR(WDT_vect) {
sei(); // With the interrupt driven serial we need to allow interrupts.
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
minkill(); // interrupt-safe final kill and infinite loop
}
#endif
#endif // USE_WATCHDOG
#endif // __AVR__

View File

@@ -25,7 +25,7 @@
#ifdef ARDUINO_ARCH_SAM #ifdef ARDUINO_ARCH_SAM
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#include "HAL.h" #include "../../MarlinCore.h"
#include <Wire.h> #include <Wire.h>
#include "usb/usb_task.h" #include "usb/usb_task.h"
@@ -34,39 +34,33 @@
// Public Variables // Public Variables
// ------------------------ // ------------------------
uint16_t HAL_adc_result; uint16_t MarlinHAL::adc_result;
// ------------------------ // ------------------------
// Public functions // Public functions
// ------------------------ // ------------------------
TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); #if ENABLED(POSTMORTEM_DEBUGGING)
extern void install_min_serial();
#endif
// HAL initialization task void MarlinHAL::init() {
void HAL_init() {
// Initialize the USB stack
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
#endif #endif
usb_task_init(); usb_task_init(); // Initialize the USB stack
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
} }
// HAL idle task void MarlinHAL::init_board() {
void HAL_idletask() { #ifdef BOARD_INIT
// Perform USB stack housekeeping BOARD_INIT();
usb_task_idle(); #endif
} }
// Disable interrupts void MarlinHAL::idletask() { usb_task_idle(); } // Perform USB stack housekeeping
void cli() { noInterrupts(); }
// Enable interrupts uint8_t MarlinHAL::get_reset_source() {
void sei() { interrupts(); }
void HAL_clear_reset_source() { }
uint8_t HAL_get_reset_source() {
switch ((RSTC->RSTC_SR >> 8) & 0x07) { switch ((RSTC->RSTC_SR >> 8) & 0x07) {
case 0: return RST_POWER_ON; case 0: return RST_POWER_ON;
case 1: return RST_BACKUP; case 1: return RST_BACKUP;
@@ -77,13 +71,105 @@ uint8_t HAL_get_reset_source() {
} }
} }
void HAL_reboot() { rstc_start_software_reset(RSTC); } void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); }
void _delay_ms(const int delay_ms) { // ------------------------
// Todo: port for Due? // Watchdog Timer
delay(delay_ms); // ------------------------
#if ENABLED(USE_WATCHDOG)
// Initialize watchdog - On SAM3X, Watchdog was already configured
// and enabled or disabled at startup, so no need to reconfigure it
// here.
void MarlinHAL::watchdog_init() { WDT_Restart(WDT); } // Reset watchdog to start clean
// Reset watchdog. MUST be called at least every 4 seconds after the
// first watchdog_init or AVR will go into emergency procedures.
void MarlinHAL::watchdog_refresh() { watchdogReset(); }
#endif
// Override Arduino runtime to either config or disable the watchdog
//
// We need to configure the watchdog as soon as possible in the boot
// process, because watchdog initialization at hardware reset on SAM3X8E
// is unreliable, and there is risk of unintended resets if we delay
// that initialization to a later time.
void watchdogSetup() {
#if ENABLED(USE_WATCHDOG)
// 4 seconds timeout
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
// Calculate timeout value in WDT counter ticks: This assumes
// the slow clock is running at 32.768 kHz watchdog
// frequency is therefore 32768 / 128 = 256 Hz
timeout = (timeout << 8) / 1000;
if (timeout == 0)
timeout = 1;
else if (timeout > 0xFFF)
timeout = 0xFFF;
// We want to enable the watchdog with the specified timeout
uint32_t value =
WDT_MR_WDV(timeout) | // With the specified timeout
WDT_MR_WDD(timeout) | // and no invalid write window
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
// to keep PIO controller state
#endif
WDT_MR_WDDBGHLT | // WDT stops in debug state.
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
#if ENABLED(WATCHDOG_RESET_MANUAL)
// We enable the watchdog timer, but only for the interrupt.
// Configure WDT to only trigger an interrupt
value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt.
// Disable WDT interrupt (just in case, to avoid triggering it!)
NVIC_DisableIRQ(WDT_IRQn);
// We NEED memory barriers to ensure Interrupts are actually disabled!
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
__DSB();
__ISB();
// Initialize WDT with the given parameters
WDT_Enable(WDT, value);
// Configure and enable WDT interrupt.
NVIC_ClearPendingIRQ(WDT_IRQn);
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
NVIC_EnableIRQ(WDT_IRQn);
#else
// a WDT fault triggers a reset
value |= WDT_MR_WDRSTEN;
// Initialize WDT with the given parameters
WDT_Enable(WDT, value);
#endif
// Reset the watchdog
WDT_Restart(WDT);
#else
// Make sure to completely disable the Watchdog
WDT_Disable(WDT);
#endif
} }
// ------------------------
// Free Memory Accessor
// ------------------------
extern "C" { extern "C" {
extern unsigned int _ebss; // end of bss section extern unsigned int _ebss; // end of bss section
} }
@@ -95,18 +181,9 @@ int freeMemory() {
} }
// ------------------------ // ------------------------
// ADC // Serial Ports
// ------------------------ // ------------------------
void HAL_adc_start_conversion(const uint8_t ch) {
HAL_adc_result = analogRead(ch);
}
uint16_t HAL_adc_get_result() {
// nop
return HAL_adc_result;
}
// Forward the default serial ports // Forward the default serial ports
#if USING_HW_SERIAL0 #if USING_HW_SERIAL0
DefaultSerial1 MSerial0(false, Serial); DefaultSerial1 MSerial0(false, Serial);

View File

@@ -32,12 +32,15 @@
#include "../shared/math_32bit.h" #include "../shared/math_32bit.h"
#include "../shared/HAL_SPI.h" #include "../shared/HAL_SPI.h"
#include "fastio.h" #include "fastio.h"
#include "watchdog.h"
#include <stdint.h> #include <stdint.h>
#include "../../core/serial_hook.h" #include "../../core/serial_hook.h"
// ------------------------
// Serial ports
// ------------------------
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2; typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3; typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
@@ -97,60 +100,38 @@ extern DefaultSerial4 MSerial3;
#include "MarlinSerial.h" #include "MarlinSerial.h"
#include "MarlinSerialUSB.h" #include "MarlinSerialUSB.h"
// On AVR this is in math.h? // ------------------------
#define square(x) ((x)*(x)) // Types
// ------------------------
typedef int8_t pin_t; typedef int8_t pin_t;
#define SHARED_SERVOS HAS_SERVOS #define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
#define HAL_SERVO_LIB Servo
class Servo;
typedef Servo hal_servo_t;
// //
// Interrupts // Interrupts
// //
#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() #define sei() interrupts()
#define CRITICAL_SECTION_END() if (!primask) __enable_irq() #define cli() noInterrupts()
#define ISRS_ENABLED() (!__get_PRIMASK())
#define ENABLE_ISRS() __enable_irq()
#define DISABLE_ISRS() __disable_irq()
void cli(); // Disable interrupts #define CRITICAL_SECTION_START() const bool _irqon = hal.isr_state(); hal.isr_off()
void sei(); // Enable interrupts #define CRITICAL_SECTION_END() if (_irqon) hal.isr_on()
void HAL_clear_reset_source(); // clear reset reason
uint8_t HAL_get_reset_source(); // get reset reason
void HAL_reboot();
// //
// ADC // ADC
// //
extern uint16_t HAL_adc_result; // result of last ADC conversion #define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION 10
#ifndef analogInputToDigitalPin #ifndef analogInputToDigitalPin
#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1)
#endif #endif
#define HAL_ANALOG_SELECT(ch)
inline void HAL_adc_init() {}//todo
#define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION 10
#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch)
#define HAL_READ_ADC() HAL_adc_result
#define HAL_ADC_READY() true
void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result();
// //
// PWM // Pin Mapping for M42, M43, M226
//
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
//
// Pin Map
// //
#define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin #define GET_PIN_MAP_INDEX(pin) pin
@@ -159,27 +140,18 @@ inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255,
// //
// Tone // Tone
// //
void toneInit();
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
void noTone(const pin_t _pin); void noTone(const pin_t _pin);
// Enable hooks into idle and setup for HAL // ------------------------
#define HAL_IDLETASK 1 // Class Utilities
void HAL_idletask(); // ------------------------
void HAL_init();
//
// Utility functions
//
void _delay_ms(const int delay);
#pragma GCC diagnostic push #pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#endif #endif
int freeMemory();
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#ifdef __cplusplus #ifdef __cplusplus
@@ -189,3 +161,73 @@ char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
// Return free RAM between end of heap (or end bss) and whatever is current
int freeMemory();
// ------------------------
// MarlinHAL Class
// ------------------------
class MarlinHAL {
public:
// Earliest possible init, before setup()
MarlinHAL() {}
// Watchdog
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
static void init(); // Called early in setup()
static void init_board(); // Called less early in setup()
static void reboot(); // Restart the firmware
// Interrupts
static bool isr_state() { return !__get_PRIMASK(); }
static void isr_on() { __enable_irq(); }
static void isr_off() { __disable_irq(); }
static void delay_ms(const int ms) { delay(ms); }
// Tasks, called from idle()
static void idletask();
// Reset
static uint8_t get_reset_source();
static void clear_reset_source() {}
// Free SRAM
static int freeMemory() { return ::freeMemory(); }
//
// ADC Methods
//
static uint16_t adc_result;
// Called by Temperature::init once at startup
static void adc_init() {}
// Called by Temperature::init for each sensor at startup
static void adc_enable(const uint8_t /*ch*/) {}
// Begin ADC sampling on the given channel. Called from Temperature::isr!
static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); }
// Is the ADC ready for reading?
static bool adc_ready() { return true; }
// The current value of the ADC register
static uint16_t adc_value() { return adc_result; }
/**
* Set the PWM duty cycle for the pin to the given value.
* No inverting the duty cycle in this HAL.
* No changing the maximum size of the provided value to enable finer PWM duty control in this HAL.
*/
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) {
analogWrite(pin, v);
}
};

View File

@@ -31,8 +31,6 @@
/** /**
* HAL for Arduino Due and compatible (SAM3X8E) * HAL for Arduino Due and compatible (SAM3X8E)
*
* For ARDUINO_ARCH_SAM
*/ */
#ifdef ARDUINO_ARCH_SAM #ifdef ARDUINO_ARCH_SAM
@@ -249,12 +247,12 @@
b <<= 1; // little setup time b <<= 1; // little setup time
WRITE(SD_SCK_PIN, HIGH); WRITE(SD_SCK_PIN, HIGH);
DELAY_NS(spiDelayNS); DELAY_NS_VAR(spiDelayNS);
b |= (READ(SD_MISO_PIN) != 0); b |= (READ(SD_MISO_PIN) != 0);
WRITE(SD_SCK_PIN, LOW); WRITE(SD_SCK_PIN, LOW);
DELAY_NS(spiDelayNS); DELAY_NS_VAR(spiDelayNS);
} while (--bits); } while (--bits);
return b; return b;
} }

View File

@@ -41,7 +41,7 @@
practice, we need alignment to 256 bytes to make this work in all practice, we need alignment to 256 bytes to make this work in all
cases */ cases */
__attribute__ ((aligned(256))) __attribute__ ((aligned(256)))
static DeviceVectors ram_tab = { nullptr }; static DeviceVectors ram_tab[61] = { nullptr };
/** /**
* This function checks if the exception/interrupt table is already in SRAM or not. * This function checks if the exception/interrupt table is already in SRAM or not.

View File

@@ -406,7 +406,7 @@ size_t MarlinSerial<Cfg>::write(const uint8_t c) {
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
// If global interrupts are disabled (as the result of being called from an ISR)... // If global interrupts are disabled (as the result of being called from an ISR)...
if (!ISRS_ENABLED()) { if (!hal.isr_state()) {
// Make room by polling if it is possible to transmit, and do so! // Make room by polling if it is possible to transmit, and do so!
while (i == tx_buffer.tail) { while (i == tx_buffer.tail) {
@@ -454,7 +454,7 @@ void MarlinSerial<Cfg>::flushTX() {
if (!_written) return; if (!_written) return;
// If global interrupts are disabled (as the result of being called from an ISR)... // If global interrupts are disabled (as the result of being called from an ISR)...
if (!ISRS_ENABLED()) { if (!hal.isr_state()) {
// Wait until everything was transmitted - We must do polling, as interrupts are disabled // Wait until everything was transmitted - We must do polling, as interrupts are disabled
while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) { while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) {

View File

@@ -118,7 +118,7 @@ public:
static size_t write(const uint8_t c); static size_t write(const uint8_t c);
static void flushTX(); static void flushTX();
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }

View File

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

View File

@@ -25,7 +25,7 @@
#if ENABLED(POSTMORTEM_DEBUGGING) #if ENABLED(POSTMORTEM_DEBUGGING)
#include "../shared/HAL_MinSerial.h" #include "../shared/MinSerial.h"
#include <stdarg.h> #include <stdarg.h>

View File

@@ -47,12 +47,12 @@
#include "../shared/servo.h" #include "../shared/servo.h"
#include "../shared/servo_private.h" #include "../shared/servo_private.h"
static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) static Flags<_Nbr_16timers> DisablePending; // ISR should disable the timer at the next timer reset
// ------------------------ // ------------------------
/// Interrupt handler for the TC0 channel 1. /// Interrupt handler for the TC0 channel 1.
// ------------------------ // ------------------------
void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); void Servo_Handler(const timer16_Sequence_t, Tc*, const uint8_t);
#ifdef _useTimer1 #ifdef _useTimer1
void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); } void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); }
@@ -70,88 +70,92 @@ void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel);
void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); } void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); }
#endif #endif
void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) { void Servo_Handler(const timer16_Sequence_t timer, Tc *tc, const uint8_t channel) {
// clear interrupt static int8_t Channel[_Nbr_16timers]; // Servo counters to pulse (or -1 for refresh interval)
tc->TC_CHANNEL[channel].TC_SR; int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
if (Channel[timer] < 0) if (cho < 0) { // Channel -1 indicates the refresh interval completed...
tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // ...so reset the timer
else if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) if (DisablePending[timer]) {
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated // Disabling only after the full servo period expires prevents
// pulses being too close together if immediately re-enabled.
DisablePending.clear(timer);
TC_Stop(tc, channel);
tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
return;
}
}
else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
Channel[timer]++; // increment to the next channel Channel[timer] = ++cho; // go to the next channel (or 0)
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer, cho).ticks;
if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated if (SERVO(timer, cho).Pin.isActive) // activated?
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // its an active channel so pulse it high extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
} }
else { else {
// finished all channels so wait for the refresh period to expire before starting over // finished all channels so wait for the refresh period to expire before starting over
tc->TC_CHANNEL[channel].TC_RA = const unsigned int cval = tc->TC_CHANNEL[channel].TC_CV + 128 / (SERVO_TIMER_PRESCALER), // allow 128 cycles to ensure the next CV not missed
tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4 ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed tc->TC_CHANNEL[channel].TC_RA = max(cval, ival);
: tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed
Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel Channel[timer] = -1; // reset the timer CCR on the next call
} }
tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
} }
static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) { static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) {
pmc_enable_periph_clk(id); pmc_enable_periph_clk(id);
TC_Configure(tc, channel, TC_Configure(tc, channel,
TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 TC_CMR_WAVE // Waveform mode
TC_CMR_WAVE | // Waveform mode | TC_CMR_WAVSEL_UP_RC // Counter running up and reset when equal to RC
TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC | (SERVO_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0) // MCK/2
| (SERVO_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0) // MCK/8
| (SERVO_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0) // MCK/32
| (SERVO_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0) // MCK/128
);
/* 84MHz, MCK/32, for 1.5ms: 3937 */ // Wait 1ms before the first ISR
TC_SetRA(tc, channel, 2625); // 1ms TC_SetRA(tc, channel, (F_CPU) / (SERVO_TIMER_PRESCALER) / 1000UL); // 1ms
/* Configure and enable interrupt */ // Configure and enable interrupt
NVIC_EnableIRQ(irqn); NVIC_EnableIRQ(irqn);
// TC_IER_CPAS: RA Compare tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; // TC_IER_CPAS: RA Compare
tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS;
// Enables the timer clock and performs a software reset to start the counting // Enables the timer clock and performs a software reset to start the counting
TC_Start(tc, channel); TC_Start(tc, channel);
} }
void initISR(timer16_Sequence_t timer) { void initISR(const timer16_Sequence_t timer_index) {
#ifdef _useTimer1 CRITICAL_SECTION_START();
if (timer == _timer1) const bool disable_soon = DisablePending[timer_index];
_initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); DisablePending.clear(timer_index);
#endif CRITICAL_SECTION_END();
#ifdef _useTimer2
if (timer == _timer2) if (!disable_soon) switch (timer_index) {
_initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); default: break;
#endif #ifdef _useTimer1
#ifdef _useTimer3 case _timer1: return _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1);
if (timer == _timer3) #endif
_initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); #ifdef _useTimer2
#endif case _timer2: return _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2);
#ifdef _useTimer4 #endif
if (timer == _timer4) #ifdef _useTimer3
_initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); case _timer3: return _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3);
#endif #endif
#ifdef _useTimer5 #ifdef _useTimer4
if (timer == _timer5) case _timer4: return _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4);
_initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); #endif
#endif #ifdef _useTimer5
case _timer5: return _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5);
#endif
}
} }
void finISR(timer16_Sequence_t) { void finISR(const timer16_Sequence_t timer_index) {
#ifdef _useTimer1 // Timer is disabled from the ISR, to ensure proper final pulse length.
TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); DisablePending.set(timer_index);
#endif
#ifdef _useTimer2
TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2);
#endif
#ifdef _useTimer3
TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3);
#endif
#ifdef _useTimer4
TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4);
#endif
#ifdef _useTimer5
TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5);
#endif
} }
#endif // HAS_SERVOS #endif // HAS_SERVOS

View File

@@ -37,7 +37,7 @@
#define _useTimer5 #define _useTimer5
#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays #define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
#define SERVO_TIMER_PRESCALER 32 // timer prescaler #define SERVO_TIMER_PRESCALER 2 // timer prescaler
/* /*
TC0, chan 0 => TC0_Handler TC0, chan 0 => TC0_Handler

View File

@@ -35,7 +35,7 @@
static pin_t tone_pin; static pin_t tone_pin;
volatile static int32_t toggles; volatile static int32_t toggles;
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration/*=0*/) {
tone_pin = _pin; tone_pin = _pin;
toggles = 2 * frequency * duration / 1000; toggles = 2 * frequency * duration / 1000;
HAL_timer_start(MF_TIMER_TONE, 2 * frequency); HAL_timer_start(MF_TIMER_TONE, 2 * frequency);

View File

@@ -199,8 +199,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
for (i = 0; i <PageSize >> 2; i++) for (i = 0; i <PageSize >> 2; i++)
pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i])); pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM PageWrite ", page);
DEBUG_ECHOLNPGM("EEPROM PageWrite ", page);
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash); DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0)); DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
DEBUG_FLUSH(); DEBUG_FLUSH();
@@ -245,8 +244,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
// Reenable interrupts // Reenable interrupts
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Unlock failure for page ", page);
DEBUG_ECHOLNPGM("EEPROM Unlock failure for page ", page);
return false; return false;
} }
@@ -270,8 +268,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
// Reenable interrupts // Reenable interrupts
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Write failure for page ", page);
DEBUG_ECHOLNPGM("EEPROM Write failure for page ", page);
return false; return false;
} }
@@ -286,8 +283,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
if (memcmp(getFlashStorage(page),data,PageSize)) { if (memcmp(getFlashStorage(page),data,PageSize)) {
#ifdef EE_EMU_DEBUG #ifdef EE_EMU_DEBUG
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Verify Write failure for page ", page);
DEBUG_ECHOLNPGM("EEPROM Verify Write failure for page ", page);
ee_Dump( page, (uint32_t *)addrflash); ee_Dump( page, (uint32_t *)addrflash);
ee_Dump(-page, data); ee_Dump(-page, data);
@@ -325,8 +321,7 @@ static bool ee_PageErase(uint16_t page) {
uint16_t i; uint16_t i;
uint32_t addrflash = uint32_t(getFlashStorage(page)); uint32_t addrflash = uint32_t(getFlashStorage(page));
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM PageErase ", page);
DEBUG_ECHOLNPGM("EEPROM PageErase ", page);
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash); DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0)); DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
DEBUG_FLUSH(); DEBUG_FLUSH();
@@ -370,8 +365,7 @@ static bool ee_PageErase(uint16_t page) {
// Reenable interrupts // Reenable interrupts
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Unlock failure for page ",page);
DEBUG_ECHOLNPGM("EEPROM Unlock failure for page ",page);
return false; return false;
} }
@@ -394,8 +388,7 @@ static bool ee_PageErase(uint16_t page) {
// Reenable interrupts // Reenable interrupts
__enable_irq(); __enable_irq();
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Erase failure for page ",page);
DEBUG_ECHOLNPGM("EEPROM Erase failure for page ",page);
return false; return false;
} }
@@ -410,8 +403,7 @@ static bool ee_PageErase(uint16_t page) {
uint32_t * aligned_src = (uint32_t *) addrflash; uint32_t * aligned_src = (uint32_t *) addrflash;
for (i = 0; i < PageSize >> 2; i++) { for (i = 0; i < PageSize >> 2; i++) {
if (*aligned_src++ != 0xFFFFFFFF) { if (*aligned_src++ != 0xFFFFFFFF) {
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Verify Erase failure for page ",page);
DEBUG_ECHOLNPGM("EEPROM Verify Erase failure for page ",page);
ee_Dump(page, (uint32_t *)addrflash); ee_Dump(page, (uint32_t *)addrflash);
return false; return false;
} }
@@ -921,8 +913,7 @@ static void ee_Init() {
// If all groups seem to be used, default to first group // If all groups seem to be used, default to first group
if (curGroup >= GroupCount) curGroup = 0; if (curGroup >= GroupCount) curGroup = 0;
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Current Group: ",curGroup);
DEBUG_ECHOLNPGM("EEPROM Current Group: ",curGroup);
DEBUG_FLUSH(); DEBUG_FLUSH();
// Now, validate that all the other group pages are empty // Now, validate that all the other group pages are empty
@@ -931,8 +922,7 @@ static void ee_Init() {
for (int page = 0; page < PagesPerGroup; page++) { for (int page = 0; page < PagesPerGroup; page++) {
if (!ee_IsPageClean(grp * PagesPerGroup + page)) { if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on group ", grp);
DEBUG_ECHOLNPGM("EEPROM Page ", page, " not clean on group ", grp);
DEBUG_FLUSH(); DEBUG_FLUSH();
ee_PageErase(grp * PagesPerGroup + page); ee_PageErase(grp * PagesPerGroup + page);
} }
@@ -948,15 +938,13 @@ static void ee_Init() {
} }
} }
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Active page: ", curPage);
DEBUG_ECHOLNPGM("EEPROM Active page: ", curPage);
DEBUG_FLUSH(); DEBUG_FLUSH();
// Make sure the pages following the first clean one are also clean // Make sure the pages following the first clean one are also clean
for (int page = curPage + 1; page < PagesPerGroup; page++) { for (int page = curPage + 1; page < PagesPerGroup; page++) {
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) { if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
DEBUG_ECHO_START(); DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on active group ", curGroup);
DEBUG_ECHOLNPGM("EEPROM Page ", page, " not clean on active group ", curGroup);
DEBUG_FLUSH(); DEBUG_FLUSH();
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page)); ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
ee_PageErase(curGroup * PagesPerGroup + page); ee_PageErase(curGroup * PagesPerGroup + page);

View File

@@ -70,4 +70,10 @@ void setup_endstop_interrupts() {
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
} }

View File

@@ -25,7 +25,7 @@
* is NOT used to directly toggle pins. The ISR writes to the pin assigned to * is NOT used to directly toggle pins. The ISR writes to the pin assigned to
* that interrupt. * that interrupt.
* *
* All PWMs use the same repetition rate. The G2 needs about 10KHz min in order to * All PWMs use the same repetition rate. The G2 needs about 10kHz min in order to
* not have obvious ripple on the Vref signals. * not have obvious ripple on the Vref signals.
* *
* The data structures are setup to minimize the computation done by the ISR which * The data structures are setup to minimize the computation done by the ISR which

View File

@@ -20,7 +20,3 @@
* *
*/ */
#pragma once #pragma once
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/DUE."
#endif

View File

@@ -25,6 +25,34 @@
* Test Arduino Due specific configuration values for errors at compile-time. * Test Arduino Due specific configuration values for errors at compile-time.
*/ */
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/DUE."
#endif
/**
* Check for common serial pin conflicts
*/
#define CHECK_SERIAL_PIN(N) ( \
X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
|| X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
|| X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
)
#if SERIAL_IN_USE(0) // D0-D1. No known conflicts.
#endif
#if SERIAL_IN_USE(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
#endif
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
#endif
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
#endif
#undef CHECK_SERIAL_PIN
/** /**
* HARDWARE VS. SOFTWARE SPI COMPATIBILITY * HARDWARE VS. SOFTWARE SPI COMPATIBILITY
* *
@@ -53,9 +81,13 @@
#endif #endif
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE." #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported for HAL/DUE."
#endif #endif
#if HAS_TMC_SW_SERIAL #if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on the DUE platform." #error "TMC220x Software Serial is not supported on the DUE platform."
#endif #endif
#if USING_PULLDOWNS
#error "PULLDOWN pin mode is not available on DUE boards."
#endif

View File

@@ -53,7 +53,7 @@
* The net result is that both the g_pinStatus[pin] array and the PIO_OSR register * The net result is that both the g_pinStatus[pin] array and the PIO_OSR register
* needs to be looked at when determining if a pin is an input or an output. * needs to be looked at when determining if a pin is an input or an output.
* *
* b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1KHz * b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1kHz
* *
* c) NUM_DIGITAL_PINS does not include the analog pins * c) NUM_DIGITAL_PINS does not include the analog pins
* *
@@ -70,7 +70,7 @@
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
#define GET_ARRAY_PIN(p) pin_array[p].pin #define GET_ARRAY_PIN(p) pin_array[p].pin
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital #define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) #define VALID_PIN(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL))
#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) #define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1))) #define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \ #define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
@@ -86,7 +86,6 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
|| pwm_status(pin)); || pwm_status(pin));
} }
void pwm_details(int32_t pin) { void pwm_details(int32_t pin) {
if (pwm_status(pin)) { if (pwm_status(pin)) {
uint32_t chan = g_APinDescription[pin].ulPWMChannel; uint32_t chan = g_APinDescription[pin].ulPWMChannel;

View File

@@ -89,10 +89,17 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
NVIC_SetPriority(irq, timer_config[timer_num].priority); NVIC_SetPriority(irq, timer_config[timer_num].priority);
// wave mode, reset counter on match with RC, // wave mode, reset counter on match with RC,
TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); TC_Configure(tc, channel,
TC_CMR_WAVE
| TC_CMR_WAVSEL_UP_RC
| (HAL_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0)
| (HAL_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0)
| (HAL_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0)
| (HAL_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0)
);
// Set compare value // Set compare value
TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency); TC_SetRC(tc, channel, VARIANT_MCK / (HAL_TIMER_PRESCALER) / frequency);
// And start timer // And start timer
TC_Start(tc, channel); TC_Start(tc, channel);

View File

@@ -35,7 +35,8 @@
typedef uint32_t hal_timer_t; typedef uint32_t hal_timer_t;
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF #define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals #define HAL_TIMER_PRESCALER 2
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
#ifndef MF_TIMER_STEP #ifndef MF_TIMER_STEP
#define MF_TIMER_STEP 2 // Timer Index for Stepper #define MF_TIMER_STEP 2 // Timer Index for Stepper
@@ -125,4 +126,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) #define HAL_timer_isr_epilogue(T) NOOP

View File

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

View File

@@ -1059,7 +1059,7 @@ static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data)
while (val_index < 8) while (val_index < 8)
{ {
data[val_index++] = value & 0xFF; data[val_index++] = value & 0xFF;
value = value >> 8; value >>= 8;
} }
} }

View File

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

View File

@@ -62,7 +62,7 @@ void usb_task_idle(void) {
// Attend SD card access from the USB MSD -- Prioritize access to improve speed // Attend SD card access from the USB MSD -- Prioritize access to improve speed
int delay = 2; int delay = 2;
while (main_b_msc_enable && --delay > 0) { while (main_b_msc_enable && --delay > 0) {
if (udi_msc_process_trans()) delay = 10000; if (udi_msc_process_trans()) delay = 20;
// Reset the watchdog, just to be sure // Reset the watchdog, just to be sure
REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5); REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5);

View File

@@ -1,114 +0,0 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifdef ARDUINO_ARCH_SAM
#include "../../inc/MarlinConfig.h"
#include "../../MarlinCore.h"
#include "watchdog.h"
// Override Arduino runtime to either config or disable the watchdog
//
// We need to configure the watchdog as soon as possible in the boot
// process, because watchdog initialization at hardware reset on SAM3X8E
// is unreliable, and there is risk of unintended resets if we delay
// that initialization to a later time.
void watchdogSetup() {
#if ENABLED(USE_WATCHDOG)
// 4 seconds timeout
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
// Calculate timeout value in WDT counter ticks: This assumes
// the slow clock is running at 32.768 kHz watchdog
// frequency is therefore 32768 / 128 = 256 Hz
timeout = (timeout << 8) / 1000;
if (timeout == 0)
timeout = 1;
else if (timeout > 0xFFF)
timeout = 0xFFF;
// We want to enable the watchdog with the specified timeout
uint32_t value =
WDT_MR_WDV(timeout) | // With the specified timeout
WDT_MR_WDD(timeout) | // and no invalid write window
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
// to keep PIO controller state
#endif
WDT_MR_WDDBGHLT | // WDT stops in debug state.
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
#if ENABLED(WATCHDOG_RESET_MANUAL)
// We enable the watchdog timer, but only for the interrupt.
// Configure WDT to only trigger an interrupt
value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt.
// Disable WDT interrupt (just in case, to avoid triggering it!)
NVIC_DisableIRQ(WDT_IRQn);
// We NEED memory barriers to ensure Interrupts are actually disabled!
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
__DSB();
__ISB();
// Initialize WDT with the given parameters
WDT_Enable(WDT, value);
// Configure and enable WDT interrupt.
NVIC_ClearPendingIRQ(WDT_IRQn);
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
NVIC_EnableIRQ(WDT_IRQn);
#else
// a WDT fault triggers a reset
value |= WDT_MR_WDRSTEN;
// Initialize WDT with the given parameters
WDT_Enable(WDT, value);
#endif
// Reset the watchdog
WDT_Restart(WDT);
#else
// Make sure to completely disable the Watchdog
WDT_Disable(WDT);
#endif
}
#if ENABLED(USE_WATCHDOG)
// Initialize watchdog - On SAM3X, Watchdog was already configured
// and enabled or disabled at startup, so no need to reconfigure it
// here.
void watchdog_init() {
// Reset watchdog to start clean
WDT_Restart(WDT);
}
#endif // USE_WATCHDOG
#endif

View File

@@ -52,7 +52,7 @@
// Externs // Externs
// ------------------------ // ------------------------
portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; portMUX_TYPE MarlinHAL::spinlock = portMUX_INITIALIZER_UNLOCKED;
// ------------------------ // ------------------------
// Local defines // Local defines
@@ -64,7 +64,8 @@ portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
// Public Variables // Public Variables
// ------------------------ // ------------------------
uint16_t HAL_adc_result; uint16_t MarlinHAL::adc_result;
pwm_pin_t MarlinHAL::pwm_pin_data[MAX_EXPANDER_BITS];
// ------------------------ // ------------------------
// Private Variables // Private Variables
@@ -73,9 +74,16 @@ uint16_t HAL_adc_result;
esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX]; esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX];
adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {}; adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {};
uint32_t thresholds[ADC_ATTEN_MAX]; uint32_t thresholds[ADC_ATTEN_MAX];
volatile int numPWMUsed = 0,
pwmPins[MAX_PWM_PINS], volatile int numPWMUsed = 0;
pwmValues[MAX_PWM_PINS]; volatile struct { pin_t pin; int value; } pwmState[MAX_PWM_PINS];
pin_t chan_pin[CHANNEL_MAX_NUM + 1] = { 0 }; // PWM capable IOpins - not 0 or >33 on ESP32
struct {
uint32_t freq; // ledcReadFreq doesn't work if a duty hasn't been set yet!
uint16_t res;
} pwmInfo[(CHANNEL_MAX_NUM + 1) / 2];
// ------------------------ // ------------------------
// Public functions // Public functions
@@ -95,20 +103,22 @@ volatile int numPWMUsed = 0,
#endif #endif
#if ENABLED(USE_ESP32_EXIO) #if ENABLED(USE_ESP32_EXIO)
HardwareSerial YSerial2(2); HardwareSerial YSerial2(2);
void Write_EXIO(uint8_t IO, uint8_t v) { void Write_EXIO(uint8_t IO, uint8_t v) {
if (ISRS_ENABLED()) { if (hal.isr_state()) {
DISABLE_ISRS(); hal.isr_off();
YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100)); YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
ENABLE_ISRS(); hal.isr_on();
} }
else else
YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100)); YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
} }
#endif #endif
void HAL_init_board() { void MarlinHAL::init_board() {
#if ENABLED(USE_ESP32_TASK_WDT) #if ENABLED(USE_ESP32_TASK_WDT)
esp_task_wdt_init(10, true); esp_task_wdt_init(10, true);
#endif #endif
@@ -154,27 +164,51 @@ void HAL_init_board() {
#endif #endif
} }
void HAL_idletask() { void MarlinHAL::idletask() {
#if BOTH(WIFISUPPORT, OTASUPPORT) #if BOTH(WIFISUPPORT, OTASUPPORT)
OTA_handle(); OTA_handle();
#endif #endif
TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask()); TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask());
} }
void HAL_clear_reset_source() { } uint8_t MarlinHAL::get_reset_source() { return rtc_get_reset_reason(1); }
uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); } void MarlinHAL::reboot() { ESP.restart(); }
void HAL_reboot() { ESP.restart(); }
void _delay_ms(int delay_ms) { delay(delay_ms); } void _delay_ms(int delay_ms) { delay(delay_ms); }
// return free memory between end of heap (or end bss) and whatever is current // return free memory between end of heap (or end bss) and whatever is current
int freeMemory() { return ESP.getFreeHeap(); } int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
// ------------------------
// Watchdog Timer
// ------------------------
#if ENABLED(USE_WATCHDOG)
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
extern "C" {
esp_err_t esp_task_wdt_reset();
}
void watchdogSetup() {
// do whatever. don't remove this function.
}
void MarlinHAL::watchdog_init() {
// TODO
}
// Reset watchdog.
void MarlinHAL::watchdog_refresh() { esp_task_wdt_reset(); }
#endif
// ------------------------ // ------------------------
// ADC // ADC
// ------------------------ // ------------------------
#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL #define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL
adc1_channel_t get_channel(int pin) { adc1_channel_t get_channel(int pin) {
@@ -196,22 +230,24 @@ void adc1_set_attenuation(adc1_channel_t chan, adc_atten_t atten) {
} }
} }
void HAL_adc_init() { void MarlinHAL::adc_init() {
// Configure ADC // Configure ADC
adc1_config_width(ADC_WIDTH_12Bit); adc1_config_width(ADC_WIDTH_12Bit);
// Configure channels only if used as (re-)configuring a pin for ADC that is used elsewhere might have adverse effects // Configure channels only if used as (re-)configuring a pin for ADC that is used elsewhere might have adverse effects
TERN_(HAS_TEMP_ADC_0, adc1_set_attenuation(get_channel(TEMP_0_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_0, adc1_set_attenuation(get_channel(TEMP_0_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_ADC_1, adc1_set_attenuation(get_channel(TEMP_1_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_1, adc1_set_attenuation(get_channel(TEMP_1_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_ADC_2, adc1_set_attenuation(get_channel(TEMP_2_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_2, adc1_set_attenuation(get_channel(TEMP_2_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_ADC_3, adc1_set_attenuation(get_channel(TEMP_3_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_3, adc1_set_attenuation(get_channel(TEMP_3_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_ADC_4, adc1_set_attenuation(get_channel(TEMP_4_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_ADC_4, adc1_set_attenuation(get_channel(TEMP_4_PIN), ADC_ATTEN_11db));
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_HEATED_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_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_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_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_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_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.
@@ -226,11 +262,16 @@ void HAL_adc_init() {
} }
} }
void HAL_adc_start_conversion(const uint8_t adc_pin) { #ifndef ADC_REFERENCE_VOLTAGE
const adc1_channel_t chan = get_channel(adc_pin); #define ADC_REFERENCE_VOLTAGE 3.3
#endif
void MarlinHAL::adc_start(const pin_t pin) {
const adc1_channel_t chan = get_channel(pin);
uint32_t mv; uint32_t mv;
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv); esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
HAL_adc_result = mv * 1023.0 / 3300.0;
adc_result = mv * isr_float_t(1023) / isr_float_t(ADC_REFERENCE_VOLTAGE) / isr_float_t(1000);
// Change the attenuation level based on the new reading // Change the attenuation level based on the new reading
adc_atten_t atten; adc_atten_t atten;
@@ -247,25 +288,104 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) {
adc1_set_attenuation(chan, atten); adc1_set_attenuation(chan, atten);
} }
void analogWrite(pin_t pin, int value) { // ------------------------
// Use ledc hardware for internal pins // PWM
if (pin < 34) { // ------------------------
static int cnt_channel = 1, pin_to_channel[40] = { 0 };
if (pin_to_channel[pin] == 0) { int8_t channel_for_pin(const uint8_t pin) {
ledcAttachPin(pin, cnt_channel); for (int i = 0; i <= CHANNEL_MAX_NUM; i++)
ledcSetup(cnt_channel, 490, 8); if (chan_pin[i] == pin) return i;
ledcWrite(cnt_channel, value); return -1;
pin_to_channel[pin] = cnt_channel++; }
// get PWM channel for pin - if none then attach a new one
// return -1 if fail or invalid pin#, channel # (0-15) if success
int8_t get_pwm_channel(const pin_t pin, const uint32_t freq, const uint16_t res) {
if (!WITHIN(pin, 1, MAX_PWM_IOPIN)) return -1; // Not a hardware PWM pin!
int8_t cid = channel_for_pin(pin);
if (cid >= 0) return cid;
// Find an empty adjacent channel (same timer & freq/res)
for (int i = 0; i <= CHANNEL_MAX_NUM; i++) {
if (chan_pin[i] == 0) {
if (chan_pin[i ^ 0x1] != 0) {
if (pwmInfo[i / 2].freq == freq && pwmInfo[i / 2].res == res) {
chan_pin[i] = pin; // Allocate PWM to this channel
ledcAttachPin(pin, i);
return i;
}
}
else if (cid == -1) // Pair of empty channels?
cid = i & 0xFE; // Save lower channel number
} }
ledcWrite(pin_to_channel[pin], value); }
// not attached, is an empty timer slot avail?
if (cid >= 0) {
chan_pin[cid] = pin;
pwmInfo[cid / 2].freq = freq;
pwmInfo[cid / 2].res = res;
ledcSetup(cid, freq, res);
ledcAttachPin(pin, cid);
}
return cid; // -1 if no channel avail
}
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=_BV(PWM_RESOLUTION)-1*/, const bool invert/*=false*/) {
#if ENABLED(I2S_STEPPER_STREAM)
if (pin > 127) {
const uint8_t pinlo = pin & 0x7F;
pwm_pin_t &pindata = pwm_pin_data[pinlo];
const uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, pindata.pwm_cycle_ticks);
if (duty == 0 || duty == pindata.pwm_cycle_ticks) { // max or min (i.e., on/off)
pindata.pwm_duty_ticks = 0; // turn off PWM for this pin
duty ? SBI32(i2s_port_data, pinlo) : CBI32(i2s_port_data, pinlo); // set pin level
}
else
pindata.pwm_duty_ticks = duty; // PWM duty count = # of 4µs ticks per full PWM cycle
return;
}
#endif
const int8_t cid = get_pwm_channel(pin, PWM_FREQUENCY, PWM_RESOLUTION);
if (cid >= 0) {
const uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, _BV(PWM_RESOLUTION)-1);
ledcWrite(cid, duty);
}
}
int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) {
#if ENABLED(I2S_STEPPER_STREAM)
if (pin > 127) {
pwm_pin_data[pin & 0x7F].pwm_cycle_ticks = 1000000UL / f_desired / 4; // # of 4µs ticks per full PWM cycle
return 0;
}
#endif
const int8_t cid = channel_for_pin(pin);
if (cid >= 0) {
if (f_desired == ledcReadFreq(cid)) return cid; // no freq change
ledcDetachPin(chan_pin[cid]);
chan_pin[cid] = 0; // remove old freq channel
}
return get_pwm_channel(pin, f_desired, PWM_RESOLUTION); // try for new one
}
// use hardware PWM if avail, if not then ISR
void analogWrite(const pin_t pin, const uint16_t value, const uint32_t freq/*=PWM_FREQUENCY*/, const uint16_t res/*=8*/) { // always 8 bit resolution!
// Use ledc hardware for internal pins
const int8_t cid = get_pwm_channel(pin, freq, res);
if (cid >= 0) {
ledcWrite(cid, value); // set duty value
return; return;
} }
// not a hardware PWM pin OR no PWM channels available
int idx = -1; int idx = -1;
// Search Pin // Search Pin
for (int i = 0; i < numPWMUsed; ++i) for (int i = 0; i < numPWMUsed; ++i)
if (pwmPins[i] == pin) { idx = i; break; } if (pwmState[i].pin == pin) { idx = i; break; }
// not found ? // not found ?
if (idx < 0) { if (idx < 0) {
@@ -274,7 +394,7 @@ void analogWrite(pin_t pin, int value) {
// Take new slot for pin // Take new slot for pin
idx = numPWMUsed; idx = numPWMUsed;
pwmPins[idx] = pin; pwmState[idx].pin = pin;
// Start timer on first use // Start timer on first use
if (idx == 0) HAL_timer_start(MF_TIMER_PWM, PWM_TIMER_FREQUENCY); if (idx == 0) HAL_timer_start(MF_TIMER_PWM, PWM_TIMER_FREQUENCY);
@@ -282,7 +402,7 @@ void analogWrite(pin_t pin, int value) {
} }
// Use 7bit internal value - add 1 to have 100% high at 255 // Use 7bit internal value - add 1 to have 100% high at 255
pwmValues[idx] = (value + 1) / 2; pwmState[idx].value = (value + 1) / 2;
} }
// Handle PWM timer interrupt // Handle PWM timer interrupt
@@ -293,9 +413,9 @@ HAL_PWM_TIMER_ISR() {
for (int i = 0; i < numPWMUsed; ++i) { for (int i = 0; i < numPWMUsed; ++i) {
if (count == 0) // Start of interval if (count == 0) // Start of interval
WRITE(pwmPins[i], pwmValues[i] ? HIGH : LOW); digitalWrite(pwmState[i].pin, pwmState[i].value ? HIGH : LOW);
else if (pwmValues[i] == count) // End of duration else if (pwmState[i].value == count) // End of duration
WRITE(pwmPins[i], LOW); digitalWrite(pwmState[i].pin, LOW);
} }
// 128 for 7 Bit resolution // 128 for 7 Bit resolution

View File

@@ -32,7 +32,6 @@
#include "../shared/HAL_SPI.h" #include "../shared/HAL_SPI.h"
#include "fastio.h" #include "fastio.h"
#include "watchdog.h"
#include "i2s.h" #include "i2s.h"
#if ENABLED(WIFISUPPORT) #if ENABLED(WIFISUPPORT)
@@ -49,40 +48,43 @@
// Defines // Defines
// ------------------------ // ------------------------
extern portMUX_TYPE spinlock;
#define MYSERIAL1 flushableSerial #define MYSERIAL1 flushableSerial
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) #if ENABLED(ESP3D_WIFISUPPORT)
#if ENABLED(ESP3D_WIFISUPPORT) typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1;
typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1; extern DefaultSerial1 MSerial0;
extern DefaultSerial1 MSerial0; #define MYSERIAL2 MSerial0
#define MYSERIAL2 MSerial0 #elif ENABLED(WIFISUPPORT)
#else #define MYSERIAL2 webSocketSerial
#define MYSERIAL2 webSocketSerial
#endif
#endif #endif
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock) #define CRITICAL_SECTION_START() portENTER_CRITICAL(&hal.spinlock)
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&spinlock) #define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
#define ISRS_ENABLED() (spinlock.owner == portMUX_FREE_VAL)
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock) #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock) #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 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
#ifndef MAX_EXPANDER_BITS
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
#endif
// ------------------------ // ------------------------
// Types // Types
// ------------------------ // ------------------------
typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs.
typedef int16_t pin_t; typedef int16_t pin_t;
#define HAL_SERVO_LIB Servo typedef struct pwm_pin {
uint32_t pwm_cycle_ticks = 1000000UL / (PWM_FREQUENCY) / 4; // # ticks per pwm cycle
uint32_t pwm_tick_count = 0; // current tick count
uint32_t pwm_duty_ticks = 0; // # of ticks for current duty cycle
} pwm_pin_t;
// ------------------------ class Servo;
// Public Variables typedef Servo hal_servo_t;
// ------------------------
/** result of last ADC conversion */
extern uint16_t HAL_adc_result;
// ------------------------ // ------------------------
// Public functions // Public functions
@@ -91,59 +93,18 @@ extern uint16_t HAL_adc_result;
// //
// Tone // Tone
// //
void toneInit();
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
void noTone(const pin_t _pin); void noTone(const pin_t _pin);
int8_t get_pwm_channel(const pin_t pin, const uint32_t freq, const uint16_t res);
void analogWrite(const pin_t pin, const uint16_t value, const uint32_t freq=PWM_FREQUENCY, const uint16_t res=8);
// clear reset reason //
void HAL_clear_reset_source(); // Pin Mapping for M42, M43, M226
//
// reset reason
uint8_t HAL_get_reset_source();
void HAL_reboot();
void _delay_ms(int delay);
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
#pragma GCC diagnostic pop
void analogWrite(pin_t pin, int value);
// ADC
#define HAL_ANALOG_SELECT(pin)
void HAL_adc_init();
#define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION 10
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC() HAL_adc_result
#define HAL_ADC_READY() true
void HAL_adc_start_conversion(const uint8_t adc_pin);
// PWM
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); }
// Pin Map
#define GET_PIN_MAP_PIN(index) index #define GET_PIN_MAP_PIN(index) index
#define GET_PIN_MAP_INDEX(pin) pin #define GET_PIN_MAP_INDEX(pin) pin
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
// Enable hooks into idle and setup for HAL
#define HAL_IDLETASK 1
#define BOARD_INIT() HAL_init_board();
void HAL_idletask();
inline void HAL_init() {}
void HAL_init_board();
#if ENABLED(USE_ESP32_EXIO) #if ENABLED(USE_ESP32_EXIO)
void Write_EXIO(uint8_t IO, uint8_t v); void Write_EXIO(uint8_t IO, uint8_t v);
#endif #endif
@@ -188,3 +149,96 @@ FORCE_INLINE static void DELAY_CYCLES(uint32_t x) {
} }
} }
// ------------------------
// Class Utilities
// ------------------------
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
#pragma GCC diagnostic pop
void _delay_ms(const int ms);
// ------------------------
// MarlinHAL Class
// ------------------------
#define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION 10
class MarlinHAL {
public:
// Earliest possible init, before setup()
MarlinHAL() {}
// Watchdog
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
static void init() {} // Called early in setup()
static void init_board(); // Called less early in setup()
static void reboot(); // Restart the firmware
// Interrupts
static portMUX_TYPE spinlock;
static bool isr_state() { return spinlock.owner == portMUX_FREE_VAL; }
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
static void isr_off() { portENTER_CRITICAL(&spinlock); }
static void delay_ms(const int ms) { _delay_ms(ms); }
// Tasks, called from idle()
static void idletask();
// Reset
static uint8_t get_reset_source();
static void clear_reset_source() {}
// Free SRAM
static int freeMemory();
static pwm_pin_t pwm_pin_data[MAX_EXPANDER_BITS];
//
// ADC Methods
//
static uint16_t adc_result;
// Called by Temperature::init once at startup
static void adc_init();
// Called by Temperature::init for each sensor at startup
static void adc_enable(const pin_t pin) {}
// Begin ADC sampling on the given pin. Called from Temperature::isr!
static void adc_start(const pin_t pin);
// Is the ADC ready for reading?
static bool adc_ready() { return true; }
// The current value of the ADC register
static uint16_t adc_value() { return adc_result; }
/**
* If not already allocated, allocate a hardware PWM channel
* to the pin and set the duty cycle..
* Optionally invert the duty cycle [default = false]
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
*/
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
/**
* Allocate and set the frequency of a hardware PWM pin
* Returns -1 if no pin available.
*/
static int8_t set_pwm_frequency(const pin_t pin, const uint32_t f_desired);
};

View File

@@ -31,20 +31,18 @@
// so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.) // so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.)
int Servo::channel_next_free = 12; int Servo::channel_next_free = 12;
Servo::Servo() { Servo::Servo() {}
channel = channel_next_free++;
}
int8_t Servo::attach(const int inPin) { int8_t Servo::attach(const int inPin) {
if (channel >= CHANNEL_MAX_NUM) return -1;
if (inPin > 0) pin = inPin; if (inPin > 0) pin = inPin;
channel = get_pwm_channel(pin, 50u, 16u);
ledcSetup(channel, 50, 16); // channel X, 50 Hz, 16-bit depth return channel; // -1 if no PWM avail.
ledcAttachPin(pin, channel);
return true;
} }
void Servo::detach() { ledcDetachPin(pin); } // leave channel connected to servo - set duty to zero
void Servo::detach() {
if (channel >= 0) ledcWrite(channel, 0);
}
int Servo::read() { return degrees; } int Servo::read() { return degrees; }
@@ -52,7 +50,7 @@ void Servo::write(int inDegrees) {
degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE); degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE);
int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE); int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE);
ledcWrite(channel, duty); if (channel >= 0) ledcWrite(channel, duty); // don't save duty for servos!
} }
void Servo::move(const int value) { void Servo::move(const int value) {

View File

@@ -30,8 +30,7 @@ class Servo {
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
TAU_MSEC = 20, TAU_MSEC = 20,
TAU_USEC = (TAU_MSEC * 1000), TAU_USEC = (TAU_MSEC * 1000),
MAX_COMPARE = _BV(16) - 1, // 65535 MAX_COMPARE = _BV(16) - 1; // 65535
CHANNEL_MAX_NUM = 16;
public: public:
Servo(); Servo();

View File

@@ -35,7 +35,7 @@
static pin_t tone_pin; static pin_t tone_pin;
volatile static int32_t toggles; volatile static int32_t toggles;
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration/*=0*/) {
tone_pin = _pin; tone_pin = _pin;
toggles = 2 * frequency * duration / 1000; toggles = 2 * frequency * duration / 1000;
HAL_timer_start(MF_TIMER_TONE, 2 * frequency); HAL_timer_start(MF_TIMER_TONE, 2 * frequency);

View File

@@ -65,4 +65,10 @@ void setup_endstop_interrupts() {
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
} }

View File

@@ -139,22 +139,38 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) {
} }
void stepperTask(void *parameter) { void stepperTask(void *parameter) {
uint32_t remaining = 0; uint32_t nextMainISR = 0;
#if ENABLED(LIN_ADVANCE)
uint32_t nextAdvanceISR = Stepper::LA_ADV_NEVER;
#endif
while (1) { for (;;) {
xQueueReceive(dma.queue, &dma.current, portMAX_DELAY); xQueueReceive(dma.queue, &dma.current, portMAX_DELAY);
dma.rw_pos = 0; dma.rw_pos = 0;
while (dma.rw_pos < DMA_SAMPLE_COUNT) { while (dma.rw_pos < DMA_SAMPLE_COUNT) {
// Fill with the port data post pulse_phase until the next step if (!nextMainISR) {
if (remaining) {
i2s_push_sample();
remaining--;
}
else {
Stepper::pulse_phase_isr(); Stepper::pulse_phase_isr();
remaining = Stepper::block_phase_isr(); nextMainISR = Stepper::block_phase_isr();
} }
#if ENABLED(LIN_ADVANCE)
else if (!nextAdvanceISR) {
Stepper::advance_isr();
nextAdvanceISR = Stepper::la_interval;
}
#endif
else
i2s_push_sample();
nextMainISR--;
#if ENABLED(LIN_ADVANCE)
if (nextAdvanceISR == Stepper::LA_ADV_NEVER)
nextAdvanceISR = Stepper::la_interval;
if (nextAdvanceISR && nextAdvanceISR != Stepper::LA_ADV_NEVER)
nextAdvanceISR--;
#endif
} }
} }
} }
@@ -337,6 +353,26 @@ uint8_t i2s_state(uint8_t pin) {
} }
void i2s_push_sample() { void i2s_push_sample() {
// Every 4µs (when space in DMA buffer) toggle each expander PWM output using
// the current duty cycle/frequency so they sync with any steps (once
// through the DMA/FIFO buffers). PWM signal inversion handled by other functions
LOOP_L_N(p, MAX_EXPANDER_BITS) {
if (hal.pwm_pin_data[p].pwm_duty_ticks > 0) { // pin has active pwm?
if (hal.pwm_pin_data[p].pwm_tick_count == 0) {
if (TEST32(i2s_port_data, p)) { // hi->lo
CBI32(i2s_port_data, p);
hal.pwm_pin_data[p].pwm_tick_count = hal.pwm_pin_data[p].pwm_cycle_ticks - hal.pwm_pin_data[p].pwm_duty_ticks;
}
else { // lo->hi
SBI32(i2s_port_data, p);
hal.pwm_pin_data[p].pwm_tick_count = hal.pwm_pin_data[p].pwm_duty_ticks;
}
}
else
hal.pwm_pin_data[p].pwm_tick_count--;
}
}
dma.current[dma.rw_pos++] = i2s_port_data; dma.current[dma.rw_pos++] = i2s_port_data;
} }

View File

@@ -20,7 +20,3 @@
* *
*/ */
#pragma once #pragma once
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/ESP32."
#endif

View File

@@ -20,3 +20,10 @@
* *
*/ */
#pragma once #pragma once
//
// Board-specific options need to be defined before HAL.h
//
#if MB(MKS_TINYBEE)
#define MAX_EXPANDER_BITS 24 // TinyBee has 3 x HC595
#endif

View File

@@ -21,12 +21,19 @@
*/ */
#pragma once #pragma once
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/ESP32."
#endif
#if ENABLED(EMERGENCY_PARSER) #if ENABLED(EMERGENCY_PARSER)
#error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue." #error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue."
#endif #endif
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #if ENABLED(SPINDLE_LASER_USE_PWM) && SPINDLE_LASER_FREQUENCY > 78125
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on ESP32." #error "SPINDLE_LASER_FREQUENCY maximum value is 78125Hz for ESP32."
#endif
#if ENABLED(FAST_PWM_FAN) && FAST_PWM_FAN_FREQUENCY > 78125
#error "FAST_PWM_FREQUENCY maximum value is 78125Hz for ESP32."
#endif #endif
#if HAS_TMC_SW_SERIAL #if HAS_TMC_SW_SERIAL
@@ -40,3 +47,23 @@
#if ENABLED(POSTMORTEM_DEBUGGING) #if ENABLED(POSTMORTEM_DEBUGGING)
#error "POSTMORTEM_DEBUGGING is not yet supported on ESP32." #error "POSTMORTEM_DEBUGGING is not yet supported on ESP32."
#endif #endif
#if MB(MKS_TINYBEE) && ENABLED(FAST_PWM_FAN)
#error "FAST_PWM_FAN is not available on TinyBee."
#endif
#if BOTH(I2S_STEPPER_STREAM, BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING)
#error "BABYSTEPPING on I2S stream requires INTEGRATED_BABYSTEPPING."
#endif
#if USING_PULLDOWNS
#error "PULLDOWN pin mode is not available on ESP32 boards."
#endif
#if BOTH(I2S_STEPPER_STREAM, LIN_ADVANCE) && DISABLED(EXPERIMENTAL_I2S_LA)
#error "I2S stream is currently incompatible with LIN_ADVANCE."
#endif
#if BOTH(I2S_STEPPER_STREAM, PRINTCOUNTER) && PRINTCOUNTER_SAVE_INTERVAL > 0 && DISABLED(PRINTCOUNTER_SYNC)
#error "PRINTCOUNTER_SAVE_INTERVAL may cause issues on ESP32 with an I2S expander. Define PRINTCOUNTER_SYNC in Configuration.h for an imperfect solution."
#endif

View File

@@ -81,7 +81,7 @@ void IRAM_ATTR timer_isr(void *para) {
* @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, 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];
timer_config_t config; timer_config_t config;
@@ -111,12 +111,12 @@ void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) {
/** /**
* Set the upper value of the timer, when the timer reaches this upper value the * Set the upper value of the timer, when the timer reaches this upper value the
* interrupt should be triggered and the counter reset * interrupt should be triggered and the counter reset
* @param timer_num timer number to set the count to * @param timer_num timer number to set the compare value to
* @param count threshold at which the interrupt is triggered * @param compare threshold at which the interrupt is triggered
*/ */
void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) { void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
const tTimerConfig timer = timer_config[timer_num]; const tTimerConfig timer = timer_config[timer_num];
timer_set_alarm_value(timer.group, timer.idx, count); timer_set_alarm_value(timer.group, timer.idx, compare);
} }
/** /**

View File

@@ -127,7 +127,7 @@ extern const tTimerConfig timer_config[];
// Public functions // Public functions
// ------------------------ // ------------------------
void HAL_timer_start (const uint8_t timer_num, uint32_t frequency); void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t count); void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t count);
hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); hal_timer_t HAL_timer_get_compare(const uint8_t timer_num);
hal_timer_t HAL_timer_get_count(const uint8_t timer_num); hal_timer_t HAL_timer_get_count(const uint8_t timer_num);
@@ -136,5 +136,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
void HAL_timer_disable_interrupt(const uint8_t timer_num); void HAL_timer_disable_interrupt(const uint8_t timer_num);
bool HAL_timer_interrupt_enabled(const uint8_t timer_num); bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(T) NOOP
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(T) NOOP

View File

@@ -0,0 +1,106 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2022 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* Copypaste of SAMD51 HAL developed by Giuliano Zaro (AKA GMagician)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#ifdef ARDUINO_ARCH_ESP32
#include "../../inc/MarlinConfig.h"
#if EITHER(MKS_MINI_12864, FYSETC_MINI_12864_2_1)
#include <U8glib-HAL.h>
#include "../shared/HAL_SPI.h"
#include "HAL.h"
#include "SPI.h"
#if ENABLED(SDSUPPORT)
#include "../../sd/cardreader.h"
#if ENABLED(ESP3D_WIFISUPPORT)
#include "sd_ESP32.h"
#endif
#endif
static SPISettings spiConfig;
#ifndef LCD_SPI_SPEED
#ifdef SD_SPI_SPEED
#define LCD_SPI_SPEED SD_SPI_SPEED // Assume SPI speed shared with SD
#else
#define LCD_SPI_SPEED SPI_FULL_SPEED // Use full speed if SD speed is not supplied
#endif
#endif
uint8_t u8g_eps_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
#if ENABLED(PAUSE_LCD_FOR_BUSY_SD)
if (card.flag.saving || card.flag.logging || TERN0(ESP3D_WIFISUPPORT, sd_busy_lock == true)) return 0;
#endif
if (msgInitCount) {
if (msg == U8G_COM_MSG_INIT) msgInitCount--;
if (msgInitCount) return -1;
}
switch (msg) {
case U8G_COM_MSG_STOP: break;
case U8G_COM_MSG_INIT:
OUT_WRITE(DOGLCD_CS, HIGH);
OUT_WRITE(DOGLCD_A0, HIGH);
OUT_WRITE(LCD_RESET_PIN, HIGH);
u8g_Delay(5);
spiBegin();
spiInit(LCD_SPI_SPEED);
break;
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
WRITE(DOGLCD_A0, arg_val ? HIGH : LOW);
break;
case U8G_COM_MSG_CHIP_SELECT: /* arg_val == 0 means HIGH level of U8G_PI_CS */
WRITE(DOGLCD_CS, arg_val ? LOW : HIGH);
break;
case U8G_COM_MSG_RESET:
WRITE(LCD_RESET_PIN, arg_val);
break;
case U8G_COM_MSG_WRITE_BYTE:
spiSend((uint8_t)arg_val);
break;
case U8G_COM_MSG_WRITE_SEQ:
uint8_t *ptr = (uint8_t*) arg_ptr;
while (arg_val > 0) {
spiSend(*ptr++);
arg_val--;
}
break;
}
return 1;
}
#endif // EITHER(MKS_MINI_12864, FYSETC_MINI_12864_2_1)
#endif // ARDUINO_ARCH_ESP32

View File

@@ -27,7 +27,8 @@
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#endif #endif
#include HAL_PATH(.,HAL.h) #include HAL_PATH(..,HAL.h)
extern MarlinHAL hal;
#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION)
@@ -44,7 +45,3 @@
#ifndef PGMSTR #ifndef PGMSTR
#define PGMSTR(NAM,STR) const char NAM[] = STR #define PGMSTR(NAM,STR) const char NAM[] = STR
#endif #endif
inline void watchdog_refresh() {
TERN_(USE_WATCHDOG, HAL_watchdog_refresh());
}

View File

@@ -24,6 +24,10 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#include "../shared/Delay.h" #include "../shared/Delay.h"
// ------------------------
// Serial ports
// ------------------------
MSerialT usb_serial(TERN0(EMERGENCY_PARSER, true)); MSerialT usb_serial(TERN0(EMERGENCY_PARSER, true));
// U8glib required functions // U8glib required functions
@@ -37,42 +41,21 @@ extern "C" {
//************************// //************************//
// return free heap space // return free heap space
int freeMemory() { int freeMemory() { return 0; }
return 0;
}
// ------------------------ // ------------------------
// ADC // ADC
// ------------------------ // ------------------------
void HAL_adc_init() { uint8_t MarlinHAL::active_ch = 0;
} uint16_t MarlinHAL::adc_value() {
const pin_t pin = analogInputToDigitalPin(active_ch);
void HAL_adc_enable_channel(const uint8_t ch) {
}
uint8_t active_ch = 0;
void HAL_adc_start_conversion(const uint8_t ch) {
active_ch = ch;
}
bool HAL_adc_finished() {
return true;
}
uint16_t HAL_adc_get_result() {
pin_t pin = analogInputToDigitalPin(active_ch);
if (!VALID_PIN(pin)) return 0; if (!VALID_PIN(pin)) return 0;
uint16_t data = ((Gpio::get(pin) >> 2) & 0x3FF); const uint16_t data = ((Gpio::get(pin) >> 2) & 0x3FF);
return data; // return 10bit value as Marlin expects return data; // return 10bit value as Marlin expects
} }
void HAL_pwm_init() { void MarlinHAL::reboot() { /* Reset the application state and GPIO */ }
}
void HAL_reboot() { /* Reset the application state and GPIO */ }
#endif // __PLAT_LINUX__ #endif // __PLAT_LINUX__

View File

@@ -21,25 +21,42 @@
*/ */
#pragma once #pragma once
#define CPU_32_BIT #include "../../inc/MarlinConfigPre.h"
#define F_CPU 100000000UL
#define SystemCoreClock F_CPU
#include <iostream> #include <iostream>
#include <stdint.h> #include <stdint.h>
#include <stdarg.h> #include <stdarg.h>
#undef min #undef min
#undef max #undef max
#include <algorithm> #include <algorithm>
void _printf (const char *format, ...); #include "hardware/Clock.h"
#include "../shared/Marduino.h"
#include "../shared/math_32bit.h"
#include "../shared/HAL_SPI.h"
#include "fastio.h"
#include "serial.h"
// ------------------------
// Defines
// ------------------------
#define CPU_32_BIT
#define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
#define F_CPU 100000000UL
#define SystemCoreClock F_CPU
#define DELAY_CYCLES(x) Clock::delayCycles(x)
#define CPU_ST7920_DELAY_1 600
#define CPU_ST7920_DELAY_2 750
#define CPU_ST7920_DELAY_3 750
void _printf(const char *format, ...);
void _putc(uint8_t c); void _putc(uint8_t c);
uint8_t _getc(); uint8_t _getc();
//extern "C" volatile uint32_t _millis;
//arduino: Print.h //arduino: Print.h
#define DEC 10 #define DEC 10
#define HEX 16 #define HEX 16
@@ -49,36 +66,27 @@ uint8_t _getc();
#define B01 1 #define B01 1
#define B10 2 #define B10 2
#include "hardware/Clock.h" // ------------------------
// Serial ports
#include "../shared/Marduino.h" // ------------------------
#include "../shared/math_32bit.h"
#include "../shared/HAL_SPI.h"
#include "fastio.h"
#include "watchdog.h"
#include "serial.h"
#define SHARED_SERVOS HAS_SERVOS
extern MSerialT usb_serial; extern MSerialT usb_serial;
#define MYSERIAL1 usb_serial #define MYSERIAL1 usb_serial
#define CPU_ST7920_DELAY_1 600
#define CPU_ST7920_DELAY_2 750
#define CPU_ST7920_DELAY_3 750
// //
// Interrupts // Interrupts
// //
#define CRITICAL_SECTION_START() #define CRITICAL_SECTION_START()
#define CRITICAL_SECTION_END() #define CRITICAL_SECTION_END()
#define ISRS_ENABLED()
#define ENABLE_ISRS()
#define DISABLE_ISRS()
inline void HAL_init() {} // ADC
#define HAL_ADC_VREF 5.0
#define HAL_ADC_RESOLUTION 10
// ------------------------
// Class Utilities
// ------------------------
// Utility functions
#pragma GCC diagnostic push #pragma GCC diagnostic push
#if GCC_VERSION <= 50000 #if GCC_VERSION <= 50000
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
@@ -88,29 +96,70 @@ int freeMemory();
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
// ADC // ------------------------
#define HAL_ADC_VREF 5.0 // MarlinHAL Class
#define HAL_ADC_RESOLUTION 10 // ------------------------
#define HAL_ANALOG_SELECT(ch) HAL_adc_enable_channel(ch)
#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch)
#define HAL_READ_ADC() HAL_adc_get_result()
#define HAL_ADC_READY() true
void HAL_adc_init(); class MarlinHAL {
void HAL_adc_enable_channel(const uint8_t ch); public:
void HAL_adc_start_conversion(const uint8_t ch);
uint16_t HAL_adc_get_result();
// PWM // Earliest possible init, before setup()
inline void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) { analogWrite(pin, v); } MarlinHAL() {}
// Reset source // Watchdog
inline void HAL_clear_reset_source(void) {} static void watchdog_init() {}
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } static void watchdog_refresh() {}
void HAL_reboot(); // Reset the application state and GPIO static void init() {} // Called early in setup()
static void init_board() {} // Called less early in setup()
static void reboot(); // Reset the application state and GPIO
/* ---------------- Delay in cycles */ // Interrupts
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { static bool isr_state() { return true; }
Clock::delayCycles(x); static void isr_on() {}
} static void isr_off() {}
static void delay_ms(const int ms) { _delay_ms(ms); }
// Tasks, called from idle()
static void idletask() {}
// Reset
static constexpr uint8_t reset_reason = RST_POWER_ON;
static uint8_t get_reset_source() { return reset_reason; }
static void clear_reset_source() {}
// Free SRAM
static int freeMemory() { return ::freeMemory(); }
//
// ADC Methods
//
static uint8_t active_ch;
// Called by Temperature::init once at startup
static void adc_init() {}
// Called by Temperature::init for each sensor at startup
static void adc_enable(const uint8_t) {}
// Begin ADC sampling on the given channel
static void adc_start(const uint8_t ch) { active_ch = ch; }
// Is the ADC ready for reading?
static bool adc_ready() { return true; }
// The current value of the ADC register
static uint16_t adc_value();
/**
* Set the PWM duty cycle for the pin to the given value.
* No option to change the resolution or invert the duty cycle.
*/
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) {
analogWrite(pin, v);
}
static void set_pwm_frequency(const pin_t, int) {}
};

View File

@@ -31,9 +31,7 @@ void cli() { } // Disable
void sei() { } // Enable void sei() { } // Enable
// Time functions // Time functions
void _delay_ms(const int delay_ms) { void _delay_ms(const int ms) { delay(ms); }
delay(delay_ms);
}
uint32_t millis() { uint32_t millis() {
return (uint32_t)Clock::millis(); return (uint32_t)Clock::millis();

View File

@@ -69,12 +69,12 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
std::size_t bytes_written = 0; std::size_t bytes_written = 0;
for (std::size_t i = 0; i < size; i++) { for (std::size_t i = 0; i < size; i++) {
buffer[pos+i] = value[i]; buffer[pos + i] = value[i];
bytes_written ++; bytes_written++;
} }
crc16(crc, value, size); crc16(crc, value, size);
pos = pos + size; pos += size;
return (bytes_written != size); // return true for any error return (bytes_written != size); // return true for any error
} }
@@ -82,21 +82,21 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uin
std::size_t bytes_read = 0; std::size_t bytes_read = 0;
if (writing) { if (writing) {
for (std::size_t i = 0; i < size; i++) { for (std::size_t i = 0; i < size; i++) {
value[i] = buffer[pos+i]; value[i] = buffer[pos + i];
bytes_read ++; bytes_read++;
} }
crc16(crc, value, size); crc16(crc, value, size);
} }
else { else {
uint8_t temp[size]; uint8_t temp[size];
for (std::size_t i = 0; i < size; i++) { for (std::size_t i = 0; i < size; i++) {
temp[i] = buffer[pos+i]; temp[i] = buffer[pos + i];
bytes_read ++; bytes_read++;
} }
crc16(crc, temp, size); crc16(crc, temp, size);
} }
pos = pos + size; pos += size;
return bytes_read != size; // return true for any error return bytes_read != size; // return true for any error
} }

View File

@@ -26,8 +26,8 @@
struct LowpassFilter { struct LowpassFilter {
uint64_t data_delay = 0; uint64_t data_delay = 0;
uint16_t update(uint16_t value) { uint16_t update(uint16_t value) {
data_delay = data_delay - (data_delay >> 6) + value; data_delay += value - (data_delay >> 6);
return (uint16_t)(data_delay >> 6); return uint16_t(data_delay >> 6);
} }
}; };

View File

@@ -20,7 +20,3 @@
* *
*/ */
#pragma once #pragma once
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/LINUX."
#endif

View File

@@ -31,13 +31,17 @@
#endif #endif
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on LINUX." #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported for HAL/LINUX."
#endif
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/LINUX."
#endif #endif
#if HAS_TMC_SW_SERIAL #if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on LINUX." #error "TMC220x Software Serial is not supported for HAL/LINUX."
#endif #endif
#if ENABLED(POSTMORTEM_DEBUGGING) #if ENABLED(POSTMORTEM_DEBUGGING)
#error "POSTMORTEM_DEBUGGING is not yet supported on LINUX." #error "POSTMORTEM_DEBUGGING is not yet supported for HAL/LINUX."
#endif #endif

View File

@@ -59,10 +59,9 @@ typedef uint8_t byte;
#endif #endif
#define sq(v) ((v) * (v)) #define sq(v) ((v) * (v))
#define square(v) sq(v)
#define constrain(value, arg_min, arg_max) ((value) < (arg_min) ? (arg_min) :((value) > (arg_max) ? (arg_max) : (value))) #define constrain(value, arg_min, arg_max) ((value) < (arg_min) ? (arg_min) :((value) > (arg_max) ? (arg_max) : (value)))
//Interrupts // Interrupts
void cli(); // Disable void cli(); // Disable
void sei(); // Enable void sei(); // Enable
void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode); void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode);
@@ -74,8 +73,8 @@ extern "C" {
} }
// Time functions // Time functions
extern "C" void delay(const int milis); extern "C" void delay(const int ms);
void _delay_ms(const int delay); void _delay_ms(const int ms);
void delayMicroseconds(unsigned long); void delayMicroseconds(unsigned long);
uint32_t millis(); uint32_t millis();

View File

@@ -25,10 +25,10 @@
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) #if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently #define SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
// needed due to the speed and mode required for communicating with each device being different. // needed due to the speed and mode required for communicating with each device being different.
// This requirement can be removed if the SPI access to these devices is updated to use // This requirement can be removed if the SPI access to these devices is updated to use
// spiBeginTransaction. // spiBeginTransaction.
#endif #endif
// Onboard SD // Onboard SD

View File

@@ -92,5 +92,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
void HAL_timer_disable_interrupt(const uint8_t timer_num); void HAL_timer_disable_interrupt(const uint8_t timer_num);
bool HAL_timer_interrupt_enabled(const uint8_t timer_num); bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
#define HAL_timer_isr_prologue(T) #define HAL_timer_isr_prologue(T) NOOP
#define HAL_timer_isr_epilogue(T) #define HAL_timer_isr_epilogue(T) NOOP

View File

@@ -25,13 +25,9 @@
#include "../shared/Delay.h" #include "../shared/Delay.h"
#include "../../../gcode/parser.h" #include "../../../gcode/parser.h"
#if ENABLED(USE_WATCHDOG)
#include "watchdog.h"
#endif
DefaultSerial1 USBSerial(false, UsbSerial); DefaultSerial1 USBSerial(false, UsbSerial);
uint32_t HAL_adc_reading = 0; uint32_t MarlinHAL::adc_result = 0;
// U8glib required functions // U8glib required functions
extern "C" { extern "C" {
@@ -41,8 +37,6 @@ extern "C" {
void u8g_Delay(uint16_t val) { delay(val); } void u8g_Delay(uint16_t val) { delay(val); }
} }
//************************//
// return free heap space // return free heap space
int freeMemory() { int freeMemory() {
char stack_end; char stack_end;
@@ -54,7 +48,71 @@ int freeMemory() {
return result; return result;
} }
// scan command line for code void MarlinHAL::reboot() { NVIC_SystemReset(); }
uint8_t MarlinHAL::get_reset_source() {
#if ENABLED(USE_WATCHDOG)
if (watchdog_timed_out()) return RST_WATCHDOG;
#endif
return RST_POWER_ON;
}
void MarlinHAL::clear_reset_source() { watchdog_clear_timeout_flag(); }
void flashFirmware(const int16_t) {
delay(500); // Give OS time to disconnect
USB_Connect(false); // USB clear connection
delay(1000); // Give OS time to notice
hal.reboot();
}
#if ENABLED(USE_WATCHDOG)
#include <lpc17xx_wdt.h>
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
void MarlinHAL::watchdog_init() {
#if ENABLED(WATCHDOG_RESET_MANUAL)
// We enable the watchdog timer, but only for the interrupt.
// Configure WDT to only trigger an interrupt
// Disable WDT interrupt (just in case, to avoid triggering it!)
NVIC_DisableIRQ(WDT_IRQn);
// We NEED memory barriers to ensure Interrupts are actually disabled!
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
__DSB();
__ISB();
// Configure WDT to only trigger an interrupt
// Initialize WDT with the given parameters
WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_INT_ONLY);
// Configure and enable WDT interrupt.
NVIC_ClearPendingIRQ(WDT_IRQn);
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
NVIC_EnableIRQ(WDT_IRQn);
#else
WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET);
#endif
WDT_Start(WDT_TIMEOUT_US);
}
void MarlinHAL::watchdog_refresh() {
WDT_Feed();
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator
#endif
}
// Timeout state
bool MarlinHAL::watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); }
void MarlinHAL::watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); }
#endif // USE_WATCHDOG
// For M42/M43, scan command line for pin code
// return index into pin map array if found and the pin is valid. // return index into pin map array if found and the pin is valid.
// return dval if not found or not a valid pin. // return dval if not found or not a valid pin.
int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) {
@@ -63,24 +121,4 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) {
return ind > -1 ? ind : dval; return ind > -1 ? ind : dval;
} }
void flashFirmware(const int16_t) {
delay(500); // Give OS time to disconnect
USB_Connect(false); // USB clear connection
delay(1000); // Give OS time to notice
HAL_reboot();
}
void HAL_clear_reset_source(void) {
TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag());
}
uint8_t HAL_get_reset_source(void) {
#if ENABLED(USE_WATCHDOG)
if (watchdog_timed_out()) return RST_WATCHDOG;
#endif
return RST_POWER_ON;
}
void HAL_reboot() { NVIC_SystemReset(); }
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View File

@@ -28,8 +28,6 @@
#define CPU_32_BIT #define CPU_32_BIT
void HAL_init();
#include <stdint.h> #include <stdint.h>
#include <stdarg.h> #include <stdarg.h>
#include <algorithm> #include <algorithm>
@@ -40,19 +38,15 @@ extern "C" volatile uint32_t _millis;
#include "../shared/math_32bit.h" #include "../shared/math_32bit.h"
#include "../shared/HAL_SPI.h" #include "../shared/HAL_SPI.h"
#include "fastio.h" #include "fastio.h"
#include "watchdog.h"
#include "MarlinSerial.h" #include "MarlinSerial.h"
#include <adc.h> #include <adc.h>
#include <pinmapping.h> #include <pinmapping.h>
#include <CDCSerial.h> #include <CDCSerial.h>
// // ------------------------
// Default graphical display delays // Serial ports
// // ------------------------
#define CPU_ST7920_DELAY_1 600
#define CPU_ST7920_DELAY_2 750
#define CPU_ST7920_DELAY_3 750
typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1; typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1;
extern DefaultSerial1 USBSerial; extern DefaultSerial1 USBSerial;
@@ -114,26 +108,12 @@ extern DefaultSerial1 USBSerial;
// //
// Interrupts // Interrupts
// //
#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq()
#define CRITICAL_SECTION_END() if (!primask) __enable_irq() #define CRITICAL_SECTION_START() const bool irqon = !__get_PRIMASK(); __disable_irq()
#define ISRS_ENABLED() (!__get_PRIMASK()) #define CRITICAL_SECTION_END() if (irqon) __enable_irq()
#define ENABLE_ISRS() __enable_irq()
#define DISABLE_ISRS() __disable_irq()
// //
// Utility functions // ADC
//
#pragma GCC diagnostic push
#if GCC_VERSION <= 50000
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
int freeMemory();
#pragma GCC diagnostic pop
//
// ADC API
// //
#define ADC_MEDIAN_FILTER_SIZE (23) // Higher values increase step delay (phase shift), #define ADC_MEDIAN_FILTER_SIZE (23) // Higher values increase step delay (phase shift),
@@ -152,20 +132,9 @@ int freeMemory();
#define HAL_ADC_RESOLUTION 12 // 15 bit maximum, raw temperature is stored as int16_t #define HAL_ADC_RESOLUTION 12 // 15 bit maximum, raw temperature is stored as int16_t
#define HAL_ADC_FILTERED // Disable oversampling done in Marlin as ADC values already filtered in HAL #define HAL_ADC_FILTERED // Disable oversampling done in Marlin as ADC values already filtered in HAL
using FilteredADC = LPC176x::ADC<ADC_LOWPASS_K_VALUE, ADC_MEDIAN_FILTER_SIZE>; //
extern uint32_t HAL_adc_reading; // Pin Mapping for M42, M43, M226
[[gnu::always_inline]] inline void HAL_adc_start_conversion(const pin_t pin) { //
HAL_adc_reading = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits
}
[[gnu::always_inline]] inline uint16_t HAL_adc_get_result() {
return HAL_adc_reading;
}
#define HAL_adc_init()
#define HAL_ANALOG_SELECT(pin) FilteredADC::enable_channel(pin)
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
#define HAL_READ_ADC() HAL_adc_get_result()
#define HAL_ADC_READY() (true)
// Test whether the pin is valid // Test whether the pin is valid
constexpr bool VALID_PIN(const pin_t pin) { constexpr bool VALID_PIN(const pin_t pin) {
@@ -192,32 +161,107 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval);
// P0.6 thru P0.9 are for the onboard SD card // P0.6 thru P0.9 are for the onboard SD card
#define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09, #define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09,
#define HAL_IDLETASK 1 // ------------------------
void HAL_idletask(); // Defines
// ------------------------
#define PLATFORM_M997_SUPPORT #define PLATFORM_M997_SUPPORT
void flashFirmware(const int16_t); void flashFirmware(const int16_t);
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
/** // Default graphical display delays
* set_pwm_frequency #define CPU_ST7920_DELAY_1 600
* Set the frequency of the timer corresponding to the provided pin #define CPU_ST7920_DELAY_2 750
* All Hardware PWM pins run at the same frequency and all #define CPU_ST7920_DELAY_3 750
* Software PWM pins run at the same frequency
*/
void set_pwm_frequency(const pin_t pin, int f_desired);
/** // ------------------------
* set_pwm_duty // Free Memory Accessor
* Set the PWM duty cycle of the provided pin to the provided value // ------------------------
* Optionally allows inverting the duty cycle [default = false]
* Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255]
*/
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
// Reset source #pragma GCC diagnostic push
void HAL_clear_reset_source(void); #if GCC_VERSION <= 50000
uint8_t HAL_get_reset_source(void); #pragma GCC diagnostic ignored "-Wunused-function"
#endif
void HAL_reboot(); int freeMemory();
#pragma GCC diagnostic pop
// ------------------------
// MarlinHAL Class
// ------------------------
class MarlinHAL {
public:
// Earliest possible init, before setup()
MarlinHAL() {}
static void init(); // Called early in setup()
static void init_board() {} // Called less early in setup()
static void reboot(); // Restart the firmware from 0x0
// Interrupts
static bool isr_state() { return !__get_PRIMASK(); }
static void isr_on() { __enable_irq(); }
static void isr_off() { __disable_irq(); }
static void delay_ms(const int ms) { _delay_ms(ms); }
// Watchdog
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
static bool watchdog_timed_out() IF_DISABLED(USE_WATCHDOG, { return false; });
static void watchdog_clear_timeout_flag() IF_DISABLED(USE_WATCHDOG, {});
// Tasks, called from idle()
static void idletask();
// Reset
static uint8_t get_reset_source();
static void clear_reset_source();
// Free SRAM
static int freeMemory() { return ::freeMemory(); }
//
// ADC Methods
//
using FilteredADC = LPC176x::ADC<ADC_LOWPASS_K_VALUE, ADC_MEDIAN_FILTER_SIZE>;
// Called by Temperature::init once at startup
static void adc_init() {}
// Called by Temperature::init for each sensor at startup
static void adc_enable(const pin_t pin) {
FilteredADC::enable_channel(pin);
}
// Begin ADC sampling on the given pin. Called from Temperature::isr!
static uint32_t adc_result;
static void adc_start(const pin_t pin) {
adc_result = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits
}
// Is the ADC ready for reading?
static bool adc_ready() { return true; }
// The current value of the ADC register
static uint16_t adc_value() { return uint16_t(adc_result); }
/**
* Set the PWM duty cycle for the pin to the given value.
* Optionally invert the duty cycle [default = false]
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
*/
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
/**
* Set the frequency of the timer corresponding to the provided pin
* All Hardware PWM pins will run at the same frequency and
* All Software PWM pins will run at the same frequency
*/
static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
};

View File

@@ -60,7 +60,7 @@
// ------------------------ // ------------------------
// Public functions // Public functions
// ------------------------ // ------------------------
#if ENABLED(LPC_SOFTWARE_SPI) #if ENABLED(SOFTWARE_SPI)
// Software SPI // Software SPI
@@ -161,7 +161,7 @@
// TODO: Implement this method // TODO: Implement this method
} }
#endif // LPC_SOFTWARE_SPI #endif // SOFTWARE_SPI
/** /**
* @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset.
@@ -318,8 +318,16 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) {
// Enable DMA // Enable DMA
GPDMA_ChannelCmd(0, ENABLE); GPDMA_ChannelCmd(0, ENABLE);
/*
* Observed behaviour on normal data transfer completion (SKR 1.3 board / LPC1768 MCU)
* GPDMA_STAT_INTTC flag is SET
* GPDMA_STAT_INTERR flag is NOT SET
* GPDMA_STAT_RAWINTTC flag is NOT SET
* GPDMA_STAT_RAWINTERR flag is SET
*/
// Wait for data transfer // Wait for data transfer
while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { } while (!GPDMA_IntGetStatus(GPDMA_STAT_INTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_INTERR, 0)) {}
// Clear err and int // Clear err and int
GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0);
@@ -333,6 +341,43 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) {
SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE); SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE);
} }
void SPIClass::dmaSendAsync(void *buf, uint16_t length, bool minc) {
//TODO: LPC dma can only write 0xFFF bytes at once.
GPDMA_Channel_CFG_Type GPDMACfg;
/* Configure GPDMA channel 0 -------------------------------------------------------------*/
/* DMA Channel 0 */
GPDMACfg.ChannelNum = 0;
// Source memory
GPDMACfg.SrcMemAddr = (uint32_t)buf;
// Destination memory - Not used
GPDMACfg.DstMemAddr = 0;
// Transfer size
GPDMACfg.TransferSize = length;
// Transfer width
GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE;
// Transfer type
GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P;
// Source connection - unused
GPDMACfg.SrcConn = 0;
// Destination connection
GPDMACfg.DstConn = (_currentSetting->spi_d == LPC_SSP0) ? GPDMA_CONN_SSP0_Tx : GPDMA_CONN_SSP1_Tx;
GPDMACfg.DMALLI = 0;
// Enable dma on SPI
SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE);
// Only increase memory if minc is true
GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0);
// Setup channel with given parameter
GPDMA_Setup(&GPDMACfg);
// Enable DMA
GPDMA_ChannelCmd(0, ENABLE);
}
uint16_t SPIClass::read() { uint16_t SPIClass::read() {
return SSP_ReceiveData(_currentSetting->spi_d); return SSP_ReceiveData(_currentSetting->spi_d);
} }

View File

@@ -26,7 +26,7 @@
#if ENABLED(POSTMORTEM_DEBUGGING) #if ENABLED(POSTMORTEM_DEBUGGING)
#include "../shared/HAL_MinSerial.h" #include "../shared/MinSerial.h"
#include <debug_frmwrk.h> #include <debug_frmwrk.h>
static void TX(char c) { _DBC(c); } static void TX(char c) { _DBC(c); }

View File

@@ -65,4 +65,5 @@ class libServo: public Servo {
} }
}; };
#define HAL_SERVO_LIB libServo class libServo;
typedef libServo hal_servo_t;

View File

@@ -34,7 +34,7 @@
#include "../shared/eeprom_api.h" #include "../shared/eeprom_api.h"
#ifndef MARLIN_EEPROM_SIZE #ifndef MARLIN_EEPROM_SIZE
#define MARLIN_EEPROM_SIZE 0x8000 // 32KB #define MARLIN_EEPROM_SIZE 0x8000 // 32K
#endif #endif
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }

View File

@@ -155,4 +155,37 @@ void setup_endstop_interrupts() {
#endif #endif
_ATTACH(K_MIN_PIN); _ATTACH(K_MIN_PIN);
#endif #endif
#if HAS_U_MAX
#if !LPC1768_PIN_INTERRUPT_M(U_MAX_PIN)
#error "U_MAX_PIN is not INTERRUPT-capable."
#endif
_ATTACH(U_MAX_PIN);
#elif HAS_U_MIN
#if !LPC1768_PIN_INTERRUPT_M(U_MIN_PIN)
#error "U_MIN_PIN is not INTERRUPT-capable."
#endif
_ATTACH(U_MIN_PIN);
#endif
#if HAS_V_MAX
#if !LPC1768_PIN_INTERRUPT_M(V_MAX_PIN)
#error "V_MAX_PIN is not INTERRUPT-capable."
#endif
_ATTACH(V_MAX_PIN);
#elif HAS_V_MIN
#if !LPC1768_PIN_INTERRUPT_M(V_MIN_PIN)
#error "V_MIN_PIN is not INTERRUPT-capable."
#endif
_ATTACH(V_MIN_PIN);
#endif
#if HAS_W_MAX
#if !LPC1768_PIN_INTERRUPT_M(W_MAX_PIN)
#error "W_MAX_PIN is not INTERRUPT-capable."
#endif
_ATTACH(W_MAX_PIN);
#elif HAS_W_MIN
#if !LPC1768_PIN_INTERRUPT_M(W_MIN_PIN)
#error "W_MIN_PIN is not INTERRUPT-capable."
#endif
_ATTACH(W_MIN_PIN);
#endif
} }

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