Compare commits

..

2 Commits

Author SHA1 Message Date
Scott Lahteine
4caa32b6dd 🔖 Version 2.1.1.1 2023-12-11 15:42:26 -06:00
Scott Lahteine
dfa748cb96 🔨 PlatformIO 6 compatibility 2023-07-20 13:44:06 -05:00
1693 changed files with 63525 additions and 102080 deletions

View File

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

View File

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

View File

@@ -1,33 +1,19 @@
# editorconfig.org # editorconfig.org
root = true root = true
[*]
trim_trailing_whitespace = true
insert_final_newline = true
[{*.patch,syntax_test_*}] [{*.patch,syntax_test_*}]
trim_trailing_whitespace = false trim_trailing_whitespace = false
[{*.c,*.cpp,*.h,*.ino,*.py,Makefile}]
end_of_line = lf
[{*.c,*.cpp,*.h,*.ino}] [{*.c,*.cpp,*.h,*.ino}]
charset = utf-8 charset = utf-8
[{*.c,*.cpp,*.h,*.ino,Makefile}]
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
[{Makefile}] [{*.py,*.conf,*.sublime-project}]
indent_style = tab
indent_size = 2
[*.md]
# Two spaces at the end of the line means newline in Markdown
trim_trailing_whitespace = false
[{*.py}]
indent_style = space
indent_size = 4
[{*.conf,*.sublime-project}]
indent_style = tab indent_style = tab
indent_size = 4 indent_size = 4

View File

@@ -28,9 +28,15 @@ Project maintainers are responsible for clarifying the standards of acceptable b
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement ## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by following GitHub's [reporting abuse or spam article](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [marlinfirmware@github.com](mailto:marlinfirmware@github.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution ## Attribution

View File

