Compare commits

..

291 commits

Author SHA1 Message Date
thinkyhead
ba2939b1dc Fix bilinear_line_to_destination definition
See #19431
2020-10-30 00:24:29 -05:00
Jason Smith
ee7476a0bf
Update "Bug Report" template (#19906) 2020-10-27 17:48:06 -05:00
Scott Lahteine
88a2ac92d5 Marlin 2.0.7.2 2020-10-21 18:16:38 -05:00
Jason Smith
3ccb3801f2 Fix SAMD Serial name macro (#19765) 2020-10-21 18:16:38 -05:00
Serhiy-K
cc7fbabc96 Fix HAL/STM32 FastIO for analog pins (#19735) 2020-10-21 18:16:38 -05:00
Scott Lahteine
28a9708ddb Don't define IS_ULTIPANEL empty 2020-10-21 18:16:00 -05:00
Jason Smith
d896dedf9b Add NUCLEO-F767ZI dev board (#19373)
Co-authored-by: Lorenzo Delana <lorenzo.delana@gmail.com>
2020-10-16 16:42:39 -05:00
Keith Bennett
00709017e2 If needed, home before G34 (#19713) 2020-10-16 16:42:39 -05:00
Victor Oliveira
b7d9b05952 TFT followup fixes (#19710) 2020-10-16 16:42:37 -05:00
Victor Oliveira
f7f1224941 Watchdog Refresh for LVGL Asset Load (#19724) 2020-10-16 16:42:15 -05:00
Jason Smith
fd8d83b7c8 Fix mega2560ext environment (#19730) 2020-10-16 16:42:15 -05:00
thinkyhead
52fc0b896d [cron] Bump distribution date (2020-10-15) 2020-10-16 16:42:15 -05:00
thinkyhead
ba045d6852 [cron] Bump distribution date (2020-10-14) 2020-10-16 16:42:15 -05:00
Jason Smith
54bdcb4691 Fix SET_SOFT_ENDSTOP_LOOSE w/out soft endstops (#19734) 2020-10-16 16:42:15 -05:00
Scott Lahteine
2a2666326b Simple bool in soft_endstops_t 2020-10-16 16:42:15 -05:00
thinkyhead
3bba5d55bf [cron] Bump distribution date (2020-10-13) 2020-10-16 16:42:15 -05:00
thinkyhead
5d07d83e78 [cron] Bump distribution date (2020-10-12) 2020-10-16 16:40:25 -05:00
Jason Smith
37f97bc013 Fix various errors, warnings in example config builds (#19686)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:40:14 -05:00
thinkyhead
6d31bbe2bf [cron] Bump distribution date (2020-10-11) 2020-10-16 16:39:55 -05:00
Victor Oliveira
e2e1776a14 Restore correct STM32 port-bits code (#19678) 2020-10-16 16:39:55 -05:00
Serhiy-K
bd196e7efc Fixes for TFTGLCD Panel, FastIO (#19614) 2020-10-16 16:39:55 -05:00
Earle F. Philhower, III
dffe7b9072 Add loose soft endstop state, apply to UBL fine-tune (#19681)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Jason Smith
2b326ebc84 Add D100 Watchdog Test (#19697) 2020-10-16 16:39:55 -05:00
Jason Smith
f4ff6a673f Allow MAX31865 resistance values configuration (#19695) 2020-10-16 16:39:55 -05:00
qwewer0
cc915a25ed Add REPORT_TRAMMING_MM option (#19682)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Jason Smith
600870f22b Fix motion compile w/out probe-oriented settings (#19684) 2020-10-16 16:39:55 -05:00
Jason Smith
04882e2f34 Fix I2C_ADDRESS sign warning (#19685) 2020-10-16 16:39:55 -05:00
Jason Smith
c6cf3da276 Fix various errors, warnings in example config builds (#19686)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Jason Smith
8a5c3782b8 Fix at90usb1286 build (#19687)
* Skip check for USBCON during dependency detection
* Ignore incompatible Teensy_ADC library, which requires Teensy >= 3
* Add IS_AT90USB

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Scott Lahteine
beb17d8855 Digipots refactor / cleanup (#19690) 2020-10-16 16:39:55 -05:00
Scott Lahteine
4ee717f7c4 Save PLR on resume from pause (#19676)
Co-Authored-By: shahab <32130261+SHBnik@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Victor Oliveira
e680196c59 Restore correct STM32 port-bits code (#19678) 2020-10-16 16:39:55 -05:00
Serhiy-K
ce92abfe47 Fixes for TFTGLCD Panel, FastIO (#19614) 2020-10-16 16:39:55 -05:00
Victor Oliveira
50410aaeaa Fix UTF8 handling for Color UI (#19708) 2020-10-16 16:39:55 -05:00
Victor Oliveira
35c40bc376 Implement wait_for_user for Color UI (#19694) 2020-10-16 16:39:55 -05:00
Victor Oliveira
aae644c507 Option to prevent (extra) Watchdog init on STM32 (#19693) 2020-10-16 16:39:55 -05:00
Scott Lahteine
ce830f8a71 Fix screen click reading too often (#19696)
Co-authored-by: andreibobirica <39415547+andreibobirica@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Keith Bennett
d3d423a322 Sanity-check mutually-exclusive G34 features (#19706) 2020-10-16 16:39:55 -05:00
InsanityAutomation
8b060a3902 G34 Mechanical Gantry Calibration (like Prusa M915) (#18972)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:55 -05:00
Victor Oliveira
faae900747 TFT Refactoring (#19192)
* split tft folder in two: tft for color ui; tft_io for shared tft code

* after the files got moved, now the code was moved to the right place

* classic ui using TFT IO init lcd codes

* feature to compile tft_io when enabled

* compiling fix

* lvgl spi tft working with tft io init codes

* there is no need for separeted fsmc and spi class in lvgl anymore, as tft io handle everything

* remove debug

* base for TFT rotation and mirroring API, and ILI9488 support

* ST7796S rotate and mirror support

* ST7789V rotate and mirror support

* ST7735 rotate and mirror support

* ILI9341 rotate and mirror support

* ILI9328 rotate and mirror support

* R61505 rotate and mirror support

* MKS TFT definitions

* more configs for mks tfts

* update config

* naming typo

* to configure the user interface

* ANYCUBIC_TFT35

* tft configs

* support for SSD1963

* tft display types

* updated conditionals lcd; first board fully working with the new code - all 3 ui!

* compatiblity

* changed name

* move classic ui file name

* rename TURN -> ROTATE

* GRAPHICAL_TFT_ROTATE_180 deprecated

* first fsmc board fully working - chitu v5

* mks robin nano v1.2 + tft 35 ok!

* right pin name

* anycubic tft tested in a TRIGORILLA_PRO

* chitu v6

* nano 32 tft orientation

* mks tft43

* mks tft43 rotation

* fixed LONGER LK tft setup

* GRAPHICAL_TFT_UPSCALE defined by the display type

* better offsets defaults

* Update Configuration.h

* Update tft_fsmc.cpp

* Update Conditionals_LCD.h

* Tweak comments

* update nano tests

* Revert "update nano tests"

This reverts commit a071ebbfad30e28855a4a5695ec8a726542a1a65.

* default tft

* outdated comments

* to not break non-vscode builds

* upscale tft 35

* support tft 180 rotation for color ui

* Each TFT Driver is responsible for its default color mode.

* use auto detect in mks displays, because some of them could be shipped with diferent drivers

* extra s

* unused code

* wrong -1

* missing mirror options

* Smaller regex pattern

* Comment updates

* Clean up old defines

* Apply pins formatting

* GRAPHICAL_TFT_ROTATE_180 => TFT_ROTATE_180

* MKS_ROBIN_TFT_V1_1R

* merge fix

* correct resolution

* auto is default, dont need be there, and it will allow the user to configure it even for named displays

* to not use rotation with MKS_ROBIN_TFT_V1_1R

* i like () in macros

* avoid sleepy commits

* default for st7789 is rgb

* nano follow up

* to allow ili9328 rotation

* default is rgb

* boards merge follow up

* to match bootloader orientation

* HAS_TOUCH_XPT2046 is not hal specific anymore

* lets not forget LPC

* 180 rotation for ili9328 and R61505

* Clean up whitespace

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2020-10-16 16:39:55 -05:00
Scott Lahteine
11662bf2b6 Marlin 2.0.7.1 2020-10-16 16:39:55 -05:00
Serhiy-K
887e2637c0 Fixes for TFTGLCD Panel, FastIO (#19614) 2020-10-16 16:39:55 -05:00
ellensp
958f05e4b4 HAS_CHARACTER_LCD => HAS_MARLINUI_HD44780 (#19673) 2020-10-16 16:39:55 -05:00
thinkyhead
9126a2e654 [cron] Bump distribution date (2020-10-10) 2020-10-16 16:39:55 -05:00
Scott Lahteine
5070fae231 Batch appercase hex values 2020-10-16 16:39:54 -05:00
Scott Lahteine
454f9d6319 Optional M42/M226; Add more features filters (#19664) 2020-10-16 16:39:54 -05:00
Victor Oliveira
59b6b32e6e Support for Debug Codes - Dnnn (#19225)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:54 -05:00
石立枫
6d9709e20d Support for FLY MINI (#19185) 2020-10-16 16:39:54 -05:00
Keith Bennett
7a484959d5 Fix touch ifndefs (#19661) 2020-10-16 16:39:54 -05:00
Giuliano Zaro
78060f55e6 Update Italian language (#19654) 2020-10-16 16:39:54 -05:00
thinkyhead
3fca19fbab [cron] Bump distribution date (2020-10-09) 2020-10-16 16:39:54 -05:00
Samantaz Fox
b8700e0aa8 Fix and improve Makefile / CMake (#19640) 2020-10-16 16:39:54 -05:00
Scott Lahteine
d66bc5cec2 Permit touch calibration override 2020-10-16 16:39:54 -05:00
Scott Lahteine
fb28c6041a Use 0xFF (not 'ff') for byte transfer 2020-10-16 16:39:54 -05:00
ellensp
0f9d57e03a Apply env:mega2560ext to relevant boards (#19624) 2020-10-16 16:39:54 -05:00
qwewer0
32377849da Update PROBE_OFFSET_WIZARD comment (#19652) 2020-10-16 16:39:54 -05:00
thinkyhead
0975c487f0 [cron] Bump distribution date (2020-10-08) 2020-10-16 16:39:54 -05:00
qwewer0
d07ad63016 More accessible PROBE_OFFSET_WIZARD (#19647) 2020-10-16 16:39:54 -05:00
ellensp
1a5a3cf253 Restore ° to 6x9 small info font (#19645) 2020-10-16 16:39:54 -05:00
Scott Lahteine
6f6901180c Chamber vent/fan followup 2020-10-16 16:39:54 -05:00
Scott Lahteine
9cc6297292 Fix small font section directive, mixer warning 2020-10-16 16:39:54 -05:00
thinkyhead
cf53bc2dd2 [cron] Bump distribution date (2020-10-07) 2020-10-16 16:39:54 -05:00
Scott Lahteine
f4f4ea05e1 Update language fonts 2020-10-16 16:39:54 -05:00
ladismrkolj
2b845e5a75 Add Chamber servo vent, auto fan (#19519) 2020-10-16 16:39:54 -05:00
signetica
6fcbf11454 Fix Ender-3 V2 DWIN Stop SD Print (#19642)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:54 -05:00
Scott Lahteine
8a69147adf Improve retract / unretract labels 2020-10-16 16:39:54 -05:00
thinkyhead
f8ceedea5c [cron] Bump distribution date (2020-10-06) 2020-10-16 16:39:54 -05:00
Scott Lahteine
a4e4226578 Trailing whitespace 2020-10-16 16:39:54 -05:00
Scott Lahteine
e76fd6bd33 Sync config to examples 2020-10-16 16:39:54 -05:00
Mathew Winters
437bee418b Z Probe Offset Wizard (#18866) 2020-10-16 16:39:54 -05:00
Cory Ory
31238de937 Allow bypass for cold E movement (#19606) 2020-10-16 16:39:54 -05:00
thinkyhead
cb8c99c4f8 [cron] Bump distribution date (2020-10-05) 2020-10-16 16:39:54 -05:00
Ryan V1
2fe81d0cb2 Fix Archim1 stepper timing (with new variant) (#19596) 2020-10-16 16:39:54 -05:00
Scott Lahteine
fb7d7ee7b4 Add HAS_FAST_MOVES 2020-10-16 16:39:54 -05:00
ellensp
d99fdcf526 Fix Z_AFTER_HOMING without probe (#19607) 2020-10-16 16:39:54 -05:00
Scott Lahteine
e4d2234a04 Move SF_ARC_FIX option 2020-10-16 16:39:54 -05:00
Speaka
bea919da6e Fix German translation purging/unloading (#19615) 2020-10-16 16:39:54 -05:00
Scott Lahteine
2fb22cc116 Shared singlenozzle item 2020-10-16 16:39:54 -05:00
Scott Lahteine
d4b6542ce1 Fix Tune/Fan edit items
- Fixes #19617
- Followup to #18400
2020-10-16 16:39:53 -05:00
thinkyhead
7d47ee732e [cron] Bump distribution date (2020-10-04) 2020-10-16 16:39:53 -05:00
thinkyhead
6ceacd62f9 [cron] Bump distribution date (2020-10-03) 2020-10-16 16:39:53 -05:00
Ryan V1
2ce6741731 Fix 'bossac' upload on Windows (#19545) 2020-10-16 16:39:53 -05:00
Marcio T
2213eb3317 Touch UI support for X2, Y2 and Z2 (#19538) 2020-10-16 16:39:53 -05:00
ellensp
b947590082 Fix wrappers on HAL/STM32F1 .cpp files (#19581)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-10-16 16:39:53 -05:00
ellensp
20bcaa78f6 Fix TEMP_ADC_PROBE support for STM32F1 (#19582)
Co-authored-by: ellensp <ellensp@ellensp-HP-ProBook-6470b.fritz.box>
2020-10-16 16:39:53 -05:00
ellensp
9834a36a17 Fix compile of MMU2 with S-mode disabled (#19584) 2020-10-16 16:39:24 -05:00
bilsef
90801f8815 Fix onboard SD card support for Teensy 3.6 & 4.1 (#19593) 2020-10-16 16:39:24 -05:00
Scott Lahteine
4d1357e318 Adjust HAL platform defines, comments 2020-10-16 16:39:23 -05:00
Scott Lahteine
8d090cbdbb Replace tabs with spaces 2020-10-16 16:38:59 -05:00
Victor Oliveira
ec5b78d18b Minor SPI fixes, systick_callback for STM32F1 HAL compatibility (#19565) 2020-10-16 16:38:59 -05:00
thinkyhead
d33317eadb [cron] Bump distribution date (2020-10-02) 2020-10-16 16:38:59 -05:00
swissnorp
f8375a3ea2 G35 workaround for Pronterface "feature" (#19577) 2020-10-16 16:38:59 -05:00
Stéphane
5a02959d18 Fix Anycubic i3 Mega target temperature display (#19572)
Also includes a workaround for missing (probably un-fetched) long name in file listing
2020-10-16 16:38:58 -05:00
Ilya
cc123bc657 No move on Park = No move on Resume (#19569) 2020-10-16 16:38:58 -05:00
Roman Moravčík
4f6a0605bf Update Slovak language (#19561) 2020-10-16 16:38:58 -05:00
Victor Oliveira
b89700ed35 Fix Buzzer (pin) init for uninitialized FastIO (#19559) 2020-10-16 16:38:58 -05:00
Victor Oliveira
ca853fbe19 Fix Move Screen with disabled Touch (#19558) 2020-10-16 16:38:58 -05:00
thinkyhead
1ba2548fb2 [cron] Bump distribution date (2020-10-01) 2020-10-16 16:38:58 -05:00
thinkyhead
1332be77a5 [cron] Bump distribution date (2020-09-30) 2020-10-16 16:38:58 -05:00
Victor Oliveira
a7f334387c Keep HAL tasks running during PID Autotune (#19671) 2020-10-09 23:37:43 -05:00
Scott Lahteine
e8177735a0 Marlin 2.0.7 2020-09-28 21:02:09 -05:00
Scott Lahteine
aac0326f7f Merge bugfix-2.0.x into 2.0.x 2020-09-28 20:59:49 -05:00
thinkyhead
41774ec9de [cron] Bump distribution date (2020-09-29) 2020-09-29 00:13:48 +00:00
Nick
60155aa442
Anycubic Chiron full feature support (#19505) 2020-09-28 18:53:40 -05:00
Scott Lahteine
169ec65e72 Fix up E3 DWIN Power Panic 2020-09-28 17:17:12 -05:00
Scott Lahteine
660420050b Fetch longname when a file exists 2020-09-28 17:17:12 -05:00
Scott Lahteine
0ddb4d88a9 Add extra CardReader debugging 2020-09-28 17:17:12 -05:00
Scott Lahteine
9142f5446a
Improve Power-Loss Recovery (#19540) 2020-09-28 15:52:21 -05:00
Scott Lahteine
6d4c82f4d8
Fix diveToFile with open Dir object (#19539)
* Fix CardReader diveToFile
* Add CardReader::fileExists
2020-09-28 15:46:12 -05:00
qwewer0
4424645e04
Multi-line comments cleanup (#19535) 2020-09-28 14:53:50 -05:00
Pavel Melnikov
05517e2096
Change "Fr" on LCD to ">>" (#18830) 2020-09-28 04:55:46 -05:00
Scott Lahteine
be7bbadabe Default E3 V2 to English 2020-09-28 04:39:29 -05:00
Scott Lahteine
d4a5b10133 Tweaks to git helpers 2020-09-28 03:57:33 -05:00
Scott Lahteine
4584a52ba5 Update configs to 020007 2020-09-28 03:55:14 -05:00
Serhiy-K
27bdf4b24e
MarlinUI for SPI/I2C TFT-GLCD character-based display bridge (#19375) 2020-09-28 01:52:38 -05:00
Scott Lahteine
c2c6a679ea
Rename LCD conditionals (#19533) 2020-09-28 01:13:27 -05:00
Scott Lahteine
1c372df449 Prettier INI 2020-09-28 01:11:48 -05:00
Scott Lahteine
3a91ab4706 Menu tweak 2020-09-28 01:02:05 -05:00
Scott Lahteine
303d871ca7 Update AnyCubic deps 2020-09-28 01:02:05 -05:00
Emperor
00c09e95ac
Thermistor: Kis3d Silicone heater + precision cast plate (#19528) 2020-09-27 21:38:30 -05:00
Tanguy Pruvot
f3de0f6c53
Working LCD_USE_DMA_FSMC (#19522) 2020-09-27 21:28:48 -05:00
Siana Gearz
7415e4e66d
Fix Allen Key Probe pin test (#19520) 2020-09-27 21:25:35 -05:00
Victor Oliveira
6572d7131f
LVGL followup fixing "C", etc. (#19517) 2020-09-27 21:22:08 -05:00
thinkyhead
d9d920e0b3 [cron] Bump distribution date (2020-09-28) 2020-09-28 00:13:59 +00:00
Scott Lahteine
cd5735130d CardReader cleanup 2020-09-27 16:58:50 -05:00
Scott Lahteine
3245a5fdf6 E3 DWIN: "No Media" message 2020-09-27 16:55:57 -05:00
Scott Lahteine
37cf156223 E3 DWIN: General cleanup 2020-09-27 16:55:57 -05:00
Scott Lahteine
d2741c8680 Allow M524 between M23 and M24 2020-09-27 16:55:57 -05:00
Scott Lahteine
dd118e2f36 Drop extra Bed PID 2020-09-27 16:55:57 -05:00
Scott Lahteine
4975e93350 Tweak MMU beeps, misc. cleanup 2020-09-27 02:03:00 -05:00
thinkyhead
82e602c847 [cron] Bump distribution date (2020-09-27) 2020-09-27 00:14:12 +00:00
Trocololo
88d7f4d7be
MMU2 S Mode spins the BMG gears during C0 (#19429) 2020-09-25 20:28:01 -05:00
Victor Oliveira
5cf2cf2be9
Allow ColorUI color customization (#19484) 2020-09-25 20:05:23 -05:00
Victor Oliveira
a7f5d38da7
Fix MBL "Click to continue" on Color UI touchscreen (#19514) 2020-09-25 19:58:45 -05:00
Keith Bennett
ec4a0a3e0d
SKR E3 Turbo followup (#19513) 2020-09-25 19:49:36 -05:00
Luke Harrison
97e0d55073
Fix SKR 1.4 thermistor pin comments (#19510) 2020-09-25 19:48:24 -05:00
ellensp
7efd740950
Fix MKS Robin undefined pins error (#19507) 2020-09-25 19:47:22 -05:00
Victor Oliveira
61d96ce1c9
Escape the M33 string arg (#19515) 2020-09-25 19:45:01 -05:00
thinkyhead
f902e208a3 [cron] Bump distribution date (2020-09-26) 2020-09-26 00:13:15 +00:00
Victor Oliveira
178a1da165
TFT: No timeout on Move Screen (#19426) 2020-09-25 14:58:28 -05:00
Scott Lahteine
7ce91c5ffe Sanity check old serial names 2020-09-24 21:46:13 -05:00
Keith Bennett
23faf902ab
BigTreeTech SKR E3 Turbo (#19500) 2020-09-24 21:19:04 -05:00
Jason Smith
da6c8317a7
Fix and improve STM32F1 serial (#19464) 2020-09-24 20:28:48 -05:00
thinkyhead
6bb6f7f288 [cron] Bump distribution date (2020-09-25) 2020-09-25 00:13:26 +00:00
Scott Lahteine
b3223d7b41 Fix some pin inits 2020-09-23 21:36:39 -05:00
Scott Lahteine
568f292883 HAL/serial followup 2020-09-23 21:36:31 -05:00
Scott Lahteine
4b928b2da8 HAL and serial cleanup
Co-Authored-By: Jason Smith <20053467+sjasonsmith@users.noreply.github.com>
2020-09-23 19:45:33 -05:00
thinkyhead
928d874dea [cron] Bump distribution date (2020-09-24) 2020-09-24 00:13:39 +00:00
Scott Lahteine
ecc8013812 Whitespace cleanup 2020-09-23 17:43:32 -05:00
ellensp
6634bedb25
Define UART pins for LPC debug based on LPC_PINCFG_UART (#19475) 2020-09-23 16:03:07 -05:00
ellensp
e3d4e328f9
Preserve brightness in EEPROM validate (#19485)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-09-23 15:44:15 -05:00
Scott Lahteine
93421f3a00 Teensy pins cleanup 2020-09-23 15:34:10 -05:00
Jason Smith
023cb54fae
MKS Robin Mini uses ONBOARD_SPI_DEVICE (#19460) 2020-09-23 15:07:34 -05:00
Victor Oliveira
90bc1993b6
Include pins.h in dependencies script (#19468) 2020-09-23 15:06:36 -05:00
Marcio T
362145f608
New Touch UI buttons (#19465) 2020-09-22 21:01:01 -05:00
Jason Smith
5d0429ee2a
Catch a TMC address conflict early (#19458) 2020-09-22 20:36:31 -05:00
Scott Lahteine
5f5f76956f Fix up tests, warnings 2020-09-22 19:59:02 -05:00
thinkyhead
fd8cd31504 [cron] Bump distribution date (2020-09-23) 2020-09-23 00:13:17 +00:00
Scott Lahteine
a87c517da5 Fix Teensy 4.1 include 2020-09-22 17:52:42 -05:00
Jason Smith
d051c2adbd
Update board/teensy comment (#19456) 2020-09-22 17:36:59 -05:00
makerbase
63e7ae793b
MKS SGEN L V2 adaptable heaters/fans (#19462) 2020-09-22 15:57:17 -05:00
Victor Oliveira
79dc8a2297
Define <u8,u8,u8>::softSPI (#19419) 2020-09-22 15:44:17 -05:00
riodoro1
225487f9db
Fix up K8800 pins (#19476) 2020-09-22 15:08:14 -05:00
thinkyhead
47aa61c0ec [cron] Bump distribution date (2020-09-22) 2020-09-22 00:13:24 +00:00
Chris Pepper
1bfc51ad5c
Update pins_ANET_10.h 2020-09-21 16:19:09 +01:00
Jason Smith
fb48cd0ab4
Replace Serial with Serial1 in pins files (#19459) 2020-09-20 22:30:20 -05:00
qwewer0
0251eb85b2
Optional menu item for Assisted Tramming (#19447) 2020-09-20 22:29:34 -05:00
makerbase
d8ed749045
Add MKS Robin E3P, improve LVGL UI (#19442) 2020-09-20 20:55:02 -05:00
thinkyhead
77b06dce0c [cron] Bump distribution date (2020-09-21) 2020-09-20 20:51:21 -05:00
Scott Lahteine
4f73ac7289 Add HAS_ROTARY_ENCODER 2020-09-20 20:51:21 -05:00
Scott Lahteine
60ab7a1ddb Cleanup before MKS changes 2020-09-20 20:51:21 -05:00
Scott Lahteine
76d8d1742c Add multi-extruder condition 2020-09-20 20:51:21 -05:00
Scott Lahteine
8e0fac897b Whitespace cleanup 2020-09-20 18:25:42 -05:00
thinkyhead
0c7035d8a3 [cron] Bump distribution date (2020-09-20) 2020-09-20 00:13:46 +00:00
enigmaquip
b5e4511de8
Fix Creality DWIN Control menu icons (#19441) 2020-09-19 10:19:45 -05:00
ellensp
98bcb25fd4
Ultratronics Pro SPI pins (#19444) 2020-09-19 10:18:42 -05:00
qwewer0
af8f9f790a
Optional Host Start menu item (#19443) 2020-09-19 10:17:24 -05:00
Marcio T
9fd06fa767
Fix case light brightness save/load (#19436) 2020-09-19 09:23:56 -05:00
InsanityAutomation
4696142a31
Fix compile for Taz Pro (#19424) 2020-09-19 09:20:15 -05:00
Scott Lahteine
435e1535cc Change some dwin defines 2020-09-19 09:04:00 -05:00
Cole Markham
4628f0e237
Fix CoreXY compile with backlash cal. (#19422) 2020-09-19 08:14:34 -05:00
thinkyhead
e65deacabb [cron] Bump distribution date (2020-09-19) 2020-09-19 00:13:10 +00:00
Keith Bennett
55ba5044ef
Fix missing include (#19418)
Co-authored-by: ellensp <530024+ellensp@users.noreply.github.com>
2020-09-18 04:45:56 -05:00
thinkyhead
648269e0ec [cron] Bump distribution date (2020-09-18) 2020-09-18 00:13:20 +00:00
Victor Oliveira
5b56d6698a
Move screen for Color UI (#19386) 2020-09-17 06:52:21 -05:00
InsanityAutomation
62206c0386
Host Action: Start (#19398) 2020-09-17 06:36:21 -05:00
Jason Smith
a52afd2aeb
Update stale issue message and parameters (#19412)
* Update stale issue bot

* Update close-stale.yml

* Update close-stale.yml

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-09-17 06:35:10 -05:00
jahartley
da1a60aeb6
Expose JOYSTICK_DEBUG to the general user (#19394)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-09-17 06:01:10 -05:00
Victor Oliveira
3eaa19fdb0
Fix MKS UI SPI flash typo (#19410) 2020-09-17 05:52:47 -05:00
Marcio Teixeira
c539254101 Add warning to ExtUI Bed Mesh Screen. (#19397)
- Show a warning on the Mesh Bed Leveling screen if some points aren't probed.
2020-09-17 05:49:18 -05:00
deram
24d8daa01b
SHOW_REMAINING_TIME for HD44780 character LCD (#19416) 2020-09-17 05:41:13 -05:00
cosmoderp
073b7f1e3a
E3 V2 DWIN: Z-Offset, cleanup, versatility (#19384)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-09-17 05:35:04 -05:00
enigmaquip
5926bacea1
Add more DWIN commands, docs (#19395) 2020-09-17 03:17:47 -05:00
tovam
c5204807e9
Fix missing spaces in info menu (#19404) 2020-09-17 03:07:03 -05:00
Jason Smith
9d5a9621de
Demo and test multiple PID defaults (#19413) 2020-09-17 03:06:01 -05:00
thinkyhead
9cf8537051 [cron] Bump distribution date (2020-09-17) 2020-09-17 00:13:06 +00:00
Scott Lahteine
56ed55ddba MarlinUI percent methods for all 2020-09-16 07:12:24 -05:00
Scott Lahteine
217bae9ff1 More DWIN cleanup 2020-09-16 07:12:24 -05:00
Scott Lahteine
250bfac0cc E3 V2 DWIN cleanup 2020-09-16 04:35:30 -05:00
thinkyhead
57a87a278b [cron] Bump distribution date (2020-09-16) 2020-09-16 00:12:57 +00:00
thinkyhead
0b7d69d06f [cron] Bump distribution date (2020-09-15) 2020-09-15 00:13:01 +00:00
Victor Oliveira
79d4123319
Only set up SPI pins as needed (#19372) 2020-09-14 17:16:19 -05:00
Zachary Annand
648e7f73a5
More strict STATIC_ITEM_N (#19378) 2020-09-14 03:28:21 -05:00
Marcio T
941b890881
Add missing FTDI EVE menu source (#19382) 2020-09-14 03:25:20 -05:00
Scott Lahteine
0f9eb480aa Allow E3 V2 DWIN without EEPROM, POWER_LOSS_RECOVERY 2020-09-14 02:48:45 -05:00
Scott Lahteine
0473f7ee58 M115 strings 2020-09-14 02:42:05 -05:00
Scott Lahteine
3a89d34e7f Always show Compiled: 2020-09-14 02:42:05 -05:00
Scott Lahteine
cd85fa3abe Better choice of code
Followup to #19344
2020-09-14 02:22:44 -05:00
ellensp
979876e958
Improve temperature runaway, idle timeout (#19339)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
2020-09-13 23:58:39 -05:00
thinkyhead
cf8316bfbb [cron] Bump distribution date (2020-09-14) 2020-09-14 00:13:25 +00:00
Scott Lahteine
49ca16c3fb heater_ind_t => heater_id_t 2020-09-13 18:22:28 -05:00
mmajoor
d93471fdad
Allow SWD debug on Robin Nano (#19345) 2020-09-12 23:33:55 -05:00
Marcio T
872516f9f9
Touch UI "Leveling" menu, misc. fixes (#19349) 2020-09-12 23:32:00 -05:00
ellensp
7c7e663911
Fix extra string substitution bug (#19351) 2020-09-12 23:01:03 -05:00
ManuelMcLure
c04d5624da
Read from backup TMC StealthChop state (#19364) 2020-09-12 22:59:20 -05:00
Jason Smith
d07ce9ef21
Fix EXP2 pin define for MKS SGEN_L (#19369) 2020-09-12 21:52:46 -05:00
Giuliano Zaro
dcf3587d9a
Update Italian language (#19365) 2020-09-12 21:51:20 -05:00
Jesse S
94244c1d93
Highlight Creality DWIN menu icons (#19368) 2020-09-12 21:50:15 -05:00
thinkyhead
ed39317203 [cron] Bump distribution date (2020-09-13) 2020-09-13 00:13:14 +00:00
Neskik
1917ed8741
M872 wait for probe temperature (#19344) 2020-09-11 22:51:19 -05:00
Haxk20
6f8282f01e
Fix Print Stats appearance (#19348) 2020-09-11 19:53:06 -05:00
thinkyhead
4f390ea18f [cron] Bump distribution date (2020-09-12) 2020-09-12 00:12:50 +00:00
Keith Bennett
cb9a34c6f7
Fix Creality RET6 env - RE (#19340) 2020-09-11 02:12:49 -05:00
Scott Lahteine
6759aff220 Clean up W25QXXFlash class 2020-09-10 21:54:04 -05:00
Scott Lahteine
b33f4ba300 Use F() for Ender 3 V2 DWIN 2020-09-10 21:52:36 -05:00
Scott Lahteine
85089898be Translate encoder comments 2020-09-10 20:14:07 -05:00
thinkyhead
4d65ab5a0b [cron] Bump distribution date (2020-09-11) 2020-09-11 00:12:52 +00:00
riodoro1
abf1222f1d
Fix missing BOARD_K8800 (#19331) 2020-09-10 17:06:37 -05:00
Giuliano Zaro
b2ba9009d0
Fix "too cold" in M600 (#19332) 2020-09-10 16:47:58 -05:00
Scott Lahteine
21ee7be30a Warning if SDCARD_READONLY should be disabled 2020-09-10 03:03:42 -05:00
Scott Lahteine
9b78138600 General cleanup 2020-09-10 02:29:01 -05:00
Victor Oliveira
160f70be63
LPC: Finish DMA transfer, use HW SPI class (#19191) 2020-09-10 00:41:26 -05:00
Victor Oliveira
b98946b5c1
Raise STM32F1 UART IRQ Priority, add error handling (#19301)
(Error handling for Overrun, Framing and Parity.)
2020-09-09 22:46:50 -05:00
Zachary Annand
20ac0faa86
Fix Separate Neopixel menu labels (#19303) 2020-09-09 22:04:10 -05:00
Keith Bennett
700e0fe7d7
Warn in platformio.ini about RCT6 512K (#19312) 2020-09-09 21:59:42 -05:00
Marcio Teixeira
328d8b5952 Fix ExtUI SD sorting, compile issues 2020-09-09 21:54:08 -05:00
makerbase
006b7f3f17
MKS Gen L V2.1 (#19314) 2020-09-09 21:48:42 -05:00
Keith Bennett
6eebcb5e48
Fix compile with Danish, Basque (#19325) 2020-09-09 21:23:01 -05:00
thinkyhead
0b01aa8276 [cron] Bump distribution date (2020-09-10) 2020-09-10 00:12:33 +00:00
bilsef
049fbc92a9
Support for Teensy 4 (#19311) 2020-09-09 18:57:20 -05:00
Scott Lahteine
bc7720c0cd Minor HAL cleanup 2020-09-08 22:17:44 -05:00
thinkyhead
40fdf8f087 [cron] Bump distribution date (2020-09-09) 2020-09-09 00:12:44 +00:00
Jason Smith
4fc1aba848
Update HAL/STM32 platform to 8.0 (#18496) 2020-09-07 21:41:48 -05:00
Giuliano Zaro
828a582f4d
Make M600 heat up the nozzle. Reset runout on fail. (#19298)
Co-authored-by: Scott Lahteine <github@thinkyhead.com>
2020-09-07 21:29:45 -05:00
thinkyhead
d1d8417a61 [cron] Bump distribution date (2020-09-08) 2020-09-08 00:12:45 +00:00
Jason Smith
5c3140811d
TFT is neither "graphical" nor "character" (#19297) 2020-09-07 17:07:53 -05:00
Victor Oliveira
4268d86da1
Sanity-check BABYSTEP_DISPLAY_TOTAL with ColorUI (#19284) 2020-09-07 03:17:35 -05:00
Kadah
bb017038d4
Fix M166 Gradient Mix for DELTA (#19285) 2020-09-07 03:15:42 -05:00
Zachary Annand
d3f1f3533d
Separate Neopixel followup (#19287) 2020-09-07 02:59:31 -05:00
Scott Lahteine
a445746a8b Clean up LCD conditionals, DWIN 2020-09-06 23:21:42 -05:00
Scott Lahteine
b709baba7a Whitespace cleanup 2020-09-06 22:51:59 -05:00
Jason Smith
ef1d154a4a
Adjust GTR PeripheralPins to avoid timer conflicts (#19183) 2020-09-06 20:10:25 -05:00
Victor Oliveira
a4bc9e669c
STM32F1 EP with USB_COMPOSITE (#19281) 2020-09-06 20:04:20 -05:00
Zachary Annand
5ea7a8373a
Menu items for Separate NeoPixel (#19280) 2020-09-06 20:00:24 -05:00
thinkyhead
f29baed540 [cron] Bump distribution date (2020-09-07) 2020-09-07 00:13:11 +00:00
Keith Bennett
d19fc64392
Clarify disabling StallGuard for axes (#19263) 2020-09-06 17:51:19 -05:00
Marcio T
2b789ddab9
Touch UI long filenames fixes (#19262)
* Improvements to FTDI DLCache functionality.
* Better handling of long file names in Touch UI
- Long file names now truncated and shown with ellipsis.
- Increased display cache buffer to allow for longer filenames.
- Visual error message when display cache is exceeded.
2020-09-06 17:37:16 -05:00
cosmoderp
86b71b83fa
Fix Ender 3 V2 (DWIN) buffer overrun (#19268) 2020-09-06 17:34:08 -05:00
Victor Oliveira
486731162f
Fix STM32F1 SPI device init, MKS_LCD12864 (#19271) 2020-09-06 17:29:43 -05:00
Victor Oliveira
b6ab163814
Emergency Parser for STM32F1 (#19279) 2020-09-06 17:23:36 -05:00
thinkyhead
2ea1bf0e1d [cron] Bump distribution date (2020-09-06) 2020-09-06 00:13:05 +00:00
Scott Lahteine
d9ad8caf02 SD card debugging 2020-09-04 20:14:30 -05:00
Scott Lahteine
14314b68ec No 'ls' if media isn't mounted 2020-09-04 19:57:47 -05:00
Scott Lahteine
3002e1cd60 Fix Creality V4 SD Detect 2020-09-04 19:34:51 -05:00
thinkyhead
00e738e485 [cron] Bump distribution date (2020-09-05) 2020-09-05 00:18:44 +00:00
Keith Bennett
9913333c33
Auto-label Feature Requests (#19258) 2020-09-03 23:27:59 -05:00
Keith Bennett
1d6a92751b
Tweak ESP32 Wifi sanity-check message (#19257) 2020-09-03 23:15:45 -05:00
Victor Sokolov
e97e6865c3
MarkForged kinematics (#19235) 2020-09-03 20:12:53 -05:00
thinkyhead
55dcff746b [cron] Bump distribution date (2020-09-04) 2020-09-04 00:12:46 +00:00
Greg Nutt
691f02acab
Smoothieboard GLCD w/ SD support (#19241) 2020-09-03 17:52:14 -05:00
Victor Oliveira
1f25312b65
Only show "SD Init Fail" with detectable media (#19236) 2020-09-03 17:46:05 -05:00
Zachary Annand
26858fdebf
Separate Neopixel followup (#19250) 2020-09-03 17:43:52 -05:00
Tanguy Pruvot
7d8d0010e3
Fix Longer3D TFT defines, disable DMA (#19251) 2020-09-03 17:40:29 -05:00
Scott Lahteine
277042bc4e Hide multi-step G29 on Ender 3 V2 2020-09-03 16:55:16 -05:00
thinkyhead
768182c691 [cron] Bump distribution date (2020-09-03) 2020-09-03 00:12:25 +00:00
ManuelMcLure
ab06d5c7fb
Fix UBL 'G29 I' for large meshes (#19231) 2020-09-02 01:32:52 -05:00
thinkyhead
f97b8c835a [cron] Bump distribution date (2020-09-02) 2020-09-02 00:12:22 +00:00
makerbase
f375d9bd7b
MKS SGEN L V2 (#18822) 2020-09-01 18:20:16 -05:00
Victor Oliveira
e3d855673e
Fail SD mount without SPI re-init (#19226) 2020-09-01 17:09:28 -05:00
Stéphane
62268aae65
Fix Anycubic LCDs / Trigorilla 1.4 pins (#19220) 2020-09-01 17:05:52 -05:00
Zachary Annand
09ddb5a724
Separate Neopixel followup (#19224) 2020-09-01 17:03:28 -05:00
Giuliano Zaro
56c44b053d
Delete old LCD strings (#19227) 2020-09-01 16:59:29 -05:00
Stéphane
2979da73cf
Fix Anycubic I3 Mega (S) original screen % display (#19210) 2020-08-31 22:27:42 -05:00
Ludy
d3ac4ba83d
Update German, fix Mix component index (#19206) 2020-08-31 22:23:28 -05:00
thinkyhead
203e44e026 [cron] Bump distribution date (2020-09-01) 2020-09-01 00:12:57 +00:00
Martin
4ab4dbb8a1
Permit touch params override w/ Robin nano (#19196) 2020-08-31 18:56:58 -05:00
Zachary Annand
41c7ae5d54
Separate Neopixels followup (#19179) 2020-08-31 16:06:24 -05:00
ellensp
2a72961be4
Fix 'cmd' array warning (#19193) 2020-08-31 15:05:42 -05:00
thinkyhead
8d76d8c081 [cron] Bump distribution date (2020-08-31) 2020-08-31 00:14:49 +00:00
thinkyhead
c8995b91e2 [cron] Bump distribution date (2020-08-30) 2020-08-30 00:07:24 +00:00
thinkyhead
e492c613f7 [cron] Bump distribution date (2020-08-29) 2020-08-29 00:13:59 +00:00
891 changed files with 59265 additions and 21706 deletions

View file

@ -9,35 +9,51 @@ assignees: ''
<!-- <!--
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/master/.github/code_of_conduct.md Please follow the instructions below. Failure to do so may result in your issue being closed.
Do you want to ask a question? Are you looking for support? Please don't post here. Instead please use one of the support links at https://github.com/MarlinFirmware/Marlin/issues/new/choose ### Before Reporting a Bug
Before filing an issue be sure to test the "bugfix" branches to see whether the issue has been resolved. 1. Test with the `bugfix-2.0.x` branch to see whether the issue still exists.
2. Get troubleshooting help from the Marlin community to confirm it's a bug and not just a configuration error. Links at https://github.com/MarlinFirmware/Marlin/issues/new/choose
### Instructions
1. Fill out every section of the template below.
2. Always attach configuration files, regardless of whether you think they are involved.
3. Read and understand 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/master/.github/code_of_conduct.md
--> -->
### Bug Description ### Bug Description
<!-- Description of the bug --> <!-- Describe the bug in this section. (You can remove this invisible comment.) -->
### My Configurations ### Configuration Files
**Required:** Please include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files. **Required:** Include a ZIP file containing `Configuration.h` and `Configuration_adv.h`.
If you've made any other modifications describe them in detail here.
### Steps to Reproduce ### Steps to Reproduce
<!-- Please describe the steps needed to reproduce the issue --> <!-- Describe the steps needed to reproduce the issue. (You can remove this invisible comment.) -->
1. [First Step] 1. [First Step]
2. [Second Step] 2. [Second Step]
3. [and so on...] 3. [and so on...]
**Expected behavior:** [What you expect to happen] **Expected behavior:**
**Actual behavior:** [What actually happens] <!-- Describe what you expected to happen here. (You can remove this invisible comment.) -->
**Actual behavior:**
<!-- Describe what actually happens here. (You can remove this invisible comment.) -->
#### Additional Information #### Additional Information
* Provide pictures or links to videos that clearly demonstrate the issue. * Provide pictures or links to videos that clearly demonstrate the issue.
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines. * See [Contributing to Marlin](https://github.com/MarlinFirmware/Marlin/blob/2.0.x/.github/contributing.md) for additional guidelines.

View file

@ -2,7 +2,7 @@
name: Feature request name: Feature request
about: Request a Feature about: Request a Feature
title: "[FR] (feature request title)" title: "[FR] (feature request title)"
labels: '' labels: 'T: Feature Request'
assignees: '' assignees: ''
--- ---

View file

@ -20,8 +20,8 @@ jobs:
- uses: actions/stale@v3 - uses: actions/stale@v3
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label / comment or this will be closed in 5 days.' stale-issue-message: 'This issue has had no activity in the last 30 days. Please add a reply if you want to keep this issue active, otherwise it will be automatically closed within 7 days.'
days-before-stale: 30 days-before-stale: 30
days-before-close: 5 days-before-close: 7
stale-issue-label: 'stale-closing-soon' stale-issue-label: 'stale-closing-soon'
exempt-issue-labels: 'T: Feature Request' exempt-issue-labels: 'T: Feature Request'

View file

@ -41,6 +41,7 @@ jobs:
- mega2560 - mega2560
- teensy31 - teensy31
- teensy35 - teensy35
- teensy41
- SAMD51_grandcentral_m4 - SAMD51_grandcentral_m4
# Extended AVR Environments # Extended AVR Environments
@ -70,6 +71,7 @@ jobs:
- mks_robin_stm32 - mks_robin_stm32
- ARMED - ARMED
- FYSETC_S6 - FYSETC_S6
- STM32F070CB_malyan
- STM32F070RB_malyan - STM32F070RB_malyan
- malyan_M300 - malyan_M300
- mks_robin_lite - mks_robin_lite

View file

@ -34,9 +34,8 @@
* - Extra features * - Extra features
* *
* Advanced settings can be found in Configuration_adv.h * Advanced settings can be found in Configuration_adv.h
*
*/ */
#define CONFIGURATION_H_VERSION 020006 #define CONFIGURATION_H_VERSION 020007
//=========================================================================== //===========================================================================
//============================= Getting Started ============================= //============================= Getting Started =============================
@ -347,11 +346,10 @@
#endif #endif
#endif #endif
// @section temperature
//=========================================================================== //===========================================================================
//============================= Thermal Settings ============================ //============================= Thermal Settings ============================
//=========================================================================== //===========================================================================
// @section temperature
/** /**
* --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table
@ -390,6 +388,7 @@
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....) * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....)
* 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB) * 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB)
* 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB) * 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB)
* 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup)
* 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup * 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup
@ -432,6 +431,12 @@
#define DUMMY_THERMISTOR_998_VALUE 25 #define DUMMY_THERMISTOR_998_VALUE 25
#define DUMMY_THERMISTOR_999_VALUE 100 #define DUMMY_THERMISTOR_999_VALUE 100
// Resistor values when using a MAX31865 (sensor -5)
// Sensor value is typically 100 (PT100) or 1000 (PT1000)
// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules.
//#define MAX31865_SENSOR_OHMS 100
//#define MAX31865_CALIBRATION_OHMS 430
// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings // Use temp sensor 1 as a redundant sensor with sensor 0. If the readings
// from the two sensors differ too much the print will be aborted. // from the two sensors differ too much the print will be aborted.
//#define TEMP_SENSOR_1_AS_REDUNDANT //#define TEMP_SENSOR_1_AS_REDUNDANT
@ -487,23 +492,17 @@
//#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders)
// Set/get with gcode: M301 E[extruder number, 0-2] // Set/get with gcode: M301 E[extruder number, 0-2]
// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it #if ENABLED(PID_PARAMS_PER_HOTEND)
// Specify between 1 and HOTENDS values per array.
// Ultimaker // If fewer than EXTRUDER values are provided, the last element will be repeated.
#define DEFAULT_Kp 22.2 #define DEFAULT_Kp_LIST { 22.20, 22.20 }
#define DEFAULT_Ki 1.08 #define DEFAULT_Ki_LIST { 1.08, 1.08 }
#define DEFAULT_Kd 114 #define DEFAULT_Kd_LIST { 114.00, 114.00 }
#else
// MakerGear #define DEFAULT_Kp 22.20
//#define DEFAULT_Kp 7.0 #define DEFAULT_Ki 1.08
//#define DEFAULT_Ki 0.1 #define DEFAULT_Kd 114.00
//#define DEFAULT_Kd 12 #endif
// Mendel Parts V9 on 12V
//#define DEFAULT_Kp 63.0
//#define DEFAULT_Ki 2.25
//#define DEFAULT_Kd 440
#endif // PIDTEMP #endif // PIDTEMP
//=========================================================================== //===========================================================================
@ -539,18 +538,12 @@
//#define MIN_BED_POWER 0 //#define MIN_BED_POWER 0
//#define PID_BED_DEBUG // Sends debug data to the serial port. //#define PID_BED_DEBUG // Sends debug data to the serial port.
//120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
//from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
#define DEFAULT_bedKp 10.00 #define DEFAULT_bedKp 10.00
#define DEFAULT_bedKi .023 #define DEFAULT_bedKi .023
#define DEFAULT_bedKd 305.4 #define DEFAULT_bedKd 305.4
//120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
//from pidautotune
//#define DEFAULT_bedKp 97.1
//#define DEFAULT_bedKi 1.41
//#define DEFAULT_bedKd 1675.16
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
#endif // PIDTEMPBED #endif // PIDTEMPBED
@ -608,7 +601,7 @@
// @section machine // @section machine
// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics // Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
// either in the usual order or reversed // either in the usual order or reversed
//#define COREXY //#define COREXY
//#define COREXZ //#define COREXZ
@ -616,6 +609,7 @@
//#define COREYX //#define COREYX
//#define COREZX //#define COREZX
//#define COREZY //#define COREZY
//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042
//=========================================================================== //===========================================================================
//============================== Endstop Settings =========================== //============================== Endstop Settings ===========================
@ -866,7 +860,6 @@
* - For simple switches connect... * - For simple switches connect...
* - normally-closed switches to GND and D32. * - normally-closed switches to GND and D32.
* - normally-open switches to 5V and D32. * - normally-open switches to 5V and D32.
*
*/ */
//#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default //#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default
@ -1578,7 +1571,6 @@
* *
* Caveats: The ending Z should be the same as starting Z. * Caveats: The ending Z should be the same as starting Z.
* Attention: EXPERIMENTAL. G-code arguments may change. * Attention: EXPERIMENTAL. G-code arguments may change.
*
*/ */
//#define NOZZLE_CLEAN_FEATURE //#define NOZZLE_CLEAN_FEATURE
@ -1731,7 +1723,6 @@
* *
* SD Card support is disabled by default. If your controller has an SD slot, * SD Card support is disabled by default. If your controller has an SD slot,
* you must uncomment the following option or it won't work. * you must uncomment the following option or it won't work.
*
*/ */
//#define SDSUPPORT //#define SDSUPPORT
@ -1968,6 +1959,14 @@
// //
//#define FF_INTERFACEBOARD //#define FF_INTERFACEBOARD
//
// TFT GLCD Panel with Marlin UI
// Panel connected to main board by SPI or I2C interface.
// See https://github.com/Serhiy-K/TFTGLCDAdapter
//
//#define TFTGLCD_PANEL_SPI
//#define TFTGLCD_PANEL_I2C
//============================================================================= //=============================================================================
//======================= LCD / Controller Selection ======================= //======================= LCD / Controller Selection =======================
//========================= (Graphical LCDs) ======================== //========================= (Graphical LCDs) ========================
@ -2171,6 +2170,9 @@
// Touch-screen LCD for Malyan M200/M300 printers // Touch-screen LCD for Malyan M200/M300 printers
// //
//#define MALYAN_LCD //#define MALYAN_LCD
#if ENABLED(MALYAN_LCD)
#define LCD_SERIAL_PORT 1 // Default is 1 for Malyan M200
#endif
// //
// Touch UI for FTDI EVE (FT800/FT810) displays // Touch UI for FTDI EVE (FT800/FT810) displays
@ -2184,7 +2186,7 @@
//#define ANYCUBIC_LCD_I3MEGA //#define ANYCUBIC_LCD_I3MEGA
//#define ANYCUBIC_LCD_CHIRON //#define ANYCUBIC_LCD_CHIRON
#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) #if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON)
#define ANYCUBIC_LCD_SERIAL_PORT 3 #define LCD_SERIAL_PORT 3 // Default is 3 for Anycubic
//#define ANYCUBIC_LCD_DEBUG //#define ANYCUBIC_LCD_DEBUG
#endif #endif
@ -2202,43 +2204,47 @@
//=============================== Graphical TFTs ============================== //=============================== Graphical TFTs ==============================
//============================================================================= //=============================================================================
// /**
// TFT display with optional touch screen * TFT Type - Select your Display type
// Color Marlin UI with standard menu system *
// * Available options are:
//#define TFT_320x240 * MKS_TS35_V2_0,
//#define TFT_320x240_SPI * MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35,
//#define TFT_480x320 * MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R
//#define TFT_480x320_SPI * TFT_TRONXY_X5SA, ANYCUBIC_TFT35, LONGER_LK_TFT28
* TFT_GENERIC
*
* For TFT_GENERIC, you need to configure these 3 options:
* Driver: TFT_DRIVER
* Current Drivers are: AUTO, ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488
* Resolution: TFT_WIDTH and TFT_HEIGHT
* Interface: TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI
*/
//#define TFT_GENERIC
// /**
// Skip autodetect and force specific TFT driver * TFT UI - User Interface Selection. Enable one of the following options:
// Mandatory for SPI screens with no MISO line *
// Available drivers are: ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled
// * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities
//#define TFT_DRIVER AUTO * TFT_LVGL_UI - A Modern UI using LVGL
*
* For LVGL_UI also copy the 'assets' folder from the build directory to the
* root of your SD card, together with the compiled firmware.
*/
//#define TFT_CLASSIC_UI
//#define TFT_COLOR_UI
//#define TFT_LVGL_UI
// /**
// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) * TFT Rotation. Set to one of the following values:
// Upscaled 128x64 Marlin UI *
// * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y,
//#define SPI_GRAPHICAL_TFT * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y,
* TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y,
// * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION
// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) */
// Upscaled 128x64 Marlin UI //#define TFT_ROTATION TFT_NO_ROTATION
//
//#define FSMC_GRAPHICAL_TFT
//
// TFT LVGL UI
//
// Using default MKS icons and fonts from: https://git.io/JJvzK
// Just copy the 'assets' folder from the build directory to the
// root of your SD card, together with the compiled firmware.
//
//#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC
//#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI
//============================================================================= //=============================================================================
//============================ Other Controllers ============================ //============================ Other Controllers ============================
@ -2308,9 +2314,6 @@
// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) // then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
//#define TEMP_STAT_LEDS //#define TEMP_STAT_LEDS
// SkeinForge sends the wrong arc G-codes when using Arc Point as fillet procedure
//#define SF_ARC_FIX
// Support for the BariCUDA Paste Extruder // Support for the BariCUDA Paste Extruder
//#define BARICUDA //#define BARICUDA
@ -2343,7 +2346,6 @@
* *** CAUTION *** * *** CAUTION ***
* *
* LED Type. Enable only one of the following two options. * LED Type. Enable only one of the following two options.
*
*/ */
//#define RGB_LED //#define RGB_LED
//#define RGBW_LED //#define RGBW_LED
@ -2397,17 +2399,12 @@
#define PRINTER_EVENT_LEDS #define PRINTER_EVENT_LEDS
#endif #endif
/**
* R/C SERVO support
* Sponsored by TrinityLabs, Reworked by codexmas
*/
/** /**
* Number of servos * Number of servos
* *
* For some servo-related options NUM_SERVOS will be set automatically. * For some servo-related options NUM_SERVOS will be set automatically.
* Set this manually if there are extra servos needing manual control. * Set this manually if there are extra servos needing manual control.
* Leave undefined or set to 0 to entirely disable the servo subsystem. * Set to 0 to turn off servo support.
*/ */
//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
@ -2419,5 +2416,5 @@
// Only power servos during movement, otherwise leave off to prevent jitter // Only power servos during movement, otherwise leave off to prevent jitter
//#define DEACTIVATE_SERVOS_AFTER_MOVE //#define DEACTIVATE_SERVOS_AFTER_MOVE
// Allow servo angle to be edited and saved to EEPROM // Edit servo angles with M281 and save to EEPROM with M500
//#define EDITABLE_SERVO_ANGLES //#define EDITABLE_SERVO_ANGLES

View file

@ -29,15 +29,13 @@
* Some of these settings can damage your printer if improperly set! * Some of these settings can damage your printer if improperly set!
* *
* Basic settings can be found in Configuration.h * Basic settings can be found in Configuration.h
*
*/ */
#define CONFIGURATION_ADV_H_VERSION 020006 #define CONFIGURATION_ADV_H_VERSION 020007
// @section temperature
//=========================================================================== //===========================================================================
//============================= Thermal Settings ============================ //============================= Thermal Settings ============================
//=========================================================================== //===========================================================================
// @section temperature
/** /**
* Thermocouple sensors are quite sensitive to noise. Any noise induced in * Thermocouple sensors are quite sensitive to noise. Any noise induced in
@ -126,9 +124,19 @@
#define HEATER_BED_INVERTING true #define HEATER_BED_INVERTING true
#endif #endif
/** //
* Heated Chamber settings // Heated Bed Bang-Bang options
*/ //
#if DISABLED(PIDTEMPBED)
#define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
#if ENABLED(BED_LIMIT_SWITCHING)
#define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS
#endif
#endif
//
// Heated Chamber options
//
#if TEMP_SENSOR_CHAMBER #if TEMP_SENSOR_CHAMBER
#define CHAMBER_MINTEMP 5 #define CHAMBER_MINTEMP 5
#define CHAMBER_MAXTEMP 60 #define CHAMBER_MAXTEMP 60
@ -136,12 +144,28 @@
//#define CHAMBER_LIMIT_SWITCHING //#define CHAMBER_LIMIT_SWITCHING
//#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin
//#define HEATER_CHAMBER_INVERTING false //#define HEATER_CHAMBER_INVERTING false
#endif
#if DISABLED(PIDTEMPBED) //#define CHAMBER_FAN // Enable a fan on the chamber
#define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control #if ENABLED(CHAMBER_FAN)
#if ENABLED(BED_LIMIT_SWITCHING) #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve.
#define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS #if CHAMBER_FAN_MODE == 0
#define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255)
#elif CHAMBER_FAN_MODE == 1
#define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target
#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target
#elif CHAMBER_FAN_MODE == 2
#define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255)
#define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target
#endif
#endif
//#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber
#if ENABLED(CHAMBER_VENT)
#define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo
#define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber
#define LOW_EXCESS_HEAT_LIMIT 3
#define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20
#define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5
#endif #endif
#endif #endif
@ -738,7 +762,6 @@
* | 4 3 | 1 4 | 2 1 | 3 2 | * | 4 3 | 1 4 | 2 1 | 3 2 |
* | | | | | * | | | | |
* | 1 2 | 2 3 | 3 4 | 4 1 | * | 1 2 | 2 3 | 3 4 | 4 1 |
*
*/ */
#ifndef Z_STEPPER_ALIGN_XY #ifndef Z_STEPPER_ALIGN_XY
//#define Z_STEPPERS_ORIENTATION 0 //#define Z_STEPPERS_ORIENTATION 0
@ -783,8 +806,9 @@
#define TRAMMING_POINT_NAME_3 "Back-Right" #define TRAMMING_POINT_NAME_3 "Back-Right"
#define TRAMMING_POINT_NAME_4 "Back-Left" #define TRAMMING_POINT_NAME_4 "Back-Left"
// Enable to restore leveling setup after operation #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation
#define RESTORE_LEVELING_AFTER_G35 //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first
//#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item for Assisted Tramming
/** /**
* Screw thread: * Screw thread:
@ -1049,6 +1073,14 @@
#if HAS_LCD_MENU #if HAS_LCD_MENU
// Add Probe Z Offset calibration to the Z Probe Offsets menu
#if HAS_BED_PROBE
//#define PROBE_OFFSET_WIZARD
#if ENABLED(PROBE_OFFSET_WIZARD)
#define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra
#endif
#endif
// Include a page of printer information in the LCD Main Menu // Include a page of printer information in the LCD Main Menu
//#define LCD_INFO_MENU //#define LCD_INFO_MENU
#if ENABLED(LCD_INFO_MENU) #if ENABLED(LCD_INFO_MENU)
@ -1105,23 +1137,26 @@
#define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
#endif #endif
#if HAS_GRAPHICAL_LCD && EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) #if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
//#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits //#define SHOW_REMAINING_TIME // Display estimated time to completion
//#define SHOW_REMAINING_TIME // Display estimated time to completion
#if ENABLED(SHOW_REMAINING_TIME) #if ENABLED(SHOW_REMAINING_TIME)
//#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation
//#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time
#endif #endif
#endif
#if HAS_CHARACTER_LCD && EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) #if HAS_MARLINUI_U8GLIB
//#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits
#if ENABLED(LCD_PROGRESS_BAR) #endif
#define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar
#define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
#define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing
//#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it #if ENABLED(LCD_PROGRESS_BAR)
//#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar
#define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message
#define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever)
//#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it
//#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar
#endif
#endif #endif
#endif #endif
@ -1164,6 +1199,7 @@
#if ENABLED(POWER_LOSS_RECOVERY) #if ENABLED(POWER_LOSS_RECOVERY)
#define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
//#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss
//#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled!
//#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS)
//#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module.
//#define POWER_LOSS_STATE HIGH // State of pin indicating power loss //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss
@ -1324,7 +1360,7 @@
* controller events, as there is a trade-off between reliable * controller events, as there is a trade-off between reliable
* printing performance versus fast display updates. * printing performance versus fast display updates.
*/ */
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
// Show SD percentage next to the progress bar // Show SD percentage next to the progress bar
//#define DOGM_SD_PERCENT //#define DOGM_SD_PERCENT
@ -1339,7 +1375,7 @@
// Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese.
//#define USE_BIG_EDIT_FONT //#define USE_BIG_EDIT_FONT
// A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. // A smaller font may be used on the Info Screen. Costs 2434 bytes of PROGMEM.
// Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese.
//#define USE_SMALL_INFOFONT //#define USE_SMALL_INFOFONT
@ -1394,18 +1430,18 @@
//#define MARLIN_SNAKE //#define MARLIN_SNAKE
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
// //
// Additional options for DGUS / DWIN displays // Additional options for DGUS / DWIN displays
// //
#if HAS_DGUS_LCD #if HAS_DGUS_LCD
#define DGUS_SERIAL_PORT 3 #define LCD_SERIAL_PORT 3
#define DGUS_BAUDRATE 115200 #define LCD_BAUDRATE 115200
#define DGUS_RX_BUFFER_SIZE 128 #define DGUS_RX_BUFFER_SIZE 128
#define DGUS_TX_BUFFER_SIZE 48 #define DGUS_TX_BUFFER_SIZE 48
//#define DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR)
#define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates
@ -1524,10 +1560,9 @@
#endif #endif
// //
// FSMC / SPI Graphical TFT // Classic UI Options
// //
#if TFT_SCALED_DOGLCD #if TFT_SCALED_DOGLCD
//#define GRAPHICAL_TFT_ROTATE_180
//#define TFT_MARLINUI_COLOR 0xFFFF // White //#define TFT_MARLINUI_COLOR 0xFFFF // White
//#define TFT_MARLINBG_COLOR 0x0000 // Black //#define TFT_MARLINBG_COLOR 0x0000 // Black
//#define TFT_DISABLED_COLOR 0x0003 // Almost black //#define TFT_DISABLED_COLOR 0x0003 // Almost black
@ -1572,6 +1607,7 @@
#if ENABLED(BABYSTEPPING) #if ENABLED(BABYSTEPPING)
//#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR
//#define BABYSTEP_WITHOUT_HOMING //#define BABYSTEP_WITHOUT_HOMING
//#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement).
//#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA!
#define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way
//#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps
@ -1582,7 +1618,6 @@
#if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING)
#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
// Note: Extra time may be added to mitigate controller latency. // Note: Extra time may be added to mitigate controller latency.
//#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement).
//#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle.
#if ENABLED(MOVE_Z_WHEN_IDLE) #if ENABLED(MOVE_Z_WHEN_IDLE)
#define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size.
@ -1765,6 +1800,7 @@
#define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections
//#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles
//#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes
//#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure
#endif #endif
// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes.
@ -1950,7 +1986,6 @@
* Be sure to turn off auto-retract during filament change. * Be sure to turn off auto-retract during filament change.
* *
* Note that M207 / M208 / M209 settings are saved to EEPROM. * Note that M207 / M208 / M209 settings are saved to EEPROM.
*
*/ */
//#define FWRETRACT //#define FWRETRACT
#if ENABLED(FWRETRACT) #if ENABLED(FWRETRACT)
@ -1976,7 +2011,7 @@
* Universal tool change settings. * Universal tool change settings.
* Applies to all types of extruders except where explicitly noted. * Applies to all types of extruders except where explicitly noted.
*/ */
#if EXTRUDERS > 1 #if HAS_MULTI_EXTRUDER
// Z raise distance for tool-change, as needed for some extruders // Z raise distance for tool-change, as needed for some extruders
#define TOOLCHANGE_ZRAISE 2 // (mm) #define TOOLCHANGE_ZRAISE 2 // (mm)
//#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled) //#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled)
@ -2040,7 +2075,7 @@
//#define TOOLCHANGE_PARK_X_ONLY // X axis only move //#define TOOLCHANGE_PARK_X_ONLY // X axis only move
//#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move
#endif #endif
#endif // EXTRUDERS > 1 #endif // HAS_MULTI_EXTRUDER
/** /**
* Advanced Pause * Advanced Pause
@ -2487,7 +2522,7 @@
#define E7_HYBRID_THRESHOLD 30 #define E7_HYBRID_THRESHOLD 30
/** /**
* Use StallGuard2 to home / probe X, Y, Z. * Use StallGuard to home / probe X, Y, Z.
* *
* TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
@ -2508,6 +2543,8 @@
* *
* IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when
* homing and adds a guard period for endstop triggering. * homing and adds a guard period for endstop triggering.
*
* Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis.
*/ */
//#define SENSORLESS_HOMING // StallGuard capable drivers only //#define SENSORLESS_HOMING // StallGuard capable drivers only
@ -3227,6 +3264,7 @@
//#define HOST_ACTION_COMMANDS //#define HOST_ACTION_COMMANDS
#if ENABLED(HOST_ACTION_COMMANDS) #if ENABLED(HOST_ACTION_COMMANDS)
//#define HOST_PROMPT_SUPPORT //#define HOST_PROMPT_SUPPORT
//#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
#endif #endif
/** /**
@ -3334,6 +3372,26 @@
#define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max
#define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 }
#define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 }
//#define JOYSTICK_DEBUG
#endif
/**
* Mechanical Gantry Calibration
* Modern replacement for the Prusa TMC_Z_CALIBRATION.
* Adds capability to work with any adjustable current drivers.
* Implemented as G34 because M915 is deprecated.
*/
//#define MECHANICAL_GANTRY_CALIBRATION
#if ENABLED(MECHANICAL_GANTRY_CALIBRATION)
#define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma
#define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move
#define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move
//#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction
//#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle
//#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM
//#define GANTRY_CALIBRATION_COMMANDS_PRE ""
#define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position
#endif #endif
/** /**
@ -3411,10 +3469,10 @@
#if ENABLED(PRUSA_MMU2) #if ENABLED(PRUSA_MMU2)
// Serial port used for communication with MMU2. // Serial port used for communication with MMU2.
// For AVR enable the UART port used for the MMU. (e.g., internalSerial) // For AVR enable the UART port used for the MMU. (e.g., mmuSerial)
// For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2)
#define INTERNAL_SERIAL_PORT 2 #define MMU2_SERIAL_PORT 2
#define MMU2_SERIAL internalSerial #define MMU2_SERIAL mmuSerial
// Use hardware reset for MMU if a pin is defined for it // Use hardware reset for MMU if a pin is defined for it
//#define MMU2_RST_PIN 23 //#define MMU2_RST_PIN 23
@ -3465,7 +3523,7 @@
*/ */
//#define MMU_EXTRUDER_SENSOR //#define MMU_EXTRUDER_SENSOR
#if ENABLED(MMU_EXTRUDER_SENSOR) #if ENABLED(MMU_EXTRUDER_SENSOR)
#define MMU_LOADING_ATTEMPTS_NR 5 //max. number of attempts to load filament if first load fail #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
#endif #endif
/** /**
@ -3517,6 +3575,11 @@
// //
//#define M100_FREE_MEMORY_WATCHER //#define M100_FREE_MEMORY_WATCHER
//
// M42 - Set pin states
//
//#define DIRECT_PIN_CONTROL
// //
// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe // M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe
// //

View file

@ -22,8 +22,10 @@
# (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file # (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file
# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*). # changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*).
# #
# 3. Set the line containing "MCU" to match your board's processor. # 3. Set the line containing "MCU" to match your board's processor. Set
# Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth # "PROG_MCU" as the AVR part name corresponding to "MCU". You can use the
# following command to get a list of correspondences: `avrdude -c alf -p x`
# Older boards are atmega8 based, newer ones like Arduino Mini, Bluetooth
# or Diecimila have the atmega168. If you're using a LilyPad Arduino, # or Diecimila have the atmega168. If you're using a LilyPad Arduino,
# change F_CPU to 8000000. If you are using Gen7 electronics, you # change F_CPU to 8000000. If you are using Gen7 electronics, you
# probably need to use 20000000. Either way, you must regenerate # probably need to use 20000000. Either way, you must regenerate
@ -34,18 +36,18 @@
# 5. Type "make upload", reset your Arduino board, and press enter to # 5. Type "make upload", reset your Arduino board, and press enter to
# upload your program to the Arduino board. # upload your program to the Arduino board.
# #
# Note that all settings at the top of this file can be overriden from # Note that all settings at the top of this file can be overridden from
# the command line with, for example, "make HARDWARE_MOTHERBOARD=71" # the command line with, for example, "make HARDWARE_MOTHERBOARD=71"
# #
# To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use... # To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use...
# #
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ # make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino # HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino
# #
# To compile and upload simply add "upload" to the end of the line... # To compile and upload simply add "upload" to the end of the line...
# #
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ # make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino upload # HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino upload
# #
# If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or # If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or
# start upload manually (using stk500) like so: # start upload manually (using stk500) like so:
@ -57,7 +59,26 @@
# #
# This defines the board to compile for (see boards.h for your board's ID) # This defines the board to compile for (see boards.h for your board's ID)
HARDWARE_MOTHERBOARD ?= 11 HARDWARE_MOTHERBOARD ?= 1020
ifeq ($(OS),Windows_NT)
# Windows
ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
ARDUINO_USER_DIR ?= ${HOME}/Arduino
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
# Linux
ARDUINO_INSTALL_DIR ?= /usr/share/arduino
ARDUINO_USER_DIR ?= ${HOME}/Arduino
endif
ifeq ($(UNAME_S),Darwin)
# Darwin (macOS)
ARDUINO_INSTALL_DIR ?= /Applications/Arduino.app/Contents/Java
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino
AVR_TOOLS_PATH ?= /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/
endif
endif
# Arduino source install directory, and version number # Arduino source install directory, and version number
# On most linuxes this will be /usr/share/arduino # On most linuxes this will be /usr/share/arduino
@ -67,32 +88,38 @@ ARDUINO_VERSION ?= 106
# The installed Libraries are in the User folder # The installed Libraries are in the User folder
ARDUINO_USER_DIR ?= ${HOME}/Arduino ARDUINO_USER_DIR ?= ${HOME}/Arduino
# You can optionally set a path to the avr-gcc tools. Requires a trailing slash. (ex: /usr/local/avr-gcc/bin) # You can optionally set a path to the avr-gcc tools.
# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/
AVR_TOOLS_PATH ?= AVR_TOOLS_PATH ?=
#Programmer configuration # Programmer configuration
UPLOAD_RATE ?= 57600 UPLOAD_RATE ?= 57600
AVRDUDE_PROGRAMMER ?= arduino AVRDUDE_PROGRAMMER ?= arduino
# on most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1 # On most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1
UPLOAD_PORT ?= /dev/ttyUSB0 UPLOAD_PORT ?= /dev/ttyUSB0
#Directory used to build files in, contains all the build files, from object files to the final hex file # Directory used to build files in, contains all the build files, from object
#on linux it is best to put an absolute path like /home/username/tmp . # files to the final hex file on linux it is best to put an absolute path
# like /home/username/tmp .
BUILD_DIR ?= applet BUILD_DIR ?= applet
# This defines whether Liquid_TWI2 support will be built # This defines whether Liquid_TWI2 support will be built
LIQUID_TWI2 ?= 0 LIQUID_TWI2 ?= 0
# this defines if Wire is needed # This defines if Wire is needed
WIRE ?= 0 WIRE ?= 0
# this defines if U8GLIB is needed (may require RELOC_WORKAROUND) # This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h)
U8GLIB ?= 1 # Disabling this (and SPEAKER) saves approximatively 350 bytes of memory.
TONE ?= 1
# this defines whether to include the Trinamic TMCStepper library # This defines if U8GLIB is needed (may require RELOC_WORKAROUND)
TMC ?= 1 U8GLIB ?= 0
# this defines whether to include the AdaFruit NeoPixel library # This defines whether to include the Trinamic TMCStepper library
TMC ?= 0
# This defines whether to include the AdaFruit NeoPixel library
NEOPIXEL ?= 0 NEOPIXEL ?= 0
############ ############
@ -170,110 +197,115 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1100)
else ifeq ($(HARDWARE_MOTHERBOARD),1101) else ifeq ($(HARDWARE_MOTHERBOARD),1101)
# Velleman K8400 Controller (derived from 3Drag Controller) # Velleman K8400 Controller (derived from 3Drag Controller)
else ifeq ($(HARDWARE_MOTHERBOARD),1102) else ifeq ($(HARDWARE_MOTHERBOARD),1102)
# Velleman K8600 Controller (derived from 3Drag Controller) # Velleman K8600 Controller (Vertex Nano)
else ifeq ($(HARDWARE_MOTHERBOARD),1103) else ifeq ($(HARDWARE_MOTHERBOARD),1103)
# 2PrintBeta BAM&DICE with STK drivers # Velleman K8800 Controller (Vertex Delta)
else ifeq ($(HARDWARE_MOTHERBOARD),1104) else ifeq ($(HARDWARE_MOTHERBOARD),1104)
# 2PrintBeta BAM&DICE Due with STK drivers # 2PrintBeta BAM&DICE with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1105) else ifeq ($(HARDWARE_MOTHERBOARD),1105)
# MKS BASE v1.0 # 2PrintBeta BAM&DICE Due with STK drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1106) else ifeq ($(HARDWARE_MOTHERBOARD),1106)
# MKS v1.4 with A4982 stepper drivers # MKS BASE v1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1107) else ifeq ($(HARDWARE_MOTHERBOARD),1107)
# MKS v1.5 with Allegro A4982 stepper drivers # MKS v1.4 with A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1108) else ifeq ($(HARDWARE_MOTHERBOARD),1108)
# MKS v1.6 with Allegro A4982 stepper drivers # MKS v1.5 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1109) else ifeq ($(HARDWARE_MOTHERBOARD),1109)
# MKS BASE 1.0 with Heroic HR4982 stepper drivers # MKS v1.6 with Allegro A4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1110) else ifeq ($(HARDWARE_MOTHERBOARD),1110)
# MKS GEN v1.3 or 1.4 # MKS BASE 1.0 with Heroic HR4982 stepper drivers
else ifeq ($(HARDWARE_MOTHERBOARD),1111) else ifeq ($(HARDWARE_MOTHERBOARD),1111)
# MKS GEN L # MKS GEN v1.3 or 1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1112) else ifeq ($(HARDWARE_MOTHERBOARD),1112)
# zrib V2.0 control board (Chinese knock off RAMPS replica) # MKS GEN L
else ifeq ($(HARDWARE_MOTHERBOARD),1113) else ifeq ($(HARDWARE_MOTHERBOARD),1113)
# BigTreeTech or BIQU KFB2.0 # zrib V2.0 control board (Chinese knock off RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1114) else ifeq ($(HARDWARE_MOTHERBOARD),1114)
# Felix 2.0+ Electronics Board (RAMPS like) # BigTreeTech or BIQU KFB2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1115) else ifeq ($(HARDWARE_MOTHERBOARD),1115)
# Invent-A-Part RigidBoard # Felix 2.0+ Electronics Board (RAMPS like)
else ifeq ($(HARDWARE_MOTHERBOARD),1116) else ifeq ($(HARDWARE_MOTHERBOARD),1116)
# Invent-A-Part RigidBoard V2 # Invent-A-Part RigidBoard
else ifeq ($(HARDWARE_MOTHERBOARD),1117) else ifeq ($(HARDWARE_MOTHERBOARD),1117)
# Sainsmart 2-in-1 board # Invent-A-Part RigidBoard V2
else ifeq ($(HARDWARE_MOTHERBOARD),1118) else ifeq ($(HARDWARE_MOTHERBOARD),1118)
# Ultimaker # Sainsmart 2-in-1 board
else ifeq ($(HARDWARE_MOTHERBOARD),1119) else ifeq ($(HARDWARE_MOTHERBOARD),1119)
# Ultimaker (Older electronics. Pre 1.5.4. This is rare) # Ultimaker
else ifeq ($(HARDWARE_MOTHERBOARD),1120) else ifeq ($(HARDWARE_MOTHERBOARD),1120)
MCU ?= atmega1280 # Ultimaker (Older electronics. Pre 1.5.4. This is rare)
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
MCU ?= atmega1280
PROG_MCU ?= m1280
# Azteeg X3 # Azteeg X3
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
# Azteeg X3 Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1122) else ifeq ($(HARDWARE_MOTHERBOARD),1122)
# Ultimainboard 2.x (Uses TEMP_SENSOR 20) # Azteeg X3 Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1123) else ifeq ($(HARDWARE_MOTHERBOARD),1123)
# Rumba # Ultimainboard 2.x (Uses TEMP_SENSOR 20)
else ifeq ($(HARDWARE_MOTHERBOARD),1124) else ifeq ($(HARDWARE_MOTHERBOARD),1124)
# Raise3D Rumba # Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1125) else ifeq ($(HARDWARE_MOTHERBOARD),1125)
# Rapide Lite RL200 Rumba # Raise3D Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1126) else ifeq ($(HARDWARE_MOTHERBOARD),1126)
# Formbot T-Rex 2 Plus # Rapide Lite RL200 Rumba
else ifeq ($(HARDWARE_MOTHERBOARD),1127) else ifeq ($(HARDWARE_MOTHERBOARD),1127)
# Formbot T-Rex 3 # Formbot T-Rex 2 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1128) else ifeq ($(HARDWARE_MOTHERBOARD),1128)
# Formbot Raptor # Formbot T-Rex 3
else ifeq ($(HARDWARE_MOTHERBOARD),1129) else ifeq ($(HARDWARE_MOTHERBOARD),1129)
# Formbot Raptor 2 # Formbot Raptor
else ifeq ($(HARDWARE_MOTHERBOARD),1130) else ifeq ($(HARDWARE_MOTHERBOARD),1130)
# bq ZUM Mega 3D # Formbot Raptor 2
else ifeq ($(HARDWARE_MOTHERBOARD),1131) else ifeq ($(HARDWARE_MOTHERBOARD),1131)
# MakeBoard Mini v2.1.2 is a control board sold by MicroMake # bq ZUM Mega 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1132) else ifeq ($(HARDWARE_MOTHERBOARD),1132)
# TriGorilla Anycubic version 1.3 based on RAMPS EFB # MakeBoard Mini v2.1.2 is a control board sold by MicroMake
else ifeq ($(HARDWARE_MOTHERBOARD),1133) else ifeq ($(HARDWARE_MOTHERBOARD),1133)
# TriGorilla Anycubic version 1.4 based on RAMPS EFB # TriGorilla Anycubic version 1.3 based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1134) else ifeq ($(HARDWARE_MOTHERBOARD),1134)
# TriGorilla Anycubic version 1.4 Rev 1.1 # TriGorilla Anycubic version 1.4 based on RAMPS EFB
else ifeq ($(HARDWARE_MOTHERBOARD),1135) else ifeq ($(HARDWARE_MOTHERBOARD),1135)
# Creality: Ender-4, CR-8 # TriGorilla Anycubic version 1.4 Rev 1.1
else ifeq ($(HARDWARE_MOTHERBOARD),1136) else ifeq ($(HARDWARE_MOTHERBOARD),1136)
# Creality: CR10S, CR20, CR-X # Creality: Ender-4, CR-8
else ifeq ($(HARDWARE_MOTHERBOARD),1137) else ifeq ($(HARDWARE_MOTHERBOARD),1137)
# Dagoma F5 # Creality: CR10S, CR20, CR-X
else ifeq ($(HARDWARE_MOTHERBOARD),1138) else ifeq ($(HARDWARE_MOTHERBOARD),1138)
# FYSETC F6 1.3 # Dagoma F5
else ifeq ($(HARDWARE_MOTHERBOARD),1139) else ifeq ($(HARDWARE_MOTHERBOARD),1139)
# FYSETC F6 1.5 # FYSETC F6 1.3
else ifeq ($(HARDWARE_MOTHERBOARD),1140) else ifeq ($(HARDWARE_MOTHERBOARD),1140)
# Duplicator i3 Plus # FYSETC F6 1.5
else ifeq ($(HARDWARE_MOTHERBOARD),1141) else ifeq ($(HARDWARE_MOTHERBOARD),1141)
# VORON # Duplicator i3 Plus
else ifeq ($(HARDWARE_MOTHERBOARD),1142) else ifeq ($(HARDWARE_MOTHERBOARD),1142)
# TRONXY V3 1.0 # VORON
else ifeq ($(HARDWARE_MOTHERBOARD),1143) else ifeq ($(HARDWARE_MOTHERBOARD),1143)
# Z-Bolt X Series # TRONXY V3 1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1144) else ifeq ($(HARDWARE_MOTHERBOARD),1144)
# TT OSCAR # Z-Bolt X Series
else ifeq ($(HARDWARE_MOTHERBOARD),1145) else ifeq ($(HARDWARE_MOTHERBOARD),1145)
# Overlord/Overlord Pro # TT OSCAR
else ifeq ($(HARDWARE_MOTHERBOARD),1146) else ifeq ($(HARDWARE_MOTHERBOARD),1146)
# ADIMLab Gantry v1 # Overlord/Overlord Pro
else ifeq ($(HARDWARE_MOTHERBOARD),1147) else ifeq ($(HARDWARE_MOTHERBOARD),1147)
# ADIMLab Gantry v2 # ADIMLab Gantry v1
else ifeq ($(HARDWARE_MOTHERBOARD),1148) else ifeq ($(HARDWARE_MOTHERBOARD),1148)
# BIQU Tango V1 # ADIMLab Gantry v2
else ifeq ($(HARDWARE_MOTHERBOARD),1149) else ifeq ($(HARDWARE_MOTHERBOARD),1149)
# MKS GEN L V2 # BIQU Tango V1
else ifeq ($(HARDWARE_MOTHERBOARD),1150) else ifeq ($(HARDWARE_MOTHERBOARD),1150)
# Copymaster 3D # MKS GEN L V2
else ifeq ($(HARDWARE_MOTHERBOARD),1151) else ifeq ($(HARDWARE_MOTHERBOARD),1151)
# Ortur 4 # MKS GEN L V2.1
else ifeq ($(HARDWARE_MOTHERBOARD),1152) else ifeq ($(HARDWARE_MOTHERBOARD),1152)
# Tenlog D3 Hero # Copymaster 3D
else ifeq ($(HARDWARE_MOTHERBOARD),1153) 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
@ -346,9 +378,11 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1320)
# Minitronics v1.0/1.1 # Minitronics v1.0/1.1
else ifeq ($(HARDWARE_MOTHERBOARD),1400) else ifeq ($(HARDWARE_MOTHERBOARD),1400)
MCU ?= atmega1281 MCU ?= atmega1281
PROG_MCU ?= m1281
# Silvergate v1.0 # Silvergate v1.0
else ifeq ($(HARDWARE_MOTHERBOARD),1401) else ifeq ($(HARDWARE_MOTHERBOARD),1401)
MCU ?= atmega1281 MCU ?= atmega1281
PROG_MCU ?= m1281
# #
# Sanguinololu and Derivatives - ATmega644P, ATmega1284P # Sanguinololu and Derivatives - ATmega644P, ATmega1284P
@ -358,46 +392,57 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1401)
else ifeq ($(HARDWARE_MOTHERBOARD),1500) else ifeq ($(HARDWARE_MOTHERBOARD),1500)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Sanguinololu 1.2 and above # Sanguinololu 1.2 and above
else ifeq ($(HARDWARE_MOTHERBOARD),1501) else ifeq ($(HARDWARE_MOTHERBOARD),1501)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Melzi # Melzi
else ifeq ($(HARDWARE_MOTHERBOARD),1502) else ifeq ($(HARDWARE_MOTHERBOARD),1502)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Melzi V2.0 # Melzi V2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1503) else ifeq ($(HARDWARE_MOTHERBOARD),1503)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# Melzi with ATmega1284 (MaKr3d version) # Melzi with ATmega1284 (MaKr3d version)
else ifeq ($(HARDWARE_MOTHERBOARD),1504) else ifeq ($(HARDWARE_MOTHERBOARD),1504)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# Melzi Creality3D board (for CR-10 etc) # Melzi Creality3D board (for CR-10 etc)
else ifeq ($(HARDWARE_MOTHERBOARD),1505) else ifeq ($(HARDWARE_MOTHERBOARD),1505)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# Melzi Malyan M150 board # Melzi Malyan M150 board
else ifeq ($(HARDWARE_MOTHERBOARD),1506) else ifeq ($(HARDWARE_MOTHERBOARD),1506)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# Tronxy X5S # Tronxy X5S
else ifeq ($(HARDWARE_MOTHERBOARD),1507) else ifeq ($(HARDWARE_MOTHERBOARD),1507)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# STB V1.1 # STB V1.1
else ifeq ($(HARDWARE_MOTHERBOARD),1508) else ifeq ($(HARDWARE_MOTHERBOARD),1508)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# Azteeg X1 # Azteeg X1
else ifeq ($(HARDWARE_MOTHERBOARD),1509) else ifeq ($(HARDWARE_MOTHERBOARD),1509)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# Anet 1.0 (Melzi clone) # Anet 1.0 (Melzi clone)
else ifeq ($(HARDWARE_MOTHERBOARD),1510) else ifeq ($(HARDWARE_MOTHERBOARD),1510)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
# #
# Other ATmega644P, ATmega644, ATmega1284P # Other ATmega644P, ATmega644, ATmega1284P
@ -407,50 +452,61 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1510)
else ifeq ($(HARDWARE_MOTHERBOARD),1600) else ifeq ($(HARDWARE_MOTHERBOARD),1600)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Gen3+ # Gen3+
else ifeq ($(HARDWARE_MOTHERBOARD),1601) else ifeq ($(HARDWARE_MOTHERBOARD),1601)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Gen6 # Gen6
else ifeq ($(HARDWARE_MOTHERBOARD),1602) else ifeq ($(HARDWARE_MOTHERBOARD),1602)
HARDWARE_VARIANT ?= Gen6 HARDWARE_VARIANT ?= Gen6
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Gen6 deluxe # Gen6 deluxe
else ifeq ($(HARDWARE_MOTHERBOARD),1603) else ifeq ($(HARDWARE_MOTHERBOARD),1603)
HARDWARE_VARIANT ?= Gen6 HARDWARE_VARIANT ?= Gen6
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Gen7 custom (Alfons3 Version) # Gen7 custom (Alfons3 Version)
else ifeq ($(HARDWARE_MOTHERBOARD),1604) else ifeq ($(HARDWARE_MOTHERBOARD),1604)
HARDWARE_VARIANT ?= Gen7 HARDWARE_VARIANT ?= Gen7
MCU ?= atmega644 MCU ?= atmega644
PROG_MCU ?= m644
F_CPU ?= 20000000 F_CPU ?= 20000000
# Gen7 v1.1, v1.2 # Gen7 v1.1, v1.2
else ifeq ($(HARDWARE_MOTHERBOARD),1605) else ifeq ($(HARDWARE_MOTHERBOARD),1605)
HARDWARE_VARIANT ?= Gen7 HARDWARE_VARIANT ?= Gen7
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
F_CPU ?= 20000000 F_CPU ?= 20000000
# Gen7 v1.3 # Gen7 v1.3
else ifeq ($(HARDWARE_MOTHERBOARD),1606) else ifeq ($(HARDWARE_MOTHERBOARD),1606)
HARDWARE_VARIANT ?= Gen7 HARDWARE_VARIANT ?= Gen7
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
F_CPU ?= 20000000 F_CPU ?= 20000000
# Gen7 v1.4 # Gen7 v1.4
else ifeq ($(HARDWARE_MOTHERBOARD),1607) else ifeq ($(HARDWARE_MOTHERBOARD),1607)
HARDWARE_VARIANT ?= Gen7 HARDWARE_VARIANT ?= Gen7
MCU ?= atmega1284p MCU ?= atmega1284p
PROG_MCU ?= m1284p
F_CPU ?= 20000000 F_CPU ?= 20000000
# Alpha OMCA board # Alpha OMCA board
else ifeq ($(HARDWARE_MOTHERBOARD),1608) else ifeq ($(HARDWARE_MOTHERBOARD),1608)
HARDWARE_VARIANT ?= SanguinoA HARDWARE_VARIANT ?= SanguinoA
MCU ?= atmega644 MCU ?= atmega644
PROG_MCU ?= m644
# Final OMCA board # Final OMCA board
else ifeq ($(HARDWARE_MOTHERBOARD),1609) else ifeq ($(HARDWARE_MOTHERBOARD),1609)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# Sethi 3D_1 # Sethi 3D_1
else ifeq ($(HARDWARE_MOTHERBOARD),1610) else ifeq ($(HARDWARE_MOTHERBOARD),1610)
HARDWARE_VARIANT ?= Sanguino HARDWARE_VARIANT ?= Sanguino
MCU ?= atmega644p MCU ?= atmega644p
PROG_MCU ?= m644p
# #
# Teensyduino - AT90USB1286, AT90USB1286P # Teensyduino - AT90USB1286, AT90USB1286P
@ -460,51 +516,60 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1610)
else ifeq ($(HARDWARE_MOTHERBOARD),1700) else ifeq ($(HARDWARE_MOTHERBOARD),1700)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# Printrboard (AT90USB1286) # Printrboard (AT90USB1286)
else ifeq ($(HARDWARE_MOTHERBOARD),1701) else ifeq ($(HARDWARE_MOTHERBOARD),1701)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# Printrboard Revision F (AT90USB1286) # Printrboard Revision F (AT90USB1286)
else ifeq ($(HARDWARE_MOTHERBOARD),1702) else ifeq ($(HARDWARE_MOTHERBOARD),1702)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# Brainwave (AT90USB646) # Brainwave (AT90USB646)
else ifeq ($(HARDWARE_MOTHERBOARD),1703) else ifeq ($(HARDWARE_MOTHERBOARD),1703)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb646 MCU ?= at90usb646
PROG_MCU ?= usb646
# Brainwave Pro (AT90USB1286) # Brainwave Pro (AT90USB1286)
else ifeq ($(HARDWARE_MOTHERBOARD),1704) else ifeq ($(HARDWARE_MOTHERBOARD),1704)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# SAV Mk-I (AT90USB1286) # SAV Mk-I (AT90USB1286)
else ifeq ($(HARDWARE_MOTHERBOARD),1705) else ifeq ($(HARDWARE_MOTHERBOARD),1705)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# Teensy++2.0 (AT90USB1286) # Teensy++2.0 (AT90USB1286)
else ifeq ($(HARDWARE_MOTHERBOARD),1706) else ifeq ($(HARDWARE_MOTHERBOARD),1706)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# 5DPrint D8 Driver Board # 5DPrint D8 Driver Board
else ifeq ($(HARDWARE_MOTHERBOARD),1707) else ifeq ($(HARDWARE_MOTHERBOARD),1707)
HARDWARE_VARIANT ?= Teensy HARDWARE_VARIANT ?= Teensy
MCU ?= at90usb1286 MCU ?= at90usb1286
PROG_MCU ?= usb1286
# UltiMachine Archim1 (with DRV8825 drivers) # UltiMachine Archim1 (with DRV8825 drivers)
else ifeq ($(HARDWARE_MOTHERBOARD),3023) else ifeq ($(HARDWARE_MOTHERBOARD),3023)
HARDWARE_VARIANT ?= archim HARDWARE_VARIANT ?= archim
MCPU = cortex-m3 MCPU = cortex-m3
F_CPU = 84000000L F_CPU = 84000000
IS_MCU = 0 IS_MCU = 0
# UltiMachine Archim2 (with TMC2130 drivers) # UltiMachine Archim2 (with TMC2130 drivers)
else ifeq ($(HARDWARE_MOTHERBOARD),3024) else ifeq ($(HARDWARE_MOTHERBOARD),3024)
HARDWARE_VARIANT ?= archim HARDWARE_VARIANT ?= archim
MCPU = cortex-m3 MCPU = cortex-m3
F_CPU = 84000000L F_CPU = 84000000
IS_MCU = 0 IS_MCU = 0
endif endif
# Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py # Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py
# if you are setting this to something other than 16MHz # if you are setting this to something other than 16MHz
# Do not put the UL suffix, it's done later on.
# Set to 16Mhz if not yet set. # Set to 16Mhz if not yet set.
F_CPU ?= 16000000 F_CPU ?= 16000000
@ -514,7 +579,8 @@ IS_MCU ?= 1
ifeq ($(IS_MCU),1) ifeq ($(IS_MCU),1)
# Set to arduino, ATmega2560 if not yet set. # Set to arduino, ATmega2560 if not yet set.
HARDWARE_VARIANT ?= arduino HARDWARE_VARIANT ?= arduino
MCU ?= atmega2560 MCU ?= atmega2560
PROG_MCU ?= m2560
TOOL_PREFIX = avr TOOL_PREFIX = avr
MCU_FLAGS = -mmcu=$(MCU) MCU_FLAGS = -mmcu=$(MCU)
@ -545,27 +611,36 @@ VPATH += $(BUILD_DIR)
VPATH += $(HARDWARE_SRC) VPATH += $(HARDWARE_SRC)
ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)) ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino))
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/LiquidCrystal/src # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/SPI VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
endif endif
ifeq ($(IS_MCU),1) ifeq ($(IS_MCU),1)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
endif endif
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
ifeq ($(LIQUID_TWI2), 1) ifeq ($(LIQUID_TWI2), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire WIRE = 1
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2
endif endif
ifeq ($(WIRE), 1) ifeq ($(WIRE), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire # Old libraries (avr-core 1.6.21 / Arduino < 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility
endif endif
ifeq ($(NEOPIXEL), 1) ifeq ($(NEOPIXEL), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
@ -637,13 +712,23 @@ ifeq ($(WIRE), 1)
LIB_CXXSRC += Wire.cpp LIB_CXXSRC += Wire.cpp
endif endif
ifeq ($(TONE), 1)
LIB_CXXSRC += Tone.cpp
endif
ifeq ($(U8GLIB), 1) ifeq ($(U8GLIB), 1)
LIB_CXXSRC += U8glib.cpp LIB_CXXSRC += U8glib.cpp
LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c \
u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c \
u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c
endif endif
ifeq ($(TMC), 1) ifeq ($(TMC), 1)
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
endif endif
ifeq ($(RELOC_WORKAROUND), 1) ifeq ($(RELOC_WORKAROUND), 1)
@ -685,17 +770,23 @@ REMOVE = rm -f
MV = mv -f MV = mv -f
# Place -D or -U options here # Place -D or -U options here
CDEFS = -DF_CPU=$(F_CPU) ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION) CDEFS = -DF_CPU=$(F_CPU)UL ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION)
CXXDEFS = $(CDEFS) CXXDEFS = $(CDEFS)
ifeq ($(HARDWARE_VARIANT), Teensy) ifeq ($(HARDWARE_VARIANT), Teensy)
CDEFS += -DUSB_SERIAL CDEFS += -DUSB_SERIAL
LIB_SRC += usb.c pins_teensy.c LIB_SRC += usb.c pins_teensy.c
LIB_CXXSRC += usb_api.cpp LIB_CXXSRC += usb_api.cpp
else ifeq ($(HARDWARE_VARIANT), archim) else ifeq ($(HARDWARE_VARIANT), archim)
CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT="Archim"' CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__
LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp PluggableUSB.cpp USBCore.cpp CDEFS += -DUSB_VID=0x27B1 -DUSB_PID=0x0001 -DUSBCON
CDEFS += '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"'
LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp \
UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp \
PluggableUSB.cpp USBCore.cpp
LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c
ifeq ($(U8GLIB), 1) ifeq ($(U8GLIB), 1)
@ -721,16 +812,20 @@ CTUNING = -fsigned-char -funsigned-bitfields -fno-exceptions \
ifneq ($(HARDWARE_MOTHERBOARD),) ifneq ($(HARDWARE_MOTHERBOARD),)
CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD} CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD}
endif endif
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) #CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti
CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD) CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD)
CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD) CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD)
ASFLAGS := $(CDEFS) ASFLAGS := $(CDEFS)
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs #ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
ifeq ($(HARDWARE_VARIANT), archim) ifeq ($(HARDWARE_VARIANT), archim)
LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align
LD_SUFFIX = $(LDLIBS) LD_SUFFIX = $(LDLIBS)
LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid
LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty
LDFLAGS += -u _lseek -u _read -u _write -u _exit -u kill -u _getpid
else else
LD_PREFIX = -Wl,--gc-sections,--relax LD_PREFIX = -Wl,--gc-sections,--relax
LDFLAGS = -lm LDFLAGS = -lm
@ -746,7 +841,7 @@ else
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
endif endif
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \ AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
-p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ -p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
-b$(UPLOAD_RATE) -b$(UPLOAD_RATE)
# Since Marlin 2.0, the source files may be distributed into several # Since Marlin 2.0, the source files may be distributed into several
@ -847,7 +942,7 @@ extcoff: $(TARGET).elf
.elf.eep: .elf.eep:
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
# Create extended listing file from ELF output file. # Create extended listing file from ELF output file.
.elf.lss: .elf.lss:
@ -861,7 +956,7 @@ extcoff: $(TARGET).elf
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h $(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
$(Pecho) " CXX $@" $(Pecho) " CXX $@"
$P $(CC) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) $P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
# Object files that were found in "src" will be stored in $(BUILD_DIR) # Object files that were found in "src" will be stored in $(BUILD_DIR)
# in directories that mirror the structure of "src" # in directories that mirror the structure of "src"

View file

@ -28,7 +28,7 @@
/** /**
* Marlin release version identifier * Marlin release version identifier
*/ */
//#define SHORT_BUILD_VERSION "2.0.6.1" //#define SHORT_BUILD_VERSION "2.0.7.2"
/** /**
* Verbose version identifier which should contain a reference to the location * Verbose version identifier which should contain a reference to the location

View file

@ -15,6 +15,7 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
#pragma once #pragma once
@ -24,7 +25,7 @@
#include "watchdog.h" #include "watchdog.h"
#include "math.h" #include "math.h"
#ifdef USBCON #ifdef IS_AT90USB
#include <HardwareSerial.h> #include <HardwareSerial.h>
#else #else
#define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion #define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion
@ -80,55 +81,30 @@ typedef int8_t pin_t;
//extern uint8_t MCUSR; //extern uint8_t MCUSR;
// Serial ports // Serial ports
#ifdef USBCON #ifdef IS_AT90USB
#if ENABLED(BLUETOOTH) #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial)
#define MYSERIAL0 bluetoothSerial
#else
#define MYSERIAL0 Serial
#endif
#define NUM_SERIAL 1
#else #else
#if !WITHIN(SERIAL_PORT, -1, 3) #if !WITHIN(SERIAL_PORT, -1, 3)
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#define MYSERIAL0 customizedSerial1 #define MYSERIAL0 customizedSerial1
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if !WITHIN(SERIAL_PORT_2, -1, 3) #if !WITHIN(SERIAL_PORT_2, -1, 3)
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
#elif SERIAL_PORT_2 == SERIAL_PORT
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
#endif #endif
#define MYSERIAL1 customizedSerial2 #define MYSERIAL1 customizedSerial2
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif #endif
#endif #endif
#ifdef DGUS_SERIAL_PORT #ifdef LCD_SERIAL_PORT
#if !WITHIN(DGUS_SERIAL_PORT, -1, 3) #if !WITHIN(LCD_SERIAL_PORT, -1, 3)
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
#elif DGUS_SERIAL_PORT == SERIAL_PORT
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration."
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
#endif #endif
#define DGUS_SERIAL internalDgusSerial #define LCD_SERIAL lcdSerial
#if HAS_DGUS_LCD
#define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
#endif
#ifdef ANYCUBIC_LCD_SERIAL_PORT
#if !WITHIN(ANYCUBIC_LCD_SERIAL_PORT, -1, 3)
#error "ANYCUBIC_LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
#elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT
#error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration."
#elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2
#error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
#endif #endif
#define ANYCUBIC_LCD_SERIAL anycubicLcdSerial
#endif #endif
// ------------------------ // ------------------------
@ -144,6 +120,8 @@ void HAL_init();
inline void HAL_clear_reset_source() { MCUSR = 0; } inline void HAL_clear_reset_source() { MCUSR = 0; }
inline uint8_t HAL_get_reset_source() { return MCUSR; } inline uint8_t HAL_get_reset_source() { return MCUSR; }
inline void HAL_reboot() {} // reboot the board or restart the bootloader
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
extern "C" { extern "C" {

File diff suppressed because it is too large Load diff

View file

@ -48,11 +48,11 @@
// These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor // These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor
// requires two levels of indirection to expand macro values properly) // requires two levels of indirection to expand macro values properly)
#define SERIAL_REGNAME(registerbase,number,suffix) SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) #define SERIAL_REGNAME(registerbase,number,suffix) _SERIAL_REGNAME(registerbase,number,suffix)
#if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary #if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary
#define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##suffix #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##suffix
#else #else
#define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##number##suffix #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##number##suffix
#endif #endif
// Registers used by MarlinSerial class (expanded depending on selected serial port) // Registers used by MarlinSerial class (expanded depending on selected serial port)
@ -217,10 +217,12 @@
static ring_buffer_pos_t available(); static ring_buffer_pos_t available();
static void write(const uint8_t c); static void write(const uint8_t c);
static void flushTX(); static void flushTX();
#ifdef DGUS_SERIAL_PORT #if HAS_DGUS_LCD
static ring_buffer_pos_t get_tx_buffer_free(); static ring_buffer_pos_t get_tx_buffer_free();
#endif #endif
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
@ -278,58 +280,53 @@
#endif // !USBCON #endif // !USBCON
#ifdef INTERNAL_SERIAL_PORT #ifdef MMU2_SERIAL_PORT
template <uint8_t serial> template <uint8_t serial>
struct MarlinInternalSerialCfg { struct MMU2SerialCfg {
static constexpr int PORT = serial; static constexpr int PORT = serial;
static constexpr bool XONOFF = false;
static constexpr bool EMERGENCYPARSER = false;
static constexpr bool DROPPED_RX = false;
static constexpr bool RX_FRAMING_ERRORS = false;
static constexpr bool MAX_RX_QUEUED = false;
static constexpr unsigned int RX_SIZE = 32; static constexpr unsigned int RX_SIZE = 32;
static constexpr unsigned int TX_SIZE = 32; static constexpr unsigned int TX_SIZE = 32;
static constexpr bool XONOFF = false;
static constexpr bool EMERGENCYPARSER = false;
static constexpr bool DROPPED_RX = false;
static constexpr bool RX_OVERRUNS = false; static constexpr bool RX_OVERRUNS = false;
static constexpr bool RX_FRAMING_ERRORS = false;
static constexpr bool MAX_RX_QUEUED = false;
}; };
extern MarlinSerial<MarlinInternalSerialCfg<INTERNAL_SERIAL_PORT>> internalSerial; extern MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>> mmuSerial;
#endif #endif
#ifdef DGUS_SERIAL_PORT #ifdef LCD_SERIAL_PORT
template <uint8_t serial> template <uint8_t serial>
struct MarlinInternalSerialCfg { struct LCDSerialCfg {
static constexpr int PORT = serial; static constexpr int PORT = serial;
static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; static constexpr bool XONOFF = false;
static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
static constexpr bool XONOFF = false; static constexpr bool DROPPED_RX = false;
static constexpr bool EMERGENCYPARSER = false; static constexpr bool RX_FRAMING_ERRORS = false;
static constexpr bool DROPPED_RX = false; static constexpr bool MAX_RX_QUEUED = false;
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS); #if HAS_DGUS_LCD
static constexpr bool RX_FRAMING_ERRORS = false; static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE;
static constexpr bool MAX_RX_QUEUED = false; static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE;
static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS);
#elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON)
static constexpr unsigned int RX_SIZE = 64;
static constexpr unsigned int TX_SIZE = 128;
static constexpr bool RX_OVERRUNS = false;
#else
static constexpr unsigned int RX_SIZE = 64;
static constexpr unsigned int TX_SIZE = 128;
static constexpr bool RX_OVERRUNS = false
#endif
}; };
extern MarlinSerial<MarlinInternalSerialCfg<DGUS_SERIAL_PORT>> internalDgusSerial; extern MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>> lcdSerial;
#endif
#ifdef ANYCUBIC_LCD_SERIAL_PORT
template <uint8_t serial>
struct AnycubicLcdSerialCfg {
static constexpr int PORT = serial;
static constexpr unsigned int RX_SIZE = 64;
static constexpr unsigned int TX_SIZE = 128;
static constexpr bool XONOFF = false;
static constexpr bool EMERGENCYPARSER = false;
static constexpr bool DROPPED_RX = false;
static constexpr bool RX_OVERRUNS = false;
static constexpr bool RX_FRAMING_ERRORS = false;
static constexpr bool MAX_RX_QUEUED = false;
};
extern MarlinSerial<AnycubicLcdSerialCfg<ANYCUBIC_LCD_SERIAL_PORT>> anycubicLcdSerial;
#endif #endif
// Use the UART for Bluetooth in AT90USB configurations // Use the UART for Bluetooth in AT90USB configurations
#if defined(USBCON) && ENABLED(BLUETOOTH) #if BOTH(IS_AT90USB, BLUETOOTH)
extern HardwareSerial bluetoothSerial; extern HardwareSerial bluetoothSerial;
#endif #endif

View file

@ -48,7 +48,6 @@
* readMicroseconds() - Get the last-written servo pulse width in microseconds. * readMicroseconds() - Get the last-written servo pulse width in microseconds.
* attached() - Return true if a servo is attached. * attached() - Return true if a servo is attached.
* detach() - Stop an attached servo from pulsing its i/o pin. * detach() - Stop an attached servo from pulsing its i/o pin.
*
*/ */
#ifdef __AVR__ #ifdef __AVR__

View file

@ -185,8 +185,8 @@ void set_pwm_frequency(const pin_t pin, int f_desired) {
res_temp_phase_correct = rtf / 2; res_temp_phase_correct = rtf / 2;
} }
LIMIT(res_temp_fast, 1u, size); LIMIT(res_temp_fast, 1U, size);
LIMIT(res_temp_phase_correct, 1u, size); LIMIT(res_temp_phase_correct, 1U, size);
// 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 int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)),
f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct), f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct),

View file

@ -29,11 +29,17 @@
#include <avr/io.h> #include <avr/io.h>
#define AVR_AT90USB1286_FAMILY (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)) #if defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)
#define AVR_ATmega1284_FAMILY (defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)) #define AVR_AT90USB1286_FAMILY 1
#define AVR_ATmega2560_FAMILY (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)) #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
#define AVR_ATmega2561_FAMILY (defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)) #define AVR_ATmega1284_FAMILY 1
#define AVR_ATmega328_FAMILY (defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)) #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define AVR_ATmega2560_FAMILY 1
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
#define AVR_ATmega2561_FAMILY 1
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
#define AVR_ATmega328_FAMILY 1
#endif
/** /**
* Include Ports and Functions * Include Ports and Functions

View file

@ -26,7 +26,9 @@
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
#define AVR_ATmega2560_FAMILY_PLUS_70 MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H) #if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
#define AVR_ATmega2560_FAMILY_PLUS_70 1
#endif
#if AVR_AT90USB1286_FAMILY #if AVR_AT90USB1286_FAMILY

View file

@ -22,15 +22,12 @@
* Structures for 2560 family boards that use more than 70 pins * Structures for 2560 family boards that use more than 70 pins
*/ */
#undef NUM_DIGITAL_PINS #if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
#if MB(BQ_ZUM_MEGA_3D) #undef NUM_DIGITAL_PINS
#define NUM_DIGITAL_PINS 85 #define NUM_DIGITAL_PINS 85
#elif MB(MIGHTYBOARD_REVE) #elif MB(MIGHTYBOARD_REVE)
#undef NUM_DIGITAL_PINS
#define NUM_DIGITAL_PINS 80 #define NUM_DIGITAL_PINS 80
#elif MB(MINIRAMBO)
#define NUM_DIGITAL_PINS 85
#elif MB(SCOOVO_X9H)
#define NUM_DIGITAL_PINS 85
#endif #endif
#define PA 1 #define PA 1

View file

@ -15,6 +15,7 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
#pragma once #pragma once

View file

@ -57,7 +57,7 @@
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
#include "../shared/Marduino.h" #include "../shared/Marduino.h"
#include "../shared/Delay.h" #include "../shared/Delay.h"
@ -189,5 +189,5 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View file

@ -19,9 +19,7 @@
*/ */
/** /**
* Description: 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

View file

@ -22,9 +22,7 @@
#pragma once #pragma once
/** /**
* Description: HAL for Arduino Due and compatible (SAM3X8E) * HAL for Arduino Due and compatible (SAM3X8E)
*
* For ARDUINO_ARCH_SAM
*/ */
#define CPU_32_BIT #define CPU_32_BIT
@ -38,59 +36,36 @@
#include <stdint.h> #include <stdint.h>
#define _MSERIAL(X) Serial##X
#define MSERIAL(X) _MSERIAL(X)
#define Serial0 Serial
// Define MYSERIAL0/1 before MarlinSerial includes! // Define MYSERIAL0/1 before MarlinSerial includes!
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) #if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
#define MYSERIAL0 customizedSerial1 #define MYSERIAL0 customizedSerial1
#elif SERIAL_PORT == 0 #elif WITHIN(SERIAL_PORT, 0, 3)
#define MYSERIAL0 Serial #define MYSERIAL0 MSERIAL(SERIAL_PORT)
#elif SERIAL_PORT == 1
#define MYSERIAL0 Serial1
#elif SERIAL_PORT == 2
#define MYSERIAL0 Serial2
#elif SERIAL_PORT == 3
#define MYSERIAL0 Serial3
#else #else
#error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if SERIAL_PORT_2 == SERIAL_PORT #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
#error "SERIAL_PORT_2 must be different from SERIAL_PORT. Please update your configuration."
#elif SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
#define MYSERIAL1 customizedSerial2 #define MYSERIAL1 customizedSerial2
#elif SERIAL_PORT_2 == 0 #elif WITHIN(SERIAL_PORT_2, 0, 3)
#define MYSERIAL1 Serial #define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
#elif SERIAL_PORT_2 == 1
#define MYSERIAL1 Serial1
#elif SERIAL_PORT_2 == 2
#define MYSERIAL1 Serial2
#elif SERIAL_PORT_2 == 3
#define MYSERIAL1 Serial3
#else #else
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
#endif #endif
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif #endif
#ifdef DGUS_SERIAL_PORT #ifdef LCD_SERIAL_PORT
#if DGUS_SERIAL_PORT == SERIAL_PORT #if LCD_SERIAL_PORT == -1
#error "DGUS_SERIAL_PORT must be different from SERIAL_PORT. Please update your configuration." #define LCD_SERIAL lcdSerial
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 #elif WITHIN(LCD_SERIAL_PORT, 0, 3)
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
#elif DGUS_SERIAL_PORT == -1
#define DGUS_SERIAL internalDgusSerial
#elif DGUS_SERIAL_PORT == 0
#define DGUS_SERIAL Serial
#elif DGUS_SERIAL_PORT == 1
#define DGUS_SERIAL Serial1
#elif DGUS_SERIAL_PORT == 2
#define DGUS_SERIAL Serial2
#elif DGUS_SERIAL_PORT == 3
#define DGUS_SERIAL Serial3
#else #else
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#endif #endif
@ -130,13 +105,15 @@ void sei(); // Enable interrupts
void HAL_clear_reset_source(); // clear reset reason void HAL_clear_reset_source(); // clear reset reason
uint8_t HAL_get_reset_source(); // get reset reason uint8_t HAL_get_reset_source(); // get reset reason
inline void HAL_reboot() {} // reboot the board or restart the bootloader
// //
// ADC // ADC
// //
extern uint16_t HAL_adc_result; // result of last ADC conversion extern uint16_t HAL_adc_result; // result of last ADC conversion
#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) #define HAL_ANALOG_SELECT(ch)

View file

@ -30,7 +30,7 @@
*/ */
/** /**
* Description: HAL for Arduino Due and compatible (SAM3X8E) * HAL for Arduino Due and compatible (SAM3X8E)
* *
* For ARDUINO_ARCH_SAM * For ARDUINO_ARCH_SAM
*/ */
@ -595,7 +595,7 @@
SPI_Enable(SPI0); SPI_Enable(SPI0);
SET_OUTPUT(DAC0_SYNC); SET_OUTPUT(DAC0_SYNC);
#if EXTRUDERS > 1 #if HAS_MULTI_EXTRUDER
SET_OUTPUT(DAC1_SYNC); SET_OUTPUT(DAC1_SYNC);
WRITE(DAC1_SYNC, HIGH); WRITE(DAC1_SYNC, HIGH);
#endif #endif
@ -759,7 +759,6 @@
* *
* All of the above can be avoided by defining FORCE_SOFT_SPI to force the * All of the above can be avoided by defining FORCE_SOFT_SPI to force the
* display to use software SPI. * display to use software SPI.
*
*/ */
void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified) void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified)

View file

@ -122,6 +122,8 @@ public:
static void write(const uint8_t c); static void write(const uint8_t c);
static void flushTX(); static void flushTX();
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }

View file

@ -52,14 +52,13 @@
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/ */
#ifdef __SAM3X8E__ #ifdef __SAM3X8E__
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
#include <U8glib.h> #include <U8glib.h>
@ -145,6 +144,6 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
#endif //__SAM3X8E__ #endif // __SAM3X8E__

View file

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920) #if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#undef SPI_SPEED #undef SPI_SPEED
#define SPI_SPEED 2 // About 2 MHz #define SPI_SPEED 2 // About 2 MHz
@ -144,5 +144,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920 #endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View file

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
#include "../../shared/Delay.h" #include "../../shared/Delay.h"
@ -108,5 +108,5 @@ void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
} }
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View file

@ -53,7 +53,6 @@
* per page. We can't emulate EE endurance with FLASH for all * per page. We can't emulate EE endurance with FLASH for all
* bytes, but we can emulate endurance for a given percent of * bytes, but we can emulate endurance for a given percent of
* bytes. * bytes.
*
*/ */
//#define EE_EMU_DEBUG //#define EE_EMU_DEBUG
@ -61,7 +60,7 @@
#define EEPROMSize 4096 #define EEPROMSize 4096
#define PagesPerGroup 128 #define PagesPerGroup 128
#define GroupCount 2 #define GroupCount 2
#define PageSize 256u #define PageSize 256U
/* Flash storage */ /* Flash storage */
typedef struct FLASH_SECTOR { typedef struct FLASH_SECTOR {

View file

@ -154,7 +154,7 @@ void Stepper::digipot_init() {
NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals) NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals)
} }
void Stepper::digipot_current(const uint8_t driver, const int16_t current) { void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) {
if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed

View file

@ -179,5 +179,4 @@ void pwm_details(int32_t pin) {
* ----------------+-------- * ----------------+--------
* ID | PB11 * ID | PB11
* VBOF | PB10 * VBOF | PB10
*
*/ */

View file

@ -21,9 +21,7 @@
*/ */
/** /**
* Description: HAL for Arduino Due and compatible (SAM3X8E) * HAL Timers for Arduino Due and compatible (SAM3X8E)
*
* For ARDUINO_ARCH_SAM
*/ */
#ifdef ARDUINO_ARCH_SAM #ifdef ARDUINO_ARCH_SAM

View file

@ -21,9 +21,7 @@
#pragma once #pragma once
/** /**
* HAL for Arduino Due and compatible (SAM3X8E) * HAL Timers for Arduino Due and compatible (SAM3X8E)
*
* For ARDUINO_ARCH_SAM
*/ */
#include <stdint.h> #include <stdint.h>

View file

@ -14,5 +14,5 @@ if current_OS == 'Windows':
# 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" UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
) )

View file

@ -173,11 +173,11 @@
# define __always_inline __forceinline # define __always_inline __forceinline
#elif (defined __GNUC__) #elif (defined __GNUC__)
#ifdef __always_inline #ifdef __always_inline
# undef __always_inline # undef __always_inline
#endif #endif
# define __always_inline inline __attribute__((__always_inline__)) # define __always_inline inline __attribute__((__always_inline__))
#elif (defined __ICCARM__) #elif (defined __ICCARM__)
# define __always_inline _Pragma("inline=forced") # define __always_inline _Pragma("inline=forced")
#endif #endif
/** /**
@ -188,11 +188,11 @@
* heuristics and not inline the function. * heuristics and not inline the function.
*/ */
#ifdef __CC_ARM #ifdef __CC_ARM
# define __no_inline __attribute__((noinline)) # define __no_inline __attribute__((noinline))
#elif (defined __GNUC__) #elif (defined __GNUC__)
# define __no_inline __attribute__((__noinline__)) # define __no_inline __attribute__((__noinline__))
#elif (defined __ICCARM__) #elif (defined __ICCARM__)
# define __no_inline _Pragma("inline=never") # define __no_inline _Pragma("inline=never")
#endif #endif
/*! \brief This macro is used to test fatal errors. /*! \brief This macro is used to test fatal errors.
@ -211,9 +211,9 @@
# else # else
#undef TEST_SUITE_DEFINE_ASSERT_MACRO #undef TEST_SUITE_DEFINE_ASSERT_MACRO
# define Assert(expr) \ # define Assert(expr) \
{\ {\
if (!(expr)) while (true);\ if (!(expr)) while (true);\
} }
# endif # endif
#else #else
# define Assert(expr) ((void) 0) # define Assert(expr) ((void) 0)
@ -609,37 +609,37 @@ typedef struct
# define clz(u) ((u) ? __CLZ(u) : 32) # define clz(u) ((u) ? __CLZ(u) : 32)
#else #else
# define clz(u) (((u) == 0) ? 32 : \ # define clz(u) (((u) == 0) ? 32 : \
((u) & (1ul << 31)) ? 0 : \ ((u) & (1UL << 31)) ? 0 : \
((u) & (1ul << 30)) ? 1 : \ ((u) & (1UL << 30)) ? 1 : \
((u) & (1ul << 29)) ? 2 : \ ((u) & (1UL << 29)) ? 2 : \
((u) & (1ul << 28)) ? 3 : \ ((u) & (1UL << 28)) ? 3 : \
((u) & (1ul << 27)) ? 4 : \ ((u) & (1UL << 27)) ? 4 : \
((u) & (1ul << 26)) ? 5 : \ ((u) & (1UL << 26)) ? 5 : \
((u) & (1ul << 25)) ? 6 : \ ((u) & (1UL << 25)) ? 6 : \
((u) & (1ul << 24)) ? 7 : \ ((u) & (1UL << 24)) ? 7 : \
((u) & (1ul << 23)) ? 8 : \ ((u) & (1UL << 23)) ? 8 : \
((u) & (1ul << 22)) ? 9 : \ ((u) & (1UL << 22)) ? 9 : \
((u) & (1ul << 21)) ? 10 : \ ((u) & (1UL << 21)) ? 10 : \
((u) & (1ul << 20)) ? 11 : \ ((u) & (1UL << 20)) ? 11 : \
((u) & (1ul << 19)) ? 12 : \ ((u) & (1UL << 19)) ? 12 : \
((u) & (1ul << 18)) ? 13 : \ ((u) & (1UL << 18)) ? 13 : \
((u) & (1ul << 17)) ? 14 : \ ((u) & (1UL << 17)) ? 14 : \
((u) & (1ul << 16)) ? 15 : \ ((u) & (1UL << 16)) ? 15 : \
((u) & (1ul << 15)) ? 16 : \ ((u) & (1UL << 15)) ? 16 : \
((u) & (1ul << 14)) ? 17 : \ ((u) & (1UL << 14)) ? 17 : \
((u) & (1ul << 13)) ? 18 : \ ((u) & (1UL << 13)) ? 18 : \
((u) & (1ul << 12)) ? 19 : \ ((u) & (1UL << 12)) ? 19 : \
((u) & (1ul << 11)) ? 20 : \ ((u) & (1UL << 11)) ? 20 : \
((u) & (1ul << 10)) ? 21 : \ ((u) & (1UL << 10)) ? 21 : \
((u) & (1ul << 9)) ? 22 : \ ((u) & (1UL << 9)) ? 22 : \
((u) & (1ul << 8)) ? 23 : \ ((u) & (1UL << 8)) ? 23 : \
((u) & (1ul << 7)) ? 24 : \ ((u) & (1UL << 7)) ? 24 : \
((u) & (1ul << 6)) ? 25 : \ ((u) & (1UL << 6)) ? 25 : \
((u) & (1ul << 5)) ? 26 : \ ((u) & (1UL << 5)) ? 26 : \
((u) & (1ul << 4)) ? 27 : \ ((u) & (1UL << 4)) ? 27 : \
((u) & (1ul << 3)) ? 28 : \ ((u) & (1UL << 3)) ? 28 : \
((u) & (1ul << 2)) ? 29 : \ ((u) & (1UL << 2)) ? 29 : \
((u) & (1ul << 1)) ? 30 : \ ((u) & (1UL << 1)) ? 30 : \
31) 31)
#endif #endif
#endif #endif
@ -654,38 +654,38 @@ typedef struct
#if (defined __GNUC__) || (defined __CC_ARM) #if (defined __GNUC__) || (defined __CC_ARM)
# define ctz(u) ((u) ? __builtin_ctz(u) : 32) # define ctz(u) ((u) ? __builtin_ctz(u) : 32)
#else #else
# define ctz(u) ((u) & (1ul << 0) ? 0 : \ # define ctz(u) ((u) & (1UL << 0) ? 0 : \
(u) & (1ul << 1) ? 1 : \ (u) & (1UL << 1) ? 1 : \
(u) & (1ul << 2) ? 2 : \ (u) & (1UL << 2) ? 2 : \
(u) & (1ul << 3) ? 3 : \ (u) & (1UL << 3) ? 3 : \
(u) & (1ul << 4) ? 4 : \ (u) & (1UL << 4) ? 4 : \
(u) & (1ul << 5) ? 5 : \ (u) & (1UL << 5) ? 5 : \
(u) & (1ul << 6) ? 6 : \ (u) & (1UL << 6) ? 6 : \
(u) & (1ul << 7) ? 7 : \ (u) & (1UL << 7) ? 7 : \
(u) & (1ul << 8) ? 8 : \ (u) & (1UL << 8) ? 8 : \
(u) & (1ul << 9) ? 9 : \ (u) & (1UL << 9) ? 9 : \
(u) & (1ul << 10) ? 10 : \ (u) & (1UL << 10) ? 10 : \
(u) & (1ul << 11) ? 11 : \ (u) & (1UL << 11) ? 11 : \
(u) & (1ul << 12) ? 12 : \ (u) & (1UL << 12) ? 12 : \
(u) & (1ul << 13) ? 13 : \ (u) & (1UL << 13) ? 13 : \
(u) & (1ul << 14) ? 14 : \ (u) & (1UL << 14) ? 14 : \
(u) & (1ul << 15) ? 15 : \ (u) & (1UL << 15) ? 15 : \
(u) & (1ul << 16) ? 16 : \ (u) & (1UL << 16) ? 16 : \
(u) & (1ul << 17) ? 17 : \ (u) & (1UL << 17) ? 17 : \
(u) & (1ul << 18) ? 18 : \ (u) & (1UL << 18) ? 18 : \
(u) & (1ul << 19) ? 19 : \ (u) & (1UL << 19) ? 19 : \
(u) & (1ul << 20) ? 20 : \ (u) & (1UL << 20) ? 20 : \
(u) & (1ul << 21) ? 21 : \ (u) & (1UL << 21) ? 21 : \
(u) & (1ul << 22) ? 22 : \ (u) & (1UL << 22) ? 22 : \
(u) & (1ul << 23) ? 23 : \ (u) & (1UL << 23) ? 23 : \
(u) & (1ul << 24) ? 24 : \ (u) & (1UL << 24) ? 24 : \
(u) & (1ul << 25) ? 25 : \ (u) & (1UL << 25) ? 25 : \
(u) & (1ul << 26) ? 26 : \ (u) & (1UL << 26) ? 26 : \
(u) & (1ul << 27) ? 27 : \ (u) & (1UL << 27) ? 27 : \
(u) & (1ul << 28) ? 28 : \ (u) & (1UL << 28) ? 28 : \
(u) & (1ul << 29) ? 29 : \ (u) & (1UL << 29) ? 29 : \
(u) & (1ul << 30) ? 30 : \ (u) & (1UL << 30) ? 30 : \
(u) & (1ul << 31) ? 31 : \ (u) & (1UL << 31) ? 31 : \
32) 32)
#endif #endif
#endif #endif
@ -1106,17 +1106,16 @@ static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data)
/* Converts a 8 Byte array into a 32-Bit value */ /* Converts a 8 Byte array into a 32-Bit value */
static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data) static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data)
{ {
union union
{ {
uint32_t u32; uint32_t u32;
uint8_t u8[8]; uint8_t u8[8];
}long_addr; }long_addr;
uint8_t index; uint8_t index;
for (index = 0; index < 4; index++) for (index = 0; index < 4; index++) {
{ long_addr.u8[index] = *data++;
long_addr.u8[index] = *data++; }
} return long_addr.u32;
return long_addr.u32;
} }
/** /**

View file

@ -15,11 +15,12 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
#pragma once #pragma once
/** /**
* Description: HAL for Espressif ESP32 WiFi * HAL for Espressif ESP32 WiFi
*/ */
#define CPU_32_BIT #define CPU_32_BIT
@ -58,9 +59,6 @@ extern portMUX_TYPE spinlock;
#else #else
#define MYSERIAL1 webSocketSerial #define MYSERIAL1 webSocketSerial
#endif #endif
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif #endif
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock) #define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock)
@ -98,6 +96,8 @@ void HAL_clear_reset_source();
// reset reason // reset reason
uint8_t HAL_get_reset_source(); uint8_t HAL_get_reset_source();
inline void HAL_reboot() {} // reboot the board or restart the bootloader
void _delay_ms(int delay); void _delay_ms(int delay);
#pragma GCC diagnostic push #pragma GCC diagnostic push
@ -157,14 +157,14 @@ FORCE_INLINE static void DELAY_CYCLES(uint32_t x) {
if (stop >= start) { if (stop >= start) {
// no overflow, so only loop while in between start and stop: // no overflow, so only loop while in between start and stop:
// 0x00000000 -----------------start****stop-- 0xffffffff // 0x00000000 -----------------start****stop-- 0xFFFFFFFF
while (ccount >= start && ccount < stop) { while (ccount >= start && ccount < stop) {
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
} }
} }
else { else {
// stop did overflow, so only loop while outside of stop and start: // stop did overflow, so only loop while outside of stop and start:
// 0x00000000 **stop-------------------start** 0xffffffff // 0x00000000 **stop-------------------start** 0xFFFFFFFF
while (ccount >= start || ccount < stop) { while (ccount >= start || ccount < stop) {
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
} }

View file

@ -86,7 +86,7 @@ int RingBuffer::read() {
ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) { ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) {
ring_buffer_pos_t len = available(); ring_buffer_pos_t len = available();
for(ring_buffer_pos_t i = 0; read_index != write_index; i++) { for (ring_buffer_pos_t i = 0; read_index != write_index; i++) {
buffer[i] = data[read_index]; buffer[i] = data[read_index];
read_index = NEXT_INDEX(read_index, size); read_index = NEXT_INDEX(read_index, size);
} }
@ -139,9 +139,8 @@ size_t WebSocketSerial::write(const uint8_t c) {
size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) {
size_t written = 0; size_t written = 0;
for(size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++)
written += write(buffer[i]); written += write(buffer[i]);
}
return written; return written;
} }

View file

@ -15,6 +15,7 @@
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/ */
#pragma once #pragma once

View file

@ -25,10 +25,16 @@
#include HAL_PATH(.,HAL.h) #include HAL_PATH(.,HAL.h)
#ifdef SERIAL_PORT_2
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif
#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION)
#ifndef I2C_ADDRESS #ifndef I2C_ADDRESS
#define I2C_ADDRESS(A) (A) #define I2C_ADDRESS(A) uint8_t(A)
#endif #endif
// Needed for AVR sprintf_P PROGMEM extension // Needed for AVR sprintf_P PROGMEM extension

View file

@ -62,7 +62,6 @@ uint8_t _getc();
extern HalSerial usb_serial; extern HalSerial usb_serial;
#define MYSERIAL0 usb_serial #define MYSERIAL0 usb_serial
#define NUM_SERIAL 1
#define ST7920_DELAY_1 DELAY_NS(600) #define ST7920_DELAY_1 DELAY_NS(600)
#define ST7920_DELAY_2 DELAY_NS(750) #define ST7920_DELAY_2 DELAY_NS(750)
@ -102,6 +101,8 @@ uint16_t HAL_adc_get_result();
inline void HAL_clear_reset_source(void) {} inline void HAL_clear_reset_source(void) {}
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
inline void HAL_reboot() {} // reboot the board or restart the bootloader
/* ---------------- Delay in cycles */ /* ---------------- Delay in cycles */
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
Clock::delayCycles(x); Clock::delayCycles(x);

View file

@ -33,7 +33,6 @@
* Generic RingBuffer * Generic RingBuffer
* T type of the buffer array * T type of the buffer array
* S size of the buffer (must be power of 2) * S size of the buffer (must be power of 2)
*
*/ */
template <typename T, uint32_t S> class RingBuffer { template <typename T, uint32_t S> class RingBuffer {
public: public:
@ -79,6 +78,7 @@ public:
#if ENABLED(EMERGENCY_PARSER) #if ENABLED(EMERGENCY_PARSER)
EmergencyParser::State emergency_state; EmergencyParser::State emergency_state;
static inline bool emergency_parser_enabled() { return true; }
#endif #endif
HalSerial() { host_connected = true; } HalSerial() { host_connected = true; }

View file

@ -107,7 +107,7 @@ int main() {
std::thread write_serial (write_serial_thread); std::thread write_serial (write_serial_thread);
std::thread read_serial (read_serial_thread); std::thread read_serial (read_serial_thread);
#if NUM_SERIAL > 0 #ifdef MYSERIAL0
MYSERIAL0.begin(BAUDRATE); MYSERIAL0.begin(BAUDRATE);
SERIAL_ECHOLNPGM("x86_64 Initialized"); SERIAL_ECHOLNPGM("x86_64 Initialized");
SERIAL_FLUSHTX(); SERIAL_FLUSHTX();

View file

@ -45,7 +45,6 @@
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
* *
* The only modification was to update/delete macros to match the LPC176x. * The only modification was to update/delete macros to match the LPC176x.
*
*/ */
#include <stdint.h> #include <stdint.h>

View file

@ -24,7 +24,7 @@
#include "../../core/macros.h" #include "../../core/macros.h"
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#if BOTH(HAS_GRAPHICAL_LCD, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) #if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently #define LPC_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

View file

@ -63,58 +63,35 @@ extern "C" volatile uint32_t _millis;
#define ST7920_DELAY_3 DELAY_NS(750) #define ST7920_DELAY_3 DELAY_NS(750)
#endif #endif
#define _MSERIAL(X) MSerial##X
#define MSERIAL(X) _MSERIAL(X)
#define MSerial0 MSerial
#if SERIAL_PORT == -1 #if SERIAL_PORT == -1
#define MYSERIAL0 UsbSerial #define MYSERIAL0 UsbSerial
#elif SERIAL_PORT == 0 #elif WITHIN(SERIAL_PORT, 0, 3)
#define MYSERIAL0 MSerial #define MYSERIAL0 MSERIAL(SERIAL_PORT)
#elif SERIAL_PORT == 1
#define MYSERIAL0 MSerial1
#elif SERIAL_PORT == 2
#define MYSERIAL0 MSerial2
#elif SERIAL_PORT == 3
#define MYSERIAL0 MSerial3
#else #else
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if SERIAL_PORT_2 == SERIAL_PORT #if SERIAL_PORT_2 == -1
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
#elif SERIAL_PORT_2 == -1
#define MYSERIAL1 UsbSerial #define MYSERIAL1 UsbSerial
#elif SERIAL_PORT_2 == 0 #elif WITHIN(SERIAL_PORT_2, 0, 3)
#define MYSERIAL1 MSerial #define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
#elif SERIAL_PORT_2 == 1
#define MYSERIAL1 MSerial1
#elif SERIAL_PORT_2 == 2
#define MYSERIAL1 MSerial2
#elif SERIAL_PORT_2 == 3
#define MYSERIAL1 MSerial3
#else #else
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
#endif #endif
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif #endif
#ifdef DGUS_SERIAL_PORT #ifdef LCD_SERIAL_PORT
#if DGUS_SERIAL_PORT == SERIAL_PORT #if LCD_SERIAL_PORT == -1
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." #define LCD_SERIAL UsbSerial
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 #elif WITHIN(LCD_SERIAL_PORT, 0, 3)
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
#elif DGUS_SERIAL_PORT == -1
#define DGUS_SERIAL UsbSerial
#elif DGUS_SERIAL_PORT == 0
#define DGUS_SERIAL MSerial
#elif DGUS_SERIAL_PORT == 1
#define DGUS_SERIAL MSerial1
#elif DGUS_SERIAL_PORT == 2
#define DGUS_SERIAL MSerial2
#elif DGUS_SERIAL_PORT == 3
#define DGUS_SERIAL MSerial3
#else #else
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#endif #endif
@ -223,6 +200,8 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255,
void HAL_clear_reset_source(void); void HAL_clear_reset_source(void);
uint8_t HAL_get_reset_source(void); uint8_t HAL_get_reset_source(void);
inline void HAL_reboot() {} // reboot the board or restart the bootloader
// Add strcmp_P if missing // Add strcmp_P if missing
#ifndef strcmp_P #ifndef strcmp_P
#define strcmp_P(a, b) strcmp((a), (b)) #define strcmp_P(a, b) strcmp((a), (b))

View file

@ -39,10 +39,10 @@
* Some of the LCD interfaces/adapters result in the LCD SPI and the SD card * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card
* SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with
* WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is
* active. If any of these pins are shared then the software SPI must be used. * active. If any of these pins are shared then the software SPI must be used.
* *
* A more sophisticated hardware SPI can be found at the following link. This * A more sophisticated hardware SPI can be found at the following link.
* implementation has not been fully debugged. * This implementation has not been fully debugged.
* https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e
*/ */
@ -100,72 +100,25 @@
#else #else
// decide which HW SPI device to use
#ifndef LPC_HW_SPI_DEV
#if (SCK_PIN == P0_07 && MISO_PIN == P0_08 && MOSI_PIN == P0_09)
#define LPC_HW_SPI_DEV 1
#else
#if (SCK_PIN == P0_15 && MISO_PIN == P0_17 && MOSI_PIN == P0_18)
#define LPC_HW_SPI_DEV 0
#else
#error "Invalid pins selected for hardware SPI"
#endif
#endif
#endif
#if LPC_HW_SPI_DEV == 0
#define LPC_SSPn LPC_SSP0
#else
#define LPC_SSPn LPC_SSP1
#endif
void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0
PINSEL_CFG_Type PinCfg; // data structure to hold init values spiInit(SPI_SPEED);
PinCfg.Funcnum = 2;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = 0;
PinCfg.Pinnum = LPC176x::pin_bit(SCK_PIN);
PinCfg.Portnum = LPC176x::pin_port(SCK_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(SCK_PIN);
PinCfg.Pinnum = LPC176x::pin_bit(MISO_PIN);
PinCfg.Portnum = LPC176x::pin_port(MISO_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_INPUT(MISO_PIN);
PinCfg.Pinnum = LPC176x::pin_bit(MOSI_PIN);
PinCfg.Portnum = LPC176x::pin_port(MOSI_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(MOSI_PIN);
// divide PCLK by 2 for SSP0
CLKPWR_SetPCLKDiv(LPC_HW_SPI_DEV == 0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2);
spiInit(0);
SSP_Cmd(LPC_SSPn, ENABLE); // start SSP running
} }
void spiInit(uint8_t spiRate) { void spiInit(uint8_t spiRate) {
// table to convert Marlin spiRates (0-5 plus default) into bit rates #if MISO_PIN == BOARD_SPI1_MISO_PIN
uint32_t Marlin_speed[7]; // CPSR is always 2 SPI.setModule(1);
Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED #elif MISO_PIN == BOARD_SPI2_MISO_PIN
Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED SPI.setModule(2);
Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED #endif
Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED SPI.setDataSize(DATA_SIZE_8BIT);
Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 SPI.setDataMode(SPI_MODE0);
Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h SPI.setClock(SPISettings::spiRate2Clock(spiRate));
// setup for SPI mode SPI.begin();
SSP_CFG_Type HW_SPI_init; // data structure to hold init values
SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode
HW_SPI_init.ClockRate = Marlin_speed[_MIN(spiRate, 6)]; // put in the specified bit rate
HW_SPI_init.Mode |= SSP_CR1_SSP_EN;
SSP_Init(LPC_SSPn, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers
} }
static uint8_t doio(uint8_t b) { static uint8_t doio(uint8_t b) {
/* send and receive a single byte */ return SPI.transfer(b & 0x00FF) & 0x00FF;
SSP_SendData(LPC_SSPn, b & 0x00FF);
while (SSP_GetStatus(LPC_SSPn, SSP_STAT_BUSY)); // wait for it to finish
return SSP_ReceiveData(LPC_SSPn) & 0x00FF;
} }
void spiSend(uint8_t b) { doio(b); } void spiSend(uint8_t b) { doio(b); }
@ -217,63 +170,74 @@ static inline void waitSpiTxEnd(LPC_SSP_TypeDef *spi_d) {
while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0 while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0
} }
// Retain the pin init state of the SPI, to avoid init more than once,
// even if more instances of SPIClass exist
static bool spiInitialised[BOARD_NR_SPI] = { false };
SPIClass::SPIClass(uint8_t device) { SPIClass::SPIClass(uint8_t device) {
// Init things specific to each SPI device // Init things specific to each SPI device
// clock divider setup is a bit of hack, and needs to be improved at a later date. // clock divider setup is a bit of hack, and needs to be improved at a later date.
PINSEL_CFG_Type PinCfg; // data structure to hold init values
#if BOARD_NR_SPI >= 1 #if BOARD_NR_SPI >= 1
_settings[0].spi_d = LPC_SSP0; _settings[0].spi_d = LPC_SSP0;
// _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); _settings[0].dataMode = SPI_MODE0;
PinCfg.Funcnum = 2; _settings[0].dataSize = DATA_SIZE_8BIT;
PinCfg.OpenDrain = 0; _settings[0].clock = SPI_CLOCK_MAX;
PinCfg.Pinmode = 0; //_settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock);
PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_SCK_PIN);
PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_SCK_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(BOARD_SPI1_SCK_PIN);
PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MISO_PIN);
PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MISO_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_INPUT(BOARD_SPI1_MISO_PIN);
PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MOSI_PIN);
PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MOSI_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(BOARD_SPI1_MOSI_PIN);
#endif #endif
#if BOARD_NR_SPI >= 2 #if BOARD_NR_SPI >= 2
_settings[1].spi_d = LPC_SSP1; _settings[1].spi_d = LPC_SSP1;
// _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); _settings[1].dataMode = SPI_MODE0;
PinCfg.Funcnum = 2; _settings[1].dataSize = DATA_SIZE_8BIT;
PinCfg.OpenDrain = 0; _settings[1].clock = SPI_CLOCK_MAX;
PinCfg.Pinmode = 0; //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock);
PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_SCK_PIN);
PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_SCK_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(BOARD_SPI2_SCK_PIN);
PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MISO_PIN);
PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MISO_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_INPUT(BOARD_SPI2_MISO_PIN);
PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MOSI_PIN);
PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MOSI_PIN);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(BOARD_SPI2_MOSI_PIN);
#endif #endif
setModule(device); setModule(device);
/* Initialize GPDMA controller */ // Init the GPDMA controller
//TODO: call once in the constructor? or each time? // TODO: call once in the constructor? or each time?
GPDMA_Init(); GPDMA_Init();
} }
void SPIClass::begin() { void SPIClass::begin() {
// Init the SPI pins in the first begin call
if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) ||
(_currentSetting->spi_d == LPC_SSP1 && spiInitialised[1] == false)) {
pin_t sck, miso, mosi;
if (_currentSetting->spi_d == LPC_SSP0) {
sck = BOARD_SPI1_SCK_PIN;
miso = BOARD_SPI1_MISO_PIN;
mosi = BOARD_SPI1_MOSI_PIN;
spiInitialised[0] = true;
}
else if (_currentSetting->spi_d == LPC_SSP1) {
sck = BOARD_SPI2_SCK_PIN;
miso = BOARD_SPI2_MISO_PIN;
mosi = BOARD_SPI2_MOSI_PIN;
spiInitialised[1] = true;
}
PINSEL_CFG_Type PinCfg; // data structure to hold init values
PinCfg.Funcnum = 2;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = 0;
PinCfg.Pinnum = LPC176x::pin_bit(sck);
PinCfg.Portnum = LPC176x::pin_port(sck);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(sck);
PinCfg.Pinnum = LPC176x::pin_bit(miso);
PinCfg.Portnum = LPC176x::pin_port(miso);
PINSEL_ConfigPin(&PinCfg);
SET_INPUT(miso);
PinCfg.Pinnum = LPC176x::pin_bit(mosi);
PinCfg.Portnum = LPC176x::pin_port(mosi);
PINSEL_ConfigPin(&PinCfg);
SET_OUTPUT(mosi);
}
updateSettings(); updateSettings();
SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running
} }
@ -287,7 +251,7 @@ void SPIClass::beginTransaction(const SPISettings &cfg) {
} }
uint8_t SPIClass::transfer(const uint16_t b) { uint8_t SPIClass::transfer(const uint16_t b) {
/* send and receive a single byte */ // Send and receive a single byte
SSP_ReceiveData(_currentSetting->spi_d); // read any previous data SSP_ReceiveData(_currentSetting->spi_d); // read any previous data
SSP_SendData(_currentSetting->spi_d, b); SSP_SendData(_currentSetting->spi_d, b);
waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish
@ -295,8 +259,7 @@ uint8_t SPIClass::transfer(const uint16_t b) {
} }
uint16_t SPIClass::transfer16(const uint16_t data) { uint16_t SPIClass::transfer16(const uint16_t data) {
return (transfer((data >> 8) & 0xFF) << 8) return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF);
| (transfer(data & 0xFF) & 0xFF);
} }
void SPIClass::end() { void SPIClass::end() {
@ -320,7 +283,7 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) {
// Destination memory - Not used // Destination memory - Not used
GPDMACfg.DstMemAddr = 0; GPDMACfg.DstMemAddr = 0;
// Transfer size // Transfer size
GPDMACfg.TransferSize = (minc ? length : 1); GPDMACfg.TransferSize = length;
// Transfer width // Transfer width
GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE; GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE;
// Transfer type // Transfer type
@ -335,26 +298,24 @@ void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) {
// Enable dma on SPI // Enable dma on SPI
SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE); SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE);
// if minc=false, I'm repeating the same byte 'length' times, as I could not find yet how do GPDMA without memory increment // Only increase memory if minc is true
do { GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0);
// Setup channel with given parameter
GPDMA_Setup(&GPDMACfg);
// enabled dma // Setup channel with given parameter
GPDMA_ChannelCmd(0, ENABLE); GPDMA_Setup(&GPDMACfg);
// wait data transfer // Enable DMA
while (!GPDMA_IntGetStatus(GPDMA_STAT_INTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_INTERR, 0)) { } GPDMA_ChannelCmd(0, ENABLE);
// clear err and int // Wait for data transfer
GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { }
GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0);
// dma disable // Clear err and int
GPDMA_ChannelCmd(0, DISABLE); GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0);
GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0);
--length; // Disable DMA
} while (!minc && length > 0); GPDMA_ChannelCmd(0, DISABLE);
waitSpiTxEnd(_currentSetting->spi_d); waitSpiTxEnd(_currentSetting->spi_d);
@ -382,7 +343,7 @@ void SPIClass::setBitOrder(uint8_t bitOrder) {
} }
void SPIClass::setDataMode(uint8_t dataMode) { void SPIClass::setDataMode(uint8_t dataMode) {
_currentSetting->dataSize = dataMode; _currentSetting->dataMode = dataMode;
} }
void SPIClass::setDataSize(uint32_t ds) { void SPIClass::setDataSize(uint32_t ds) {
@ -413,19 +374,19 @@ void SPIClass::updateSettings() {
switch (_currentSetting->dataMode) { switch (_currentSetting->dataMode) {
case SPI_MODE0: case SPI_MODE0:
HW_SPI_init.CPHA = SSP_CPHA_FIRST; HW_SPI_init.CPHA = SSP_CPHA_FIRST;
HW_SPI_init.CPOL = SSP_CPOL_HI; HW_SPI_init.CPOL = SSP_CPOL_HI;
break; break;
case SPI_MODE1: case SPI_MODE1:
HW_SPI_init.CPHA = SSP_CPHA_SECOND; HW_SPI_init.CPHA = SSP_CPHA_SECOND;
HW_SPI_init.CPOL = SSP_CPOL_HI; HW_SPI_init.CPOL = SSP_CPOL_HI;
break; break;
case SPI_MODE2: case SPI_MODE2:
HW_SPI_init.CPHA = SSP_CPHA_FIRST; HW_SPI_init.CPHA = SSP_CPHA_FIRST;
HW_SPI_init.CPOL = SSP_CPOL_LO; HW_SPI_init.CPOL = SSP_CPOL_LO;
break; break;
case SPI_MODE3: case SPI_MODE3:
HW_SPI_init.CPHA = SSP_CPHA_SECOND; HW_SPI_init.CPHA = SSP_CPHA_SECOND;
HW_SPI_init.CPOL = SSP_CPOL_LO; HW_SPI_init.CPOL = SSP_CPOL_LO;
break; break;
default: default:
break; break;

View file

@ -24,28 +24,28 @@
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#include "MarlinSerial.h" #include "MarlinSerial.h"
#if (defined(SERIAL_PORT) && SERIAL_PORT == 0) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == 0) || (defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT == 0) #if USING_SERIAL_0
MarlinSerial MSerial(LPC_UART0); MarlinSerial MSerial(LPC_UART0);
extern "C" void UART0_IRQHandler() { extern "C" void UART0_IRQHandler() {
MSerial.IRQHandler(); MSerial.IRQHandler();
} }
#endif #endif
#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 #if USING_SERIAL_1
MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1); MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1);
extern "C" void UART1_IRQHandler() { extern "C" void UART1_IRQHandler() {
MSerial1.IRQHandler(); MSerial1.IRQHandler();
} }
#endif #endif
#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 #if USING_SERIAL_2
MarlinSerial MSerial2(LPC_UART2); MarlinSerial MSerial2(LPC_UART2);
extern "C" void UART2_IRQHandler() { extern "C" void UART2_IRQHandler() {
MSerial2.IRQHandler(); MSerial2.IRQHandler();
} }
#endif #endif
#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 #if USING_SERIAL_3
MarlinSerial MSerial3(LPC_UART3); MarlinSerial MSerial3(LPC_UART3);
extern "C" void UART3_IRQHandler() { extern "C" void UART3_IRQHandler() {
MSerial3.IRQHandler(); MSerial3.IRQHandler();

View file

@ -57,6 +57,7 @@ public:
} }
EmergencyParser::State emergency_state; EmergencyParser::State emergency_state;
static inline bool emergency_parser_enabled() { return true; }
#endif #endif
}; };

View file

@ -46,7 +46,6 @@
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
* *
* The only modification was to update/delete macros to match the LPC176x. * The only modification was to update/delete macros to match the LPC176x.
*
*/ */
#include <Servo.h> #include <Servo.h>

View file

@ -24,10 +24,3 @@
#if HAS_FSMC_TFT #if HAS_FSMC_TFT
#error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768." #error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768."
#endif #endif
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT
#undef TOUCH_SCREEN
#undef TOUCH_SCREEN_CALIBRATION
#define HAS_TOUCH_XPT2046 1
#endif

View file

@ -24,7 +24,7 @@
#if PIO_PLATFORM_VERSION < 1001 #if PIO_PLATFORM_VERSION < 1001
#error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically." #error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically."
#endif #endif
#if PIO_FRAMEWORK_VERSION < 2002 #if PIO_FRAMEWORK_VERSION < 2005
#error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries." #error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries."
#endif #endif
@ -89,7 +89,10 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
* Serial2 | P0_10 | P0_11 | * Serial2 | P0_10 | P0_11 |
* Serial3 | P0_00 | P0_01 | * Serial3 | P0_00 | P0_01 |
*/ */
#if (defined(SERIAL_PORT) && SERIAL_PORT == 0) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == 0) || (defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT == 0) #define ANY_TX(N,V...) DO(IS_TX##N,||,V)
#define ANY_RX(N,V...) DO(IS_RX##N,||,V)
#if USING_SERIAL_0
#define IS_TX0(P) (P == P0_02) #define IS_TX0(P) (P == P0_02)
#define IS_RX0(P) (P == P0_03) #define IS_RX0(P) (P == P0_03)
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
@ -103,60 +106,67 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#undef IS_RX0 #undef IS_RX0
#endif #endif
#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 #if USING_SERIAL_1
#define IS_TX1(P) (P == P0_15) #define IS_TX1(P) (P == P0_15)
#define IS_RX1(P) (P == P0_16) #define IS_RX1(P) (P == P0_16)
#define _IS_TX1_1 IS_TX1
#define _IS_RX1_1 IS_RX1
#if IS_TX1(TMC_SW_SCK) #if IS_TX1(TMC_SW_SCK)
#error "Serial port pins (1) conflict with other pins!" #error "Serial port pins (1) conflict with other pins!"
#elif HAS_SPI_LCD #elif HAS_WIRED_LCD
#if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
#error "Serial port pins (1) conflict with Encoder Buttons!" #error "Serial port pins (1) conflict with Encoder Buttons!"
#elif IS_TX1(SCK_PIN) || IS_TX1(LCD_PINS_D4) || IS_TX1(DOGLCD_SCK) || IS_TX1(LCD_RESET_PIN) || IS_TX1(LCD_PINS_RS) || IS_TX1(SHIFT_CLK) \ #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \
|| IS_RX1(LCD_SDSS) || IS_RX1(LCD_PINS_RS) || IS_RX1(MISO_PIN) || IS_RX1(DOGLCD_A0) || IS_RX1(SS_PIN) || IS_RX1(LCD_SDSS) || IS_RX1(DOGLCD_CS) || IS_RX1(LCD_RESET_PIN) || IS_RX1(LCD_BACKLIGHT_PIN) || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
#error "Serial port pins (1) conflict with LCD pins!" #error "Serial port pins (1) conflict with LCD pins!"
#endif #endif
#endif #endif
#undef IS_TX1 #undef IS_TX1
#undef IS_RX1 #undef IS_RX1
#undef _IS_TX1_1
#undef _IS_RX1_1
#endif #endif
#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 #if USING_SERIAL_2
#define IS_TX2(P) (P == P0_10) #define IS_TX2(P) (P == P0_10)
#define IS_RX2(P) (P == P0_11) #define IS_RX2(P) (P == P0_11)
#if IS_TX2(X2_ENABLE_PIN) || IS_RX2(X2_DIR_PIN) || IS_RX2(X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN)) #define _IS_TX2_1 IS_TX2
#define _IS_RX2_1 IS_RX2
#if IS_TX2(X2_ENABLE_PIN) || ANY_RX(2, X2_DIR_PIN, X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN))
#error "Serial port pins (2) conflict with X2 pins!" #error "Serial port pins (2) conflict with X2 pins!"
#elif IS_TX2(Y2_ENABLE_PIN) || IS_RX2(Y2_DIR_PIN) || IS_RX2(Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN)) #elif IS_TX2(Y2_ENABLE_PIN) || ANY_RX(2, Y2_DIR_PIN, Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN))
#error "Serial port pins (2) conflict with Y2 pins!" #error "Serial port pins (2) conflict with Y2 pins!"
#elif IS_TX2(Z2_ENABLE_PIN) || IS_RX2(Z2_DIR_PIN) || IS_RX2(Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN)) #elif IS_TX2(Z2_ENABLE_PIN) || ANY_RX(2, Z2_DIR_PIN, Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN))
#error "Serial port pins (2) conflict with Z2 pins!" #error "Serial port pins (2) conflict with Z2 pins!"
#elif IS_TX2(Z3_ENABLE_PIN) || IS_RX2(Z3_DIR_PIN) || IS_RX2(Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN)) #elif IS_TX2(Z3_ENABLE_PIN) || ANY_RX(2, Z3_DIR_PIN, Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN))
#error "Serial port pins (2) conflict with Z3 pins!" #error "Serial port pins (2) conflict with Z3 pins!"
#elif IS_TX2(Z4_ENABLE_PIN) || IS_RX2(Z4_DIR_PIN) || IS_RX2(Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN)) #elif IS_TX2(Z4_ENABLE_PIN) || ANY_RX(2, Z4_DIR_PIN, Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN))
#error "Serial port pins (2) conflict with Z4 pins!" #error "Serial port pins (2) conflict with Z4 pins!"
#elif IS_RX2(X_DIR_PIN) || IS_RX2(Y_DIR_PIN) #elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN)
#error "Serial port pins (2) conflict with other pins!" #error "Serial port pins (2) conflict with other pins!"
#elif Y_HOME_DIR < 0 && IS_TX2(Y_STOP_PIN) #elif Y_HOME_DIR < 0 && IS_TX2(Y_STOP_PIN)
#error "Serial port pins (2) conflict with Y endstop pin!" #error "Serial port pins (2) conflict with Y endstop pin!"
#elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN) #elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN)
#error "Serial port pins (2) conflict with probe pin!" #error "Serial port pins (2) conflict with probe pin!"
#elif IS_TX2(X_ENABLE_PIN) || IS_RX2(X_DIR_PIN) || IS_TX2(Y_ENABLE_PIN) || IS_RX2(Y_DIR_PIN) #elif ANY_TX(2, X_ENABLE_PIN, Y_ENABLE_PIN) || ANY_RX(2, X_DIR_PIN, Y_DIR_PIN)
#error "Serial port pins (2) conflict with X/Y stepper pins!" #error "Serial port pins (2) conflict with X/Y stepper pins!"
#elif EXTRUDERS > 1 && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN))) #elif HAS_MULTI_EXTRUDER && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN)))
#error "Serial port pins (2) conflict with E1 stepper pins!" #error "Serial port pins (2) conflict with E1 stepper pins!"
#elif EXTRUDERS && (IS_RX2(E0_DIR_PIN) || IS_RX2(E0_STEP_PIN)) #elif EXTRUDERS && ANY_RX(2, E0_DIR_PIN, E0_STEP_PIN)
#error "Serial port pins (2) conflict with E stepper pins!" #error "Serial port pins (2) conflict with E stepper pins!"
#endif #endif
#undef IS_TX2 #undef IS_TX2
#undef IS_RX2 #undef IS_RX2
#undef _IS_TX2_1
#undef _IS_RX2_1
#endif #endif
#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 #if USING_SERIAL_3
#define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00)
#define PIN_IS_RX3(P) (P##_PIN == P0_01) #define PIN_IS_RX3(P) (P##_PIN == P0_01)
#if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX)
#error "Serial port pins (3) conflict with X endstop pins!" #error "Serial port pins (3) conflict with X endstop pins!"
#elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) \ #elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) || PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX)
|| PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX)
#error "Serial port pins (3) conflict with X/Y axis UART pins!" #error "Serial port pins (3) conflict with X/Y axis UART pins!"
#elif PIN_IS_TX3(X2_DIR) || PIN_IS_RX3(X2_STEP) #elif PIN_IS_TX3(X2_DIR) || PIN_IS_RX3(X2_STEP)
#error "Serial port pins (3) conflict with X2 pins!" #error "Serial port pins (3) conflict with X2 pins!"
@ -168,17 +178,20 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#error "Serial port pins (3) conflict with Z3 pins!" #error "Serial port pins (3) conflict with Z3 pins!"
#elif PIN_IS_TX3(Z4_DIR) || PIN_IS_RX3(Z4_STEP) #elif PIN_IS_TX3(Z4_DIR) || PIN_IS_RX3(Z4_STEP)
#error "Serial port pins (3) conflict with Z4 pins!" #error "Serial port pins (3) conflict with Z4 pins!"
#elif EXTRUDERS > 1 && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP)) #elif HAS_MULTI_EXTRUDER && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP))
#error "Serial port pins (3) conflict with E1 pins!" #error "Serial port pins (3) conflict with E1 pins!"
#endif #endif
#undef PIN_IS_TX3 #undef PIN_IS_TX3
#undef PIN_IS_RX3 #undef PIN_IS_RX3
#endif #endif
#undef ANY_TX
#undef ANY_RX
// //
// Flag any i2c pin conflicts // Flag any i2c pin conflicts
// //
#if ANY(HAS_I2C_DIGIPOT, DAC_STEPPER_CURRENT, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM) #if ANY(HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM)
#define USEDI2CDEV_M 1 // <Arduino>/Wire.cpp #define USEDI2CDEV_M 1 // <Arduino>/Wire.cpp
#if USEDI2CDEV_M == 0 // P0_27 [D57] (AUX-1) .......... P0_28 [D58] (AUX-1) #if USEDI2CDEV_M == 0 // P0_27 [D57] (AUX-1) .......... P0_28 [D58] (AUX-1)
@ -214,7 +227,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#error "One or more i2c (1) pins overlaps with Z3 pins! Disable i2c peripherals." #error "One or more i2c (1) pins overlaps with Z3 pins! Disable i2c peripherals."
#elif PIN_IS_SDA1(Z4_DIR) || PIN_IS_SCL1(Z4_STEP) #elif PIN_IS_SDA1(Z4_DIR) || PIN_IS_SCL1(Z4_STEP)
#error "One or more i2c (1) pins overlaps with Z4 pins! Disable i2c peripherals." #error "One or more i2c (1) pins overlaps with Z4 pins! Disable i2c peripherals."
#elif EXTRUDERS > 1 && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP)) #elif HAS_MULTI_EXTRUDER && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP))
#error "One or more i2c (1) pins overlaps with E1 pins! Disable i2c peripherals." #error "One or more i2c (1) pins overlaps with E1 pins! Disable i2c peripherals."
#endif #endif
#undef PIN_IS_SDA1 #undef PIN_IS_SDA1
@ -240,9 +253,9 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#error "i2c SDA2 overlaps with Z3 enable pin! Disable i2c peripherals." #error "i2c SDA2 overlaps with Z3 enable pin! Disable i2c peripherals."
#elif PIN_IS_SDA2(Z4_ENABLE) #elif PIN_IS_SDA2(Z4_ENABLE)
#error "i2c SDA2 overlaps with Z4 enable pin! Disable i2c peripherals." #error "i2c SDA2 overlaps with Z4 enable pin! Disable i2c peripherals."
#elif EXTRUDERS > 1 && PIN_IS_SDA2(E1_ENABLE) #elif HAS_MULTI_EXTRUDER && PIN_IS_SDA2(E1_ENABLE)
#error "i2c SDA2 overlaps with E1 enable pin! Disable i2c peripherals." #error "i2c SDA2 overlaps with E1 enable pin! Disable i2c peripherals."
#elif EXTRUDERS > 1 && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS) #elif HAS_MULTI_EXTRUDER && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS)
#error "i2c SDA2 overlaps with E1 CS pin! Disable i2c peripherals." #error "i2c SDA2 overlaps with E1 CS pin! Disable i2c peripherals."
#elif EXTRUDERS && (PIN_IS_SDA2(E0_STEP) || PIN_IS_SDA2(E0_DIR)) #elif EXTRUDERS && (PIN_IS_SDA2(E0_STEP) || PIN_IS_SDA2(E0_DIR))
#error "i2c SCL2 overlaps with E0 STEP/DIR pin! Disable i2c peripherals." #error "i2c SCL2 overlaps with E0 STEP/DIR pin! Disable i2c peripherals."

View file

@ -61,7 +61,9 @@
class SPISettings { class SPISettings {
public: public:
SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; SPISettings(uint32_t spiRate, int inBitOrder, int inDataMode) {
init_AlwaysInline(spiRate2Clock(spiRate), inBitOrder, inDataMode, DATA_SIZE_8BIT);
}
SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) {
if (__builtin_constant_p(inClock)) if (__builtin_constant_p(inClock))
init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize);
@ -72,7 +74,19 @@ public:
init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
} }
uint32_t spiRate() const { return spi_speed; } //uint32_t spiRate() const { return spi_speed; }
static inline uint32_t spiRate2Clock(uint32_t spiRate) {
uint32_t Marlin_speed[7]; // CPSR is always 2
Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED
Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED
Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED
Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5
Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h
return Marlin_speed[spiRate > 6 ? 6 : spiRate];
}
private: private:
void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) {
@ -85,7 +99,7 @@ private:
dataSize = inDataSize; dataSize = inDataSize;
} }
uint32_t spi_speed; //uint32_t spi_speed;
uint32_t clock; uint32_t clock;
uint32_t dataSize; uint32_t dataSize;
//uint32_t clockDivider; //uint32_t clockDivider;
@ -122,7 +136,7 @@ public:
void end(); void end();
void beginTransaction(const SPISettings&); void beginTransaction(const SPISettings&);
void endTransaction() {}; void endTransaction() {}
// Transfer using 1 "Data Size" // Transfer using 1 "Data Size"
uint8_t transfer(uint16_t data); uint8_t transfer(uint16_t data);

View file

@ -23,7 +23,7 @@
#include "../../core/macros.h" #include "../../core/macros.h"
#if BOTH(SDSUPPORT, HAS_GRAPHICAL_LCD) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) #if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently #define LPC_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

View file

@ -36,7 +36,7 @@
#define DATASIZE_8BIT SSP_DATABIT_8 #define DATASIZE_8BIT SSP_DATABIT_8
#define DATASIZE_16BIT SSP_DATABIT_16 #define DATASIZE_16BIT SSP_DATABIT_16
#define TFT_IO TFT_SPI #define TFT_IO_DRIVER TFT_SPI
#define DMA_MINC_ENABLE 1 #define DMA_MINC_ENABLE 1
#define DMA_MINC_DISABLE 0 #define DMA_MINC_DISABLE 0

View file

@ -72,7 +72,6 @@ bool XPT2046::getRawPoint(int16_t *x, int16_t *y) {
if (!isTouched()) return false; if (!isTouched()) return false;
*x = getRawData(XPT2046_X); *x = getRawData(XPT2046_X);
*y = getRawData(XPT2046_Y); *y = getRawData(XPT2046_Y);
SERIAL_ECHOLNPAIR("X: ", *x, ", Y: ", *y);
return isTouched(); return isTouched();
} }

View file

@ -21,7 +21,6 @@
#pragma once #pragma once
/** /**
*
* HAL For LPC1768 * HAL For LPC1768
*/ */

View file

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
#include <U8glib.h> #include <U8glib.h>
#include "../../shared/HAL_SPI.h" #include "../../shared/HAL_SPI.h"
@ -124,6 +124,6 @@ uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View file

@ -77,7 +77,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
#include <U8glib.h> #include <U8glib.h>
@ -193,6 +193,6 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View file

@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if HAS_GRAPHICAL_LCD #if HAS_MARLINUI_U8GLIB
#include <U8glib.h> #include <U8glib.h>
#include "../../shared/HAL_SPI.h" #include "../../shared/HAL_SPI.h"
@ -133,6 +133,6 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB
#endif // TARGET_LPC1768 #endif // TARGET_LPC1768

View file

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

View file

@ -26,7 +26,9 @@
#if ENABLED(EMERGENCY_PARSER) #if ENABLED(EMERGENCY_PARSER)
#include "../../feature/e_parser.h" #include "../../feature/e_parser.h"
EmergencyParser::State emergency_state; EmergencyParser::State emergency_state;
bool CDC_RecvCallback(const char buffer) { bool CDC_RecvCallback(const char buffer) {
emergency_parser.update(emergency_state, buffer); emergency_parser.update(emergency_state, buffer);
return true; return true;

View file

@ -35,58 +35,35 @@
// MYSERIAL0 required before MarlinSerial includes! // MYSERIAL0 required before MarlinSerial includes!
#define __MSERIAL(X) Serial##X
#define _MSERIAL(X) __MSERIAL(X)
#define MSERIAL(X) _MSERIAL(INCREMENT(X))
#if SERIAL_PORT == -1 #if SERIAL_PORT == -1
#define MYSERIAL0 Serial #define MYSERIAL0 Serial
#elif SERIAL_PORT == 0 #elif WITHIN(SERIAL_PORT, 0, 3)
#define MYSERIAL0 Serial1 #define MYSERIAL0 MSERIAL(SERIAL_PORT)
#elif SERIAL_PORT == 1
#define MYSERIAL0 Serial2
#elif SERIAL_PORT == 2
#define MYSERIAL0 Serial3
#elif SERIAL_PORT == 3
#define MYSERIAL0 Serial4
#else #else
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if SERIAL_PORT_2 == SERIAL_PORT #if SERIAL_PORT_2 == -1
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
#elif SERIAL_PORT_2 == -1
#define MYSERIAL1 Serial #define MYSERIAL1 Serial
#elif SERIAL_PORT_2 == 0 #elif WITHIN(SERIAL_PORT_2, 0, 3)
#define MYSERIAL1 Serial1 #define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
#elif SERIAL_PORT_2 == 1
#define MYSERIAL1 Serial2
#elif SERIAL_PORT_2 == 2
#define MYSERIAL1 Serial3
#elif SERIAL_PORT_2 == 3
#define MYSERIAL1 Serial4
#else #else
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
#endif #endif
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif #endif
#ifdef DGUS_SERIAL_PORT #ifdef LCD_SERIAL_PORT
#if DGUS_SERIAL_PORT == SERIAL_PORT #if LCD_SERIAL_PORT == -1
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." #define LCD_SERIAL Serial
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2 #elif WITHIN(LCD_SERIAL_PORT, 0, 3)
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
#elif DGUS_SERIAL_PORT == -1
#define DGUS_SERIAL Serial
#elif DGUS_SERIAL_PORT == 0
#define DGUS_SERIAL Serial1
#elif DGUS_SERIAL_PORT == 1
#define DGUS_SERIAL Serial2
#elif DGUS_SERIAL_PORT == 2
#define DGUS_SERIAL Serial3
#elif DGUS_SERIAL_PORT == 2
#define DGUS_SERIAL Serial4
#else #else
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration." #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
#endif #endif
#endif #endif
@ -112,6 +89,8 @@ typedef int8_t pin_t;
void HAL_clear_reset_source(); // clear reset reason void HAL_clear_reset_source(); // clear reset reason
uint8_t HAL_get_reset_source(); // get reset reason uint8_t HAL_get_reset_source(); // get reset reason
inline void HAL_reboot() {} // reboot the board or restart the bootloader
// //
// ADC // ADC
// //

View file

@ -26,7 +26,7 @@
#include "QSPIFlash.h" #include "QSPIFlash.h"
#define INVALID_ADDR 0xffffffff #define INVALID_ADDR 0xFFFFFFFF
#define SECTOR_OF(a) (a & ~(SFLASH_SECTOR_SIZE - 1)) #define SECTOR_OF(a) (a & ~(SFLASH_SECTOR_SIZE - 1))
#define OFFSET_OF(a) (a & (SFLASH_SECTOR_SIZE - 1)) #define OFFSET_OF(a) (a & (SFLASH_SECTOR_SIZE - 1))

View file

@ -24,7 +24,6 @@
* THE SOFTWARE. * THE SOFTWARE.
* *
* Derived from Adafruit_SPIFlash class with no SdFat references * Derived from Adafruit_SPIFlash class with no SdFat references
*
*/ */
#pragma once #pragma once

View file

@ -150,5 +150,4 @@ void pwm_details(int32_t pin) {
* 93 | PA10 | QSPI: IO2 * 93 | PA10 | QSPI: IO2
* 94 | PA11 | QSPI: IO3 * 94 | PA11 | QSPI: IO3
* 95 | PB31 | SD: DETECT * 95 | PB31 | SD: DETECT
*
*/ */

View file

@ -63,7 +63,7 @@ uint16_t HAL_adc_result;
void HAL_init() { void HAL_init() {
FastIO_init(); FastIO_init();
#if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1)
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
@ -122,9 +122,14 @@ extern "C" {
// TODO: Make sure this doesn't cause any delay // TODO: Make sure this doesn't cause any delay
void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); }
uint16_t HAL_adc_get_result() { return HAL_adc_result; } uint16_t HAL_adc_get_result() { return HAL_adc_result; }
// Reset the system (to initiate a firmware flash)
void flashFirmware(const int16_t) { NVIC_SystemReset(); } void flashFirmware(const int16_t) { NVIC_SystemReset(); }
// Maple Compatibility
systickCallback_t systick_user_callback;
void systick_attach_callback(systickCallback_t cb) { systick_user_callback = cb; }
void HAL_SYSTICK_Callback() { if (systick_user_callback) systick_user_callback(); }
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC

View file

@ -43,83 +43,40 @@
// ------------------------ // ------------------------
// Defines // Defines
// ------------------------ // ------------------------
#define _MSERIAL(X) MSerial##X
#define MSERIAL(X) _MSERIAL(X)
#if SERIAL_PORT == 0 #if SERIAL_PORT == -1
#error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration."
#elif SERIAL_PORT == -1
#define MYSERIAL0 SerialUSB #define MYSERIAL0 SerialUSB
#elif SERIAL_PORT == 1 #elif WITHIN(SERIAL_PORT, 1, 6)
#define MYSERIAL0 MSerial1 #define MYSERIAL0 MSERIAL(SERIAL_PORT)
#elif SERIAL_PORT == 2
#define MYSERIAL0 MSerial2
#elif SERIAL_PORT == 3
#define MYSERIAL0 MSerial3
#elif SERIAL_PORT == 4
#define MYSERIAL0 MSerial4
#elif SERIAL_PORT == 5
#define MYSERIAL0 MSerial5
#elif SERIAL_PORT == 6
#define MYSERIAL0 MSerial6
#else #else
#error "SERIAL_PORT must be from -1 to 6. Please update your configuration." #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration."
#endif #endif
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#define NUM_SERIAL 2 #if SERIAL_PORT_2 == -1
#if SERIAL_PORT_2 == 0
#error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration."
#elif SERIAL_PORT_2 == SERIAL_PORT
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
#elif SERIAL_PORT_2 == -1
#define MYSERIAL1 SerialUSB #define MYSERIAL1 SerialUSB
#elif SERIAL_PORT_2 == 1 #elif WITHIN(SERIAL_PORT_2, 1, 6)
#define MYSERIAL1 MSerial1 #define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
#elif SERIAL_PORT_2 == 2
#define MYSERIAL1 MSerial2
#elif SERIAL_PORT_2 == 3
#define MYSERIAL1 MSerial3
#elif SERIAL_PORT_2 == 4
#define MYSERIAL1 MSerial4
#elif SERIAL_PORT_2 == 5
#define MYSERIAL1 MSerial5
#elif SERIAL_PORT_2 == 6
#define MYSERIAL1 MSerial6
#else #else
#error "SERIAL_PORT_2 must be from -1 to 6. Please update your configuration." #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration."
#endif #endif
#else
#define NUM_SERIAL 1
#endif #endif
#if HAS_DGUS_LCD #ifdef LCD_SERIAL_PORT
#if DGUS_SERIAL_PORT == 0 #if LCD_SERIAL_PORT == -1
#error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." #define LCD_SERIAL SerialUSB
#elif DGUS_SERIAL_PORT == SERIAL_PORT #elif WITHIN(LCD_SERIAL_PORT, 1, 6)
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
#elif DGUS_SERIAL_PORT == -1
#define DGUS_SERIAL SerialUSB
#elif DGUS_SERIAL_PORT == 1
#define DGUS_SERIAL MSerial1
#elif DGUS_SERIAL_PORT == 2
#define DGUS_SERIAL MSerial2
#elif DGUS_SERIAL_PORT == 3
#define DGUS_SERIAL MSerial3
#elif DGUS_SERIAL_PORT == 4
#define DGUS_SERIAL MSerial4
#elif DGUS_SERIAL_PORT == 5
#define DGUS_SERIAL MSerial5
#elif DGUS_SERIAL_PORT == 6
#define DGUS_SERIAL MSerial6
#else #else
#error "DGUS_SERIAL_PORT must be from -1 to 6. Please update your configuration." #error "LCD_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration."
#endif
#if HAS_DGUS_LCD
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite()
#endif #endif
#define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.availableForWrite
#endif #endif
/** /**
* TODO: review this to return 1 for pins that are not analog input * TODO: review this to return 1 for pins that are not analog input
*/ */
@ -177,6 +134,8 @@ void HAL_clear_reset_source();
// Reset reason // Reset reason
uint8_t HAL_get_reset_source(); uint8_t HAL_get_reset_source();
inline void HAL_reboot() {} // reboot the board or restart the bootloader
void _delay_ms(const int delay); void _delay_ms(const int delay);
extern "C" char* _sbrk(int incr); extern "C" char* _sbrk(int incr);
@ -220,3 +179,8 @@ uint16_t HAL_adc_get_result();
#define PLATFORM_M997_SUPPORT #define PLATFORM_M997_SUPPORT
void flashFirmware(const int16_t); void flashFirmware(const int16_t);
// Maple Compatibility
typedef void (*systickCallback_t)(void);
void systick_attach_callback(systickCallback_t cb);
void HAL_SYSTICK_Callback();

View file

@ -132,11 +132,9 @@ static SPISettings spiConfig;
* @details Only configures SS pin since stm32duino creates and initialize the SPI object * @details Only configures SS pin since stm32duino creates and initialize the SPI object
*/ */
void spiBegin() { void spiBegin() {
#if !PIN_EXISTS(SS) #if PIN_EXISTS(SS)
#error "SS_PIN not defined!" OUT_WRITE(SS_PIN, HIGH);
#endif #endif
OUT_WRITE(SS_PIN, HIGH);
} }
// Configure SPI for specified SPI speed // Configure SPI for specified SPI speed
@ -173,9 +171,7 @@ static SPISettings spiConfig;
* @details * @details
*/ */
uint8_t spiRec() { uint8_t spiRec() {
SPI.beginTransaction(spiConfig);
uint8_t returnByte = SPI.transfer(0xFF); uint8_t returnByte = SPI.transfer(0xFF);
SPI.endTransaction();
return returnByte; return returnByte;
} }
@ -191,9 +187,7 @@ static SPISettings spiConfig;
void spiRead(uint8_t* buf, uint16_t nbyte) { void spiRead(uint8_t* buf, uint16_t nbyte) {
if (nbyte == 0) return; if (nbyte == 0) return;
memset(buf, 0xFF, nbyte); memset(buf, 0xFF, nbyte);
SPI.beginTransaction(spiConfig);
SPI.transfer(buf, nbyte); SPI.transfer(buf, nbyte);
SPI.endTransaction();
} }
/** /**
@ -204,9 +198,7 @@ static SPISettings spiConfig;
* @details * @details
*/ */
void spiSend(uint8_t b) { void spiSend(uint8_t b) {
SPI.beginTransaction(spiConfig);
SPI.transfer(b); SPI.transfer(b);
SPI.endTransaction();
} }
/** /**
@ -219,10 +211,8 @@ static SPISettings spiConfig;
*/ */
void spiSendBlock(uint8_t token, const uint8_t* buf) { void spiSendBlock(uint8_t token, const uint8_t* buf) {
uint8_t rxBuf[512]; uint8_t rxBuf[512];
SPI.beginTransaction(spiConfig);
SPI.transfer(token); SPI.transfer(token);
SPI.transfer((uint8_t*)buf, &rxBuf, 512); SPI.transfer((uint8_t*)buf, &rxBuf, 512);
SPI.endTransaction();
} }
#endif // SOFTWARE_SPI #endif // SOFTWARE_SPI

View file

@ -49,16 +49,14 @@
DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2)
#endif #endif
#if defined(DGUS_SERIAL_PORT) && DGUS_SERIAL_PORT >= 0 #if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0
DECLARE_SERIAL_PORT_EXP(DGUS_SERIAL_PORT) DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT)
#endif #endif
void MarlinSerial::begin(unsigned long baud, uint8_t config) { void MarlinSerial::begin(unsigned long baud, uint8_t config) {
HardwareSerial::begin(baud, config); HardwareSerial::begin(baud, config);
// replace the IRQ callback with the one we have defined // Replace the IRQ callback with the one we have defined
#if ENABLED(EMERGENCY_PARSER) TERN_(EMERGENCY_PARSER, _serial.rx_callback = _rx_callback);
_serial.rx_callback = _rx_callback;
#endif
} }
// This function is Copyright (c) 2006 Nicholas Zambetti. // This function is Copyright (c) 2006 Nicholas Zambetti.

View file

@ -35,6 +35,10 @@ public:
#endif #endif
{ } { }
#if ENABLED(EMERGENCY_PARSER)
static inline bool emergency_parser_enabled() { return true; }
#endif
void begin(unsigned long baud, uint8_t config); void begin(unsigned long baud, uint8_t config);
inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }

View file

@ -1,396 +0,0 @@
/*
* SoftwareSerial.cpp (formerly NewSoftSerial.cpp)
*
* Multi-instance software serial library for Arduino/Wiring
* -- Interrupt-driven receive and other improvements by ladyada
* <https://ladyada.net>
* -- Tuning, circular buffer, derivation from class Print/Stream,
* multi-instance support, porting to 8MHz processors,
* various optimizations, PROGMEM delay tables, inverse logic and
* direct port writing by Mikal Hart <http://www.arduiniana.org>
* -- Pin change interrupt macros by Paul Stoffregen <https://www.pjrc.com>
* -- 20MHz processor support by Garrett Mace <http://www.macetech.com>
* -- ATmega1280/2560 support by Brett Hagman <https://www.roguerobotics.com>
* -- STM32 support by Armin van der Togt
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* The latest version of this library can always be found at
* http://arduiniana.org.
*/
//
// Includes
//
#if defined(PLATFORMIO) && defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC)
#include "../../inc/MarlinConfig.h"
#include "SoftwareSerial.h"
#define OVERSAMPLE 3 // in RX, Timer will generate interruption OVERSAMPLE time during a bit. Thus OVERSAMPLE ticks in a bit. (interrupt not synchonized with edge).
// defined in bit-periods
#define HALFDUPLEX_SWITCH_DELAY 5
// It's best to define TIMER_SERIAL in variant.h. If not defined, we choose one here
// The order is based on (lack of) features and compare channels, we choose the simplest available
// because we only need an update interrupt
#if !defined(TIMER_SERIAL)
#if defined(TIM18_BASE)
#define TIMER_SERIAL TIM18
#elif defined(TIM7_BASE)
#define TIMER_SERIAL TIM7
#elif defined(TIM6_BASE)
#define TIMER_SERIAL TIM6
#elif defined(TIM22_BASE)
#define TIMER_SERIAL TIM22
#elif defined(TIM21_BASE)
#define TIMER_SERIAL TIM21
#elif defined(TIM17_BASE)
#define TIMER_SERIAL TIM17
#elif defined(TIM16_BASE)
#define TIMER_SERIAL TIM16
#elif defined(TIM15_BASE)
#define TIMER_SERIAL TIM15
#elif defined(TIM14_BASE)
#define TIMER_SERIAL TIM14
#elif defined(TIM13_BASE)
#define TIMER_SERIAL TIM13
#elif defined(TIM11_BASE)
#define TIMER_SERIAL TIM11
#elif defined(TIM10_BASE)
#define TIMER_SERIAL TIM10
#elif defined(TIM12_BASE)
#define TIMER_SERIAL TIM12
#elif defined(TIM19_BASE)
#define TIMER_SERIAL TIM19
#elif defined(TIM9_BASE)
#define TIMER_SERIAL TIM9
#elif defined(TIM5_BASE)
#define TIMER_SERIAL TIM5
#elif defined(TIM4_BASE)
#define TIMER_SERIAL TIM4
#elif defined(TIM3_BASE)
#define TIMER_SERIAL TIM3
#elif defined(TIM2_BASE)
#define TIMER_SERIAL TIM2
#elif defined(TIM20_BASE)
#define TIMER_SERIAL TIM20
#elif defined(TIM8_BASE)
#define TIMER_SERIAL TIM8
#elif defined(TIM1_BASE)
#define TIMER_SERIAL TIM1
#else
#error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h
#endif
#endif
//
// Statics
//
HardwareTimer SoftwareSerial::timer(TIMER_SERIAL);
const IRQn_Type SoftwareSerial::timer_interrupt_number = static_cast<IRQn_Type>(getTimerUpIrq(TIMER_SERIAL));
uint32_t SoftwareSerial::timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
SoftwareSerial *SoftwareSerial::active_listener = nullptr;
SoftwareSerial *volatile SoftwareSerial::active_out = nullptr;
SoftwareSerial *volatile SoftwareSerial::active_in = nullptr;
int32_t SoftwareSerial::tx_tick_cnt = 0; // OVERSAMPLE ticks needed for a bit
int32_t volatile SoftwareSerial::rx_tick_cnt = 0; // OVERSAMPLE ticks needed for a bit
uint32_t SoftwareSerial::tx_buffer = 0;
int32_t SoftwareSerial::tx_bit_cnt = 0;
uint32_t SoftwareSerial::rx_buffer = 0;
int32_t SoftwareSerial::rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit
uint32_t SoftwareSerial::cur_speed = 0;
void SoftwareSerial::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) {
timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority);
}
//
// Private methods
//
void SoftwareSerial::setSpeed(uint32_t speed) {
if (speed != cur_speed) {
timer.pause();
if (speed != 0) {
// Disable the timer
uint32_t clock_rate, cmp_value;
// Get timer clock
clock_rate = timer.getTimerClkFreq();
int pre = 1;
// Calculate prescale an compare value
do {
cmp_value = clock_rate / (speed * OVERSAMPLE);
if (cmp_value >= UINT16_MAX) {
clock_rate /= 2;
pre *= 2;
}
} while (cmp_value >= UINT16_MAX);
timer.setPrescaleFactor(pre);
timer.setOverflow(cmp_value);
timer.setCount(0);
timer.attachInterrupt(&handleInterrupt);
timer.resume();
NVIC_SetPriority(timer_interrupt_number, timer_interrupt_priority);
}
else
timer.detachInterrupt();
cur_speed = speed;
}
}
// This function sets the current object as the "listening"
// one and returns true if it replaces another
bool SoftwareSerial::listen() {
if (active_listener != this) {
// wait for any transmit to complete as we may change speed
while (active_out);
active_listener->stopListening();
rx_tick_cnt = 1; // 1 : next interrupt will decrease rx_tick_cnt to 0 which means RX pin level will be considered.
rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit
setSpeed(_speed);
active_listener = this;
if (!_half_duplex) active_in = this;
return true;
}
return false;
}
// Stop listening. Returns true if we were actually listening.
bool SoftwareSerial::stopListening() {
if (active_listener == this) {
// wait for any output to complete
while (active_out);
if (_half_duplex) setRXTX(false);
active_listener = nullptr;
active_in = nullptr;
// turn off ints
setSpeed(0);
return true;
}
return false;
}
inline void SoftwareSerial::setTX() {
if (_inverse_logic)
LL_GPIO_ResetOutputPin(_transmitPinPort, _transmitPinNumber);
else
LL_GPIO_SetOutputPin(_transmitPinPort, _transmitPinNumber);
pinMode(_transmitPin, OUTPUT);
}
inline void SoftwareSerial::setRX() {
pinMode(_receivePin, _inverse_logic ? INPUT_PULLDOWN : INPUT_PULLUP); // pullup for normal logic!
}
inline void SoftwareSerial::setRXTX(bool input) {
if (_half_duplex) {
if (input) {
if (active_in != this) {
setRX();
rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit
rx_tick_cnt = 2; // 2 : next interrupt will be discarded. 2 interrupts required to consider RX pin level
active_in = this;
}
}
else {
if (active_in == this) {
setTX();
active_in = nullptr;
}
}
}
}
inline void SoftwareSerial::send() {
if (--tx_tick_cnt <= 0) { // if tx_tick_cnt > 0 interrupt is discarded. Only when tx_tick_cnt reaches 0 is TX pin set.
if (tx_bit_cnt++ < 10) { // tx_bit_cnt < 10 transmission is not finished (10 = 1 start +8 bits + 1 stop)
// Send data (including start and stop bits)
if (tx_buffer & 1)
LL_GPIO_SetOutputPin(_transmitPinPort, _transmitPinNumber);
else
LL_GPIO_ResetOutputPin(_transmitPinPort, _transmitPinNumber);
tx_buffer >>= 1;
tx_tick_cnt = OVERSAMPLE; // Wait OVERSAMPLE ticks to send next bit
}
else { // Transmission finished
tx_tick_cnt = 1;
if (_output_pending) {
active_out = nullptr;
// In half-duplex mode wait HALFDUPLEX_SWITCH_DELAY bit-periods after the byte has
// been transmitted before allowing the switch to RX mode
}
else if (tx_bit_cnt > 10 + OVERSAMPLE * HALFDUPLEX_SWITCH_DELAY) {
if (_half_duplex && active_listener == this) setRXTX(true);
active_out = nullptr;
}
}
}
}
//
// The receive routine called by the interrupt handler
//
inline void SoftwareSerial::recv() {
if (--rx_tick_cnt <= 0) { // if rx_tick_cnt > 0 interrupt is discarded. Only when rx_tick_cnt reaches 0 is RX pin considered
bool inbit = LL_GPIO_IsInputPinSet(_receivePinPort, _receivePinNumber) ^ _inverse_logic;
if (rx_bit_cnt == -1) { // rx_bit_cnt = -1 : waiting for start bit
if (!inbit) {
// got start bit
rx_bit_cnt = 0; // rx_bit_cnt == 0 : start bit received
rx_tick_cnt = OVERSAMPLE + 1; // Wait 1 bit (OVERSAMPLE ticks) + 1 tick in order to sample RX pin in the middle of the edge (and not too close to the edge)
rx_buffer = 0;
}
else
rx_tick_cnt = 1; // Waiting for start bit, but wrong level. Wait for next Interrupt to check RX pin level
}
else if (rx_bit_cnt >= 8) { // rx_bit_cnt >= 8 : waiting for stop bit
if (inbit) {
// Stop-bit read complete. Add to buffer.
uint8_t next = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF;
if (next != _receive_buffer_head) {
// save new data in buffer: tail points to byte destination
_receive_buffer[_receive_buffer_tail] = rx_buffer; // save new byte
_receive_buffer_tail = next;
}
else // rx_bit_cnt = x with x = [0..7] correspond to new bit x received
_buffer_overflow = true;
}
// Full trame received. Restart waiting for start bit at next interrupt
rx_tick_cnt = 1;
rx_bit_cnt = -1;
}
else {
// data bits
rx_buffer >>= 1;
if (inbit) rx_buffer |= 0x80;
rx_bit_cnt++; // Prepare for next bit
rx_tick_cnt = OVERSAMPLE; // Wait OVERSAMPLE ticks before sampling next bit
}
}
}
//
// Interrupt handling
//
/* static */
inline void SoftwareSerial::handleInterrupt(HardwareTimer*) {
if (active_in) active_in->recv();
if (active_out) active_out->send();
}
//
// Constructor
//
SoftwareSerial::SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic /* = false */) :
_receivePin(receivePin),
_transmitPin(transmitPin),
_receivePinPort(digitalPinToPort(receivePin)),
_receivePinNumber(STM_LL_GPIO_PIN(digitalPinToPinName(receivePin))),
_transmitPinPort(digitalPinToPort(transmitPin)),
_transmitPinNumber(STM_LL_GPIO_PIN(digitalPinToPinName(transmitPin))),
_speed(0),
_buffer_overflow(false),
_inverse_logic(inverse_logic),
_half_duplex(receivePin == transmitPin),
_output_pending(0),
_receive_buffer_tail(0),
_receive_buffer_head(0)
{
if ((receivePin < NUM_DIGITAL_PINS) || (transmitPin < NUM_DIGITAL_PINS)) {
/* Enable GPIO clock for tx and rx pin*/
set_GPIO_Port_Clock(STM_PORT(digitalPinToPinName(transmitPin)));
set_GPIO_Port_Clock(STM_PORT(digitalPinToPinName(receivePin)));
}
else
_Error_Handler("ERROR: invalid pin number\n", -1);
}
//
// Destructor
//
SoftwareSerial::~SoftwareSerial() { end(); }
//
// Public methods
//
void SoftwareSerial::begin(long speed) {
#ifdef FORCE_BAUD_RATE
speed = FORCE_BAUD_RATE;
#endif
_speed = speed;
if (!_half_duplex) {
setTX();
setRX();
listen();
}
else
setTX();
}
void SoftwareSerial::end() {
stopListening();
}
// Read data from buffer
int SoftwareSerial::read() {
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail) return -1;
// Read from "head"
uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte
_receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
return d;
}
int SoftwareSerial::available() {
return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF;
}
size_t SoftwareSerial::write(uint8_t b) {
// wait for previous transmit to complete
_output_pending = 1;
while (active_out) { /* nada */ }
// add start and stop bits.
tx_buffer = b << 1 | 0x200;
if (_inverse_logic) tx_buffer = ~tx_buffer;
tx_bit_cnt = 0;
tx_tick_cnt = OVERSAMPLE;
setSpeed(_speed);
if (_half_duplex) setRXTX(false);
_output_pending = 0;
// make us active
active_out = this;
return 1;
}
void SoftwareSerial::flush() {
noInterrupts();
_receive_buffer_head = _receive_buffer_tail = 0;
interrupts();
}
int SoftwareSerial::peek() {
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail) return -1;
// Read from "head"
return _receive_buffer[_receive_buffer_head];
}
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC

View file

@ -1,114 +0,0 @@
/**
* SoftwareSerial.h (formerly NewSoftSerial.h)
*
* Multi-instance software serial library for Arduino/Wiring
* -- Interrupt-driven receive and other improvements by ladyada
* (https://ladyada.net)
* -- Tuning, circular buffer, derivation from class Print/Stream,
* multi-instance support, porting to 8MHz processors,
* various optimizations, PROGMEM delay tables, inverse logic and
* direct port writing by Mikal Hart (http://www.arduiniana.org)
* -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com)
* -- 20MHz processor support by Garrett Mace (http://www.macetech.com)
* -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* The latest version of this library can always be found at
* http://arduiniana.org.
*/
#pragma once
#include <Arduino.h>
/******************************************************************************
* Definitions
******************************************************************************/
#define _SS_MAX_RX_BUFF 64 // RX buffer size
class SoftwareSerial : public Stream {
private:
// per object data
uint16_t _receivePin;
uint16_t _transmitPin;
GPIO_TypeDef *_receivePinPort;
uint32_t _receivePinNumber;
GPIO_TypeDef *_transmitPinPort;
uint32_t _transmitPinNumber;
uint32_t _speed;
uint16_t _buffer_overflow: 1;
uint16_t _inverse_logic: 1;
uint16_t _half_duplex: 1;
uint16_t _output_pending: 1;
unsigned char _receive_buffer[_SS_MAX_RX_BUFF];
volatile uint8_t _receive_buffer_tail;
volatile uint8_t _receive_buffer_head;
uint32_t delta_start = 0;
// static data
static HardwareTimer timer;
static const IRQn_Type timer_interrupt_number;
static uint32_t timer_interrupt_priority;
static SoftwareSerial *active_listener;
static SoftwareSerial *volatile active_out;
static SoftwareSerial *volatile active_in;
static int32_t tx_tick_cnt;
static volatile int32_t rx_tick_cnt;
static uint32_t tx_buffer;
static int32_t tx_bit_cnt;
static uint32_t rx_buffer;
static int32_t rx_bit_cnt;
static uint32_t cur_speed;
// private methods
void send();
void recv();
void setTX();
void setRX();
void setSpeed(uint32_t speed);
void setRXTX(bool input);
static void handleInterrupt(HardwareTimer *timer);
public:
// public methods
SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic=false);
virtual ~SoftwareSerial();
void begin(long speed);
bool listen();
void end();
bool isListening() { return active_listener == this; }
bool stopListening();
bool overflow() {
bool ret = _buffer_overflow;
if (ret) _buffer_overflow = false;
return ret;
}
int peek();
virtual size_t write(uint8_t byte);
virtual int read();
virtual int available();
virtual void flush();
operator bool() { return true; }
static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority);
using Print::write;
};

View file

@ -51,19 +51,19 @@ void FastIO_init(); // Must be called before using fast io macros
#if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) #if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx)
#define _WRITE(IO, V) do { \ #define _WRITE(IO, V) do { \
if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO])) ; \ if (V) FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \
else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(STM_PIN(digitalPin[IO])) ; \ else FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \
}while(0) }while(0)
#else #else
#define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO]) + ((V) ? 0 : 16))) #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO)) + ((V) ? 0 : 16)))
#endif #endif
#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(STM_PIN(digitalPin[IO])))) #define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->IDR, _BV32(STM_PIN(digitalPinToPinName(IO)))))
#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(STM_PIN(digitalPin[IO]))) #define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR ^= _BV32(STM_PIN(digitalPinToPinName(IO))))
#define _GET_MODE(IO) #define _GET_MODE(IO)
#define _SET_MODE(IO,M) pinMode(IO, M) #define _SET_MODE(IO,M) pinMode(IO, M)
#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ #define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) //!< Output Push Pull Mode & GPIO_NOPULL
#define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN) #define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN)
#define WRITE(IO,V) _WRITE(IO,V) #define WRITE(IO,V) _WRITE(IO,V)
@ -73,9 +73,9 @@ void FastIO_init(); // Must be called before using fast io macros
#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) #define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
#define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) #define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0)
#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ #define SET_INPUT(IO) _SET_MODE(IO, INPUT) //!< Input Floating Mode
#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ #define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) //!< Input with Pull-up activation
#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ #define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) //!< Input with Pull-down activation
#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) #define SET_OUTPUT(IO) OUT_WRITE(IO, LOW)
#define SET_PWM(IO) _SET_MODE(IO, PWM) #define SET_PWM(IO) _SET_MODE(IO, PWM)

View file

@ -98,7 +98,7 @@ static inline void pwm_details(const pin_t pin) {
timer_dev * const tdev = PIN_MAP[pin].timer_device; timer_dev * const tdev = PIN_MAP[pin].timer_device;
const uint8_t channel = PIN_MAP[pin].timer_channel; const uint8_t channel = PIN_MAP[pin].timer_channel;
const char num = ( const char num = (
#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY)
tdev == &timer8 ? '8' : tdev == &timer8 ? '8' :
tdev == &timer5 ? '5' : tdev == &timer5 ? '5' :
#endif #endif

View file

@ -51,8 +51,8 @@
* It contains: * It contains:
* - name of the signal * - name of the signal
* - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines. * - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines.
* EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as an * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as the
* index into digitalPin[] to get the Port_pin number * argument to digitalPinToPinName(IO) to get the Port_pin number
* - if it is a digital or analog signal. PWMs are considered digital here. * - if it is a digital or analog signal. PWMs are considered digital here.
* *
* pin_xref is a structure generated by this header file. It is generated by the * pin_xref is a structure generated by this header file. It is generated by the
@ -68,8 +68,6 @@
* signal. The Arduino pin number is listed by the M43 I command. * signal. The Arduino pin number is listed by the M43 I command.
*/ */
extern const PinName digitalPin[]; // provided by the platform
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
// //
// make a list of the Arduino pin numbers in the Port/Pin order // make a list of the Arduino pin numbers in the Port/Pin order
@ -137,7 +135,7 @@ const XrefInfo pin_xref[] PROGMEM = {
uint8_t get_pin_mode(const pin_t Ard_num) { uint8_t get_pin_mode(const pin_t Ard_num) {
uint32_t mode_all = 0; uint32_t mode_all = 0;
const PinName dp = digitalPin[Ard_num]; const PinName dp = digitalPinToPinName(Ard_num);
switch (PORT_ALPHA(dp)) { switch (PORT_ALPHA(dp)) {
case 'A' : mode_all = GPIOA->MODER; break; case 'A' : mode_all = GPIOA->MODER; break;
case 'B' : mode_all = GPIOB->MODER; break; case 'B' : mode_all = GPIOB->MODER; break;
@ -218,7 +216,7 @@ bool pwm_status(const pin_t Ard_num) {
void pwm_details(const pin_t Ard_num) { void pwm_details(const pin_t Ard_num) {
if (pwm_status(Ard_num)) { if (pwm_status(Ard_num)) {
uint32_t alt_all = 0; uint32_t alt_all = 0;
const PinName dp = digitalPin[Ard_num]; const PinName dp = digitalPinToPinName(Ard_num);
pin_t pin_number = uint8_t(PIN_NUM(dp)); pin_t pin_number = uint8_t(PIN_NUM(dp));
const bool over_7 = pin_number >= 8; const bool over_7 = pin_number >= 8;
const uint8_t ind = over_7 ? 1 : 0; const uint8_t ind = over_7 ? 1 : 0;

View file

@ -87,7 +87,7 @@ void TFT_FSMC::Init() {
__HAL_RCC_FSMC_CLK_ENABLE(); __HAL_RCC_FSMC_CLK_ENABLE();
for(uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) for (uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++)
pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC); pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC);
pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS);
pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS);

View file

@ -38,7 +38,7 @@
#define DATASIZE_8BIT SPI_DATASIZE_8BIT #define DATASIZE_8BIT SPI_DATASIZE_8BIT
#define DATASIZE_16BIT SPI_DATASIZE_16BIT #define DATASIZE_16BIT SPI_DATASIZE_16BIT
#define TFT_IO TFT_FSMC #define TFT_IO_DRIVER TFT_FSMC
#ifdef STM32F1xx #ifdef STM32F1xx
#define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN)

View file

@ -38,7 +38,7 @@
#define DATASIZE_8BIT SPI_DATASIZE_8BIT #define DATASIZE_8BIT SPI_DATASIZE_8BIT
#define DATASIZE_16BIT SPI_DATASIZE_16BIT #define DATASIZE_16BIT SPI_DATASIZE_16BIT
#define TFT_IO TFT_SPI #define TFT_IO_DRIVER TFT_SPI
class TFT_SPI { class TFT_SPI {
private: private:

View file

@ -155,9 +155,9 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) {
uint16_t XPT2046::HardwareIO(uint16_t data) { uint16_t XPT2046::HardwareIO(uint16_t data) {
__HAL_SPI_ENABLE(&SPIx); __HAL_SPI_ENABLE(&SPIx);
while((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {}
SPIx.Instance->DR = data; SPIx.Instance->DR = data;
while((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {}
__HAL_SPI_DISABLE(&SPIx); __HAL_SPI_DISABLE(&SPIx);
return SPIx.Instance->DR; return SPIx.Instance->DR;

View file

@ -110,7 +110,6 @@
// ------------------------ // ------------------------
HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL }; HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL };
bool timer_enabled[NUM_HARDWARE_TIMERS] = { false };
// ------------------------ // ------------------------
// Public functions // Public functions
@ -135,6 +134,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
* which changes the prescaler when an IRQ frequency change is needed * which changes the prescaler when an IRQ frequency change is needed
* (for example when steppers are turned on) * (for example when steppers are turned on)
*/ */
timer_instance[timer_num]->setPrescaleFactor(STEPPER_TIMER_PRESCALE); //the -1 is done internally timer_instance[timer_num]->setPrescaleFactor(STEPPER_TIMER_PRESCALE); //the -1 is done internally
timer_instance[timer_num]->setOverflow(_MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE) /* /frequency */), TICK_FORMAT); timer_instance[timer_num]->setOverflow(_MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE) /* /frequency */), TICK_FORMAT);
break; break;
@ -145,15 +145,13 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
break; break;
} }
// Disable preload. Leaving it default-enabled can cause the timer to stop if it happens
// to exit the ISR after the start time for the next interrupt has already passed.
timer_instance[timer_num]->setPreloadEnable(false);
HAL_timer_enable_interrupt(timer_num); HAL_timer_enable_interrupt(timer_num);
/* // Start the timer.
* Initializes (and unfortunately starts) the timer.
* This is needed to set correct IRQ priority at the moment but causes
* no harm since every call to HAL_timer_start() is actually followed by
* a call to HAL_timer_enable_interrupt() which means that there isn't
* a case in which you want the timer to run without a callback.
*/
timer_instance[timer_num]->resume(); // First call to resume() MUST follow the attachInterrupt() timer_instance[timer_num]->resume(); // First call to resume() MUST follow the attachInterrupt()
// This is fixed in Arduino_Core_STM32 1.8. // This is fixed in Arduino_Core_STM32 1.8.
@ -161,47 +159,34 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
// timer_instance[timer_num]->setInterruptPriority // timer_instance[timer_num]->setInterruptPriority
switch (timer_num) { switch (timer_num) {
case STEP_TIMER_NUM: case STEP_TIMER_NUM:
HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, STEP_TIMER_IRQ_PRIO, 0); timer_instance[timer_num]->setInterruptPriority(STEP_TIMER_IRQ_PRIO, 0);
break; break;
case TEMP_TIMER_NUM: case TEMP_TIMER_NUM:
HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, TEMP_TIMER_IRQ_PRIO, 0); timer_instance[timer_num]->setInterruptPriority(TEMP_TIMER_IRQ_PRIO, 0);
break; break;
} }
} }
} }
void HAL_timer_enable_interrupt(const uint8_t timer_num) { void HAL_timer_enable_interrupt(const uint8_t timer_num) {
if (HAL_timer_initialized(timer_num) && !timer_enabled[timer_num]) { if (HAL_timer_initialized(timer_num) && !timer_instance[timer_num]->hasInterrupt()) {
timer_enabled[timer_num] = true;
switch (timer_num) { switch (timer_num) {
case STEP_TIMER_NUM: case STEP_TIMER_NUM:
timer_instance[timer_num]->attachInterrupt(Step_Handler); timer_instance[timer_num]->attachInterrupt(Step_Handler);
break; break;
case TEMP_TIMER_NUM: case TEMP_TIMER_NUM:
timer_instance[timer_num]->attachInterrupt(Temp_Handler); timer_instance[timer_num]->attachInterrupt(Temp_Handler);
break; break;
} }
} }
} }
void HAL_timer_disable_interrupt(const uint8_t timer_num) { void HAL_timer_disable_interrupt(const uint8_t timer_num) {
if (HAL_timer_interrupt_enabled(timer_num)) { if (HAL_timer_initialized(timer_num)) timer_instance[timer_num]->detachInterrupt();
timer_instance[timer_num]->detachInterrupt();
timer_enabled[timer_num] = false;
}
} }
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
return HAL_timer_initialized(timer_num) && timer_enabled[timer_num]; return HAL_timer_initialized(timer_num) && timer_instance[timer_num]->hasInterrupt();
}
// Only for use within the HAL
TIM_TypeDef * HAL_timer_device(const uint8_t timer_num) {
switch (timer_num) {
case STEP_TIMER_NUM: return STEP_TIMER_DEV;
case TEMP_TIMER_NUM: return TEMP_TIMER_DEV;
}
return nullptr;
} }
void SetTimerInterruptPriorities() { void SetTimerInterruptPriorities() {
@ -209,4 +194,87 @@ void SetTimerInterruptPriorities() {
TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0)); TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0));
} }
// This is a terrible hack to replicate the behavior used in the framework's SoftwareSerial.cpp
// to choose a serial timer. It will select TIM7 on most boards used by Marlin, but this is more
// resiliant to new MCUs which may not have a TIM7. Best practice is to explicitly specify
// TIMER_SERIAL to avoid relying on framework selections which may not be predictable.
#if !defined(TIMER_SERIAL)
#if defined (TIM18_BASE)
#define TIMER_SERIAL TIM18
#elif defined (TIM7_BASE)
#define TIMER_SERIAL TIM7
#elif defined (TIM6_BASE)
#define TIMER_SERIAL TIM6
#elif defined (TIM22_BASE)
#define TIMER_SERIAL TIM22
#elif defined (TIM21_BASE)
#define TIMER_SERIAL TIM21
#elif defined (TIM17_BASE)
#define TIMER_SERIAL TIM17
#elif defined (TIM16_BASE)
#define TIMER_SERIAL TIM16
#elif defined (TIM15_BASE)
#define TIMER_SERIAL TIM15
#elif defined (TIM14_BASE)
#define TIMER_SERIAL TIM14
#elif defined (TIM13_BASE)
#define TIMER_SERIAL TIM13
#elif defined (TIM11_BASE)
#define TIMER_SERIAL TIM11
#elif defined (TIM10_BASE)
#define TIMER_SERIAL TIM10
#elif defined (TIM12_BASE)
#define TIMER_SERIAL TIM12
#elif defined (TIM19_BASE)
#define TIMER_SERIAL TIM19
#elif defined (TIM9_BASE)
#define TIMER_SERIAL TIM9
#elif defined (TIM5_BASE)
#define TIMER_SERIAL TIM5
#elif defined (TIM4_BASE)
#define TIMER_SERIAL TIM4
#elif defined (TIM3_BASE)
#define TIMER_SERIAL TIM3
#elif defined (TIM2_BASE)
#define TIMER_SERIAL TIM2
#elif defined (TIM20_BASE)
#define TIMER_SERIAL TIM20
#elif defined (TIM8_BASE)
#define TIMER_SERIAL TIM8
#elif defined (TIM1_BASE)
#define TIMER_SERIAL TIM1
#else
#error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h
#endif
#endif
// Place all timers used into an array, then recursively check for duplicates during compilation.
// This does not currently account for timers used for PWM, such as for fans.
// Timers are actually pointers. Convert to integers to simplify constexpr logic.
static constexpr uintptr_t timers_in_use[] = {
uintptr_t(TEMP_TIMER_DEV), // Override in pins file
uintptr_t(STEP_TIMER_DEV), // Override in pins file
#if HAS_TMC_SW_SERIAL
uintptr_t(TIMER_SERIAL), // Set in variant.h, or as a define in platformio.h if not present in variant.h
#endif
#if ENABLED(SPEAKER)
uintptr_t(TIMER_TONE), // Set in variant.h, or as a define in platformio.h if not present in variant.h
#endif
#if HAS_SERVOS
uintptr_t(TIMER_SERVO), // Set in variant.h, or as a define in platformio.h if not present in variant.h
#endif
};
static constexpr bool verify_no_duplicate_timers() {
LOOP_L_N(i, COUNT(timers_in_use))
LOOP_S_L_N(j, i + 1, COUNT(timers_in_use))
if (timers_in_use[i] == timers_in_use[j]) return false;
return true;
}
// If this assertion fails at compile time, review the timers_in_use array. If default_envs is
// defined properly in platformio.ini, VS Code can evaluate the array when hovering over it,
// making it easy to identify the conflicting timers.
static_assert(verify_no_duplicate_timers(), "One or more timer conflict detected");
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC

View file

@ -30,8 +30,18 @@
#define FORCE_INLINE __attribute__((always_inline)) inline #define FORCE_INLINE __attribute__((always_inline)) inline
// STM32 timers may be 16 or 32 bit. Limiting HAL_TIMER_TYPE_MAX to 16 bits
// avoids issues with STM32F0 MCUs, which seem to pause timers if UINT32_MAX
// is written to the register. STM32F4 timers do not manifest this issue,
// even when writing to 16 bit timers.
//
// The range of the timer can be queried at runtime using IS_TIM_32B_COUNTER_INSTANCE.
// This is a more expensive check than a simple compile-time constant, so its
// implementation is deferred until the desire for a 32-bit range outweighs the cost
// of adding a run-time check and HAL_TIMER_TYPE_MAX is refactored to allow unique
// values for each timer.
#define hal_timer_t uint32_t #define hal_timer_t uint32_t
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF // Timers can be 16 or 32 bit #define HAL_TIMER_TYPE_MAX UINT16_MAX
#ifndef STEP_TIMER_NUM #ifndef STEP_TIMER_NUM
#define STEP_TIMER_NUM 0 // Timer Index for Stepper #define STEP_TIMER_NUM 0 // Timer Index for Stepper
@ -61,14 +71,14 @@
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
extern void Step_Handler(HardwareTimer *htim); extern void Step_Handler();
extern void Temp_Handler(HardwareTimer *htim); extern void Temp_Handler();
#ifndef HAL_STEP_TIMER_ISR #ifndef HAL_STEP_TIMER_ISR
#define HAL_STEP_TIMER_ISR() void Step_Handler(HardwareTimer *htim) #define HAL_STEP_TIMER_ISR() void Step_Handler()
#endif #endif
#ifndef HAL_TEMP_TIMER_ISR #ifndef HAL_TEMP_TIMER_ISR
#define HAL_TEMP_TIMER_ISR() void Temp_Handler(HardwareTimer *htim) #define HAL_TEMP_TIMER_ISR() void Temp_Handler()
#endif #endif
// ------------------------ // ------------------------
@ -90,8 +100,6 @@ bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
// Exposed here to allow all timer priority information to reside in timers.cpp // Exposed here to allow all timer priority information to reside in timers.cpp
void SetTimerInterruptPriorities(); void SetTimerInterruptPriorities();
//TIM_TypeDef* HAL_timer_device(const uint8_t timer_num); no need to be public for now. not public = not used externally
// FORCE_INLINE because these are used in performance-critical situations // FORCE_INLINE because these are used in performance-critical situations
FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_num) { FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_num) {
return timer_instance[timer_num] != NULL; return timer_instance[timer_num] != NULL;

View file

@ -30,7 +30,11 @@
#include "watchdog.h" #include "watchdog.h"
#include <IWatchdog.h> #include <IWatchdog.h>
void watchdog_init() { IWatchdog.begin(4000000); } // 4 sec timeout void watchdog_init() {
#if DISABLED(DISABLE_WATCHDOG_INIT)
IWatchdog.begin(4000000); // 4 sec timeout
#endif
}
void HAL_watchdog_refresh() { void HAL_watchdog_refresh() {
IWatchdog.reload(); IWatchdog.reload();

View file

@ -97,6 +97,9 @@ const uint8_t adc_pins[] = {
#if HAS_TEMP_ADC_0 #if HAS_TEMP_ADC_0
TEMP_0_PIN, TEMP_0_PIN,
#endif #endif
#if HAS_TEMP_ADC_PROBE
TEMP_PROBE_PIN,
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
TEMP_BED_PIN, TEMP_BED_PIN,
#endif #endif
@ -151,6 +154,9 @@ enum TempPinIndex : char {
#if HAS_TEMP_ADC_0 #if HAS_TEMP_ADC_0
TEMP_0, TEMP_0,
#endif #endif
#if HAS_TEMP_ADC_PROBE
TEMP_PROBE,
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
TEMP_BED, TEMP_BED,
#endif #endif
@ -341,6 +347,9 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) {
#if HAS_TEMP_ADC_0 #if HAS_TEMP_ADC_0
case TEMP_0_PIN: pin_index = TEMP_0; break; case TEMP_0_PIN: pin_index = TEMP_0; break;
#endif #endif
#if HAS_TEMP_ADC_PROBE
case TEMP_PROBE_PIN: pin_index = TEMP_PROBE; break;
#endif
#if HAS_HEATED_BED #if HAS_HEATED_BED
case TEMP_BED_PIN: pin_index = TEMP_BED; break; case TEMP_BED_PIN: pin_index = TEMP_BED; break;
#endif #endif

View file

@ -46,12 +46,14 @@
#include "msc_sd.h" #include "msc_sd.h"
#endif #endif
#include "MarlinSerial.h"
// ------------------------ // ------------------------
// Defines // Defines
// ------------------------ // ------------------------
#ifndef STM32_FLASH_SIZE #ifndef STM32_FLASH_SIZE
#if defined(MCU_STM32F103RE) || defined(MCU_STM32F103VE) #if EITHER(MCU_STM32F103RE, MCU_STM32F103VE)
#define STM32_FLASH_SIZE 512 #define STM32_FLASH_SIZE 512
#else #else
#define STM32_FLASH_SIZE 256 #define STM32_FLASH_SIZE 256
@ -64,86 +66,50 @@
#else #else
#define UsbSerial MarlinCompositeSerial #define UsbSerial MarlinCompositeSerial
#endif #endif
#define MSerial1 Serial1
#define MSerial2 Serial2
#define MSerial3 Serial3
#define MSerial4 Serial4
#define MSerial5 Serial5
#else
#define MSerial1 Serial
#define MSerial2 Serial1
#define MSerial3 Serial2
#define MSerial4 Serial3
#define MSerial5 Serial4
#endif #endif
#if SERIAL_PORT == 0 #define _MSERIAL(X) MSerial##X
#error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." #define MSERIAL(X) _MSERIAL(X)
#elif SERIAL_PORT == -1
#define MYSERIAL0 UsbSerial #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY)
#elif SERIAL_PORT == 1 #define NUM_UARTS 5
#define MYSERIAL0 MSerial1
#elif SERIAL_PORT == 2
#define MYSERIAL0 MSerial2
#elif SERIAL_PORT == 3
#define MYSERIAL0 MSerial3
#elif SERIAL_PORT == 4
#define MYSERIAL0 MSerial4
#elif SERIAL_PORT == 5
#define MYSERIAL0 MSerial5
#else #else
#error "SERIAL_PORT must be from -1 to 5. Please update your configuration." #define NUM_UARTS 3
#endif
#if SERIAL_PORT == -1
#define MYSERIAL0 UsbSerial
#elif WITHIN(SERIAL_PORT, 1, NUM_UARTS)
#define MYSERIAL0 MSERIAL(SERIAL_PORT)
#elif NUM_UARTS == 5
#error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration."
#else
#error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration."
#endif #endif
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if SERIAL_PORT_2 == 0 #if SERIAL_PORT_2 == -1
#error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration."
#elif SERIAL_PORT_2 == SERIAL_PORT
#error "SERIAL_PORT_2 must be different than SERIAL_PORT. Please update your configuration."
#elif SERIAL_PORT_2 == -1
#define MYSERIAL1 UsbSerial #define MYSERIAL1 UsbSerial
#elif SERIAL_PORT_2 == 1 #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS)
#define MYSERIAL1 MSerial1 #define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
#elif SERIAL_PORT_2 == 2 #elif NUM_UARTS == 5
#define MYSERIAL1 MSerial2 #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration."
#elif SERIAL_PORT_2 == 3
#define MYSERIAL1 MSerial3
#elif SERIAL_PORT_2 == 4
#define MYSERIAL1 MSerial4
#elif SERIAL_PORT_2 == 5
#define MYSERIAL1 MSerial5
#else #else
#error "SERIAL_PORT_2 must be from -1 to 5. Please update your configuration." #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration."
#endif
#define NUM_SERIAL 2
#else
#define NUM_SERIAL 1
#endif
#ifdef DGUS_SERIAL
#if DGUS_SERIAL_PORT == 0
#error "DGUS_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration."
#elif DGUS_SERIAL_PORT == SERIAL_PORT
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration."
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
#elif DGUS_SERIAL_PORT == -1
#define DGUS_SERIAL UsbSerial
#elif DGUS_SERIAL_PORT == 1
#define DGUS_SERIAL MSerial1
#elif DGUS_SERIAL_PORT == 2
#define DGUS_SERIAL MSerial2
#elif DGUS_SERIAL_PORT == 3
#define DGUS_SERIAL MSerial3
#elif DGUS_SERIAL_PORT == 4
#define DGUS_SERIAL MSerial4
#elif DGUS_SERIAL_PORT == 5
#define DGUS_SERIAL MSerial5
#else
#error "DGUS_SERIAL_PORT must be from -1 to 5. Please update your configuration."
#endif #endif
#endif #endif
#ifdef LCD_SERIAL_PORT
#if LCD_SERIAL_PORT == -1
#define LCD_SERIAL UsbSerial
#elif WITHIN(LCD_SERIAL_PORT, 1, NUM_UARTS)
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
#elif NUM_UARTS == 5
#error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration."
#else
#error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration."
#endif
#endif
// Set interrupt grouping for this MCU // Set interrupt grouping for this MCU
void HAL_init(); void HAL_init();
@ -219,6 +185,8 @@ void HAL_clear_reset_source();
// Reset reason // Reset reason
uint8_t HAL_get_reset_source(); uint8_t HAL_get_reset_source();
inline void HAL_reboot() {} // reboot the board or restart the bootloader
void _delay_ms(const int delay); void _delay_ms(const int delay);
#pragma GCC diagnostic push #pragma GCC diagnostic push

View file

@ -24,9 +24,6 @@
/** /**
* Software SPI functions originally from Arduino Sd2Card Library * Software SPI functions originally from Arduino Sd2Card Library
* Copyright (c) 2009 by William Greiman * Copyright (c) 2009 by William Greiman
*/
/**
* Adapted to the STM32F1 HAL * Adapted to the STM32F1 HAL
*/ */
@ -113,7 +110,7 @@ void spiInit(uint8_t spiRate) {
* @details * @details
*/ */
uint8_t spiRec() { uint8_t spiRec() {
uint8_t returnByte = SPI.transfer(ff); uint8_t returnByte = SPI.transfer(0xFF);
return returnByte; return returnByte;
} }
@ -157,7 +154,7 @@ void spiSendBlock(uint8_t token, const uint8_t* buf) {
#if ENABLED(SPI_EEPROM) #if ENABLED(SPI_EEPROM)
// Read single byte from specified SPI channel // Read single byte from specified SPI channel
uint8_t spiRec(uint32_t chan) { return SPI.transfer(ff); } uint8_t spiRec(uint32_t chan) { return SPI.transfer(0xFF); }
// Write single byte to specified SPI channel // Write single byte to specified SPI channel
void spiSend(uint32_t chan, byte b) { SPI.send(b); } void spiSend(uint32_t chan, byte b) { SPI.send(b); }

View file

@ -0,0 +1,193 @@
/**
* 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 __STM32F1__
#include "../../inc/MarlinConfig.h"
#include "MarlinSerial.h"
#include <libmaple/usart.h>
// Copied from ~/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h
// Changed to handle Emergency Parser
static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MarlinSerial &serial) {
/* Handle RXNEIE and TXEIE interrupts.
* RXNE signifies availability of a byte in DR.
*
* See table 198 (sec 27.4, p809) in STM document RM0008 rev 15.
* We enable RXNEIE.
*/
uint32_t srflags = regs->SR, cr1its = regs->CR1;
if ((cr1its & USART_CR1_RXNEIE) && (srflags & USART_SR_RXNE)) {
if (srflags & USART_SR_FE || srflags & USART_SR_PE ) {
// framing error or parity error
regs->DR; // Read and throw away the data, which also clears FE and PE
}
else {
uint8_t c = (uint8)regs->DR;
#ifdef USART_SAFE_INSERT
// If the buffer is full and the user defines USART_SAFE_INSERT,
// ignore new bytes.
rb_safe_insert(rb, c);
#else
// By default, push bytes around in the ring buffer.
rb_push_insert(rb, c);
#endif
#if ENABLED(EMERGENCY_PARSER)
if (serial.emergency_parser_enabled())
emergency_parser.update(serial.emergency_state, c);
#endif
}
}
else if (srflags & USART_SR_ORE) {
// overrun and empty data, just do a dummy read to clear ORE
// and prevent a raise condition where a continous interrupt stream (due to ORE set) occurs
// (see chapter "Overrun error" ) in STM32 reference manual
regs->DR;
}
// TXE signifies readiness to send a byte to DR.
if ((cr1its & USART_CR1_TXEIE) && (srflags & USART_SR_TXE)) {
if (!rb_is_empty(wb))
regs->DR=rb_remove(wb);
else
regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE
}
}
// Not every MarlinSerial port should handle emergency parsing.
// It would not make sense to parse GCode from TMC responses, for example.
constexpr bool serial_handles_emergency(int port) {
return false
#ifdef SERIAL_PORT
|| (SERIAL_PORT) == port
#endif
#ifdef SERIAL_PORT_2
|| (SERIAL_PORT_2) == port
#endif
#ifdef LCD_SERIAL_PORT
|| (LCD_SERIAL_PORT) == port
#endif
;
}
#define DEFINE_HWSERIAL_MARLIN(name, n) \
MarlinSerial name(USART##n, \
BOARD_USART##n##_TX_PIN, \
BOARD_USART##n##_RX_PIN, \
serial_handles_emergency(n)); \
extern "C" void __irq_usart##n(void) { \
my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \
}
#define DEFINE_HWSERIAL_UART_MARLIN(name, n) \
MarlinSerial name(UART##n, \
BOARD_USART##n##_TX_PIN, \
BOARD_USART##n##_RX_PIN, \
serial_handles_emergency(n)); \
extern "C" void __irq_usart##n(void) { \
my_usart_irq(UART##n->rb, UART##n->wb, UART##n##_BASE, MSerial##n); \
}
// Instantiate all UARTs even if they are not needed
// This avoids a bunch of logic to figure out every serial
// port which may be in use on the system.
DEFINE_HWSERIAL_MARLIN(MSerial1, 1);
DEFINE_HWSERIAL_MARLIN(MSerial2, 2);
DEFINE_HWSERIAL_MARLIN(MSerial3, 3);
#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY)
DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4);
DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5);
#endif
// Check the type of each serial port by passing it to a template function.
// HardwareSerial is known to sometimes hang the controller when an error occurs,
// so this case will fail the static assert. All other classes are assumed to be ok.
template <typename T>
constexpr bool IsSerialClassAllowed(const T&) { return true; }
constexpr bool IsSerialClassAllowed(const HardwareSerial&) { return false; }
#define CHECK_CFG_SERIAL(A) static_assert(IsSerialClassAllowed(A), STRINGIFY(A) " is defined incorrectly");
#define CHECK_AXIS_SERIAL(A) static_assert(IsSerialClassAllowed(A##_HARDWARE_SERIAL), STRINGIFY(A) "_HARDWARE_SERIAL must be defined in the form MSerial1, rather than Serial1");
// If you encounter this error, replace SerialX with MSerialX, for example MSerial3.
// Non-TMC ports were already validated in HAL.h, so do not require verbose error messages.
#ifdef MYSERIAL0
CHECK_CFG_SERIAL(MYSERIAL0);
#endif
#ifdef MYSERIAL1
CHECK_CFG_SERIAL(MYSERIAL1);
#endif
#ifdef LCD_SERIAL
CHECK_CFG_SERIAL(LCD_SERIAL);
#endif
#if AXIS_HAS_HW_SERIAL(X)
CHECK_AXIS_SERIAL(X);
#endif
#if AXIS_HAS_HW_SERIAL(X2)
CHECK_AXIS_SERIAL(X2);
#endif
#if AXIS_HAS_HW_SERIAL(Y)
CHECK_AXIS_SERIAL(Y);
#endif
#if AXIS_HAS_HW_SERIAL(Y2)
CHECK_AXIS_SERIAL(Y2);
#endif
#if AXIS_HAS_HW_SERIAL(Z)
CHECK_AXIS_SERIAL(Z);
#endif
#if AXIS_HAS_HW_SERIAL(Z2)
CHECK_AXIS_SERIAL(Z2);
#endif
#if AXIS_HAS_HW_SERIAL(Z3)
CHECK_AXIS_SERIAL(Z3);
#endif
#if AXIS_HAS_HW_SERIAL(Z4)
CHECK_AXIS_SERIAL(Z4);
#endif
#if AXIS_HAS_HW_SERIAL(E0)
CHECK_AXIS_SERIAL(E0);
#endif
#if AXIS_HAS_HW_SERIAL(E1)
CHECK_AXIS_SERIAL(E1);
#endif
#if AXIS_HAS_HW_SERIAL(E2)
CHECK_AXIS_SERIAL(E2);
#endif
#if AXIS_HAS_HW_SERIAL(E3)
CHECK_AXIS_SERIAL(E3);
#endif
#if AXIS_HAS_HW_SERIAL(E4)
CHECK_AXIS_SERIAL(E4);
#endif
#if AXIS_HAS_HW_SERIAL(E5)
CHECK_AXIS_SERIAL(E5);
#endif
#if AXIS_HAS_HW_SERIAL(E6)
CHECK_AXIS_SERIAL(E6);
#endif
#if AXIS_HAS_HW_SERIAL(E7)
CHECK_AXIS_SERIAL(E7);
#endif
#endif // __STM32F1__

View file

@ -0,0 +1,71 @@
/**
* 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/>.
*
*/
#pragma once
#include <HardwareSerial.h>
#include <libmaple/usart.h>
#include <WString.h>
#include "../../inc/MarlinConfigPre.h"
#if ENABLED(EMERGENCY_PARSER)
#include "../../feature/e_parser.h"
#endif
// Increase priority of serial interrupts, to reduce overflow errors
#define UART_IRQ_PRIO 1
class MarlinSerial : public HardwareSerial {
public:
#if ENABLED(EMERGENCY_PARSER)
const bool ep_enabled;
EmergencyParser::State emergency_state;
inline bool emergency_parser_enabled() { return ep_enabled; }
#endif
MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin, bool TERN_(EMERGENCY_PARSER, ep_capable)) :
HardwareSerial(usart_device, tx_pin, rx_pin)
#if ENABLED(EMERGENCY_PARSER)
, ep_enabled(ep_capable)
, emergency_state(EmergencyParser::State::EP_RESET)
#endif
{ }
#ifdef UART_IRQ_PRIO
// Shadow the parent methods to set IRQ priority after begin()
void begin(uint32 baud) {
MarlinSerial::begin(baud, SERIAL_8N1);
}
void begin(uint32 baud, uint8_t config) {
HardwareSerial::begin(baud, config);
nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO);
}
#endif
};
extern MarlinSerial MSerial1;
extern MarlinSerial MSerial2;
extern MarlinSerial MSerial3;
#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY)
extern MarlinSerial MSerial4;
extern MarlinSerial MSerial5;
#endif

View file

@ -40,6 +40,9 @@
#include <boards.h> #include <boards.h>
#include <wirish.h> #include <wirish.h>
#include "../../inc/MarlinConfig.h"
#include "spi_pins.h"
/** Time in ms for DMA receive timeout */ /** Time in ms for DMA receive timeout */
#define DMA_TIMEOUT 100 #define DMA_TIMEOUT 100
@ -710,6 +713,6 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) {
return baud_rates[i]; return baud_rates[i];
} }
SPIClass SPI(1); SPIClass SPI(SPI_DEVICE);
#endif // __STM32F1__ #endif // __STM32F1__

View file

@ -57,4 +57,4 @@ void SoftwareSerial::stopListening() {
listening = false; listening = false;
} }
#endif //__STM32F1__ #endif // __STM32F1__

View file

@ -20,9 +20,8 @@
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
#if BOTH(HAS_GRAPHICAL_LCD, FORCE_SOFT_SPI) #if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
#include "../HAL.h"
#include <U8glib.h> #include <U8glib.h>
#undef SPI_SPEED #undef SPI_SPEED
@ -161,5 +160,5 @@ uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1; return 1;
} }
#endif // HAS_GRAPHICAL_LCD #endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI
#endif // STM32F1 #endif // STM32F1

View file

@ -25,6 +25,8 @@
* with simple implementations supplied by Marlin. * with simple implementations supplied by Marlin.
*/ */
#ifdef __STM32F1__
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(IIC_BL24CXX_EEPROM) #if ENABLED(IIC_BL24CXX_EEPROM)
@ -79,3 +81,4 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
} }
#endif // IIC_BL24CXX_EEPROM #endif // IIC_BL24CXX_EEPROM
#endif // __STM32F1__

View file

@ -25,6 +25,8 @@
* Enable USE_SHARED_EEPROM if not supplied by the framework. * Enable USE_SHARED_EEPROM if not supplied by the framework.
*/ */
#ifdef __STM32F1__
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(IIC_BL24CXX_EEPROM) #if ENABLED(IIC_BL24CXX_EEPROM)
@ -49,3 +51,4 @@ uint8_t eeprom_read_byte(uint8_t *pos) {
} }
#endif // IIC_BL24CXX_EEPROM #endif // IIC_BL24CXX_EEPROM
#endif // __STM32F1__

View file

@ -17,17 +17,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
* *
*/ */
/**
* HAL PersistentStore for STM32F1
*/
#ifdef __STM32F1__ #ifdef __STM32F1__
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if USE_WIRED_EEPROM #if USE_WIRED_EEPROM
/**
* PersistentStore for Arduino-style EEPROM interface
* with simple implementations supplied by Marlin.
*/
#include "../shared/eeprom_if.h" #include "../shared/eeprom_if.h"
#include "../shared/eeprom_api.h" #include "../shared/eeprom_api.h"

View file

@ -25,10 +25,3 @@
//#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE."
#undef SD_CHECK_AND_RETRY #undef SD_CHECK_AND_RETRY
#endif #endif
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT
#undef TOUCH_SCREEN
#undef TOUCH_SCREEN_CALIBRATION
#define HAS_TOUCH_XPT2046 1
#endif

View file

@ -25,10 +25,6 @@
* Test STM32F1-specific configuration values for errors at compile-time. * Test STM32F1-specific configuration values for errors at compile-time.
*/ */
#if ENABLED(EMERGENCY_PARSER)
#error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue."
#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 STM32F1." #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1."
#endif #endif

View file

@ -13,7 +13,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
* *
*/ */
#ifdef USE_USB_COMPOSITE #if defined(__STM32F1__) && defined(USE_USB_COMPOSITE)
#include "msc_sd.h" #include "msc_sd.h"
#include "SPI.h" #include "SPI.h"
@ -21,7 +21,7 @@
#define PRODUCT_ID 0x29 #define PRODUCT_ID 0x29
USBMassStorage MarlinMSC; USBMassStorage MarlinMSC;
USBCompositeSerial MarlinCompositeSerial; MarlinUSBCompositeSerial MarlinCompositeSerial;
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
@ -38,6 +38,17 @@ USBCompositeSerial MarlinCompositeSerial;
#endif #endif
#if ENABLED(EMERGENCY_PARSER)
void (*real_rx_callback)(void);
void my_rx_callback(void) {
real_rx_callback();
int len = MarlinCompositeSerial.available();
while (len-- > 0) // >0 because available() may return a negative value
emergency_parser.update(MarlinCompositeSerial.emergency_state, MarlinCompositeSerial.peek());
}
#endif
void MSC_SD_init() { void MSC_SD_init() {
USBComposite.setProductId(PRODUCT_ID); USBComposite.setProductId(PRODUCT_ID);
// Just set MarlinCompositeSerial enabled to true // Just set MarlinCompositeSerial enabled to true
@ -59,6 +70,11 @@ void MSC_SD_init() {
// Register composite Serial // Register composite Serial
MarlinCompositeSerial.registerComponent(); MarlinCompositeSerial.registerComponent();
USBComposite.begin(); USBComposite.begin();
#if ENABLED(EMERGENCY_PARSER)
//rx is usbSerialPart.endpoints[2]
real_rx_callback = usbSerialPart.endpoints[2].callback;
usbSerialPart.endpoints[2].callback = my_rx_callback;
#endif
} }
#endif // USE_USB_COMPOSITE #endif // __STM32F1__ && USE_USB_COMPOSITE

View file

@ -17,7 +17,26 @@
#include <USBComposite.h> #include <USBComposite.h>
#include "../../inc/MarlinConfigPre.h"
#if ENABLED(EMERGENCY_PARSER)
#include "../../feature/e_parser.h"
#endif
class MarlinUSBCompositeSerial : public USBCompositeSerial {
public:
MarlinUSBCompositeSerial() : USBCompositeSerial()
#if ENABLED(EMERGENCY_PARSER)
, emergency_state(EmergencyParser::State::EP_RESET)
#endif
{ }
#if ENABLED(EMERGENCY_PARSER)
EmergencyParser::State emergency_state;
inline bool emergency_parser_enabled() { return true; }
#endif
};
extern USBMassStorage MarlinMSC; extern USBMassStorage MarlinMSC;
extern USBCompositeSerial MarlinCompositeSerial; extern MarlinUSBCompositeSerial MarlinCompositeSerial;
void MSC_SD_init(); void MSC_SD_init();

View file

@ -9,9 +9,10 @@
* No restriction on use. You can use, modify and redistribute it for * No restriction on use. You can use, modify and redistribute it for
* personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. * personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
* Redistributions of source code must retain the above copyright notice. * Redistributions of source code must retain the above copyright notice.
*
*/ */
#ifdef __STM32F1__
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if SD_CONNECTION_IS(ONBOARD) #if SD_CONNECTION_IS(ONBOARD)
@ -21,23 +22,23 @@
#include "fastio.h" #include "fastio.h"
#if HAS_SHARED_MEDIA #if HAS_SHARED_MEDIA
#ifndef ON_BOARD_SPI_DEVICE #ifndef ONBOARD_SPI_DEVICE
#define ON_BOARD_SPI_DEVICE SPI_DEVICE #define ONBOARD_SPI_DEVICE SPI_DEVICE
#endif #endif
#define ONBOARD_SD_SPI SPI #define ONBOARD_SD_SPI SPI
#else #else
SPIClass OnBoardSPI(ON_BOARD_SPI_DEVICE); SPIClass OnboardSPI(ONBOARD_SPI_DEVICE);
#define ONBOARD_SD_SPI OnBoardSPI #define ONBOARD_SD_SPI OnboardSPI
#endif #endif
#if ON_BOARD_SPI_DEVICE == 1 #if ONBOARD_SPI_DEVICE == 1
#define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_4 #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_4
#else #else
#define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_2 #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_2
#endif #endif
#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnBoardSPI cs low */ #define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnboardSPI cs low */
#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnBoardSPI cs high */ #define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnboardSPI cs high */
#define FCLK_FAST() ONBOARD_SD_SPI.setClockDivider(SPI_CLOCK_MAX) #define FCLK_FAST() ONBOARD_SD_SPI.setClockDivider(SPI_CLOCK_MAX)
#define FCLK_SLOW() ONBOARD_SD_SPI.setClockDivider(SPI_BAUD_PCLK_DIV_256) #define FCLK_SLOW() ONBOARD_SD_SPI.setClockDivider(SPI_BAUD_PCLK_DIV_256)
@ -152,7 +153,7 @@ static int select() { /* 1:OK, 0:Timeout */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static void power_on() { /* Enable SSP module and attach it to I/O pads */ static void power_on() { /* Enable SSP module and attach it to I/O pads */
ONBOARD_SD_SPI.setModule(ON_BOARD_SPI_DEVICE); ONBOARD_SD_SPI.setModule(ONBOARD_SPI_DEVICE);
ONBOARD_SD_SPI.begin(); ONBOARD_SD_SPI.begin();
ONBOARD_SD_SPI.setBitOrder(MSBFIRST); ONBOARD_SD_SPI.setBitOrder(MSBFIRST);
ONBOARD_SD_SPI.setDataMode(SPI_MODE0); ONBOARD_SD_SPI.setDataMode(SPI_MODE0);
@ -554,3 +555,4 @@ DRESULT disk_read (
#endif // _DISKIO_IOCTL #endif // _DISKIO_IOCTL
#endif // SD_CONNECTION_IS(ONBOARD) #endif // SD_CONNECTION_IS(ONBOARD)
#endif // __STM32F1__

View file

@ -26,7 +26,7 @@
#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density #include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density
#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY) #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY)
#include "sdio.h" #include "sdio.h"
@ -108,7 +108,7 @@ bool SDIO_ReadBlock_DMA(uint32_t blockAddress, uint8_t *data) {
SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS);
dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL);
return false; return false;
} }
//Wait for DMA transaction to complete //Wait for DMA transaction to complete
while ((DMA2_BASE->ISR & (DMA_ISR_TEIF4|DMA_ISR_TCIF4)) == 0 ) { /* wait */ } while ((DMA2_BASE->ISR & (DMA_ISR_TEIF4|DMA_ISR_TCIF4)) == 0 ) { /* wait */ }

View file

@ -89,13 +89,10 @@ void TFT_FSMC::Init() {
uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN;
uint32_t controllerAddress; uint32_t controllerAddress;
#if PIN_EXISTS(TFT_RESET) #if ENABLED(LCD_USE_DMA_FSMC)
OUT_WRITE(TFT_RESET_PIN, HIGH); dma_init(FSMC_DMA_DEV);
delay(100); dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
#endif dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM);
#if PIN_EXISTS(TFT_BACKLIGHT)
OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH);
#endif #endif
struct fsmc_nor_psram_reg_map* fsmcPsramRegion; struct fsmc_nor_psram_reg_map* fsmcPsramRegion;
@ -201,6 +198,8 @@ uint32_t TFT_FSMC::GetID() {
id = ReadID(LCD_READ_ID); id = ReadID(LCD_READ_ID);
if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF)
id = ReadID(LCD_READ_ID4); id = ReadID(LCD_READ_ID4);
if ((id & 0xFF00) == 0 && (id & 0xFF) != 0)
id = ReadID(LCD_READ_ID4);
return id; return id;
} }

View file

@ -32,7 +32,7 @@
#define DATASIZE_8BIT DMA_SIZE_8BITS #define DATASIZE_8BIT DMA_SIZE_8BITS
#define DATASIZE_16BIT DMA_SIZE_16BITS #define DATASIZE_16BIT DMA_SIZE_16BITS
#define TFT_IO TFT_FSMC #define TFT_IO_DRIVER TFT_FSMC
typedef struct { typedef struct {
__IO uint16_t REG; __IO uint16_t REG;

View file

@ -34,7 +34,7 @@
#define DATASIZE_8BIT DATA_SIZE_8BIT #define DATASIZE_8BIT DATA_SIZE_8BIT
#define DATASIZE_16BIT DATA_SIZE_16BIT #define DATASIZE_16BIT DATA_SIZE_16BIT
#define TFT_IO TFT_SPI #define TFT_IO_DRIVER TFT_SPI
#define DMA_MINC_ENABLE 1 #define DMA_MINC_ENABLE 1
#define DMA_MINC_DISABLE 0 #define DMA_MINC_DISABLE 0

View file

@ -52,7 +52,9 @@ void watchdogSetup() {
* @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0)
*/ */
void watchdog_init() { void watchdog_init() {
//iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); #if DISABLED(DISABLE_WATCHDOG_INIT)
iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD);
#endif
} }
#endif // USE_WATCHDOG #endif // USE_WATCHDOG

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