Compare commits
103 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0440770618 | ||
|
c66f3559d7 | ||
|
1183a5b51c | ||
|
2bc946edab | ||
|
3afc5c0dc1 | ||
|
f03df0b280 | ||
|
b035c464dd | ||
|
7071629534 | ||
|
23609b0d40 | ||
|
fd35e6b0f8 | ||
|
ff88387916 | ||
|
b217d9fe69 | ||
|
de61898c55 | ||
|
d95fcd7673 | ||
|
eb57d10ec3 | ||
|
7852f925ce | ||
|
e32e753ebf | ||
|
8e2c5513d1 | ||
|
8cdd188612 | ||
|
b2e68e6fa8 | ||
|
e0819d42de | ||
|
790e3ec512 | ||
|
e5271d7b2f | ||
|
69328f5246 | ||
|
d19dbf0be5 | ||
|
425f89e924 | ||
|
66eeb0d7ec | ||
|
f56b9f58ab | ||
|
f85e2ebb22 | ||
|
47adc716b2 | ||
|
a2efdedde4 | ||
|
c8ffbe769b | ||
|
f041be8338 | ||
|
a09cf3034e | ||
|
03c4a3de09 | ||
|
0d4346542b | ||
|
0e74f4cebc | ||
|
7ef2dbdac3 | ||
|
7b9e0c4e02 | ||
|
f3c4dfa196 | ||
|
a7495a49c5 | ||
|
341addb39f | ||
|
b6b2995b5e | ||
|
899f35e029 | ||
|
12545edfc7 | ||
|
0ae2f00fc8 | ||
|
bba456db14 | ||
|
f631eeac24 | ||
|
60ff8e8cb2 | ||
|
f2615b7972 | ||
|
2719ba6690 | ||
|
d0219c5632 | ||
|
4b9b66b8a6 | ||
|
515df460ae | ||
|
446e447c50 | ||
|
deb825eb61 | ||
|
b7d66def62 | ||
|
83aca360b7 | ||
|
d7cd75dba6 | ||
|
62e2473450 | ||
|
33a90d329b | ||
|
866675b72b | ||
|
85fb3005e4 | ||
|
8bf38f49a0 | ||
|
3669004077 | ||
|
35ea8497b0 | ||
|
e03c58d79a | ||
|
9cbf70c2ee | ||
|
dd169b7cca | ||
|
39e9d4f642 | ||
|
62479aabd0 | ||
|
d2e7bf96ba | ||
|
5fa2ac947c | ||
|
9bf04b2e18 | ||
|
806737d701 | ||
|
48688147b9 | ||
|
0fae7ebb09 | ||
|
38962febfe | ||
|
b6a11d2648 | ||
|
bdd8e15b65 | ||
|
bb8c10ea60 | ||
|
d581c26db2 | ||
|
09abca7bc7 | ||
|
0d7f1927cb | ||
|
751da659fb | ||
|
7432ea4000 | ||
|
1707addea7 | ||
|
a16109379e | ||
|
f7a3a6a610 | ||
|
9ffed0e031 | ||
|
7077da3591 | ||
|
b9d7ba838e | ||
|
5f39a77129 | ||
|
fcfbc53e76 | ||
|
62fb935883 | ||
|
250e7a34eb | ||
|
7e2409b8a0 | ||
|
c4725d946d | ||
|
bf4572488f | ||
|
4a58b4b093 | ||
|
2368fe1a55 | ||
|
d845160163 | ||
|
21d062c285 |
19
.editorconfig
Normal file
19
.editorconfig
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[{*.patch,syntax_test_*}]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[{*.c,*.cpp,*.h,*.ino}]
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
[{*.c,*.cpp,*.h,*.ino,Makefile}]
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
end_of_line = lf
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[{*.py,*.conf,*.sublime-project}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
21
.gitattributes
vendored
Normal file
21
.gitattributes
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
# Files with Unix line endings
|
||||||
|
*.c text eol=lf
|
||||||
|
*.cpp text eol=lf
|
||||||
|
*.h text eol=lf
|
||||||
|
*.ino text eol=lf
|
||||||
|
*.py text eol=lf
|
||||||
|
*.sh text eol=lf
|
||||||
|
*.scad text eol=lf
|
||||||
|
|
||||||
|
# Files with native line endings
|
||||||
|
# *.sln text
|
||||||
|
|
||||||
|
# Binary files
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.fon binary
|
||||||
|
*.bin binary
|
||||||
|
*.woff binary
|
24
.github/workflows/build-all.yml
vendored
24
.github/workflows/build-all.yml
vendored
@@ -65,16 +65,28 @@ jobs:
|
|||||||
- MEGA_X_DGUS_BLT_11
|
- MEGA_X_DGUS_BLT_11
|
||||||
- MEGA_X_DGUS_TMC_BLT_10
|
- MEGA_X_DGUS_TMC_BLT_10
|
||||||
- MEGA_X_DGUS_TMC_BLT_11
|
- MEGA_X_DGUS_TMC_BLT_11
|
||||||
- MEGA_P
|
- MEGA_P_DGUS
|
||||||
- MEGA_P_TMC
|
- MEGA_P_DGUS_TMC
|
||||||
- MEGA_P_BLT_10
|
- MEGA_P_DGUS_BLT_10
|
||||||
- MEGA_P_BLT_11
|
- MEGA_P_DGUS_BLT_11
|
||||||
- MEGA_P_TMC_BLT_10
|
- MEGA_P_DGUS_TMC_BLT_10
|
||||||
- MEGA_P_TMC_BLT_11
|
- MEGA_P_DGUS_TMC_BLT_11
|
||||||
- CHIRON
|
- CHIRON
|
||||||
- CHIRON_TMC
|
- CHIRON_TMC
|
||||||
- CHIRON_DGUS
|
- CHIRON_DGUS
|
||||||
- CHIRON_DGUS_TMC
|
- CHIRON_DGUS_TMC
|
||||||
|
- 4MAXP2
|
||||||
|
- 4MAXP2_TMC
|
||||||
|
- 4MAXP2_BLT_10
|
||||||
|
- 4MAXP2_BLT_11
|
||||||
|
- 4MAXP2_TMC_BLT_10
|
||||||
|
- 4MAXP2_TMC_BLT_11
|
||||||
|
- 4MAXP2_DGUS
|
||||||
|
- 4MAXP2_DGUS_TMC
|
||||||
|
- 4MAXP2_DGUS_BLT_10
|
||||||
|
- 4MAXP2_DGUS_BLT_11
|
||||||
|
- 4MAXP2_DGUS_TMC_BLT_10
|
||||||
|
- 4MAXP2_DGUS_TMC_BLT_11
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
|
173
.gitignore
vendored
Executable file
173
.gitignore
vendored
Executable file
@@ -0,0 +1,173 @@
|
|||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
_Version.h
|
||||||
|
bdf2u8g
|
||||||
|
|
||||||
|
#
|
||||||
|
# OS
|
||||||
|
#
|
||||||
|
applet/
|
||||||
|
*.DS_Store
|
||||||
|
|
||||||
|
#
|
||||||
|
# Misc
|
||||||
|
#
|
||||||
|
*~
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
*.bak
|
||||||
|
*.idea
|
||||||
|
*.s
|
||||||
|
*.i
|
||||||
|
*.ii
|
||||||
|
*.swp
|
||||||
|
tags
|
||||||
|
|
||||||
|
#
|
||||||
|
# C++
|
||||||
|
#
|
||||||
|
# Compiled Object files
|
||||||
|
*.slo
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.ino.cpp
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Fortran module files
|
||||||
|
*.mod
|
||||||
|
*.smod
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
*.lai
|
||||||
|
*.la
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
|
||||||
|
#
|
||||||
|
# C
|
||||||
|
#
|
||||||
|
# Object files
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.obj
|
||||||
|
*.elf
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
*.lib
|
||||||
|
*.a
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
|
||||||
|
# Shared objects (inc. Windows DLLs)
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.i*86
|
||||||
|
*.x86_64
|
||||||
|
*.hex
|
||||||
|
|
||||||
|
# Debug files
|
||||||
|
*.dSYM/
|
||||||
|
*.su
|
||||||
|
|
||||||
|
# PlatformIO files/dirs
|
||||||
|
.pio*
|
||||||
|
.pioenvs
|
||||||
|
.piolibdeps
|
||||||
|
.clang_complete
|
||||||
|
.gcc-flags.json
|
||||||
|
/lib/
|
||||||
|
|
||||||
|
# Secure Credentials
|
||||||
|
Configuration_Secure.h
|
||||||
|
|
||||||
|
# Visual Studio
|
||||||
|
*.sln
|
||||||
|
*.vcxproj
|
||||||
|
*.vcxproj.user
|
||||||
|
*.vcxproj.filters
|
||||||
|
Release/
|
||||||
|
Debug/
|
||||||
|
__vm/
|
||||||
|
.vs/
|
||||||
|
vc-fileutils.settings
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode
|
||||||
|
.vscode/.browse.c_cpp.db*
|
||||||
|
.vscode/c_cpp_properties.json
|
||||||
|
.vscode/launch.json
|
||||||
|
.vscode/*.db
|
||||||
|
|
||||||
|
#Simulation
|
||||||
|
imgui.ini
|
||||||
|
eeprom.dat
|
||||||
|
|
||||||
|
#cmake
|
||||||
|
CMakeLists.txt
|
||||||
|
src/CMakeLists.txt
|
||||||
|
CMakeListsPrivate.txt
|
||||||
|
|
||||||
|
# CLion
|
||||||
|
cmake-build-*
|
||||||
|
|
||||||
|
# Eclipse
|
||||||
|
.project
|
||||||
|
.cproject
|
||||||
|
.pydevproject
|
||||||
|
.settings
|
||||||
|
.classpath
|
||||||
|
|
||||||
|
# Python
|
||||||
|
__pycache__
|
||||||
|
|
||||||
|
# IOLogger logs
|
||||||
|
*_log.csv
|
||||||
|
|
||||||
|
# Simulation / Native
|
||||||
|
eeprom.dat
|
||||||
|
imgui.ini
|
9
LICENSE
9
LICENSE
@@ -3,7 +3,7 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (c) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
Copyright (c) 2007 Free Software Foundation, Inc. <https://www.fsf.org/>
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@@ -647,7 +647,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
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 <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
@@ -666,12 +666,11 @@ might be different; for a GUI interface, you would use an "about box".
|
|||||||
You should also get your employer (if you work as a programmer) or school,
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
<http://www.gnu.org/licenses/>.
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
The GNU General Public License does not permit incorporating your program
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
may consider it more useful to permit linking proprietary applications with
|
may consider it more useful to permit linking proprietary applications with
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License. But first, please read
|
Public License instead of this License. But first, please read
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,9 +1,8 @@
|
|||||||
/*
|
/*==============================================================================
|
||||||
================================================================================
|
|
||||||
|
|
||||||
Marlin Firmware
|
Marlin Firmware
|
||||||
|
|
||||||
(c) 2011-2019 MarlinFirmware
|
(c) 2011-2020 MarlinFirmware
|
||||||
Portions of Marlin are (c) by their respective authors.
|
Portions of Marlin are (c) by their respective authors.
|
||||||
All code complies with GPLv2 and/or GPLv3
|
All code complies with GPLv2 and/or GPLv3
|
||||||
|
|
||||||
@@ -12,30 +11,33 @@
|
|||||||
Greetings! Thank you for choosing Marlin 2 as your 3D printer firmware.
|
Greetings! Thank you for choosing Marlin 2 as your 3D printer firmware.
|
||||||
|
|
||||||
To configure Marlin you must edit Configuration.h and Configuration_adv.h
|
To configure Marlin you must edit Configuration.h and Configuration_adv.h
|
||||||
located in the root 'Marlin' folder. Check the config/examples folder to see if
|
located in the root 'Marlin' folder. Check our Configurations repository to
|
||||||
there's a more suitable starting-point for your specific hardware.
|
see if there's a more suitable starting-point for your specific hardware.
|
||||||
|
|
||||||
Before diving in, we recommend the following essential links:
|
Before diving in, we recommend the following essential links:
|
||||||
|
|
||||||
Marlin Firmware Official Website
|
Marlin Firmware Official Website
|
||||||
|
|
||||||
- http://marlinfw.org/
|
- https://marlinfw.org/
|
||||||
The official Marlin Firmware website contains the most up-to-date
|
The official Marlin Firmware website contains the most up-to-date
|
||||||
documentation. Contributions are always welcome!
|
documentation. Contributions are always welcome!
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
|
|
||||||
|
- https://github.com/MarlinFirmware/Configurations
|
||||||
|
Example configurations for several printer models.
|
||||||
|
|
||||||
- https://www.youtube.com/watch?v=3gwWVFtdg-4
|
- https://www.youtube.com/watch?v=3gwWVFtdg-4
|
||||||
A good 20-minute overview of Marlin configuration by Tom Sanladerer.
|
A good 20-minute overview of Marlin configuration by Tom Sanladerer.
|
||||||
(Applies to Marlin 1.0.x, so Jerk and Acceleration should be halved.)
|
(Applies to Marlin 1.0.x, so Jerk and Acceleration should be halved.)
|
||||||
Also... https://www.google.com/search?tbs=vid%3A1&q=configure+marlin
|
Also... https://www.google.com/search?tbs=vid%3A1&q=configure+marlin
|
||||||
|
|
||||||
- http://marlinfw.org/docs/configuration/configuration.html
|
- https://marlinfw.org/docs/configuration/configuration.html
|
||||||
Marlin's configuration options are explained in more detail here.
|
Marlin's configuration options are explained in more detail here.
|
||||||
|
|
||||||
Getting Help
|
Getting Help
|
||||||
|
|
||||||
- http://forums.reprap.org/list.php?415
|
- https://reprap.org/forum/list.php?415
|
||||||
The Marlin Discussion Forum is a great place to get help from other Marlin
|
The Marlin Discussion Forum is a great place to get help from other Marlin
|
||||||
users who may have experienced similar issues to your own.
|
users who may have experienced similar issues to your own.
|
||||||
|
|
||||||
@@ -45,9 +47,11 @@ Getting Help
|
|||||||
|
|
||||||
Contributing
|
Contributing
|
||||||
|
|
||||||
- http://marlinfw.org/docs/development/contributing.html
|
- https://marlinfw.org/docs/development/contributing.html
|
||||||
If you'd like to contribute to Marlin, read this first!
|
If you'd like to contribute to Marlin, read this first!
|
||||||
|
|
||||||
- http://marlinfw.org/docs/development/coding_standards.html
|
- https://marlinfw.org/docs/development/coding_standards.html
|
||||||
Before submitting code get to know the Coding Standards.
|
Before submitting code get to know the Coding Standards.
|
||||||
*/
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------*/
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -28,20 +28,20 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin release version identifier
|
* Marlin release version identifier
|
||||||
*/
|
*/
|
||||||
//#define SHORT_BUILD_VERSION "2.0.5.4"
|
//#define SHORT_BUILD_VERSION "2.0.9.2"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verbose version identifier which should contain a reference to the location
|
* Verbose version identifier which should contain a reference to the location
|
||||||
* from where the binary was downloaded or the source code was compiled.
|
* from where the binary was downloaded or the source code was compiled.
|
||||||
*/
|
*/
|
||||||
//#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION " (Github)"
|
//#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The STRING_DISTRIBUTION_DATE represents when the binary file was built,
|
* The STRING_DISTRIBUTION_DATE represents when the binary file was built,
|
||||||
* here we define this default string as the date where the latest release
|
* here we define this default string as the date where the latest release
|
||||||
* version was tagged.
|
* version was tagged.
|
||||||
*/
|
*/
|
||||||
//#define STRING_DISTRIBUTION_DATE "2020-07-09"
|
//#define STRING_DISTRIBUTION_DATE "2021-09-03"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
* has a distinct Github fork— the Source Code URL should just be the main
|
* has a distinct Github fork— the Source Code URL should just be the main
|
||||||
* Marlin repository.
|
* Marlin repository.
|
||||||
*/
|
*/
|
||||||
//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin"
|
//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default generic printer UUID.
|
* Default generic printer UUID.
|
||||||
@@ -65,12 +65,12 @@
|
|||||||
* The WEBSITE_URL is the location where users can get more information such as
|
* The WEBSITE_URL is the location where users can get more information such as
|
||||||
* documentation about a specific Marlin release.
|
* documentation about a specific Marlin release.
|
||||||
*/
|
*/
|
||||||
//#define WEBSITE_URL "http://marlinfw.org"
|
//#define WEBSITE_URL "marlinfw.org"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the vendor info the serial USB interface, if changable
|
* Set the vendor info the serial USB interface, if changable
|
||||||
* Currently only supported by DUE platform
|
* Currently only supported by DUE platform
|
||||||
*/
|
*/
|
||||||
//#define USB_DEVICE_VENDOR_ID 0x0000
|
//#define USB_DEVICE_VENDOR_ID 0x0000
|
||||||
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
||||||
//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL
|
//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL
|
||||||
|
@@ -33,4 +33,4 @@ PlatformIO will find your libraries automatically, configure preprocessor's
|
|||||||
include paths and build them.
|
include paths and build them.
|
||||||
|
|
||||||
More information about PlatformIO Library Dependency Finder
|
More information about PlatformIO Library Dependency Finder
|
||||||
- http://docs.platformio.org/page/librarymanager/ldf.html
|
- https://docs.platformio.org/page/librarymanager/ldf.html
|
||||||
|
19
Marlin/src/HAL/AVR/HAL.cpp
Executable file → Normal file
19
Marlin/src/HAL/AVR/HAL.cpp
Executable file → Normal file
@@ -16,15 +16,21 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
|
||||||
|
#ifdef USBCON
|
||||||
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
#ifdef BLUETOOTH
|
||||||
|
BTSerial btSerial(false, bluetoothSerial);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -52,6 +58,15 @@ void HAL_init() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_reboot() {
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
while (1) { /* run out the watchdog */ }
|
||||||
|
#else
|
||||||
|
void (*resetFunc)() = 0; // Declare resetFunc() at address 0
|
||||||
|
resetFunc(); // Jump to address 0
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if ENABLED(SDSUPPORT)
|
||||||
|
|
||||||
#include "../../sd/SdFatUtil.h"
|
#include "../../sd/SdFatUtil.h"
|
||||||
|
319
Marlin/src/HAL/AVR/HAL.h
Executable file → Normal file
319
Marlin/src/HAL/AVR/HAL.h
Executable file → Normal file
@@ -14,7 +14,8 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@@ -38,6 +39,19 @@
|
|||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Default graphical display delays
|
||||||
|
//
|
||||||
|
#if F_CPU >= 20000000
|
||||||
|
#define CPU_ST7920_DELAY_1 150
|
||||||
|
#define CPU_ST7920_DELAY_2 0
|
||||||
|
#define CPU_ST7920_DELAY_3 150
|
||||||
|
#elif F_CPU == 16000000
|
||||||
|
#define CPU_ST7920_DELAY_1 125
|
||||||
|
#define CPU_ST7920_DELAY_2 0
|
||||||
|
#define CPU_ST7920_DELAY_3 188
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef pgm_read_ptr
|
#ifndef pgm_read_ptr
|
||||||
// Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for
|
// Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for
|
||||||
// Windows Subsystem for Linux on Windows 10 as of 10/18/2019
|
// Windows Subsystem for Linux on Windows 10 as of 10/18/2019
|
||||||
@@ -50,7 +64,11 @@
|
|||||||
// Defines
|
// Defines
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
//#define analogInputToDigitalPin(IO) IO
|
// AVR PROGMEM extension for sprintf_P
|
||||||
|
#define S_FMT "%S"
|
||||||
|
|
||||||
|
// AVR PROGMEM extension for string define
|
||||||
|
#define PGMSTR(NAM,STR) const char NAM[] PROGMEM = STR
|
||||||
|
|
||||||
#ifndef CRITICAL_SECTION_START
|
#ifndef CRITICAL_SECTION_START
|
||||||
#define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli()
|
#define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli()
|
||||||
@@ -60,16 +78,10 @@
|
|||||||
#define ENABLE_ISRS() sei()
|
#define ENABLE_ISRS() sei()
|
||||||
#define DISABLE_ISRS() cli()
|
#define DISABLE_ISRS() cli()
|
||||||
|
|
||||||
// On AVR this is in math.h?
|
|
||||||
//#define square(x) ((x)*(x))
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
typedef uint16_t hal_timer_t;
|
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
|
||||||
|
|
||||||
typedef int8_t pin_t;
|
typedef int8_t pin_t;
|
||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS
|
||||||
@@ -83,43 +95,51 @@ typedef int8_t pin_t;
|
|||||||
|
|
||||||
// Serial ports
|
// Serial ports
|
||||||
#ifdef USBCON
|
#ifdef USBCON
|
||||||
#if ENABLED(BLUETOOTH)
|
#include "../../core/serial_hook.h"
|
||||||
#define MYSERIAL0 bluetoothSerial
|
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||||
#else
|
extern DefaultSerial1 MSerial0;
|
||||||
#define MYSERIAL0 Serial
|
#ifdef BLUETOOTH
|
||||||
#endif
|
typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial;
|
||||||
#define NUM_SERIAL 1
|
extern BTSerial btSerial;
|
||||||
#else
|
|
||||||
#if !WITHIN(SERIAL_PORT, -1, 3)
|
|
||||||
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MYSERIAL0 customizedSerial1
|
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
|
||||||
|
#else
|
||||||
|
#if !WITHIN(SERIAL_PORT, -1, 3)
|
||||||
|
#error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#define MYSERIAL1 customizedSerial1
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#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 0 to 3, or -1 for USB Serial."
|
||||||
#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 MYSERIAL2 customizedSerial2
|
||||||
#define NUM_SERIAL 2
|
#endif
|
||||||
#else
|
|
||||||
#define NUM_SERIAL 1
|
#ifdef SERIAL_PORT_3
|
||||||
|
#if !WITHIN(SERIAL_PORT_3, -1, 3)
|
||||||
|
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#define MYSERIAL3 customizedSerial3
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DGUS_SERIAL_PORT
|
#ifdef MMU2_SERIAL_PORT
|
||||||
#if !WITHIN(DGUS_SERIAL_PORT, -1, 3)
|
#if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
|
||||||
#error "DGUS_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
#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 MMU2_SERIAL mmuSerial
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
|
||||||
|
#error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#define LCD_SERIAL lcdSerial
|
||||||
|
#if HAS_DGUS_LCD
|
||||||
|
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -135,226 +155,18 @@ 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; }
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
void HAL_reboot();
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
extern "C" {
|
|
||||||
int freeMemory();
|
|
||||||
}
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
// timers
|
#if GCC_VERSION <= 50000
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define STEP_TIMER_NUM 1
|
extern "C" int freeMemory();
|
||||||
#define TEMP_TIMER_NUM 0
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
#endif
|
||||||
#define STEPPER_TIMER_PRESCALE 8
|
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
|
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
|
||||||
#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
|
|
||||||
|
|
||||||
#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B)
|
|
||||||
#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B)
|
|
||||||
#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B)
|
|
||||||
|
|
||||||
FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case STEP_TIMER_NUM:
|
|
||||||
// waveform generation = 0100 = CTC
|
|
||||||
SET_WGM(1, CTC_OCRnA);
|
|
||||||
|
|
||||||
// output mode = 00 (disconnected)
|
|
||||||
SET_COMA(1, NORMAL);
|
|
||||||
|
|
||||||
// Set the timer pre-scaler
|
|
||||||
// Generally we use a divider of 8, resulting in a 2MHz timer
|
|
||||||
// frequency on a 16MHz MCU. If you are going to change this, be
|
|
||||||
// sure to regenerate speed_lookuptable.h with
|
|
||||||
// create_speed_lookuptable.py
|
|
||||||
SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler
|
|
||||||
|
|
||||||
// Init Stepper ISR to 122 Hz for quick starting
|
|
||||||
// (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency
|
|
||||||
OCR1A = 0x4000;
|
|
||||||
TCNT1 = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TEMP_TIMER_NUM:
|
|
||||||
// Use timer0 for temperature measurement
|
|
||||||
// Interleave temperature interrupt with millies interrupt
|
|
||||||
OCR0B = 128;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define TIMER_OCR_1 OCR1A
|
|
||||||
#define TIMER_COUNTER_1 TCNT1
|
|
||||||
|
|
||||||
#define TIMER_OCR_0 OCR0A
|
|
||||||
#define TIMER_COUNTER_0 TCNT0
|
|
||||||
|
|
||||||
#define _CAT(a,V...) a##V
|
|
||||||
#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
|
|
||||||
#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer)
|
|
||||||
#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* On AVR there is no hardware prioritization and preemption of
|
|
||||||
* interrupts, so this emulates it. The UART has first priority
|
|
||||||
* (otherwise, characters will be lost due to UART overflow).
|
|
||||||
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
|
||||||
*/
|
|
||||||
#define HAL_timer_isr_prologue(TIMER_NUM)
|
|
||||||
#define HAL_timer_isr_epilogue(TIMER_NUM)
|
|
||||||
|
|
||||||
/* 18 cycles maximum latency */
|
|
||||||
#define HAL_STEP_TIMER_ISR() \
|
|
||||||
extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
|
||||||
extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
|
||||||
void TIMER1_COMPA_vect() { \
|
|
||||||
__asm__ __volatile__ ( \
|
|
||||||
A("push r16") /* 2 Save R16 */ \
|
|
||||||
A("in r16, __SREG__") /* 1 Get SREG */ \
|
|
||||||
A("push r16") /* 2 Save SREG into stack */ \
|
|
||||||
A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
|
|
||||||
A("push r16") /* 2 Save TIMSK0 into the stack */ \
|
|
||||||
A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \
|
|
||||||
A("sts %[timsk0], r16") /* 2 And set the new value */ \
|
|
||||||
A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \
|
|
||||||
A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \
|
|
||||||
A("sts %[timsk1], r16") /* 2 And set the new value */ \
|
|
||||||
A("push r16") /* 2 Save TIMSK1 into stack */ \
|
|
||||||
A("in r16, 0x3B") /* 1 Get RAMPZ register */ \
|
|
||||||
A("push r16") /* 2 Save RAMPZ into stack */ \
|
|
||||||
A("in r16, 0x3C") /* 1 Get EIND register */ \
|
|
||||||
A("push r0") /* C runtime can modify all the following registers without restoring them */ \
|
|
||||||
A("push r1") \
|
|
||||||
A("push r18") \
|
|
||||||
A("push r19") \
|
|
||||||
A("push r20") \
|
|
||||||
A("push r21") \
|
|
||||||
A("push r22") \
|
|
||||||
A("push r23") \
|
|
||||||
A("push r24") \
|
|
||||||
A("push r25") \
|
|
||||||
A("push r26") \
|
|
||||||
A("push r27") \
|
|
||||||
A("push r30") \
|
|
||||||
A("push r31") \
|
|
||||||
A("clr r1") /* C runtime expects this register to be 0 */ \
|
|
||||||
A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
|
|
||||||
A("pop r31") \
|
|
||||||
A("pop r30") \
|
|
||||||
A("pop r27") \
|
|
||||||
A("pop r26") \
|
|
||||||
A("pop r25") \
|
|
||||||
A("pop r24") \
|
|
||||||
A("pop r23") \
|
|
||||||
A("pop r22") \
|
|
||||||
A("pop r21") \
|
|
||||||
A("pop r20") \
|
|
||||||
A("pop r19") \
|
|
||||||
A("pop r18") \
|
|
||||||
A("pop r1") \
|
|
||||||
A("pop r0") \
|
|
||||||
A("out 0x3C, r16") /* 1 Restore EIND register */ \
|
|
||||||
A("pop r16") /* 2 Get the original RAMPZ register value */ \
|
|
||||||
A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \
|
|
||||||
A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \
|
|
||||||
A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \
|
|
||||||
A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \
|
|
||||||
A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \
|
|
||||||
A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \
|
|
||||||
A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \
|
|
||||||
A("pop r16") /* 2 Get the old SREG value */ \
|
|
||||||
A("out __SREG__, r16") /* 1 And restore the SREG value */ \
|
|
||||||
A("pop r16") /* 2 Restore R16 value */ \
|
|
||||||
A("reti") /* 4 Return from interrupt */ \
|
|
||||||
: \
|
|
||||||
: [timsk0] "i" ((uint16_t)&TIMSK0), \
|
|
||||||
[timsk1] "i" ((uint16_t)&TIMSK1), \
|
|
||||||
[msk0] "M" ((uint8_t)(1<<OCIE0B)),\
|
|
||||||
[msk1] "M" ((uint8_t)(1<<OCIE1A)) \
|
|
||||||
: \
|
|
||||||
); \
|
|
||||||
} \
|
|
||||||
void TIMER1_COMPA_vect_bottom()
|
|
||||||
|
|
||||||
/* 14 cycles maximum latency */
|
|
||||||
#define HAL_TEMP_TIMER_ISR() \
|
|
||||||
extern "C" void TIMER0_COMPB_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
|
||||||
extern "C" void TIMER0_COMPB_vect_bottom() asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
|
||||||
void TIMER0_COMPB_vect() { \
|
|
||||||
__asm__ __volatile__ ( \
|
|
||||||
A("push r16") /* 2 Save R16 */ \
|
|
||||||
A("in r16, __SREG__") /* 1 Get SREG */ \
|
|
||||||
A("push r16") /* 2 Save SREG into stack */ \
|
|
||||||
A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
|
|
||||||
A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \
|
|
||||||
A("sts %[timsk0], r16") /* 2 And set the new value */ \
|
|
||||||
A("sei") /* 1 Enable global interrupts - It is safe, as the temperature ISR is disabled, so we cannot reenter it */ \
|
|
||||||
A("push r16") /* 2 Save TIMSK0 into stack */ \
|
|
||||||
A("in r16, 0x3B") /* 1 Get RAMPZ register */ \
|
|
||||||
A("push r16") /* 2 Save RAMPZ into stack */ \
|
|
||||||
A("in r16, 0x3C") /* 1 Get EIND register */ \
|
|
||||||
A("push r0") /* C runtime can modify all the following registers without restoring them */ \
|
|
||||||
A("push r1") \
|
|
||||||
A("push r18") \
|
|
||||||
A("push r19") \
|
|
||||||
A("push r20") \
|
|
||||||
A("push r21") \
|
|
||||||
A("push r22") \
|
|
||||||
A("push r23") \
|
|
||||||
A("push r24") \
|
|
||||||
A("push r25") \
|
|
||||||
A("push r26") \
|
|
||||||
A("push r27") \
|
|
||||||
A("push r30") \
|
|
||||||
A("push r31") \
|
|
||||||
A("clr r1") /* C runtime expects this register to be 0 */ \
|
|
||||||
A("call TIMER0_COMPB_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
|
|
||||||
A("pop r31") \
|
|
||||||
A("pop r30") \
|
|
||||||
A("pop r27") \
|
|
||||||
A("pop r26") \
|
|
||||||
A("pop r25") \
|
|
||||||
A("pop r24") \
|
|
||||||
A("pop r23") \
|
|
||||||
A("pop r22") \
|
|
||||||
A("pop r21") \
|
|
||||||
A("pop r20") \
|
|
||||||
A("pop r19") \
|
|
||||||
A("pop r18") \
|
|
||||||
A("pop r1") \
|
|
||||||
A("pop r0") \
|
|
||||||
A("out 0x3C, r16") /* 1 Restore EIND register */ \
|
|
||||||
A("pop r16") /* 2 Get the original RAMPZ register value */ \
|
|
||||||
A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \
|
|
||||||
A("pop r16") /* 2 Get the original TIMSK0 value but with temperature ISR disabled */ \
|
|
||||||
A("ori r16,%[msk0]") /* 1 Enable temperature ISR */ \
|
|
||||||
A("cli") /* 1 Disable global interrupts - We must do this, as we will reenable the temperature ISR, and we don't want to reenter this handler until the current one is done */ \
|
|
||||||
A("sts %[timsk0], r16") /* 2 And restore the old value */ \
|
|
||||||
A("pop r16") /* 2 Get the old SREG */ \
|
|
||||||
A("out __SREG__, r16") /* 1 And restore the SREG value */ \
|
|
||||||
A("pop r16") /* 2 Restore R16 */ \
|
|
||||||
A("reti") /* 4 Return from interrupt */ \
|
|
||||||
: \
|
|
||||||
: [timsk0] "i"((uint16_t)&TIMSK0), \
|
|
||||||
[msk0] "M" ((uint8_t)(1<<OCIE0B)) \
|
|
||||||
: \
|
|
||||||
); \
|
|
||||||
} \
|
|
||||||
void TIMER0_COMPB_vect_bottom()
|
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
#ifdef DIDR2
|
#ifdef DIDR2
|
||||||
@@ -378,6 +190,7 @@ inline void HAL_adc_init() {
|
|||||||
#define HAL_START_ADC(ch) ADCSRB = 0; SET_ADMUX_ADCSRA(ch)
|
#define HAL_START_ADC(ch) ADCSRB = 0; SET_ADMUX_ADCSRA(ch)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HAL_ADC_VREF 5.0
|
||||||
#define HAL_ADC_RESOLUTION 10
|
#define HAL_ADC_RESOLUTION 10
|
||||||
#define HAL_READ_ADC() ADC
|
#define HAL_READ_ADC() ADC
|
||||||
#define HAL_ADC_READY() !TEST(ADCSRA, ADSC)
|
#define HAL_ADC_READY() !TEST(ADCSRA, ADSC)
|
||||||
@@ -386,7 +199,7 @@ inline void HAL_adc_init() {
|
|||||||
#define GET_PIN_MAP_INDEX(pin) pin
|
#define GET_PIN_MAP_INDEX(pin) pin
|
||||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||||
|
|
||||||
#define HAL_SENSITIVE_PINS 0, 1
|
#define HAL_SENSITIVE_PINS 0, 1,
|
||||||
|
|
||||||
#ifdef __AVR_AT90USB1286__
|
#ifdef __AVR_AT90USB1286__
|
||||||
#define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0)
|
#define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0)
|
||||||
@@ -395,6 +208,8 @@ inline void HAL_adc_init() {
|
|||||||
// AVR compatibility
|
// AVR compatibility
|
||||||
#define strtof strtod
|
#define strtof strtod
|
||||||
|
|
||||||
|
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set_pwm_frequency
|
* set_pwm_frequency
|
||||||
* Sets the frequency of the timer corresponding to the provided pin
|
* Sets the frequency of the timer corresponding to the provided pin
|
||||||
|
41
Marlin/src/HAL/AVR/HAL_SPI.cpp
Executable file → Normal file
41
Marlin/src/HAL/AVR/HAL_SPI.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -34,17 +34,17 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
OUT_WRITE(SS_PIN, HIGH);
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
SET_OUTPUT(SCK_PIN);
|
SET_OUTPUT(SD_SCK_PIN);
|
||||||
SET_INPUT(MISO_PIN);
|
SET_INPUT(SD_MISO_PIN);
|
||||||
SET_OUTPUT(MOSI_PIN);
|
SET_OUTPUT(SD_MOSI_PIN);
|
||||||
|
|
||||||
#if DISABLED(SOFTWARE_SPI)
|
#if DISABLED(SOFTWARE_SPI)
|
||||||
// SS must be in output mode even it is not chip select
|
// SS must be in output mode even it is not chip select
|
||||||
//SET_OUTPUT(SS_PIN);
|
//SET_OUTPUT(SD_SS_PIN);
|
||||||
// set SS high - may be chip select for another SPI device
|
// set SS high - may be chip select for another SPI device
|
||||||
//#if SET_SPI_SS_HIGH
|
//#if SET_SPI_SS_HIGH
|
||||||
//WRITE(SS_PIN, HIGH);
|
//WRITE(SD_SS_PIN, HIGH);
|
||||||
//#endif
|
//#endif
|
||||||
// set a default rate
|
// set a default rate
|
||||||
spiInit(1);
|
spiInit(1);
|
||||||
@@ -74,7 +74,8 @@ void spiBegin() {
|
|||||||
#elif defined(PRR0)
|
#elif defined(PRR0)
|
||||||
PRR0
|
PRR0
|
||||||
#endif
|
#endif
|
||||||
, PRSPI);
|
, PRSPI
|
||||||
|
);
|
||||||
|
|
||||||
SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
|
SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
|
||||||
SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
|
SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
|
||||||
@@ -88,7 +89,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** SPI read data */
|
/** SPI read data */
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (nbyte-- == 0) return;
|
if (nbyte-- == 0) return;
|
||||||
SPDR = 0xFF;
|
SPDR = 0xFF;
|
||||||
for (uint16_t i = 0; i < nbyte; i++) {
|
for (uint16_t i = 0; i < nbyte; i++) {
|
||||||
@@ -107,7 +108,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** SPI send block */
|
/** SPI send block */
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
SPDR = token;
|
SPDR = token;
|
||||||
for (uint16_t i = 0; i < 512; i += 2) {
|
for (uint16_t i = 0; i < 512; i += 2) {
|
||||||
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
||||||
@@ -195,19 +196,19 @@ void spiBegin() {
|
|||||||
// no interrupts during byte receive - about 8µs
|
// no interrupts during byte receive - about 8µs
|
||||||
cli();
|
cli();
|
||||||
// output pin high - like sending 0xFF
|
// output pin high - like sending 0xFF
|
||||||
WRITE(MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
|
|
||||||
nop; // adjust so SCK is nice
|
nop; // adjust so SCK is nice
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
|
|
||||||
if (READ(MISO_PIN)) data |= 1;
|
if (READ(SD_MISO_PIN)) data |= 1;
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
@@ -215,7 +216,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Soft SPI read data
|
// Soft SPI read data
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
buf[i] = spiRec();
|
buf[i] = spiRec();
|
||||||
}
|
}
|
||||||
@@ -225,10 +226,10 @@ void spiBegin() {
|
|||||||
// no interrupts during byte send - about 8µs
|
// no interrupts during byte send - about 8µs
|
||||||
cli();
|
cli();
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
WRITE(MOSI_PIN, data & 0x80);
|
WRITE(SD_MOSI_PIN, data & 0x80);
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
nop; // hold SCK high for a few ns
|
nop; // hold SCK high for a few ns
|
||||||
@@ -236,13 +237,13 @@ void spiBegin() {
|
|||||||
nop;
|
nop;
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Soft SPI send block
|
// Soft SPI send block
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
spiSend(token);
|
spiSend(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
spiSend(buf[i]);
|
spiSend(buf[i]);
|
||||||
|
26
Marlin/src/HAL/AVR/MarlinSPI.h
Normal file
26
Marlin/src/HAL/AVR/MarlinSPI.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
using MarlinSPI = SPIClass;
|
1182
Marlin/src/HAL/AVR/MarlinSerial.cpp
Executable file → Normal file
1182
Marlin/src/HAL/AVR/MarlinSerial.cpp
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
119
Marlin/src/HAL/AVR/MarlinSerial.h
Executable file → Normal file
119
Marlin/src/HAL/AVR/MarlinSerial.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
#ifndef SERIAL_PORT
|
||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
@@ -48,11 +49,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)
|
||||||
@@ -135,10 +136,6 @@
|
|||||||
UART_DECL(3);
|
UART_DECL(3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
#define BYTE 0
|
#define BYTE 0
|
||||||
|
|
||||||
// Templated type selector
|
// Templated type selector
|
||||||
@@ -202,58 +199,30 @@
|
|||||||
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
||||||
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
FORCE_INLINE static void store_rxd_char();
|
FORCE_INLINE static void store_rxd_char();
|
||||||
FORCE_INLINE static void _tx_udr_empty_irq();
|
FORCE_INLINE static void _tx_udr_empty_irq();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MarlinSerial() {};
|
static void begin(const long);
|
||||||
static void begin(const long);
|
static void end();
|
||||||
static void end();
|
static int peek();
|
||||||
static int peek();
|
static int read();
|
||||||
static int read();
|
static void flush();
|
||||||
static void flush();
|
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();
|
#if HAS_DGUS_LCD
|
||||||
#ifdef DGUS_SERIAL_PORT
|
static ring_buffer_pos_t get_tx_buffer_free();
|
||||||
static ring_buffer_pos_t get_tx_buffer_free();
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
static void print(char, int = BYTE);
|
|
||||||
static void print(unsigned char, int = BYTE);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = BYTE);
|
|
||||||
static void println(unsigned char, int = BYTE);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
@@ -268,51 +237,61 @@
|
|||||||
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
#ifdef SERIAL_PORT_3
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#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 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 XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
static constexpr bool EMERGENCYPARSER = false;
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_OVERRUNS = false;
|
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
|
static constexpr bool RX_OVERRUNS = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial<MarlinInternalSerialCfg<INTERNAL_SERIAL_PORT>> internalSerial;
|
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> > > MSerialMMU2;
|
||||||
|
extern MSerialMMU2 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 = 128;
|
static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64);
|
||||||
static constexpr unsigned int TX_SIZE = 48;
|
static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128);
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_OVERRUNS = HAS_DGUS_LCD && ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
|
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial<MarlinInternalSerialCfg<DGUS_SERIAL_PORT>> internalDgusSerial;
|
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;
|
||||||
|
extern MSerialLCD lcdSerial;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use the UART for Bluetooth in AT90USB configurations
|
// Use the UART for Bluetooth in AT90USB configurations
|
||||||
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
||||||
extern HardwareSerial bluetoothSerial;
|
typedef Serial1Class<HardwareSerial> MSerialBT;
|
||||||
|
extern MSerialBT bluetoothSerial;
|
||||||
#endif
|
#endif
|
||||||
|
4
Marlin/src/HAL/AVR/Servo.cpp
Executable file → Normal file
4
Marlin/src/HAL/AVR/Servo.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -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__
|
||||||
@@ -59,7 +58,6 @@
|
|||||||
|
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
|
||||||
#include "../shared/servo.h"
|
#include "../shared/servo.h"
|
||||||
#include "../shared/servo_private.h"
|
#include "../shared/servo_private.h"
|
||||||
|
|
||||||
|
10
Marlin/src/HAL/AVR/ServoTimers.h
Executable file → Normal file
10
Marlin/src/HAL/AVR/ServoTimers.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -59,10 +59,12 @@
|
|||||||
// Say which 16 bit timers can be used and in what order
|
// Say which 16 bit timers can be used and in what order
|
||||||
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
//#define _useTimer1
|
//#define _useTimer1
|
||||||
#define _useTimer3
|
|
||||||
#define _useTimer4
|
#define _useTimer4
|
||||||
#if !HAS_MOTOR_CURRENT_PWM
|
#if NUM_SERVOS > SERVOS_PER_TIMER
|
||||||
#define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos.
|
#define _useTimer3
|
||||||
|
#if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER
|
||||||
|
#define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos.
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__AVR_ATmega32U4__)
|
#elif defined(__AVR_ATmega32U4__)
|
||||||
#define _useTimer3
|
#define _useTimer3
|
||||||
|
25
Marlin/src/HAL/AVR/eeprom.cpp
Executable file → Normal file
25
Marlin/src/HAL/AVR/eeprom.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
@@ -25,19 +25,28 @@
|
|||||||
|
|
||||||
#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
|
#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PersistentStore for Arduino-style EEPROM interface
|
||||||
|
* with implementations supplied by the framework.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "../shared/eeprom_api.h"
|
#include "../shared/eeprom_api.h"
|
||||||
|
|
||||||
bool PersistentStore::access_start() { return true; }
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
|
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
||||||
|
#endif
|
||||||
|
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
||||||
|
bool PersistentStore::access_start() { return true; }
|
||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -46,11 +55,11 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
crc16(crc, &v, 1);
|
crc16(crc, &v, 1);
|
||||||
pos++;
|
pos++;
|
||||||
value++;
|
value++;
|
||||||
};
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
@@ -61,7 +70,5 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
|
|||||||
return false; // always assume success for AVR's
|
return false; // always assume success for AVR's
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t PersistentStore::capacity() { return E2END + 1; }
|
|
||||||
|
|
||||||
#endif // EEPROM_SETTINGS || SD_FIRMWARE_UPDATE
|
#endif // EEPROM_SETTINGS || SD_FIRMWARE_UPDATE
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
82
Marlin/src/HAL/AVR/endstop_interrupts.h
Executable file → Normal file
82
Marlin/src/HAL/AVR/endstop_interrupts.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -124,7 +124,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MAX_PIN);
|
_ATTACH(X_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X_MAX_PIN);
|
pciSetup(X_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -132,7 +132,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MIN_PIN);
|
_ATTACH(X_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X_MIN_PIN);
|
pciSetup(X_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -140,7 +140,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MAX_PIN);
|
_ATTACH(Y_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y_MAX_PIN);
|
pciSetup(Y_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -148,7 +148,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MIN_PIN);
|
_ATTACH(Y_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y_MIN_PIN);
|
pciSetup(Y_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -156,7 +156,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MAX_PIN);
|
_ATTACH(Z_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MAX_PIN);
|
pciSetup(Z_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -164,15 +164,60 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PIN);
|
_ATTACH(Z_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MIN_PIN);
|
pciSetup(Z_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if HAS_I_MAX
|
||||||
|
#if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(I_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(I_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_I_MIN
|
||||||
|
#if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(I_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(I_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_J_MAX
|
||||||
|
#if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(J_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(J_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_J_MIN
|
||||||
|
#if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(J_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(J_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_K_MAX
|
||||||
|
#if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(K_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(K_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_K_MIN
|
||||||
|
#if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(K_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(K_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if HAS_X2_MAX
|
#if HAS_X2_MAX
|
||||||
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MAX_PIN);
|
_ATTACH(X2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X2_MAX_PIN);
|
pciSetup(X2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -180,7 +225,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MIN_PIN);
|
_ATTACH(X2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X2_MIN_PIN);
|
pciSetup(X2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -188,7 +233,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MAX_PIN);
|
_ATTACH(Y2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y2_MAX_PIN);
|
pciSetup(Y2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -196,7 +241,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MIN_PIN);
|
_ATTACH(Y2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y2_MIN_PIN);
|
pciSetup(Y2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -204,7 +249,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MAX_PIN);
|
_ATTACH(Z2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z2_MAX_PIN);
|
pciSetup(Z2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -212,7 +257,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MIN_PIN);
|
_ATTACH(Z2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z2_MIN_PIN);
|
pciSetup(Z2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -220,7 +265,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MAX_PIN);
|
_ATTACH(Z3_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z3_MAX_PIN);
|
pciSetup(Z3_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -228,7 +273,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MIN_PIN);
|
_ATTACH(Z3_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z3_MIN_PIN);
|
pciSetup(Z3_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -236,7 +281,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MAX_PIN);
|
_ATTACH(Z4_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z4_MAX_PIN);
|
pciSetup(Z4_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -244,7 +289,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MIN_PIN);
|
_ATTACH(Z4_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z4_MIN_PIN);
|
pciSetup(Z4_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -252,10 +297,9 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
_ATTACH(Z_MIN_PROBE_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MIN_PROBE_PIN);
|
pciSetup(Z_MIN_PROBE_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
|
// If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
|
||||||
}
|
}
|
||||||
|
12
Marlin/src/HAL/AVR/fast_pwm.cpp
Executable file → Normal file
12
Marlin/src/HAL/AVR/fast_pwm.cpp
Executable file → Normal file
@@ -16,14 +16,14 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_PWM
|
#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
|
||||||
|
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
|
||||||
@@ -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),
|
||||||
@@ -274,9 +274,9 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255
|
|||||||
else
|
else
|
||||||
top = *timer.ICRn; // top = ICRn
|
top = *timer.ICRn; // top = ICRn
|
||||||
|
|
||||||
_SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top / v_size)); // Scale 8/16-bit v to top value
|
_SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM
|
#endif // NEEDS_HARDWARE_PWM
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
52
Marlin/src/HAL/AVR/fastio.cpp
Executable file → Normal file
52
Marlin/src/HAL/AVR/fastio.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -234,5 +234,55 @@ uint8_t extDigitalRead(const int8_t pin) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/**
|
||||||
|
* Set Timer 5 PWM frequency in Hz, from 3.8Hz up to ~16MHz
|
||||||
|
* with a minimum resolution of 100 steps.
|
||||||
|
*
|
||||||
|
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
||||||
|
*/
|
||||||
|
uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) {
|
||||||
|
float count = 0;
|
||||||
|
if (hz > 0 && (dca || dcb || dcc)) {
|
||||||
|
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
||||||
|
uint16_t prescaler; // Range of 30.5Hz (65535) 64.5KHz (>31)
|
||||||
|
|
||||||
|
if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); }
|
||||||
|
else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); }
|
||||||
|
else if (count >= 255. * 8.) { prescaler = 64; SET_CS(5, PRESCALER_64); }
|
||||||
|
else if (count >= 255.) { prescaler = 8; SET_CS(5, PRESCALER_8); }
|
||||||
|
else { prescaler = 1; SET_CS(5, PRESCALER_1); }
|
||||||
|
|
||||||
|
count /= float(prescaler);
|
||||||
|
const float pwm_top = round(count); // Get the rounded count
|
||||||
|
|
||||||
|
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
|
||||||
|
OCR5A = pwm_top * ABS(dca); // Update and scale DCs
|
||||||
|
OCR5B = pwm_top * ABS(dcb);
|
||||||
|
OCR5C = pwm_top * ABS(dcc);
|
||||||
|
_SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes
|
||||||
|
_SET_COM(5, B, dcb ? (dcb < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL);
|
||||||
|
_SET_COM(5, C, dcc ? (dcc < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL);
|
||||||
|
|
||||||
|
SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP
|
||||||
|
|
||||||
|
//SERIAL_ECHOLNPGM("Timer 5 Settings:");
|
||||||
|
//SERIAL_ECHOLNPGM(" Prescaler=", prescaler);
|
||||||
|
//SERIAL_ECHOLNPGM(" TOP=", ICR5);
|
||||||
|
//SERIAL_ECHOLNPGM(" OCR5A=", OCR5A);
|
||||||
|
//SERIAL_ECHOLNPGM(" OCR5B=", OCR5B);
|
||||||
|
//SERIAL_ECHOLNPGM(" OCR5C=", OCR5C);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Restore the default for Timer 5
|
||||||
|
SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct)
|
||||||
|
SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing
|
||||||
|
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250KHz
|
||||||
|
OCR5A = OCR5B = OCR5C = 0;
|
||||||
|
}
|
||||||
|
return round(count);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // FASTIO_EXT_START
|
#endif // FASTIO_EXT_START
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
24
Marlin/src/HAL/AVR/fastio.h
Executable file → Normal file
24
Marlin/src/HAL/AVR/fastio.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -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
|
||||||
@@ -57,7 +63,7 @@
|
|||||||
*
|
*
|
||||||
* Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW);
|
* Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW);
|
||||||
*
|
*
|
||||||
* Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
|
* Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _READ(IO) TEST(DIO ## IO ## _RPORT, DIO ## IO ## _PIN)
|
#define _READ(IO) TEST(DIO ## IO ## _RPORT, DIO ## IO ## _PIN)
|
||||||
@@ -278,8 +284,8 @@ enum ClockSource2 : char {
|
|||||||
* PWM availability macros
|
* PWM availability macros
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Determine which harware PWMs are already in use
|
// Determine which hardware PWMs are already in use
|
||||||
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN)
|
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
|
||||||
#if PIN_EXISTS(CONTROLLER_FAN)
|
#if PIN_EXISTS(CONTROLLER_FAN)
|
||||||
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
||||||
#else
|
#else
|
||||||
|
2
Marlin/src/HAL/AVR/fastio/fastio_1280.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/fastio/fastio_1280.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
2
Marlin/src/HAL/AVR/fastio/fastio_1281.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/fastio/fastio_1281.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
2
Marlin/src/HAL/AVR/fastio/fastio_168.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/fastio/fastio_168.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
2
Marlin/src/HAL/AVR/fastio/fastio_644.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/fastio/fastio_644.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
2
Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
6
Marlin/src/HAL/AVR/inc/Conditionals_LCD.h
Executable file → Normal file
6
Marlin/src/HAL/AVR/inc/Conditionals_LCD.h
Executable file → Normal file
@@ -16,7 +16,11 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#if HAS_SPI_TFT || HAS_FSMC_TFT
|
||||||
|
#error "Sorry! TFT displays are not available for HAL/AVR."
|
||||||
|
#endif
|
||||||
|
2
Marlin/src/HAL/AVR/inc/Conditionals_adv.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/inc/Conditionals_adv.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
2
Marlin/src/HAL/AVR/inc/Conditionals_post.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/inc/Conditionals_post.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
30
Marlin/src/HAL/AVR/inc/SanityCheck.h
Executable file → Normal file
30
Marlin/src/HAL/AVR/inc/SanityCheck.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -25,16 +25,6 @@
|
|||||||
* Test AVR-specific configuration values for errors at compile-time.
|
* Test AVR-specific configuration values for errors at compile-time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Digipot requirement
|
|
||||||
*/
|
|
||||||
#if ENABLED(DIGIPOT_MCP4018)
|
|
||||||
#if !defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) \
|
|
||||||
|| !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1)
|
|
||||||
#error "DIGIPOT_MCP4018 requires DIGIPOTS_I2C_SDA_* pins to be defined."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks for FAST PWM
|
* Checks for FAST PWM
|
||||||
*/
|
*/
|
||||||
@@ -45,21 +35,31 @@
|
|||||||
/**
|
/**
|
||||||
* Sanity checks for Spindle / Laser PWM
|
* Sanity checks for Spindle / Laser PWM
|
||||||
*/
|
*/
|
||||||
#if ENABLED(SPINDLE_LASER_PWM)
|
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||||
|
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
|
||||||
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
||||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
||||||
#elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
|
#elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
|
||||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(SPINDLE_LASER_FREQUENCY)
|
||||||
|
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
||||||
*/
|
*/
|
||||||
#if HAS_TRINAMIC_CONFIG && ENABLED(ENDSTOP_INTERRUPTS_FEATURE)
|
#if BOTH(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
|
||||||
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL && ENABLED(MONITOR_DRIVER_STATUS)
|
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
||||||
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Postmortem debugging
|
||||||
|
*/
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
#error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
|
||||||
|
#endif
|
||||||
|
2
Marlin/src/HAL/AVR/math.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/math.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
40
Marlin/src/HAL/AVR/pinsDebug.h
Executable file → Normal file
40
Marlin/src/HAL/AVR/pinsDebug.h
Executable file → Normal file
@@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@@ -13,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -26,7 +29,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
|
||||||
|
|
||||||
@@ -36,7 +41,7 @@
|
|||||||
// portModeRegister takes a different argument
|
// portModeRegister takes a different argument
|
||||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||||
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
||||||
|
|
||||||
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
||||||
@@ -233,9 +238,9 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin");
|
|||||||
|
|
||||||
inline void com_print(const uint8_t N, const uint8_t Z) {
|
inline void com_print(const uint8_t N, const uint8_t Z) {
|
||||||
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
||||||
SERIAL_ECHOPGM(" COM");
|
SERIAL_ECHOPGM(" COM", AS_DIGIT(N));
|
||||||
SERIAL_CHAR('0' + N, Z);
|
SERIAL_CHAR(Z);
|
||||||
SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
SERIAL_ECHOPGM(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
|
void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
|
||||||
@@ -245,8 +250,8 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
||||||
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
||||||
|
|
||||||
SERIAL_ECHOPGM(" TIMER");
|
SERIAL_ECHOPGM(" TIMER", AS_DIGIT(T));
|
||||||
SERIAL_CHAR(T + '0', L);
|
SERIAL_CHAR(L);
|
||||||
SERIAL_ECHO_SP(3);
|
SERIAL_ECHO_SP(3);
|
||||||
|
|
||||||
if (N == 3) {
|
if (N == 3) {
|
||||||
@@ -257,22 +262,14 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A');
|
const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A');
|
||||||
PWM_PRINT(*OCRVAL16);
|
PWM_PRINT(*OCRVAL16);
|
||||||
}
|
}
|
||||||
SERIAL_ECHOPAIR(" WGM: ", WGM);
|
SERIAL_ECHOPGM(" WGM: ", WGM);
|
||||||
com_print(T,L);
|
com_print(T,L);
|
||||||
SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
SERIAL_ECHOPGM(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
||||||
|
SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "A: ", *TCCRA);
|
||||||
SERIAL_ECHOPGM(" TCCR");
|
SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "B: ", *TCCRB);
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR("A: ", *TCCRA);
|
|
||||||
|
|
||||||
SERIAL_ECHOPGM(" TCCR");
|
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR("B: ", *TCCRB);
|
|
||||||
|
|
||||||
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
||||||
SERIAL_ECHOPGM(" TIMSK");
|
SERIAL_ECHOPGM(" TIMSK", AS_DIGIT(T), ": ", *TMSK);
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR(": ", *TMSK);
|
|
||||||
|
|
||||||
const uint8_t OCIE = L - 'A' + 1;
|
const uint8_t OCIE = L - 'A' + 1;
|
||||||
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
||||||
@@ -399,3 +396,4 @@ static void pwm_details(uint8_t pin) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
5
Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
Executable file → Normal file
5
Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h
Executable file → Normal file
@@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@@ -13,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
14
Marlin/src/HAL/AVR/pinsDebug_plus_70.h
Executable file → Normal file
14
Marlin/src/HAL/AVR/pinsDebug_plus_70.h
Executable file → Normal file
@@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@@ -13,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -22,15 +25,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
|
||||||
|
18
Marlin/src/HAL/AVR/spi_pins.h
Executable file → Normal file
18
Marlin/src/HAL/AVR/spi_pins.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -51,15 +51,15 @@
|
|||||||
#define AVR_SS_PIN 16
|
#define AVR_SS_PIN 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SCK_PIN AVR_SCK_PIN
|
#define SD_SCK_PIN AVR_SCK_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN AVR_MISO_PIN
|
#define SD_MISO_PIN AVR_MISO_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN AVR_MOSI_PIN
|
#define SD_MOSI_PIN AVR_MOSI_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SS_PIN
|
#ifndef SD_SS_PIN
|
||||||
#define SS_PIN AVR_SS_PIN
|
#define SD_SS_PIN AVR_SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
260
Marlin/src/HAL/AVR/timers.h
Normal file
260
Marlin/src/HAL/AVR/timers.h
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Types
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
typedef uint16_t hal_timer_t;
|
||||||
|
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Defines
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
|
||||||
|
|
||||||
|
#ifndef STEP_TIMER_NUM
|
||||||
|
#define STEP_TIMER_NUM 1
|
||||||
|
#endif
|
||||||
|
#ifndef PULSE_TIMER_NUM
|
||||||
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
|
#endif
|
||||||
|
#ifndef TEMP_TIMER_NUM
|
||||||
|
#define TEMP_TIMER_NUM 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
||||||
|
|
||||||
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||||
|
#define STEPPER_TIMER_PRESCALE 8
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
|
||||||
|
|
||||||
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
||||||
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
||||||
|
#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
|
||||||
|
|
||||||
|
#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B)
|
||||||
|
#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B)
|
||||||
|
#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B)
|
||||||
|
|
||||||
|
FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
||||||
|
switch (timer_num) {
|
||||||
|
case STEP_TIMER_NUM:
|
||||||
|
// waveform generation = 0100 = CTC
|
||||||
|
SET_WGM(1, CTC_OCRnA);
|
||||||
|
|
||||||
|
// output mode = 00 (disconnected)
|
||||||
|
SET_COMA(1, NORMAL);
|
||||||
|
|
||||||
|
// Set the timer pre-scaler
|
||||||
|
// Generally we use a divider of 8, resulting in a 2MHz timer
|
||||||
|
// frequency on a 16MHz MCU. If you are going to change this, be
|
||||||
|
// sure to regenerate speed_lookuptable.h with
|
||||||
|
// create_speed_lookuptable.py
|
||||||
|
SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler
|
||||||
|
|
||||||
|
// Init Stepper ISR to 122 Hz for quick starting
|
||||||
|
// (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency
|
||||||
|
OCR1A = 0x4000;
|
||||||
|
TCNT1 = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TEMP_TIMER_NUM:
|
||||||
|
// Use timer0 for temperature measurement
|
||||||
|
// Interleave temperature interrupt with millies interrupt
|
||||||
|
OCR0B = 128;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TIMER_OCR_1 OCR1A
|
||||||
|
#define TIMER_COUNTER_1 TCNT1
|
||||||
|
|
||||||
|
#define TIMER_OCR_0 OCR0A
|
||||||
|
#define TIMER_COUNTER_0 TCNT0
|
||||||
|
|
||||||
|
#define _CAT(a,V...) a##V
|
||||||
|
#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
|
||||||
|
#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer)
|
||||||
|
#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On AVR there is no hardware prioritization and preemption of
|
||||||
|
* interrupts, so this emulates it. The UART has first priority
|
||||||
|
* (otherwise, characters will be lost due to UART overflow).
|
||||||
|
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
||||||
|
*/
|
||||||
|
#define HAL_timer_isr_prologue(TIMER_NUM)
|
||||||
|
#define HAL_timer_isr_epilogue(TIMER_NUM)
|
||||||
|
|
||||||
|
/* 18 cycles maximum latency */
|
||||||
|
#ifndef HAL_STEP_TIMER_ISR
|
||||||
|
|
||||||
|
#define HAL_STEP_TIMER_ISR() \
|
||||||
|
extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
||||||
|
extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
||||||
|
void TIMER1_COMPA_vect() { \
|
||||||
|
__asm__ __volatile__ ( \
|
||||||
|
A("push r16") /* 2 Save R16 */ \
|
||||||
|
A("in r16, __SREG__") /* 1 Get SREG */ \
|
||||||
|
A("push r16") /* 2 Save SREG into stack */ \
|
||||||
|
A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
|
||||||
|
A("push r16") /* 2 Save TIMSK0 into the stack */ \
|
||||||
|
A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \
|
||||||
|
A("sts %[timsk0], r16") /* 2 And set the new value */ \
|
||||||
|
A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \
|
||||||
|
A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \
|
||||||
|
A("sts %[timsk1], r16") /* 2 And set the new value */ \
|
||||||
|
A("push r16") /* 2 Save TIMSK1 into stack */ \
|
||||||
|
A("in r16, 0x3B") /* 1 Get RAMPZ register */ \
|
||||||
|
A("push r16") /* 2 Save RAMPZ into stack */ \
|
||||||
|
A("in r16, 0x3C") /* 1 Get EIND register */ \
|
||||||
|
A("push r0") /* C runtime can modify all the following registers without restoring them */ \
|
||||||
|
A("push r1") \
|
||||||
|
A("push r18") \
|
||||||
|
A("push r19") \
|
||||||
|
A("push r20") \
|
||||||
|
A("push r21") \
|
||||||
|
A("push r22") \
|
||||||
|
A("push r23") \
|
||||||
|
A("push r24") \
|
||||||
|
A("push r25") \
|
||||||
|
A("push r26") \
|
||||||
|
A("push r27") \
|
||||||
|
A("push r30") \
|
||||||
|
A("push r31") \
|
||||||
|
A("clr r1") /* C runtime expects this register to be 0 */ \
|
||||||
|
A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
|
||||||
|
A("pop r31") \
|
||||||
|
A("pop r30") \
|
||||||
|
A("pop r27") \
|
||||||
|
A("pop r26") \
|
||||||
|
A("pop r25") \
|
||||||
|
A("pop r24") \
|
||||||
|
A("pop r23") \
|
||||||
|
A("pop r22") \
|
||||||
|
A("pop r21") \
|
||||||
|
A("pop r20") \
|
||||||
|
A("pop r19") \
|
||||||
|
A("pop r18") \
|
||||||
|
A("pop r1") \
|
||||||
|
A("pop r0") \
|
||||||
|
A("out 0x3C, r16") /* 1 Restore EIND register */ \
|
||||||
|
A("pop r16") /* 2 Get the original RAMPZ register value */ \
|
||||||
|
A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \
|
||||||
|
A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \
|
||||||
|
A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \
|
||||||
|
A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \
|
||||||
|
A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \
|
||||||
|
A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \
|
||||||
|
A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \
|
||||||
|
A("pop r16") /* 2 Get the old SREG value */ \
|
||||||
|
A("out __SREG__, r16") /* 1 And restore the SREG value */ \
|
||||||
|
A("pop r16") /* 2 Restore R16 value */ \
|
||||||
|
A("reti") /* 4 Return from interrupt */ \
|
||||||
|
: \
|
||||||
|
: [timsk0] "i" ((uint16_t)&TIMSK0), \
|
||||||
|
[timsk1] "i" ((uint16_t)&TIMSK1), \
|
||||||
|
[msk0] "M" ((uint8_t)(1<<OCIE0B)),\
|
||||||
|
[msk1] "M" ((uint8_t)(1<<OCIE1A)) \
|
||||||
|
: \
|
||||||
|
); \
|
||||||
|
} \
|
||||||
|
void TIMER1_COMPA_vect_bottom()
|
||||||
|
|
||||||
|
#endif // HAL_STEP_TIMER_ISR
|
||||||
|
|
||||||
|
#ifndef HAL_TEMP_TIMER_ISR
|
||||||
|
|
||||||
|
/* 14 cycles maximum latency */
|
||||||
|
#define HAL_TEMP_TIMER_ISR() \
|
||||||
|
extern "C" void TIMER0_COMPB_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
||||||
|
extern "C" void TIMER0_COMPB_vect_bottom() asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
||||||
|
void TIMER0_COMPB_vect() { \
|
||||||
|
__asm__ __volatile__ ( \
|
||||||
|
A("push r16") /* 2 Save R16 */ \
|
||||||
|
A("in r16, __SREG__") /* 1 Get SREG */ \
|
||||||
|
A("push r16") /* 2 Save SREG into stack */ \
|
||||||
|
A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \
|
||||||
|
A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \
|
||||||
|
A("sts %[timsk0], r16") /* 2 And set the new value */ \
|
||||||
|
A("sei") /* 1 Enable global interrupts - It is safe, as the temperature ISR is disabled, so we cannot reenter it */ \
|
||||||
|
A("push r16") /* 2 Save TIMSK0 into stack */ \
|
||||||
|
A("in r16, 0x3B") /* 1 Get RAMPZ register */ \
|
||||||
|
A("push r16") /* 2 Save RAMPZ into stack */ \
|
||||||
|
A("in r16, 0x3C") /* 1 Get EIND register */ \
|
||||||
|
A("push r0") /* C runtime can modify all the following registers without restoring them */ \
|
||||||
|
A("push r1") \
|
||||||
|
A("push r18") \
|
||||||
|
A("push r19") \
|
||||||
|
A("push r20") \
|
||||||
|
A("push r21") \
|
||||||
|
A("push r22") \
|
||||||
|
A("push r23") \
|
||||||
|
A("push r24") \
|
||||||
|
A("push r25") \
|
||||||
|
A("push r26") \
|
||||||
|
A("push r27") \
|
||||||
|
A("push r30") \
|
||||||
|
A("push r31") \
|
||||||
|
A("clr r1") /* C runtime expects this register to be 0 */ \
|
||||||
|
A("call TIMER0_COMPB_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
|
||||||
|
A("pop r31") \
|
||||||
|
A("pop r30") \
|
||||||
|
A("pop r27") \
|
||||||
|
A("pop r26") \
|
||||||
|
A("pop r25") \
|
||||||
|
A("pop r24") \
|
||||||
|
A("pop r23") \
|
||||||
|
A("pop r22") \
|
||||||
|
A("pop r21") \
|
||||||
|
A("pop r20") \
|
||||||
|
A("pop r19") \
|
||||||
|
A("pop r18") \
|
||||||
|
A("pop r1") \
|
||||||
|
A("pop r0") \
|
||||||
|
A("out 0x3C, r16") /* 1 Restore EIND register */ \
|
||||||
|
A("pop r16") /* 2 Get the original RAMPZ register value */ \
|
||||||
|
A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \
|
||||||
|
A("pop r16") /* 2 Get the original TIMSK0 value but with temperature ISR disabled */ \
|
||||||
|
A("ori r16,%[msk0]") /* 1 Enable temperature ISR */ \
|
||||||
|
A("cli") /* 1 Disable global interrupts - We must do this, as we will reenable the temperature ISR, and we don't want to reenter this handler until the current one is done */ \
|
||||||
|
A("sts %[timsk0], r16") /* 2 And restore the old value */ \
|
||||||
|
A("pop r16") /* 2 Get the old SREG */ \
|
||||||
|
A("out __SREG__, r16") /* 1 And restore the SREG value */ \
|
||||||
|
A("pop r16") /* 2 Restore R16 */ \
|
||||||
|
A("reti") /* 4 Return from interrupt */ \
|
||||||
|
: \
|
||||||
|
: [timsk0] "i"((uint16_t)&TIMSK0), \
|
||||||
|
[msk0] "M" ((uint8_t)(1<<OCIE0B)) \
|
||||||
|
: \
|
||||||
|
); \
|
||||||
|
} \
|
||||||
|
void TIMER0_COMPB_vect_bottom()
|
||||||
|
|
||||||
|
#endif // HAL_TEMP_TIMER_ISR
|
12
Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
Executable file → Normal file
12
Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -57,15 +57,15 @@
|
|||||||
|
|
||||||
#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"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
|
static uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
|
||||||
volatile uint8_t *u8g_outData, *u8g_outClock;
|
static volatile uint8_t *u8g_outData, *u8g_outClock;
|
||||||
|
|
||||||
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
|
||||||
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
|
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
|
||||||
@@ -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
|
||||||
|
3
Marlin/src/HAL/AVR/watchdog.cpp
Executable file → Normal file
3
Marlin/src/HAL/AVR/watchdog.cpp
Executable file → Normal file
@@ -16,10 +16,9 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
2
Marlin/src/HAL/AVR/watchdog.h
Executable file → Normal file
2
Marlin/src/HAL/AVR/watchdog.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@@ -1,343 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
#include "../../core/serial.h"
|
|
||||||
|
|
||||||
#include "../shared/backtrace/unwinder.h"
|
|
||||||
#include "../shared/backtrace/unwmemaccess.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
// Debug monitor that dumps to the Programming port all status when
|
|
||||||
// an exception or WDT timeout happens - And then resets the board
|
|
||||||
|
|
||||||
// All the Monitor routines must run with interrupts disabled and
|
|
||||||
// under an ISR execution context. That is why we cannot reuse the
|
|
||||||
// Serial interrupt routines or any C runtime, as we don't know the
|
|
||||||
// state we are when running them
|
|
||||||
|
|
||||||
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
|
||||||
#define sw_barrier() __asm__ volatile("": : :"memory");
|
|
||||||
|
|
||||||
// (re)initialize UART0 as a monitor output to 250000,n,8,1
|
|
||||||
static void TXBegin() {
|
|
||||||
|
|
||||||
// Disable UART interrupt in NVIC
|
|
||||||
NVIC_DisableIRQ( UART_IRQn );
|
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
|
||||||
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
|
|
||||||
// Disable clock
|
|
||||||
pmc_disable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Configure PMC
|
|
||||||
pmc_enable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Disable PDC channel
|
|
||||||
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
|
||||||
|
|
||||||
// Reset and disable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
|
||||||
|
|
||||||
// Configure mode: 8bit, No parity, 1 bit stop
|
|
||||||
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
|
||||||
|
|
||||||
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
|
||||||
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
|
||||||
|
|
||||||
// Enable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send character through UART with no interrupts
|
|
||||||
static void TX(char c) {
|
|
||||||
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
|
||||||
UART->UART_THR = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send String through UART
|
|
||||||
static void TX(const char* s) {
|
|
||||||
while (*s) TX(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TXDigit(uint32_t d) {
|
|
||||||
if (d < 10) TX((char)(d+'0'));
|
|
||||||
else if (d < 16) TX((char)(d+'A'-10));
|
|
||||||
else TX('?');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Hex number thru UART
|
|
||||||
static void TXHex(uint32_t v) {
|
|
||||||
TX("0x");
|
|
||||||
for (uint8_t i = 0; i < 8; i++, v <<= 4)
|
|
||||||
TXDigit((v >> 28) & 0xF);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Decimal number thru UART
|
|
||||||
static void TXDec(uint32_t v) {
|
|
||||||
if (!v) {
|
|
||||||
TX('0');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char nbrs[14];
|
|
||||||
char *p = &nbrs[0];
|
|
||||||
while (v != 0) {
|
|
||||||
*p++ = '0' + (v % 10);
|
|
||||||
v /= 10;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
p--;
|
|
||||||
TX(*p);
|
|
||||||
} while (p != &nbrs[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dump a backtrace entry
|
|
||||||
static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
|
||||||
int* p = (int*)ctx;
|
|
||||||
|
|
||||||
(*p)++;
|
|
||||||
TX('#'); TXDec(*p); TX(" : ");
|
|
||||||
TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function);
|
|
||||||
TX('+'); TXDec(bte->address - bte->function);
|
|
||||||
TX(" PC:");TXHex(bte->address); TX('\n');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
void UnwPrintf(const char* format, ...) {
|
|
||||||
char dest[256];
|
|
||||||
va_list argptr;
|
|
||||||
va_start(argptr, format);
|
|
||||||
vsprintf(dest, format, argptr);
|
|
||||||
va_end(argptr);
|
|
||||||
TX(&dest[0]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Table of function pointers for passing to the unwinder */
|
|
||||||
static const UnwindCallbacks UnwCallbacks = {
|
|
||||||
UnwReportOut,
|
|
||||||
UnwReadW,
|
|
||||||
UnwReadH,
|
|
||||||
UnwReadB
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
, UnwPrintf
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HardFaultHandler_C:
|
|
||||||
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
|
|
||||||
* as the parameter. We can then read the values from the stack and place them
|
|
||||||
* into local variables for ease of reading.
|
|
||||||
* We then read the various Fault Status and Address Registers to help decode
|
|
||||||
* cause of the fault.
|
|
||||||
* The function ends with a BKPT instruction to force control back into the debugger
|
|
||||||
*/
|
|
||||||
extern "C"
|
|
||||||
void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) {
|
|
||||||
|
|
||||||
static const char* causestr[] = {
|
|
||||||
"NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC"
|
|
||||||
};
|
|
||||||
|
|
||||||
UnwindFrame btf;
|
|
||||||
|
|
||||||
// Dump report to the Programming port (interrupts are DISABLED)
|
|
||||||
TXBegin();
|
|
||||||
TX("\n\n## Software Fault detected ##\n");
|
|
||||||
TX("Cause: "); TX(causestr[cause]); TX('\n');
|
|
||||||
|
|
||||||
TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n');
|
|
||||||
TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n');
|
|
||||||
TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n');
|
|
||||||
TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n');
|
|
||||||
TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n');
|
|
||||||
TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n');
|
|
||||||
TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n');
|
|
||||||
TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n');
|
|
||||||
|
|
||||||
// Configurable Fault Status Register
|
|
||||||
// Consists of MMSR, BFSR and UFSR
|
|
||||||
TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n');
|
|
||||||
|
|
||||||
// Hard Fault Status Register
|
|
||||||
TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n');
|
|
||||||
|
|
||||||
// Debug Fault Status Register
|
|
||||||
TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n');
|
|
||||||
|
|
||||||
// Auxiliary Fault Status Register
|
|
||||||
TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n');
|
|
||||||
|
|
||||||
// Read the Fault Address Registers. These may not contain valid values.
|
|
||||||
// Check BFARVALID/MMARVALID to see if they are valid values
|
|
||||||
// MemManage Fault Address Register
|
|
||||||
TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n');
|
|
||||||
|
|
||||||
// Bus Fault Address Register
|
|
||||||
TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n');
|
|
||||||
|
|
||||||
TX("ExcLR: "); TXHex(lr); TX('\n');
|
|
||||||
TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n');
|
|
||||||
|
|
||||||
btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer
|
|
||||||
btf.fp = btf.sp;
|
|
||||||
btf.lr = ((unsigned long)sp[5]);
|
|
||||||
btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it
|
|
||||||
|
|
||||||
// Perform a backtrace
|
|
||||||
TX("\nBacktrace:\n\n");
|
|
||||||
int ctr = 0;
|
|
||||||
UnwindStart(&btf, &UnwCallbacks, &ctr);
|
|
||||||
|
|
||||||
// Disable all NVIC interrupts
|
|
||||||
NVIC->ICER[0] = 0xFFFFFFFF;
|
|
||||||
NVIC->ICER[1] = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
// Relocate VTOR table to default position
|
|
||||||
SCB->VTOR = 0;
|
|
||||||
|
|
||||||
// Disable USB
|
|
||||||
otg_disable();
|
|
||||||
|
|
||||||
// Restart watchdog
|
|
||||||
WDT_Restart(WDT);
|
|
||||||
|
|
||||||
// Reset controller
|
|
||||||
NVIC_SystemReset();
|
|
||||||
for (;;) WDT_Restart(WDT);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void NMI_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#0")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void HardFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#1")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void MemManage_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#2")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void BusFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#3")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void UsageFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#4")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void DebugMon_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#5")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
|
|
||||||
__attribute__((naked)) void WDT_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#6")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void RSTC_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#7")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
|
File diff suppressed because it is too large
Load Diff
26
Marlin/src/HAL/DUE/HAL.cpp
Executable file → Normal file
26
Marlin/src/HAL/DUE/HAL.cpp
Executable file → Normal file
@@ -14,13 +14,12 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -41,6 +40,8 @@ uint16_t HAL_adc_result;
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
|
TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial());
|
||||||
|
|
||||||
// HAL initialization task
|
// HAL initialization task
|
||||||
void HAL_init() {
|
void HAL_init() {
|
||||||
// Initialize the USB stack
|
// Initialize the USB stack
|
||||||
@@ -48,6 +49,7 @@ void HAL_init() {
|
|||||||
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||||
#endif
|
#endif
|
||||||
usb_task_init();
|
usb_task_init();
|
||||||
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// HAL idle task
|
// HAL idle task
|
||||||
@@ -75,6 +77,8 @@ uint8_t HAL_get_reset_source() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HAL_reboot() { rstc_start_software_reset(RSTC); }
|
||||||
|
|
||||||
void _delay_ms(const int delay_ms) {
|
void _delay_ms(const int delay_ms) {
|
||||||
// Todo: port for Due?
|
// Todo: port for Due?
|
||||||
delay(delay_ms);
|
delay(delay_ms);
|
||||||
@@ -103,4 +107,18 @@ uint16_t HAL_adc_get_result() {
|
|||||||
return HAL_adc_result;
|
return HAL_adc_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Forward the default serial ports
|
||||||
|
#if USING_HW_SERIAL0
|
||||||
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL1
|
||||||
|
DefaultSerial2 MSerial1(false, Serial1);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL2
|
||||||
|
DefaultSerial3 MSerial2(false, Serial2);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL3
|
||||||
|
DefaultSerial4 MSerial3(false, Serial3);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
131
Marlin/src/HAL/DUE/HAL.h
Executable file → Normal file
131
Marlin/src/HAL/DUE/HAL.h
Executable file → Normal file
@@ -16,81 +16,81 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#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
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
|
#include "../shared/eeprom_if.h"
|
||||||
#include "../shared/math_32bit.h"
|
#include "../shared/math_32bit.h"
|
||||||
#include "../shared/HAL_SPI.h"
|
#include "../shared/HAL_SPI.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
#include "timers.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// Define MYSERIAL0/1 before MarlinSerial includes!
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
||||||
|
extern DefaultSerial1 MSerial0;
|
||||||
|
extern DefaultSerial2 MSerial1;
|
||||||
|
extern DefaultSerial3 MSerial2;
|
||||||
|
extern DefaultSerial4 MSerial3;
|
||||||
|
|
||||||
|
#define _MSERIAL(X) MSerial##X
|
||||||
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
|
||||||
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#define MYSERIAL0 customizedSerial1
|
#define MYSERIAL1 customizedSerial1
|
||||||
#elif SERIAL_PORT == 0
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#define MYSERIAL0 Serial
|
#define MYSERIAL1 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 0 to 3, or -1 for USB Serial."
|
||||||
#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."
|
#define MYSERIAL2 customizedSerial2
|
||||||
#elif SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#define MYSERIAL1 customizedSerial2
|
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
||||||
#elif SERIAL_PORT_2 == 0
|
|
||||||
#define MYSERIAL1 Serial
|
|
||||||
#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 0 to 3, or -1 for USB Serial."
|
||||||
#endif
|
#endif
|
||||||
#define NUM_SERIAL 2
|
|
||||||
#else
|
|
||||||
#define NUM_SERIAL 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DGUS_SERIAL_PORT
|
#ifdef SERIAL_PORT_3
|
||||||
#if DGUS_SERIAL_PORT == SERIAL_PORT
|
#if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#error "DGUS_SERIAL_PORT must be different from SERIAL_PORT. Please update your configuration."
|
#define MYSERIAL3 customizedSerial3
|
||||||
#elif defined(SERIAL_PORT_2) && DGUS_SERIAL_PORT == SERIAL_PORT_2
|
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
#error "DGUS_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration."
|
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
||||||
#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 "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
#if WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||||
|
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "MMU2_SERIAL_PORT must be from 0 to 3."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
#if WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -100,16 +100,6 @@
|
|||||||
// On AVR this is in math.h?
|
// On AVR this is in math.h?
|
||||||
#define square(x) ((x)*(x))
|
#define square(x) ((x)*(x))
|
||||||
|
|
||||||
#ifndef strncpy_P
|
|
||||||
#define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Fix bug in pgm_read_ptr
|
|
||||||
#undef pgm_read_ptr
|
|
||||||
#define pgm_read_ptr(addr) (*((void**)(addr)))
|
|
||||||
#undef pgm_read_word
|
|
||||||
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
|
|
||||||
|
|
||||||
typedef int8_t pin_t;
|
typedef int8_t pin_t;
|
||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS
|
||||||
@@ -130,13 +120,7 @@ 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
|
||||||
|
|
||||||
//
|
void HAL_reboot();
|
||||||
// EEPROM
|
|
||||||
//
|
|
||||||
void eeprom_write_byte(uint8_t *pos, unsigned char value);
|
|
||||||
uint8_t eeprom_read_byte(uint8_t *pos);
|
|
||||||
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
|
|
||||||
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC
|
// ADC
|
||||||
@@ -144,15 +128,16 @@ void eeprom_update_block (const void *__src, void *__dst, size_t __n);
|
|||||||
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)
|
||||||
|
|
||||||
inline void HAL_adc_init() {}//todo
|
inline void HAL_adc_init() {}//todo
|
||||||
|
|
||||||
#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch)
|
#define HAL_ADC_VREF 3.3
|
||||||
#define HAL_ADC_RESOLUTION 10
|
#define HAL_ADC_RESOLUTION 10
|
||||||
|
#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch)
|
||||||
#define HAL_READ_ADC() HAL_adc_result
|
#define HAL_READ_ADC() HAL_adc_result
|
||||||
#define HAL_ADC_READY() true
|
#define HAL_ADC_READY() true
|
||||||
|
|
||||||
@@ -183,10 +168,16 @@ void HAL_init();
|
|||||||
//
|
//
|
||||||
void _delay_ms(const int delay);
|
void _delay_ms(const int delay);
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#if GCC_VERSION <= 50000
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
91
Marlin/src/HAL/DUE/HAL_MinSerial.cpp
Normal file
91
Marlin/src/HAL/DUE/HAL_MinSerial.cpp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
|
||||||
|
#include "../shared/HAL_MinSerial.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
static void TXBegin() {
|
||||||
|
// Disable UART interrupt in NVIC
|
||||||
|
NVIC_DisableIRQ( UART_IRQn );
|
||||||
|
|
||||||
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
|
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
// Disable clock
|
||||||
|
pmc_disable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Configure PMC
|
||||||
|
pmc_enable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Disable PDC channel
|
||||||
|
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
||||||
|
|
||||||
|
// Reset and disable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
||||||
|
|
||||||
|
// Configure mode: 8bit, No parity, 1 bit stop
|
||||||
|
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
||||||
|
|
||||||
|
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
||||||
|
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
||||||
|
|
||||||
|
// Enable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
||||||
|
#define sw_barrier() __asm__ volatile("": : :"memory");
|
||||||
|
static void TX(char c) {
|
||||||
|
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
||||||
|
UART->UART_THR = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void install_min_serial() {
|
||||||
|
HAL_min_serial_init = &TXBegin;
|
||||||
|
HAL_min_serial_out = &TX;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DISABLED(DYNAMIC_VECTORTABLE)
|
||||||
|
extern "C" {
|
||||||
|
__attribute__((naked)) void JumpHandler_ASM() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"b CommonHandler_ASM\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // POSTMORTEM_DEBUGGING
|
||||||
|
#endif // ARDUINO_ARCH_SAM
|
151
Marlin/src/HAL/DUE/HAL_SPI.cpp
Executable file → Normal file
151
Marlin/src/HAL/DUE/HAL_SPI.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
@@ -56,8 +56,8 @@
|
|||||||
#pragma GCC optimize (3)
|
#pragma GCC optimize (3)
|
||||||
|
|
||||||
typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
|
typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
|
||||||
typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte);
|
typedef void (*pfnSpiRxBlock)(uint8_t *buf, uint32_t nbyte);
|
||||||
typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte);
|
typedef void (*pfnSpiTxBlock)(const uint8_t *buf, uint32_t nbyte);
|
||||||
|
|
||||||
/* ---------------- Macros to be able to access definitions from asm */
|
/* ---------------- Macros to be able to access definitions from asm */
|
||||||
#define _PORT(IO) DIO ## IO ## _WPORT
|
#define _PORT(IO) DIO ## IO ## _WPORT
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
|
|
||||||
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
uint32_t idx = 0;
|
uint32_t idx = 0;
|
||||||
|
|
||||||
/* Negate bout, as the assembler requires a negated value */
|
/* Negate bout, as the assembler requires a negated value */
|
||||||
@@ -154,9 +154,9 @@
|
|||||||
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -225,36 +225,36 @@
|
|||||||
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(MOSI_PIN, b & 0x80);
|
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
|
|
||||||
b |= (READ(MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
// all the others
|
// all the others
|
||||||
static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz
|
static uint16_t spiDelayNS = 4000; // 4000ns => 125khz
|
||||||
|
|
||||||
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(MOSI_PIN, b & 0x80);
|
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
__delay_4cycles(spiDelayCyclesX4);
|
DELAY_NS(spiDelayNS);
|
||||||
|
|
||||||
b |= (READ(MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
__delay_4cycles(spiDelayCyclesX4);
|
DELAY_NS(spiDelayNS);
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
@@ -270,11 +270,11 @@
|
|||||||
static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
|
|
||||||
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) {
|
static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t txval = 0;
|
uint32_t txval = 0;
|
||||||
|
|
||||||
@@ -349,12 +349,12 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiRxBlock0(uint8_t* ptr, uint32_t todo) {
|
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -425,48 +425,48 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiTxBlockX(const uint8_t* buf, uint32_t todo) {
|
static void spiTxBlockX(const uint8_t *buf, uint32_t todo) {
|
||||||
do {
|
do {
|
||||||
(void)spiTransferTx(*buf++);
|
(void)spiTransferTx(*buf++);
|
||||||
} while (--todo);
|
} while (--todo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiRxBlockX(uint8_t* buf, uint32_t todo) {
|
static void spiRxBlockX(uint8_t *buf, uint32_t todo) {
|
||||||
do {
|
do {
|
||||||
*buf++ = spiTransferRx(0xFF);
|
*buf++ = spiTransferRx(0xFF);
|
||||||
} while (--todo);
|
} while (--todo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pointers to generic functions for block tranfers
|
// Pointers to generic functions for block transfers
|
||||||
static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||||
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
|
|
||||||
#if MB(ALLIGATOR)
|
#if MB(ALLIGATOR)
|
||||||
#define _SS_WRITE(S) WRITE(SS_PIN, S)
|
#define _SS_WRITE(S) WRITE(SD_SS_PIN, S)
|
||||||
#else
|
#else
|
||||||
#define _SS_WRITE(S) NOOP
|
#define _SS_WRITE(S) NOOP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
SET_OUTPUT(SS_PIN);
|
SET_OUTPUT(SD_SS_PIN);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
SET_OUTPUT(SCK_PIN);
|
SET_OUTPUT(SD_SCK_PIN);
|
||||||
SET_INPUT(MISO_PIN);
|
SET_INPUT(SD_MISO_PIN);
|
||||||
SET_OUTPUT(MOSI_PIN);
|
SET_OUTPUT(SD_MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiRec() {
|
uint8_t spiRec() {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
||||||
uint8_t b = spiTransferRx(0xFF);
|
uint8_t b = spiTransferRx(0xFF);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (nbyte) {
|
if (nbyte) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
||||||
spiRxBlock(buf, nbyte);
|
spiRxBlock(buf, nbyte);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
@@ -478,7 +478,7 @@
|
|||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
(void)spiTransferTx(token);
|
(void)spiTransferTx(token);
|
||||||
spiTxBlock(buf, 512);
|
spiTxBlock(buf, 512);
|
||||||
@@ -510,7 +510,7 @@
|
|||||||
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate);
|
spiDelayNS = 4000 >> (6 - spiRate); // spiRate of 2 gives the maximum error with current CPU
|
||||||
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||||
@@ -519,8 +519,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
WRITE(MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Begin SPI transaction, set clock, bit order, data mode */
|
/** Begin SPI transaction, set clock, bit order, data mode */
|
||||||
@@ -575,38 +575,34 @@
|
|||||||
|
|
||||||
// Configure SPI pins
|
// Configure SPI pins
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SCK_PIN].pPort,
|
g_APinDescription[SD_SCK_PIN].pPort,
|
||||||
g_APinDescription[SCK_PIN].ulPinType,
|
g_APinDescription[SD_SCK_PIN].ulPinType,
|
||||||
g_APinDescription[SCK_PIN].ulPin,
|
g_APinDescription[SD_SCK_PIN].ulPin,
|
||||||
g_APinDescription[SCK_PIN].ulPinConfiguration);
|
g_APinDescription[SD_SCK_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[MOSI_PIN].pPort,
|
g_APinDescription[SD_MOSI_PIN].pPort,
|
||||||
g_APinDescription[MOSI_PIN].ulPinType,
|
g_APinDescription[SD_MOSI_PIN].ulPinType,
|
||||||
g_APinDescription[MOSI_PIN].ulPin,
|
g_APinDescription[SD_MOSI_PIN].ulPin,
|
||||||
g_APinDescription[MOSI_PIN].ulPinConfiguration);
|
g_APinDescription[SD_MOSI_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[MISO_PIN].pPort,
|
g_APinDescription[SD_MISO_PIN].pPort,
|
||||||
g_APinDescription[MISO_PIN].ulPinType,
|
g_APinDescription[SD_MISO_PIN].ulPinType,
|
||||||
g_APinDescription[MISO_PIN].ulPin,
|
g_APinDescription[SD_MISO_PIN].ulPin,
|
||||||
g_APinDescription[MISO_PIN].ulPinConfiguration);
|
g_APinDescription[SD_MISO_PIN].ulPinConfiguration);
|
||||||
|
|
||||||
// set master mode, peripheral select, fault detection
|
// set master mode, peripheral select, fault detection
|
||||||
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
||||||
SPI_Enable(SPI0);
|
SPI_Enable(SPI0);
|
||||||
|
|
||||||
SET_OUTPUT(DAC0_SYNC);
|
SET_OUTPUT(DAC0_SYNC_PIN);
|
||||||
#if EXTRUDERS > 1
|
#if HAS_MULTI_EXTRUDER
|
||||||
SET_OUTPUT(DAC1_SYNC);
|
OUT_WRITE(DAC1_SYNC_PIN, HIGH);
|
||||||
WRITE(DAC1_SYNC, HIGH);
|
|
||||||
#endif
|
#endif
|
||||||
SET_OUTPUT(SPI_EEPROM1_CS);
|
WRITE(DAC0_SYNC_PIN, HIGH);
|
||||||
SET_OUTPUT(SPI_EEPROM2_CS);
|
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
||||||
SET_OUTPUT(SPI_FLASH_CS);
|
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
||||||
WRITE(DAC0_SYNC, HIGH);
|
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
||||||
WRITE(SPI_EEPROM1_CS, HIGH);
|
WRITE(SD_SS_PIN, HIGH);
|
||||||
WRITE(SPI_EEPROM2_CS, HIGH);
|
|
||||||
WRITE(SPI_FLASH_CS, HIGH);
|
|
||||||
WRITE(SS_PIN, HIGH);
|
|
||||||
|
|
||||||
OUT_WRITE(SDSS, LOW);
|
OUT_WRITE(SDSS, LOW);
|
||||||
|
|
||||||
@@ -645,7 +641,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read from SPI into buffer
|
// Read from SPI into buffer
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (int i = 0; i < nbyte; i++) {
|
for (int i = 0; i < nbyte; i++) {
|
||||||
@@ -668,7 +664,7 @@
|
|||||||
//DELAY_US(1U);
|
//DELAY_US(1U);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(const uint8_t* buf, size_t nbyte) {
|
void spiSend(const uint8_t *buf, size_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (size_t i = 0; i < nbyte; i++) {
|
for (size_t i = 0; i < nbyte; i++) {
|
||||||
@@ -689,7 +685,7 @@
|
|||||||
FLUSH_RX();
|
FLUSH_RX();
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
|
void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (size_t i = 0; i < nbyte; i++) {
|
for (size_t i = 0; i < nbyte; i++) {
|
||||||
@@ -702,7 +698,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write from buffer to SPI
|
// Write from buffer to SPI
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
|
SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
|
||||||
WHILE_TX(0);
|
WHILE_TX(0);
|
||||||
//WHILE_RX(0);
|
//WHILE_RX(0);
|
||||||
@@ -759,7 +755,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)
|
||||||
@@ -802,19 +797,19 @@
|
|||||||
|
|
||||||
uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
|
uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
|
||||||
|
|
||||||
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
for (int i = 0; i < nbyte; i++)
|
for (int i = 0; i < nbyte; i++)
|
||||||
buf[i] = spiTransfer(0xFF);
|
buf[i] = spiTransfer(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint8_t data) { spiTransfer(data); }
|
void spiSend(uint8_t data) { spiTransfer(data); }
|
||||||
|
|
||||||
void spiSend(const uint8_t* buf, size_t nbyte) {
|
void spiSend(const uint8_t *buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
spiTransfer(buf[i]);
|
spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
||||||
spiTransfer(token);
|
spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
spiTransfer(buf[i]);
|
spiTransfer(buf[i]);
|
||||||
|
2
Marlin/src/HAL/DUE/InterruptVectors.cpp
Executable file → Normal file
2
Marlin/src/HAL/DUE/InterruptVectors.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
2
Marlin/src/HAL/DUE/InterruptVectors.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/InterruptVectors.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
26
Marlin/src/HAL/DUE/MarlinSPI.h
Normal file
26
Marlin/src/HAL/DUE/MarlinSPI.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
using MarlinSPI = SPIClass;
|
175
Marlin/src/HAL/DUE/MarlinSerial.cpp
Executable file → Normal file
175
Marlin/src/HAL/DUE/MarlinSerial.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -382,7 +382,7 @@ void MarlinSerial<Cfg>::flush() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
void MarlinSerial<Cfg>::write(const uint8_t c) {
|
size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||||
_written = true;
|
_written = true;
|
||||||
|
|
||||||
if (Cfg::TX_SIZE == 0) {
|
if (Cfg::TX_SIZE == 0) {
|
||||||
@@ -400,7 +400,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// XOFF char at the RX isr, but it is properly handled there
|
// XOFF char at the RX isr, but it is properly handled there
|
||||||
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
||||||
HWUART->UART_THR = c;
|
HWUART->UART_THR = c;
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
||||||
@@ -428,6 +428,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
||||||
HWUART->UART_IER = UART_IER_TXRDY;
|
HWUART->UART_IER = UART_IER_TXRDY;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
@@ -473,169 +474,21 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) { print('-'); n = -n; }
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits) rounding *= 0.1;
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not using the USB port as serial port
|
// If not using the USB port as serial port
|
||||||
#if SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>; // Define
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1; // Instantiate
|
MSerialT1 customizedSerial1(MarlinSerialCfg<SERIAL_PORT>::EMERGENCYPARSER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>; // Define
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2; // Instantiate
|
MSerialT2 customizedSerial2(MarlinSerialCfg<SERIAL_PORT_2>::EMERGENCYPARSER);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
||||||
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> >;
|
||||||
|
MSerialT3 customizedSerial3(MarlinSerialCfg<SERIAL_PORT_3>::EMERGENCYPARSER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
54
Marlin/src/HAL/DUE/MarlinSerial.h
Executable file → Normal file
54
Marlin/src/HAL/DUE/MarlinSerial.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -30,11 +30,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||||
@@ -119,42 +115,15 @@ public:
|
|||||||
static int read();
|
static int read();
|
||||||
static void flush();
|
static void flush();
|
||||||
static ring_buffer_pos_t available();
|
static ring_buffer_pos_t available();
|
||||||
static void write(const uint8_t c);
|
static size_t write(const uint8_t c);
|
||||||
static void flushTX();
|
static void flushTX();
|
||||||
|
|
||||||
|
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
|
|
||||||
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; }
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = 0);
|
|
||||||
static void print(unsigned char, int = 0);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = 0);
|
|
||||||
static void println(unsigned char, int = 0);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Serial port configuration
|
// Serial port configuration
|
||||||
@@ -171,10 +140,17 @@ struct MarlinSerialCfg {
|
|||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
#endif
|
#endif
|
||||||
|
188
Marlin/src/HAL/DUE/MarlinSerialUSB.cpp
Executable file → Normal file
188
Marlin/src/HAL/DUE/MarlinSerialUSB.cpp
Executable file → Normal file
@@ -16,16 +16,16 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
||||||
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
||||||
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
@@ -33,10 +33,6 @@
|
|||||||
|
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Imports from Atmel USB Stack/CDC implementation
|
// Imports from Atmel USB Stack/CDC implementation
|
||||||
extern "C" {
|
extern "C" {
|
||||||
bool usb_task_cdc_isenabled();
|
bool usb_task_cdc_isenabled();
|
||||||
@@ -50,10 +46,6 @@ extern "C" {
|
|||||||
// Pending character
|
// Pending character
|
||||||
static int pending_char = -1;
|
static int pending_char = -1;
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
static EmergencyParser::State emergency_state; // = EP_RESET
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Public Methods
|
// Public Methods
|
||||||
void MarlinSerialUSB::begin(const long) {}
|
void MarlinSerialUSB::begin(const long) {}
|
||||||
|
|
||||||
@@ -73,9 +65,7 @@ int MarlinSerialUSB::peek() {
|
|||||||
|
|
||||||
pending_char = udi_cdc_getc();
|
pending_char = udi_cdc_getc();
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)pending_char));
|
||||||
emergency_parser.update(emergency_state, (char)pending_char);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return pending_char;
|
return pending_char;
|
||||||
}
|
}
|
||||||
@@ -97,31 +87,27 @@ int MarlinSerialUSB::read() {
|
|||||||
|
|
||||||
int c = udi_cdc_getc();
|
int c = udi_cdc_getc();
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)c));
|
||||||
emergency_parser.update(emergency_state, (char)c);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MarlinSerialUSB::available() {
|
int MarlinSerialUSB::available() {
|
||||||
/* If Pending chars */
|
if (pending_char > 0) return pending_char;
|
||||||
return pending_char >= 0 ||
|
return pending_char == 0 ||
|
||||||
/* or USB CDC enumerated and configured on the PC side and some
|
// or USB CDC enumerated and configured on the PC side and some bytes where sent to us */
|
||||||
bytes where sent to us */
|
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
||||||
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinSerialUSB::flush() { }
|
void MarlinSerialUSB::flush() { }
|
||||||
void MarlinSerialUSB::flushTX() { }
|
|
||||||
|
|
||||||
void MarlinSerialUSB::write(const uint8_t c) {
|
size_t MarlinSerialUSB::write(const uint8_t c) {
|
||||||
|
|
||||||
/* Do not even bother sending anything if USB CDC is not enumerated
|
/* Do not even bother sending anything if USB CDC is not enumerated
|
||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages */
|
listening to our messages */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
/* Wait until the PC has read the pending to be sent data */
|
/* Wait until the PC has read the pending to be sent data */
|
||||||
while (usb_task_cdc_isenabled() &&
|
while (usb_task_cdc_isenabled() &&
|
||||||
@@ -133,161 +119,23 @@ void MarlinSerialUSB::write(const uint8_t c) {
|
|||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages at this point */
|
listening to our messages at this point */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
// Fifo full
|
// Fifo full
|
||||||
// udi_cdc_signal_overrun();
|
// udi_cdc_signal_overrun();
|
||||||
udi_cdc_putc(c);
|
udi_cdc_putc(c);
|
||||||
}
|
return 1;
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(long n, int base) {
|
|
||||||
if (base == 0)
|
|
||||||
write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) {
|
|
||||||
print('-');
|
|
||||||
n = -n;
|
|
||||||
}
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
|
|
||||||
void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits)
|
|
||||||
rounding *= 0.1;
|
|
||||||
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
// Preinstantiate
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
MarlinSerialUSB customizedSerial1;
|
MSerialT1 customizedSerial1(TERN0(EMERGENCY_PARSER, true));
|
||||||
#endif
|
#endif
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
MarlinSerialUSB customizedSerial2;
|
MSerialT2 customizedSerial2(TERN0(EMERGENCY_PARSER, true));
|
||||||
|
#endif
|
||||||
|
#if SERIAL_PORT_3 == -1
|
||||||
|
MSerialT3 customizedSerial3(TERN0(EMERGENCY_PARSER, true));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#endif // HAS_USB_SERIAL
|
||||||
|
74
Marlin/src/HAL/DUE/MarlinSerialUSB.h
Executable file → Normal file
74
Marlin/src/HAL/DUE/MarlinSerialUSB.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -27,73 +27,39 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
#if HAS_USB_SERIAL
|
|
||||||
|
|
||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#define DEC 10
|
struct MarlinSerialUSB {
|
||||||
#define HEX 16
|
void begin(const long);
|
||||||
#define OCT 8
|
void end();
|
||||||
#define BIN 2
|
int peek();
|
||||||
|
int read();
|
||||||
class MarlinSerialUSB {
|
void flush();
|
||||||
|
int available();
|
||||||
public:
|
size_t write(const uint8_t c);
|
||||||
MarlinSerialUSB() {};
|
|
||||||
static void begin(const long);
|
|
||||||
static void end();
|
|
||||||
static int peek();
|
|
||||||
static int read();
|
|
||||||
static void flush();
|
|
||||||
static void flushTX();
|
|
||||||
static bool available();
|
|
||||||
static void write(const uint8_t c);
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE static uint32_t dropped() { return 0; }
|
FORCE_INLINE uint32_t dropped() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
||||||
FORCE_INLINE static int rxMaxEnqueued() { return 0; }
|
FORCE_INLINE int rxMaxEnqueued() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = 0);
|
|
||||||
static void print(unsigned char, int = 0);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = 0);
|
|
||||||
static void println(unsigned char, int = 0);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
extern MarlinSerialUSB customizedSerial1;
|
typedef Serial1Class<MarlinSerialUSB> MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
extern MarlinSerialUSB customizedSerial2;
|
typedef Serial1Class<MarlinSerialUSB> MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#if SERIAL_PORT_3 == -1
|
||||||
|
typedef Serial1Class<MarlinSerialUSB> MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
|
#endif
|
||||||
|
3
Marlin/src/HAL/DUE/Servo.cpp
Executable file → Normal file
3
Marlin/src/HAL/DUE/Servo.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
|
|
||||||
#if HAS_SERVOS
|
#if HAS_SERVOS
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
|
||||||
#include "../shared/servo.h"
|
#include "../shared/servo.h"
|
||||||
#include "../shared/servo_private.h"
|
#include "../shared/servo_private.h"
|
||||||
|
|
||||||
|
0
Marlin/src/HAL/DUE/ServoTimers.h
Executable file → Normal file
0
Marlin/src/HAL/DUE/ServoTimers.h
Executable file → Normal file
5
Marlin/src/HAL/DUE/Tone.cpp
Executable file → Normal file
5
Marlin/src/HAL/DUE/Tone.cpp
Executable file → Normal file
@@ -18,20 +18,19 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: Tone function for Arduino Due and compatible (SAM3X8E)
|
* Description: Tone function for Arduino Due and compatible (SAM3X8E)
|
||||||
* Derived from http://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
|
* Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
#include "timers.h"
|
|
||||||
|
|
||||||
static pin_t tone_pin;
|
static pin_t tone_pin;
|
||||||
volatile static int32_t toggles;
|
volatile static int32_t toggles;
|
||||||
|
27
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
Executable file → Normal file
27
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
Executable file → Normal file
@@ -16,11 +16,10 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Based on u8g_com_msp430_hw_spi.c
|
* Based on u8g_com_msp430_hw_spi.c
|
||||||
*
|
*
|
||||||
@@ -52,25 +51,23 @@
|
|||||||
* 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-HAL.h>
|
||||||
|
|
||||||
#include "../../../MarlinCore.h"
|
#include "../../../MarlinCore.h"
|
||||||
|
|
||||||
void spiBegin();
|
#ifndef LCD_SPI_SPEED
|
||||||
void spiInit(uint8_t spiRate);
|
#define LCD_SPI_SPEED SPI_QUARTER_SPEED
|
||||||
void spiSend(uint8_t b);
|
#endif
|
||||||
void spiSend(const uint8_t* buf, size_t n);
|
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/HAL_SPI.h"
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
||||||
@@ -101,11 +98,7 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
|
|
||||||
spiBegin();
|
spiBegin();
|
||||||
|
|
||||||
#ifndef SPI_SPEED
|
spiInit(LCD_SPI_SPEED);
|
||||||
#define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card
|
|
||||||
#endif
|
|
||||||
spiInit(2);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
@@ -145,6 +138,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__
|
||||||
|
7
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
Executable file → Normal file
7
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -59,9 +59,10 @@
|
|||||||
|
|
||||||
#if ENABLED(U8GLIB_ST7920)
|
#if ENABLED(U8GLIB_ST7920)
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
@@ -145,7 +146,7 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLED(LIGHTWEIGHT_UI)
|
#if ENABLED(LIGHTWEIGHT_UI)
|
||||||
#include "../../../lcd/ultralcd.h"
|
#include "../../../lcd/marlinui.h"
|
||||||
#include "../../shared/HAL_ST7920.h"
|
#include "../../shared/HAL_ST7920.h"
|
||||||
|
|
||||||
#define ST7920_CS_PIN LCD_PINS_RS
|
#define ST7920_CS_PIN LCD_PINS_RS
|
||||||
|
11
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
Executable file → Normal file
11
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -57,17 +57,14 @@
|
|||||||
|
|
||||||
#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
|
|
||||||
#define SPI_SPEED 2 // About 2 MHz
|
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/Marduino.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#if ENABLED(FYSETC_MINI_12864)
|
#if ENABLED(FYSETC_MINI_12864)
|
||||||
#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
|
#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
|
||||||
@@ -144,5 +141,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920
|
#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
9
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
Executable file → Normal file
9
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -57,11 +57,12 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_GRAPHICAL_LCD
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
@@ -108,5 +109,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
|
||||||
|
4
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h
Executable file → Normal file
4
Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h
Executable file → Normal file
@@ -16,14 +16,14 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/Marduino.h"
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
|
void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
|
||||||
void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
|
void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
|
||||||
|
@@ -1,82 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
|
||||||
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if ENABLED(EEPROM_SETTINGS)
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "../shared/eeprom_api.h"
|
|
||||||
|
|
||||||
#if !defined(E2END) && ENABLED(FLASH_EEPROM_EMULATION)
|
|
||||||
#define E2END 0xFFF // Default to Flash emulated EEPROM size (EepromEmulation_Due.cpp)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void eeprom_flush();
|
|
||||||
|
|
||||||
bool PersistentStore::access_start() { return true; }
|
|
||||||
|
|
||||||
bool PersistentStore::access_finish() {
|
|
||||||
#if ENABLED(FLASH_EEPROM_EMULATION)
|
|
||||||
eeprom_flush();
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
|
||||||
while (size--) {
|
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
|
||||||
uint8_t v = *value;
|
|
||||||
// EEPROM has only ~100,000 write cycles,
|
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
|
||||||
delay(2);
|
|
||||||
if (eeprom_read_byte(p) != v) {
|
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
crc16(crc, &v, 1);
|
|
||||||
pos++;
|
|
||||||
value++;
|
|
||||||
};
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
|
||||||
do {
|
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
|
||||||
if (writing) *value = c;
|
|
||||||
crc16(crc, &c, 1);
|
|
||||||
pos++;
|
|
||||||
value++;
|
|
||||||
} while (--size);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t PersistentStore::capacity() { return E2END + 1; }
|
|
||||||
|
|
||||||
#endif // EEPROM_SETTINGS
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
|
1010
Marlin/src/HAL/DUE/eeprom_flash.cpp
Normal file
1010
Marlin/src/HAL/DUE/eeprom_flash.cpp
Normal file
File diff suppressed because it is too large
Load Diff
76
Marlin/src/HAL/DUE/eeprom_wired.cpp
Normal file
76
Marlin/src/HAL/DUE/eeprom_wired.cpp
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
||||||
|
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
||||||
|
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
|
#if USE_WIRED_EEPROM
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PersistentStore for Arduino-style EEPROM interface
|
||||||
|
* with simple implementations supplied by Marlin.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../shared/eeprom_if.h"
|
||||||
|
#include "../shared/eeprom_api.h"
|
||||||
|
|
||||||
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
|
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
||||||
|
#endif
|
||||||
|
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
||||||
|
bool PersistentStore::access_start() { eeprom_init(); return true; }
|
||||||
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
|
while (size--) {
|
||||||
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
|
uint8_t v = *value;
|
||||||
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
|
eeprom_write_byte(p, v);
|
||||||
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
|
if (eeprom_read_byte(p) != v) {
|
||||||
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
crc16(crc, &v, 1);
|
||||||
|
pos++;
|
||||||
|
value++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
|
do {
|
||||||
|
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
|
if (writing) *value = c;
|
||||||
|
crc16(crc, &c, 1);
|
||||||
|
pos++;
|
||||||
|
value++;
|
||||||
|
} while (--size);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // USE_WIRED_EEPROM
|
||||||
|
#endif // ARDUINO_ARCH_SAM
|
64
Marlin/src/HAL/DUE/endstop_interrupts.h
Executable file → Normal file
64
Marlin/src/HAL/DUE/endstop_interrupts.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -47,43 +47,27 @@ void endstop_ISR() { endstops.update(); }
|
|||||||
|
|
||||||
void setup_endstop_interrupts() {
|
void setup_endstop_interrupts() {
|
||||||
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
||||||
#if HAS_X_MAX
|
TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
|
||||||
_ATTACH(X_MAX_PIN);
|
TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
|
||||||
#endif
|
TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
|
||||||
#if HAS_X_MIN
|
TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
|
||||||
_ATTACH(X_MIN_PIN);
|
TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
|
||||||
#endif
|
TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
|
||||||
#if HAS_Y_MAX
|
TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
|
||||||
_ATTACH(Y_MAX_PIN);
|
TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
|
||||||
#endif
|
TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
|
||||||
#if HAS_Y_MIN
|
TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
|
||||||
_ATTACH(Y_MIN_PIN);
|
TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
|
||||||
#endif
|
TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
|
||||||
#if HAS_Z_MAX
|
TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
|
||||||
_ATTACH(Z_MAX_PIN);
|
TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
|
||||||
#endif
|
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||||
#if HAS_Z_MIN
|
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||||
_ATTACH(Z_MIN_PIN);
|
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
||||||
#endif
|
TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
|
||||||
#if HAS_Z2_MAX
|
TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
|
||||||
_ATTACH(Z2_MAX_PIN);
|
TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
|
||||||
#endif
|
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
|
||||||
#if HAS_Z2_MIN
|
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
|
||||||
_ATTACH(Z2_MIN_PIN);
|
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
|
||||||
#endif
|
|
||||||
#if HAS_Z3_MAX
|
|
||||||
_ATTACH(Z3_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z3_MIN
|
|
||||||
_ATTACH(Z3_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z4_MAX
|
|
||||||
_ATTACH(Z4_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z4_MIN
|
|
||||||
_ATTACH(Z4_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z_MIN_PROBE_PIN
|
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
15
Marlin/src/HAL/DUE/fastio.h
Executable file → Normal file
15
Marlin/src/HAL/DUE/fastio.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
* For ARDUINO_ARCH_SAM
|
* For ARDUINO_ARCH_SAM
|
||||||
* Note the code here was specifically crafted by disassembling what GCC produces
|
* Note the code here was specifically crafted by disassembling what GCC produces
|
||||||
* out of it, so GCC is able to optimize it out as much as possible to the least
|
* out of it, so GCC is able to optimize it out as much as possible to the least
|
||||||
* amount of instructions. Be very carefull if you modify them, as "clean code"
|
* amount of instructions. Be very careful if you modify them, as "clean code"
|
||||||
* leads to less efficient compiled code!!
|
* leads to less efficient compiled code!!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
||||||
|
|
||||||
#ifndef MASK
|
#ifndef MASK
|
||||||
#define MASK(PIN) (1 << PIN)
|
#define MASK(PIN) _BV(PIN)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
*
|
*
|
||||||
* Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW);
|
* Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW);
|
||||||
*
|
*
|
||||||
* Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
|
* Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Read a pin
|
// Read a pin
|
||||||
@@ -163,6 +163,9 @@
|
|||||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
#define SET_INPUT(IO) _SET_INPUT(IO)
|
||||||
// Set pin as input with pullup (wrapper)
|
// Set pin as input with pullup (wrapper)
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
|
// Set pin as input with pulldown (substitution)
|
||||||
|
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||||
|
|
||||||
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
||||||
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
||||||
// Set pin as PWM
|
// Set pin as PWM
|
||||||
@@ -174,7 +177,7 @@
|
|||||||
#define IS_OUTPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) != 0)
|
#define IS_OUTPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) != 0)
|
||||||
|
|
||||||
// Shorthand
|
// Shorthand
|
||||||
#define OUT_WRITE(IO,V) { SET_OUTPUT(IO); WRITE(IO,V); }
|
#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0)
|
||||||
|
|
||||||
// digitalRead/Write wrappers
|
// digitalRead/Write wrappers
|
||||||
#define extDigitalRead(IO) digitalRead(IO)
|
#define extDigitalRead(IO) digitalRead(IO)
|
||||||
@@ -477,7 +480,7 @@
|
|||||||
#define DIO91_PIN 15
|
#define DIO91_PIN 15
|
||||||
#define DIO91_WPORT PIOB
|
#define DIO91_WPORT PIOB
|
||||||
|
|
||||||
#if ARDUINO_SAM_ARCHIM
|
#ifdef ARDUINO_SAM_ARCHIM
|
||||||
|
|
||||||
#define DIO92_PIN 11
|
#define DIO92_PIN 11
|
||||||
#define DIO92_WPORT PIOC
|
#define DIO92_WPORT PIOC
|
||||||
|
4
Marlin/src/HAL/DUE/fastio/G2_PWM.cpp
Executable file → Normal file
4
Marlin/src/HAL/DUE/fastio/G2_PWM.cpp
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
|
2
Marlin/src/HAL/DUE/fastio/G2_PWM.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/fastio/G2_PWM.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
2
Marlin/src/HAL/DUE/fastio/G2_pins.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/fastio/G2_pins.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
6
Marlin/src/HAL/DUE/inc/Conditionals_LCD.h
Executable file → Normal file
6
Marlin/src/HAL/DUE/inc/Conditionals_LCD.h
Executable file → Normal file
@@ -16,7 +16,11 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#if HAS_SPI_TFT || HAS_FSMC_TFT
|
||||||
|
#error "Sorry! TFT displays are not available for HAL/DUE."
|
||||||
|
#endif
|
||||||
|
2
Marlin/src/HAL/DUE/inc/Conditionals_adv.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/inc/Conditionals_adv.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
6
Marlin/src/HAL/DUE/inc/Conditionals_post.h
Executable file → Normal file
6
Marlin/src/HAL/DUE/inc/Conditionals_post.h
Executable file → Normal file
@@ -16,13 +16,13 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if USE_FALLBACK_EEPROM
|
#if USE_FALLBACK_EEPROM
|
||||||
#undef SRAM_EEPROM_EMULATION
|
|
||||||
#undef SDCARD_EEPROM_EMULATION
|
|
||||||
#define FLASH_EEPROM_EMULATION
|
#define FLASH_EEPROM_EMULATION
|
||||||
|
#elif EITHER(I2C_EEPROM, SPI_EEPROM)
|
||||||
|
#define USE_SHARED_EEPROM 1
|
||||||
#endif
|
#endif
|
||||||
|
10
Marlin/src/HAL/DUE/inc/SanityCheck.h
Executable file → Normal file
10
Marlin/src/HAL/DUE/inc/SanityCheck.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
||||||
* as the TMC2130 soft SPI the most common setup.
|
* as the TMC2130 soft SPI the most common setup.
|
||||||
*/
|
*/
|
||||||
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN))
|
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
||||||
#if ENABLED(TMC_USE_SW_SPI)
|
#if ENABLED(TMC_USE_SW_SPI)
|
||||||
@@ -52,10 +52,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(FAST_PWM_FAN)
|
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
|
||||||
#error "FAST_PWM_FAN is not yet implemented for this platform."
|
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on this platform."
|
#error "TMC220x Software Serial is not supported on the DUE platform."
|
||||||
#endif
|
#endif
|
||||||
|
9
Marlin/src/HAL/DUE/pinsDebug.h
Executable file → Normal file
9
Marlin/src/HAL/DUE/pinsDebug.h
Executable file → Normal file
@@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@@ -13,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -64,6 +67,7 @@
|
|||||||
#define PRINT_PORT(p)
|
#define PRINT_PORT(p)
|
||||||
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
||||||
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
|
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
|
||||||
#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
|
#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
|
||||||
@@ -86,7 +90,7 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
|
|||||||
void pwm_details(int32_t pin) {
|
void pwm_details(int32_t pin) {
|
||||||
if (pwm_status(pin)) {
|
if (pwm_status(pin)) {
|
||||||
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
||||||
SERIAL_ECHOPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,5 +183,4 @@ void pwm_details(int32_t pin) {
|
|||||||
* ----------------+--------
|
* ----------------+--------
|
||||||
* ID | PB11
|
* ID | PB11
|
||||||
* VBOF | PB10
|
* VBOF | PB10
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
22
Marlin/src/HAL/DUE/spi_pins.h
Executable file → Normal file
22
Marlin/src/HAL/DUE/spi_pins.h
Executable file → Normal file
@@ -16,7 +16,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -43,22 +43,22 @@
|
|||||||
#define SPI_PIN 87
|
#define SPI_PIN 87
|
||||||
#define SPI_CHAN 1
|
#define SPI_CHAN 1
|
||||||
#endif
|
#endif
|
||||||
#define SCK_PIN 76
|
#define SD_SCK_PIN 76
|
||||||
#define MISO_PIN 74
|
#define SD_MISO_PIN 74
|
||||||
#define MOSI_PIN 75
|
#define SD_MOSI_PIN 75
|
||||||
#else
|
#else
|
||||||
// defaults
|
// defaults
|
||||||
#define DUE_SOFTWARE_SPI
|
#define DUE_SOFTWARE_SPI
|
||||||
#ifndef SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SCK_PIN 52
|
#define SD_SCK_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN 50
|
#define SD_MISO_PIN 50
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN 51
|
#define SD_MOSI_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* A.28, A.29, B.21, C.26, C.29 */
|
/* A.28, A.29, B.21, C.26, C.29 */
|
||||||
#define SS_PIN SDSS
|
#define SD_SS_PIN SDSS
|
||||||
|
10
Marlin/src/HAL/DUE/timers.cpp
Executable file → Normal file
10
Marlin/src/HAL/DUE/timers.cpp
Executable file → Normal file
@@ -16,14 +16,12 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@@ -34,8 +32,6 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
|
||||||
#include "timers.h"
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Local defines
|
// Local defines
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -125,7 +121,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
|||||||
|
|
||||||
// missing from CMSIS: Check if interrupt is enabled or not
|
// missing from CMSIS: Check if interrupt is enabled or not
|
||||||
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
||||||
return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0;
|
return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
||||||
|
28
Marlin/src/HAL/DUE/timers.h
Executable file → Normal file
28
Marlin/src/HAL/DUE/timers.h
Executable file → Normal file
@@ -15,15 +15,13 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#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>
|
||||||
@@ -40,11 +38,17 @@ typedef uint32_t hal_timer_t;
|
|||||||
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
||||||
|
|
||||||
#ifndef STEP_TIMER_NUM
|
#ifndef STEP_TIMER_NUM
|
||||||
#define STEP_TIMER_NUM 2 // index of timer to use for stepper
|
#define STEP_TIMER_NUM 2 // Timer Index for Stepper
|
||||||
|
#endif
|
||||||
|
#ifndef PULSE_TIMER_NUM
|
||||||
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
|
#endif
|
||||||
|
#ifndef TEMP_TIMER_NUM
|
||||||
|
#define TEMP_TIMER_NUM 4 // Timer Index for Temperature
|
||||||
|
#endif
|
||||||
|
#ifndef TONE_TIMER_NUM
|
||||||
|
#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
|
||||||
#endif
|
#endif
|
||||||
#define TEMP_TIMER_NUM 4 // index of timer to use for temperature
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
|
||||||
#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
|
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
@@ -66,8 +70,12 @@ typedef uint32_t hal_timer_t;
|
|||||||
#ifndef HAL_STEP_TIMER_ISR
|
#ifndef HAL_STEP_TIMER_ISR
|
||||||
#define HAL_STEP_TIMER_ISR() void TC2_Handler()
|
#define HAL_STEP_TIMER_ISR() void TC2_Handler()
|
||||||
#endif
|
#endif
|
||||||
#define HAL_TEMP_TIMER_ISR() void TC4_Handler()
|
#ifndef HAL_TEMP_TIMER_ISR
|
||||||
#define HAL_TONE_TIMER_ISR() void TC6_Handler()
|
#define HAL_TEMP_TIMER_ISR() void TC4_Handler()
|
||||||
|
#endif
|
||||||
|
#ifndef HAL_TONE_TIMER_ISR
|
||||||
|
#define HAL_TONE_TIMER_ISR() void TC6_Handler()
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
|
18
Marlin/src/HAL/DUE/upload_extra_script.py
Normal file
18
Marlin/src/HAL/DUE/upload_extra_script.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#
|
||||||
|
# Set upload_command
|
||||||
|
#
|
||||||
|
# Windows: bossac.exe
|
||||||
|
# Other: leave unchanged
|
||||||
|
#
|
||||||
|
|
||||||
|
import platform
|
||||||
|
current_OS = platform.system()
|
||||||
|
|
||||||
|
if current_OS == 'Windows':
|
||||||
|
|
||||||
|
Import("env")
|
||||||
|
|
||||||
|
# Use bossac.exe on Windows
|
||||||
|
env.Replace(
|
||||||
|
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
|
||||||
|
)
|
6
Marlin/src/HAL/DUE/usb/arduino_due_x.h
Executable file → Normal file
6
Marlin/src/HAL/DUE/usb/arduino_due_x.h
Executable file → Normal file
@@ -43,7 +43,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \page arduino_due_x_board_info "Arduino Due/X - Board informations"
|
* \page arduino_due_x_board_info "Arduino Due/X - Board information"
|
||||||
* This page lists several definition related to the board description.
|
* This page lists several definition related to the board description.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -93,5 +93,5 @@
|
|||||||
#define USB_VBOF_GPIO (PIO_PB10_IDX)
|
#define USB_VBOF_GPIO (PIO_PB10_IDX)
|
||||||
#define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT)
|
#define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT)
|
||||||
/*! Active level of the USB_VBOF output pin. */
|
/*! Active level of the USB_VBOF output pin. */
|
||||||
#define USB_VBOF_ACTIVE_LEVEL LOW
|
#define USB_VBOF_ACTIVE_STATE LOW
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
167
Marlin/src/HAL/DUE/usb/compiler.h
Executable file → Normal file
167
Marlin/src/HAL/DUE/usb/compiler.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef UTILS_COMPILER_H
|
#ifndef UTILS_COMPILER_H
|
||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
2
Marlin/src/HAL/DUE/usb/conf_access.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/conf_access.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONF_ACCESS_H_
|
#ifndef _CONF_ACCESS_H_
|
||||||
|
2
Marlin/src/HAL/DUE/usb/conf_clock.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/conf_clock.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONF_CLOCK_H_INCLUDED
|
#ifndef CONF_CLOCK_H_INCLUDED
|
||||||
|
6
Marlin/src/HAL/DUE/usb/conf_usb.h
Executable file → Normal file
6
Marlin/src/HAL/DUE/usb/conf_usb.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONF_USB_H_
|
#ifndef _CONF_USB_H_
|
||||||
@@ -78,10 +78,6 @@
|
|||||||
//! To define a Full speed device
|
//! To define a Full speed device
|
||||||
//#define USB_DEVICE_FULL_SPEED
|
//#define USB_DEVICE_FULL_SPEED
|
||||||
|
|
||||||
#if MB(ARCHIM1)
|
|
||||||
#define USB_DEVICE_FULL_SPEED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! To authorize the High speed
|
//! To authorize the High speed
|
||||||
#ifndef USB_DEVICE_FULL_SPEED
|
#ifndef USB_DEVICE_FULL_SPEED
|
||||||
#if (UC3A3||UC3A4)
|
#if (UC3A3||UC3A4)
|
||||||
|
2
Marlin/src/HAL/DUE/usb/ctrl_access.c
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/ctrl_access.c
Executable file → Normal file
@@ -53,7 +53,7 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
2
Marlin/src/HAL/DUE/usb/ctrl_access.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/ctrl_access.h
Executable file → Normal file
@@ -53,7 +53,7 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
2
Marlin/src/HAL/DUE/usb/genclk.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/genclk.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CHIP_GENCLK_H_INCLUDED
|
#ifndef CHIP_GENCLK_H_INCLUDED
|
||||||
|
2
Marlin/src/HAL/DUE/usb/mrepeat.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/mrepeat.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _MREPEAT_H_
|
#ifndef _MREPEAT_H_
|
||||||
|
2
Marlin/src/HAL/DUE/usb/osc.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/osc.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CHIP_OSC_H_INCLUDED
|
#ifndef CHIP_OSC_H_INCLUDED
|
||||||
|
2
Marlin/src/HAL/DUE/usb/pll.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/pll.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CHIP_PLL_H_INCLUDED
|
#ifndef CHIP_PLL_H_INCLUDED
|
||||||
|
2
Marlin/src/HAL/DUE/usb/preprocessor.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/preprocessor.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PREPROCESSOR_H_
|
#ifndef _PREPROCESSOR_H_
|
||||||
|
2
Marlin/src/HAL/DUE/usb/sbc_protocol.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/sbc_protocol.h
Executable file → Normal file
@@ -52,7 +52,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
#ifndef _SBC_PROTOCOL_H_
|
#ifndef _SBC_PROTOCOL_H_
|
||||||
#define _SBC_PROTOCOL_H_
|
#define _SBC_PROTOCOL_H_
|
||||||
|
26
Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp
Executable file → Normal file
26
Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp
Executable file → Normal file
@@ -32,7 +32,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready() {
|
|||||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||||
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
*nb_sector = card.getSd2Card().cardSize() - 1;
|
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,30 +68,30 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(0);
|
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Start reading
|
// Start reading
|
||||||
if (!card.getSd2Card().readStart(addr))
|
if (!card.diskIODriver()->readStart(addr))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// Read a sector
|
// Read a sector
|
||||||
card.getSd2Card().readData(sector_buf);
|
card.diskIODriver()->readData(sector_buf);
|
||||||
|
|
||||||
// RAM -> USB
|
// RAM -> USB
|
||||||
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||||
card.getSd2Card().readStop();
|
card.diskIODriver()->readStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop reading
|
// Stop reading
|
||||||
card.getSd2Card().readStop();
|
card.diskIODriver()->readStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
@@ -108,29 +108,29 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(0);
|
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!card.getSd2Card().writeStart(addr, nb_sector))
|
if (!card.diskIODriver()->writeStart(addr, nb_sector))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// USB -> RAM
|
// USB -> RAM
|
||||||
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||||
card.getSd2Card().writeStop();
|
card.diskIODriver()->writeStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a sector
|
// Write a sector
|
||||||
card.getSd2Card().writeData(sector_buf);
|
card.diskIODriver()->writeData(sector_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop writing
|
// Stop writing
|
||||||
card.getSd2Card().writeStop();
|
card.diskIODriver()->writeStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
|
6
Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h
Executable file → Normal file
6
Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h
Executable file → Normal file
@@ -42,7 +42,7 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
#define SD_MMC_REMOVING 2
|
#define SD_MMC_REMOVING 2
|
||||||
|
|
||||||
|
|
||||||
//---- CONTROL FONCTIONS ----
|
//---- CONTROL FUNCTIONS ----
|
||||||
//!
|
//!
|
||||||
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
|
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
|
||||||
//!/
|
//!/
|
||||||
@@ -134,7 +134,7 @@ extern bool sd_mmc_spi_wr_protect(void);
|
|||||||
extern bool sd_mmc_spi_removal(void);
|
extern bool sd_mmc_spi_removal(void);
|
||||||
|
|
||||||
|
|
||||||
//---- ACCESS DATA FONCTIONS ----
|
//---- ACCESS DATA FUNCTIONS ----
|
||||||
|
|
||||||
#if ACCESS_USB == true
|
#if ACCESS_USB == true
|
||||||
// Standard functions for open in read/write mode the device
|
// Standard functions for open in read/write mode the device
|
||||||
|
2
Marlin/src/HAL/DUE/usb/spc_protocol.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/spc_protocol.h
Executable file → Normal file
@@ -45,7 +45,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
#ifndef _SPC_PROTOCOL_H_
|
#ifndef _SPC_PROTOCOL_H_
|
||||||
#define _SPC_PROTOCOL_H_
|
#define _SPC_PROTOCOL_H_
|
||||||
|
2
Marlin/src/HAL/DUE/usb/stringz.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/stringz.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _STRINGZ_H_
|
#ifndef _STRINGZ_H_
|
||||||
|
2
Marlin/src/HAL/DUE/usb/sysclk.c
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/sysclk.c
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
2
Marlin/src/HAL/DUE/usb/sysclk.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/sysclk.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CHIP_SYSCLK_H_INCLUDED
|
#ifndef CHIP_SYSCLK_H_INCLUDED
|
||||||
|
2
Marlin/src/HAL/DUE/usb/tpaste.h
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/tpaste.h
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TPASTE_H_
|
#ifndef _TPASTE_H_
|
||||||
|
2
Marlin/src/HAL/DUE/usb/udc.c
Executable file → Normal file
2
Marlin/src/HAL/DUE/usb/udc.c
Executable file → Normal file
@@ -41,7 +41,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user