@@ -26,12 +26,11 @@ The following is a set of guidelines for contributing to Marlin, hosted by the [
## Code of Conduct ## Code of Conduct
This project and everyone participating in it is governed by the [Marlin Code of Conduct](code_of_conduct.md). By participating, you are expected to uphold this code. Please report unacceptable behavior by following GitHub's [reporting abuse or spam article](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam). This project and everyone participating in it is governed by the [Marlin Code of Conduct](code_of_conduct.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [marlinfirmware@github.com](mailto:marlinfirmware@github.com).
## I don't want to read this whole thing I just have a question!!! ## I don't want to read this whole thing I just have a question!!!
> [!NOTE] > **Note:** Please don't file an issue to ask a question. You'll get faster results by using the resources below.
> Please don't file an issue to ask a question. You'll get faster results by using the resources below.
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions. We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
@@ -56,8 +55,7 @@ This section guides you through submitting a Bug Report for Marlin. Following th
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster. Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster.
> [!NOTE] > **Note:** Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
> Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
#### How Do I Submit A (Good) Bug Report? #### How Do I Submit A (Good) Bug Report?

51
.gitignore vendored
View File

@@ -21,21 +21,35 @@
# Generated files # Generated files
_Version.h _Version.h
bdf2u8g.exe bdf2u8g
genpages.exe
marlin_config.json marlin_config.json
mczip.h mczip.h
language*.csv
out-csv/
out-language/
*.gen *.gen
*.sublime-workspace *.sublime-workspace
#
# OS # OS
#
applet/ applet/
.DS_Store .DS_Store
# Compiled C++ Object files #
# Misc
#
*~
*.orig
*.rej
*.bak
*.idea
*.i
*.ii
*.swp
tags
#
# C++
#
# Compiled Object files
*.slo *.slo
*.lo *.lo
*.o *.o
@@ -66,7 +80,10 @@ applet/
*.out *.out
*.app *.app
# Compiled C Object files #
# C
#
# Object files
*.o *.o
*.ko *.ko
*.obj *.obj
@@ -126,16 +143,13 @@ vc-fileutils.settings
.vscode/* .vscode/*
!.vscode/extensions.json !.vscode/extensions.json
# Simulation files #Simulation
imgui.ini imgui.ini
eeprom.dat eeprom.dat
spi_flash.bin spi_flash.bin
fs.img
# CMake #cmake
buildroot/share/cmake/*
CMakeLists.txt CMakeLists.txt
!buildroot/share/cmake/CMakeLists.txt
src/CMakeLists.txt src/CMakeLists.txt
CMakeListsPrivate.txt CMakeListsPrivate.txt
build/ build/
@@ -155,16 +169,3 @@ __pycache__
# IOLogger logs # IOLogger logs
*_log.csv *_log.csv
# Misc.
*~
*.orig
*.rej
*.bak
*.idea
*.i
*.ii
*.swp
tags
*.logs
*.bak

View File

@@ -6,7 +6,6 @@
"platformio.platformio-ide" "platformio.platformio-ide"
], ],
"unwantedRecommendations": [ "unwantedRecommendations": [
"ms-vscode-remote.remote-containers",
"ms-vscode.cpptools-extension-pack" "ms-vscode.cpptools-extension-pack"
] ]
} }

View File

@@ -1,18 +1,11 @@
SCRIPTS_DIR := buildroot/share/scripts
CONTAINER_RT_BIN := docker
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
CONTAINER_IMAGE := marlin-dev
help: help:
@echo "Tasks for local development:" @echo "Tasks for local development:"
@echo "make marlin : Build marlin for the configured board" @echo "* tests-single-ci: Run a single test from inside the CI"
@echo "make format-pins : Reformat all pins files" @echo "* tests-single-local: Run a single test locally"
@echo "make tests-single-ci : Run a single test from inside the CI" @echo "* tests-single-local-docker: Run a single test locally, using docker-compose"
@echo "make tests-single-local : Run a single test locally" @echo "* tests-all-local: Run all tests locally"
@echo "make tests-single-local-docker : Run a single test locally, using docker" @echo "* tests-all-local-docker: Run all tests locally, using docker-compose"
@echo "make tests-all-local : Run all tests locally" @echo "* setup-local-docker: Setup local docker-compose"
@echo "make tests-all-local-docker : Run all tests locally, using docker"
@echo "make setup-local-docker : Build the local docker image"
@echo "" @echo ""
@echo "Options for testing:" @echo "Options for testing:"
@echo " TEST_TARGET Set when running tests-single-*, to select the" @echo " TEST_TARGET Set when running tests-single-*, to select the"
@@ -25,41 +18,35 @@ help:
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value" @echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:" @echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!" @echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
.PHONY: help
marlin:
./buildroot/bin/mftest -a
.PHONY: marlin
tests-single-ci: tests-single-ci:
export GIT_RESET_HARD=true export GIT_RESET_HARD=true
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET)
.PHONY: tests-single-ci
tests-single-local: tests-single-local:
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \ export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)" && run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
.PHONY: tests-single-local
tests-single-local-docker: tests-single-local-docker:
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi @if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)" .PHONY: tests-single-local-docker
tests-all-local: tests-all-local:
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \ export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \ && export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
&& for TEST_TARGET in $$($(SCRIPTS_DIR)/get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done && for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
.PHONY: tests-all-local
tests-all-local-docker: tests-all-local-docker:
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) .PHONY: tests-all-local-docker
setup-local-docker: setup-local-docker:
$(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) -f docker/Dockerfile . docker-compose build
.PHONY: setup-local-docker
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
$(PINS): %:
@echo "Formatting $@" && node $(SCRIPTS_DIR)/pinsformat.js $@
format-pins: $(PINS)

View File

@@ -35,7 +35,7 @@
* *
* Advanced settings can be found in Configuration_adv.h * Advanced settings can be found in Configuration_adv.h
*/ */
#define CONFIGURATION_H_VERSION 02010204 #define CONFIGURATION_H_VERSION 02010100
//=========================================================================== //===========================================================================
//============================= Getting Started ============================= //============================= Getting Started =============================
@@ -46,13 +46,12 @@
* *
* Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all * Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all
* *
* Průša Calculator: https://blog.prusa3d.com/calculator_3416/ * Průša Calculator: https://blog.prusaprinters.org/calculator_3416/
* *
* Calibration Guides: https://reprap.org/wiki/Calibration * Calibration Guides: https://reprap.org/wiki/Calibration
* https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
* https://web.archive.org/web/20220907014303/https://sites.google.com/site/repraplogphase/calibration-of-your-reprap * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap
* https://youtu.be/wAL9d7FgInk * https://youtu.be/wAL9d7FgInk
* https://teachingtechyt.github.io/calibration.html
* *
* Calibration Objects: https://www.thingiverse.com/thing:5573 * Calibration Objects: https://www.thingiverse.com/thing:5573
* https://www.thingiverse.com/thing:1278865 * https://www.thingiverse.com/thing:1278865
@@ -142,8 +141,6 @@
// Choose your own or use a service like https://www.uuidgenerator.net/version4 // Choose your own or use a service like https://www.uuidgenerator.net/version4
//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" //#define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
// @section stepper drivers
/** /**
* Stepper Drivers * Stepper Drivers
* *
@@ -243,6 +240,21 @@
//#define SINGLENOZZLE_STANDBY_FAN //#define SINGLENOZZLE_STANDBY_FAN
#endif #endif
/**
* Multi-Material Unit
* Set to one of these predefined models:
*
* PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version)
* PRUSA_MMU2 : Průša MMU2
* PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5)
* EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
* EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
*
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
* See additional options in Configuration_adv.h.
*/
//#define MMU_MODEL PRUSA_MMU2
// A dual extruder that uses a single stepper motor // A dual extruder that uses a single stepper motor
//#define SWITCHING_EXTRUDER //#define SWITCHING_EXTRUDER
#if ENABLED(SWITCHING_EXTRUDER) #if ENABLED(SWITCHING_EXTRUDER)
@@ -258,8 +270,7 @@
#if ENABLED(SWITCHING_NOZZLE) #if ENABLED(SWITCHING_NOZZLE)
#define SWITCHING_NOZZLE_SERVO_NR 0 #define SWITCHING_NOZZLE_SERVO_NR 0
//#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second //#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }. #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 (single servo) or lowered/raised (dual servo)
// For Dual Servo use two pairs: { { lower, raise }, { lower, raise } }
#define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move #define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move
#endif #endif
@@ -377,24 +388,6 @@
//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle //#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle
//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle //#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle
// @section multi-material
/**
* Multi-Material Unit
* Set to one of these predefined models:
*
* PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version)
* PRUSA_MMU2 : Průša MMU2
* PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5)
* EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
* EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
*
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
* See additional options in Configuration_adv.h.
* :["PRUSA_MMU1", "PRUSA_MMU2", "PRUSA_MMU2S", "EXTENDABLE_EMU_MMU2", "EXTENDABLE_EMU_MMU2S"]
*/
//#define MMU_MODEL PRUSA_MMU2
// @section psu control // @section psu control
/** /**
@@ -424,11 +417,11 @@
//#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin
#if ENABLED(AUTO_POWER_CONTROL) #if ENABLED(AUTO_POWER_CONTROL)
#define AUTO_POWER_FANS // Turn on PSU for fans #define AUTO_POWER_FANS // Turn on PSU if fans need power
#define AUTO_POWER_E_FANS // Turn on PSU for E Fans #define AUTO_POWER_E_FANS
#define AUTO_POWER_CONTROLLERFAN // Turn on PSU for Controller Fan #define AUTO_POWER_CONTROLLERFAN
#define AUTO_POWER_CHAMBER_FAN // Turn on PSU for Chamber Fan #define AUTO_POWER_CHAMBER_FAN
#define AUTO_POWER_COOLER_FAN // Turn on PSU for Cooler Fan #define AUTO_POWER_COOLER_FAN
#define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration #define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration
//#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. //#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time.
#endif #endif
@@ -445,13 +438,29 @@
// @section temperature // @section temperature
/** /**
* Temperature Sensors: * --NORMAL IS 4.7kΩ PULLUP!-- 1kΩ pullup can be used on hotend sensor, using correct resistor and table
* *
* NORMAL IS 4.7kΩ PULLUP! Hotend sensors can use 1kΩ pullup with correct resistor and table. * Temperature sensors available:
*
* SPI RTD/Thermocouple Boards - IMPORTANT: Read the NOTE below!
* -------
* -5 : MAX31865 with Pt100/Pt1000, 2, 3, or 4-wire (only for sensors 0-1)
* NOTE: You must uncomment/set the MAX31865_*_OHMS_n defines below.
* -3 : MAX31855 with Thermocouple, -200°C to +700°C (only for sensors 0-1)
* -2 : MAX6675 with Thermocouple, 0°C to +700°C (only for sensors 0-1)
*
* NOTE: Ensure TEMP_n_CS_PIN is set in your pins file for each TEMP_SENSOR_n using an SPI Thermocouple. By default,
* Hardware SPI on the default serial bus is used. If you have also set TEMP_n_SCK_PIN and TEMP_n_MISO_PIN,
* Software SPI will be used on those ports instead. You can force Hardware SPI on the default bus in the
* Configuration_adv.h file. At this time, separate Hardware SPI buses for sensors are not supported.
*
* Analog Themocouple Boards
* -------
* -4 : AD8495 with Thermocouple
* -1 : AD595 with Thermocouple
* *
* ================================================================
* Analog Thermistors - 4.7kΩ pullup - Normal * Analog Thermistors - 4.7kΩ pullup - Normal
* ================================================================ * -------
* 1 : 100kΩ EPCOS - Best choice for EPCOS thermistors * 1 : 100kΩ EPCOS - Best choice for EPCOS thermistors
* 331 : 100kΩ Same as #1, but 3.3V scaled for MEGA * 331 : 100kΩ Same as #1, but 3.3V scaled for MEGA
* 332 : 100kΩ Same as #1, but 3.3V scaled for DUE * 332 : 100kΩ Same as #1, but 3.3V scaled for DUE
@@ -475,44 +484,35 @@
* 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1% * 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1%
* 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed * 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed
* 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1% * 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1%
* 14 : 100kΩ (R25), 4092K (beta25), 4.7kΩ pull-up, bed thermistor as used in Ender-5 S1
* 15 : 100kΩ Calibrated for JGAurora A5 hotend * 15 : 100kΩ Calibrated for JGAurora A5 hotend
* 17 : 100kΩ Dagoma NTC white thermistor
* 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327 * 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327
* 22 : 100kΩ GTM32 Pro vB - hotend - 4.7kΩ pullup to 3.3V and 220Ω to analog input * 22 : 100kΩ GTM32 Pro vB - hotend - 4.7kΩ pullup to 3.3V and 220Ω to analog input
* 23 : 100kΩ GTM32 Pro vB - bed - 4.7kΩ pullup to 3.3v and 220Ω to analog input * 23 : 100kΩ GTM32 Pro vB - bed - 4.7kΩ pullup to 3.3v and 220Ω to analog input
* 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950 * 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950
* 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950 * 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950
* 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950 * 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950
* 66 : 4.7MΩ Dyze Design / Trianglelab T-D500 500°C High Temperature Thermistor * 66 : 4.7MΩ Dyze Design High Temperature Thermistor
* 67 : 500kΩ SliceEngineering 450°C Thermistor * 67 : 500kΩ SliceEngineering 450°C Thermistor
* 68 : PT100 Smplifier board from Dyze Design * 68 : PT100 amplifier board from Dyze Design
* 70 : 100kΩ bq Hephestos 2 * 70 : 100kΩ bq Hephestos 2
* 75 : 100kΩ Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32 * 75 : 100kΩ Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32
* 666 : 200kΩ Einstart S custom thermistor with 10k pullup.
* 2000 : 100kΩ Ultimachine Rambo TDK NTCG104LH104KT1 NTC100K motherboard Thermistor * 2000 : 100kΩ Ultimachine Rambo TDK NTCG104LH104KT1 NTC100K motherboard Thermistor
* *
* ================================================================ * Analog Thermistors - 1kΩ pullup - Atypical, and requires changing out the 4.7kΩ pullup for 1kΩ.
* Analog Thermistors - 1kΩ pullup * ------- (but gives greater accuracy and more stable PID)
* Atypical, and requires changing out the 4.7kΩ pullup for 1kΩ.
* (but gives greater accuracy and more stable PID)
* ================================================================
* 51 : 100kΩ EPCOS (1kΩ pullup) * 51 : 100kΩ EPCOS (1kΩ pullup)
* 52 : 200kΩ ATC Semitec 204GT-2 (1kΩ pullup) * 52 : 200kΩ ATC Semitec 204GT-2 (1kΩ pullup)
* 55 : 100kΩ ATC Semitec 104GT-2 - Used in ParCan & J-Head (1kΩ pullup) * 55 : 100kΩ ATC Semitec 104GT-2 - Used in ParCan & J-Head (1kΩ pullup)
* *
* ================================================================
* Analog Thermistors - 10kΩ pullup - Atypical * Analog Thermistors - 10kΩ pullup - Atypical
* ================================================================ * -------
* 99 : 100kΩ Found on some Wanhao i3 machines with a 10kΩ pull-up resistor * 99 : 100kΩ Found on some Wanhao i3 machines with a 10kΩ pull-up resistor
* *
* ================================================================
* Analog RTDs (Pt100/Pt1000) * Analog RTDs (Pt100/Pt1000)
* ================================================================ * -------
* 110 : Pt100 with 1kΩ pullup (atypical) * 110 : Pt100 with 1kΩ pullup (atypical)
* 147 : Pt100 with 4.7kΩ pullup * 147 : Pt100 with 4.7kΩ pullup
* 1010 : Pt1000 with 1kΩ pullup (atypical) * 1010 : Pt1000 with 1kΩ pullup (atypical)
* 1022 : Pt1000 with 2.2kΩ pullup
* 1047 : Pt1000 with 4.7kΩ pullup (E3D) * 1047 : Pt1000 with 4.7kΩ pullup (E3D)
* 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage. * 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage.
* NOTE: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21. * NOTE: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21.
@@ -520,34 +520,15 @@
* NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C. * NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
* 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
* *
* ================================================================
* SPI RTD/Thermocouple Boards
* ================================================================
* -5 : MAX31865 with Pt100/Pt1000, 2, 3, or 4-wire (only for sensors 0-2 and bed)
* NOTE: You must uncomment/set the MAX31865_*_OHMS_n defines below.
* -3 : MAX31855 with Thermocouple, -200°C to +700°C (only for sensors 0-2 and bed)
* -2 : MAX6675 with Thermocouple, 0°C to +700°C (only for sensors 0-2 and bed)
*
* NOTE: Ensure TEMP_n_CS_PIN is set in your pins file for each TEMP_SENSOR_n using an SPI Thermocouple. By default,
* Hardware SPI on the default serial bus is used. If you have also set TEMP_n_SCK_PIN and TEMP_n_MISO_PIN,
* Software SPI will be used on those ports instead. You can force Hardware SPI on the default bus in the
* Configuration_adv.h file. At this time, separate Hardware SPI buses for sensors are not supported.
*
* ================================================================
* Analog Thermocouple Boards
* ================================================================
* -4 : AD8495 with Thermocouple
* -1 : AD595 with Thermocouple
*
* ================================================================
* Custom/Dummy/Other Thermal Sensors * Custom/Dummy/Other Thermal Sensors
* ================================================================ * ------
* 0 : not used * 0 : not used
* 1000 : Custom - Specify parameters in Configuration_adv.h * 1000 : Custom - Specify parameters in Configuration_adv.h
* *
* !!! Use these for Testing or Development purposes. NEVER for production machine. !!! * !!! Use these for Testing or Development purposes. NEVER for production machine. !!!
* 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below.
* 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below.
*
*/ */
#define TEMP_SENSOR_0 1 #define TEMP_SENSOR_0 1
#define TEMP_SENSOR_1 0 #define TEMP_SENSOR_1 0
@@ -557,7 +538,7 @@
#define TEMP_SENSOR_5 0 #define TEMP_SENSOR_5 0
#define TEMP_SENSOR_6 0 #define TEMP_SENSOR_6 0
#define TEMP_SENSOR_7 0 #define TEMP_SENSOR_7 0
#define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_BED 0
#define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_PROBE 0
#define TEMP_SENSOR_CHAMBER 0 #define TEMP_SENSOR_CHAMBER 0
#define TEMP_SENSOR_COOLER 0 #define TEMP_SENSOR_COOLER 0
@@ -577,10 +558,6 @@
#define MAX31865_SENSOR_OHMS_1 100 #define MAX31865_SENSOR_OHMS_1 100
#define MAX31865_CALIBRATION_OHMS_1 430 #define MAX31865_CALIBRATION_OHMS_1 430
#endif #endif
#if TEMP_SENSOR_IS_MAX_TC(2)
#define MAX31865_SENSOR_OHMS_2 100
#define MAX31865_CALIBRATION_OHMS_2 430
#endif
#if HAS_E_TEMP_SENSOR #if HAS_E_TEMP_SENSOR
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 #define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
@@ -659,17 +636,13 @@
// @section hotend temp // @section hotend temp
/** // Enable PIDTEMP for PID control or MPCTEMP for Predictive Model.
* Temperature Control // temperature control. Disable both for bang-bang heating.
*
* (NONE) : Bang-bang heating
* PIDTEMP : PID temperature control (~4.1K)
* MPCTEMP : Predictive Model temperature control. (~1.8K without auto-tune)
*/
#define PIDTEMP // See the PID Tuning Guide at https://reprap.org/wiki/PID_Tuning #define PIDTEMP // See the PID Tuning Guide at https://reprap.org/wiki/PID_Tuning
//#define MPCTEMP // ** EXPERIMENTAL ** See https://marlinfw.org/docs/features/model_predictive_control.html //#define MPCTEMP // ** EXPERIMENTAL **
#define PID_MAX 255 // Limit hotend current while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current #define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current
#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current
#define PID_K1 0.95 // Smoothing factor within any PID loop #define PID_K1 0.95 // Smoothing factor within any PID loop
#if ENABLED(PIDTEMP) #if ENABLED(PIDTEMP)
@@ -688,23 +661,21 @@
#define DEFAULT_Ki 1.08 #define DEFAULT_Ki 1.08
#define DEFAULT_Kd 114.00 #define DEFAULT_Kd 114.00
#endif #endif
#else
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
#endif #endif
/** /**
* Model Predictive Control for hotend * Model Predictive Control for hotend
* *
* Use a physical model of the hotend to control temperature. When configured correctly this gives * Use a physical model of the hotend to control temperature. When configured correctly
* better responsiveness and stability than PID and removes the need for PID_EXTRUSION_SCALING * this gives better responsiveness and stability than PID and it also removes the need
* and PID_FAN_SCALING. Use M306 T to autotune the model. * for PID_EXTRUSION_SCALING and PID_FAN_SCALING. Use M306 T to autotune the model.
* @section mpctemp * @section mpctemp
*/ */
#if ENABLED(MPCTEMP) #if ENABLED(MPCTEMP)
//#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1.3K bytes of flash) //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of flash)
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash) //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
#define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active. #define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active.
#define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers. #define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
#define MPC_INCLUDE_FAN // Model the fan speed? #define MPC_INCLUDE_FAN // Model the fan speed?
@@ -723,12 +694,8 @@
//#define MPC_FAN_0_ACTIVE_HOTEND //#define MPC_FAN_0_ACTIVE_HOTEND
#endif #endif
// Filament Heat Capacity (joules/kelvin/mm)
// Set at runtime with M306 H<value>
#define FILAMENT_HEAT_CAPACITY_PERMM { 5.6e-3f } // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA). #define FILAMENT_HEAT_CAPACITY_PERMM { 5.6e-3f } // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA).
// 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG). //#define FILAMENT_HEAT_CAPACITY_PERMM { 3.6e-3f } // 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG).
// 0.00515 J/K/mm for 1.75mm ABS (0.0137 J/K/mm for 2.85mm ABS).
// 0.00522 J/K/mm for 1.75mm Nylon (0.0138 J/K/mm for 2.85mm Nylon).
// Advanced options // Advanced options
#define MPC_SMOOTHING_FACTOR 0.5f // (0.0...1.0) Noisy temperature sensors may need a lower value for stabilization. #define MPC_SMOOTHING_FACTOR 0.5f // (0.0...1.0) Noisy temperature sensors may need a lower value for stabilization.
@@ -743,7 +710,23 @@
//====================== PID > Bed Temperature Control ====================== //====================== PID > Bed Temperature Control ======================
//=========================================================================== //===========================================================================
// @section bed temp /**
* PID Bed Heating
*
* If this option is enabled set PID constants below.
* If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis.
*
* The PID frequency will be the same as the extruder PWM.
* If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz,
* which is fine for driving a square wave into a resistive load and does not significantly
* impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W
* heater. If your configuration is significantly different than this and you don't understand
* the issues involved, don't use bed PID until someone else verifies that your hardware works.
* @section bed temp
*/
//#define PIDTEMPBED
//#define BED_LIMIT_SWITCHING
/** /**
* Max Bed Power * Max Bed Power
@@ -753,20 +736,6 @@
*/ */
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current #define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current
/**
* PID Bed Heating
*
* The PID frequency will be the same as the extruder PWM.
* If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz,
* which is fine for driving a square wave into a resistive load and does not significantly
* impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W
* heater. If your configuration is significantly different than this and you don't understand
* the issues involved, don't use bed PID until someone else verifies that your hardware works.
*
* With this option disabled, bang-bang will be used. BED_LIMIT_SWITCHING enables hysteresis.
*/
//#define PIDTEMPBED
#if ENABLED(PIDTEMPBED) #if ENABLED(PIDTEMPBED)
//#define MIN_BED_POWER 0 //#define MIN_BED_POWER 0
//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port.
@@ -778,9 +747,7 @@
#define DEFAULT_bedKd 305.4 #define DEFAULT_bedKd 305.4
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
#else #endif // PIDTEMPBED
//#define BED_LIMIT_SWITCHING // Keep the bed temperature within BED_HYSTERESIS of the target
#endif
//=========================================================================== //===========================================================================
//==================== PID > Chamber Temperature Control ==================== //==================== PID > Chamber Temperature Control ====================
@@ -892,12 +859,7 @@
//#define COREYX //#define COREYX
//#define COREZX //#define COREZX
//#define COREZY //#define COREZY
//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042
//
// MarkForged Kinematics
// See https://reprap.org/forum/read.php?152,504042
//
//#define MARKFORGED_XY
//#define MARKFORGED_YX //#define MARKFORGED_YX
// Enable for a belt style printer with endless "Z" motion // Enable for a belt style printer with endless "Z" motion
@@ -906,8 +868,8 @@
// Enable for Polargraph Kinematics // Enable for Polargraph Kinematics
//#define POLARGRAPH //#define POLARGRAPH
#if ENABLED(POLARGRAPH) #if ENABLED(POLARGRAPH)
#define POLARGRAPH_MAX_BELT_LEN 1035.0 // (mm) Belt length at full extension. Override with M665 H. #define POLARGRAPH_MAX_BELT_LEN 1035.0
#define DEFAULT_SEGMENTS_PER_SECOND 5 // Move segmentation based on duration #define POLAR_SEGMENTS_PER_SECOND 5
#endif #endif
// @section delta // @section delta
@@ -919,26 +881,28 @@
// Make delta curves from many straight lines (linear interpolation). // Make delta curves from many straight lines (linear interpolation).
// This is a trade-off between visible corners (not enough segments) // This is a trade-off between visible corners (not enough segments)
// and processor overload (too many expensive sqrt calls). // and processor overload (too many expensive sqrt calls).
#define DEFAULT_SEGMENTS_PER_SECOND 200 #define DELTA_SEGMENTS_PER_SECOND 200
// After homing move down to a height where XY movement is unconstrained // After homing move down to a height where XY movement is unconstrained
//#define DELTA_HOME_TO_SAFE_ZONE //#define DELTA_HOME_TO_SAFE_ZONE
// Delta calibration menu // Delta calibration menu
// Add three-point calibration to the MarlinUI menu. // uncomment to add three points calibration menu option.
// See http://minow.blogspot.com/index.html#4918805519571907051 // See http://minow.blogspot.com/index.html#4918805519571907051
//#define DELTA_CALIBRATION_MENU //#define DELTA_CALIBRATION_MENU
// G33 Delta Auto-Calibration. Enable EEPROM_SETTINGS to store results. // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results)
//#define DELTA_AUTO_CALIBRATION //#define DELTA_AUTO_CALIBRATION
// NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them
#if ENABLED(DELTA_AUTO_CALIBRATION) #if ENABLED(DELTA_AUTO_CALIBRATION)
// Default number of probe points : n*n (1 -> 7) // set the default number of probe points : n*n (1 -> 7)
#define DELTA_CALIBRATION_DEFAULT_POINTS 4 #define DELTA_CALIBRATION_DEFAULT_POINTS 4
#endif #endif
#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) #if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU)
// Step size for paper-test probing // Set the steprate for papertest probing
#define PROBE_MANUALLY_STEP 0.05 // (mm) #define PROBE_MANUALLY_STEP 0.05 // (mm)
#endif #endif
@@ -954,7 +918,7 @@
// Distance between bed and nozzle Z home position // Distance between bed and nozzle Z home position
#define DELTA_HEIGHT 250.00 // (mm) Get this value from G33 auto calibrate #define DELTA_HEIGHT 250.00 // (mm) Get this value from G33 auto calibrate
#define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // (mm) Get these values from G33 auto calibrate #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // Get these values from G33 auto calibrate
// Horizontal distance bridged by diagonal push rods when effector is centered. // Horizontal distance bridged by diagonal push rods when effector is centered.
#define DELTA_RADIUS 124.0 // (mm) Get this value from G33 auto calibrate #define DELTA_RADIUS 124.0 // (mm) Get this value from G33 auto calibrate
@@ -962,11 +926,11 @@
// Trim adjustments for individual towers // Trim adjustments for individual towers
// tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0
// measured in degrees anticlockwise looking from above the printer // measured in degrees anticlockwise looking from above the printer
#define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // (mm) Get these values from G33 auto calibrate #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // Get these values from G33 auto calibrate
// Delta radius and diagonal rod adjustments // Delta radius and diagonal rod adjustments (mm)
//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 }
//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 }
#endif #endif
// @section scara // @section scara
@@ -983,7 +947,7 @@
//#define MP_SCARA //#define MP_SCARA
#if EITHER(MORGAN_SCARA, MP_SCARA) #if EITHER(MORGAN_SCARA, MP_SCARA)
// If movement is choppy try lowering this value // If movement is choppy try lowering this value
#define DEFAULT_SEGMENTS_PER_SECOND 200 #define SCARA_SEGMENTS_PER_SECOND 200
// Length of inner and outer support arms. Measure arm lengths precisely. // Length of inner and outer support arms. Measure arm lengths precisely.
#define SCARA_LINKAGE_1 150 // (mm) #define SCARA_LINKAGE_1 150 // (mm)
@@ -1002,8 +966,8 @@
// Radius around the center where the arm cannot reach // Radius around the center where the arm cannot reach
#define MIDDLE_DEAD_ZONE_R 0 // (mm) #define MIDDLE_DEAD_ZONE_R 0 // (mm)
#define THETA_HOMING_OFFSET 0 // Calculated from Calibration Guide and M360 / M114. See https://www.morgan3dp.com/morgan-calibration-guide/ #define THETA_HOMING_OFFSET 0 // Calculated from Calibration Guide and M360 / M114. See http://reprap.harleystudio.co.za/?page_id=1073
#define PSI_HOMING_OFFSET 0 // Calculated from Calibration Guide and M364 / M114. See https://www.morgan3dp.com/morgan-calibration-guide/ #define PSI_HOMING_OFFSET 0 // Calculated from Calibration Guide and M364 / M114. See http://reprap.harleystudio.co.za/?page_id=1073
#elif ENABLED(MP_SCARA) #elif ENABLED(MP_SCARA)
@@ -1019,25 +983,25 @@
// Enable for TPARA kinematics and configure below // Enable for TPARA kinematics and configure below
//#define AXEL_TPARA //#define AXEL_TPARA
#if ENABLED(AXEL_TPARA) #if ENABLED(AXEL_TPARA)
#define DEBUG_TPARA_KINEMATICS #define DEBUG_ROBOT_KINEMATICS
#define DEFAULT_SEGMENTS_PER_SECOND 200 #define ROBOT_SEGMENTS_PER_SECOND 200
// Length of inner and outer support arms. Measure arm lengths precisely. // Length of inner and outer support arms. Measure arm lengths precisely.
#define TPARA_LINKAGE_1 120 // (mm) #define ROBOT_LINKAGE_1 120 // (mm)
#define TPARA_LINKAGE_2 120 // (mm) #define ROBOT_LINKAGE_2 120 // (mm)
// SCARA tower offset (position of Tower relative to bed zero position) // SCARA tower offset (position of Tower relative to bed zero position)
// This needs to be reasonably accurate as it defines the printbed position in the SCARA space. // This needs to be reasonably accurate as it defines the printbed position in the SCARA space.
#define TPARA_OFFSET_X 0 // (mm) #define ROBOT_OFFSET_X 0 // (mm)
#define TPARA_OFFSET_Y 0 // (mm) #define ROBOT_OFFSET_Y 0 // (mm)
#define TPARA_OFFSET_Z 0 // (mm) #define ROBOT_OFFSET_Z 0 // (mm)
#define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly #define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
// Radius around the center where the arm cannot reach // Radius around the center where the arm cannot reach
#define MIDDLE_DEAD_ZONE_R 0 // (mm) #define MIDDLE_DEAD_ZONE_R 0 // (mm)
// Calculated from Calibration Guide and M360 / M114. See https://www.morgan3dp.com/morgan-calibration-guide/ // Calculated from Calibration Guide and M360 / M114. See http://reprap.harleystudio.co.za/?page_id=1073
#define THETA_HOMING_OFFSET 0 #define THETA_HOMING_OFFSET 0
#define PSI_HOMING_OFFSET 0 #define PSI_HOMING_OFFSET 0
#endif #endif
@@ -1310,17 +1274,19 @@
/** /**
* Z_MIN_PROBE_PIN * Z_MIN_PROBE_PIN
* *
* Override this pin only if the probe cannot be connected to * Define this pin if the probe is not connected to Z_MIN_PIN.
* the default Z_MIN_PROBE_PIN for the selected MOTHERBOARD. * If not defined the default pin for the selected MOTHERBOARD
* will be used. Most of the time the default is what you want.
* *
* - The simplest option is to use a free endstop connector. * - The simplest option is to use a free endstop connector.
* - Use 5V for powered (usually inductive) sensors. * - Use 5V for powered (usually inductive) sensors.
* *
* - For simple switches... * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin:
* - Normally-closed (NC) also connect to GND. * - For simple switches connect...
* - Normally-open (NO) also connect to 5V. * - normally-closed switches to GND and D32.
* - normally-open switches to 5V and D32.
*/ */
//#define Z_MIN_PROBE_PIN -1 //#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default
/** /**
* Probe Type * Probe Type
@@ -1351,10 +1317,8 @@
/** /**
* Z Servo Probe, such as an endstop switch on a rotating arm. * Z Servo Probe, such as an endstop switch on a rotating arm.
*/ */
//#define Z_PROBE_SERVO_NR 0 //#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector.
#ifdef Z_PROBE_SERVO_NR //#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles
//#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles
#endif
/** /**
* The BLTouch probe uses a Hall effect sensor and emulates a servo. * The BLTouch probe uses a Hall effect sensor and emulates a servo.
@@ -1424,7 +1388,7 @@
#define MAG_MOUNTED_STOW_5 { PROBE_STOW_FEEDRATE, { 0, 0, 0 } } // Extra move if needed #define MAG_MOUNTED_STOW_5 { PROBE_STOW_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
#endif #endif
// Duet Smart Effector (for delta printers) - https://docs.duet3d.com/en/Duet3D_hardware/Accessories/Smart_Effector // Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J
// When the pin is defined you can use M672 to set/reset the probe sensitivity. // When the pin is defined you can use M672 to set/reset the probe sensitivity.
//#define DUET_SMART_EFFECTOR //#define DUET_SMART_EFFECTOR
#if ENABLED(DUET_SMART_EFFECTOR) #if ENABLED(DUET_SMART_EFFECTOR)
@@ -1440,7 +1404,7 @@
//#define SENSORLESS_PROBING //#define SENSORLESS_PROBING
/** /**
* Allen key retractable z-probe as seen on many Kossel delta printers - https://reprap.org/wiki/Kossel#Autolevel_probe * Allen key retractable z-probe as seen on many Kossel delta printers - https://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe
* Deploys by touching z-axis belt. Retracts by pushing the probe down. * Deploys by touching z-axis belt. Retracts by pushing the probe down.
*/ */
//#define Z_PROBE_ALLEN_KEY //#define Z_PROBE_ALLEN_KEY
@@ -1487,7 +1451,7 @@
* *
* Tune and Adjust * Tune and Adjust
* - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc.
* - PROBE_OFFSET_WIZARD (Configuration_adv.h) can be used for setting the Z offset. * - PROBE_OFFSET_WIZARD (configuration_adv.h) can be used for setting the Z offset.
* *
* Assuming the typical work area orientation: * Assuming the typical work area orientation:
* - Probe to RIGHT of the Nozzle has a Positive X offset * - Probe to RIGHT of the Nozzle has a Positive X offset
@@ -1588,12 +1552,12 @@
* Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle.
* But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle.
*/ */
#define Z_CLEARANCE_DEPLOY_PROBE 10 // (mm) Z Clearance for Deploy/Stow #define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow
#define Z_CLEARANCE_BETWEEN_PROBES 5 // (mm) Z Clearance between probe points #define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points
#define Z_CLEARANCE_MULTI_PROBE 5 // (mm) Z Clearance between multiple probes #define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes
//#define Z_AFTER_PROBING 5 // (mm) Z position after probing is done //#define Z_AFTER_PROBING 5 // Z position after probing is done
#define Z_PROBE_LOW_POINT -2 // (mm) Farthest distance below the trigger-point to go before stopping #define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping
// For M851 give a range for adjusting the Z probe offset // For M851 give a range for adjusting the Z probe offset
#define Z_PROBE_OFFSET_RANGE_MIN -20 #define Z_PROBE_OFFSET_RANGE_MIN -20
@@ -1647,25 +1611,25 @@
// Disable axis steppers immediately when they're not being stepped. // Disable axis steppers immediately when they're not being stepped.
// WARNING: When motors turn off there is a chance of losing position accuracy! // WARNING: When motors turn off there is a chance of losing position accuracy!
//#define DISABLE_X #define DISABLE_X false
//#define DISABLE_Y #define DISABLE_Y false
//#define DISABLE_Z #define DISABLE_Z false
//#define DISABLE_I //#define DISABLE_I false
//#define DISABLE_J //#define DISABLE_J false
//#define DISABLE_K //#define DISABLE_K false
//#define DISABLE_U //#define DISABLE_U false
//#define DISABLE_V //#define DISABLE_V false
//#define DISABLE_W //#define DISABLE_W false
// Turn off the display blinking that warns about possible accuracy reduction // Turn off the display blinking that warns about possible accuracy reduction
//#define DISABLE_REDUCED_ACCURACY_WARNING //#define DISABLE_REDUCED_ACCURACY_WARNING
// @section extruder // @section extruder
//#define DISABLE_E // Disable the extruder when not stepping #define DISABLE_E false // Disable the extruder when not stepping
#define DISABLE_OTHER_EXTRUDERS // Keep only the active extruder enabled #define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled
// @section motion // @section machine
// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
#define INVERT_X_DIR false #define INVERT_X_DIR false
@@ -1905,12 +1869,6 @@
//#define AUTO_BED_LEVELING_UBL //#define AUTO_BED_LEVELING_UBL
//#define MESH_BED_LEVELING //#define MESH_BED_LEVELING
/**
* Commands to execute at the end of G29 probing.
* Useful to retract or move the Z probe out of the way.
*/
//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10"
/** /**
* Normally G28 leaves leveling disabled on completion. Enable one of * Normally G28 leaves leveling disabled on completion. Enable one of
* these options to restore the prior leveling state or to always enable * these options to restore the prior leveling state or to always enable
@@ -1940,7 +1898,7 @@
/** /**
* Enable detailed logging of G28, G29, M48, etc. * Enable detailed logging of G28, G29, M48, etc.
* Turn on with the command 'M111 S32'. * Turn on with the command 'M111 S32'.
* NOTE: Requires a lot of flash! * NOTE: Requires a lot of PROGMEM!
*/ */
//#define DEBUG_LEVELING_FEATURE //#define DEBUG_LEVELING_FEATURE
@@ -1950,21 +1908,17 @@
#endif #endif
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) #if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL)
/** // Gradually reduce leveling correction until a set height is reached,
* Gradually reduce leveling correction until a set height is reached, // at which point movement will be level to the machine's XY plane.
* at which point movement will be level to the machine's XY plane. // The height can be set with M420 Z<height>
* The height can be set with M420 Z<height>
*/
#define ENABLE_LEVELING_FADE_HEIGHT #define ENABLE_LEVELING_FADE_HEIGHT
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
#define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height. #define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height.
#endif #endif
/** // For Cartesian machines, instead of dividing moves on mesh boundaries,
* For Cartesian machines, instead of dividing moves on mesh boundaries, // split up moves into short segments like a Delta. This follows the
* split up moves into short segments like a Delta. This follows the // contours of the bed more closely than edge-to-edge straight moves.
* contours of the bed more closely than edge-to-edge straight moves.
*/
#define SEGMENT_LEVELED_MOVES #define SEGMENT_LEVELED_MOVES
#define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one)
@@ -2000,7 +1954,7 @@
//#define EXTRAPOLATE_BEYOND_GRID //#define EXTRAPOLATE_BEYOND_GRID
// //
// Subdivision of the grid by Catmull-Rom method. // Experimental Subdivision of the grid by Catmull-Rom method.
// Synthesizes intermediate points to produce a more detailed mesh. // Synthesizes intermediate points to produce a more detailed mesh.
// //
//#define ABL_BILINEAR_SUBDIVISION //#define ABL_BILINEAR_SUBDIVISION
@@ -2064,8 +2018,8 @@
#if ENABLED(LCD_BED_TRAMMING) #if ENABLED(LCD_BED_TRAMMING)
#define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets #define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets
#define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at tramming points #define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
#define BED_TRAMMING_Z_HOP 4.0 // (mm) Z height of nozzle between tramming points #define BED_TRAMMING_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
//#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner //#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner
//#define BED_TRAMMING_USE_PROBE //#define BED_TRAMMING_USE_PROBE
#if ENABLED(BED_TRAMMING_USE_PROBE) #if ENABLED(BED_TRAMMING_USE_PROBE)
@@ -2094,6 +2048,12 @@
#define BED_TRAMMING_LEVELING_ORDER { LF, RF, RB, LB } #define BED_TRAMMING_LEVELING_ORDER { LF, RF, RB, LB }
#endif #endif
/**
* Commands to execute at the end of G29 probing.
* Useful to retract or move the Z probe out of the way.
*/
//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10"
// @section homing // @section homing
// The center of the bed is at (X=0, Y=0) // The center of the bed is at (X=0, Y=0)
@@ -2121,8 +2081,8 @@
//#define Z_SAFE_HOMING //#define Z_SAFE_HOMING
#if ENABLED(Z_SAFE_HOMING) #if ENABLED(Z_SAFE_HOMING)
#define Z_SAFE_HOMING_X_POINT X_CENTER // (mm) X point for Z homing #define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing
#define Z_SAFE_HOMING_Y_POINT Y_CENTER // (mm) Y point for Z homing #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing
#endif #endif
// Homing speeds (linear=mm/min, rotational=°/min) // Homing speeds (linear=mm/min, rotational=°/min)
@@ -2169,8 +2129,9 @@
#define XY_DIAG_BD 282.8427124746 #define XY_DIAG_BD 282.8427124746
#define XY_SIDE_AD 200 #define XY_SIDE_AD 200
// Or, set the XY skew factor directly: // Or, set the default skew factors directly here
//#define XY_SKEW_FACTOR 0.0 // to override the above measurements:
#define XY_SKEW_FACTOR 0.0
//#define SKEW_CORRECTION_FOR_Z //#define SKEW_CORRECTION_FOR_Z
#if ENABLED(SKEW_CORRECTION_FOR_Z) #if ENABLED(SKEW_CORRECTION_FOR_Z)
@@ -2179,10 +2140,8 @@
#define YZ_DIAG_AC 282.8427124746 #define YZ_DIAG_AC 282.8427124746
#define YZ_DIAG_BD 282.8427124746 #define YZ_DIAG_BD 282.8427124746
#define YZ_SIDE_AD 200 #define YZ_SIDE_AD 200
#define XZ_SKEW_FACTOR 0.0
// Or, set the Z skew factors directly: #define YZ_SKEW_FACTOR 0.0
//#define XZ_SKEW_FACTOR 0.0
//#define YZ_SKEW_FACTOR 0.0
#endif #endif
// Enable this option for M852 to set skew at runtime // Enable this option for M852 to set skew at runtime
@@ -2206,7 +2165,7 @@
*/ */
//#define EEPROM_SETTINGS // Persistent storage with M500 and M501 //#define EEPROM_SETTINGS // Persistent storage with M500 and M501
//#define DISABLE_M503 // Saves ~2700 bytes of flash. Disable for release! //#define DISABLE_M503 // Saves ~2700 bytes of flash. Disable for release!
#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save flash. #define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM.
#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load #define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load
#if ENABLED(EEPROM_SETTINGS) #if ENABLED(EEPROM_SETTINGS)
//#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. //#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors.
@@ -2240,7 +2199,7 @@
// @section temperature // @section temperature
// //
// Preheat Constants - Up to 10 are supported without changes // Preheat Constants - Up to 6 are supported without changes
// //
#define PREHEAT_1_LABEL "PLA" #define PREHEAT_1_LABEL "PLA"
#define PREHEAT_1_TEMP_HOTEND 180 #define PREHEAT_1_TEMP_HOTEND 180
@@ -2279,7 +2238,7 @@
#endif #endif
/** /**
* Clean Nozzle Feature * Clean Nozzle Feature -- EXPERIMENTAL
* *
* Adds the G12 command to perform a nozzle cleaning process. * Adds the G12 command to perform a nozzle cleaning process.
* *
@@ -2313,6 +2272,7 @@
* Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT.
* *
* Caveats: The ending Z should be the same as starting Z. * Caveats: The ending Z should be the same as starting Z.
* Attention: EXPERIMENTAL. G-code arguments may change.
*/ */
//#define NOZZLE_CLEAN_FEATURE //#define NOZZLE_CLEAN_FEATURE
@@ -2397,7 +2357,7 @@
*/ */
//#define PRINTCOUNTER //#define PRINTCOUNTER
#if ENABLED(PRINTCOUNTER) #if ENABLED(PRINTCOUNTER)
#define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print. A value of 0 will save stats at end of print. #define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print
#endif #endif
// @section security // @section security
@@ -2427,7 +2387,7 @@
#define PASSWORD_ON_STARTUP #define PASSWORD_ON_STARTUP
#define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P<password> command. Disable to prevent brute-force attack. #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P<password> command. Disable to prevent brute-force attack.
#define PASSWORD_CHANGE_GCODE // Change the password with M512 P<old> S<new>. #define PASSWORD_CHANGE_GCODE // Change the password with M512 P<old> S<new>.
//#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent G-codes from running //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running
//#define PASSWORD_AFTER_SD_PRINT_END //#define PASSWORD_AFTER_SD_PRINT_END
//#define PASSWORD_AFTER_SD_PRINT_ABORT //#define PASSWORD_AFTER_SD_PRINT_ABORT
//#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE
@@ -2613,7 +2573,7 @@
// //
// Original RADDS LCD Display+Encoder+SDCardReader // Original RADDS LCD Display+Encoder+SDCardReader
// https://web.archive.org/web/20200719145306/http://doku.radds.org/dokumentation/lcd-display/ // http://doku.radds.org/dokumentation/lcd-display/
// //
//#define RADDS_DISPLAY //#define RADDS_DISPLAY
@@ -2643,6 +2603,7 @@
// //
// RigidBot Panel V1.0 // RigidBot Panel V1.0
// http://www.inventapart.com/
// //
//#define RIGIDBOT_PANEL //#define RIGIDBOT_PANEL
@@ -2679,16 +2640,15 @@
// //
// Elefu RA Board Control Panel // Elefu RA Board Control Panel
// https://web.archive.org/web/20140823033947/http://www.elefu.com/index.php?route=product/product&product_id=53 // http://www.elefu.com/index.php?route=product/product&product_id=53
// //
//#define RA_CONTROL_PANEL //#define RA_CONTROL_PANEL
// //
// Sainsmart (YwRobot) LCD Displays // Sainsmart (YwRobot) LCD Displays
// //
// These require LiquidCrystal_I2C library: // These require F.Malpartida's LiquidCrystal_I2C library
// https://github.com/MarlinFirmware/New-LiquidCrystal // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
// https://github.com/fmalpartida/New-LiquidCrystal/wiki
// //
//#define LCD_SAINSMART_I2C_1602 //#define LCD_SAINSMART_I2C_1602
//#define LCD_SAINSMART_I2C_2004 //#define LCD_SAINSMART_I2C_2004
@@ -2721,7 +2681,7 @@
// //
// //
// 2-wire Non-latching LCD SR from https://github.com/fmalpartida/New-LiquidCrystal/wiki/schematics#user-content-ShiftRegister_connection // 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH
// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD // LCD configuration: https://reprap.org/wiki/SAV_3D_LCD
// //
//#define SAV_3DLCD //#define SAV_3DLCD
@@ -2768,7 +2728,7 @@
// //
// ReprapWorld Graphical LCD // ReprapWorld Graphical LCD
// https://reprapworld.com/electronics/3d-printer-modules/autonomous-printing/graphical-lcd-screen-v1-0/ // https://reprapworld.com/?products_details&products_id/1218
// //
//#define REPRAPWORLD_GRAPHICAL_LCD //#define REPRAPWORLD_GRAPHICAL_LCD
@@ -2793,7 +2753,7 @@
// //
// MaKr3d Makr-Panel with graphic controller and SD support. // MaKr3d Makr-Panel with graphic controller and SD support.
// https://reprap.org/wiki/MaKrPanel // https://reprap.org/wiki/MaKr3d_MaKrPanel
// //
//#define MAKRPANEL //#define MAKRPANEL
@@ -2811,7 +2771,7 @@
// //
// Cartesio UI // Cartesio UI
// https://web.archive.org/web/20180605050442/http://mauk.cc/webshop/cartesio-shop/electronics/user-interface // http://mauk.cc/webshop/cartesio-shop/electronics/user-interface
// //
//#define CARTESIO_UI //#define CARTESIO_UI
@@ -2855,16 +2815,16 @@
//#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. //#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight.
// //
// BigTreeTech Mini 12864 V1.0 / V2.0 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight. // BigTreeTech Mini 12864 V1.0 is an alias for FYSETC_MINI_12864_2_1. Type A/B. NeoPixel RGB Backlight.
// https://github.com/bigtreetech/MINI-12864
// //
//#define BTT_MINI_12864 //#define BTT_MINI_12864_V1
// //
// Factory display for Creality CR-10 / CR-7 / Ender-3 // Factory display for Creality CR-10
// https://marlinfw.org/docs/hardware/controllers.html#cr10_stockdisplay // https://www.aliexpress.com/item/32833148327.html
// //
// Connect to EXP1 on RAMPS and compatible boards. // This is RAMPS-compatible using a single 10-pin connector.
// (For CR-10 owners who want to replace the Melzi Creality board but retain the display)
// //
//#define CR10_STOCKDISPLAY //#define CR10_STOCKDISPLAY
@@ -2979,12 +2939,10 @@
* ORIGIN (Marlin DWIN_SET) * ORIGIN (Marlin DWIN_SET)
* - Download https://github.com/coldtobi/Marlin_DGUS_Resources * - Download https://github.com/coldtobi/Marlin_DGUS_Resources
* - Copy the downloaded DWIN_SET folder to the SD card. * - Copy the downloaded DWIN_SET folder to the SD card.
* - Product: https://www.aliexpress.com/item/32993409517.html
* *
* FYSETC (Supplier default) * FYSETC (Supplier default)
* - Download https://github.com/FYSETC/FYSTLCD-2.0 * - Download https://github.com/FYSETC/FYSTLCD-2.0
* - Copy the downloaded SCREEN folder to the SD card. * - Copy the downloaded SCREEN folder to the SD card.
* - Product: https://www.aliexpress.com/item/32961471929.html
* *
* HIPRECY (Supplier default) * HIPRECY (Supplier default)
* - Download https://github.com/HiPrecy/Touch-Lcd-LEO * - Download https://github.com/HiPrecy/Touch-Lcd-LEO
@@ -2993,17 +2951,10 @@
* MKS (MKS-H43) (Supplier default) * MKS (MKS-H43) (Supplier default)
* - Download https://github.com/makerbase-mks/MKS-H43 * - Download https://github.com/makerbase-mks/MKS-H43
* - Copy the downloaded DWIN_SET folder to the SD card. * - Copy the downloaded DWIN_SET folder to the SD card.
* - Product: https://www.aliexpress.com/item/1005002008179262.html
* *
* RELOADED (T5UID1) * RELOADED (T5UID1)
* - Download https://github.com/Neo2003/DGUS-reloaded/releases * - Download https://github.com/Desuuuu/DGUS-reloaded/releases
* - Copy the downloaded DWIN_SET folder to the SD card. * - Copy the downloaded DWIN_SET folder to the SD card.
*
* Flash display with DGUS Displays for Marlin:
* - Format the SD card to FAT32 with an allocation size of 4kb.
* - Download files as specified for your type of display.
* - Plug the microSD card into the back of the display.
* - Boot the display and wait for the update to complete.
*/ */
//#define DGUS_LCD_UI_ORIGIN //#define DGUS_LCD_UI_ORIGIN
//#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_FYSETC
@@ -3032,7 +2983,6 @@
//#define ANYCUBIC_LCD_CHIRON //#define ANYCUBIC_LCD_CHIRON
#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) #if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON)
//#define ANYCUBIC_LCD_DEBUG //#define ANYCUBIC_LCD_DEBUG
//#define ANYCUBIC_LCD_GCODE_EXT // Add ".gcode" to menu entries for DGUS clone compatibility
#endif #endif
// //
@@ -3062,7 +3012,6 @@
// //
// 480x320, 3.5", SPI Display with Rotary Encoder from MKS // 480x320, 3.5", SPI Display with Rotary Encoder from MKS
// Usually paired with MKS Robin Nano V2 & V3 // Usually paired with MKS Robin Nano V2 & V3
// https://github.com/makerbase-mks/MKS-TFT-Hardware/tree/master/MKS%20TS35
// //
//#define MKS_TS35_V2_0 //#define MKS_TS35_V2_0
@@ -3102,7 +3051,7 @@
//#define MKS_ROBIN_TFT_V1_1R //#define MKS_ROBIN_TFT_V1_1R
// //
// 480x320, 3.5", FSMC Stock Display from Tronxy // 480x320, 3.5", FSMC Stock Display from TronxXY
// //
//#define TFT_TRONXY_X5SA //#define TFT_TRONXY_X5SA
@@ -3127,14 +3076,12 @@
//#define ANET_ET5_TFT35 //#define ANET_ET5_TFT35
// //
// 1024x600, 7", RGB Stock Display with Rotary Encoder from BIQU BX // 1024x600, 7", RGB Stock Display with Rotary Encoder from BIQU-BX
// https://github.com/bigtreetech/BIQU-BX/tree/master/Hardware
// //
//#define BIQU_BX_TFT70 //#define BIQU_BX_TFT70
// //
// 480x320, 3.5", SPI Stock Display with Rotary Encoder from BIQU B1 SE Series // 480x320, 3.5", SPI Stock Display with Rotary Encoder from BIQU B1 SE Series
// https://github.com/bigtreetech/TFT35-SPI/tree/master/v1
// //
//#define BTT_TFT35_SPI_V1_0 //#define BTT_TFT35_SPI_V1_0
@@ -3171,10 +3118,6 @@
//#define TFT_COLOR_UI //#define TFT_COLOR_UI
//#define TFT_LVGL_UI //#define TFT_LVGL_UI
#if ENABLED(TFT_COLOR_UI)
//#define TFT_SHARED_IO // SPI is shared between TFT display and other devices. Disable async data transfer
#endif
#if ENABLED(TFT_LVGL_UI) #if ENABLED(TFT_LVGL_UI)
//#define MKS_WIFI_MODULE // MKS WiFi module //#define MKS_WIFI_MODULE // MKS WiFi module
#endif #endif
@@ -3210,8 +3153,7 @@
#define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens
#define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
//#define DISABLE_ENCODER // Disable the click encoder, if any //#define TOUCH_IDLE_SLEEP 300 // (s) Turn off the TFT backlight if set (5mn)
//#define TOUCH_IDLE_SLEEP_MINS 5 // (minutes) Display Sleep after a period of inactivity. Set with M255 S.
#define TOUCH_SCREEN_CALIBRATION #define TOUCH_SCREEN_CALIBRATION
@@ -3302,19 +3244,16 @@
* luminance values can be set from 0 to 255. * luminance values can be set from 0 to 255.
* For NeoPixel LED an overall brightness parameter is also available. * For NeoPixel LED an overall brightness parameter is also available.
* *
* === CAUTION === * *** CAUTION ***
* LED Strips require a MOSFET Chip between PWM lines and LEDs, * LED Strips require a MOSFET Chip between PWM lines and LEDs,
* as the Arduino cannot handle the current the LEDs will require. * as the Arduino cannot handle the current the LEDs will require.
* Failure to follow this precaution can destroy your Arduino! * Failure to follow this precaution can destroy your Arduino!
*
* NOTE: A separate 5V power supply is required! The NeoPixel LED needs * NOTE: A separate 5V power supply is required! The NeoPixel LED needs
* more current than the Arduino 5V linear regulator can produce. * more current than the Arduino 5V linear regulator can produce.
* *** CAUTION ***
* *
* Requires PWM frequency between 50 <> 100Hz (Check HAL or variant) * LED Type. Enable only one of the following two options.
* Use FAST_PWM_FAN, if possible, to reduce fan noise.
*/ */
// LED Type. Enable only one of the following two options:
//#define RGB_LED //#define RGB_LED
//#define RGBW_LED //#define RGBW_LED
@@ -3325,13 +3264,6 @@
//#define RGB_LED_W_PIN -1 //#define RGB_LED_W_PIN -1
#endif #endif
#if ANY(RGB_LED, RGBW_LED, PCA9632)
//#define RGB_STARTUP_TEST // For PWM pins, fade between all colors
#if ENABLED(RGB_STARTUP_TEST)
#define RGB_STARTUP_TEST_INNER_MS 10 // (ms) Reduce or increase fading speed
#endif
#endif
// Support for Adafruit NeoPixel LED driver // Support for Adafruit NeoPixel LED driver
//#define NEOPIXEL_LED //#define NEOPIXEL_LED
#if ENABLED(NEOPIXEL_LED) #if ENABLED(NEOPIXEL_LED)
@@ -3351,7 +3283,6 @@
#define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip #define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip
#define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255) #define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255)
#define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup #define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup
#define NEOPIXEL_M150_DEFAULT -1 // Default strip for M150 without 'S'. Use -1 to set all by default.
#else #else
//#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -63,8 +63,8 @@ HARDWARE_MOTHERBOARD ?= 1020
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
# Windows # Windows
ARDUINO_INSTALL_DIR ?= ${HOME}/AppData/Local/Arduino ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino ARDUINO_USER_DIR ?= ${HOME}/Arduino
else else
UNAME_S := $(shell uname -s) UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux) ifeq ($(UNAME_S),Linux)
@@ -82,11 +82,11 @@ endif
# Arduino source install directory, and version number # Arduino source install directory, and version number
# On most linuxes this will be /usr/share/arduino # On most linuxes this will be /usr/share/arduino
ARDUINO_INSTALL_DIR ?= ${HOME}/AppData/Local/Arduino # C:/Users/${USERNAME}/AppData/Local/Arduino ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
ARDUINO_VERSION ?= 10819 ARDUINO_VERSION ?= 106
# The installed Libraries are in the User folder # The installed Libraries are in the User folder
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino ARDUINO_USER_DIR ?= ${HOME}/Arduino
# You can optionally set a path to the avr-gcc tools. # You can optionally set a path to the avr-gcc tools.
# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/ # Requires a trailing slash. For example, /usr/local/avr-gcc/bin/
@@ -307,22 +307,20 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1154)
else ifeq ($(HARDWARE_MOTHERBOARD),1155) else ifeq ($(HARDWARE_MOTHERBOARD),1155)
# Tenlog D3 Hero IDEX printer # Tenlog D3 Hero IDEX printer
else ifeq ($(HARDWARE_MOTHERBOARD),1156) else ifeq ($(HARDWARE_MOTHERBOARD),1156)
# Tenlog D3,5,6 Pro IDEX printers
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1158) else ifeq ($(HARDWARE_MOTHERBOARD),1157)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1159) else ifeq ($(HARDWARE_MOTHERBOARD),1158)
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
else ifeq ($(HARDWARE_MOTHERBOARD),1160) else ifeq ($(HARDWARE_MOTHERBOARD),1159)
# Longer LK1 PRO / Alfawise U20 Pro (PRO version) # Longer LK1 PRO / Alfawise U20 Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1161) else ifeq ($(HARDWARE_MOTHERBOARD),1160)
# Longer LKx PRO / Alfawise Uxx Pro (PRO version) # Longer LKx PRO / Alfawise Uxx Pro (PRO version)
else ifeq ($(HARDWARE_MOTHERBOARD),1162) else ifeq ($(HARDWARE_MOTHERBOARD),1161)
# Zonestar zrib V5.3 (Chinese RAMPS replica) # Zonestar zrib V5.3 (Chinese RAMPS replica)
else ifeq ($(HARDWARE_MOTHERBOARD),1163) else ifeq ($(HARDWARE_MOTHERBOARD),1162)
# Pxmalion Core I3 # Pxmalion Core I3
else ifeq ($(HARDWARE_MOTHERBOARD),1164) else ifeq ($(HARDWARE_MOTHERBOARD),1163)
# #
# RAMBo and derivatives # RAMBo and derivatives
@@ -656,18 +654,18 @@ ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/libraries/SPI/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
endif endif
ifeq ($(IS_MCU),1) ifeq ($(IS_MCU),1)
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/cores/arduino VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/libraries/SPI/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/libraries/SoftwareSerial/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
endif endif
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
@@ -681,17 +679,17 @@ ifeq ($(WIRE), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src/utility VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility
endif endif
ifeq ($(NEOPIXEL), 1) ifeq ($(NEOPIXEL), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
endif endif
ifeq ($(U8GLIB), 1) ifeq ($(U8GLIB), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib-HAL VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib-HAL/src VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/csrc
# VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/cppsrc
# VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/src VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/fntsrc
endif endif
ifeq ($(TMC), 1) ifeq ($(TMC), 1)
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src
@@ -700,9 +698,9 @@ endif
ifeq ($(HARDWARE_VARIANT), arduino) ifeq ($(HARDWARE_VARIANT), arduino)
HARDWARE_SUB_VARIANT ?= mega HARDWARE_SUB_VARIANT ?= mega
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/variants/$(HARDWARE_SUB_VARIANT) VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/variants/$(HARDWARE_SUB_VARIANT)
else ifeq ($(HARDWARE_VARIANT), Sanguino) else ifeq ($(HARDWARE_VARIANT), Sanguino)
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/variants/sanguino VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/variants/sanguino
else ifeq ($(HARDWARE_VARIANT), archim) else ifeq ($(HARDWARE_VARIANT), archim)
VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/libsam VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/libsam
VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/CMSIS/Include/ VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/CMSIS/Include/
@@ -718,7 +716,7 @@ else ifeq ($(HARDWARE_VARIANT), archim)
LDLIBS = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/libsam_sam3x8e_gcc_rel.a LDLIBS = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/libsam_sam3x8e_gcc_rel.a
else else
HARDWARE_SUB_VARIANT ?= standard HARDWARE_SUB_VARIANT ?= standard
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/variants/$(HARDWARE_SUB_VARIANT) VPATH += $(ARDUINO_INSTALL_DIR)/hardware/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT)
endif endif
LIB_SRC = wiring.c \ LIB_SRC = wiring.c \
@@ -733,7 +731,7 @@ endif
ifeq ($(HARDWARE_VARIANT), Teensy) ifeq ($(HARDWARE_VARIANT), Teensy)
LIB_SRC = wiring.c LIB_SRC = wiring.c
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/teensy/cores/teensy VPATH += $(ARDUINO_INSTALL_DIR)/hardware/teensy/cores/teensy
endif endif
LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp
@@ -880,7 +878,7 @@ AVRDUDE_WRITE_FLASH = -Uflash:w:$(BUILD_DIR)/$(TARGET).hex:i
ifeq ($(shell uname -s), Linux) ifeq ($(shell uname -s), Linux)
AVRDUDE_CONF = /etc/avrdude/avrdude.conf AVRDUDE_CONF = /etc/avrdude/avrdude.conf
else else
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
endif endif
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \ AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
-p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ -p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \

View File

@@ -2,7 +2,7 @@
Marlin Firmware Marlin Firmware
(c) 2011-2024 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
@@ -27,7 +27,7 @@ Configuration
- https://github.com/MarlinFirmware/Configurations - https://github.com/MarlinFirmware/Configurations
Example configurations for several printer models. Example configurations for several printer models.
- https://youtu.be/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

View File

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

View File

@@ -3,50 +3,10 @@
# config.ini - Options to apply before the build # config.ini - Options to apply before the build
# #
[config:base] [config:base]
#
# ini_use_config - A comma-separated list of actions to apply to the Configuration files.
# The actions will be applied in the listed order.
# - none
# Ignore this file and don't apply any configuration options
#
# - base
# Just apply the options in config:base to the configuration
#
# - minimal
# Just apply the options in config:minimal to the configuration
#
# - all
# Apply all 'config:*' sections in this file to the configuration
#
# - another.ini
# Load another INI file with a path relative to this config.ini file (i.e., within Marlin/)
#
# - https://me.myserver.com/path/to/configs
# Fetch configurations from any URL.
#
# - example/Creality/Ender-5 Plus @ bugfix-2.1.x
# Fetch example configuration files from the MarlinFirmware/Configurations repository
# https://raw.githubusercontent.com/MarlinFirmware/Configurations/bugfix-2.1.x/config/examples/Creality/Ender-5%20Plus/
#
# - example/default @ release-2.0.9.7
# Fetch default configuration files from the MarlinFirmware/Configurations repository
# https://raw.githubusercontent.com/MarlinFirmware/Configurations/release-2.0.9.7/config/default/
#
# - [disable]
# Comment out all #defines in both Configuration.h and Configuration_adv.h. This is useful
# to start with a clean slate before applying any config: options, so only the options explicitly
# set in config.ini will be enabled in the configuration.
#
# - [flatten] (Not yet implemented)
# Produce a flattened set of Configuration.h and Configuration_adv.h files with only the enabled
# #defines and no comments. A clean look, but context-free.
#
ini_use_config = none ini_use_config = none
# Load all config: sections in this file # Load all config: sections in this file
;ini_use_config = all ;ini_use_config = all
# Disable everything and apply subsequent config:base options
;ini_use_config = [disable], base
# Load config file relative to Marlin/ # Load config file relative to Marlin/
;ini_use_config = another.ini ;ini_use_config = another.ini
# Download configurations from GitHub # Download configurations from GitHub
@@ -82,7 +42,7 @@ preheat_1_temp_hotend = 180
bang_max = 255 bang_max = 255
pidtemp = on pidtemp = on
pid_k1 = 0.95 pid_k1 = 0.95
pid_max = 255 pid_max = BANG_MAX
pid_functional_range = 10 pid_functional_range = 10
default_kp = 22.20 default_kp = 22.20
@@ -140,10 +100,10 @@ invert_x_step_pin = false
invert_y_step_pin = false invert_y_step_pin = false
invert_z_step_pin = false invert_z_step_pin = false
disable_x = off disable_x = false
disable_y = off disable_y = false
disable_z = off disable_z = false
disable_e = off disable_e = false
proportional_font_ratio = 1.0 proportional_font_ratio = 1.0
default_nominal_filament_dia = 1.75 default_nominal_filament_dia = 1.75
@@ -167,7 +127,7 @@ busy_while_heating = on
default_ejerk = 5.0 default_ejerk = 5.0
default_keepalive_interval = 2 default_keepalive_interval = 2
default_leveling_fade_height = 0.0 default_leveling_fade_height = 0.0
disable_other_extruders = on disable_inactive_extruder = on
display_charset_hd44780 = JAPANESE display_charset_hd44780 = JAPANESE
eeprom_boot_silent = on eeprom_boot_silent = on
eeprom_chitchat = on eeprom_chitchat = on
@@ -216,12 +176,12 @@ auto_report_temperatures = on
autotemp = on autotemp = on
autotemp_oldweight = 0.98 autotemp_oldweight = 0.98
bed_check_interval = 5000 bed_check_interval = 5000
default_stepper_timeout_sec = 120 default_stepper_deactive_time = 120
default_volumetric_extruder_limit = 0.00 default_volumetric_extruder_limit = 0.00
disable_idle_x = on disable_inactive_e = true
disable_idle_y = on disable_inactive_x = true
disable_idle_z = on disable_inactive_y = true
disable_idle_e = on disable_inactive_z = true
e0_auto_fan_pin = -1 e0_auto_fan_pin = -1
encoder_100x_steps_per_sec = 80 encoder_100x_steps_per_sec = 80
encoder_10x_steps_per_sec = 30 encoder_10x_steps_per_sec = 30

View File

@@ -63,23 +63,18 @@ void save_reset_reason() {
void MarlinHAL::init() { void MarlinHAL::init() {
// Init Servo Pins // Init Servo Pins
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
#if HAS_SERVO_0 #if HAS_SERVO_0
OUT_WRITE(SERVO0_PIN, LOW); INIT_SERVO(0);
#endif #endif
#if HAS_SERVO_1 #if HAS_SERVO_1
OUT_WRITE(SERVO1_PIN, LOW); INIT_SERVO(1);
#endif #endif
#if HAS_SERVO_2 #if HAS_SERVO_2
OUT_WRITE(SERVO2_PIN, LOW); INIT_SERVO(2);
#endif #endif
#if HAS_SERVO_3 #if HAS_SERVO_3
OUT_WRITE(SERVO3_PIN, LOW); INIT_SERVO(3);
#endif
#if HAS_SERVO_4
OUT_WRITE(SERVO4_PIN, LOW);
#endif
#if HAS_SERVO_5
OUT_WRITE(SERVO5_PIN, LOW);
#endif #endif
init_pwm_timers(); // Init user timers to default frequency - 1000HZ init_pwm_timers(); // Init user timers to default frequency - 1000HZ
@@ -150,12 +145,12 @@ void MarlinHAL::reboot() {
// Free Memory Accessor // Free Memory Accessor
// ------------------------ // ------------------------
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
#include "../../sd/SdFatUtil.h" #include "../../sd/SdFatUtil.h"
int freeMemory() { return SdFatUtil::FreeRam(); } int freeMemory() { return SdFatUtil::FreeRam(); }
#else // !HAS_MEDIA #else // !SDSUPPORT
extern "C" { extern "C" {
extern char __bss_end; extern char __bss_end;
@@ -172,6 +167,6 @@ void MarlinHAL::reboot() {
} }
} }
#endif // !HAS_MEDIA #endif // !SDSUPPORT
#endif // __AVR__ #endif // __AVR__

View File

@@ -1,9 +1,7 @@
/** /**
* 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]
* * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* 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
@@ -34,7 +32,6 @@
#include <HardwareSerial.h> #include <HardwareSerial.h>
#else #else
#include "MarlinSerial.h" #include "MarlinSerial.h"
#define BOARD_NO_NATIVE_USB
#endif #endif
#include <stdint.h> #include <stdint.h>
@@ -109,47 +106,47 @@ typedef Servo hal_servo_t;
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0) #define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
#else #else
#if !WITHIN(SERIAL_PORT, 0, 3) #if !WITHIN(SERIAL_PORT, -1, 3)
#error "SERIAL_PORT must be from 0 to 3." #error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
#endif #endif
#define MYSERIAL1 customizedSerial1 #define MYSERIAL1 customizedSerial1
#ifdef SERIAL_PORT_2 #ifdef SERIAL_PORT_2
#if !WITHIN(SERIAL_PORT_2, 0, 3) #if !WITHIN(SERIAL_PORT_2, -1, 3)
#error "SERIAL_PORT_2 must be from 0 to 3." #error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
#endif #endif
#define MYSERIAL2 customizedSerial2 #define MYSERIAL2 customizedSerial2
#endif #endif
#ifdef SERIAL_PORT_3 #ifdef SERIAL_PORT_3
#if !WITHIN(SERIAL_PORT_3, 0, 3) #if !WITHIN(SERIAL_PORT_3, -1, 3)
#error "SERIAL_PORT_3 must be from 0 to 3." #error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
#endif #endif
#define MYSERIAL3 customizedSerial3 #define MYSERIAL3 customizedSerial3
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU2_SERIAL_PORT
#if !WITHIN(MMU2_SERIAL_PORT, 0, 3) #if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
#error "MMU2_SERIAL_PORT must be from 0 to 3" #error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
#endif #endif
#define MMU2_SERIAL mmuSerial #define MMU2_SERIAL mmuSerial
#endif #endif
#ifdef LCD_SERIAL_PORT #ifdef LCD_SERIAL_PORT
#if !WITHIN(LCD_SERIAL_PORT, 0, 3) #if !WITHIN(LCD_SERIAL_PORT, -1, 3)
#error "LCD_SERIAL_PORT must be from 0 to 3." #error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
#endif #endif
#define LCD_SERIAL lcdSerial #define LCD_SERIAL lcdSerial
#if HAS_DGUS_LCD #if HAS_DGUS_LCD
#define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
#endif #endif
#endif #endif
// //
// ADC // ADC
// //
#define HAL_ADC_VREF_MV 5000 #define HAL_ADC_VREF 5.0
#define HAL_ADC_RESOLUTION 10 #define HAL_ADC_RESOLUTION 10
// //

View File

@@ -119,6 +119,7 @@ void spiBegin() {
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
} }
/** begin spi transaction */ /** begin spi transaction */
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
// Based on Arduino SPI library // Based on Arduino SPI library
@@ -174,6 +175,7 @@ void spiBegin() {
SPSR = clockDiv | 0x01; SPSR = clockDiv | 0x01;
} }
#else // SOFTWARE_SPI || FORCE_SOFT_SPI #else // SOFTWARE_SPI || FORCE_SOFT_SPI
// ------------------------ // ------------------------
@@ -196,7 +198,7 @@ void spiBegin() {
// output pin high - like sending 0xFF // output pin high - like sending 0xFF
WRITE(SD_MOSI_PIN, HIGH); WRITE(SD_MOSI_PIN, HIGH);
for (uint8_t i = 0; i < 8; ++i) { LOOP_L_N(i, 8) {
WRITE(SD_SCK_PIN, HIGH); WRITE(SD_SCK_PIN, HIGH);
nop; // adjust so SCK is nice nop; // adjust so SCK is nice
@@ -223,7 +225,7 @@ void spiBegin() {
void spiSend(uint8_t data) { void spiSend(uint8_t data) {
// no interrupts during byte send - about 8µs // no interrupts during byte send - about 8µs
cli(); cli();
for (uint8_t i = 0; i < 8; ++i) { LOOP_L_N(i, 8) {
WRITE(SD_SCK_PIN, LOW); WRITE(SD_SCK_PIN, LOW);
WRITE(SD_MOSI_PIN, data & 0x80); WRITE(SD_MOSI_PIN, data & 0x80);
data <<= 1; data <<= 1;

View File

@@ -34,9 +34,12 @@
#include <WString.h> #include <WString.h>
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#include "../../core/types.h"
#include "../../core/serial_hook.h" #include "../../core/serial_hook.h"
#ifndef SERIAL_PORT
#define SERIAL_PORT 0
#endif
#ifndef USBCON #ifndef USBCON
// The presence of the UBRRH register is used to detect a UART. // The presence of the UBRRH register is used to detect a UART.
@@ -135,6 +138,10 @@
#define BYTE 0 #define BYTE 0
// Templated type selector
template<bool b, typename T, typename F> struct TypeSelector { typedef T type;} ;
template<typename T, typename F> struct TypeSelector<false, T, F> { typedef F type; };
template<typename Cfg> template<typename Cfg>
class MarlinSerial { class MarlinSerial {
protected: protected:
@@ -157,7 +164,7 @@
static constexpr B_U2Xx<Cfg::PORT> B_U2X = 0; static constexpr B_U2Xx<Cfg::PORT> B_U2X = 0;
// Base size of type on buffer size // Base size of type on buffer size
typedef uvalue_t(Cfg::RX_SIZE - 1) ring_buffer_pos_t; typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t;
struct ring_buffer_r { struct ring_buffer_r {
volatile ring_buffer_pos_t head, tail; volatile ring_buffer_pos_t head, tail;
@@ -276,7 +283,7 @@
static constexpr bool DROPPED_RX = false; static constexpr bool DROPPED_RX = 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 = ALL(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS); static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
}; };
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD; typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;

View File

@@ -63,6 +63,7 @@
static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
/************ static functions common to all instances ***********************/ /************ static functions common to all instances ***********************/
static inline void handle_interrupts(const timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) { static inline void handle_interrupts(const timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {

View File

@@ -23,7 +23,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ANY(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) #if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
/** /**
* PersistentStore for Arduino-style EEPROM interface * PersistentStore for Arduino-style EEPROM interface

View File

@@ -91,6 +91,7 @@ void endstop_ISR() { endstops.update(); }
#endif #endif
// Install Pin change interrupt for a pin. Can be called multiple times. // Install Pin change interrupt for a pin. Can be called multiple times.
void pciSetup(const int8_t pin) { void pciSetup(const int8_t pin) {
if (digitalPinHasPCICR(pin)) { if (digitalPinHasPCICR(pin)) {
@@ -119,7 +120,7 @@ void pciSetup(const int8_t pin) {
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 USE_X_MAX #if HAS_X_MAX
#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
@@ -127,7 +128,7 @@ void setup_endstop_interrupts() {
pciSetup(X_MAX_PIN); pciSetup(X_MAX_PIN);
#endif #endif
#endif #endif
#if USE_X_MIN #if HAS_X_MIN
#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
@@ -135,7 +136,7 @@ void setup_endstop_interrupts() {
pciSetup(X_MIN_PIN); pciSetup(X_MIN_PIN);
#endif #endif
#endif #endif
#if USE_Y_MAX #if HAS_Y_MAX
#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
@@ -143,7 +144,7 @@ void setup_endstop_interrupts() {
pciSetup(Y_MAX_PIN); pciSetup(Y_MAX_PIN);
#endif #endif
#endif #endif
#if USE_Y_MIN #if HAS_Y_MIN
#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
@@ -151,7 +152,7 @@ void setup_endstop_interrupts() {
pciSetup(Y_MIN_PIN); pciSetup(Y_MIN_PIN);
#endif #endif
#endif #endif
#if USE_Z_MAX #if HAS_Z_MAX
#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
@@ -159,7 +160,7 @@ void setup_endstop_interrupts() {
pciSetup(Z_MAX_PIN); pciSetup(Z_MAX_PIN);
#endif #endif
#endif #endif
#if USE_Z_MIN #if HAS_Z_MIN
#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
@@ -167,97 +168,97 @@ void setup_endstop_interrupts() {
pciSetup(Z_MIN_PIN); pciSetup(Z_MIN_PIN);
#endif #endif
#endif #endif
#if USE_I_MAX #if HAS_I_MAX
#if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(I_MAX_PIN); _ATTACH(I_MAX_PIN);
#else #else
static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
pciSetup(I_MAX_PIN); pciSetup(I_MAX_PIN);
#endif #endif
#elif USE_I_MIN #elif HAS_I_MIN
#if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(I_MIN_PIN); _ATTACH(I_MIN_PIN);
#else #else
static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
pciSetup(I_MIN_PIN); pciSetup(I_MIN_PIN);
#endif #endif
#endif #endif
#if USE_J_MAX #if HAS_J_MAX
#if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(J_MAX_PIN); _ATTACH(J_MAX_PIN);
#else #else
static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
pciSetup(J_MAX_PIN); pciSetup(J_MAX_PIN);
#endif #endif
#elif USE_J_MIN #elif HAS_J_MIN
#if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(J_MIN_PIN); _ATTACH(J_MIN_PIN);
#else #else
static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
pciSetup(J_MIN_PIN); pciSetup(J_MIN_PIN);
#endif #endif
#endif #endif
#if USE_K_MAX #if HAS_K_MAX
#if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(K_MAX_PIN); _ATTACH(K_MAX_PIN);
#else #else
static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
pciSetup(K_MAX_PIN); pciSetup(K_MAX_PIN);
#endif #endif
#elif USE_K_MIN #elif HAS_K_MIN
#if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(K_MIN_PIN); _ATTACH(K_MIN_PIN);
#else #else
static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
pciSetup(K_MIN_PIN); pciSetup(K_MIN_PIN);
#endif #endif
#endif #endif
#if USE_U_MAX #if HAS_U_MAX
#if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(U_MAX_PIN); _ATTACH(U_MAX_PIN);
#else #else
static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable");
pciSetup(U_MAX_PIN); pciSetup(U_MAX_PIN);
#endif #endif
#elif USE_U_MIN #elif HAS_U_MIN
#if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(U_MIN_PIN); _ATTACH(U_MIN_PIN);
#else #else
static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable");
pciSetup(U_MIN_PIN); pciSetup(U_MIN_PIN);
#endif #endif
#endif #endif
#if USE_V_MAX #if HAS_V_MAX
#if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(V_MAX_PIN); _ATTACH(V_MAX_PIN);
#else #else
static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable");
pciSetup(V_MAX_PIN); pciSetup(V_MAX_PIN);
#endif #endif
#elif USE_V_MIN #elif HAS_V_MIN
#if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(V_MIN_PIN); _ATTACH(V_MIN_PIN);
#else #else
static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable");
pciSetup(V_MIN_PIN); pciSetup(V_MIN_PIN);
#endif #endif
#endif #endif
#if USE_W_MAX #if HAS_W_MAX
#if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
_ATTACH(W_MAX_PIN); _ATTACH(W_MAX_PIN);
#else #else
static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable");
pciSetup(W_MAX_PIN); pciSetup(W_MAX_PIN);
#endif #endif
#elif USE_W_MIN #elif HAS_W_MIN
#if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT) #if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
_ATTACH(W_MIN_PIN); _ATTACH(W_MIN_PIN);
#else #else
static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable");
pciSetup(W_MIN_PIN); pciSetup(W_MIN_PIN);
#endif #endif
#endif #endif
#if USE_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
@@ -265,7 +266,7 @@ void setup_endstop_interrupts() {
pciSetup(X2_MAX_PIN); pciSetup(X2_MAX_PIN);
#endif #endif
#endif #endif
#if USE_X2_MIN #if HAS_X2_MIN
#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
@@ -273,7 +274,7 @@ void setup_endstop_interrupts() {
pciSetup(X2_MIN_PIN); pciSetup(X2_MIN_PIN);
#endif #endif
#endif #endif
#if USE_Y2_MAX #if HAS_Y2_MAX
#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
@@ -281,7 +282,7 @@ void setup_endstop_interrupts() {
pciSetup(Y2_MAX_PIN); pciSetup(Y2_MAX_PIN);
#endif #endif
#endif #endif
#if USE_Y2_MIN #if HAS_Y2_MIN
#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
@@ -289,7 +290,7 @@ void setup_endstop_interrupts() {
pciSetup(Y2_MIN_PIN); pciSetup(Y2_MIN_PIN);
#endif #endif
#endif #endif
#if USE_Z2_MAX #if HAS_Z2_MAX
#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
@@ -297,7 +298,7 @@ void setup_endstop_interrupts() {
pciSetup(Z2_MAX_PIN); pciSetup(Z2_MAX_PIN);
#endif #endif
#endif #endif
#if USE_Z2_MIN #if HAS_Z2_MIN
#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
@@ -305,7 +306,7 @@ void setup_endstop_interrupts() {
pciSetup(Z2_MIN_PIN); pciSetup(Z2_MIN_PIN);
#endif #endif
#endif #endif
#if USE_Z3_MAX #if HAS_Z3_MAX
#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
@@ -313,7 +314,7 @@ void setup_endstop_interrupts() {
pciSetup(Z3_MAX_PIN); pciSetup(Z3_MAX_PIN);
#endif #endif
#endif #endif
#if USE_Z3_MIN #if HAS_Z3_MIN
#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
@@ -321,7 +322,7 @@ void setup_endstop_interrupts() {
pciSetup(Z3_MIN_PIN); pciSetup(Z3_MIN_PIN);
#endif #endif
#endif #endif
#if USE_Z4_MAX #if HAS_Z4_MAX
#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
@@ -329,7 +330,7 @@ void setup_endstop_interrupts() {
pciSetup(Z4_MAX_PIN); pciSetup(Z4_MAX_PIN);
#endif #endif
#endif #endif
#if USE_Z4_MIN #if HAS_Z4_MIN
#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

View File

@@ -23,10 +23,6 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
//#define DEBUG_AVR_FAST_PWM
#define DEBUG_OUT ENABLED(DEBUG_AVR_FAST_PWM)
#include "../../core/debug_out.h"
struct Timer { struct Timer {
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer
@@ -112,15 +108,12 @@ const Timer get_pwm_timer(const pin_t pin) {
} }
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) { void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
DEBUG_ECHOLNPGM("set_pwm_frequency(pin=", pin, ", freq=", f_desired, ")");
const Timer timer = get_pwm_timer(pin); const Timer timer = get_pwm_timer(pin);
if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized
const bool is_timer2 = timer.n == 2; const bool is_timer2 = timer.n == 2;
const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF; const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF;
DEBUG_ECHOLNPGM("maxtop=", maxtop);
uint16_t res = 0xFF; // resolution (TOP value) uint16_t res = 0xFF; // resolution (TOP value)
uint8_t j = CS_NONE; // prescaler index uint8_t j = CS_NONE; // prescaler index
uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
@@ -128,29 +121,23 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
// Calculating the prescaler and resolution to use to achieve closest frequency // Calculating the prescaler and resolution to use to achieve closest frequency
if (f_desired != 0) { if (f_desired != 0) {
constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only
uint16_t f = (F_CPU) / (uint32_t(maxtop) << 11) + 1; // Start with the lowest non-zero frequency achievable (for 16MHz, 1 or 31) uint16_t f = (F_CPU) / (2 * 1024 * maxtop) + 1; // Start with the lowest non-zero frequency achievable (1 or 31)
DEBUG_ECHOLNPGM("f=", f); LOOP_L_N(i, COUNT(prescaler)) { // Loop through all prescaler values
DEBUG_ECHOLNPGM("(prescaler loop)"); const uint16_t p = prescaler[i];
for (uint8_t i = 0; i < COUNT(prescaler); ++i) { // Loop through all prescaler values
const uint32_t p = prescaler[i]; // Extend to 32 bits for calculations
DEBUG_ECHOLNPGM("prescaler[", i, "]=", p);
uint16_t res_fast_temp, res_pc_temp; uint16_t res_fast_temp, res_pc_temp;
if (is_timer2) { if (is_timer2) {
#if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP #if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
const uint16_t rft = (F_CPU) / (p * f_desired); const uint16_t rft = (F_CPU) / (p * f_desired);
res_fast_temp = rft - 1; res_fast_temp = rft - 1;
res_pc_temp = rft / 2; res_pc_temp = rft / 2;
DEBUG_ECHOLNPGM("(Timer2) res_fast_temp=", res_fast_temp, " res_pc_temp=", res_pc_temp);
#else #else
res_fast_temp = res_pc_temp = maxtop; res_fast_temp = res_pc_temp = maxtop;
DEBUG_ECHOLNPGM("(Timer2) res_fast_temp=", maxtop, " res_pc_temp=", maxtop);
#endif #endif
} }
else { else {
if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2 if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
const uint16_t rft = (F_CPU) / (p * f_desired); const uint16_t rft = (F_CPU) / (p * f_desired);
DEBUG_ECHOLNPGM("(Not Timer 2) F_CPU=", STRINGIFY(F_CPU), " prescaler=", p, " f_desired=", f_desired);
res_fast_temp = rft - 1; res_fast_temp = rft - 1;
res_pc_temp = rft / 2; res_pc_temp = rft / 2;
} }
@@ -159,28 +146,24 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
LIMIT(res_pc_temp, 1U, maxtop); LIMIT(res_pc_temp, 1U, maxtop);
// Calculate frequencies of test prescaler and resolution values // Calculate frequencies of test prescaler and resolution values
const uint16_t f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)), const uint32_t f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
f_pc_temp = (F_CPU) / ((p * res_pc_temp) << 1), f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)),
f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired), f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired),
f_pc_temp = (F_CPU) / (2 * p * res_pc_temp),
f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired); f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired);
DEBUG_ECHOLNPGM("f_fast_temp=", f_fast_temp, " f_pc_temp=", f_pc_temp, " f_diff=", f_diff, " f_fast_diff=", f_fast_diff, " f_pc_diff=", f_pc_diff);
if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
// Set the Wave Generation Mode to FAST PWM // Set the Wave Generation Mode to FAST PWM
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn); wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn);
// Remember this combination // Remember this combination
f = f_fast_temp; res = res_fast_temp; j = i + 1; f = f_fast_temp; res = res_fast_temp; j = i + 1;
DEBUG_ECHOLNPGM("(FAST) updated f=", f);
} }
else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
// Set the Wave Generation Mode to PWM PHASE CORRECT // Set the Wave Generation Mode to PWM PHASE CORRECT
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn); wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn);
f = f_pc_temp; res = res_pc_temp; j = i + 1; f = f_pc_temp; res = res_pc_temp; j = i + 1;
DEBUG_ECHOLNPGM("(PHASE) updated f=", f);
} }
} // prescaler loop }
} }
_SET_WGMnQ(timer, wgm); _SET_WGMnQ(timer, wgm);
@@ -232,7 +215,7 @@ void MarlinHAL::init_pwm_timers() {
#endif #endif
}; };
for (uint8_t i = 0; i < COUNT(pwm_pin); ++i) LOOP_L_N(i, COUNT(pwm_pin))
set_pwm_frequency(pwm_pin[i], 1000); set_pwm_frequency(pwm_pin[i], 1000);
} }

View File

@@ -255,6 +255,84 @@ enum ClockSource2 : uint8_t {
#define SET_FOCB(T,V) SET_FOC(T,B,V) #define SET_FOCB(T,V) SET_FOC(T,B,V)
#define SET_FOCC(T,V) SET_FOC(T,C,V) #define SET_FOCC(T,V) SET_FOC(T,C,V)
#if 0
/**
* PWM availability macros
*/
// 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 || P == COOLER_AUTO_FAN_PIN)
#if PIN_EXISTS(CONTROLLER_FAN)
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
#else
#define PWM_CHK_FAN_B(P) _PWM_CHK_FAN_B(P)
#endif
#if ANY_PIN(FAN, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7)
#if PIN_EXISTS(FAN7)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN || P == FAN7_PIN)
#elif PIN_EXISTS(FAN6)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN)
#elif PIN_EXISTS(FAN5)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN)
#elif PIN_EXISTS(FAN4)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN)
#elif PIN_EXISTS(FAN3)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN)
#elif PIN_EXISTS(FAN2)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN)
#elif PIN_EXISTS(FAN1)
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN)
#else
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN)
#endif
#else
#define PWM_CHK_FAN_A(P) false
#endif
#if HAS_MOTOR_CURRENT_PWM
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY)
#elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z)
#else
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E)
#endif
#else
#define PWM_CHK_MOTOR_CURRENT(P) false
#endif
#ifdef NUM_SERVOS
#if AVR_ATmega2560_FAMILY
#define PWM_CHK_SERVO(P) (P == 5 || (NUM_SERVOS > 12 && P == 6) || (NUM_SERVOS > 24 && P == 46)) // PWMS 3A, 4A & 5A
#elif AVR_ATmega2561_FAMILY
#define PWM_CHK_SERVO(P) (P == 5) // PWM3A
#elif AVR_ATmega1284_FAMILY
#define PWM_CHK_SERVO(P) false
#elif AVR_AT90USB1286_FAMILY
#define PWM_CHK_SERVO(P) (P == 16) // PWM3A
#elif AVR_ATmega328_FAMILY
#define PWM_CHK_SERVO(P) false
#endif
#else
#define PWM_CHK_SERVO(P) false
#endif
#if ENABLED(BARICUDA)
#if HAS_HEATER_1 && HAS_HEATER_2
#define PWM_CHK_HEATER(P) (P == HEATER_1_PIN || P == HEATER_2_PIN)
#elif HAS_HEATER_1
#define PWM_CHK_HEATER(P) (P == HEATER_1_PIN)
#endif
#else
#define PWM_CHK_HEATER(P) false
#endif
#define PWM_CHK(P) (PWM_CHK_HEATER(P) || PWM_CHK_SERVO(P) || PWM_CHK_MOTOR_CURRENT(P) || PWM_CHK_FAN_A(P) || PWM_CHK_FAN_B(P))
#endif // PWM_CHK is not used in Marlin
// define which hardware PWMs are available for the current CPU // define which hardware PWMs are available for the current CPU
// all timer 1 PWMS deleted from this list because they are never available // all timer 1 PWMS deleted from this list because they are never available
#if AVR_ATmega2560_FAMILY #if AVR_ATmega2560_FAMILY

View File

@@ -27,41 +27,43 @@
* Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100 * Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100
* Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx * Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx
* Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx * Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx
* Analog Input : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
*/ */
#include "../fastio.h" #include "../fastio.h"
// change for your board
#define DEBUG_LED DIO21
// UART // UART
#define RXD 0 #define RXD DIO0
#define TXD 1 #define TXD DIO1
// SPI // SPI
#define MISO 50 #define SCK DIO52
#define MOSI 51 #define MISO DIO50
#define SCK 52 #define MOSI DIO51
#define SS 53 #define SS DIO53
// TWI (I2C) // TWI (I2C)
#define SCL 21 #define SCL DIO21
#define SDA 20 #define SDA DIO20
// Timers and PWM // Timers and PWM
#define OC0A 13 #define OC0A DIO13
#define OC0B 4 #define OC0B DIO4
#define OC1A 11 #define OC1A DIO11
#define OC1B 12 #define OC1B DIO12
#define OC2A 10 #define OC2A DIO10
#define OC2B 9 #define OC2B DIO9
#define OC3A 5 #define OC3A DIO5
#define OC3B 2 #define OC3B DIO2
#define OC3C 3 #define OC3C DIO3
#define OC4A 6 #define OC4A DIO6
#define OC4B 7 #define OC4B DIO7
#define OC4C 8 #define OC4C DIO8
#define OC5A 46 #define OC5A DIO46
#define OC5B 45 #define OC5B DIO45
#define OC5C 44 #define OC5C DIO44
// Digital I/O // Digital I/O

View File

@@ -30,29 +30,32 @@
#include "../fastio.h" #include "../fastio.h"
// change for your board
#define DEBUG_LED DIO46
// UART // UART
#define RXD 0 #define RXD DIO0
#define TXD 1 #define TXD DIO1
// SPI // SPI
#define SCK 10 #define SCK DIO10
#define MISO 12 #define MISO DIO12
#define MOSI 11 #define MOSI DIO11
#define SS 16 #define SS DIO16
// TWI (I2C) // TWI (I2C)
#define SCL 17 #define SCL DIO17
#define SDA 18 #define SDA DIO18
// Timers and PWM // Timers and PWM
#define OC0A 9 #define OC0A DIO9
#define OC0B 4 #define OC0B DIO4
#define OC1A 7 #define OC1A DIO7
#define OC1B 8 #define OC1B DIO8
#define OC2A 6 #define OC2A DIO6
#define OC3A 5 #define OC3A DIO5
#define OC3B 2 #define OC3B DIO2
#define OC3C 3 #define OC3C DIO3
// Digital I/O // Digital I/O

View File

@@ -30,27 +30,29 @@
#include "../fastio.h" #include "../fastio.h"
#define DEBUG_LED AIO5
// UART // UART
#define RXD 0 #define RXD DIO0
#define TXD 1 #define TXD DIO1
// SPI // SPI
#define SS 10 #define SCK DIO13
#define MOSI 11 #define MISO DIO12
#define MISO 12 #define MOSI DIO11
#define SCK 13 #define SS DIO10
// TWI (I2C) // TWI (I2C)
#define SCL AIO5 #define SCL AIO5
#define SDA AIO4 #define SDA AIO4
// Timers and PWM // Timers and PWM
#define OC0A 6 #define OC0A DIO6
#define OC0B 5 #define OC0B DIO5
#define OC1A 9 #define OC1A DIO9
#define OC1B 10 #define OC1B DIO10
#define OC2A 11 #define OC2A DIO11
#define OC2B 3 #define OC2B DIO3
// Digital I/O // Digital I/O

View File

@@ -56,32 +56,34 @@
#include "../fastio.h" #include "../fastio.h"
// UART #define DEBUG_LED DIO0
#define RXD 8
#define TXD 9
#define RXD0 8
#define TXD0 9
#define RXD1 10 // UART
#define TXD1 11 #define RXD DIO8
#define TXD DIO9
#define RXD0 DIO8
#define TXD0 DIO9
#define RXD1 DIO10
#define TXD1 DIO11
// SPI // SPI
#define SS 4 #define SCK DIO7
#define MOSI 5 #define MISO DIO6
#define MISO 6 #define MOSI DIO5
#define SCK 7 #define SS DIO4
// TWI (I2C) // TWI (I2C)
#define SCL 16 #define SCL DIO16
#define SDA 17 #define SDA DIO17
// Timers and PWM // Timers and PWM
#define OC0A 3 #define OC0A DIO3
#define OC0B 4 #define OC0B DIO4
#define OC1A 13 #define OC1A DIO13
#define OC1B 12 #define OC1B DIO12
#define OC2A 15 #define OC2A DIO15
#define OC2B 14 #define OC2B DIO14
// Digital I/O // Digital I/O

View File

@@ -31,11 +31,14 @@
#include "../fastio.h" #include "../fastio.h"
// change for your board
#define DEBUG_LED DIO31 /* led D5 red */
// SPI // SPI
#define SS 20 // 8 #define SCK DIO21 // 9
#define SCK 21 // 9 #define MISO DIO23 // 11
#define MOSI 22 // 10 #define MOSI DIO22 // 10
#define MISO 23 // 11 #define SS DIO20 // 8
// Digital I/O // Digital I/O
@@ -676,6 +679,7 @@
#define PF7_PWM 0 #define PF7_PWM 0
#define PF7_DDR DDRF #define PF7_DDR DDRF
/** /**
* Some of the pin mapping functions of the Teensduino extension to the Arduino IDE * Some of the pin mapping functions of the Teensduino extension to the Arduino IDE
* do not function the same as the other Arduino extensions. * do not function the same as the other Arduino extensions.

View File

@@ -21,6 +21,6 @@
*/ */
#pragma once #pragma once
#ifndef SERIAL_PORT #if HAS_SPI_TFT || HAS_FSMC_TFT
#define SERIAL_PORT 0 #error "Sorry! TFT displays are not available for HAL/AVR."
#endif #endif

View File

@@ -25,10 +25,6 @@
* Test AVR-specific configuration values for errors at compile-time. * Test AVR-specific configuration values for errors at compile-time.
*/ */
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/AVR."
#endif
/** /**
* Check for common serial pin conflicts * Check for common serial pin conflicts
*/ */
@@ -39,26 +35,24 @@
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \ || X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \ || X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \ || X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
|| BTN_EN1 == N || BTN_EN2 == N || LCD_PINS_EN == N \ || BTN_EN1 == N || BTN_EN2 == N \
) )
#if SERIAL_IN_USE(0) #if CONF_SERIAL_IS(0)
// D0-D1. No known conflicts. // D0-D1. No known conflicts.
#endif #endif
#if SERIAL_IN_USE(1) #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) #if CONF_SERIAL_IS(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
#if CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19)
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board." #error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
#endif #endif
#else #else
#if CHECK_SERIAL_PIN(10) || CHECK_SERIAL_PIN(11) #if CONF_SERIAL_IS(1) && (CHECK_SERIAL_PIN(10) || CHECK_SERIAL_PIN(11))
#error "Serial Port 1 pin D10 and/or D11 conflicts with another pin on the board." #error "Serial Port 1 pin D10 and/or D11 conflicts with another pin on the board."
#endif #endif
#endif
#endif #endif
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17)) #if CONF_SERIAL_IS(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board." #error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
#endif #endif
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15)) #if CONF_SERIAL_IS(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board." #error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
#endif #endif
#undef CHECK_SERIAL_PIN #undef CHECK_SERIAL_PIN
@@ -73,8 +67,8 @@
/** /**
* Checks for SOFT PWM * Checks for SOFT PWM
*/ */
#if HAS_FAN0 && FAN0_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER) #if HAS_FAN0 && FAN_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER)
#error "FAN0_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)." #error "FAN_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)."
#error "Disable SPEAKER or enable FAN_SOFT_PWM." #error "Disable SPEAKER or enable FAN_SOFT_PWM."
#endif #endif
@@ -95,11 +89,11 @@
/** /**
* The Trinamic library includes SoftwareSerial.h, leading to a compile error. * The Trinamic library includes SoftwareSerial.h, leading to a compile error.
*/ */
#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE) #if 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 ALL(HAS_TMC_SW_SERIAL, 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

View File

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

View File

@@ -64,25 +64,23 @@
#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0) #define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
#if AVR_ATmega1284_FAMILY #if AVR_ATmega1284_FAMILY
#define IS_ANALOG(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0)) #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P))
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(IS_ANALOG(P) ? (P) - analogInputToDigitalPin(7) : -1) #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0))
#else #else
#define _ANALOG1(P) WITHIN(P, analogInputToDigitalPin(0), analogInputToDigitalPin(7)) #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0))
#define _ANALOG2(P) WITHIN(P, analogInputToDigitalPin(8), analogInputToDigitalPin(15)) #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7)))
#define IS_ANALOG(P) (_ANALOG1(P) || _ANALOG2(P))
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
#endif #endif
#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin #define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
void PRINT_ARRAY_NAME(uint8_t x) { void PRINT_ARRAY_NAME(uint8_t x) {
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name); PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) { LOOP_L_N(y, MAX_NAME_LENGTH) {
char temp_char = pgm_read_byte(name_mem_pointer + y); char temp_char = pgm_read_byte(name_mem_pointer + y);
if (temp_char != 0) if (temp_char != 0)
SERIAL_CHAR(temp_char); SERIAL_CHAR(temp_char);
else { else {
for (uint8_t i = 0; i < MAX_NAME_LENGTH - y; ++i) SERIAL_CHAR(' '); LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' ');
break; break;
} }
} }
@@ -90,6 +88,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital) #define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital)
#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of #if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of
#undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it #undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it
#define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog #define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog
@@ -109,7 +108,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
* Print a pin's PWM status. * Print a pin's PWM status.
* Return true if it's currently a PWM pin. * Return true if it's currently a PWM pin.
*/ */
bool pwm_status(uint8_t pin) { static bool pwm_status(uint8_t pin) {
char buffer[20]; // for the sprintf statements char buffer[20]; // for the sprintf statements
switch (digitalPinToTimer_DEBUG(pin)) { switch (digitalPinToTimer_DEBUG(pin)) {
@@ -163,6 +162,7 @@ bool pwm_status(uint8_t pin) {
SERIAL_ECHO_SP(2); SERIAL_ECHO_SP(2);
} // pwm_status } // pwm_status
const volatile uint8_t* const PWM_other[][3] PROGMEM = { const volatile uint8_t* const PWM_other[][3] PROGMEM = {
{ &TCCR0A, &TCCR0B, &TIMSK0 }, { &TCCR0A, &TCCR0B, &TIMSK0 },
{ &TCCR1A, &TCCR1B, &TIMSK1 }, { &TCCR1A, &TCCR1B, &TIMSK1 },
@@ -180,6 +180,7 @@ const volatile uint8_t* const PWM_other[][3] PROGMEM = {
#endif #endif
}; };
const volatile uint8_t* const PWM_OCR[][3] PROGMEM = { const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
#ifdef TIMER0A #ifdef TIMER0A
@@ -215,6 +216,7 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
#endif #endif
}; };
#define TCCR_A(T) pgm_read_word(&PWM_other[T][0]) #define TCCR_A(T) pgm_read_word(&PWM_other[T][0])
#define TCCR_B(T) pgm_read_word(&PWM_other[T][1]) #define TCCR_B(T) pgm_read_word(&PWM_other[T][1])
#define TIMSK(T) pgm_read_word(&PWM_other[T][2]) #define TIMSK(T) pgm_read_word(&PWM_other[T][2])
@@ -229,12 +231,12 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L]) #define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L])
void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); } static void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); }
void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); } static void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); }
void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); } static void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); }
void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); } static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); }
void com_print(const uint8_t N, const uint8_t Z) { inline void com_print(const uint8_t N, const uint8_t Z) {
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
SERIAL_ECHOPGM(" COM", AS_DIGIT(N)); SERIAL_ECHOPGM(" COM", AS_DIGIT(N));
SERIAL_CHAR(Z); SERIAL_CHAR(Z);
@@ -276,7 +278,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
if (TEST(*TMSK, TOIE)) err_prob_interrupt(); if (TEST(*TMSK, TOIE)) err_prob_interrupt();
} }
void pwm_details(uint8_t pin) { static void pwm_details(uint8_t pin) {
switch (digitalPinToTimer_DEBUG(pin)) { switch (digitalPinToTimer_DEBUG(pin)) {
#if ABTEST(0) #if ABTEST(0)
@@ -350,13 +352,15 @@ void pwm_details(uint8_t pin) {
} // pwm_details } // pwm_details
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs #ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
int digitalRead_mod(const pin_t pin) { // same as digitalRead except the PWM stop section has been removed int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed
const uint8_t port = digitalPinToPort_DEBUG(pin); const uint8_t port = digitalPinToPort_DEBUG(pin);
return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW; return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW;
} }
#endif #endif
void print_port(const pin_t pin) { // print port number #ifndef PRINT_PORT
void print_port(int8_t pin) { // print port number
#ifdef digitalPinToPort_DEBUG #ifdef digitalPinToPort_DEBUG
uint8_t x; uint8_t x;
SERIAL_ECHOPGM(" Port: "); SERIAL_ECHOPGM(" Port: ");
@@ -384,7 +388,11 @@ void print_port(const pin_t pin) { // print port number
#else #else
SERIAL_ECHO_SP(10); SERIAL_ECHO_SP(10);
#endif #endif
} }
#define PRINT_PORT(p) print_port(p)
#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) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)

View File

@@ -22,10 +22,11 @@
#pragma once #pragma once
// //
// Some of the pin mapping functions of the Arduino IDE Teensduino extension // some of the pin mapping functions of the Teensduino extension to the Arduino IDE
// function differently from other Arduino extensions. // do not function the same as the other Arduino extensions
// //
#define TEENSYDUINO_IDE #define TEENSYDUINO_IDE
//digitalPinToTimer(pin) function works like Arduino but Timers are not defined //digitalPinToTimer(pin) function works like Arduino but Timers are not defined
@@ -47,6 +48,8 @@
#define PE 5 #define PE 5
#define PF 6 #define PF 6
#undef digitalPinToPort
const uint8_t PROGMEM digital_pin_to_port_PGM[] = { const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PD, // 0 - PD0 - INT0 - PWM PD, // 0 - PD0 - INT0 - PWM
PD, // 1 - PD1 - INT1 - PWM PD, // 1 - PD1 - INT1 - PWM
@@ -98,7 +101,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PE, // 47 - PE3 (not defined in teensyduino) PE, // 47 - PE3 (not defined in teensyduino)
}; };
#define digitalPinToPort(P) pgm_read_byte(digital_pin_to_port_PGM[P]) #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
// digitalPinToBitMask(pin) is OK // digitalPinToBitMask(pin) is OK

View File

@@ -231,6 +231,7 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) ) #define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
// TIMERS // TIMERS
// ------------------------ // ------------------------

View File

@@ -1,9 +1,7 @@
/** /**
* 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]
* * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* 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
@@ -46,13 +44,13 @@ typedef uint16_t hal_timer_t;
#define MF_TIMER_TEMP 0 #define MF_TIMER_TEMP 0
#endif #endif
#define TEMP_TIMER_FREQUENCY (((F_CPU) + 0x2000) / 0x4000) #define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
#define STEPPER_TIMER_RATE HAL_TIMER_RATE #define STEPPER_TIMER_RATE HAL_TIMER_RATE
#define STEPPER_TIMER_PRESCALE 8 #define STEPPER_TIMER_PRESCALE 8
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE #define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE #define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US #define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US

View File

@@ -88,7 +88,7 @@ void u8g_spiSend_sw_AVR_mode_0(uint8_t val) {
volatile uint8_t *outData = u8g_outData, volatile uint8_t *outData = u8g_outData,
*outClock = u8g_outClock; *outClock = u8g_outClock;
U8G_ATOMIC_START(); U8G_ATOMIC_START();
for (uint8_t i = 0; i < 8; ++i) { LOOP_L_N(i, 8) {
if (val & 0x80) if (val & 0x80)
*outData |= bitData; *outData |= bitData;
else else
@@ -108,7 +108,7 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
volatile uint8_t *outData = u8g_outData, volatile uint8_t *outData = u8g_outData,
*outClock = u8g_outClock; *outClock = u8g_outClock;
U8G_ATOMIC_START(); U8G_ATOMIC_START();
for (uint8_t i = 0; i < 8; ++i) { LOOP_L_N(i, 8) {
*outClock &= bitNotClock; *outClock &= bitNotClock;
if (val & 0x80) if (val & 0x80)
*outData |= bitData; *outData |= bitData;
@@ -120,6 +120,7 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
U8G_ATOMIC_END(); U8G_ATOMIC_END();
} }
#if ENABLED(FYSETC_MINI_12864) #if ENABLED(FYSETC_MINI_12864)
#define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3 #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3
#else #else

View File

@@ -1,9 +1,7 @@
/** /**
* 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]
* * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* 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
@@ -47,7 +45,7 @@ uint16_t MarlinHAL::adc_result;
#endif #endif
void MarlinHAL::init() { void MarlinHAL::init() {
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
#endif #endif
usb_task_init(); // Initialize the USB stack usb_task_init(); // Initialize the USB stack

View File

@@ -1,9 +1,9 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
* *
* 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
@@ -123,7 +123,7 @@ typedef Servo hal_servo_t;
// //
// ADC // ADC
// //
#define HAL_ADC_VREF_MV 3300 #define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION 10 #define HAL_ADC_RESOLUTION 10
#ifndef analogInputToDigitalPin #ifndef analogInputToDigitalPin
@@ -210,7 +210,7 @@ public:
static void adc_init() {} static void adc_init() {}
// Called by Temperature::init for each sensor at startup // Called by Temperature::init for each sensor at startup
static void adc_enable(const uint8_t /*ch*/) {} static void adc_enable(const uint8_t ch) {}
// Begin ADC sampling on the given channel. Called from Temperature::isr! // Begin ADC sampling on the given channel. Called from Temperature::isr!
static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); } static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); }

View File

@@ -42,7 +42,7 @@
// Public functions // Public functions
// ------------------------ // ------------------------
#if ANY(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI) #if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI)
// ------------------------ // ------------------------
// Software SPI // Software SPI
@@ -247,12 +247,12 @@
b <<= 1; // little setup time b <<= 1; // little setup time
WRITE(SD_SCK_PIN, HIGH); WRITE(SD_SCK_PIN, HIGH);
DELAY_NS_VAR(spiDelayNS); DELAY_NS(spiDelayNS);
b |= (READ(SD_MISO_PIN) != 0); b |= (READ(SD_MISO_PIN) != 0);
WRITE(SD_SCK_PIN, LOW); WRITE(SD_SCK_PIN, LOW);
DELAY_NS_VAR(spiDelayNS); DELAY_NS(spiDelayNS);
} while (--bits); } while (--bits);
return b; return b;
} }

View File

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

View File

@@ -474,6 +474,7 @@ void MarlinSerial<Cfg>::flushTX() {
} }
} }
// If not using the USB port as serial port // If not using the USB port as serial port
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 #if defined(SERIAL_PORT) && SERIAL_PORT >= 0
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >; template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;

View File

@@ -30,7 +30,6 @@
#include <WString.h> #include <WString.h>
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#include "../../core/types.h"
#include "../../core/serial_hook.h" #include "../../core/serial_hook.h"
// Define constants and variables for buffering incoming serial data. We're // Define constants and variables for buffering incoming serial data. We're
@@ -53,6 +52,10 @@
// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." // #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256."
//#endif //#endif
// Templated type selector
template<bool b, typename T, typename F> struct TypeSelector { typedef T type;} ;
template<typename T, typename F> struct TypeSelector<false, T, F> { typedef F type; };
// Templated structure wrapper // Templated structure wrapper
template<typename S, unsigned int addr> struct StructWrapper { template<typename S, unsigned int addr> struct StructWrapper {
constexpr StructWrapper(int) {} constexpr StructWrapper(int) {}
@@ -73,7 +76,7 @@ protected:
static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT]; static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT];
// Base size of type on buffer size // Base size of type on buffer size
typedef uvalue_t(Cfg::RX_SIZE - 1) ring_buffer_pos_t; typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t;
struct ring_buffer_r { struct ring_buffer_r {
volatile ring_buffer_pos_t head, tail; volatile ring_buffer_pos_t head, tail;

View File

@@ -73,7 +73,7 @@ void install_min_serial() {
} }
#if DISABLED(DYNAMIC_VECTORTABLE) #if DISABLED(DYNAMIC_VECTORTABLE)
extern "C" { extern "C" {
__attribute__((naked)) void JumpHandler_ASM() { __attribute__((naked)) void JumpHandler_ASM() {
__asm__ __volatile__ ( __asm__ __volatile__ (
"b CommonHandler_ASM\n" "b CommonHandler_ASM\n"
@@ -84,7 +84,7 @@ void install_min_serial() {
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler(); void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler(); void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler(); void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
} }
#endif #endif
#endif // POSTMORTEM_DEBUGGING #endif // POSTMORTEM_DEBUGGING

View File

@@ -81,7 +81,7 @@ Pio *SCK_pPio, *MOSI_pPio;
uint32_t SCK_dwMask, MOSI_dwMask; uint32_t SCK_dwMask, MOSI_dwMask;
void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
for (uint8_t i = 0; i < 8; ++i) { LOOP_L_N(i, 8) {
if (val & 0x80) if (val & 0x80)
MOSI_pPio->PIO_SODR = MOSI_dwMask; MOSI_pPio->PIO_SODR = MOSI_dwMask;
else else
@@ -95,7 +95,7 @@ void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
} }
void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
for (uint8_t i = 0; i < 8; ++i) { LOOP_L_N(i, 8) {
SCK_pPio->PIO_CODR = SCK_dwMask; SCK_pPio->PIO_CODR = SCK_dwMask;
DELAY_NS(50); DELAY_NS(50);
if (val & 0x80) if (val & 0x80)

View File

@@ -1,9 +1,10 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -291,7 +292,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
uint32_t *p1 = (uint32_t*)addrflash; uint32_t *p1 = (uint32_t*)addrflash;
uint32_t *p2 = (uint32_t*)data; uint32_t *p2 = (uint32_t*)data;
int count = 0; int count = 0;
for (i = 0; i < PageSize >> 2; i++) { for (i =0; i<PageSize >> 2; i++) {
if (p1[i] != p2[i]) { if (p1[i] != p2[i]) {
uint32_t delta = p1[i] ^ p2[i]; uint32_t delta = p1[i] ^ p2[i];
while (delta) { while (delta) {

View File

@@ -1,9 +1,10 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -47,33 +47,33 @@ 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)
TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN)); TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
} }

View File

@@ -189,12 +189,12 @@
*/ */
// UART // UART
#define RXD 0 #define RXD DIO0
#define TXD 1 #define TXD DIO1
// TWI (I2C) // TWI (I2C)
#define SCL 21 #define SCL DIO21
#define SDA 20 #define SDA DIO20
/** /**
* pins * pins

View File

@@ -49,6 +49,7 @@ extern volatile uint32_t *SODR_A, *SODR_B, *CODR_A, *CODR_B;
#define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) } #define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) }
#define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \ #define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \
PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \ PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \
PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \ PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \
@@ -62,7 +63,7 @@ extern PWM_map ISR_table[NUM_PWMS];
extern uint32_t motor_current_setting[3]; extern uint32_t motor_current_setting[3];
#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4) #define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4)
#define COPY_ACTIVE_TABLE() do{ for (uint8_t i = 0; i < 6; ++i) work_table[i] = active_table[i]; }while(0) #define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0)
#define PWM_MR0 19999 // base repetition rate minus one count - 20mS #define PWM_MR0 19999 // base repetition rate minus one count - 20mS
#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output #define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output

View File

@@ -168,6 +168,7 @@ const G2_PinDescription G2_g_APinDescription[] = {
{ PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52
{ PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53
// 54 .. 65 - Analog pins // 54 .. 65 - Analog pins
// ---------------------- // ----------------------
{ PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0

View File

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

View File

@@ -23,6 +23,6 @@
#if USE_FALLBACK_EEPROM #if USE_FALLBACK_EEPROM
#define FLASH_EEPROM_EMULATION #define FLASH_EEPROM_EMULATION
#elif ANY(I2C_EEPROM, SPI_EEPROM) #elif EITHER(I2C_EEPROM, SPI_EEPROM)
#define USE_SHARED_EEPROM 1 #define USE_SHARED_EEPROM 1
#endif #endif

View File

@@ -25,10 +25,6 @@
* Test Arduino Due specific configuration values for errors at compile-time. * Test Arduino Due specific configuration values for errors at compile-time.
*/ */
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/DUE."
#endif
/** /**
* Check for common serial pin conflicts * Check for common serial pin conflicts
*/ */
@@ -40,15 +36,15 @@
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \ || X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \ || X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
) )
#if SERIAL_IN_USE(0) // D0-D1. No known conflicts. #if CONF_SERIAL_IS(0) // D0-D1. No known conflicts.
#endif #endif
#if SERIAL_IN_USE(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19)) #if CONF_SERIAL_IS(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board." #error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
#endif #endif
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17)) #if CONF_SERIAL_IS(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board." #error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
#endif #endif
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15)) #if CONF_SERIAL_IS(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board." #error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
#endif #endif
#undef CHECK_SERIAL_PIN #undef CHECK_SERIAL_PIN
@@ -68,19 +64,20 @@
* 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.
*/ */
#if HAS_MEDIA && HAS_DRIVER(TMC2130) #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))
#define _IS_HW_SPI(P) (defined(TMC_SPI_##P) && (TMC_SPI_##P == SD_MOSI_PIN || TMC_SPI_##P == SD_MISO_PIN || TMC_SPI_##P == SD_SCK_PIN))
#if DISABLED(DUE_SOFTWARE_SPI) && ENABLED(TMC_USE_SW_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK)) #if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
#if ENABLED(TMC_USE_SW_SPI)
#if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK))
#error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs." #error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs."
#endif #endif
#if ENABLED(DUE_SOFTWARE_SPI) && DISABLED(TMC_USE_SW_SPI) #elif ENABLED(DUE_SOFTWARE_SPI)
#error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix." #error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix."
#endif #endif
#undef _IS_HW_SPI
#endif #endif
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported for HAL/DUE." #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

View File

@@ -64,12 +64,13 @@
#define NUMBER_PINS_TOTAL PINS_COUNT #define NUMBER_PINS_TOTAL PINS_COUNT
#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin #define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
#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 PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
#define GET_ARRAY_PIN(p) pin_array[p].pin #define GET_ARRAY_PIN(p) pin_array[p].pin
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital #define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
#define VALID_PIN(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL)) #define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) #define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1))) #define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \ #define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
@@ -92,8 +93,6 @@ void pwm_details(int32_t pin) {
} }
} }
void print_port(const pin_t) {}
/** /**
* DUE Board pin | PORT | Label * DUE Board pin | PORT | Label
* ----------------+--------+------- * ----------------+--------+-------

View File

@@ -24,7 +24,7 @@
/** /**
* Define SPI Pins: SCK, MISO, MOSI, SS * Define SPI Pins: SCK, MISO, MOSI, SS
* *
* Available chip select pins for HW SPI are 4 10 52 77 87 * Available chip select pins for HW SPI are 4 10 52 77
*/ */
#if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87 #if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87
#if SDSS == 4 #if SDSS == 4

View File

@@ -1,9 +1,9 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
* *
* 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

View File

@@ -1,9 +1,8 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
* Based on Sprinter and grbl. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* *
* 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

View File

@@ -142,6 +142,7 @@
*/ */
#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack()) #define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack())
/** /**
* \brief Set aligned boundary. * \brief Set aligned boundary.
*/ */
@@ -282,6 +283,7 @@ typedef double F64; //!< 64-bit floating-point number.
typedef uint32_t iram_size_t; typedef uint32_t iram_size_t;
//! @} //! @}
/*! \name Status Types /*! \name Status Types
*/ */
//! @{ //! @{
@@ -289,6 +291,7 @@ typedef bool Status_bool_t; //!< Boolean status.
typedef U8 Status_t; //!< 8-bit-coded status. typedef U8 Status_t; //!< 8-bit-coded status.
//! @} //! @}
/*! \name Aliasing Aggregate Types /*! \name Aliasing Aggregate Types
*/ */
//! @{ //! @{
@@ -459,6 +462,7 @@ typedef struct
#endif #endif
//! @} //! @}
#ifndef __ASSEMBLY__ // not for assembling. #ifndef __ASSEMBLY__ // not for assembling.
//! \name Optimization Control //! \name Optimization Control
@@ -577,6 +581,7 @@ typedef struct
//! @} //! @}
/*! \name Zero-Bit Counting /*! \name Zero-Bit Counting
* *
* Under GCC, __builtin_clz and __builtin_ctz behave like macros when * Under GCC, __builtin_clz and __builtin_ctz behave like macros when
@@ -687,6 +692,7 @@ typedef struct
//! @} //! @}
/*! \name Bit Reversing /*! \name Bit Reversing
*/ */
//! @{ //! @{
@@ -726,6 +732,7 @@ typedef struct
//! @} //! @}
/*! \name Alignment /*! \name Alignment
*/ */
//! @{ //! @{
@@ -791,6 +798,7 @@ typedef struct
*/ */
#define Long_call(addr) ((*(void (*)(void))(addr))()) #define Long_call(addr) ((*(void (*)(void))(addr))())
/*! \name MCU Endianism Handling /*! \name MCU Endianism Handling
* ARM is MCU little endianism. * ARM is MCU little endianism.
*/ */
@@ -860,6 +868,7 @@ typedef struct
#define CPU_TO_BE32(x) swap32(x) #define CPU_TO_BE32(x) swap32(x)
//! @} //! @}
/*! \name Endianism Conversion /*! \name Endianism Conversion
* *
* The same considerations as for clz and ctz apply here but GCC's * The same considerations as for clz and ctz apply here but GCC's
@@ -946,6 +955,7 @@ typedef struct
//! @} //! @}
/*! \name Target Abstraction /*! \name Target Abstraction
*/ */
//! @{ //! @{
@@ -987,6 +997,7 @@ typedef U8 Byte; //!< 8-bit unsigned integer.
#endif // #ifndef __ASSEMBLY__ #endif // #ifndef __ASSEMBLY__
#ifdef __ICCARM__ #ifdef __ICCARM__
#define SHORTENUM __packed #define SHORTENUM __packed
#elif defined(__GNUC__) #elif defined(__GNUC__)

View File

@@ -81,6 +81,7 @@
#define LUN_0_NAME "\"SD/MMC Card\"" #define LUN_0_NAME "\"SD/MMC Card\""
//! @} //! @}
/*! \name Actions Associated with Memory Accesses /*! \name Actions Associated with Memory Accesses
* *
* Write here the action to associate with each memory access. * Write here the action to associate with each memory access.
@@ -111,4 +112,5 @@
#define GLOBAL_WR_PROTECT false //!< Management of a global write protection. #define GLOBAL_WR_PROTECT false //!< Management of a global write protection.
//! @} //! @}
#endif // _CONF_ACCESS_H_ #endif // _CONF_ACCESS_H_

View File

@@ -96,4 +96,5 @@
// - UPLL frequency: 480MHz // - UPLL frequency: 480MHz
// - USB clock: 480 / 1 = 480MHz // - USB clock: 480 / 1 = 480MHz
#endif /* CONF_CLOCK_H_INCLUDED */ #endif /* CONF_CLOCK_H_INCLUDED */

View File

@@ -88,6 +88,7 @@
#endif #endif
//@} //@}
/** /**
* USB Device Callbacks definitions (Optional) * USB Device Callbacks definitions (Optional)
* @{ * @{
@@ -100,7 +101,7 @@
#define USB_DEVICE_SPECIFIC_REQUEST() usb_task_other_requests() #define USB_DEVICE_SPECIFIC_REQUEST() usb_task_other_requests()
//@} //@}
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
/** /**
* USB Device low level configuration * USB Device low level configuration
* When only one interface is used, these configurations are defined by the class module. * When only one interface is used, these configurations are defined by the class module.
@@ -149,6 +150,7 @@
//@} //@}
/** /**
* USB Interface Configuration * USB Interface Configuration
* @{ * @{
@@ -183,7 +185,7 @@
//! Enable id string of interface to add an extra USB string //! Enable id string of interface to add an extra USB string
#define UDI_CDC_IAD_STRING_ID 4 #define UDI_CDC_IAD_STRING_ID 4
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
/** /**
* USB CDC low level configuration * USB CDC low level configuration
* In standalone these configurations are defined by the CDC module. * In standalone these configurations are defined by the CDC module.
@@ -208,6 +210,7 @@
//@} //@}
//@} //@}
/** /**
* Configuration of MSC interface * Configuration of MSC interface
* @{ * @{
@@ -242,6 +245,7 @@
//@} //@}
/** /**
* Description of Composite Device * Description of Composite Device
* @{ * @{

View File

@@ -68,6 +68,7 @@
#endif #endif
#include "ctrl_access.h" #include "ctrl_access.h"
//_____ D E F I N I T I O N S ______________________________________________ //_____ D E F I N I T I O N S ______________________________________________
#ifdef FREERTOS_USED #ifdef FREERTOS_USED
@@ -111,6 +112,7 @@ static xSemaphoreHandle ctrl_access_semphr = NULL;
#endif // FREERTOS_USED #endif // FREERTOS_USED
#if MAX_LUN #if MAX_LUN
/*! \brief Initializes an entry of the LUN descriptor table. /*! \brief Initializes an entry of the LUN descriptor table.
@@ -240,14 +242,17 @@ static const struct
#endif #endif
#if GLOBAL_WR_PROTECT == true #if GLOBAL_WR_PROTECT == true
bool g_wr_protect; bool g_wr_protect;
#endif #endif
/*! \name Control Interface /*! \name Control Interface
*/ */
//! @{ //! @{
#ifdef FREERTOS_USED #ifdef FREERTOS_USED
bool ctrl_access_init(void) bool ctrl_access_init(void)
@@ -265,6 +270,7 @@ bool ctrl_access_init(void)
return true; return true;
} }
/*! \brief Locks accesses to LUNs. /*! \brief Locks accesses to LUNs.
* *
* \return \c true if the access was successfully locked, else \c false. * \return \c true if the access was successfully locked, else \c false.
@@ -282,6 +288,7 @@ static bool ctrl_access_lock(void)
#endif // FREERTOS_USED #endif // FREERTOS_USED
U8 get_nb_lun(void) U8 get_nb_lun(void)
{ {
#if MEM_USB == ENABLE #if MEM_USB == ENABLE
@@ -302,11 +309,13 @@ U8 get_nb_lun(void)
#endif #endif
} }
U8 get_cur_lun(void) U8 get_cur_lun(void)
{ {
return LUN_ID_0; return LUN_ID_0;
} }
Ctrl_status mem_test_unit_ready(U8 lun) Ctrl_status mem_test_unit_ready(U8 lun)
{ {
Ctrl_status status; Ctrl_status status;
@@ -328,6 +337,7 @@ Ctrl_status mem_test_unit_ready(U8 lun)
return status; return status;
} }
Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector)
{ {
Ctrl_status status; Ctrl_status status;
@@ -349,6 +359,7 @@ Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector)
return status; return status;
} }
U8 mem_sector_size(U8 lun) U8 mem_sector_size(U8 lun)
{ {
U8 sector_size; U8 sector_size;
@@ -370,6 +381,7 @@ U8 mem_sector_size(U8 lun)
return sector_size; return sector_size;
} }
bool mem_unload(U8 lun, bool unload) bool mem_unload(U8 lun, bool unload)
{ {
bool unloaded; bool unloaded;
@@ -421,6 +433,7 @@ bool mem_wr_protect(U8 lun)
return wr_protect; return wr_protect;
} }
bool mem_removal(U8 lun) bool mem_removal(U8 lun)
{ {
bool removal; bool removal;
@@ -445,6 +458,7 @@ bool mem_removal(U8 lun)
return removal; return removal;
} }
const char *mem_name(U8 lun) const char *mem_name(U8 lun)
{ {
#if MAX_LUN==0 #if MAX_LUN==0
@@ -461,14 +475,17 @@ const char *mem_name(U8 lun)
#endif #endif
} }
//! @} //! @}
#if ACCESS_USB == true #if ACCESS_USB == true
/*! \name MEM <-> USB Interface /*! \name MEM <-> USB Interface
*/ */
//! @{ //! @{
Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector)
{ {
Ctrl_status status; Ctrl_status status;
@@ -488,6 +505,7 @@ Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector)
return status; return status;
} }
Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector)
{ {
Ctrl_status status; Ctrl_status status;
@@ -507,16 +525,19 @@ Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector)
return status; return status;
} }
//! @} //! @}
#endif // ACCESS_USB == true #endif // ACCESS_USB == true
#if ACCESS_MEM_TO_RAM == true #if ACCESS_MEM_TO_RAM == true
/*! \name MEM <-> RAM Interface /*! \name MEM <-> RAM Interface
*/ */
//! @{ //! @{
Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram)
{ {
Ctrl_status status; Ctrl_status status;
@@ -543,6 +564,7 @@ Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram)
return status; return status;
} }
Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram)
{ {
Ctrl_status status; Ctrl_status status;
@@ -569,16 +591,19 @@ Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram)
return status; return status;
} }
//! @} //! @}
#endif // ACCESS_MEM_TO_RAM == true #endif // ACCESS_MEM_TO_RAM == true
#if ACCESS_STREAM == true #if ACCESS_STREAM == true
/*! \name Streaming MEM <-> MEM Interface /*! \name Streaming MEM <-> MEM Interface
*/ */
//! @{ //! @{
#if ACCESS_MEM_TO_MEM == true #if ACCESS_MEM_TO_MEM == true
#include "fat.h" #include "fat.h"
@@ -600,18 +625,21 @@ Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_ad
#endif // ACCESS_MEM_TO_MEM == true #endif // ACCESS_MEM_TO_MEM == true
Ctrl_status stream_state(U8 id) Ctrl_status stream_state(U8 id)
{ {
UNUSED(id); UNUSED(id);
return CTRL_GOOD; return CTRL_GOOD;
} }
U16 stream_stop(U8 id) U16 stream_stop(U8 id)
{ {
UNUSED(id); UNUSED(id);
return 0; return 0;
} }
//! @} //! @}
#endif // ACCESS_STREAM #endif // ACCESS_STREAM

View File

@@ -56,6 +56,7 @@
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a> * Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
*/ */
#ifndef _CTRL_ACCESS_H_ #ifndef _CTRL_ACCESS_H_
#define _CTRL_ACCESS_H_ #define _CTRL_ACCESS_H_
@@ -88,6 +89,7 @@ typedef enum
CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed.
} Ctrl_status; } Ctrl_status;
// FYI: Each Logical Unit Number (LUN) corresponds to a memory. // FYI: Each Logical Unit Number (LUN) corresponds to a memory.
// Check LUN defines. // Check LUN defines.
@@ -134,6 +136,7 @@ typedef enum
#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). #define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage).
//! @} //! @}
// Include LUN header files. // Include LUN header files.
#if LUN_0 == ENABLE #if LUN_0 == ENABLE
#include LUN_0_INCLUDE #include LUN_0_INCLUDE
@@ -163,11 +166,13 @@ typedef enum
#include LUN_USB_INCLUDE #include LUN_USB_INCLUDE
#endif #endif
// Check the configuration of write protection in conf_access.h. // Check the configuration of write protection in conf_access.h.
#ifndef GLOBAL_WR_PROTECT #ifndef GLOBAL_WR_PROTECT
#error GLOBAL_WR_PROTECT must be defined as true or false in conf_access.h #error GLOBAL_WR_PROTECT must be defined as true or false in conf_access.h
#endif #endif
#if GLOBAL_WR_PROTECT == true #if GLOBAL_WR_PROTECT == true
//! Write protect. //! Write protect.
@@ -175,6 +180,7 @@ extern bool g_wr_protect;
#endif #endif
/*! \name Control Interface /*! \name Control Interface
*/ */
//! @{ //! @{
@@ -273,6 +279,7 @@ extern const char *mem_name(U8 lun);
//! @} //! @}
#if ACCESS_USB == true #if ACCESS_USB == true
/*! \name MEM <-> USB Interface /*! \name MEM <-> USB Interface
@@ -303,6 +310,7 @@ extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector);
#endif // ACCESS_USB == true #endif // ACCESS_USB == true
#if ACCESS_MEM_TO_RAM == true #if ACCESS_MEM_TO_RAM == true
/*! \name MEM <-> RAM Interface /*! \name MEM <-> RAM Interface
@@ -333,6 +341,7 @@ extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram);
#endif // ACCESS_MEM_TO_RAM == true #endif // ACCESS_MEM_TO_RAM == true
#if ACCESS_STREAM == true #if ACCESS_STREAM == true
/*! \name Streaming MEM <-> MEM Interface /*! \name Streaming MEM <-> MEM Interface

View File

@@ -108,23 +108,31 @@ struct genclk_config {
uint32_t ctrl; uint32_t ctrl;
}; };
static inline void genclk_config_defaults(struct genclk_config *p_cfg, uint32_t ul_id) { static inline void genclk_config_defaults(struct genclk_config *p_cfg,
uint32_t ul_id)
{
ul_id = ul_id; ul_id = ul_id;
p_cfg->ctrl = 0; p_cfg->ctrl = 0;
} }
static inline void genclk_config_read(struct genclk_config *p_cfg, uint32_t ul_id) { static inline void genclk_config_read(struct genclk_config *p_cfg,
uint32_t ul_id)
{
p_cfg->ctrl = PMC->PMC_PCK[ul_id]; p_cfg->ctrl = PMC->PMC_PCK[ul_id];
} }
static inline void genclk_config_write(const struct genclk_config *p_cfg, uint32_t ul_id) { static inline void genclk_config_write(const struct genclk_config *p_cfg,
uint32_t ul_id)
{
PMC->PMC_PCK[ul_id] = p_cfg->ctrl; PMC->PMC_PCK[ul_id] = p_cfg->ctrl;
} }
//! \name Programmable Clock Source and Prescaler configuration //! \name Programmable Clock Source and Prescaler configuration
//@{ //@{
static inline void genclk_config_set_source(struct genclk_config *p_cfg, enum genclk_source e_src) { static inline void genclk_config_set_source(struct genclk_config *p_cfg,
enum genclk_source e_src)
{
p_cfg->ctrl &= (~PMC_PCK_CSS_Msk); p_cfg->ctrl &= (~PMC_PCK_CSS_Msk);
switch (e_src) { switch (e_src) {
@@ -156,23 +164,29 @@ static inline void genclk_config_set_source(struct genclk_config *p_cfg, enum ge
} }
} }
static inline void genclk_config_set_divider(struct genclk_config *p_cfg, uint32_t e_divider) { static inline void genclk_config_set_divider(struct genclk_config *p_cfg,
uint32_t e_divider)
{
p_cfg->ctrl &= ~PMC_PCK_PRES_Msk; p_cfg->ctrl &= ~PMC_PCK_PRES_Msk;
p_cfg->ctrl |= e_divider; p_cfg->ctrl |= e_divider;
} }
//@} //@}
static inline void genclk_enable(const struct genclk_config *p_cfg, uint32_t ul_id) { static inline void genclk_enable(const struct genclk_config *p_cfg,
uint32_t ul_id)
{
PMC->PMC_PCK[ul_id] = p_cfg->ctrl; PMC->PMC_PCK[ul_id] = p_cfg->ctrl;
pmc_enable_pck(ul_id); pmc_enable_pck(ul_id);
} }
static inline void genclk_disable(uint32_t ul_id) { static inline void genclk_disable(uint32_t ul_id)
{
pmc_disable_pck(ul_id); pmc_disable_pck(ul_id);
} }
static inline void genclk_enable_source(enum genclk_source e_src) { static inline void genclk_enable_source(enum genclk_source e_src)
{
switch (e_src) { switch (e_src) {
case GENCLK_PCK_SRC_SLCK_RC: case GENCLK_PCK_SRC_SLCK_RC:
if (!osc_is_ready(OSC_SLCK_32K_RC)) { if (!osc_is_ready(OSC_SLCK_32K_RC)) {
@@ -230,17 +244,17 @@ static inline void genclk_enable_source(enum genclk_source e_src) {
} }
break; break;
#ifdef CONFIG_PLL0_SOURCE #ifdef CONFIG_PLL0_SOURCE
case GENCLK_PCK_SRC_PLLACK: case GENCLK_PCK_SRC_PLLACK:
pll_enable_config_defaults(0); pll_enable_config_defaults(0);
break; break;
#endif #endif
#ifdef CONFIG_PLL1_SOURCE #ifdef CONFIG_PLL1_SOURCE
case GENCLK_PCK_SRC_PLLBCK: case GENCLK_PCK_SRC_PLLBCK:
pll_enable_config_defaults(1); pll_enable_config_defaults(1);
break; break;
#endif #endif
case GENCLK_PCK_SRC_MCK: case GENCLK_PCK_SRC_MCK:
break; break;

View File

@@ -57,6 +57,7 @@
#include "preprocessor.h" #include "preprocessor.h"
//! Maximal number of repetitions supported by MREPEAT. //! Maximal number of repetitions supported by MREPEAT.
#define MREPEAT_LIMIT 256 #define MREPEAT_LIMIT 256

View File

@@ -62,28 +62,28 @@ extern "C" {
* should be defined by the board code, otherwise default value are used. * should be defined by the board code, otherwise default value are used.
*/ */
#ifndef BOARD_FREQ_SLCK_XTAL #ifndef BOARD_FREQ_SLCK_XTAL
#warning The board slow clock xtal frequency has not been defined. # warning The board slow clock xtal frequency has not been defined.
#define BOARD_FREQ_SLCK_XTAL (32768UL) # define BOARD_FREQ_SLCK_XTAL (32768UL)
#endif #endif
#ifndef BOARD_FREQ_SLCK_BYPASS #ifndef BOARD_FREQ_SLCK_BYPASS
#warning The board slow clock bypass frequency has not been defined. # warning The board slow clock bypass frequency has not been defined.
#define BOARD_FREQ_SLCK_BYPASS (32768UL) # define BOARD_FREQ_SLCK_BYPASS (32768UL)
#endif #endif
#ifndef BOARD_FREQ_MAINCK_XTAL #ifndef BOARD_FREQ_MAINCK_XTAL
#warning The board main clock xtal frequency has not been defined. # warning The board main clock xtal frequency has not been defined.
#define BOARD_FREQ_MAINCK_XTAL (12000000UL) # define BOARD_FREQ_MAINCK_XTAL (12000000UL)
#endif #endif
#ifndef BOARD_FREQ_MAINCK_BYPASS #ifndef BOARD_FREQ_MAINCK_BYPASS
#warning The board main clock bypass frequency has not been defined. # warning The board main clock bypass frequency has not been defined.
#define BOARD_FREQ_MAINCK_BYPASS (12000000UL) # define BOARD_FREQ_MAINCK_BYPASS (12000000UL)
#endif #endif
#ifndef BOARD_OSC_STARTUP_US #ifndef BOARD_OSC_STARTUP_US
#warning The board main clock xtal startup time has not been defined. # warning The board main clock xtal startup time has not been defined.
#define BOARD_OSC_STARTUP_US (15625UL) # define BOARD_OSC_STARTUP_US (15625UL)
#endif #endif
/** /**
@@ -115,7 +115,8 @@ extern "C" {
#define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator. #define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator.
//@} //@}
static inline void osc_enable(uint32_t ul_id) { static inline void osc_enable(uint32_t ul_id)
{
switch (ul_id) { switch (ul_id) {
case OSC_SLCK_32K_RC: case OSC_SLCK_32K_RC:
break; break;
@@ -128,6 +129,7 @@ static inline void osc_enable(uint32_t ul_id) {
pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS); pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS);
break; break;
case OSC_MAINCK_4M_RC: case OSC_MAINCK_4M_RC:
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz);
break; break;
@@ -140,6 +142,7 @@ static inline void osc_enable(uint32_t ul_id) {
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz);
break; break;
case OSC_MAINCK_XTAL: case OSC_MAINCK_XTAL:
pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*, pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*,
pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US,
@@ -154,7 +157,8 @@ static inline void osc_enable(uint32_t ul_id) {
} }
} }
static inline void osc_disable(uint32_t ul_id) { static inline void osc_disable(uint32_t ul_id)
{
switch (ul_id) { switch (ul_id) {
case OSC_SLCK_32K_RC: case OSC_SLCK_32K_RC:
case OSC_SLCK_32K_XTAL: case OSC_SLCK_32K_XTAL:
@@ -177,7 +181,8 @@ static inline void osc_disable(uint32_t ul_id) {
} }
} }
static inline bool osc_is_ready(uint32_t ul_id) { static inline bool osc_is_ready(uint32_t ul_id)
{
switch (ul_id) { switch (ul_id) {
case OSC_SLCK_32K_RC: case OSC_SLCK_32K_RC:
return 1; return 1;
@@ -197,7 +202,8 @@ static inline bool osc_is_ready(uint32_t ul_id) {
return 0; return 0;
} }
static inline uint32_t osc_get_rate(uint32_t ul_id) { static inline uint32_t osc_get_rate(uint32_t ul_id)
{
switch (ul_id) { switch (ul_id) {
case OSC_SLCK_32K_RC: case OSC_SLCK_32K_RC:
return OSC_SLCK_32K_RC_HZ; return OSC_SLCK_32K_RC_HZ;
@@ -235,7 +241,8 @@ static inline uint32_t osc_get_rate(uint32_t ul_id) {
* *
* \param id A number identifying the oscillator to wait for. * \param id A number identifying the oscillator to wait for.
*/ */
static inline void osc_wait_ready(uint8_t id) { static inline void osc_wait_ready(uint8_t id)
{
while (!osc_is_ready(id)) { while (!osc_is_ready(id)) {
/* Do nothing */ /* Do nothing */
} }

View File

@@ -113,15 +113,15 @@ struct pll_config {
* is hidden in this implementation. Use mul as mul effective value. * is hidden in this implementation. Use mul as mul effective value.
*/ */
static inline void pll_config_init(struct pll_config *p_cfg, static inline void pll_config_init(struct pll_config *p_cfg,
enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul) { enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul)
{
uint32_t vco_hz; uint32_t vco_hz;
Assert(e_src < PLL_NR_SOURCES); Assert(e_src < PLL_NR_SOURCES);
if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */ if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */
p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT); p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT);
} } else { /* PLLA */
else { /* PLLA */
/* Calculate internal VCO frequency */ /* Calculate internal VCO frequency */
vco_hz = osc_get_rate(e_src) / ul_div; vco_hz = osc_get_rate(e_src) / ul_div;
Assert(vco_hz >= PLL_INPUT_MIN_HZ); Assert(vco_hz >= PLL_INPUT_MIN_HZ);
@@ -142,55 +142,68 @@ static inline void pll_config_init(struct pll_config *p_cfg,
CONFIG_PLL##pll_id##_DIV, \ CONFIG_PLL##pll_id##_DIV, \
CONFIG_PLL##pll_id##_MUL) CONFIG_PLL##pll_id##_MUL)
static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id) { static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id)
{
Assert(ul_pll_id < NR_PLLS); Assert(ul_pll_id < NR_PLLS);
p_cfg->ctrl = ul_pll_id == PLLA_ID ? PMC->CKGR_PLLAR : PMC->CKGR_UCKR;
if (ul_pll_id == PLLA_ID) {
p_cfg->ctrl = PMC->CKGR_PLLAR;
} else {
p_cfg->ctrl = PMC->CKGR_UCKR;
}
} }
static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id) { static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id)
{
Assert(ul_pll_id < NR_PLLS); Assert(ul_pll_id < NR_PLLS);
if (ul_pll_id == PLLA_ID) { if (ul_pll_id == PLLA_ID) {
pmc_disable_pllack(); // Always stop PLL first! pmc_disable_pllack(); // Always stop PLL first!
PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl;
} } else {
else
PMC->CKGR_UCKR = p_cfg->ctrl; PMC->CKGR_UCKR = p_cfg->ctrl;
}
} }
static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id) { static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id)
{
Assert(ul_pll_id < NR_PLLS); Assert(ul_pll_id < NR_PLLS);
if (ul_pll_id == PLLA_ID) { if (ul_pll_id == PLLA_ID) {
pmc_disable_pllack(); // Always stop PLL first! pmc_disable_pllack(); // Always stop PLL first!
PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl;
} } else {
else
PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN; PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN;
}
} }
/** /**
* \note This will only disable the selected PLL, not the underlying oscillator (mainck). * \note This will only disable the selected PLL, not the underlying oscillator (mainck).
*/ */
static inline void pll_disable(uint32_t ul_pll_id) { static inline void pll_disable(uint32_t ul_pll_id)
{
Assert(ul_pll_id < NR_PLLS); Assert(ul_pll_id < NR_PLLS);
if (ul_pll_id == PLLA_ID) if (ul_pll_id == PLLA_ID) {
pmc_disable_pllack(); pmc_disable_pllack();
else } else {
PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN; PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN;
}
} }
static inline uint32_t pll_is_locked(uint32_t ul_pll_id) { static inline uint32_t pll_is_locked(uint32_t ul_pll_id)
{
Assert(ul_pll_id < NR_PLLS); Assert(ul_pll_id < NR_PLLS);
if (ul_pll_id == PLLA_ID) if (ul_pll_id == PLLA_ID) {
return pmc_is_locked_pllack(); return pmc_is_locked_pllack();
else } else {
return pmc_is_locked_upll(); return pmc_is_locked_upll();
}
} }
static inline void pll_enable_source(enum pll_source e_src) { static inline void pll_enable_source(enum pll_source e_src)
{
switch (e_src) { switch (e_src) {
case PLL_SRC_MAINCK_4M_RC: case PLL_SRC_MAINCK_4M_RC:
case PLL_SRC_MAINCK_8M_RC: case PLL_SRC_MAINCK_8M_RC:
@@ -207,13 +220,15 @@ static inline void pll_enable_source(enum pll_source e_src) {
} }
} }
static inline void pll_enable_config_defaults(unsigned int ul_pll_id) { static inline void pll_enable_config_defaults(unsigned int ul_pll_id)
{
struct pll_config pllcfg; struct pll_config pllcfg;
if (pll_is_locked(ul_pll_id)) return; // Pll already running if (pll_is_locked(ul_pll_id)) {
return; // Pll already running
}
switch (ul_pll_id) { switch (ul_pll_id) {
#ifdef CONFIG_PLL0_SOURCE #ifdef CONFIG_PLL0_SOURCE
case 0: case 0:
pll_enable_source(CONFIG_PLL0_SOURCE); pll_enable_source(CONFIG_PLL0_SOURCE);
pll_config_init(&pllcfg, pll_config_init(&pllcfg,
@@ -221,8 +236,8 @@ static inline void pll_enable_config_defaults(unsigned int ul_pll_id) {
CONFIG_PLL0_DIV, CONFIG_PLL0_DIV,
CONFIG_PLL0_MUL); CONFIG_PLL0_MUL);
break; break;
#endif #endif
#ifdef CONFIG_PLL1_SOURCE #ifdef CONFIG_PLL1_SOURCE
case 1: case 1:
pll_enable_source(CONFIG_PLL1_SOURCE); pll_enable_source(CONFIG_PLL1_SOURCE);
pll_config_init(&pllcfg, pll_config_init(&pllcfg,
@@ -230,7 +245,7 @@ static inline void pll_enable_config_defaults(unsigned int ul_pll_id) {
CONFIG_PLL1_DIV, CONFIG_PLL1_DIV,
CONFIG_PLL1_MUL); CONFIG_PLL1_MUL);
break; break;
#endif #endif
default: default:
Assert(false); Assert(false);
break; break;
@@ -249,10 +264,13 @@ static inline void pll_enable_config_defaults(unsigned int ul_pll_id) {
* \retval STATUS_OK The PLL is now locked. * \retval STATUS_OK The PLL is now locked.
* \retval ERR_TIMEOUT Timed out waiting for PLL to become locked. * \retval ERR_TIMEOUT Timed out waiting for PLL to become locked.
*/ */
static inline int pll_wait_for_lock(unsigned int pll_id) { static inline int pll_wait_for_lock(unsigned int pll_id)
{
Assert(pll_id < NR_PLLS); Assert(pll_id < NR_PLLS);
while (!pll_is_locked(pll_id)) { /* Do nothing */ } while (!pll_is_locked(pll_id)) {
/* Do nothing */
}
return 0; return 0;
} }

View File

@@ -51,4 +51,5 @@
#include "stringz.h" #include "stringz.h"
#include "mrepeat.h" #include "mrepeat.h"
#endif // _PREPROCESSOR_H_ #endif // _PREPROCESSOR_H_

View File

@@ -57,6 +57,7 @@
#ifndef _SBC_PROTOCOL_H_ #ifndef _SBC_PROTOCOL_H_
#define _SBC_PROTOCOL_H_ #define _SBC_PROTOCOL_H_
/** /**
* \ingroup usb_msc_protocol * \ingroup usb_msc_protocol
* \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions * \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions
@@ -86,6 +87,7 @@ enum scsi_sbc_mode {
SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page
}; };
//! \name SBC-2 Device-Specific Parameter //! \name SBC-2 Device-Specific Parameter
//@{ //@{
#define SCSI_MS_SBC_WP 0x80 //!< Write Protected #define SCSI_MS_SBC_WP 0x80 //!< Write Protected
@@ -137,16 +139,16 @@ struct sbc_caching_mode_page {
struct sbc_rdwr_error_recovery_mode_page { struct sbc_rdwr_error_recovery_mode_page {
uint8_t page_code; uint8_t page_code;
uint8_t page_length; uint8_t page_length;
#define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A #define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A
uint8_t flags1; uint8_t flags1;
#define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7) #define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7)
#define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6) #define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6)
#define SBC_MP_RW_ERR_RECOV_TB (1 << 5) #define SBC_MP_RW_ERR_RECOV_TB (1 << 5)
#define SBC_MP_RW_ERR_RECOV_RC (1 << 4) #define SBC_MP_RW_ERR_RECOV_RC (1 << 4)
#define SBC_MP_RW_ERR_RECOV_ERR (1 << 3) #define SBC_MP_RW_ERR_RECOV_ERR (1 << 3)
#define SBC_MP_RW_ERR_RECOV_PER (1 << 2) #define SBC_MP_RW_ERR_RECOV_PER (1 << 2)
#define SBC_MP_RW_ERR_RECOV_DTE (1 << 1) #define SBC_MP_RW_ERR_RECOV_DTE (1 << 1)
#define SBC_MP_RW_ERR_RECOV_DCR (1 << 0) #define SBC_MP_RW_ERR_RECOV_DCR (1 << 0)
uint8_t read_retry_count; uint8_t read_retry_count;
uint8_t correction_span; uint8_t correction_span;
uint8_t head_offset_count; uint8_t head_offset_count;

View File

@@ -6,7 +6,7 @@
#include "../../../inc/MarlinConfig.h" #include "../../../inc/MarlinConfig.h"
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
#include "../../../sd/cardreader.h" #include "../../../sd/cardreader.h"
extern "C" { extern "C" {
@@ -138,5 +138,5 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
#endif // ACCESS_USB == true #endif // ACCESS_USB == true
#endif // HAS_MEDIA #endif // SDSUPPORT
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View File

@@ -45,6 +45,7 @@
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a> * Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
*/ */
#ifndef _SD_MMC_SPI_MEM_H_ #ifndef _SD_MMC_SPI_MEM_H_
#define _SD_MMC_SPI_MEM_H_ #define _SD_MMC_SPI_MEM_H_
@@ -62,14 +63,17 @@
#error sd_mmc_spi_mem.h is #included although SD_MMC_SPI_MEM is disabled #error sd_mmc_spi_mem.h is #included although SD_MMC_SPI_MEM is disabled
#endif #endif
#include "ctrl_access.h" #include "ctrl_access.h"
//_____ D E F I N I T I O N S ______________________________________________ //_____ D E F I N I T I O N S ______________________________________________
#define SD_MMC_REMOVED 0 #define SD_MMC_REMOVED 0
#define SD_MMC_INSERTED 1 #define SD_MMC_INSERTED 1
#define SD_MMC_REMOVING 2 #define SD_MMC_REMOVING 2
//---- CONTROL FUNCTIONS ---- //---- 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.
@@ -129,6 +133,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 FUNCTIONS ---- //---- ACCESS DATA FUNCTIONS ----
#if ACCESS_USB == true #if ACCESS_USB == true

View File

@@ -85,51 +85,51 @@ COMPILER_PACK_SET(1)
*/ */
struct scsi_inquiry_data { struct scsi_inquiry_data {
uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type
#define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected #define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected
#define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected #define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected
#define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported #define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported
#define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC) #define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC)
#define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access #define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access
#define SCSI_INQ_DT_PRINTER 0x02 //!< Printer #define SCSI_INQ_DT_PRINTER 0x02 //!< Printer
#define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device #define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device
#define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device #define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device
#define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device #define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device
#define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory #define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory
#define SCSI_INQ_DT_MC 0x08 //!< Medium Changer #define SCSI_INQ_DT_MC 0x08 //!< Medium Changer
#define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller #define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller
#define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services #define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services
#define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access #define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access
#define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer #define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer
#define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands #define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands
#define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage #define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage
#define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral #define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral
uint8_t flags1; //!< Flags (byte 1) uint8_t flags1; //!< Flags (byte 1)
#define SCSI_INQ_RMB 0x80 //!< Removable Medium #define SCSI_INQ_RMB 0x80 //!< Removable Medium
uint8_t version; //!< Version uint8_t version; //!< Version
#define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance #define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance
#define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC) #define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC)
#define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2) #define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2)
#define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2) #define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2)
#define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3) #define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3)
uint8_t flags3; //!< Flags (byte 3) uint8_t flags3; //!< Flags (byte 3)
#define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported #define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported
#define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing #define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing
#define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format #define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format
uint8_t addl_len; //!< Additional Length (n-4) uint8_t addl_len; //!< Additional Length (n-4)
#define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot #define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot
uint8_t flags5; //!< Flags (byte 5) uint8_t flags5; //!< Flags (byte 5)
#define SCSI_INQ_SCCS 0x80 #define SCSI_INQ_SCCS 0x80
uint8_t flags6; //!< Flags (byte 6) uint8_t flags6; //!< Flags (byte 6)
#define SCSI_INQ_BQUE 0x80 #define SCSI_INQ_BQUE 0x80
#define SCSI_INQ_ENCSERV 0x40 #define SCSI_INQ_ENCSERV 0x40
#define SCSI_INQ_MULTIP 0x10 #define SCSI_INQ_MULTIP 0x10
#define SCSI_INQ_MCHGR 0x08 #define SCSI_INQ_MCHGR 0x08
#define SCSI_INQ_ADDR16 0x01 #define SCSI_INQ_ADDR16 0x01
uint8_t flags7; //!< Flags (byte 7) uint8_t flags7; //!< Flags (byte 7)
#define SCSI_INQ_WBUS16 0x20 #define SCSI_INQ_WBUS16 0x20
#define SCSI_INQ_SYNC 0x10 #define SCSI_INQ_SYNC 0x10
#define SCSI_INQ_LINKED 0x08 #define SCSI_INQ_LINKED 0x08
#define SCSI_INQ_CMDQUE 0x02 #define SCSI_INQ_CMDQUE 0x02
uint8_t vendor_id[8]; //!< T10 Vendor Identification uint8_t vendor_id[8]; //!< T10 Vendor Identification
uint8_t product_id[16]; //!< Product Identification uint8_t product_id[16]; //!< Product Identification
uint8_t product_rev[4]; //!< Product Revision Level uint8_t product_rev[4]; //!< Product Revision Level
@@ -141,28 +141,28 @@ struct scsi_inquiry_data {
struct scsi_request_sense_data { struct scsi_request_sense_data {
/* 1st byte: REQUEST SENSE response flags*/ /* 1st byte: REQUEST SENSE response flags*/
uint8_t valid_reponse_code; uint8_t valid_reponse_code;
#define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information #define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information
#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F #define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F
#define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors) #define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors)
#define SCSI_SENSE_DEFERRED 0x71 #define SCSI_SENSE_DEFERRED 0x71
/* 2nd byte */ /* 2nd byte */
uint8_t obsolete; uint8_t obsolete;
/* 3rd byte */ /* 3rd byte */
uint8_t sense_flag_key; uint8_t sense_flag_key;
#define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark. #define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark.
#define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists. #define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists.
#define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium. #define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium.
#define SCSI_SENSE_RESERVED 0x10 //!< Reserved #define SCSI_SENSE_RESERVED 0x10 //!< Reserved
#define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key #define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key
/* 4th to 7th bytes - INFORMATION field */ /* 4th to 7th bytes - INFORMATION field */
uint8_t information[4]; uint8_t information[4];
/* 8th byte - ADDITIONAL SENSE LENGTH field */ /* 8th byte - ADDITIONAL SENSE LENGTH field */
uint8_t AddSenseLen; uint8_t AddSenseLen;
#define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8) #define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8)
/* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */ /* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */
uint8_t CmdSpecINFO[4]; uint8_t CmdSpecINFO[4];
@@ -178,7 +178,7 @@ struct scsi_request_sense_data {
/* 16th byte */ /* 16th byte */
uint8_t SenseKeySpec[3]; uint8_t SenseKeySpec[3];
#define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information #define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information
}; };
COMPILER_PACK_RESET() COMPILER_PACK_RESET()
@@ -200,6 +200,7 @@ enum scsi_vpd_page_code {
#define SCSI_VPD_ID_TYPE_T10 1 #define SCSI_VPD_ID_TYPE_T10 1
/* Sense keys */ /* Sense keys */
enum scsi_sense_key { enum scsi_sense_key {
SCSI_SK_NO_SENSE = 0x0, SCSI_SK_NO_SENSE = 0x0,
@@ -251,26 +252,27 @@ enum scsi_spc_mode {
struct spc_control_page_info_execpt { struct spc_control_page_info_execpt {
uint8_t page_code; uint8_t page_code;
uint8_t page_length; uint8_t page_length;
#define SPC_MP_INFEXP_PAGE_LENGTH 0x0A #define SPC_MP_INFEXP_PAGE_LENGTH 0x0A
uint8_t flags1; uint8_t flags1;
#define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control #define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control
#define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted #define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted
#define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity #define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity
#define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable #define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable
#define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable #define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable
#define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit #define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit
uint8_t mrie; uint8_t mrie;
#define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00 #define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00
#define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01 #define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01
#define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02 #define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02
#define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03 #define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03
#define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04 #define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04
#define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05 #define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05
#define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06 #define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06
be32_t interval_timer; be32_t interval_timer;
be32_t report_count; be32_t report_count;
}; };
enum scsi_spc_mode_sense_pc { enum scsi_spc_mode_sense_pc {
SCSI_MS_SENSE_PC_CURRENT = 0, SCSI_MS_SENSE_PC_CURRENT = 0,
SCSI_MS_SENSE_PC_CHANGEABLE = 1, SCSI_MS_SENSE_PC_CHANGEABLE = 1,
@@ -278,15 +280,20 @@ enum scsi_spc_mode_sense_pc {
SCSI_MS_SENSE_PC_SAVED = 3, SCSI_MS_SENSE_PC_SAVED = 3,
}; };
static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb) {
static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb)
{
return (cdb[1] >> 3) & 1; return (cdb[1] >> 3) & 1;
} }
static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb) { static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb)
{
return cdb[2] & 0x3F; return cdb[2] & 0x3F;
} }
static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) { static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb)
{
return cdb[2] >> 6; return cdb[2] >> 6;
} }

View File

@@ -136,7 +136,7 @@ extern "C" {
* initialization. * initialization.
*/ */
#ifndef CONFIG_SYSCLK_SOURCE #ifndef CONFIG_SYSCLK_SOURCE
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC # define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC
#endif #endif
/** /**
* \def CONFIG_SYSCLK_PRES * \def CONFIG_SYSCLK_PRES
@@ -149,7 +149,7 @@ extern "C" {
* after initialization. * after initialization.
*/ */
#ifndef CONFIG_SYSCLK_PRES #ifndef CONFIG_SYSCLK_PRES
#define CONFIG_SYSCLK_PRES 0 # define CONFIG_SYSCLK_PRES 0
#endif #endif
//@} //@}
@@ -197,7 +197,7 @@ extern "C" {
* USB is not required. * USB is not required.
*/ */
#ifdef __DOXYGEN__ #ifdef __DOXYGEN__
#define CONFIG_USBCLK_SOURCE # define CONFIG_USBCLK_SOURCE
#endif #endif
/** /**
@@ -209,9 +209,10 @@ extern "C" {
* defined. * defined.
*/ */
#ifdef __DOXYGEN__ #ifdef __DOXYGEN__
#define CONFIG_USBCLK_DIV # define CONFIG_USBCLK_DIV
#endif #endif
extern void sysclk_enable_usb(void); extern void sysclk_enable_usb(void);
extern void sysclk_disable_usb(void); extern void sysclk_disable_usb(void);

View File

@@ -83,6 +83,7 @@ static usb_iface_desc_t UDC_DESC_STORAGE *udc_ptr_iface;
//! @} //! @}
//! \name Internal structure to store the USB device main strings //! \name Internal structure to store the USB device main strings
//! @{ //! @{

View File

@@ -172,7 +172,8 @@ extern "C" {
} }
\endcode \endcode
*/ */
static inline bool udc_include_vbus_monitoring(void) { static inline bool udc_include_vbus_monitoring(void)
{
return udd_include_vbus_monitoring(); return udd_include_vbus_monitoring();
} }
@@ -191,26 +192,32 @@ void udc_stop(void);
* then it will attach device when an acceptable Vbus * then it will attach device when an acceptable Vbus
* level from the host is detected. * level from the host is detected.
*/ */
static inline void udc_attach(void) { static inline void udc_attach(void)
{
udd_attach(); udd_attach();
} }
/** /**
* \brief Detaches the device from the bus * \brief Detaches the device from the bus
* *
* The driver must remove pull-up on USB line D- or D+. * The driver must remove pull-up on USB line D- or D+.
*/ */
static inline void udc_detach(void) { static inline void udc_detach(void)
{
udd_detach(); udd_detach();
} }
/*! \brief The USB driver sends a resume signal called \e "Upstream Resume" /*! \brief The USB driver sends a resume signal called \e "Upstream Resume"
* This is authorized only when the remote wakeup feature is enabled by host. * This is authorized only when the remote wakeup feature is enabled by host.
*/ */
static inline void udc_remotewakeup(void) { static inline void udc_remotewakeup(void)
{
udd_send_remotewakeup(); udd_send_remotewakeup();
} }
/** /**
* \brief Returns a pointer on the current interface descriptor * \brief Returns a pointer on the current interface descriptor
* *
@@ -685,4 +692,6 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void);
} \endcode } \endcode
*/ */
#endif // _UDC_H_ #endif // _UDC_H_

View File

@@ -80,18 +80,20 @@ extern "C" {
#define UDC_DESC_STORAGE #define UDC_DESC_STORAGE
// Descriptor storage in internal RAM // Descriptor storage in internal RAM
#if (defined UDC_DATA_USE_HRAM_SUPPORT) #if (defined UDC_DATA_USE_HRAM_SUPPORT)
#if defined(__GNUC__) # if defined(__GNUC__)
#define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) # define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0")))
#define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) # define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0")))
#elif defined(__ICCAVR32__) # elif defined(__ICCAVR32__)
#define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 # define UDC_DATA(x) COMPILER_ALIGNED(x) __data32
#define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 # define UDC_BSS(x) COMPILER_ALIGNED(x) __data32
#endif # endif
#else #else
#define UDC_DATA(x) COMPILER_ALIGNED(x) # define UDC_DATA(x) COMPILER_ALIGNED(x)
#define UDC_BSS(x) COMPILER_ALIGNED(x) # define UDC_BSS(x) COMPILER_ALIGNED(x)
#endif #endif
/** /**
* \brief Configuration descriptor and UDI link for one USB speed * \brief Configuration descriptor and UDI link for one USB speed
*/ */
@@ -102,6 +104,7 @@ typedef struct {
udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis;
} udc_config_speed_t; } udc_config_speed_t;
/** /**
* \brief All information about the USB Device * \brief All information about the USB Device
*/ */
@@ -110,14 +113,14 @@ typedef struct {
usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs;
//! USB configuration descriptor and UDI API pointers for low or full speed //! USB configuration descriptor and UDI API pointers for low or full speed
udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs;
#ifdef USB_DEVICE_HS_SUPPORT #ifdef USB_DEVICE_HS_SUPPORT
//! USB device descriptor for high speed //! USB device descriptor for high speed
usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs;
//! USB device qualifier, only use in high speed mode //! USB device qualifier, only use in high speed mode
usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier;
//! USB configuration descriptor and UDI API pointers for high speed //! USB configuration descriptor and UDI API pointers for high speed
udc_config_speed_t UDC_DESC_STORAGE *conf_hs; udc_config_speed_t UDC_DESC_STORAGE *conf_hs;
#endif #endif
usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos;
} udc_config_t; } udc_config_t;

View File

@@ -103,16 +103,20 @@ typedef struct {
extern udd_ctrl_request_t udd_g_ctrlreq; extern udd_ctrl_request_t udd_g_ctrlreq;
//! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer //! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer
#define Udd_setup_is_in() (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) #define Udd_setup_is_in() \
(USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK))
//! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer //! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer
#define Udd_setup_is_out() (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) #define Udd_setup_is_out() \
(USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK))
//! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype. //! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype.
#define Udd_setup_type() (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) #define Udd_setup_type() \
(udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK)
//! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient //! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient
#define Udd_setup_recipient() (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) #define Udd_setup_recipient() \
(udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK)
/** /**
* \brief End of halt callback function type. * \brief End of halt callback function type.
@@ -130,7 +134,8 @@ typedef void (*udd_callback_halt_cleared_t)(void);
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
* \param n number of data transferred * \param n number of data transferred
*/ */
typedef void (*udd_callback_trans_t) (udd_ep_status_t status, iram_size_t nb_transferred, udd_ep_id_t ep); typedef void (*udd_callback_trans_t) (udd_ep_status_t status,
iram_size_t nb_transferred, udd_ep_id_t ep);
/** /**
* \brief Authorizes the VBUS event * \brief Authorizes the VBUS event
@@ -213,6 +218,7 @@ void udd_send_remotewakeup(void);
*/ */
void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ); void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size );
/** /**
* \name Endpoint Management * \name Endpoint Management
* *
@@ -233,7 +239,8 @@ void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size );
* *
* \return \c 1 if the endpoint is enabled, otherwise \c 0. * \return \c 1 if the endpoint is enabled, otherwise \c 0.
*/ */
bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, uint16_t MaxEndpointSize); bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes,
uint16_t MaxEndpointSize);
/** /**
* \brief Disables an endpoint * \brief Disables an endpoint
@@ -287,7 +294,8 @@ bool udd_ep_clear_halt(udd_ep_id_t ep);
* *
* \return \c 1 if the register is accepted, otherwise \c 0. * \return \c 1 if the register is accepted, otherwise \c 0.
*/ */
bool udd_ep_wait_stall_clear(udd_ep_id_t ep, udd_callback_halt_cleared_t callback); bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
udd_callback_halt_cleared_t callback);
/** /**
* \brief Allows to receive or send data on an endpoint * \brief Allows to receive or send data on an endpoint
@@ -313,8 +321,9 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep, udd_callback_halt_cleared_t callbac
* *
* \return \c 1 if function was successfully done, otherwise \c 0. * \return \c 1 if function was successfully done, otherwise \c 0.
*/ */
bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, uint8_t * buf, iram_size_t buf_size, udd_callback_trans_t callback); bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket,
uint8_t * buf, iram_size_t buf_size,
udd_callback_trans_t callback);
/** /**
* \brief Aborts transfer on going on endpoint * \brief Aborts transfer on going on endpoint
* *
@@ -330,6 +339,7 @@ void udd_ep_abort(udd_ep_id_t ep);
//@} //@}
/** /**
* \name High speed test mode management * \name High speed test mode management
* *
@@ -342,6 +352,7 @@ void udd_test_mode_se0_nak(void);
void udd_test_mode_packet(void); void udd_test_mode_packet(void);
//@} //@}
/** /**
* \name UDC callbacks to provide for UDD * \name UDC callbacks to provide for UDD
* *

View File

@@ -457,6 +457,7 @@ void udi_cdc_data_sof_notify(void)
#endif #endif
} }
// ------------------------ // ------------------------
//------- Internal routines to control serial line //------- Internal routines to control serial line
@@ -519,6 +520,7 @@ static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask)
udi_cdc_ctrl_state_notify(port, ep_comm); udi_cdc_ctrl_state_notify(port, ep_comm);
} }
static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep) static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep)
{ {
#if UDI_CDC_PORT_NB == 1 // To optimize code #if UDI_CDC_PORT_NB == 1 // To optimize code
@@ -540,6 +542,7 @@ static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep)
} }
} }
static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)
{ {
uint8_t port; uint8_t port;
@@ -575,9 +578,11 @@ static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n,
udi_cdc_ctrl_state_notify(port, ep); udi_cdc_ctrl_state_notify(port, ep);
} }
// ------------------------ // ------------------------
//------- Internal routines to process data transfer //------- Internal routines to process data transfer
static bool udi_cdc_rx_start(uint8_t port) static bool udi_cdc_rx_start(uint8_t port)
{ {
irqflags_t flags; irqflags_t flags;
@@ -627,6 +632,7 @@ static bool udi_cdc_rx_start(uint8_t port)
udi_cdc_data_received); udi_cdc_data_received);
} }
static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)
{ {
uint8_t buf_sel_trans; uint8_t buf_sel_trans;
@@ -662,6 +668,7 @@ static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_
udi_cdc_rx_start(port); udi_cdc_rx_start(port);
} }
static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)
{ {
uint8_t port; uint8_t port;
@@ -693,6 +700,7 @@ static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t
udi_cdc_tx_send(port); udi_cdc_tx_send(port);
} }
static void udi_cdc_tx_send(uint8_t port) static void udi_cdc_tx_send(uint8_t port)
{ {
irqflags_t flags; irqflags_t flags;
@@ -772,9 +780,11 @@ static void udi_cdc_tx_send(uint8_t port)
udi_cdc_data_sent); udi_cdc_data_sent);
} }
// ------------------------ // ------------------------
//------- Application interface //------- Application interface
//------- Application interface //------- Application interface
void udi_cdc_ctrl_signal_dcd(bool b_set) void udi_cdc_ctrl_signal_dcd(bool b_set)

View File

@@ -106,6 +106,7 @@ typedef struct {
usb_ep_desc_t ep_notify; usb_ep_desc_t ep_notify;
} udi_cdc_comm_desc_t; } udi_cdc_comm_desc_t;
/** /**
* \brief Data Class interface descriptor * \brief Data Class interface descriptor
* *
@@ -120,6 +121,7 @@ typedef struct {
usb_ep_desc_t ep_out; usb_ep_desc_t ep_out;
} udi_cdc_data_desc_t; } udi_cdc_data_desc_t;
//! CDC communication endpoints size for all speeds //! CDC communication endpoints size for all speeds
#define UDI_CDC_COMM_EP_SIZE 64 #define UDI_CDC_COMM_EP_SIZE 64
//! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) //! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B)
@@ -134,13 +136,13 @@ typedef struct {
//@{ //@{
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_0 #ifndef UDI_CDC_IAD_STRING_ID_0
#define UDI_CDC_IAD_STRING_ID_0 0 #define UDI_CDC_IAD_STRING_ID_0 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_0 #ifndef UDI_CDC_COMM_STRING_ID_0
#define UDI_CDC_COMM_STRING_ID_0 0 #define UDI_CDC_COMM_STRING_ID_0 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_0 #ifndef UDI_CDC_DATA_STRING_ID_0
#define UDI_CDC_DATA_STRING_ID_0 0 #define UDI_CDC_DATA_STRING_ID_0 0
#endif #endif
#define UDI_CDC_IAD_DESC_0 UDI_CDC_IAD_DESC(0) #define UDI_CDC_IAD_DESC_0 UDI_CDC_IAD_DESC(0)
#define UDI_CDC_COMM_DESC_0 UDI_CDC_COMM_DESC(0) #define UDI_CDC_COMM_DESC_0 UDI_CDC_COMM_DESC(0)
@@ -149,13 +151,13 @@ typedef struct {
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_1 #ifndef UDI_CDC_IAD_STRING_ID_1
#define UDI_CDC_IAD_STRING_ID_1 0 #define UDI_CDC_IAD_STRING_ID_1 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_1 #ifndef UDI_CDC_COMM_STRING_ID_1
#define UDI_CDC_COMM_STRING_ID_1 0 #define UDI_CDC_COMM_STRING_ID_1 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_1 #ifndef UDI_CDC_DATA_STRING_ID_1
#define UDI_CDC_DATA_STRING_ID_1 0 #define UDI_CDC_DATA_STRING_ID_1 0
#endif #endif
#define UDI_CDC_IAD_DESC_1 UDI_CDC_IAD_DESC(1) #define UDI_CDC_IAD_DESC_1 UDI_CDC_IAD_DESC(1)
#define UDI_CDC_COMM_DESC_1 UDI_CDC_COMM_DESC(1) #define UDI_CDC_COMM_DESC_1 UDI_CDC_COMM_DESC(1)
@@ -164,13 +166,13 @@ typedef struct {
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_2 #ifndef UDI_CDC_IAD_STRING_ID_2
#define UDI_CDC_IAD_STRING_ID_2 0 #define UDI_CDC_IAD_STRING_ID_2 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_2 #ifndef UDI_CDC_COMM_STRING_ID_2
#define UDI_CDC_COMM_STRING_ID_2 0 #define UDI_CDC_COMM_STRING_ID_2 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_2 #ifndef UDI_CDC_DATA_STRING_ID_2
#define UDI_CDC_DATA_STRING_ID_2 0 #define UDI_CDC_DATA_STRING_ID_2 0
#endif #endif
#define UDI_CDC_IAD_DESC_2 UDI_CDC_IAD_DESC(2) #define UDI_CDC_IAD_DESC_2 UDI_CDC_IAD_DESC(2)
#define UDI_CDC_COMM_DESC_2 UDI_CDC_COMM_DESC(2) #define UDI_CDC_COMM_DESC_2 UDI_CDC_COMM_DESC(2)
@@ -179,13 +181,13 @@ typedef struct {
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_3 #ifndef UDI_CDC_IAD_STRING_ID_3
#define UDI_CDC_IAD_STRING_ID_3 0 #define UDI_CDC_IAD_STRING_ID_3 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_3 #ifndef UDI_CDC_COMM_STRING_ID_3
#define UDI_CDC_COMM_STRING_ID_3 0 #define UDI_CDC_COMM_STRING_ID_3 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_3 #ifndef UDI_CDC_DATA_STRING_ID_3
#define UDI_CDC_DATA_STRING_ID_3 0 #define UDI_CDC_DATA_STRING_ID_3 0
#endif #endif
#define UDI_CDC_IAD_DESC_3 UDI_CDC_IAD_DESC(3) #define UDI_CDC_IAD_DESC_3 UDI_CDC_IAD_DESC(3)
#define UDI_CDC_COMM_DESC_3 UDI_CDC_COMM_DESC(3) #define UDI_CDC_COMM_DESC_3 UDI_CDC_COMM_DESC(3)
@@ -194,13 +196,13 @@ typedef struct {
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_4 #ifndef UDI_CDC_IAD_STRING_ID_4
#define UDI_CDC_IAD_STRING_ID_4 0 #define UDI_CDC_IAD_STRING_ID_4 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_4 #ifndef UDI_CDC_COMM_STRING_ID_4
#define UDI_CDC_COMM_STRING_ID_4 0 #define UDI_CDC_COMM_STRING_ID_4 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_4 #ifndef UDI_CDC_DATA_STRING_ID_4
#define UDI_CDC_DATA_STRING_ID_4 0 #define UDI_CDC_DATA_STRING_ID_4 0
#endif #endif
#define UDI_CDC_IAD_DESC_4 UDI_CDC_IAD_DESC(4) #define UDI_CDC_IAD_DESC_4 UDI_CDC_IAD_DESC(4)
#define UDI_CDC_COMM_DESC_4 UDI_CDC_COMM_DESC(4) #define UDI_CDC_COMM_DESC_4 UDI_CDC_COMM_DESC(4)
@@ -209,13 +211,13 @@ typedef struct {
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_5 #ifndef UDI_CDC_IAD_STRING_ID_5
#define UDI_CDC_IAD_STRING_ID_5 0 #define UDI_CDC_IAD_STRING_ID_5 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_5 #ifndef UDI_CDC_COMM_STRING_ID_5
#define UDI_CDC_COMM_STRING_ID_5 0 #define UDI_CDC_COMM_STRING_ID_5 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_5 #ifndef UDI_CDC_DATA_STRING_ID_5
#define UDI_CDC_DATA_STRING_ID_5 0 #define UDI_CDC_DATA_STRING_ID_5 0
#endif #endif
#define UDI_CDC_IAD_DESC_5 UDI_CDC_IAD_DESC(5) #define UDI_CDC_IAD_DESC_5 UDI_CDC_IAD_DESC(5)
#define UDI_CDC_COMM_DESC_5 UDI_CDC_COMM_DESC(5) #define UDI_CDC_COMM_DESC_5 UDI_CDC_COMM_DESC(5)
@@ -224,13 +226,13 @@ typedef struct {
//! By default no string associated to these interfaces //! By default no string associated to these interfaces
#ifndef UDI_CDC_IAD_STRING_ID_6 #ifndef UDI_CDC_IAD_STRING_ID_6
#define UDI_CDC_IAD_STRING_ID_6 0 #define UDI_CDC_IAD_STRING_ID_6 0
#endif #endif
#ifndef UDI_CDC_COMM_STRING_ID_6 #ifndef UDI_CDC_COMM_STRING_ID_6
#define UDI_CDC_COMM_STRING_ID_6 0 #define UDI_CDC_COMM_STRING_ID_6 0
#endif #endif
#ifndef UDI_CDC_DATA_STRING_ID_6 #ifndef UDI_CDC_DATA_STRING_ID_6
#define UDI_CDC_DATA_STRING_ID_6 0 #define UDI_CDC_DATA_STRING_ID_6 0
#endif #endif
#define UDI_CDC_IAD_DESC_6 UDI_CDC_IAD_DESC(6) #define UDI_CDC_IAD_DESC_6 UDI_CDC_IAD_DESC(6)
#define UDI_CDC_COMM_DESC_6 UDI_CDC_COMM_DESC(6) #define UDI_CDC_COMM_DESC_6 UDI_CDC_COMM_DESC(6)
@@ -238,6 +240,7 @@ typedef struct {
#define UDI_CDC_DATA_DESC_6_HS UDI_CDC_DATA_DESC_HS(6) #define UDI_CDC_DATA_DESC_6_HS UDI_CDC_DATA_DESC_HS(6)
//@} //@}
//! Content of CDC IAD interface descriptor for all speeds //! Content of CDC IAD interface descriptor for all speeds
#define UDI_CDC_IAD_DESC(port) { \ #define UDI_CDC_IAD_DESC(port) { \
.bLength = sizeof(usb_iad_desc_t),\ .bLength = sizeof(usb_iad_desc_t),\
@@ -624,15 +627,18 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
* Add to application C-file: * Add to application C-file:
* \code * \code
static bool my_flag_autorize_cdc_transfert = false; static bool my_flag_autorize_cdc_transfert = false;
bool my_callback_cdc_enable(void) { bool my_callback_cdc_enable(void)
{
my_flag_autorize_cdc_transfert = true; my_flag_autorize_cdc_transfert = true;
return true; return true;
} }
void my_callback_cdc_disable(void) { void my_callback_cdc_disable(void)
{
my_flag_autorize_cdc_transfert = false; my_flag_autorize_cdc_transfert = false;
} }
void task(void) { void task(void)
{
if (my_flag_autorize_cdc_transfert) { if (my_flag_autorize_cdc_transfert) {
udi_cdc_putc('A'); udi_cdc_putc('A');
udi_cdc_getc(); udi_cdc_getc();

View File

@@ -51,7 +51,7 @@
#include "udc_desc.h" #include "udc_desc.h"
#include "udi_cdc.h" #include "udi_cdc.h"
#if !HAS_MEDIA #if DISABLED(SDSUPPORT)
/** /**
* \defgroup udi_cdc_group_single_desc USB device descriptors for a single interface * \defgroup udi_cdc_group_single_desc USB device descriptors for a single interface
@@ -109,6 +109,7 @@ UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = {
.bNumConfigurations = 1 .bNumConfigurations = 1
}; };
#ifdef USB_DEVICE_HS_SUPPORT #ifdef USB_DEVICE_HS_SUPPORT
//! USB Device Qualifier Descriptor for HS //! USB Device Qualifier Descriptor for HS
COMPILER_WORD_ALIGNED COMPILER_WORD_ALIGNED
@@ -255,6 +256,6 @@ UDC_DESC_STORAGE udc_config_t udc_config = {
//@} //@}
//@} //@}
#endif // HAS_MEDIA #endif // SDSUPPORT
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View File

@@ -50,7 +50,7 @@
#include "udd.h" #include "udd.h"
#include "udc_desc.h" #include "udc_desc.h"
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
/** /**
* \defgroup udi_group_desc Descriptors for a USB Device * \defgroup udi_group_desc Descriptors for a USB Device
@@ -93,6 +93,7 @@ UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = {
.bNumConfigurations = 1 .bNumConfigurations = 1
}; };
#ifdef USB_DEVICE_HS_SUPPORT #ifdef USB_DEVICE_HS_SUPPORT
//! USB Device Qualifier Descriptor for HS //! USB Device Qualifier Descriptor for HS
COMPILER_WORD_ALIGNED COMPILER_WORD_ALIGNED
@@ -146,6 +147,7 @@ UDC_DESC_STORAGE udc_desc_t udc_desc_hs = {
}; };
#endif #endif
/** /**
* \name UDC structures which contains all USB Device definitions * \name UDC structures which contains all USB Device definitions
*/ */
@@ -187,4 +189,4 @@ UDC_DESC_STORAGE udc_config_t udc_config = {
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM
#endif // HAS_MEDIA #endif // SDSUPPORT

View File

@@ -57,7 +57,7 @@
#include "ctrl_access.h" #include "ctrl_access.h"
#include <string.h> #include <string.h>
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
#ifndef UDI_MSC_NOTIFY_TRANS_EXT #ifndef UDI_MSC_NOTIFY_TRANS_EXT
# define UDI_MSC_NOTIFY_TRANS_EXT() # define UDI_MSC_NOTIFY_TRANS_EXT()
@@ -86,6 +86,7 @@ UDC_DESC_STORAGE udi_api_t udi_api_msc = {
}; };
//@} //@}
/** /**
* \ingroup udi_msc_group * \ingroup udi_msc_group
* \defgroup udi_msc_group_internal Implementation of UDI MSC * \defgroup udi_msc_group_internal Implementation of UDI MSC
@@ -136,6 +137,7 @@ volatile bool udi_msc_b_reset_trans = true;
//@} //@}
/** /**
* \name Internal routines * \name Internal routines
*/ */
@@ -188,6 +190,7 @@ static void udi_msc_cbw_received(udd_ep_status_t status,
static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag); static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag);
//@} //@}
/** /**
* \name Routines to process small data packet * \name Routines to process small data packet
*/ */
@@ -214,6 +217,7 @@ static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
udd_ep_id_t ep); udd_ep_id_t ep);
//@} //@}
/** /**
* \name Routines to process CSW packet * \name Routines to process CSW packet
*/ */
@@ -246,6 +250,7 @@ static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
udd_ep_id_t ep); udd_ep_id_t ep);
//@} //@}
/** /**
* \name Routines manage sense data * \name Routines manage sense data
*/ */
@@ -302,6 +307,7 @@ static void udi_msc_sense_fail_cdb_invalid(void);
static void udi_msc_sense_command_invalid(void); static void udi_msc_sense_command_invalid(void);
//@} //@}
/** /**
* \name Routines manage SCSI Commands * \name Routines manage SCSI Commands
*/ */
@@ -366,7 +372,9 @@ static void udi_msc_sbc_trans(bool b_read);
//@} //@}
bool udi_msc_enable(void) {
bool udi_msc_enable(void)
{
uint8_t lun; uint8_t lun;
udi_msc_b_trans_req = false; udi_msc_b_trans_req = false;
udi_msc_b_cbw_invalid = false; udi_msc_b_cbw_invalid = false;
@@ -389,14 +397,18 @@ bool udi_msc_enable(void) {
return true; return true;
} }
void udi_msc_disable(void) {
void udi_msc_disable(void)
{
udi_msc_b_trans_req = false; udi_msc_b_trans_req = false;
udi_msc_b_ack_trans = true; udi_msc_b_ack_trans = true;
udi_msc_b_reset_trans = true; udi_msc_b_reset_trans = true;
UDI_MSC_DISABLE_EXT(); UDI_MSC_DISABLE_EXT();
} }
bool udi_msc_setup(void) {
bool udi_msc_setup(void)
{
if (Udd_setup_is_in()) { if (Udd_setup_is_in()) {
// Requests Interface GET // Requests Interface GET
if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { if (Udd_setup_type() == USB_REQ_TYPE_CLASS) {
@@ -439,14 +451,17 @@ bool udi_msc_setup(void) {
return false; // Not supported request return false; // Not supported request
} }
uint8_t udi_msc_getsetting(void) { uint8_t udi_msc_getsetting(void)
{
return 0; // MSC don't have multiple alternate setting return 0; // MSC don't have multiple alternate setting
} }
// ------------------------ // ------------------------
//------- Routines to process CBW packet //------- Routines to process CBW packet
static void udi_msc_cbw_invalid(void) { static void udi_msc_cbw_invalid(void)
{
if (!udi_msc_b_cbw_invalid) if (!udi_msc_b_cbw_invalid)
return; // Don't re-stall endpoint if error reset by setup return; // Don't re-stall endpoint if error reset by setup
udd_ep_set_halt(UDI_MSC_EP_OUT); udd_ep_set_halt(UDI_MSC_EP_OUT);
@@ -454,7 +469,8 @@ static void udi_msc_cbw_invalid(void) {
udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid); udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid);
} }
static void udi_msc_csw_invalid(void) { static void udi_msc_csw_invalid(void)
{
if (!udi_msc_b_cbw_invalid) if (!udi_msc_b_cbw_invalid)
return; // Don't re-stall endpoint if error reset by setup return; // Don't re-stall endpoint if error reset by setup
udd_ep_set_halt(UDI_MSC_EP_IN); udd_ep_set_halt(UDI_MSC_EP_IN);
@@ -462,7 +478,8 @@ static void udi_msc_csw_invalid(void) {
udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid); udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid);
} }
static void udi_msc_cbw_wait(void) { static void udi_msc_cbw_wait(void)
{
// Register buffer and callback on OUT endpoint // Register buffer and callback on OUT endpoint
if (!udd_ep_run(UDI_MSC_EP_OUT, true, if (!udd_ep_run(UDI_MSC_EP_OUT, true,
(uint8_t *) & udi_msc_cbw, (uint8_t *) & udi_msc_cbw,
@@ -473,8 +490,10 @@ static void udi_msc_cbw_wait(void) {
} }
} }
static void udi_msc_cbw_received(udd_ep_status_t status, static void udi_msc_cbw_received(udd_ep_status_t status,
iram_size_t nb_received, udd_ep_id_t ep) { iram_size_t nb_received, udd_ep_id_t ep)
{
UNUSED(ep); UNUSED(ep);
// Check status of transfer // Check status of transfer
if (UDD_EP_TRANSFER_OK != status) { if (UDD_EP_TRANSFER_OK != status) {
@@ -563,7 +582,9 @@ static void udi_msc_cbw_received(udd_ep_status_t status,
} }
} }
static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) {
static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag)
{
/* /*
* The following cases should result in a phase error: * The following cases should result in a phase error:
* - Case 2: Hn < Di * - Case 2: Hn < Di
@@ -591,10 +612,12 @@ static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) {
return true; return true;
} }
// ------------------------ // ------------------------
//------- Routines to process small data packet //------- Routines to process small data packet
static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) { static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size)
{
// Sends data on IN endpoint // Sends data on IN endpoint
if (!udd_ep_run(UDI_MSC_EP_IN, true, if (!udd_ep_run(UDI_MSC_EP_IN, true,
buffer, buf_size, udi_msc_data_sent)) { buffer, buf_size, udi_msc_data_sent)) {
@@ -604,8 +627,10 @@ static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) {
} }
} }
static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
udd_ep_id_t ep) { udd_ep_id_t ep)
{
UNUSED(ep); UNUSED(ep);
if (UDD_EP_TRANSFER_OK != status) { if (UDD_EP_TRANSFER_OK != status) {
// Error protocol // Error protocol
@@ -619,10 +644,12 @@ static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
udi_msc_csw_process(); udi_msc_csw_process();
} }
// ------------------------ // ------------------------
//------- Routines to process CSW packet //------- Routines to process CSW packet
static void udi_msc_csw_process(void) { static void udi_msc_csw_process(void)
{
if (0 != udi_msc_csw.dCSWDataResidue) { if (0 != udi_msc_csw.dCSWDataResidue) {
// Residue not NULL // Residue not NULL
// then STALL next request from USB host on corresponding endpoint // then STALL next request from USB host on corresponding endpoint
@@ -637,7 +664,9 @@ static void udi_msc_csw_process(void) {
udi_msc_csw_send(); udi_msc_csw_send();
} }
void udi_msc_csw_send(void) {
void udi_msc_csw_send(void)
{
// Sends CSW on IN endpoint // Sends CSW on IN endpoint
if (!udd_ep_run(UDI_MSC_EP_IN, false, if (!udd_ep_run(UDI_MSC_EP_IN, false,
(uint8_t *) & udi_msc_csw, (uint8_t *) & udi_msc_csw,
@@ -649,8 +678,10 @@ void udi_msc_csw_send(void) {
} }
} }
static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
udd_ep_id_t ep) { udd_ep_id_t ep)
{
UNUSED(ep); UNUSED(ep);
UNUSED(status); UNUSED(status);
UNUSED(nb_sent); UNUSED(nb_sent);
@@ -659,17 +690,20 @@ static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
udi_msc_cbw_wait(); udi_msc_cbw_wait();
} }
// ------------------------ // ------------------------
//------- Routines manage sense data //------- Routines manage sense data
static void udi_msc_clear_sense(void) { static void udi_msc_clear_sense(void)
{
memset((uint8_t*)&udi_msc_sense, 0, sizeof(struct scsi_request_sense_data)); memset((uint8_t*)&udi_msc_sense, 0, sizeof(struct scsi_request_sense_data));
udi_msc_sense.valid_reponse_code = SCSI_SENSE_VALID | SCSI_SENSE_CURRENT; udi_msc_sense.valid_reponse_code = SCSI_SENSE_VALID | SCSI_SENSE_CURRENT;
udi_msc_sense.AddSenseLen = SCSI_SENSE_ADDL_LEN(sizeof(udi_msc_sense)); udi_msc_sense.AddSenseLen = SCSI_SENSE_ADDL_LEN(sizeof(udi_msc_sense));
} }
static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense,
uint32_t lba) { uint32_t lba)
{
udi_msc_clear_sense(); udi_msc_clear_sense();
udi_msc_csw.bCSWStatus = USB_CSW_STATUS_FAIL; udi_msc_csw.bCSWStatus = USB_CSW_STATUS_FAIL;
udi_msc_sense.sense_flag_key = sense_key; udi_msc_sense.sense_flag_key = sense_key;
@@ -681,39 +715,53 @@ static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense,
udi_msc_sense.AddSnsCodeQlfr = add_sense; udi_msc_sense.AddSnsCodeQlfr = add_sense;
} }
static void udi_msc_sense_pass(void) { static void udi_msc_sense_pass(void)
{
udi_msc_clear_sense(); udi_msc_clear_sense();
udi_msc_csw.bCSWStatus = USB_CSW_STATUS_PASS; udi_msc_csw.bCSWStatus = USB_CSW_STATUS_PASS;
} }
static void udi_msc_sense_fail_not_present(void) {
static void udi_msc_sense_fail_not_present(void)
{
udi_msc_sense_fail(SCSI_SK_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0); udi_msc_sense_fail(SCSI_SK_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0);
} }
static void udi_msc_sense_fail_busy_or_change(void) { static void udi_msc_sense_fail_busy_or_change(void)
udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION, SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0); {
udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION,
SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0);
} }
static void udi_msc_sense_fail_hardware(void) { static void udi_msc_sense_fail_hardware(void)
udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR, SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0); {
udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR,
SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0);
} }
static void udi_msc_sense_fail_protected(void) { static void udi_msc_sense_fail_protected(void)
{
udi_msc_sense_fail(SCSI_SK_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0); udi_msc_sense_fail(SCSI_SK_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0);
} }
static void udi_msc_sense_fail_cdb_invalid(void) { static void udi_msc_sense_fail_cdb_invalid(void)
udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, SCSI_ASC_INVALID_FIELD_IN_CDB, 0); {
udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST,
SCSI_ASC_INVALID_FIELD_IN_CDB, 0);
} }
static void udi_msc_sense_command_invalid(void) { static void udi_msc_sense_command_invalid(void)
udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0); {
udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST,
SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0);
} }
// ------------------------ // ------------------------
//------- Routines manage SCSI Commands //------- Routines manage SCSI Commands
static void udi_msc_spc_requestsense(void) { static void udi_msc_spc_requestsense(void)
{
uint8_t length = udi_msc_cbw.CDB[4]; uint8_t length = udi_msc_cbw.CDB[4];
// Can't send more than sense data length // Can't send more than sense data length
@@ -726,7 +774,9 @@ static void udi_msc_spc_requestsense(void) {
udi_msc_data_send((uint8_t*)&udi_msc_sense, length); udi_msc_data_send((uint8_t*)&udi_msc_sense, length);
} }
static void udi_msc_spc_inquiry(void) {
static void udi_msc_spc_inquiry(void)
{
uint8_t length, i; uint8_t length, i;
UDC_DATA(4) UDC_DATA(4)
// Constant inquiry data for all LUNs // Constant inquiry data for all LUNs
@@ -785,7 +835,9 @@ static void udi_msc_spc_inquiry(void) {
udi_msc_data_send((uint8_t *) & udi_msc_inquiry_data, length); udi_msc_data_send((uint8_t *) & udi_msc_inquiry_data, length);
} }
static bool udi_msc_spc_testunitready_global(void) {
static bool udi_msc_spc_testunitready_global(void)
{
switch (mem_test_unit_ready(udi_msc_cbw.bCBWLUN)) { switch (mem_test_unit_ready(udi_msc_cbw.bCBWLUN)) {
case CTRL_GOOD: case CTRL_GOOD:
return true; // Don't change sense data return true; // Don't change sense data
@@ -803,7 +855,9 @@ static bool udi_msc_spc_testunitready_global(void) {
return false; return false;
} }
static void udi_msc_spc_testunitready(void) {
static void udi_msc_spc_testunitready(void)
{
if (udi_msc_spc_testunitready_global()) { if (udi_msc_spc_testunitready_global()) {
// LUN ready, then update sense data with status pass // LUN ready, then update sense data with status pass
udi_msc_sense_pass(); udi_msc_sense_pass();
@@ -812,7 +866,9 @@ static void udi_msc_spc_testunitready(void) {
udi_msc_csw_process(); udi_msc_csw_process();
} }
static void udi_msc_spc_mode_sense(bool b_sense10) {
static void udi_msc_spc_mode_sense(bool b_sense10)
{
// Union of all mode sense structures // Union of all mode sense structures
union sense_6_10 { union sense_6_10 {
struct { struct {
@@ -887,7 +943,9 @@ static void udi_msc_spc_mode_sense(bool b_sense10) {
udi_msc_data_send((uint8_t *) & sense, request_lgt); udi_msc_data_send((uint8_t *) & sense, request_lgt);
} }
static void udi_msc_spc_prevent_allow_medium_removal(void) {
static void udi_msc_spc_prevent_allow_medium_removal(void)
{
uint8_t prevent = udi_msc_cbw.CDB[4]; uint8_t prevent = udi_msc_cbw.CDB[4];
if (0 == prevent) { if (0 == prevent) {
udi_msc_sense_pass(); udi_msc_sense_pass();
@@ -897,7 +955,9 @@ static void udi_msc_spc_prevent_allow_medium_removal(void) {
udi_msc_csw_process(); udi_msc_csw_process();
} }
static void udi_msc_sbc_start_stop(void) {
static void udi_msc_sbc_start_stop(void)
{
bool start = 0x1 & udi_msc_cbw.CDB[4]; bool start = 0x1 & udi_msc_cbw.CDB[4];
bool loej = 0x2 & udi_msc_cbw.CDB[4]; bool loej = 0x2 & udi_msc_cbw.CDB[4];
if (loej) { if (loej) {
@@ -907,7 +967,9 @@ static void udi_msc_sbc_start_stop(void) {
udi_msc_csw_process(); udi_msc_csw_process();
} }
static void udi_msc_sbc_read_capacity(void) {
static void udi_msc_sbc_read_capacity(void)
{
UDC_BSS(4) static struct sbc_read_capacity10_data udi_msc_capacity; UDC_BSS(4) static struct sbc_read_capacity10_data udi_msc_capacity;
if (!udi_msc_cbw_validate(sizeof(udi_msc_capacity), if (!udi_msc_cbw_validate(sizeof(udi_msc_capacity),
@@ -941,7 +1003,9 @@ static void udi_msc_sbc_read_capacity(void) {
sizeof(udi_msc_capacity)); sizeof(udi_msc_capacity));
} }
static void udi_msc_sbc_trans(bool b_read) {
static void udi_msc_sbc_trans(bool b_read)
{
uint32_t trans_size; uint32_t trans_size;
if (!b_read) { if (!b_read) {
@@ -974,7 +1038,9 @@ static void udi_msc_sbc_trans(bool b_read) {
UDI_MSC_NOTIFY_TRANS_EXT(); UDI_MSC_NOTIFY_TRANS_EXT();
} }
bool udi_msc_process_trans(void) {
bool udi_msc_process_trans(void)
{
Ctrl_status status; Ctrl_status status;
if (!udi_msc_b_trans_req) if (!udi_msc_b_trans_req)
@@ -1018,8 +1084,10 @@ bool udi_msc_process_trans(void) {
return true; return true;
} }
static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n, static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n,
udd_ep_id_t ep) { udd_ep_id_t ep)
{
UNUSED(ep); UNUSED(ep);
UNUSED(n); UNUSED(n);
// Update variable to signal the end of transfer // Update variable to signal the end of transfer
@@ -1027,8 +1095,10 @@ static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n,
udi_msc_b_ack_trans = true; udi_msc_b_ack_trans = true;
} }
bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)) { void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep))
{
if (!udi_msc_b_ack_trans) if (!udi_msc_b_ack_trans)
return false; // No possible, transfer on going return false; // No possible, transfer on going
@@ -1057,6 +1127,6 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
//@} //@}
#endif // HAS_MEDIA #endif // SDSUPPORT
#endif // ARDUINO_ARCH_SAM #endif // ARDUINO_ARCH_SAM

View File

@@ -129,6 +129,7 @@ typedef struct {
} }
//@} //@}
/** /**
* \ingroup udi_group * \ingroup udi_group
* \defgroup udi_msc_group USB Device Interface (UDI) for Mass Storage Class (MSC) * \defgroup udi_msc_group USB Device Interface (UDI) for Mass Storage Class (MSC)
@@ -169,6 +170,7 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
} }
#endif #endif
/** /**
* \page udi_msc_quickstart Quick start guide for USB device Mass Storage module (UDI MSC) * \page udi_msc_quickstart Quick start guide for USB device Mass Storage module (UDI MSC)
* *
@@ -213,15 +215,18 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size,
* Add to application C-file: * Add to application C-file:
* \code * \code
static bool my_flag_autorize_msc_transfert = false; static bool my_flag_autorize_msc_transfert = false;
bool my_callback_msc_enable(void) { bool my_callback_msc_enable(void)
{
my_flag_autorize_msc_transfert = true; my_flag_autorize_msc_transfert = true;
return true; return true;
} }
void my_callback_msc_disable(void) { void my_callback_msc_disable(void)
{
my_flag_autorize_msc_transfert = false; my_flag_autorize_msc_transfert = false;
} }
void task(void) { void task(void)
{
udi_msc_process_trans(); udi_msc_process_trans();
} }
\endcode \endcode

View File

@@ -276,6 +276,7 @@
# endif # endif
#endif #endif
/** /**
* \name Power management routine. * \name Power management routine.
*/ */
@@ -292,6 +293,7 @@ static bool udd_b_idle;
//! State of sleep manager //! State of sleep manager
static bool udd_b_sleep_initialized = false; static bool udd_b_sleep_initialized = false;
/*! \brief Authorize or not the CPU powerdown mode /*! \brief Authorize or not the CPU powerdown mode
* *
* \param b_enable true to authorize idle mode * \param b_enable true to authorize idle mode
@@ -319,6 +321,7 @@ static void udd_sleep_mode(bool b_idle)
//@} //@}
/** /**
* \name Control endpoint low level management routine. * \name Control endpoint low level management routine.
* *
@@ -390,6 +393,7 @@ static void udd_ctrl_send_zlp_out(void);
//! \brief Call callback associated to setup request //! \brief Call callback associated to setup request
static void udd_ctrl_endofrequest(void); static void udd_ctrl_endofrequest(void);
/** /**
* \brief Main interrupt routine for control endpoint * \brief Main interrupt routine for control endpoint
* *
@@ -401,6 +405,7 @@ static bool udd_ctrl_interrupt(void);
//@} //@}
/** /**
* \name Management of bulk/interrupt/isochronous endpoints * \name Management of bulk/interrupt/isochronous endpoints
* *
@@ -438,6 +443,7 @@ typedef struct {
uint8_t stall_requested:1; uint8_t stall_requested:1;
} udd_ep_job_t; } udd_ep_job_t;
//! Array to register a job on bulk/interrupt/isochronous endpoint //! Array to register a job on bulk/interrupt/isochronous endpoint
static udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP]; static udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP];
@@ -499,6 +505,7 @@ static bool udd_ep_interrupt(void);
#endif // (0!=USB_DEVICE_MAX_EP) #endif // (0!=USB_DEVICE_MAX_EP)
//@} //@}
// ------------------------ // ------------------------
//--- INTERNAL ROUTINES TO MANAGED GLOBAL EVENTS //--- INTERNAL ROUTINES TO MANAGED GLOBAL EVENTS
@@ -635,11 +642,13 @@ udd_interrupt_sof_end:
return; return;
} }
bool udd_include_vbus_monitoring(void) bool udd_include_vbus_monitoring(void)
{ {
return true; return true;
} }
void udd_enable(void) void udd_enable(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -726,6 +735,7 @@ void udd_enable(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
void udd_disable(void) void udd_disable(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -766,6 +776,7 @@ void udd_disable(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
void udd_attach(void) void udd_attach(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -806,6 +817,7 @@ void udd_attach(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
void udd_detach(void) void udd_detach(void)
{ {
otg_unfreeze_clock(); otg_unfreeze_clock();
@@ -816,6 +828,7 @@ void udd_detach(void)
udd_sleep_mode(false); udd_sleep_mode(false);
} }
bool udd_is_high_speed(void) bool udd_is_high_speed(void)
{ {
#ifdef USB_DEVICE_HS_SUPPORT #ifdef USB_DEVICE_HS_SUPPORT
@@ -825,6 +838,7 @@ bool udd_is_high_speed(void)
#endif #endif
} }
void udd_set_address(uint8_t address) void udd_set_address(uint8_t address)
{ {
udd_disable_address(); udd_disable_address();
@@ -832,11 +846,13 @@ void udd_set_address(uint8_t address)
udd_enable_address(); udd_enable_address();
} }
uint8_t udd_getaddress(void) uint8_t udd_getaddress(void)
{ {
return udd_get_configured_address(); return udd_get_configured_address();
} }
uint16_t udd_get_frame_number(void) uint16_t udd_get_frame_number(void)
{ {
return udd_frame_number(); return udd_frame_number();
@@ -859,12 +875,14 @@ void udd_send_remotewakeup(void)
} }
} }
void udd_set_setup_payload(uint8_t *payload, uint16_t payload_size) void udd_set_setup_payload(uint8_t *payload, uint16_t payload_size)
{ {
udd_g_ctrlreq.payload = payload; udd_g_ctrlreq.payload = payload;
udd_g_ctrlreq.payload_size = payload_size; udd_g_ctrlreq.payload_size = payload_size;
} }
#if (0 != USB_DEVICE_MAX_EP) #if (0 != USB_DEVICE_MAX_EP)
bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes,
uint16_t MaxEndpointSize) uint16_t MaxEndpointSize)
@@ -988,6 +1006,7 @@ bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes,
return true; return true;
} }
void udd_ep_free(udd_ep_id_t ep) void udd_ep_free(udd_ep_id_t ep)
{ {
uint8_t ep_index = ep & USB_EP_ADDR_MASK; uint8_t ep_index = ep & USB_EP_ADDR_MASK;
@@ -1000,12 +1019,14 @@ void udd_ep_free(udd_ep_id_t ep)
udd_ep_job[ep_index - 1].stall_requested = false; udd_ep_job[ep_index - 1].stall_requested = false;
} }
bool udd_ep_is_halted(udd_ep_id_t ep) bool udd_ep_is_halted(udd_ep_id_t ep)
{ {
uint8_t ep_index = ep & USB_EP_ADDR_MASK; uint8_t ep_index = ep & USB_EP_ADDR_MASK;
return Is_udd_endpoint_stall_requested(ep_index); return Is_udd_endpoint_stall_requested(ep_index);
} }
bool udd_ep_set_halt(udd_ep_id_t ep) bool udd_ep_set_halt(udd_ep_id_t ep)
{ {
uint8_t ep_index = ep & USB_EP_ADDR_MASK; uint8_t ep_index = ep & USB_EP_ADDR_MASK;
@@ -1046,6 +1067,7 @@ bool udd_ep_set_halt(udd_ep_id_t ep)
return true; return true;
} }
bool udd_ep_clear_halt(udd_ep_id_t ep) bool udd_ep_clear_halt(udd_ep_id_t ep)
{ {
uint8_t ep_index = ep & USB_EP_ADDR_MASK; uint8_t ep_index = ep & USB_EP_ADDR_MASK;
@@ -1086,6 +1108,7 @@ bool udd_ep_clear_halt(udd_ep_id_t ep)
return true; return true;
} }
bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket,
uint8_t * buf, iram_size_t buf_size, uint8_t * buf, iram_size_t buf_size,
udd_callback_trans_t callback) udd_callback_trans_t callback)
@@ -1152,6 +1175,7 @@ bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket,
#endif #endif
} }
void udd_ep_abort(udd_ep_id_t ep) void udd_ep_abort(udd_ep_id_t ep)
{ {
uint8_t ep_index = ep & USB_EP_ADDR_MASK; uint8_t ep_index = ep & USB_EP_ADDR_MASK;
@@ -1180,6 +1204,7 @@ void udd_ep_abort(udd_ep_id_t ep)
udd_ep_abort_job(ep); udd_ep_abort_job(ep);
} }
bool udd_ep_wait_stall_clear(udd_ep_id_t ep, bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
udd_callback_halt_cleared_t callback) udd_callback_halt_cleared_t callback)
{ {
@@ -1214,6 +1239,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
} }
#endif // (0 != USB_DEVICE_MAX_EP) #endif // (0 != USB_DEVICE_MAX_EP)
#ifdef USB_DEVICE_HS_SUPPORT #ifdef USB_DEVICE_HS_SUPPORT
void udd_test_mode_j(void) void udd_test_mode_j(void)
@@ -1222,17 +1248,20 @@ void udd_test_mode_j(void)
udd_enable_hs_test_mode_j(); udd_enable_hs_test_mode_j();
} }
void udd_test_mode_k(void) void udd_test_mode_k(void)
{ {
udd_enable_hs_test_mode(); udd_enable_hs_test_mode();
udd_enable_hs_test_mode_k(); udd_enable_hs_test_mode_k();
} }
void udd_test_mode_se0_nak(void) void udd_test_mode_se0_nak(void)
{ {
udd_enable_hs_test_mode(); udd_enable_hs_test_mode();
} }
void udd_test_mode_packet(void) void udd_test_mode_packet(void)
{ {
uint8_t i; uint8_t i;
@@ -1276,6 +1305,8 @@ void udd_test_mode_packet(void)
} }
#endif // USB_DEVICE_HS_SUPPORT #endif // USB_DEVICE_HS_SUPPORT
// ------------------------ // ------------------------
//--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT //--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT
@@ -1325,6 +1356,7 @@ static void udd_ctrl_init(void)
udd_ep_control_state = UDD_EPCTRL_SETUP; udd_ep_control_state = UDD_EPCTRL_SETUP;
} }
static void udd_ctrl_setup_received(void) static void udd_ctrl_setup_received(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -1386,6 +1418,7 @@ static void udd_ctrl_setup_received(void)
} }
} }
static void udd_ctrl_in_sent(void) static void udd_ctrl_in_sent(void)
{ {
static bool b_shortpacket = false; static bool b_shortpacket = false;
@@ -1469,6 +1502,7 @@ static void udd_ctrl_in_sent(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
static void udd_ctrl_out_received(void) static void udd_ctrl_out_received(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -1559,6 +1593,7 @@ static void udd_ctrl_out_received(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
static void udd_ctrl_underflow(void) static void udd_ctrl_underflow(void)
{ {
if (Is_udd_out_received(0)) if (Is_udd_out_received(0))
@@ -1575,6 +1610,7 @@ static void udd_ctrl_underflow(void)
} }
} }
static void udd_ctrl_overflow(void) static void udd_ctrl_overflow(void)
{ {
if (Is_udd_in_send(0)) if (Is_udd_in_send(0))
@@ -1590,6 +1626,7 @@ static void udd_ctrl_overflow(void)
} }
} }
static void udd_ctrl_stall_data(void) static void udd_ctrl_stall_data(void)
{ {
// Stall all packets on IN & OUT control endpoint // Stall all packets on IN & OUT control endpoint
@@ -1597,6 +1634,7 @@ static void udd_ctrl_stall_data(void)
udd_enable_stall_handshake(0); udd_enable_stall_handshake(0);
} }
static void udd_ctrl_send_zlp_in(void) static void udd_ctrl_send_zlp_in(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -1614,6 +1652,7 @@ static void udd_ctrl_send_zlp_in(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
static void udd_ctrl_send_zlp_out(void) static void udd_ctrl_send_zlp_out(void)
{ {
irqflags_t flags; irqflags_t flags;
@@ -1629,6 +1668,7 @@ static void udd_ctrl_send_zlp_out(void)
cpu_irq_restore(flags); cpu_irq_restore(flags);
} }
static void udd_ctrl_endofrequest(void) static void udd_ctrl_endofrequest(void)
{ {
// If a callback is registered then call it // If a callback is registered then call it
@@ -1637,6 +1677,7 @@ static void udd_ctrl_endofrequest(void)
} }
} }
static bool udd_ctrl_interrupt(void) static bool udd_ctrl_interrupt(void)
{ {
@@ -1687,6 +1728,7 @@ static bool udd_ctrl_interrupt(void)
return false; return false;
} }
// ------------------------ // ------------------------
//--- INTERNAL ROUTINES TO MANAGED THE BULK/INTERRUPT/ISOCHRONOUS ENDPOINTS //--- INTERNAL ROUTINES TO MANAGED THE BULK/INTERRUPT/ISOCHRONOUS ENDPOINTS
@@ -1701,6 +1743,7 @@ static void udd_ep_job_table_reset(void)
} }
} }
static void udd_ep_job_table_kill(void) static void udd_ep_job_table_kill(void)
{ {
uint8_t i; uint8_t i;
@@ -1711,6 +1754,7 @@ static void udd_ep_job_table_kill(void)
} }
} }
static void udd_ep_abort_job(udd_ep_id_t ep) static void udd_ep_abort_job(udd_ep_id_t ep)
{ {
ep &= USB_EP_ADDR_MASK; ep &= USB_EP_ADDR_MASK;
@@ -1719,6 +1763,7 @@ static void udd_ep_abort_job(udd_ep_id_t ep)
udd_ep_finish_job(&udd_ep_job[ep - 1], true, ep); udd_ep_finish_job(&udd_ep_job[ep - 1], true, ep);
} }
static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_num) static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_num)
{ {
if (ptr_job->busy == false) { if (ptr_job->busy == false) {
@@ -1789,6 +1834,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_BUFFIT | udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_BUFFIT |
UOTGHS_DEVDMACONTROL_CHANN_ENB; UOTGHS_DEVDMACONTROL_CHANN_ENB;
// Disable IRQs to have a short sequence // Disable IRQs to have a short sequence
// between read of EOT_STA and DMA enable // between read of EOT_STA and DMA enable
flags = cpu_irq_save(); flags = cpu_irq_save();

View File

@@ -129,6 +129,7 @@ extern "C" {
#define Is_udd_vbus_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUSTI)) #define Is_udd_vbus_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUSTI))
//! @} //! @}
//! @name UOTGHS device attach control //! @name UOTGHS device attach control
//! These macros manage the UOTGHS Device attach. //! These macros manage the UOTGHS Device attach.
//! @{ //! @{
@@ -140,6 +141,7 @@ extern "C" {
#define Is_udd_detached() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) #define Is_udd_detached() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH))
//! @} //! @}
//! @name UOTGHS device bus events control //! @name UOTGHS device bus events control
//! These macros manage the UOTGHS Device bus events. //! These macros manage the UOTGHS Device bus events.
//! @{ //! @{
@@ -244,6 +246,7 @@ extern "C" {
#define udd_get_configured_address() (Rd_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_UADD_Msk)) #define udd_get_configured_address() (Rd_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_UADD_Msk))
//! @} //! @}
//! @name UOTGHS Device endpoint drivers //! @name UOTGHS Device endpoint drivers
//! These macros manage the common features of the endpoints. //! These macros manage the common features of the endpoints.
//! @{ //! @{
@@ -327,6 +330,7 @@ extern "C" {
#define udd_data_toggle(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_DTSEQ_Msk)) #define udd_data_toggle(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_DTSEQ_Msk))
//! @} //! @}
//! @name UOTGHS Device control endpoint //! @name UOTGHS Device control endpoint
//! These macros control the endpoints. //! These macros control the endpoints.
//! @{ //! @{
@@ -526,6 +530,7 @@ extern "C" {
//! Tests if IN sending interrupt is enabled //! Tests if IN sending interrupt is enabled
#define Is_udd_in_send_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_TXINE)) #define Is_udd_in_send_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_TXINE))
//! Get 64-, 32-, 16- or 8-bit access to FIFO data register of selected endpoint. //! Get 64-, 32-, 16- or 8-bit access to FIFO data register of selected endpoint.
//! @param ep Endpoint of which to access FIFO data register //! @param ep Endpoint of which to access FIFO data register
//! @param scale Data scale in bits: 64, 32, 16 or 8 //! @param scale Data scale in bits: 64, 32, 16 or 8
@@ -647,6 +652,7 @@ typedef struct {
//! @} //! @}
//! @} //! @}
/// @cond 0 /// @cond 0
/**INDENT-OFF**/ /**INDENT-OFF**/
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -53,6 +53,7 @@
extern "C" { extern "C" {
#endif #endif
//! \ingroup usb_group //! \ingroup usb_group
//! \defgroup otg_group UOTGHS OTG Driver //! \defgroup otg_group UOTGHS OTG Driver
//! UOTGHS low-level driver for OTG features //! UOTGHS low-level driver for OTG features
@@ -73,6 +74,7 @@ bool otg_dual_enable(void);
*/ */
void otg_dual_disable(void); void otg_dual_disable(void);
//! @name UOTGHS OTG ID pin management //! @name UOTGHS OTG ID pin management
//! The ID pin come from the USB OTG connector (A and B receptable) and //! The ID pin come from the USB OTG connector (A and B receptable) and
//! allows to select the USB mode host or device. //! allows to select the USB mode host or device.
@@ -128,8 +130,8 @@ void otg_dual_disable(void);
#define otg_reset() \ #define otg_reset() \
do { \ do { \
UOTGHS->UOTGHS_CTRL = 0; \ UOTGHS->UOTGHS_CTRL = 0; \
while( UOTGHS->UOTGHS_SR & 0x3FFF) { \ while( UOTGHS->UOTGHS_SR & 0x3FFF) {\
UOTGHS->UOTGHS_SCR = 0xFFFFFFFF; \ UOTGHS->UOTGHS_SCR = 0xFFFFFFFF;\
} \ } \
} while (0) } while (0)
//! Enable USB macro //! Enable USB macro
@@ -164,6 +166,7 @@ void otg_dual_disable(void);
Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\
Rd_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk)) Rd_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk))
//! Get the dual-role device state of the internal USB finite state machine of the UOTGHS controller //! Get the dual-role device state of the internal USB finite state machine of the UOTGHS controller
#define otg_get_fsm_drd_state() (Rd_bitfield(UOTGHS->UOTGHS_FSM, UOTGHS_FSM_DRDSTATE_Msk)) #define otg_get_fsm_drd_state() (Rd_bitfield(UOTGHS->UOTGHS_FSM, UOTGHS_FSM_DRDSTATE_Msk))
#define Is_otg_a_suspend() (4==otg_get_fsm_drd_state()) #define Is_otg_a_suspend() (4==otg_get_fsm_drd_state())

View File

@@ -374,6 +374,7 @@ typedef struct {
uint8_t bNumDeviceCaps; uint8_t bNumDeviceCaps;
} usb_dev_bos_desc_t; } usb_dev_bos_desc_t;
/** /**
* \brief USB Device Capabilities - USB 2.0 Extension Descriptor structure * \brief USB Device Capabilities - USB 2.0 Extension Descriptor structure
* *
@@ -410,6 +411,7 @@ typedef struct {
uint8_t iFunction; //!< Index of string descriptor uint8_t iFunction; //!< Index of string descriptor
} usb_association_desc_t; } usb_association_desc_t;
/** /**
* \brief Standard USB configuration descriptor structure * \brief Standard USB configuration descriptor structure
*/ */
@@ -424,6 +426,7 @@ typedef struct {
uint8_t bMaxPower; uint8_t bMaxPower;
} usb_conf_desc_t; } usb_conf_desc_t;
#define USB_CONFIG_ATTR_MUST_SET (1 << 7) //!< Must always be set #define USB_CONFIG_ATTR_MUST_SET (1 << 7) //!< Must always be set
#define USB_CONFIG_ATTR_BUS_POWERED (0 << 6) //!< Bus-powered #define USB_CONFIG_ATTR_BUS_POWERED (0 << 6) //!< Bus-powered
#define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) //!< Self-powered #define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) //!< Self-powered
@@ -472,6 +475,7 @@ typedef struct {
uint8_t bInterval; uint8_t bInterval;
} usb_ep_desc_t; } usb_ep_desc_t;
/** /**
* \brief A standard USB string descriptor structure * \brief A standard USB string descriptor structure
*/ */

View File

@@ -168,6 +168,7 @@ COMPILER_PACK_SET(1)
//! \name USB CDC Descriptors //! \name USB CDC Descriptors
//@{ //@{
//! CDC Header Functional Descriptor //! CDC Header Functional Descriptor
typedef struct { typedef struct {
uint8_t bFunctionLength; uint8_t bFunctionLength;
@@ -202,6 +203,7 @@ typedef struct {
uint8_t bSlaveInterface0; uint8_t bSlaveInterface0;
} usb_cdc_union_desc_t; } usb_cdc_union_desc_t;
//! \name USB CDC Call Management Capabilities //! \name USB CDC Call Management Capabilities
//@{ //@{
//! Device handles call management itself //! Device handles call management itself
@@ -276,6 +278,7 @@ typedef struct {
//@} //@}
//@} //@}
//! \name USB CDC notification message //! \name USB CDC notification message
//@{ //@{

View File

@@ -47,6 +47,7 @@
#ifndef _USB_PROTOCOL_MSC_H_ #ifndef _USB_PROTOCOL_MSC_H_
#define _USB_PROTOCOL_MSC_H_ #define _USB_PROTOCOL_MSC_H_
/** /**
* \ingroup usb_protocol_group * \ingroup usb_protocol_group
* \defgroup usb_msc_protocol USB Mass Storage Class (MSC) protocol definitions * \defgroup usb_msc_protocol USB Mass Storage Class (MSC) protocol definitions
@@ -88,6 +89,7 @@
#define MSC_PROTOCOL_BULK 0x50 //!< Bulk-only #define MSC_PROTOCOL_BULK 0x50 //!< Bulk-only
//@} //@}
/** /**
* \brief MSC USB requests (bRequest) * \brief MSC USB requests (bRequest)
*/ */
@@ -96,6 +98,7 @@ enum usb_reqid_msc {
USB_REQ_MSC_GET_MAX_LUN = 0xFE //!< Get Max LUN USB_REQ_MSC_GET_MAX_LUN = 0xFE //!< Get Max LUN
}; };
COMPILER_PACK_SET(1) COMPILER_PACK_SET(1)
/** /**
@@ -119,6 +122,7 @@ struct usb_msc_cbw {
#define USB_CBW_LEN_MASK 0x1F //!< Valid bits in bCBWCBLength #define USB_CBW_LEN_MASK 0x1F //!< Valid bits in bCBWCBLength
//@} //@}
/** /**
* \name A Command Status Wrapper (CSW). * \name A Command Status Wrapper (CSW).
*/ */

View File

@@ -51,18 +51,18 @@
#include "conf_usb.h" #include "conf_usb.h"
#include "udc.h" #include "udc.h"
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
static volatile bool main_b_msc_enable = false; static volatile bool main_b_msc_enable = false;
#endif #endif
static volatile bool main_b_cdc_enable = false; static volatile bool main_b_cdc_enable = false;
static volatile bool main_b_dtr_active = false; static volatile bool main_b_dtr_active = false;
void usb_task_idle(void) { void usb_task_idle(void) {
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
// Attend SD card access from the USB MSD -- Prioritize access to improve speed // Attend SD card access from the USB MSD -- Prioritize access to improve speed
int delay = 2; int delay = 2;
while (main_b_msc_enable && --delay > 0) { while (main_b_msc_enable && --delay > 0) {
if (udi_msc_process_trans()) delay = 20; if (udi_msc_process_trans()) delay = 10000;
// Reset the watchdog, just to be sure // Reset the watchdog, just to be sure
REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5); REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5);
@@ -70,7 +70,7 @@ void usb_task_idle(void) {
#endif #endif
} }
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
bool usb_task_msc_enable(void) { return ((main_b_msc_enable = true)); } bool usb_task_msc_enable(void) { return ((main_b_msc_enable = true)); }
void usb_task_msc_disable(void) { main_b_msc_enable = false; } void usb_task_msc_disable(void) { main_b_msc_enable = false; }
bool usb_task_msc_isenabled(void) { return main_b_msc_enable; } bool usb_task_msc_isenabled(void) { return main_b_msc_enable; }
@@ -206,13 +206,13 @@ static USB_MicrosoftExtendedPropertiesDescriptor microsoft_extended_properties_d
bool usb_task_extra_string(void) { bool usb_task_extra_string(void) {
static uint8_t udi_msft_magic[] = "MSFT100\xEE"; static uint8_t udi_msft_magic[] = "MSFT100\xEE";
static uint8_t udi_cdc_name[] = "CDC interface"; static uint8_t udi_cdc_name[] = "CDC interface";
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
static uint8_t udi_msc_name[] = "MSC interface"; static uint8_t udi_msc_name[] = "MSC interface";
#endif #endif
struct extra_strings_desc_t { struct extra_strings_desc_t {
usb_str_desc_t header; usb_str_desc_t header;
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
le16_t string[Max(Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msc_name) - 1), sizeof(udi_msft_magic) - 1)]; le16_t string[Max(Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msc_name) - 1), sizeof(udi_msft_magic) - 1)];
#else #else
le16_t string[Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msft_magic) - 1)]; le16_t string[Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msft_magic) - 1)];
@@ -231,7 +231,7 @@ bool usb_task_extra_string(void) {
str_lgt = sizeof(udi_cdc_name) - 1; str_lgt = sizeof(udi_cdc_name) - 1;
str = udi_cdc_name; str = udi_cdc_name;
break; break;
#if HAS_MEDIA #if ENABLED(SDSUPPORT)
case UDI_MSC_STRING_ID: case UDI_MSC_STRING_ID:
str_lgt = sizeof(udi_msc_name) - 1; str_lgt = sizeof(udi_msc_name) - 1;
str = udi_msc_name; str = udi_msc_name;

View File

@@ -165,7 +165,7 @@ void MarlinHAL::init_board() {
} }
void MarlinHAL::idletask() { void MarlinHAL::idletask() {
#if ALL(WIFISUPPORT, OTASUPPORT) #if BOTH(WIFISUPPORT, OTASUPPORT)
OTA_handle(); OTA_handle();
#endif #endif
TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask()); TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask());
@@ -175,7 +175,7 @@ uint8_t MarlinHAL::get_reset_source() { return rtc_get_reset_reason(1); }
void MarlinHAL::reboot() { ESP.restart(); } void MarlinHAL::reboot() { ESP.restart(); }
void _delay_ms(const int ms) { delay(ms); } void _delay_ms(int delay_ms) { delay(delay_ms); }
// return free memory between end of heap (or end bss) and whatever is current // return free memory between end of heap (or end bss) and whatever is current
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); } int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
@@ -342,16 +342,16 @@ void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v
} }
else else
pindata.pwm_duty_ticks = duty; // PWM duty count = # of 4µs ticks per full PWM cycle pindata.pwm_duty_ticks = duty; // PWM duty count = # of 4µs ticks per full PWM cycle
return;
} }
else
#endif #endif
{
const int8_t cid = get_pwm_channel(pin, PWM_FREQUENCY, PWM_RESOLUTION); const int8_t cid = get_pwm_channel(pin, PWM_FREQUENCY, PWM_RESOLUTION);
if (cid >= 0) { if (cid >= 0) {
const uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, _BV(PWM_RESOLUTION)-1); const uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, _BV(PWM_RESOLUTION)-1);
ledcWrite(cid, duty); ledcWrite(cid, duty);
} }
}
} }
int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) { int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) {
@@ -360,8 +360,9 @@ int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) {
pwm_pin_data[pin & 0x7F].pwm_cycle_ticks = 1000000UL / f_desired / 4; // # of 4µs ticks per full PWM cycle pwm_pin_data[pin & 0x7F].pwm_cycle_ticks = 1000000UL / f_desired / 4; // # of 4µs ticks per full PWM cycle
return 0; return 0;
} }
else
#endif #endif
{
const int8_t cid = channel_for_pin(pin); const int8_t cid = channel_for_pin(pin);
if (cid >= 0) { if (cid >= 0) {
if (f_desired == ledcReadFreq(cid)) return cid; // no freq change if (f_desired == ledcReadFreq(cid)) return cid; // no freq change
@@ -369,6 +370,7 @@ int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) {
chan_pin[cid] = 0; // remove old freq channel chan_pin[cid] = 0; // remove old freq channel
} }
return get_pwm_channel(pin, f_desired, PWM_RESOLUTION); // try for new one return get_pwm_channel(pin, f_desired, PWM_RESOLUTION); // try for new one
}
} }
// use hardware PWM if avail, if not then ISR // use hardware PWM if avail, if not then ISR

View File

@@ -1,9 +1,7 @@
/** /**
* 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]
* * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* 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
@@ -52,12 +50,14 @@
#define MYSERIAL1 flushableSerial #define MYSERIAL1 flushableSerial
#if ENABLED(ESP3D_WIFISUPPORT) #if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
#if ENABLED(ESP3D_WIFISUPPORT)
typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1; typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1;
extern DefaultSerial1 MSerial0; extern DefaultSerial1 MSerial0;
#define MYSERIAL2 MSerial0 #define MYSERIAL2 MSerial0
#elif ENABLED(WIFISUPPORT) #else
#define MYSERIAL2 webSocketSerial #define MYSERIAL2 webSocketSerial
#endif
#endif #endif
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&hal.spinlock) #define CRITICAL_SECTION_START() portENTER_CRITICAL(&hal.spinlock)
@@ -171,7 +171,7 @@ void _delay_ms(const int ms);
// MarlinHAL Class // MarlinHAL Class
// ------------------------ // ------------------------
#define HAL_ADC_VREF_MV 3300 #define HAL_ADC_VREF 3.3
#define HAL_ADC_RESOLUTION 10 #define HAL_ADC_RESOLUTION 10
class MarlinHAL { class MarlinHAL {

View File

@@ -4,6 +4,7 @@
* *
* Based on Sprinter and grbl. * Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
* Copyright (c) 2017 Victor Perez
* *
* 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
@@ -52,7 +53,7 @@ static SPISettings spiConfig;
// ------------------------ // ------------------------
void spiBegin() { void spiBegin() {
#if HAS_MEDIA && PIN_EXISTS(SD_SS) #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_SS)
OUT_WRITE(SD_SS_PIN, HIGH); OUT_WRITE(SD_SS_PIN, HIGH);
#endif #endif
} }

View File

@@ -42,33 +42,33 @@ void ICACHE_RAM_ATTR 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)
TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN)); TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
} }

View File

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

View File

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

View File

@@ -21,26 +21,19 @@
*/ */
#pragma once #pragma once
#if HAS_SPI_TFT || HAS_FSMC_TFT
#error "Sorry! TFT displays are not available for HAL/ESP32."
#endif
#if ENABLED(EMERGENCY_PARSER) #if ENABLED(EMERGENCY_PARSER)
#error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue." #error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue."
#endif #endif
#if ENABLED(SPINDLE_LASER_USE_PWM) && SPINDLE_LASER_FREQUENCY > 78125 #if (ENABLED(SPINDLE_LASER_USE_PWM) && SPINDLE_LASER_FREQUENCY > 78125) || (ENABLED(FAST_PWM_FAN_FREQUENCY) && FAST_PWM_FAN_FREQUENCY > 78125)
#error "SPINDLE_LASER_FREQUENCY maximum value is 78125Hz for ESP32." #error "SPINDLE_LASER_FREQUENCY and FAST_PWM_FREQUENCY maximum value is 78125Hz for ESP32."
#endif
#if ENABLED(FAST_PWM_FAN) && FAST_PWM_FAN_FREQUENCY > 78125
#error "FAST_PWM_FREQUENCY maximum value is 78125Hz for ESP32."
#endif #endif
#if HAS_TMC_SW_SERIAL #if HAS_TMC_SW_SERIAL
#error "TMC220x Software Serial is not supported on ESP32." #error "TMC220x Software Serial is not supported on ESP32."
#endif #endif
#if ALL(WIFISUPPORT, ESP3D_WIFISUPPORT) #if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT)
#error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT." #error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT."
#endif #endif
@@ -52,18 +45,10 @@
#error "FAST_PWM_FAN is not available on TinyBee." #error "FAST_PWM_FAN is not available on TinyBee."
#endif #endif
#if ALL(I2S_STEPPER_STREAM, BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING)
#error "BABYSTEPPING on I2S stream requires INTEGRATED_BABYSTEPPING."
#endif
#if USING_PULLDOWNS #if USING_PULLDOWNS
#error "PULLDOWN pin mode is not available on ESP32 boards." #error "PULLDOWN pin mode is not available on ESP32 boards."
#endif #endif
#if ALL(I2S_STEPPER_STREAM, LIN_ADVANCE) && DISABLED(EXPERIMENTAL_I2S_LA) #if BOTH(I2S_STEPPER_STREAM, LIN_ADVANCE)
#error "I2S stream is currently incompatible with LIN_ADVANCE." #error "I2S stream is currently incompatible with LIN_ADVANCE."
#endif #endif
#if ALL(I2S_STEPPER_STREAM, PRINTCOUNTER) && PRINTCOUNTER_SAVE_INTERVAL > 0 && DISABLED(PRINTCOUNTER_SYNC)
#error "PRINTCOUNTER_SAVE_INTERVAL may cause issues on ESP32 with an I2S expander. Define PRINTCOUNTER_SYNC in Configuration.h for an imperfect solution."
#endif

View File

@@ -1,9 +1,7 @@
/** /**
* 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]
* * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* 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
@@ -24,7 +22,7 @@
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#if ALL(WIFISUPPORT, OTASUPPORT) #if BOTH(WIFISUPPORT, OTASUPPORT)
#include <WiFi.h> #include <WiFi.h>
#include <ESPmDNS.h> #include <ESPmDNS.h>
@@ -52,7 +50,7 @@ void OTA_init() {
}) })
.onError([](ota_error_t error) { .onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error); Serial.printf("Error[%u]: ", error);
const char *str = "unknown"; char *str;
switch (error) { switch (error) {
case OTA_AUTH_ERROR: str = "Auth Failed"; break; case OTA_AUTH_ERROR: str = "Auth Failed"; break;
case OTA_BEGIN_ERROR: str = "Begin Failed"; break; case OTA_BEGIN_ERROR: str = "Begin Failed"; break;

View File

@@ -1,9 +1,7 @@
/** /**
* 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]
* * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
* 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

View File

@@ -23,7 +23,7 @@
#include "../../inc/MarlinConfigPre.h" #include "../../inc/MarlinConfigPre.h"
#if ALL(WIFISUPPORT, WEBSUPPORT) #if BOTH(WIFISUPPORT, WEBSUPPORT)
#include "../../core/serial.h" #include "../../core/serial.h"

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