Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0eeaa2389f |
@@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app
|
||||||
|
#
|
||||||
|
|
||||||
|
# Number of days of inactivity before a closed issue or pull request is locked
|
||||||
|
daysUntilLock: 60
|
||||||
|
|
||||||
|
# Skip issues and pull requests created before a given timestamp. Timestamp must
|
||||||
|
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
|
||||||
|
skipCreatedBefore: false
|
||||||
|
|
||||||
|
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
|
||||||
|
exemptLabels: [ 'no-locking' ]
|
||||||
|
|
||||||
|
# Label to add before locking, such as `outdated`. Set to `false` to disable
|
||||||
|
lockLabel: false
|
||||||
|
|
||||||
|
# Comment to post before locking. Set to `false` to disable
|
||||||
|
lockComment: >
|
||||||
|
This thread has been automatically locked since there has not been
|
||||||
|
any recent activity after it was closed. Please open a new issue for
|
||||||
|
related bugs.
|
||||||
|
|
||||||
|
# Assign `resolved` as the reason for locking. Set to `false` to disable
|
||||||
|
setLockReason: true
|
||||||
|
|
||||||
|
# Limit to only `issues` or `pulls`
|
||||||
|
# only: issues
|
||||||
|
|
||||||
|
# Optionally, specify configuration settings just for `issues` or `pulls`
|
||||||
|
# issues:
|
||||||
|
# exemptLabels:
|
||||||
|
# - help-wanted
|
||||||
|
# lockLabel: outdated
|
||||||
|
|
||||||
|
# pulls:
|
||||||
|
# daysUntilLock: 30
|
||||||
|
|
||||||
|
# Repository to extend settings from
|
||||||
|
# _extends: repo
|
||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Check out bugfix-2.0.x
|
- name: Check out bugfix-2.0.x
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: bugfix-2.0.x
|
ref: bugfix-2.0.x
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ jobs:
|
|||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
- name: Check out bugfix-2.1.x
|
- name: Check out bugfix-2.1.x
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: bugfix-2.1.x
|
ref: bugfix-2.1.x
|
||||||
|
|
||||||
|
|||||||
@@ -1,73 +0,0 @@
|
|||||||
#
|
|
||||||
# ci-unit-tests.yml
|
|
||||||
# Build and execute unit tests to catch functional issues in code
|
|
||||||
#
|
|
||||||
|
|
||||||
name: CI - Unit Tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.1.x
|
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
|
||||||
#- 2.1.x
|
|
||||||
paths-ignore:
|
|
||||||
- config/**
|
|
||||||
- data/**
|
|
||||||
- docs/**
|
|
||||||
- '**/*.md'
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.1.x
|
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
|
||||||
#- 2.1.x
|
|
||||||
paths-ignore:
|
|
||||||
- config/**
|
|
||||||
- data/**
|
|
||||||
- docs/**
|
|
||||||
- '**/*.md'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# This runs all unit tests as a single job. While it should be possible to break this up into
|
|
||||||
# multiple jobs, they currently run quickly and finish long before the compilation tests.
|
|
||||||
run_unit_tests:
|
|
||||||
name: Unit Test
|
|
||||||
# These tests will only be able to run on the bugfix-2.1.x branch, until the next release
|
|
||||||
# pulls them into additional branches.
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out the PR
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache pip
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
|
|
||||||
- name: Cache PlatformIO
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.platformio
|
|
||||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
|
||||||
|
|
||||||
- name: Select Python 3.9
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.9'
|
|
||||||
architecture: 'x64'
|
|
||||||
|
|
||||||
- name: Install PlatformIO
|
|
||||||
run: |
|
|
||||||
pip install -U platformio
|
|
||||||
pio upgrade --dev
|
|
||||||
pio pkg update --global
|
|
||||||
|
|
||||||
- name: Run All Unit Tests
|
|
||||||
run: |
|
|
||||||
make unit-test-all-local
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#
|
|
||||||
# ci-validate-pins.yml
|
|
||||||
# Validate that all of the pins files are unchanged by pinsformat.py
|
|
||||||
#
|
|
||||||
|
|
||||||
name: CI - Validate Pins Files
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.1.x
|
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
|
||||||
#- 2.1.x
|
|
||||||
paths:
|
|
||||||
- 'Marlin/src/pins/*/**'
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.1.x
|
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
|
||||||
#- 2.1.x
|
|
||||||
paths:
|
|
||||||
- 'Marlin/src/pins/*/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate_pins_files:
|
|
||||||
name: Validate Pins Files
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out the PR
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache pip
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.cache/pip
|
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pip-
|
|
||||||
|
|
||||||
- name: Select Python 3.9
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.9'
|
|
||||||
architecture: 'x64'
|
|
||||||
|
|
||||||
- name: Validate all pins files
|
|
||||||
run: |
|
|
||||||
make validate-pins -j
|
|
||||||
@@ -32,7 +32,7 @@ jobs:
|
|||||||
- "Needs: Work"
|
- "Needs: Work"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Remove Labels
|
- name: Remove Labels
|
||||||
uses: actions-ecosystem/action-remove-labels@v1
|
uses: actions-ecosystem/action-remove-labels@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v8
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
stale-issue-message: |
|
stale-issue-message: |
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v5
|
- uses: dessant/lock-threads@v2
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
process-only: 'issues'
|
process-only: 'issues'
|
||||||
issue-inactive-days: '60'
|
issue-lock-inactive-days: '60'
|
||||||
exclude-issue-created-before: ''
|
issue-exclude-created-before: ''
|
||||||
exclude-any-issue-labels: 'no-locking'
|
issue-exclude-labels: 'no-locking'
|
||||||
add-issue-labels: ''
|
issue-lock-labels: ''
|
||||||
issue-comment: >
|
issue-lock-comment: >
|
||||||
This issue has been automatically locked since there
|
This issue has been automatically locked since there
|
||||||
has not been any recent activity after it was closed.
|
has not been any recent activity after it was closed.
|
||||||
Please open a new issue for related bugs.
|
Please open a new issue for related bugs.
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#
|
#
|
||||||
# ci-build-tests.yml
|
# test-builds.yml
|
||||||
# Do test builds to catch compile errors
|
# Do test builds to catch compile errors
|
||||||
#
|
#
|
||||||
|
|
||||||
name: CI - Build Tests
|
name: CI
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -14,8 +14,6 @@ on:
|
|||||||
- config/**
|
- config/**
|
||||||
- data/**
|
- data/**
|
||||||
- docs/**
|
- docs/**
|
||||||
- test/**
|
|
||||||
- Marlin/tests/**
|
|
||||||
- '**/*.md'
|
- '**/*.md'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@@ -25,13 +23,11 @@ on:
|
|||||||
- config/**
|
- config/**
|
||||||
- data/**
|
- data/**
|
||||||
- docs/**
|
- docs/**
|
||||||
- test/**
|
|
||||||
- Marlin/tests/**
|
|
||||||
- '**/*.md'
|
- '**/*.md'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test_builds:
|
test_builds:
|
||||||
name: Build Test
|
name: Run All Tests
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -156,7 +152,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Cache pip
|
- name: Cache pip
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||||
@@ -164,13 +160,13 @@ jobs:
|
|||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
- name: Cache PlatformIO
|
- name: Cache PlatformIO
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ~/.platformio
|
path: ~/.platformio
|
||||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: '3.9'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
@@ -2,23 +2,17 @@ SCRIPTS_DIR := buildroot/share/scripts
|
|||||||
CONTAINER_RT_BIN := docker
|
CONTAINER_RT_BIN := docker
|
||||||
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
||||||
CONTAINER_IMAGE := marlin-dev
|
CONTAINER_IMAGE := marlin-dev
|
||||||
UNIT_TEST_CONFIG ?= default
|
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo "Tasks for local development:"
|
@echo "Tasks for local development:"
|
||||||
@echo "make marlin : Build marlin for the configured board"
|
@echo "make marlin : Build marlin for the configured board"
|
||||||
@echo "make format-pins -j : Reformat all pins files (-j for parallel execution)"
|
@echo "make format-pins : Reformat all pins files"
|
||||||
@echo "make validate-pins -j : Validate all pins files, fails if any require reformatting"
|
|
||||||
@echo "make tests-single-ci : Run a single test from inside the CI"
|
@echo "make tests-single-ci : Run a single test from inside the CI"
|
||||||
@echo "make tests-single-local : Run a single test locally"
|
@echo "make tests-single-local : Run a single test locally"
|
||||||
@echo "make tests-single-local-docker : Run a single test locally, using docker"
|
@echo "make tests-single-local-docker : Run a single test locally, using docker"
|
||||||
@echo "make tests-all-local : Run all tests locally"
|
@echo "make tests-all-local : Run all tests locally"
|
||||||
@echo "make tests-all-local-docker : Run all tests locally, using docker"
|
@echo "make tests-all-local-docker : Run all tests locally, using docker"
|
||||||
@echo "make unit-test-single-local : Run unit tests for a single config locally"
|
@echo "make setup-local-docker : Build the local docker image"
|
||||||
@echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker"
|
|
||||||
@echo "make unit-test-all-local : Run all code tests locally"
|
|
||||||
@echo "make unit-test-all-local-docker : Run all code tests locally, using docker"
|
|
||||||
@echo "make setup-local-docker : Setup local docker using buildx"
|
|
||||||
@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"
|
||||||
@@ -28,9 +22,6 @@ help:
|
|||||||
@echo " run on GitHub CI"
|
@echo " run on GitHub CI"
|
||||||
@echo " ONLY_TEST Limit tests to only those that contain this, or"
|
@echo " ONLY_TEST Limit tests to only those that contain this, or"
|
||||||
@echo " the index of the test (1-based)"
|
@echo " the index of the test (1-based)"
|
||||||
@echo " UNIT_TEST_CONFIG Set the name of the config from the test folder, without"
|
|
||||||
@echo " the leading number. Default is 'default'". Used with the
|
|
||||||
@echo " unit-test-single-* tasks"
|
|
||||||
@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!"
|
||||||
@@ -52,53 +43,23 @@ 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
|
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
||||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
||||||
|
|
||||||
tests-all-local:
|
tests-all-local:
|
||||||
@python -c "import yaml" 2>/dev/null || (echo 'pyyaml module is not installed. Install it with "python -m pip install pyyaml"' && exit 1)
|
|
||||||
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
||||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
&& for TEST_TARGET in $$(python $(SCRIPTS_DIR)/get_test_targets.py) ; do \
|
&& for TEST_TARGET in $$($(SCRIPTS_DIR)/get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
||||||
if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \
|
|
||||||
echo "Skipping tests for $$TEST_TARGET on macOS" ; \
|
|
||||||
continue ; \
|
|
||||||
fi ; \
|
|
||||||
echo "Running tests for $$TEST_TARGET" ; \
|
|
||||||
run_tests . $$TEST_TARGET || exit 1 ; \
|
|
||||||
sleep 5; \
|
|
||||||
done
|
|
||||||
|
|
||||||
tests-all-local-docker:
|
tests-all-local-docker:
|
||||||
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
||||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make 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)
|
||||||
|
|
||||||
unit-test-single-local:
|
|
||||||
platformio run -t marlin_$(UNIT_TEST_CONFIG) -e linux_native_test
|
|
||||||
|
|
||||||
unit-test-single-local-docker:
|
|
||||||
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
|
||||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-single-local UNIT_TEST_CONFIG=$(UNIT_TEST_CONFIG)
|
|
||||||
|
|
||||||
unit-test-all-local:
|
|
||||||
platformio run -t test-marlin -e linux_native_test
|
|
||||||
|
|
||||||
unit-test-all-local-docker:
|
|
||||||
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
|
||||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local
|
|
||||||
|
|
||||||
setup-local-docker:
|
setup-local-docker:
|
||||||
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
$(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
||||||
|
|
||||||
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
|
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
|
||||||
|
|
||||||
.PHONY: $(PINS) format-pins validate-pins
|
|
||||||
|
|
||||||
$(PINS): %:
|
$(PINS): %:
|
||||||
@echo "Formatting $@"
|
@echo "Formatting $@" && node $(SCRIPTS_DIR)/pinsformat.js $@
|
||||||
@python $(SCRIPTS_DIR)/pinsformat.py $< $@
|
|
||||||
|
|
||||||
format-pins: $(PINS)
|
format-pins: $(PINS)
|
||||||
|
|
||||||
validate-pins: format-pins
|
|
||||||
@echo "Validating pins files"
|
|
||||||
@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
|
|
||||||
|
|||||||
+77
-90
@@ -61,14 +61,14 @@
|
|||||||
// @section info
|
// @section info
|
||||||
|
|
||||||
// Author info of this build printed to the host during boot and M115
|
// Author info of this build printed to the host during boot and M115
|
||||||
#define STRING_CONFIG_H_AUTHOR "InsanityAutomation" // Who made the changes.
|
#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
|
||||||
//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
|
//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
|
||||||
|
|
||||||
// @section machine
|
// @section machine
|
||||||
|
|
||||||
// Choose the name from boards.h that matches your setup
|
// Choose the name from boards.h that matches your setup
|
||||||
#ifndef MOTHERBOARD
|
#ifndef MOTHERBOARD
|
||||||
#define MOTHERBOARD BOARD_EBAB
|
#define MOTHERBOARD BOARD_RAMPS_14_EFB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
*
|
*
|
||||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
|
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
*/
|
*/
|
||||||
#define SERIAL_PORT -1
|
#define SERIAL_PORT 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serial Port Baud Rate
|
* Serial Port Baud Rate
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
* Currently Ethernet (-2) is only supported on Teensy 4.1 boards.
|
* Currently Ethernet (-2) is only supported on Teensy 4.1 boards.
|
||||||
* :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
|
* :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
*/
|
*/
|
||||||
//#define SERIAL_PORT_2 1
|
//#define SERIAL_PORT_2 -1
|
||||||
//#define BAUDRATE_2 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
|
//#define BAUDRATE_2 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
//#define BLUETOOTH
|
//#define BLUETOOTH
|
||||||
|
|
||||||
// Name displayed in the LCD "Ready" message and Info menu
|
// Name displayed in the LCD "Ready" message and Info menu
|
||||||
#define CUSTOM_MACHINE_NAME "FatBoy"
|
//#define CUSTOM_MACHINE_NAME "3D Printer"
|
||||||
|
|
||||||
// Printer's unique ID, used by some programs to differentiate between machines.
|
// Printer's unique ID, used by some programs to differentiate between machines.
|
||||||
// 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
|
||||||
@@ -139,21 +139,21 @@
|
|||||||
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
|
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
|
||||||
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
||||||
*/
|
*/
|
||||||
#define X_DRIVER_TYPE TMC5160
|
#define X_DRIVER_TYPE A4988
|
||||||
#define Y_DRIVER_TYPE TMC5160
|
#define Y_DRIVER_TYPE A4988
|
||||||
#define Z_DRIVER_TYPE TMC5160_STANDALONE
|
#define Z_DRIVER_TYPE A4988
|
||||||
//#define X2_DRIVER_TYPE A4988
|
//#define X2_DRIVER_TYPE A4988
|
||||||
#define Y2_DRIVER_TYPE TMC5160
|
//#define Y2_DRIVER_TYPE A4988
|
||||||
#define Z2_DRIVER_TYPE TMC5160_STANDALONE
|
//#define Z2_DRIVER_TYPE A4988
|
||||||
#define Z3_DRIVER_TYPE TMC5160_STANDALONE
|
//#define Z3_DRIVER_TYPE A4988
|
||||||
#define Z4_DRIVER_TYPE TMC5160_STANDALONE
|
//#define Z4_DRIVER_TYPE A4988
|
||||||
//#define I_DRIVER_TYPE A4988
|
//#define I_DRIVER_TYPE A4988
|
||||||
//#define J_DRIVER_TYPE A4988
|
//#define J_DRIVER_TYPE A4988
|
||||||
//#define K_DRIVER_TYPE A4988
|
//#define K_DRIVER_TYPE A4988
|
||||||
//#define U_DRIVER_TYPE A4988
|
//#define U_DRIVER_TYPE A4988
|
||||||
//#define V_DRIVER_TYPE A4988
|
//#define V_DRIVER_TYPE A4988
|
||||||
//#define W_DRIVER_TYPE A4988
|
//#define W_DRIVER_TYPE A4988
|
||||||
#define E0_DRIVER_TYPE TMC2209
|
#define E0_DRIVER_TYPE A4988
|
||||||
//#define E1_DRIVER_TYPE A4988
|
//#define E1_DRIVER_TYPE A4988
|
||||||
//#define E2_DRIVER_TYPE A4988
|
//#define E2_DRIVER_TYPE A4988
|
||||||
//#define E3_DRIVER_TYPE A4988
|
//#define E3_DRIVER_TYPE A4988
|
||||||
@@ -399,37 +399,19 @@
|
|||||||
//#define MKS_PWC // Using the MKS PWC add-on
|
//#define MKS_PWC // Using the MKS PWC add-on
|
||||||
//#define PS_OFF_CONFIRM // Confirm dialog when power off
|
//#define PS_OFF_CONFIRM // Confirm dialog when power off
|
||||||
//#define PS_OFF_SOUND // Beep 1s when power off
|
//#define PS_OFF_SOUND // Beep 1s when power off
|
||||||
#define PSU_ACTIVE_STATE HIGH // Set 'LOW' for ATX, 'HIGH' for X-Box
|
#define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box
|
||||||
|
|
||||||
#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80
|
//#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80
|
||||||
#define PSU_POWERUP_DELAY 750 // (ms) Delay for the PSU to warm up to full power
|
//#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power
|
||||||
//#define LED_POWEROFF_TIMEOUT 10000 // (ms) Turn off LEDs after power-off, with this amount of delay
|
//#define LED_POWEROFF_TIMEOUT 10000 // (ms) Turn off LEDs after power-off, with this amount of delay
|
||||||
|
|
||||||
#define PSU_OFF_REDUNDANT // Second pin for redundant power control
|
|
||||||
//#define PSU_OFF_REDUNDANT_OPPOSING // Redundant pin works opposite standard pin
|
|
||||||
#define PS_ON_PIN P4_28 // Redundant Pin
|
|
||||||
#define PS_ON1_PIN P1_03 // Redundant Pin
|
|
||||||
|
|
||||||
#define PS_ON_EDM_PIN P4_29 // EDM Pins to monitor feedback on external power control relay. Fault on mismatch.
|
|
||||||
#define PS_ON1_EDM_PIN P1_17
|
|
||||||
#define PS_EDM_RESPONSE 1000 // Time in MS to allow for relay action
|
|
||||||
|
|
||||||
#define PSU_OFF_REDUNDANT // Second pin for redundant power control
|
|
||||||
//#define PSU_OFF_REDUNDANT_OPPOSING // Redundant pin works opposite standard pin
|
|
||||||
#define PS_ON_PIN P4_28 // Redundant Pin
|
|
||||||
#define PS_ON1_PIN P1_03 // Redundant Pin
|
|
||||||
|
|
||||||
#define PS_ON_EDM_PIN P4_29 // EDM Pins to monitor feedback on external power control relay. Fault on mismatch.
|
|
||||||
#define PS_ON1_EDM_PIN P1_17
|
|
||||||
#define PS_EDM_RESPONSE 1000 // Time in MS to allow for relay action
|
|
||||||
|
|
||||||
//#define POWER_OFF_TIMER // Enable M81 D<seconds> to power off after a delay
|
//#define POWER_OFF_TIMER // Enable M81 D<seconds> to power off after a delay
|
||||||
//#define POWER_OFF_WAIT_FOR_COOLDOWN // Enable M81 S to power off only after cooldown
|
//#define POWER_OFF_WAIT_FOR_COOLDOWN // Enable M81 S to power off only after cooldown
|
||||||
|
|
||||||
//#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on)
|
//#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on)
|
||||||
//#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off)
|
//#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off)
|
||||||
|
|
||||||
#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 for fans
|
||||||
#define AUTO_POWER_E_FANS // Turn on PSU for E Fans
|
#define AUTO_POWER_E_FANS // Turn on PSU for E Fans
|
||||||
@@ -570,7 +552,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 11
|
#define TEMP_SENSOR_BED 1
|
||||||
#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
|
||||||
@@ -646,7 +628,7 @@
|
|||||||
// Above this temperature the heater will be switched off.
|
// Above this temperature the heater will be switched off.
|
||||||
// This can protect components from overheating, but NOT from shorts and failures.
|
// This can protect components from overheating, but NOT from shorts and failures.
|
||||||
// (Use MINTEMP for thermistor short/failure protection.)
|
// (Use MINTEMP for thermistor short/failure protection.)
|
||||||
#define HEATER_0_MAXTEMP 300
|
#define HEATER_0_MAXTEMP 275
|
||||||
#define HEATER_1_MAXTEMP 275
|
#define HEATER_1_MAXTEMP 275
|
||||||
#define HEATER_2_MAXTEMP 275
|
#define HEATER_2_MAXTEMP 275
|
||||||
#define HEATER_3_MAXTEMP 275
|
#define HEATER_3_MAXTEMP 275
|
||||||
@@ -654,7 +636,7 @@
|
|||||||
#define HEATER_5_MAXTEMP 275
|
#define HEATER_5_MAXTEMP 275
|
||||||
#define HEATER_6_MAXTEMP 275
|
#define HEATER_6_MAXTEMP 275
|
||||||
#define HEATER_7_MAXTEMP 275
|
#define HEATER_7_MAXTEMP 275
|
||||||
#define BED_MAXTEMP 120
|
#define BED_MAXTEMP 150
|
||||||
#define CHAMBER_MAXTEMP 60
|
#define CHAMBER_MAXTEMP 60
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -663,7 +645,7 @@
|
|||||||
* (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees
|
* (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees
|
||||||
* a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP.
|
* a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP.
|
||||||
*/
|
*/
|
||||||
#define HOTEND_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT
|
#define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT
|
||||||
#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT
|
#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT
|
||||||
#define COOLER_OVERSHOOT 2 // (°C) Forbid temperatures closer than OVERSHOOT
|
#define COOLER_OVERSHOOT 2 // (°C) Forbid temperatures closer than OVERSHOOT
|
||||||
|
|
||||||
@@ -766,7 +748,7 @@
|
|||||||
* When set to any value below 255, enables a form of PWM to the bed that acts like a divider
|
* When set to any value below 255, enables a form of PWM to the bed that acts like a divider
|
||||||
* so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED)
|
* so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED)
|
||||||
*/
|
*/
|
||||||
#define MAX_BED_POWER 180 // limits duty cycle to bed; 255=full current
|
#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PID Bed Heating
|
* PID Bed Heating
|
||||||
@@ -780,7 +762,7 @@
|
|||||||
*
|
*
|
||||||
* With this option disabled, bang-bang will be used. BED_LIMIT_SWITCHING enables hysteresis.
|
* With this option disabled, bang-bang will be used. BED_LIMIT_SWITCHING enables hysteresis.
|
||||||
*/
|
*/
|
||||||
#define PIDTEMPBED
|
//#define PIDTEMPBED
|
||||||
|
|
||||||
#if ENABLED(PIDTEMPBED)
|
#if ENABLED(PIDTEMPBED)
|
||||||
//#define MIN_BED_POWER 0
|
//#define MIN_BED_POWER 0
|
||||||
@@ -851,8 +833,8 @@
|
|||||||
#define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
|
#define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
|
||||||
// is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
|
// is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
|
||||||
|
|
||||||
#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash)
|
//#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash)
|
||||||
#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of flash)
|
//#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of flash)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section safety
|
// @section safety
|
||||||
@@ -1186,9 +1168,9 @@
|
|||||||
* Endstop "Hit" State
|
* Endstop "Hit" State
|
||||||
* Set to the state (HIGH or LOW) that applies to each endstop.
|
* Set to the state (HIGH or LOW) that applies to each endstop.
|
||||||
*/
|
*/
|
||||||
#define X_MIN_ENDSTOP_HIT_STATE LOW
|
#define X_MIN_ENDSTOP_HIT_STATE HIGH
|
||||||
#define X_MAX_ENDSTOP_HIT_STATE HIGH
|
#define X_MAX_ENDSTOP_HIT_STATE HIGH
|
||||||
#define Y_MIN_ENDSTOP_HIT_STATE LOW
|
#define Y_MIN_ENDSTOP_HIT_STATE HIGH
|
||||||
#define Y_MAX_ENDSTOP_HIT_STATE HIGH
|
#define Y_MAX_ENDSTOP_HIT_STATE HIGH
|
||||||
#define Z_MIN_ENDSTOP_HIT_STATE HIGH
|
#define Z_MIN_ENDSTOP_HIT_STATE HIGH
|
||||||
#define Z_MAX_ENDSTOP_HIT_STATE HIGH
|
#define Z_MAX_ENDSTOP_HIT_STATE HIGH
|
||||||
@@ -1252,7 +1234,7 @@
|
|||||||
* Override with M92 (when enabled below)
|
* Override with M92 (when enabled below)
|
||||||
* X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
|
* X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
|
||||||
*/
|
*/
|
||||||
#define DEFAULT_AXIS_STEPS_PER_UNIT { 40, 40, 200, 425 }
|
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 500 }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable support for M92. Disable to save at least ~530 bytes of flash.
|
* Enable support for M92. Disable to save at least ~530 bytes of flash.
|
||||||
@@ -1277,7 +1259,7 @@
|
|||||||
* Override with M201
|
* Override with M201
|
||||||
* X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
|
* X, Y, Z [, I [, J [, K...]]], E0 [, E1[, E2...]]
|
||||||
*/
|
*/
|
||||||
#define DEFAULT_MAX_ACCELERATION { 12000, 12000, 500, 10000 }
|
#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 }
|
||||||
|
|
||||||
//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2
|
//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2
|
||||||
#if ENABLED(LIMITED_MAX_ACCEL_EDITING)
|
#if ENABLED(LIMITED_MAX_ACCEL_EDITING)
|
||||||
@@ -1292,9 +1274,9 @@
|
|||||||
* M204 R Retract Acceleration
|
* M204 R Retract Acceleration
|
||||||
* M204 T Travel Acceleration
|
* M204 T Travel Acceleration
|
||||||
*/
|
*/
|
||||||
#define DEFAULT_ACCELERATION 7000 // X, Y, Z and E acceleration for printing moves
|
#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves
|
||||||
#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts
|
#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts
|
||||||
#define DEFAULT_TRAVEL_ACCELERATION 7000 // X, Y, Z acceleration for travel (non printing) moves
|
#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Jerk limits (mm/s)
|
* Default Jerk limits (mm/s)
|
||||||
@@ -1309,6 +1291,7 @@
|
|||||||
#define DEFAULT_XJERK 10.0
|
#define DEFAULT_XJERK 10.0
|
||||||
#define DEFAULT_YJERK 10.0
|
#define DEFAULT_YJERK 10.0
|
||||||
#define DEFAULT_ZJERK 0.3
|
#define DEFAULT_ZJERK 0.3
|
||||||
|
#define DEFAULT_EJERK 5.0
|
||||||
//#define DEFAULT_IJERK 0.3
|
//#define DEFAULT_IJERK 0.3
|
||||||
//#define DEFAULT_JJERK 0.3
|
//#define DEFAULT_JJERK 0.3
|
||||||
//#define DEFAULT_KJERK 0.3
|
//#define DEFAULT_KJERK 0.3
|
||||||
@@ -1324,8 +1307,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_EJERK 5.0 // May be used by Linear Advance
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Junction Deviation Factor
|
* Junction Deviation Factor
|
||||||
*
|
*
|
||||||
@@ -1347,12 +1328,7 @@
|
|||||||
*
|
*
|
||||||
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
|
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
|
||||||
*/
|
*/
|
||||||
#define S_CURVE_ACCELERATION
|
//#define S_CURVE_ACCELERATION
|
||||||
#if ENABLED(S_CURVE_ACCELERATION)
|
|
||||||
// Uncomment to use 4th instead of 6th order motion curve
|
|
||||||
#define S_CURVE_FACTOR 0.35 // Initial and final acceleration factor, ideally 0.1 to 0.4
|
|
||||||
// Shouldn't generally require tuning
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Z Probe Options =============================
|
//============================= Z Probe Options =============================
|
||||||
@@ -1368,10 +1344,10 @@
|
|||||||
* The probe replaces the Z-MIN endstop and is used for Z homing.
|
* The probe replaces the Z-MIN endstop and is used for Z homing.
|
||||||
* (Automatically enables USE_PROBE_FOR_Z_HOMING.)
|
* (Automatically enables USE_PROBE_FOR_Z_HOMING.)
|
||||||
*/
|
*/
|
||||||
//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
|
#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
|
||||||
|
|
||||||
// Force the use of the probe for Z-axis homing
|
// Force the use of the probe for Z-axis homing
|
||||||
#define USE_PROBE_FOR_Z_HOMING
|
//#define USE_PROBE_FOR_Z_HOMING
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Z_MIN_PROBE_PIN
|
* Z_MIN_PROBE_PIN
|
||||||
@@ -1428,7 +1404,7 @@
|
|||||||
/**
|
/**
|
||||||
* The BLTouch probe uses a Hall effect sensor and emulates a servo.
|
* The BLTouch probe uses a Hall effect sensor and emulates a servo.
|
||||||
*/
|
*/
|
||||||
#define BLTOUCH
|
//#define BLTOUCH
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MagLev V4 probe by MDD
|
* MagLev V4 probe by MDD
|
||||||
@@ -1470,6 +1446,17 @@
|
|||||||
//#define BD_SENSOR_PROBE_NO_STOP // Probe bed without stopping at each probe point
|
//#define BD_SENSOR_PROBE_NO_STOP // Probe bed without stopping at each probe point
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BIQU MicroProbe
|
||||||
|
*
|
||||||
|
* A lightweight, solenoid-driven probe.
|
||||||
|
* For information about this sensor https://github.com/bigtreetech/MicroProbe
|
||||||
|
*
|
||||||
|
* Also requires: PROBE_ENABLE_DISABLE
|
||||||
|
*/
|
||||||
|
//#define BIQU_MICROPROBE_V1 // Triggers HIGH
|
||||||
|
//#define BIQU_MICROPROBE_V2 // Triggers LOW
|
||||||
|
|
||||||
// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN)
|
// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN)
|
||||||
//#define SOLENOID_PROBE
|
//#define SOLENOID_PROBE
|
||||||
|
|
||||||
@@ -1658,7 +1645,7 @@
|
|||||||
* A total of 2 does fast/slow probes with a weighted average.
|
* A total of 2 does fast/slow probes with a weighted average.
|
||||||
* A total of 3 or more adds more slow probes, taking the average.
|
* A total of 3 or more adds more slow probes, taking the average.
|
||||||
*/
|
*/
|
||||||
#define MULTIPLE_PROBING 2
|
//#define MULTIPLE_PROBING 2
|
||||||
//#define EXTRA_PROBING 1
|
//#define EXTRA_PROBING 1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1681,7 +1668,7 @@
|
|||||||
#define Z_PROBE_ERROR_TOLERANCE 3 // (mm) Tolerance for early trigger (<= -probe.offset.z + ZPET)
|
#define Z_PROBE_ERROR_TOLERANCE 3 // (mm) Tolerance for early trigger (<= -probe.offset.z + ZPET)
|
||||||
//#define Z_AFTER_PROBING 5 // (mm) Z position after probing is done
|
//#define Z_AFTER_PROBING 5 // (mm) Z position after probing is done
|
||||||
|
|
||||||
#define Z_PROBE_LOW_POINT -5 // (mm) Farthest distance below the trigger-point to go before stopping
|
#define Z_PROBE_LOW_POINT -2 // (mm) Farthest distance below the trigger-point to go before stopping
|
||||||
|
|
||||||
// For M851 provide ranges for adjusting the X, Y, and Z probe offsets
|
// For M851 provide ranges for adjusting the X, Y, and Z probe offsets
|
||||||
//#define PROBE_OFFSET_XMIN -50 // (mm)
|
//#define PROBE_OFFSET_XMIN -50 // (mm)
|
||||||
@@ -1760,9 +1747,9 @@
|
|||||||
// @section motion
|
// @section motion
|
||||||
|
|
||||||
// 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 true
|
#define INVERT_X_DIR false
|
||||||
#define INVERT_Y_DIR false
|
#define INVERT_Y_DIR true
|
||||||
#define INVERT_Z_DIR true
|
#define INVERT_Z_DIR false
|
||||||
//#define INVERT_I_DIR false
|
//#define INVERT_I_DIR false
|
||||||
//#define INVERT_J_DIR false
|
//#define INVERT_J_DIR false
|
||||||
//#define INVERT_K_DIR false
|
//#define INVERT_K_DIR false
|
||||||
@@ -1832,8 +1819,8 @@
|
|||||||
// @section geometry
|
// @section geometry
|
||||||
|
|
||||||
// The size of the printable area
|
// The size of the printable area
|
||||||
#define X_BED_SIZE 1200
|
#define X_BED_SIZE 200
|
||||||
#define Y_BED_SIZE 1200
|
#define Y_BED_SIZE 200
|
||||||
|
|
||||||
// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
|
// Travel limits (linear=mm, rotational=°) after homing, corresponding to endstop positions.
|
||||||
#define X_MIN_POS 0
|
#define X_MIN_POS 0
|
||||||
@@ -1841,7 +1828,7 @@
|
|||||||
#define Z_MIN_POS 0
|
#define Z_MIN_POS 0
|
||||||
#define X_MAX_POS X_BED_SIZE
|
#define X_MAX_POS X_BED_SIZE
|
||||||
#define Y_MAX_POS Y_BED_SIZE
|
#define Y_MAX_POS Y_BED_SIZE
|
||||||
#define Z_MAX_POS 1000
|
#define Z_MAX_POS 200
|
||||||
//#define I_MIN_POS 0
|
//#define I_MIN_POS 0
|
||||||
//#define I_MAX_POS 50
|
//#define I_MAX_POS 50
|
||||||
//#define J_MIN_POS 0
|
//#define J_MIN_POS 0
|
||||||
@@ -1893,7 +1880,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ANY(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS)
|
#if ANY(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS)
|
||||||
#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD
|
//#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2052,7 +2039,7 @@
|
|||||||
*/
|
*/
|
||||||
//#define AUTO_BED_LEVELING_3POINT
|
//#define AUTO_BED_LEVELING_3POINT
|
||||||
//#define AUTO_BED_LEVELING_LINEAR
|
//#define AUTO_BED_LEVELING_LINEAR
|
||||||
#define AUTO_BED_LEVELING_BILINEAR
|
//#define AUTO_BED_LEVELING_BILINEAR
|
||||||
//#define AUTO_BED_LEVELING_UBL
|
//#define AUTO_BED_LEVELING_UBL
|
||||||
//#define MESH_BED_LEVELING
|
//#define MESH_BED_LEVELING
|
||||||
|
|
||||||
@@ -2060,14 +2047,14 @@
|
|||||||
* Commands to execute at the end of G29 probing.
|
* Commands to execute at the end of G29 probing.
|
||||||
* Useful to retract or move the Z probe out of the way.
|
* 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"
|
//#define EVENT_GCODE_AFTER_G29 "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
|
||||||
* leveling immediately after G28.
|
* leveling immediately after G28.
|
||||||
*/
|
*/
|
||||||
#define RESTORE_LEVELING_AFTER_G28
|
//#define RESTORE_LEVELING_AFTER_G28
|
||||||
//#define ENABLE_LEVELING_AFTER_G28
|
//#define ENABLE_LEVELING_AFTER_G28
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2082,7 +2069,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 PROGMEM!
|
* NOTE: Requires a lot of flash!
|
||||||
*/
|
*/
|
||||||
//#define DEBUG_LEVELING_FEATURE
|
//#define DEBUG_LEVELING_FEATURE
|
||||||
|
|
||||||
@@ -2099,7 +2086,7 @@
|
|||||||
*/
|
*/
|
||||||
#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 0.0 // (mm) Default fade height.
|
#define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2113,7 +2100,7 @@
|
|||||||
/**
|
/**
|
||||||
* Enable the G26 Mesh Validation Pattern tool.
|
* Enable the G26 Mesh Validation Pattern tool.
|
||||||
*/
|
*/
|
||||||
#define G26_MESH_VALIDATION
|
//#define G26_MESH_VALIDATION
|
||||||
#if ENABLED(G26_MESH_VALIDATION)
|
#if ENABLED(G26_MESH_VALIDATION)
|
||||||
#define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
|
#define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
|
||||||
#define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26.
|
#define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26.
|
||||||
@@ -2129,7 +2116,7 @@
|
|||||||
#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)
|
#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR)
|
||||||
|
|
||||||
// Set the number of grid points per dimension.
|
// Set the number of grid points per dimension.
|
||||||
#define GRID_MAX_POINTS_X 15
|
#define GRID_MAX_POINTS_X 3
|
||||||
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
||||||
|
|
||||||
// Probe along the Y axis, advancing X after each column
|
// Probe along the Y axis, advancing X after each column
|
||||||
@@ -2139,7 +2126,7 @@
|
|||||||
|
|
||||||
// Beyond the probed grid, continue the implied tilt?
|
// Beyond the probed grid, continue the implied tilt?
|
||||||
// Default is to maintain the height of the nearest edge.
|
// Default is to maintain the height of the nearest edge.
|
||||||
#define EXTRAPOLATE_BEYOND_GRID
|
//#define EXTRAPOLATE_BEYOND_GRID
|
||||||
|
|
||||||
//
|
//
|
||||||
// Subdivision of the grid by Catmull-Rom method.
|
// Subdivision of the grid by Catmull-Rom method.
|
||||||
@@ -2215,12 +2202,12 @@
|
|||||||
* Add a bed leveling sub-menu for ABL or MBL.
|
* Add a bed leveling sub-menu for ABL or MBL.
|
||||||
* Include a guided procedure if manual probing is enabled.
|
* Include a guided procedure if manual probing is enabled.
|
||||||
*/
|
*/
|
||||||
#define LCD_BED_LEVELING
|
//#define LCD_BED_LEVELING
|
||||||
|
|
||||||
#if ENABLED(LCD_BED_LEVELING)
|
#if ENABLED(LCD_BED_LEVELING)
|
||||||
#define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis.
|
#define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis.
|
||||||
#define LCD_PROBE_Z_RANGE 8 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment
|
#define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment
|
||||||
#define MESH_EDIT_MENU // Add a menu to edit mesh points
|
//#define MESH_EDIT_MENU // Add a menu to edit mesh points
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Add a menu item to move between bed corners for manual bed adjustment
|
// Add a menu item to move between bed corners for manual bed adjustment
|
||||||
@@ -2282,7 +2269,7 @@
|
|||||||
* - Allows Z homing only when XY positions are known and trusted.
|
* - Allows Z homing only when XY positions are known and trusted.
|
||||||
* - If stepper drivers sleep, XY homing may be required again before Z homing.
|
* - If stepper drivers sleep, XY homing may be required again before Z homing.
|
||||||
*/
|
*/
|
||||||
#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 // (mm) X point for Z homing
|
||||||
@@ -2369,12 +2356,12 @@
|
|||||||
* M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes)
|
* M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes)
|
||||||
* M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.)
|
* M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.)
|
||||||
*/
|
*/
|
||||||
#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 PROGMEM.
|
#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save flash.
|
||||||
#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.
|
||||||
//#define EEPROM_INIT_NOW // Init EEPROM on first boot after a new build.
|
//#define EEPROM_INIT_NOW // Init EEPROM on first boot after a new build.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -2432,11 +2419,11 @@
|
|||||||
* P1 Raise the nozzle always to Z-park height.
|
* P1 Raise the nozzle always to Z-park height.
|
||||||
* P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS.
|
* P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS.
|
||||||
*/
|
*/
|
||||||
#define NOZZLE_PARK_FEATURE
|
//#define NOZZLE_PARK_FEATURE
|
||||||
|
|
||||||
#if ENABLED(NOZZLE_PARK_FEATURE)
|
#if ENABLED(NOZZLE_PARK_FEATURE)
|
||||||
// Specify a park position as { X, Y, Z_raise }
|
// Specify a park position as { X, Y, Z_raise }
|
||||||
#define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
|
#define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 }
|
||||||
#define NOZZLE_PARK_MOVE 0 // Park motion: 0 = XY Move, 1 = X Only, 2 = Y Only, 3 = X before Y, 4 = Y before X
|
#define NOZZLE_PARK_MOVE 0 // Park motion: 0 = XY Move, 1 = X Only, 2 = Y Only, 3 = X before Y, 4 = Y before X
|
||||||
#define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance
|
#define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance
|
||||||
#define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis)
|
#define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis)
|
||||||
@@ -2659,7 +2646,7 @@
|
|||||||
* SD Card support is disabled by default. If your controller has an SD slot,
|
* SD Card support is disabled by default. If your controller has an SD slot,
|
||||||
* you must uncomment the following option or it won't work.
|
* you must uncomment the following option or it won't work.
|
||||||
*/
|
*/
|
||||||
#define SDSUPPORT
|
//#define SDSUPPORT
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SD CARD: ENABLE CRC
|
* SD CARD: ENABLE CRC
|
||||||
@@ -2739,7 +2726,7 @@
|
|||||||
//
|
//
|
||||||
// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu.
|
// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu.
|
||||||
//
|
//
|
||||||
#define INDIVIDUAL_AXIS_HOMING_MENU
|
//#define INDIVIDUAL_AXIS_HOMING_MENU
|
||||||
//#define INDIVIDUAL_AXIS_HOMING_SUBMENU
|
//#define INDIVIDUAL_AXIS_HOMING_SUBMENU
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2942,7 +2929,7 @@
|
|||||||
// RepRapDiscount FULL GRAPHIC Smart Controller
|
// RepRapDiscount FULL GRAPHIC Smart Controller
|
||||||
// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
|
// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
|
||||||
//
|
//
|
||||||
#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
|
//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
|
||||||
|
|
||||||
//
|
//
|
||||||
// K.3D Full Graphic Smart Controller
|
// K.3D Full Graphic Smart Controller
|
||||||
@@ -3050,7 +3037,7 @@
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Factory display for Creality CR-10 / CR-7 / Ender-3
|
// Factory display for Creality CR-10 / CR-7 / Ender-3
|
||||||
// https://www.aliexpress.com/item/32833148327.html
|
// https://marlinfw.org/docs/hardware/controllers.html#cr10_stockdisplay
|
||||||
//
|
//
|
||||||
// Connect to EXP1 on RAMPS and compatible boards.
|
// Connect to EXP1 on RAMPS and compatible boards.
|
||||||
//
|
//
|
||||||
|
|||||||
+77
-70
@@ -307,11 +307,11 @@
|
|||||||
#define THERMAL_PROTECTION_PERIOD 40 // (seconds)
|
#define THERMAL_PROTECTION_PERIOD 40 // (seconds)
|
||||||
#define THERMAL_PROTECTION_HYSTERESIS 4 // (°C)
|
#define THERMAL_PROTECTION_HYSTERESIS 4 // (°C)
|
||||||
|
|
||||||
#define ADAPTIVE_FAN_SLOWING // Slow down the part-cooling fan if the temperature drops
|
//#define ADAPTIVE_FAN_SLOWING // Slow down the part-cooling fan if the temperature drops
|
||||||
#if ENABLED(ADAPTIVE_FAN_SLOWING)
|
#if ENABLED(ADAPTIVE_FAN_SLOWING)
|
||||||
//#define REPORT_ADAPTIVE_FAN_SLOWING // Report fan slowing activity to the console
|
//#define REPORT_ADAPTIVE_FAN_SLOWING // Report fan slowing activity to the console
|
||||||
#if ANY(MPCTEMP, PIDTEMP)
|
#if ANY(MPCTEMP, PIDTEMP)
|
||||||
#define TEMP_TUNING_MAINTAIN_FAN // Don't slow down the fan speed during M303 or M306 T
|
//#define TEMP_TUNING_MAINTAIN_FAN // Don't slow down the fan speed during M303 or M306 T
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -335,7 +335,7 @@
|
|||||||
* Thermal Protection parameters for the bed are just as above for hotends.
|
* Thermal Protection parameters for the bed are just as above for hotends.
|
||||||
*/
|
*/
|
||||||
#if ENABLED(THERMAL_PROTECTION_BED)
|
#if ENABLED(THERMAL_PROTECTION_BED)
|
||||||
#define THERMAL_PROTECTION_BED_PERIOD 90 // (seconds)
|
#define THERMAL_PROTECTION_BED_PERIOD 20 // (seconds)
|
||||||
#define THERMAL_PROTECTION_BED_HYSTERESIS 2 // (°C)
|
#define THERMAL_PROTECTION_BED_HYSTERESIS 2 // (°C)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -459,7 +459,7 @@
|
|||||||
#define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
|
#define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed)
|
#define PID_FAN_SCALING_LIN_FACTOR (0) // Power-loss due to cooling = Kf * (fan_speed)
|
||||||
#define DEFAULT_Kf 10 // A constant value added to the PID-tuner
|
#define DEFAULT_Kf 10 // A constant value added to the PID-tuner
|
||||||
#define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
|
#define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
|
||||||
#endif
|
#endif
|
||||||
@@ -547,10 +547,10 @@
|
|||||||
* Hotend Idle Timeout
|
* Hotend Idle Timeout
|
||||||
* Prevent filament in the nozzle from charring and causing a critical jam.
|
* Prevent filament in the nozzle from charring and causing a critical jam.
|
||||||
*/
|
*/
|
||||||
#define HOTEND_IDLE_TIMEOUT
|
//#define HOTEND_IDLE_TIMEOUT
|
||||||
#if ENABLED(HOTEND_IDLE_TIMEOUT)
|
#if ENABLED(HOTEND_IDLE_TIMEOUT)
|
||||||
#define HOTEND_IDLE_TIMEOUT_SEC (30*60) // (seconds) Time without extruder movement to trigger protection
|
#define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection
|
||||||
#define HOTEND_IDLE_MIN_TRIGGER 170 // (°C) Minimum temperature to enable hotend protection
|
#define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection
|
||||||
#define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout
|
#define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout
|
||||||
#define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout
|
#define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout
|
||||||
#endif
|
#endif
|
||||||
@@ -602,8 +602,8 @@
|
|||||||
* gets it spinning reliably for a short time before setting the requested speed.
|
* gets it spinning reliably for a short time before setting the requested speed.
|
||||||
* (Does not work on Sanguinololu with FAN_SOFT_PWM.)
|
* (Does not work on Sanguinololu with FAN_SOFT_PWM.)
|
||||||
*/
|
*/
|
||||||
#define FAN_KICKSTART_TIME 100 // (ms)
|
//#define FAN_KICKSTART_TIME 100 // (ms)
|
||||||
#define FAN_KICKSTART_POWER 180 // 64-255
|
//#define FAN_KICKSTART_POWER 180 // 64-255
|
||||||
|
|
||||||
// Some coolers may require a non-zero "off" state.
|
// Some coolers may require a non-zero "off" state.
|
||||||
//#define FAN_OFF_PWM 1
|
//#define FAN_OFF_PWM 1
|
||||||
@@ -931,7 +931,7 @@
|
|||||||
//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (linear=mm, rotational=°) Backoff from endstops after homing
|
//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (linear=mm, rotational=°) Backoff from endstops after homing
|
||||||
//#define XY_COUNTERPART_BACKOFF_MM 0 // (mm) Backoff X after homing Y, and vice-versa
|
//#define XY_COUNTERPART_BACKOFF_MM 0 // (mm) Backoff X after homing Y, and vice-versa
|
||||||
|
|
||||||
#define QUICK_HOME // If G28 contains XY do a diagonal move first
|
//#define QUICK_HOME // If G28 contains XY do a diagonal move first
|
||||||
//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
|
//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X
|
||||||
//#define HOME_Z_FIRST // Home Z first. Requires a real endstop (not a probe).
|
//#define HOME_Z_FIRST // Home Z first. Requires a real endstop (not a probe).
|
||||||
//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first
|
//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first
|
||||||
@@ -1020,7 +1020,7 @@
|
|||||||
* Z Steppers Auto-Alignment
|
* Z Steppers Auto-Alignment
|
||||||
* Add the G34 command to align multiple Z steppers using a bed probe.
|
* Add the G34 command to align multiple Z steppers using a bed probe.
|
||||||
*/
|
*/
|
||||||
#define Z_STEPPER_AUTO_ALIGN
|
//#define Z_STEPPER_AUTO_ALIGN
|
||||||
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
#if ENABLED(Z_STEPPER_AUTO_ALIGN)
|
||||||
/**
|
/**
|
||||||
* Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]]
|
* Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]]
|
||||||
@@ -1281,7 +1281,7 @@
|
|||||||
// Backlash Compensation
|
// Backlash Compensation
|
||||||
// Adds extra movement to axes on direction-changes to account for backlash.
|
// Adds extra movement to axes on direction-changes to account for backlash.
|
||||||
//
|
//
|
||||||
#define BACKLASH_COMPENSATION
|
//#define BACKLASH_COMPENSATION
|
||||||
#if ENABLED(BACKLASH_COMPENSATION)
|
#if ENABLED(BACKLASH_COMPENSATION)
|
||||||
// Define values for backlash distance and correction.
|
// Define values for backlash distance and correction.
|
||||||
// If BACKLASH_GCODE is enabled these values are the defaults.
|
// If BACKLASH_GCODE is enabled these values are the defaults.
|
||||||
@@ -1296,7 +1296,7 @@
|
|||||||
//#define BACKLASH_SMOOTHING_MM 3 // (mm)
|
//#define BACKLASH_SMOOTHING_MM 3 // (mm)
|
||||||
|
|
||||||
// Add runtime configuration and tuning of backlash values (M425)
|
// Add runtime configuration and tuning of backlash values (M425)
|
||||||
#define BACKLASH_GCODE
|
//#define BACKLASH_GCODE
|
||||||
|
|
||||||
#if ENABLED(BACKLASH_GCODE)
|
#if ENABLED(BACKLASH_GCODE)
|
||||||
// Measure the Z backlash when probing (G29) and set with "M425 Z"
|
// Measure the Z backlash when probing (G29) and set with "M425 Z"
|
||||||
@@ -1342,7 +1342,7 @@
|
|||||||
#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm
|
#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm
|
||||||
#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm
|
#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm
|
||||||
|
|
||||||
// Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM).
|
// Uncomment to enable reporting (required for "G425 V", but consumes flash).
|
||||||
//#define CALIBRATION_REPORTING
|
//#define CALIBRATION_REPORTING
|
||||||
|
|
||||||
// The true location and dimension the cube/bolt/washer on the bed.
|
// The true location and dimension the cube/bolt/washer on the bed.
|
||||||
@@ -1386,7 +1386,7 @@
|
|||||||
* Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates.
|
* Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates.
|
||||||
* This allows higher feedrates than the MCU could otherwise support.
|
* This allows higher feedrates than the MCU could otherwise support.
|
||||||
*/
|
*/
|
||||||
#define MULTISTEPPING_LIMIT 32 //: [1, 2, 4, 8, 16, 32, 64, 128]
|
#define MULTISTEPPING_LIMIT 16 //: [1, 2, 4, 8, 16, 32, 64, 128]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
|
* Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
|
||||||
@@ -1394,7 +1394,7 @@
|
|||||||
* vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the
|
* vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the
|
||||||
* lowest stepping frequencies.
|
* lowest stepping frequencies.
|
||||||
*/
|
*/
|
||||||
#define ADAPTIVE_STEP_SMOOTHING
|
//#define ADAPTIVE_STEP_SMOOTHING
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom Microstepping
|
* Custom Microstepping
|
||||||
@@ -1474,6 +1474,7 @@
|
|||||||
#if IS_ULTIPANEL
|
#if IS_ULTIPANEL
|
||||||
#define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position"
|
#define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position"
|
||||||
#define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen
|
#define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen
|
||||||
|
//#define ULTIPANEL_FLOWPERCENT // Encoder sets the flow percentage on the Status Screen
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1528,7 +1529,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Include a page of printer information in the LCD Main Menu
|
// Include a page of printer information in the LCD Main Menu
|
||||||
#define LCD_INFO_MENU
|
//#define LCD_INFO_MENU
|
||||||
#if ENABLED(LCD_INFO_MENU)
|
#if ENABLED(LCD_INFO_MENU)
|
||||||
//#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages
|
//#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages
|
||||||
#endif
|
#endif
|
||||||
@@ -1539,6 +1540,7 @@
|
|||||||
* Axis moves <= 1/2 the axis length and Extruder moves <= EXTRUDE_MAXLENGTH
|
* Axis moves <= 1/2 the axis length and Extruder moves <= EXTRUDE_MAXLENGTH
|
||||||
* will be shown in the move submenus.
|
* will be shown in the move submenus.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MANUAL_MOVE_DISTANCE_MM 10, 1.0, 0.1 // (mm)
|
#define MANUAL_MOVE_DISTANCE_MM 10, 1.0, 0.1 // (mm)
|
||||||
//#define MANUAL_MOVE_DISTANCE_MM 100, 50, 10, 1.0, 0.1 // (mm)
|
//#define MANUAL_MOVE_DISTANCE_MM 100, 50, 10, 1.0, 0.1 // (mm)
|
||||||
//#define MANUAL_MOVE_DISTANCE_MM 500, 100, 50, 10, 1.0, 0.1 // (mm)
|
//#define MANUAL_MOVE_DISTANCE_MM 500, 100, 50, 10, 1.0, 0.1 // (mm)
|
||||||
@@ -1580,7 +1582,7 @@
|
|||||||
#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
|
#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash)
|
||||||
#endif
|
#endif
|
||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
|
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
|
||||||
#endif
|
#endif
|
||||||
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE)
|
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE)
|
||||||
//#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup.
|
//#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup.
|
||||||
@@ -1599,10 +1601,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The timeout to return to the status screen from sub-menus
|
// The timeout to return to the status screen from sub-menus
|
||||||
#define LCD_TIMEOUT_TO_STATUS 15000 // (ms)
|
//#define LCD_TIMEOUT_TO_STATUS 15000 // (ms)
|
||||||
|
|
||||||
// Scroll a longer status message into view
|
// Scroll a longer status message into view
|
||||||
#define STATUS_MESSAGE_SCROLLING
|
//#define STATUS_MESSAGE_SCROLLING
|
||||||
|
|
||||||
// Apply a timeout to low-priority status messages
|
// Apply a timeout to low-priority status messages
|
||||||
//#define STATUS_MESSAGE_TIMEOUT_SEC 30 // (seconds)
|
//#define STATUS_MESSAGE_TIMEOUT_SEC 30 // (seconds)
|
||||||
@@ -1654,7 +1656,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Add 'M73' to set print job progress, overrides Marlin's built-in estimate
|
// Add 'M73' to set print job progress, overrides Marlin's built-in estimate
|
||||||
#define SET_PROGRESS_MANUALLY
|
//#define SET_PROGRESS_MANUALLY
|
||||||
#if ENABLED(SET_PROGRESS_MANUALLY)
|
#if ENABLED(SET_PROGRESS_MANUALLY)
|
||||||
#define SET_PROGRESS_PERCENT // Add 'P' parameter to set percentage done
|
#define SET_PROGRESS_PERCENT // Add 'P' parameter to set percentage done
|
||||||
#define SET_REMAINING_TIME // Add 'R' parameter to set remaining time
|
#define SET_REMAINING_TIME // Add 'R' parameter to set remaining time
|
||||||
@@ -1743,21 +1745,26 @@
|
|||||||
*/
|
*/
|
||||||
//#define POWER_LOSS_RECOVERY
|
//#define POWER_LOSS_RECOVERY
|
||||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||||
#define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
|
#define PLR_ENABLED_DEFAULT false // Power-Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
|
||||||
//#define PLR_BED_THRESHOLD BED_MAXTEMP // (°C) Skip user confirmation at or above this bed temperature (0 to disable)
|
//#define PLR_BED_THRESHOLD BED_MAXTEMP // (°C) Skip user confirmation at or above this bed temperature (0 to disable)
|
||||||
//#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss
|
|
||||||
//#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS)
|
//#define POWER_LOSS_PIN 44 // Pin to detect power-loss. Set to -1 to disable default pin on boards without module, or comment to use board default.
|
||||||
//#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module.
|
//#define POWER_LOSS_STATE HIGH // State of pin indicating power-loss
|
||||||
//#define POWER_LOSS_STATE HIGH // State of pin indicating power loss
|
|
||||||
//#define POWER_LOSS_PULLUP // Set pullup / pulldown as appropriate for your sensor
|
//#define POWER_LOSS_PULLUP // Set pullup / pulldown as appropriate for your sensor
|
||||||
//#define POWER_LOSS_PULLDOWN
|
//#define POWER_LOSS_PULLDOWN
|
||||||
//#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume
|
|
||||||
//#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power.
|
//#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power-loss with UPS)
|
||||||
|
//#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume
|
||||||
|
|
||||||
// Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card,
|
// Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card,
|
||||||
// especially with "vase mode" printing. Set too high and vases cannot be continued.
|
// especially with "vase mode" printing. Set too high and vases cannot be continued.
|
||||||
#define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data
|
#define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data
|
||||||
|
|
||||||
|
//#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power-loss
|
||||||
|
#if ENABLED(BACKUP_POWER_SUPPLY)
|
||||||
|
//#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail
|
||||||
|
#endif
|
||||||
|
|
||||||
// Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled!
|
// Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled!
|
||||||
//#define POWER_LOSS_RECOVER_ZHOME
|
//#define POWER_LOSS_RECOVER_ZHOME
|
||||||
#if ENABLED(POWER_LOSS_RECOVER_ZHOME)
|
#if ENABLED(POWER_LOSS_RECOVER_ZHOME)
|
||||||
@@ -1806,13 +1813,13 @@
|
|||||||
|
|
||||||
// Allow international symbols in long filenames. To display correctly, the
|
// Allow international symbols in long filenames. To display correctly, the
|
||||||
// LCD's font must contain the characters. Check your selected LCD language.
|
// LCD's font must contain the characters. Check your selected LCD language.
|
||||||
#define UTF_FILENAME_SUPPORT
|
//#define UTF_FILENAME_SUPPORT
|
||||||
|
|
||||||
#define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 <dosname>' and list long filenames with 'M20 L'
|
//#define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 <dosname>' and list long filenames with 'M20 L'
|
||||||
//#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol
|
//#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol
|
||||||
//#define M20_TIMESTAMP_SUPPORT // Include timestamps by adding the 'T' flag to M20 commands
|
//#define M20_TIMESTAMP_SUPPORT // Include timestamps by adding the 'T' flag to M20 commands
|
||||||
|
|
||||||
#define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu
|
//#define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu
|
||||||
|
|
||||||
//#define SD_ABORT_NO_COOLDOWN // Leave the heaters on after Stop Print (not recommended!)
|
//#define SD_ABORT_NO_COOLDOWN // Leave the heaters on after Stop Print (not recommended!)
|
||||||
|
|
||||||
@@ -1913,7 +1920,7 @@
|
|||||||
*
|
*
|
||||||
* :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ]
|
* :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ]
|
||||||
*/
|
*/
|
||||||
#define SDCARD_CONNECTION ONBOARD
|
//#define SDCARD_CONNECTION LCD
|
||||||
|
|
||||||
// Enable if SD detect is rendered useless (e.g., by using an SD extender)
|
// Enable if SD detect is rendered useless (e.g., by using an SD extender)
|
||||||
//#define NO_SD_DETECT
|
//#define NO_SD_DETECT
|
||||||
@@ -2263,18 +2270,18 @@
|
|||||||
*
|
*
|
||||||
* Warning: Does not respect endstops!
|
* Warning: Does not respect endstops!
|
||||||
*/
|
*/
|
||||||
#define BABYSTEPPING
|
//#define BABYSTEPPING
|
||||||
#if ENABLED(BABYSTEPPING)
|
#if ENABLED(BABYSTEPPING)
|
||||||
//#define EP_BABYSTEPPING // M293/M294 babystepping with EMERGENCY_PARSER support
|
//#define EP_BABYSTEPPING // M293/M294 babystepping with EMERGENCY_PARSER support
|
||||||
//#define BABYSTEP_WITHOUT_HOMING
|
//#define BABYSTEP_WITHOUT_HOMING
|
||||||
#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement)
|
//#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement)
|
||||||
//#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA!
|
//#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA!
|
||||||
//#define BABYSTEP_INVERT_Z // Enable if Z babysteps should go the other way
|
//#define BABYSTEP_INVERT_Z // Enable if Z babysteps should go the other way
|
||||||
//#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps
|
//#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps
|
||||||
#define BABYSTEP_MULTIPLICATOR_Z 25 // (steps or mm) Steps or millimeter distance for each Z babystep
|
#define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep
|
||||||
#define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep
|
#define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep
|
||||||
|
|
||||||
#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
|
//#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
|
||||||
#if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING)
|
#if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING)
|
||||||
#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
|
#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
|
||||||
// Note: Extra time may be added to mitigate controller latency.
|
// Note: Extra time may be added to mitigate controller latency.
|
||||||
@@ -2286,7 +2293,7 @@
|
|||||||
|
|
||||||
//#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28
|
//#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28
|
||||||
|
|
||||||
#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping
|
//#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping
|
||||||
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
|
||||||
//#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets
|
//#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets
|
||||||
//#define BABYSTEP_GFX_OVERLAY // Enable graphical overlay on Z-offset editor
|
//#define BABYSTEP_GFX_OVERLAY // Enable graphical overlay on Z-offset editor
|
||||||
@@ -2310,7 +2317,7 @@
|
|||||||
*
|
*
|
||||||
* See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
|
* See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
|
||||||
*/
|
*/
|
||||||
#define LIN_ADVANCE
|
//#define LIN_ADVANCE
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
#if ENABLED(DISTINCT_E_FACTORS)
|
#if ENABLED(DISTINCT_E_FACTORS)
|
||||||
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder
|
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder
|
||||||
@@ -2503,7 +2510,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// G5 Bézier Curve Support with XYZE destination and IJPQ offsets
|
// G5 Bézier Curve Support with XYZE destination and IJPQ offsets
|
||||||
#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes
|
//#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes
|
||||||
|
|
||||||
#if ANY(ARC_SUPPORT, BEZIER_CURVE_SUPPORT)
|
#if ANY(ARC_SUPPORT, BEZIER_CURVE_SUPPORT)
|
||||||
//#define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes
|
//#define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes
|
||||||
@@ -2564,7 +2571,7 @@
|
|||||||
*
|
*
|
||||||
* Override the default value based on the driver type set in Configuration.h.
|
* Override the default value based on the driver type set in Configuration.h.
|
||||||
*/
|
*/
|
||||||
//#define MINIMUM_STEPPER_PULSE 5
|
//#define MINIMUM_STEPPER_PULSE 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum stepping rate (in Hz) the stepper driver allows
|
* Maximum stepping rate (in Hz) the stepper driver allows
|
||||||
@@ -2578,7 +2585,7 @@
|
|||||||
*
|
*
|
||||||
* Override the default value based on the driver type set in Configuration.h.
|
* Override the default value based on the driver type set in Configuration.h.
|
||||||
*/
|
*/
|
||||||
//#define MAXIMUM_STEPPER_RATE 150000
|
//#define MAXIMUM_STEPPER_RATE 250000
|
||||||
|
|
||||||
// @section temperature
|
// @section temperature
|
||||||
|
|
||||||
@@ -2595,16 +2602,16 @@
|
|||||||
#if ALL(HAS_MEDIA, DIRECT_STEPPING)
|
#if ALL(HAS_MEDIA, DIRECT_STEPPING)
|
||||||
#define BLOCK_BUFFER_SIZE 8
|
#define BLOCK_BUFFER_SIZE 8
|
||||||
#elif HAS_MEDIA
|
#elif HAS_MEDIA
|
||||||
#define BLOCK_BUFFER_SIZE 32
|
#define BLOCK_BUFFER_SIZE 16
|
||||||
#else
|
#else
|
||||||
#define BLOCK_BUFFER_SIZE 32
|
#define BLOCK_BUFFER_SIZE 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section serial
|
// @section serial
|
||||||
|
|
||||||
// The ASCII buffer for serial input
|
// The ASCII buffer for serial input
|
||||||
#define MAX_CMD_SIZE 96
|
#define MAX_CMD_SIZE 96
|
||||||
#define BUFSIZE 16
|
#define BUFSIZE 4
|
||||||
|
|
||||||
// Transmission to Host Buffer Size
|
// Transmission to Host Buffer Size
|
||||||
// To save 386 bytes of flash (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0.
|
// To save 386 bytes of flash (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0.
|
||||||
@@ -2651,7 +2658,7 @@
|
|||||||
* Currently handles M108, M112, M410, M876
|
* Currently handles M108, M112, M410, M876
|
||||||
* NOTE: Not yet implemented for all platforms.
|
* NOTE: Not yet implemented for all platforms.
|
||||||
*/
|
*/
|
||||||
#define EMERGENCY_PARSER
|
//#define EMERGENCY_PARSER
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Realtime Reporting (requires EMERGENCY_PARSER)
|
* Realtime Reporting (requires EMERGENCY_PARSER)
|
||||||
@@ -2682,7 +2689,7 @@
|
|||||||
//#define NO_TIMEOUTS 1000 // (ms)
|
//#define NO_TIMEOUTS 1000 // (ms)
|
||||||
|
|
||||||
// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary.
|
// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary.
|
||||||
#define ADVANCED_OK
|
//#define ADVANCED_OK
|
||||||
|
|
||||||
// Printrun may have trouble receiving long strings all at once.
|
// Printrun may have trouble receiving long strings all at once.
|
||||||
// This option inserts short delays between lines of serial output.
|
// This option inserts short delays between lines of serial output.
|
||||||
@@ -2884,7 +2891,7 @@
|
|||||||
*
|
*
|
||||||
* Enable PARK_HEAD_ON_PAUSE to add the G-code M125 Pause and Park.
|
* Enable PARK_HEAD_ON_PAUSE to add the G-code M125 Pause and Park.
|
||||||
*/
|
*/
|
||||||
#define ADVANCED_PAUSE_FEATURE
|
//#define ADVANCED_PAUSE_FEATURE
|
||||||
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
||||||
#define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate.
|
#define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate.
|
||||||
#define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract.
|
#define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract.
|
||||||
@@ -2924,11 +2931,11 @@
|
|||||||
//#define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is triggered again.
|
//#define FILAMENT_CHANGE_RESUME_ON_INSERT // Automatically continue / load filament when runout sensor is triggered again.
|
||||||
//#define PAUSE_REHEAT_FAST_RESUME // Reduce number of waits by not prompting again post-timeout before continuing.
|
//#define PAUSE_REHEAT_FAST_RESUME // Reduce number of waits by not prompting again post-timeout before continuing.
|
||||||
|
|
||||||
#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change.
|
//#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change.
|
||||||
//#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change
|
//#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change
|
||||||
|
|
||||||
#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu.
|
//#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu.
|
||||||
#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302)
|
//#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302)
|
||||||
#define CONFIGURE_FILAMENT_CHANGE // Add M603 G-code and menu items. Requires ~1.3K bytes of flash.
|
#define CONFIGURE_FILAMENT_CHANGE // Add M603 G-code and menu items. Requires ~1.3K bytes of flash.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -2960,7 +2967,7 @@
|
|||||||
*/
|
*/
|
||||||
#if HAS_TRINAMIC_CONFIG || HAS_TMC26X
|
#if HAS_TRINAMIC_CONFIG || HAS_TMC26X
|
||||||
|
|
||||||
#define HOLD_MULTIPLIER 0.7 // Scales down the holding current from run current
|
#define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interpolate microsteps to 256
|
* Interpolate microsteps to 256
|
||||||
@@ -2972,7 +2979,7 @@
|
|||||||
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
|
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
|
||||||
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing
|
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing
|
||||||
#define X_MICROSTEPS 16 // 0..256
|
#define X_MICROSTEPS 16 // 0..256
|
||||||
#define X_RSENSE 0.022 // Multiplied x1000 for TMC26X
|
#define X_RSENSE 0.11 // Multiplied x1000 for TMC26X
|
||||||
#define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ...
|
#define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ...
|
||||||
//#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis
|
//#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis
|
||||||
//#define X_HOLD_MULTIPLIER 0.5 // Enable to override 'HOLD_MULTIPLIER' for the X axis
|
//#define X_HOLD_MULTIPLIER 0.5 // Enable to override 'HOLD_MULTIPLIER' for the X axis
|
||||||
@@ -2992,7 +2999,7 @@
|
|||||||
#define Y_CURRENT 800
|
#define Y_CURRENT 800
|
||||||
#define Y_CURRENT_HOME Y_CURRENT
|
#define Y_CURRENT_HOME Y_CURRENT
|
||||||
#define Y_MICROSTEPS 16
|
#define Y_MICROSTEPS 16
|
||||||
#define Y_RSENSE 0.022
|
#define Y_RSENSE 0.11
|
||||||
#define Y_CHAIN_POS -1
|
#define Y_CHAIN_POS -1
|
||||||
//#define Y_INTERPOLATE true
|
//#define Y_INTERPOLATE true
|
||||||
//#define Y_HOLD_MULTIPLIER 0.5
|
//#define Y_HOLD_MULTIPLIER 0.5
|
||||||
@@ -3109,7 +3116,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if AXIS_IS_TMC_CONFIG(E0)
|
#if AXIS_IS_TMC_CONFIG(E0)
|
||||||
#define E0_CURRENT 900
|
#define E0_CURRENT 800
|
||||||
#define E0_MICROSTEPS 16
|
#define E0_MICROSTEPS 16
|
||||||
#define E0_RSENSE 0.11
|
#define E0_RSENSE 0.11
|
||||||
#define E0_CHAIN_POS -1
|
#define E0_CHAIN_POS -1
|
||||||
@@ -3214,7 +3221,7 @@
|
|||||||
* The default SW SPI pins are defined the respective pins files,
|
* The default SW SPI pins are defined the respective pins files,
|
||||||
* but you can override or define them here.
|
* but you can override or define them here.
|
||||||
*/
|
*/
|
||||||
#define TMC_USE_SW_SPI
|
//#define TMC_USE_SW_SPI
|
||||||
//#define TMC_SPI_MOSI -1
|
//#define TMC_SPI_MOSI -1
|
||||||
//#define TMC_SPI_MISO -1
|
//#define TMC_SPI_MISO -1
|
||||||
//#define TMC_SPI_SCK -1
|
//#define TMC_SPI_SCK -1
|
||||||
@@ -3274,7 +3281,7 @@
|
|||||||
* When disabled, Marlin will use spreadCycle stepping mode.
|
* When disabled, Marlin will use spreadCycle stepping mode.
|
||||||
*/
|
*/
|
||||||
#if HAS_STEALTHCHOP
|
#if HAS_STEALTHCHOP
|
||||||
//#define STEALTHCHOP_XY
|
#define STEALTHCHOP_XY
|
||||||
#define STEALTHCHOP_Z
|
#define STEALTHCHOP_Z
|
||||||
#define STEALTHCHOP_I
|
#define STEALTHCHOP_I
|
||||||
#define STEALTHCHOP_J
|
#define STEALTHCHOP_J
|
||||||
@@ -3282,7 +3289,7 @@
|
|||||||
#define STEALTHCHOP_U
|
#define STEALTHCHOP_U
|
||||||
#define STEALTHCHOP_V
|
#define STEALTHCHOP_V
|
||||||
#define STEALTHCHOP_W
|
#define STEALTHCHOP_W
|
||||||
//#define STEALTHCHOP_E
|
#define STEALTHCHOP_E
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3300,11 +3307,11 @@
|
|||||||
* Define your own with:
|
* Define your own with:
|
||||||
* { <off_time[1..15]>, <hysteresis_end[-3..12]>, hysteresis_start[1..8] }
|
* { <off_time[1..15]>, <hysteresis_end[-3..12]>, hysteresis_start[1..8] }
|
||||||
*/
|
*/
|
||||||
//#define CHOPPER_TIMING CHOPPER_DEFAULT_36V // All axes (override below)
|
#define CHOPPER_TIMING CHOPPER_DEFAULT_12V // All axes (override below)
|
||||||
#define CHOPPER_TIMING_X CHOPPER_DEFAULT_36V // For X Axes (override below)
|
//#define CHOPPER_TIMING_X CHOPPER_TIMING // For X Axes (override below)
|
||||||
//#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X
|
//#define CHOPPER_TIMING_X2 CHOPPER_TIMING_X
|
||||||
#define CHOPPER_TIMING_Y CHOPPER_DEFAULT_36V // For Y Axes (override below)
|
//#define CHOPPER_TIMING_Y CHOPPER_TIMING // For Y Axes (override below)
|
||||||
#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y
|
//#define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y
|
||||||
//#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below)
|
//#define CHOPPER_TIMING_Z CHOPPER_TIMING // For Z Axes (override below)
|
||||||
//#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z
|
//#define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z
|
||||||
//#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z
|
//#define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z
|
||||||
@@ -3315,7 +3322,7 @@
|
|||||||
//#define CHOPPER_TIMING_U CHOPPER_TIMING // For U Axis
|
//#define CHOPPER_TIMING_U CHOPPER_TIMING // For U Axis
|
||||||
//#define CHOPPER_TIMING_V CHOPPER_TIMING // For V Axis
|
//#define CHOPPER_TIMING_V CHOPPER_TIMING // For V Axis
|
||||||
//#define CHOPPER_TIMING_W CHOPPER_TIMING // For W Axis
|
//#define CHOPPER_TIMING_W CHOPPER_TIMING // For W Axis
|
||||||
#define CHOPPER_TIMING_E CHOPPER_DEFAULT_24V // For Extruders (override below)
|
//#define CHOPPER_TIMING_E CHOPPER_TIMING // For Extruders (override below)
|
||||||
//#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E
|
//#define CHOPPER_TIMING_E1 CHOPPER_TIMING_E
|
||||||
//#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E
|
//#define CHOPPER_TIMING_E2 CHOPPER_TIMING_E
|
||||||
//#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E
|
//#define CHOPPER_TIMING_E3 CHOPPER_TIMING_E
|
||||||
@@ -3337,12 +3344,12 @@
|
|||||||
* M912 - Clear stepper driver overtemperature pre-warn condition flag.
|
* M912 - Clear stepper driver overtemperature pre-warn condition flag.
|
||||||
* M122 - Report driver parameters (Requires TMC_DEBUG)
|
* M122 - Report driver parameters (Requires TMC_DEBUG)
|
||||||
*/
|
*/
|
||||||
#define MONITOR_DRIVER_STATUS
|
//#define MONITOR_DRIVER_STATUS
|
||||||
|
|
||||||
#if ENABLED(MONITOR_DRIVER_STATUS)
|
#if ENABLED(MONITOR_DRIVER_STATUS)
|
||||||
#define CURRENT_STEP_DOWN 50 // [mA]
|
#define CURRENT_STEP_DOWN 50 // [mA]
|
||||||
#define REPORT_CURRENT_CHANGE
|
#define REPORT_CURRENT_CHANGE
|
||||||
//#define STOP_ON_ERROR
|
#define STOP_ON_ERROR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section tmc/hybrid
|
// @section tmc/hybrid
|
||||||
@@ -3444,7 +3451,7 @@
|
|||||||
/**
|
/**
|
||||||
* Step on both rising and falling edge signals (as with a square wave).
|
* Step on both rising and falling edge signals (as with a square wave).
|
||||||
*/
|
*/
|
||||||
#define EDGE_STEPPING
|
//#define EDGE_STEPPING
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable M122 debugging command for TMC stepper drivers.
|
* Enable M122 debugging command for TMC stepper drivers.
|
||||||
@@ -4113,14 +4120,14 @@
|
|||||||
* Host Prompt Support enables Marlin to use the host for user prompts so
|
* Host Prompt Support enables Marlin to use the host for user prompts so
|
||||||
* filament runout and other processes can be managed from the host side.
|
* filament runout and other processes can be managed from the host side.
|
||||||
*/
|
*/
|
||||||
#define HOST_ACTION_COMMANDS
|
//#define HOST_ACTION_COMMANDS
|
||||||
#if ENABLED(HOST_ACTION_COMMANDS)
|
#if ENABLED(HOST_ACTION_COMMANDS)
|
||||||
//#define HOST_PAUSE_M76 // Tell the host to pause in response to M76
|
//#define HOST_PAUSE_M76 // Tell the host to pause in response to M76
|
||||||
#define HOST_PROMPT_SUPPORT // Initiate host prompts to get user feedback
|
//#define HOST_PROMPT_SUPPORT // Initiate host prompts to get user feedback
|
||||||
#if ENABLED(HOST_PROMPT_SUPPORT)
|
#if ENABLED(HOST_PROMPT_SUPPORT)
|
||||||
#define HOST_STATUS_NOTIFICATIONS // Send some status messages to the host as notifications
|
//#define HOST_STATUS_NOTIFICATIONS // Send some status messages to the host as notifications
|
||||||
#endif
|
#endif
|
||||||
#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
|
//#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start
|
||||||
//#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down
|
//#define HOST_SHUTDOWN_MENU_ITEM // Add a menu item that tells the host to shut down
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4488,7 +4495,7 @@
|
|||||||
//
|
//
|
||||||
// M42 - Set pin states
|
// M42 - Set pin states
|
||||||
//
|
//
|
||||||
#define DIRECT_PIN_CONTROL
|
//#define DIRECT_PIN_CONTROL
|
||||||
|
|
||||||
//
|
//
|
||||||
// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe
|
// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe
|
||||||
|
|||||||
+1
-1
@@ -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-27"
|
//#define STRING_DISTRIBUTION_DATE "2024-01-31"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
#else
|
#else
|
||||||
#define G2_PWM_Z 0
|
#define G2_PWM_Z 0
|
||||||
#endif
|
#endif
|
||||||
#if HAS_MOTOR_CURRENT_PWM_E
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
|
||||||
#define G2_PWM_E 1
|
#define G2_PWM_E 1
|
||||||
#else
|
#else
|
||||||
#define G2_PWM_E 0
|
#define G2_PWM_E 0
|
||||||
|
|||||||
@@ -18,32 +18,32 @@ extern "C" {
|
|||||||
void sd_mmc_spi_mem_init() {
|
void sd_mmc_spi_mem_init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool media_ready() {
|
|
||||||
return IS_SD_INSERTED() && !IS_SD_PRINTING() && !IS_SD_FILE_OPEN() && card.isMounted();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sd_mmc_spi_unload(bool) { return true; }
|
|
||||||
|
|
||||||
bool sd_mmc_spi_wr_protect() { return false; }
|
|
||||||
|
|
||||||
bool sd_mmc_spi_removal() { return !media_ready(); }
|
|
||||||
|
|
||||||
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
||||||
#ifdef DISABLE_DUE_SD_MMC
|
#ifdef DISABLE_DUE_SD_MMC
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
#endif
|
#endif
|
||||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
|
return CTRL_NO_PRESENT;
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: This function is defined as returning the address of the last block
|
// NOTE: This function is defined as returning the address of the last block
|
||||||
// in the card, which is cardSize() - 1
|
// in the card, which is cardSize() - 1
|
||||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
|
return CTRL_NO_PRESENT;
|
||||||
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sd_mmc_spi_unload(bool) { return true; }
|
||||||
|
|
||||||
|
bool sd_mmc_spi_wr_protect() { return false; }
|
||||||
|
|
||||||
|
bool sd_mmc_spi_removal() {
|
||||||
|
return (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted());
|
||||||
|
}
|
||||||
|
|
||||||
#if ACCESS_USB == true
|
#if ACCESS_USB == true
|
||||||
/**
|
/**
|
||||||
* \name MEM <-> USB Interface
|
* \name MEM <-> USB Interface
|
||||||
@@ -61,7 +61,8 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
#ifdef DISABLE_DUE_SD_MMC
|
#ifdef DISABLE_DUE_SD_MMC
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
#endif
|
#endif
|
||||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
|
return CTRL_NO_PRESENT;
|
||||||
|
|
||||||
#ifdef DEBUG_MMC
|
#ifdef DEBUG_MMC
|
||||||
{
|
{
|
||||||
@@ -100,7 +101,8 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
#ifdef DISABLE_DUE_SD_MMC
|
#ifdef DISABLE_DUE_SD_MMC
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
#endif
|
#endif
|
||||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
|
return CTRL_NO_PRESENT;
|
||||||
|
|
||||||
#ifdef DEBUG_MMC
|
#ifdef DEBUG_MMC
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
//!
|
//!
|
||||||
//! @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.
|
||||||
//!/
|
//!/
|
||||||
void sd_mmc_spi_mem_init();
|
extern void sd_mmc_spi_mem_init(void);
|
||||||
|
|
||||||
//!
|
//!
|
||||||
//! @brief This function tests the state of the SD_MMC memory and sends it to the Host.
|
//! @brief This function tests the state of the SD_MMC memory and sends it to the Host.
|
||||||
@@ -87,7 +87,7 @@ void sd_mmc_spi_mem_init();
|
|||||||
//! Media not present -> CTRL_NO_PRESENT
|
//! Media not present -> CTRL_NO_PRESENT
|
||||||
//! Media has changed -> CTRL_BUSY
|
//! Media has changed -> CTRL_BUSY
|
||||||
//!/
|
//!/
|
||||||
Ctrl_status sd_mmc_spi_test_unit_ready();
|
extern Ctrl_status sd_mmc_spi_test_unit_ready(void);
|
||||||
|
|
||||||
//!
|
//!
|
||||||
//! @brief This function gives the address of the last valid sector.
|
//! @brief This function gives the address of the last valid sector.
|
||||||
@@ -98,7 +98,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready();
|
|||||||
//! Media ready -> CTRL_GOOD
|
//! Media ready -> CTRL_GOOD
|
||||||
//! Media not present -> CTRL_NO_PRESENT
|
//! Media not present -> CTRL_NO_PRESENT
|
||||||
//!/
|
//!/
|
||||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector);
|
extern Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector);
|
||||||
|
|
||||||
/*! \brief Unload/Load the SD/MMC card selected
|
/*! \brief Unload/Load the SD/MMC card selected
|
||||||
*
|
*
|
||||||
@@ -109,7 +109,7 @@ Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector);
|
|||||||
*
|
*
|
||||||
* \return \c true if unload/load done success.
|
* \return \c true if unload/load done success.
|
||||||
*/
|
*/
|
||||||
bool sd_mmc_spi_unload(bool unload);
|
extern bool sd_mmc_spi_unload(bool unload);
|
||||||
|
|
||||||
//!
|
//!
|
||||||
//! @brief This function returns the write protected status of the memory.
|
//! @brief This function returns the write protected status of the memory.
|
||||||
@@ -120,14 +120,14 @@ bool sd_mmc_spi_unload(bool unload);
|
|||||||
//!
|
//!
|
||||||
//! @return false -> the memory is not write-protected (always)
|
//! @return false -> the memory is not write-protected (always)
|
||||||
//!/
|
//!/
|
||||||
bool sd_mmc_spi_wr_protect();
|
extern bool sd_mmc_spi_wr_protect(void);
|
||||||
|
|
||||||
//!
|
//!
|
||||||
//! @brief This function tells if the memory has been removed or not.
|
//! @brief This function tells if the memory has been removed or not.
|
||||||
//!
|
//!
|
||||||
//! @return false -> The memory isn't removed
|
//! @return false -> The memory isn't removed
|
||||||
//!
|
//!
|
||||||
bool sd_mmc_spi_removal();
|
extern bool sd_mmc_spi_removal(void);
|
||||||
|
|
||||||
//---- ACCESS DATA FUNCTIONS ----
|
//---- ACCESS DATA FUNCTIONS ----
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ bool sd_mmc_spi_removal();
|
|||||||
//! It is ready -> CTRL_GOOD
|
//! It is ready -> CTRL_GOOD
|
||||||
//! A error occur -> CTRL_FAIL
|
//! A error occur -> CTRL_FAIL
|
||||||
//!
|
//!
|
||||||
Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector);
|
extern Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector);
|
||||||
|
|
||||||
//! This function initializes the SD/MMC memory for a write operation
|
//! This function initializes the SD/MMC memory for a write operation
|
||||||
//!
|
//!
|
||||||
@@ -161,7 +161,7 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector);
|
|||||||
//! It is ready -> CTRL_GOOD
|
//! It is ready -> CTRL_GOOD
|
||||||
//! An error occurs -> CTRL_FAIL
|
//! An error occurs -> CTRL_FAIL
|
||||||
//!
|
//!
|
||||||
Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector);
|
extern Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector);
|
||||||
|
|
||||||
#endif // #if ACCESS_USB == true
|
#endif // #if ACCESS_USB == true
|
||||||
|
|
||||||
|
|||||||
@@ -53,11 +53,12 @@ typedef uint64_t hal_timer_t;
|
|||||||
#if ENABLED(I2S_STEPPER_STREAM)
|
#if ENABLED(I2S_STEPPER_STREAM)
|
||||||
#define STEPPER_TIMER_PRESCALE 1
|
#define STEPPER_TIMER_PRESCALE 1
|
||||||
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock
|
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs // wrong would be 0.25
|
||||||
#else
|
#else
|
||||||
#define STEPPER_TIMER_PRESCALE 40
|
#define STEPPER_TIMER_PRESCALE 40
|
||||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz
|
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||||
#endif
|
#endif
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
|
||||||
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
||||||
|
|
||||||
|
|||||||
@@ -142,31 +142,12 @@
|
|||||||
// ADC
|
// ADC
|
||||||
//
|
//
|
||||||
#define HAL_ADC_VREF_MV 3300
|
#define HAL_ADC_VREF_MV 3300
|
||||||
#define HAL_ADC_RESOLUTION 12
|
#define HAL_ADC_RESOLUTION 10
|
||||||
|
|
||||||
#define GET_PIN_MAP_PIN(index) index
|
#define GET_PIN_MAP_PIN(index) index
|
||||||
#define GET_PIN_MAP_INDEX(pin) pin
|
#define GET_PIN_MAP_INDEX(pin) pin
|
||||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||||
|
|
||||||
//
|
|
||||||
// Debug port disable
|
|
||||||
// JTMS / SWDIO = PA13
|
|
||||||
// JTCK / SWCLK = PA14
|
|
||||||
// JTDI = PA15
|
|
||||||
// JTDO = PB3
|
|
||||||
// NJTRST = PB4
|
|
||||||
//
|
|
||||||
#define DBG_SWCLK _BV(0)
|
|
||||||
#define DBG_SWDIO _BV(1)
|
|
||||||
#define DBG_TDO _BV(2)
|
|
||||||
#define DBG_TDI _BV(3)
|
|
||||||
#define DBG_TRST _BV(4)
|
|
||||||
#define DBG_ALL (DBG_SWCLK | DBG_SWDIO | DBG_TDO | DBG_TDI | DBG_TRST)
|
|
||||||
|
|
||||||
#define JTAGSWD_RESET() PORT_DebugPortSetting(DBG_ALL, Enable);
|
|
||||||
#define JTAG_DISABLE() PORT_DebugPortSetting(DBG_TDO | DBG_TDI | DBG_TRST, Disable);
|
|
||||||
#define JTAGSWD_DISABLE() PORT_DebugPortSetting(DBG_ALL, Disable);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// MarlinHAL implementation
|
// MarlinHAL implementation
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -123,11 +123,6 @@ void MarlinHAL::init() {
|
|||||||
|
|
||||||
// Register min serial
|
// Register min serial
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial());
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial());
|
||||||
|
|
||||||
// warn if low memory after init
|
|
||||||
if (freeMemory() < 1024) {
|
|
||||||
SERIAL_WARN_MSG("HAL: low memory after init!\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinHAL::init_board() {}
|
void MarlinHAL::init_board() {}
|
||||||
@@ -152,31 +147,7 @@ void MarlinHAL::delay_ms(const int ms) {
|
|||||||
delay(ms);
|
delay(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinHAL::idletask() {
|
void MarlinHAL::idletask() {}
|
||||||
#if ENABLED(MARLIN_DEV_MODE)
|
|
||||||
// check & print serial RX errors
|
|
||||||
MSerialT *serials[] = { &MSerial1, &MSerial2 };
|
|
||||||
for (int serial = 0; serial < 2; serial++) {
|
|
||||||
usart_receive_error_t err = serials[serial]->getReceiveError();
|
|
||||||
if (err != usart_receive_error_t::None) {
|
|
||||||
// "Warning: MSerial[n] RX [Framing|Parity|Overrun] Error"
|
|
||||||
SERIAL_WARN_START();
|
|
||||||
SERIAL_ECHOPGM(" MSerial");
|
|
||||||
SERIAL_ECHO(serial + 1);
|
|
||||||
SERIAL_ECHOPGM(" RX ");
|
|
||||||
switch(err) {
|
|
||||||
case usart_receive_error_t::FramingError: SERIAL_ECHOPGM("Framing"); break;
|
|
||||||
case usart_receive_error_t::ParityError: SERIAL_ECHOPGM("Parity"); break;
|
|
||||||
case usart_receive_error_t::OverrunError: SERIAL_ECHOPGM("Overrun"); break;
|
|
||||||
case usart_receive_error_t::RxDataDropped: SERIAL_ECHOPGM("DataDropped"); break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
SERIAL_ECHOPGM(" Error");
|
|
||||||
SERIAL_EOL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t MarlinHAL::get_reset_source() {
|
uint8_t MarlinHAL::get_reset_source() {
|
||||||
// Query reset cause from RMU
|
// Query reset cause from RMU
|
||||||
@@ -232,9 +203,7 @@ int MarlinHAL::freeMemory() {
|
|||||||
return &top - _sbrk(0);
|
return &top - _sbrk(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinHAL::adc_init() {
|
void MarlinHAL::adc_init() {}
|
||||||
analogReadResolution(HAL_ADC_RESOLUTION);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinHAL::adc_enable(const pin_t pin) {
|
void MarlinHAL::adc_enable(const pin_t pin) {
|
||||||
#if TEMP_SENSOR_SOC
|
#if TEMP_SENSOR_SOC
|
||||||
|
|||||||
@@ -46,34 +46,14 @@ constexpr bool serial_handles_emergency(int port) {
|
|||||||
//
|
//
|
||||||
// Define serial ports
|
// Define serial ports
|
||||||
//
|
//
|
||||||
|
#define DEFINE_HWSERIAL_MARLIN(name, n) \
|
||||||
// serial port where RX and TX use IRQs
|
|
||||||
#define DEFINE_IRQ_SERIAL_MARLIN(name, n) \
|
|
||||||
MSerialT name(serial_handles_emergency(n), \
|
MSerialT name(serial_handles_emergency(n), \
|
||||||
&USART##n##_config, \
|
&USART##n##_config, \
|
||||||
BOARD_USART##n##_TX_PIN, \
|
BOARD_USART##n##_TX_PIN, \
|
||||||
BOARD_USART##n##_RX_PIN);
|
BOARD_USART##n##_RX_PIN);
|
||||||
|
|
||||||
// serial port where RX uses DMA and TX uses IRQs
|
DEFINE_HWSERIAL_MARLIN(MSerial1, 1);
|
||||||
// all serial ports use DMA1
|
DEFINE_HWSERIAL_MARLIN(MSerial2, 2);
|
||||||
// since there are 4 USARTs and 4 DMA channels, we can use the USART number as the DMA channel
|
|
||||||
#define DEFINE_DMA_SERIAL_MARLIN(name, n) \
|
|
||||||
MSerialT name(serial_handles_emergency(n), \
|
|
||||||
&USART##n##_config, \
|
|
||||||
BOARD_USART##n##_TX_PIN, \
|
|
||||||
BOARD_USART##n##_RX_PIN, \
|
|
||||||
M4_DMA1, \
|
|
||||||
((en_dma_channel_t)(n - 1))); // map USART1 to DMA channel 0, USART2 to DMA channel 1, etc.
|
|
||||||
|
|
||||||
#define DEFINE_SERIAL_MARLIN(name, n) TERN(SERIAL_DMA, DEFINE_DMA_SERIAL_MARLIN(name, n), DEFINE_IRQ_SERIAL_MARLIN(name, n))
|
|
||||||
|
|
||||||
DEFINE_SERIAL_MARLIN(MSerial1, 1);
|
|
||||||
DEFINE_SERIAL_MARLIN(MSerial2, 2);
|
|
||||||
|
|
||||||
// TODO: remove this warning when SERIAL_DMA has been tested some more
|
|
||||||
#if ENABLED(SERIAL_DMA)
|
|
||||||
#warning "SERIAL_DMA may be unstable on HC32F460."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Serial port assertions
|
// Serial port assertions
|
||||||
|
|||||||
@@ -25,42 +25,17 @@
|
|||||||
#include <drivers/usart/Usart.h>
|
#include <drivers/usart/Usart.h>
|
||||||
|
|
||||||
// Optionally set uart IRQ priority to reduce overflow errors
|
// Optionally set uart IRQ priority to reduce overflow errors
|
||||||
//#define UART_RX_IRQ_PRIO 1
|
// #define UART_IRQ_PRIO 1
|
||||||
//#define UART_TX_IRQ_PRIO 1
|
|
||||||
//#define UART_RX_DMA_IRQ_PRIO 1
|
|
||||||
|
|
||||||
struct MarlinSerial : public Usart {
|
struct MarlinSerial : public Usart {
|
||||||
MarlinSerial(
|
MarlinSerial(struct usart_config_t *usart_device, gpio_pin_t tx_pin, gpio_pin_t rx_pin) : Usart(usart_device, tx_pin, rx_pin) {}
|
||||||
struct usart_config_t *usart_device,
|
|
||||||
gpio_pin_t tx_pin,
|
|
||||||
gpio_pin_t rx_pin
|
|
||||||
#if ENABLED(SERIAL_DMA)
|
|
||||||
, M4_DMA_TypeDef *dma_unit = nullptr,
|
|
||||||
en_dma_channel_t rx_dma_channel = DmaCh0
|
|
||||||
#endif
|
|
||||||
) : Usart(usart_device, tx_pin, rx_pin) {
|
|
||||||
#if ENABLED(SERIAL_DMA)
|
|
||||||
if (dma_unit != nullptr) {
|
|
||||||
enableRxDma(dma_unit, rx_dma_channel);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(UART_RX_IRQ_PRIO) || defined(UART_TX_IRQ_PRIO) || defined(UART_RX_DMA_IRQ_PRIO)
|
#ifdef UART_IRQ_PRIO
|
||||||
void setPriority() {
|
void setPriority() {
|
||||||
#if defined(UART_RX_IRQ_PRIO)
|
NVIC_SetPriority(c_dev()->interrupts.rx_data_available.interrupt_number, UART_IRQ_PRIO);
|
||||||
NVIC_SetPriority(c_dev()->interrupts.rx_data_available.interrupt_number, UART_RX_IRQ_PRIO);
|
NVIC_SetPriority(c_dev()->interrupts.rx_error.interrupt_number, UART_IRQ_PRIO);
|
||||||
NVIC_SetPriority(c_dev()->interrupts.rx_error.interrupt_number, UART_RX_IRQ_PRIO);
|
NVIC_SetPriority(c_dev()->interrupts.tx_buffer_empty.interrupt_number, UART_IRQ_PRIO);
|
||||||
#endif
|
NVIC_SetPriority(c_dev()->interrupts.tx_complete.interrupt_number, UART_IRQ_PRIO);
|
||||||
|
|
||||||
#if defined(UART_TX_IRQ_PRIO)
|
|
||||||
NVIC_SetPriority(c_dev()->interrupts.tx_buffer_empty.interrupt_number, UART_TX_IRQ_PRIO);
|
|
||||||
NVIC_SetPriority(c_dev()->interrupts.tx_complete.interrupt_number, UART_TX_IRQ_PRIO);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(UART_RX_DMA_IRQ_PRIO) && ENABLED(SERIAL_DMA)
|
|
||||||
NVIC_SetPriority(c_dev()->dma.rx.rx_data_available_dma_btc.interrupt_number, UART_RX_DMA_IRQ_PRIO);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void begin(uint32_t baud) {
|
void begin(uint32_t baud) {
|
||||||
@@ -72,12 +47,7 @@ struct MarlinSerial : public Usart {
|
|||||||
Usart::begin(baud, config);
|
Usart::begin(baud, config);
|
||||||
setPriority();
|
setPriority();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
void begin(uint32_t baud, const stc_usart_uart_init_t *config, const bool rxNoiseFilter = true) {
|
|
||||||
Usart::begin(baud, config, rxNoiseFilter);
|
|
||||||
setPriority();
|
|
||||||
}
|
|
||||||
#endif // UART_RX_IRQ_PRIO || UART_TX_IRQ_PRIO || UART_RX_DMA_IRQ_PRIO
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Serial1Class<MarlinSerial> MSerialT;
|
typedef Serial1Class<MarlinSerial> MSerialT;
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
/**
|
|
||||||
* app_config.h is included by the hc32f460 arduino build script for every source file.
|
|
||||||
* it is used to configure the arduino core (and ddl) automatically according
|
|
||||||
* to the settings in Configuration.h and Configuration_adv.h.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
#ifndef _HC32_APP_CONFIG_H_
|
|
||||||
#define _HC32_APP_CONFIG_H_
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// dev mode
|
|
||||||
//
|
|
||||||
#if ENABLED(MARLIN_DEV_MODE)
|
|
||||||
#define __DEBUG 1
|
|
||||||
#define __CORE_DEBUG 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// Fault Handlers and Panic
|
|
||||||
//
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
// disable arduino core fault handler, as we define our own
|
|
||||||
#define CORE_DISABLE_FAULT_HANDLER 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// force-enable panic handler so that we can use our custom one (in MinSerial)
|
|
||||||
#define PANIC_ENABLE 1
|
|
||||||
|
|
||||||
// use short filenames in ddl debug and core panic output
|
|
||||||
#define __DEBUG_SHORT_FILENAMES 1
|
|
||||||
#define __PANIC_SHORT_FILENAMES 1
|
|
||||||
|
|
||||||
// omit panic messages in core panic output
|
|
||||||
#define __OMIT_PANIC_MESSAGE 1
|
|
||||||
|
|
||||||
//
|
|
||||||
// Usart
|
|
||||||
//
|
|
||||||
|
|
||||||
// disable serial globals (Serial1, Serial2, ...), as we define our own
|
|
||||||
#define DISABLE_SERIAL_GLOBALS 1
|
|
||||||
|
|
||||||
// increase the size of the Usart buffers (both RX and TX)
|
|
||||||
// NOTE:
|
|
||||||
// the heap usage will increase by (SERIAL_BUFFER_SIZE - 64) * "number of serial ports used"
|
|
||||||
// if running out of heap, the system may become unstable
|
|
||||||
//#define SERIAL_BUFFER_SIZE 256
|
|
||||||
|
|
||||||
// enable support for Usart Clock Divider / Oversampling auto config
|
|
||||||
#define USART_AUTO_CLKDIV_OS_CONFIG 1
|
|
||||||
|
|
||||||
// enable USART_RX_DMA_SUPPORT core option when SERIAL_DMA is enabled
|
|
||||||
#if ENABLED(SERIAL_DMA)
|
|
||||||
#define USART_RX_DMA_SUPPORT 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// Misc.
|
|
||||||
//
|
|
||||||
|
|
||||||
// redirect printf to host serial
|
|
||||||
#define REDIRECT_PRINTF_TO_SERIAL 1
|
|
||||||
|
|
||||||
// F_CPU must be known at compile time, but on HC32F460 it's not.
|
|
||||||
// Thus we assume HCLK to be 200MHz, as that's what is configured in
|
|
||||||
// 'core_hook_sysclock_init' in 'sysclock.cpp'.
|
|
||||||
// If you face issues with this assumption, please double-check with the values
|
|
||||||
// printed by 'MarlinHAL::HAL_clock_frequencies_dump'.
|
|
||||||
// see also: HAL_TIMER_RATE in timers.h
|
|
||||||
#define F_CPU 200000000 // 200MHz HCLK
|
|
||||||
|
|
||||||
#endif // _HC32_APP_CONFIG_H_
|
|
||||||
@@ -40,15 +40,9 @@ void endstopIRQHandler() {
|
|||||||
CHECK(X_MAX);
|
CHECK(X_MAX);
|
||||||
CHECK(X_MIN);
|
CHECK(X_MIN);
|
||||||
|
|
||||||
CHECK(X2_MAX);
|
|
||||||
CHECK(X2_MIN);
|
|
||||||
|
|
||||||
CHECK(Y_MAX);
|
CHECK(Y_MAX);
|
||||||
CHECK(Y_MIN);
|
CHECK(Y_MIN);
|
||||||
|
|
||||||
CHECK(Y2_MAX);
|
|
||||||
CHECK(Y2_MIN);
|
|
||||||
|
|
||||||
CHECK(Z_MAX);
|
CHECK(Z_MAX);
|
||||||
CHECK(Z_MIN);
|
CHECK(Z_MIN);
|
||||||
|
|
||||||
@@ -58,9 +52,6 @@ void endstopIRQHandler() {
|
|||||||
CHECK(Z3_MAX);
|
CHECK(Z3_MAX);
|
||||||
CHECK(Z3_MIN);
|
CHECK(Z3_MIN);
|
||||||
|
|
||||||
CHECK(Z4_MAX);
|
|
||||||
CHECK(Z4_MIN);
|
|
||||||
|
|
||||||
CHECK(Z_MIN_PROBE);
|
CHECK(Z_MIN_PROBE);
|
||||||
|
|
||||||
// Update endstops
|
// Update endstops
|
||||||
@@ -78,15 +69,9 @@ void setup_endstop_interrupts() {
|
|||||||
SETUP(X_MAX);
|
SETUP(X_MAX);
|
||||||
SETUP(X_MIN);
|
SETUP(X_MIN);
|
||||||
|
|
||||||
SETUP(X2_MAX);
|
|
||||||
SETUP(X2_MIN);
|
|
||||||
|
|
||||||
SETUP(Y_MAX);
|
SETUP(Y_MAX);
|
||||||
SETUP(Y_MIN);
|
SETUP(Y_MIN);
|
||||||
|
|
||||||
SETUP(Y2_MAX);
|
|
||||||
SETUP(Y2_MIN);
|
|
||||||
|
|
||||||
SETUP(Z_MAX);
|
SETUP(Z_MAX);
|
||||||
SETUP(Z_MIN);
|
SETUP(Z_MIN);
|
||||||
|
|
||||||
@@ -96,9 +81,6 @@ void setup_endstop_interrupts() {
|
|||||||
SETUP(Z3_MAX);
|
SETUP(Z3_MAX);
|
||||||
SETUP(Z3_MIN);
|
SETUP(Z3_MIN);
|
||||||
|
|
||||||
SETUP(Z4_MAX);
|
|
||||||
SETUP(Z4_MIN);
|
|
||||||
|
|
||||||
SETUP(Z_MIN_PROBE);
|
SETUP(Z_MIN_PROBE);
|
||||||
|
|
||||||
#undef SETUP
|
#undef SETUP
|
||||||
@@ -106,7 +88,7 @@ void setup_endstop_interrupts() {
|
|||||||
|
|
||||||
// Ensure 1 - 10 IRQs are registered
|
// Ensure 1 - 10 IRQs are registered
|
||||||
// Disable some endstops if you encounter this error
|
// Disable some endstops if you encounter this error
|
||||||
#define ENDSTOPS_INTERRUPTS_COUNT COUNT_ENABLED(USE_X_MAX, USE_X_MIN, USE_X2_MAX, USE_X2_MIN, USE_Y_MAX, USE_Y_MIN, USE_Y2_MAX, USE_Y2_MIN, USE_Z_MAX, USE_Z_MIN, USE_Z2_MAX, USE_Z2_MIN, USE_Z3_MAX, USE_Z3_MIN, USE_Z4_MAX, USE_Z4_MIN, USE_Z_MIN_PROBE)
|
#define ENDSTOPS_INTERRUPTS_COUNT COUNT_ENABLED(USE_X_MAX, USE_X_MIN, USE_Y_MAX, USE_Y_MIN, USE_Z_MAX, USE_Z_MIN, USE_Z2_MAX, USE_Z2_MIN, USE_Z3_MAX, USE_Z3_MIN, USE_Z_MIN_PROBE)
|
||||||
#if ENDSTOPS_INTERRUPTS_COUNT > 10
|
#if ENDSTOPS_INTERRUPTS_COUNT > 10
|
||||||
#error "Too many endstop interrupts! HC32F460 only supports 10 endstop interrupts."
|
#error "Too many endstop interrupts! HC32F460 only supports 10 endstop interrupts."
|
||||||
#elif ENDSTOPS_INTERRUPTS_COUNT == 0
|
#elif ENDSTOPS_INTERRUPTS_COUNT == 0
|
||||||
|
|||||||
@@ -20,20 +20,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <core_util.h>
|
|
||||||
|
|
||||||
#if !defined(ARDUINO_CORE_VERSION_INT) || !defined(GET_VERSION_INT)
|
|
||||||
// version macros were introduced in arduino core version 1.1.0
|
|
||||||
// below that version, we polyfill them
|
|
||||||
#define GET_VERSION_INT(major, minor, patch) ((major * 100000) + (minor * 1000) + patch)
|
|
||||||
#define ARDUINO_CORE_VERSION_INT GET_VERSION_INT(1, 0, 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARDUINO_CORE_VERSION_INT < GET_VERSION_INT(1, 1, 0)
|
|
||||||
// because we use app_config.h introduced in arduino core version 1.1.0, the
|
|
||||||
// HAL is not compatible with older versions
|
|
||||||
#error "The HC32 HAL is not compatible with Arduino Core versions < 1.1.0. Consider updating the Arduino Core."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BOARD_XTAL_FREQUENCY
|
#ifndef BOARD_XTAL_FREQUENCY
|
||||||
#error "BOARD_XTAL_FREQUENCY is required for HC32F460."
|
#error "BOARD_XTAL_FREQUENCY is required for HC32F460."
|
||||||
@@ -88,18 +74,3 @@
|
|||||||
#error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN."
|
#error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(SERIAL_DMA)
|
|
||||||
#if !defined(USART_RX_DMA_SUPPORT)
|
|
||||||
#error "SERIAL_DMA requires USART_RX_DMA_SUPPORT to be enabled in the arduino core."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// USART_RX_DMA_SUPPORT does not implement core_hook_usart_rx_irq, which is required for the emergency parser
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#error "EMERGENCY_PARSER is not supported with SERIAL_DMA. Please disable either SERIAL_DMA or EMERGENCY_PARSER."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ARDUINO_CORE_VERSION_INT < GET_VERSION_INT(1, 1, 0)
|
|
||||||
#error "SERIAL_DMA is not supported with arduino core version < 1.1.0."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
fn \
|
fn \
|
||||||
}
|
}
|
||||||
|
|
||||||
stc_sd_handle_t *handle = nullptr;
|
stc_sd_handle_t *handle;
|
||||||
|
|
||||||
bool SDIO_Init() {
|
bool SDIO_Init() {
|
||||||
// Configure SDIO pins
|
// Configure SDIO pins
|
||||||
@@ -66,45 +66,36 @@ bool SDIO_Init() {
|
|||||||
GPIO_SetFunc(BOARD_SDIO_CMD, Func_Sdio);
|
GPIO_SetFunc(BOARD_SDIO_CMD, Func_Sdio);
|
||||||
GPIO_SetFunc(BOARD_SDIO_DET, Func_Sdio);
|
GPIO_SetFunc(BOARD_SDIO_DET, Func_Sdio);
|
||||||
|
|
||||||
// If a handle is already initialized, free it before creating a new one
|
|
||||||
// otherwise, we will leak memory, which will eventually crash the system
|
|
||||||
if (handle != nullptr) {
|
|
||||||
delete handle->pstcDmaInitCfg;
|
|
||||||
delete handle->pstcCardInitCfg;
|
|
||||||
delete handle;
|
|
||||||
handle = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create DMA configuration
|
// Create DMA configuration
|
||||||
stc_sdcard_dma_init_t *dmaConf = new stc_sdcard_dma_init_t;
|
stc_sdcard_dma_init_t *dmaConf = new stc_sdcard_dma_init_t;
|
||||||
dmaConf->DMAx = SDIO_DMA_PERIPHERAL;
|
dmaConf->DMAx = SDIO_DMA_PERIPHERAL;
|
||||||
dmaConf->enDmaCh = SDIO_DMA_CHANNEL;
|
dmaConf->enDmaCh = SDIO_DMA_CHANNEL;
|
||||||
|
|
||||||
// Create card configuration
|
|
||||||
// This should be a fairly safe configuration for most cards
|
|
||||||
stc_sdcard_init_t *cardConf = new stc_sdcard_init_t;
|
|
||||||
cardConf->enBusWidth = SdiocBusWidth4Bit;
|
|
||||||
cardConf->enClkFreq = SdiocClk400K;
|
|
||||||
cardConf->enSpeedMode = SdiocNormalSpeedMode;
|
|
||||||
cardConf->pstcInitCfg = nullptr;
|
|
||||||
|
|
||||||
// Create handle in DMA mode
|
// Create handle in DMA mode
|
||||||
handle = new stc_sd_handle_t;
|
handle = new stc_sd_handle_t;
|
||||||
handle->SDIOCx = SDIO_PERIPHERAL;
|
handle->SDIOCx = SDIO_PERIPHERAL;
|
||||||
handle->enDevMode = SdCardDmaMode;
|
handle->enDevMode = SdCardDmaMode;
|
||||||
handle->pstcDmaInitCfg = dmaConf;
|
handle->pstcDmaInitCfg = dmaConf;
|
||||||
//handle->pstcCardInitCfg = cardConf; // assigned in SDCARD_Init
|
|
||||||
|
// Create card configuration
|
||||||
|
// This should be a fairly safe configuration for most cards
|
||||||
|
stc_sdcard_init_t cardConf = {
|
||||||
|
.enBusWidth = SdiocBusWidth4Bit,
|
||||||
|
.enClkFreq = SdiocClk400K,
|
||||||
|
.enSpeedMode = SdiocNormalSpeedMode,
|
||||||
|
//.pstcInitCfg = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
// Initialize sd card
|
// Initialize sd card
|
||||||
en_result_t rc = SDCARD_Init(handle, cardConf);
|
en_result_t rc = SDCARD_Init(handle, &cardConf);
|
||||||
if (rc != Ok) printf("SDIO_Init() error (rc=%u)\n", rc);
|
if (rc != Ok) printf("SDIO_Init() error (rc=%u)\n", rc);
|
||||||
|
|
||||||
return rc == Ok;
|
return rc == Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) {
|
bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) {
|
||||||
CORE_ASSERT(handle != nullptr, "SDIO not initialized", return false);
|
CORE_ASSERT(handle != NULL, "SDIO not initialized");
|
||||||
CORE_ASSERT(dst != nullptr, "SDIO_ReadBlock dst is NULL", return false);
|
CORE_ASSERT(dst != NULL, "SDIO_ReadBlock dst is NULL");
|
||||||
|
|
||||||
WITH_RETRY(SDIO_READ_RETRIES, {
|
WITH_RETRY(SDIO_READ_RETRIES, {
|
||||||
en_result_t rc = SDCARD_ReadBlocks(handle, block, 1, dst, SDIO_READ_TIMEOUT);
|
en_result_t rc = SDCARD_ReadBlocks(handle, block, 1, dst, SDIO_READ_TIMEOUT);
|
||||||
@@ -116,8 +107,8 @@ bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
|
bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
|
||||||
CORE_ASSERT(handle != nullptr, "SDIO not initialized", return false);
|
CORE_ASSERT(handle != NULL, "SDIO not initialized");
|
||||||
CORE_ASSERT(src != nullptr, "SDIO_WriteBlock src is NULL", return false);
|
CORE_ASSERT(src != NULL, "SDIO_WriteBlock src is NULL");
|
||||||
|
|
||||||
WITH_RETRY(SDIO_WRITE_RETRIES, {
|
WITH_RETRY(SDIO_WRITE_RETRIES, {
|
||||||
en_result_t rc = SDCARD_WriteBlocks(handle, block, 1, (uint8_t *)src, SDIO_WRITE_TIMEOUT);
|
en_result_t rc = SDCARD_WriteBlocks(handle, block, 1, (uint8_t *)src, SDIO_WRITE_TIMEOUT);
|
||||||
@@ -129,12 +120,12 @@ bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SDIO_IsReady() {
|
bool SDIO_IsReady() {
|
||||||
CORE_ASSERT(handle != nullptr, "SDIO not initialized", return false);
|
CORE_ASSERT(handle != NULL, "SDIO not initialized");
|
||||||
return bool(handle->stcCardStatus.READY_FOR_DATA);
|
return bool(handle->stcCardStatus.READY_FOR_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t SDIO_GetCardSize() {
|
uint32_t SDIO_GetCardSize() {
|
||||||
CORE_ASSERT(handle != nullptr, "SDIO not initialized", return 0);
|
CORE_ASSERT(handle != NULL, "SDIO not initialized");
|
||||||
|
|
||||||
// Multiply number of blocks with block size to get size in bytes
|
// Multiply number of blocks with block size to get size in bytes
|
||||||
const uint64_t cardSizeBytes = uint64_t(handle->stcSdCardInfo.u32LogBlockNbr) * uint64_t(handle->stcSdCardInfo.u32LogBlockSize);
|
const uint64_t cardSizeBytes = uint64_t(handle->stcSdCardInfo.u32LogBlockNbr) * uint64_t(handle->stcSdCardInfo.u32LogBlockSize);
|
||||||
|
|||||||
@@ -96,44 +96,29 @@ void core_hook_sysclock_init() {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// sysclk is now configured according to F_CPU (i.e., 200MHz PLL output)
|
// Setup clock divisors for sysclk = 200 MHz:
|
||||||
constexpr uint32_t sysclock = F_CPU;
|
|
||||||
|
|
||||||
// Setup clock divisors for sysclk = 200 MHz
|
|
||||||
// Note: PCLK1 is used for step+temp timers, and need to be kept at 50 MHz (until there is a better solution)
|
// Note: PCLK1 is used for step+temp timers, and need to be kept at 50 MHz (until there is a better solution)
|
||||||
constexpr stc_clk_sysclk_cfg_t sysClkConf = {
|
stc_clk_sysclk_cfg_t sysClkConf = {
|
||||||
.enHclkDiv = ClkSysclkDiv1, // HCLK = 200 MHz (CPU)
|
.enHclkDiv = ClkSysclkDiv1, // HCLK = 200 MHz (CPU)
|
||||||
.enExclkDiv = ClkSysclkDiv2, // EXCLK = 100 MHz (SDIO)
|
.enExclkDiv = ClkSysclkDiv2, // EXCLK = 100 MHz (SDIO)
|
||||||
.enPclk0Div = ClkSysclkDiv2, // PCLK0 = 100 MHz (Timer6 (not used))
|
.enPclk0Div = ClkSysclkDiv1, // PCLK0 = 200 MHz (Timer6 (not used))
|
||||||
.enPclk1Div = ClkSysclkDiv4, // PCLK1 = 50 MHz (USART, SPI, I2S, Timer0 (step+temp), TimerA (Servo))
|
.enPclk1Div = ClkSysclkDiv4, // PCLK1 = 50 MHz (USART, SPI, I2S, Timer0 (step+temp), TimerA (Servo))
|
||||||
.enPclk2Div = ClkSysclkDiv8, // PCLK2 = 25 MHz (ADC)
|
.enPclk2Div = ClkSysclkDiv4, // PCLK2 = 50 MHz (ADC)
|
||||||
.enPclk3Div = ClkSysclkDiv8, // PCLK3 = 25 MHz (I2C, WDT)
|
.enPclk3Div = ClkSysclkDiv4, // PCLK3 = 50 MHz (I2C, WDT)
|
||||||
.enPclk4Div = ClkSysclkDiv2, // PCLK4 = 100 MHz (ADC ctl)
|
.enPclk4Div = ClkSysclkDiv2, // PCLK4 = 100 MHz (ADC ctl)
|
||||||
};
|
};
|
||||||
|
|
||||||
#if ARDUINO_CORE_VERSION_INT >= GET_VERSION_INT(1, 2, 0)
|
|
||||||
assert_system_clocks_valid<
|
|
||||||
sysclock,
|
|
||||||
sysClkConf.enHclkDiv,
|
|
||||||
sysClkConf.enPclk0Div,
|
|
||||||
sysClkConf.enPclk1Div,
|
|
||||||
sysClkConf.enPclk2Div,
|
|
||||||
sysClkConf.enPclk3Div,
|
|
||||||
sysClkConf.enPclk4Div,
|
|
||||||
sysClkConf.enExclkDiv
|
|
||||||
>();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sysclock_set_clock_dividers(&sysClkConf);
|
sysclock_set_clock_dividers(&sysClkConf);
|
||||||
|
|
||||||
// Set power mode
|
// Set power mode
|
||||||
power_mode_update_pre(sysclock);
|
#define POWER_MODE_SYSTEM_CLOCK 200000000 // 200 MHz
|
||||||
|
power_mode_update_pre(POWER_MODE_SYSTEM_CLOCK);
|
||||||
|
|
||||||
// Switch to MPLL as sysclk source
|
// Switch to MPLL as sysclk source
|
||||||
CLK_SetSysClkSource(CLKSysSrcMPLL);
|
CLK_SetSysClkSource(CLKSysSrcMPLL);
|
||||||
|
|
||||||
// Set power mode
|
// Set power mode
|
||||||
power_mode_update_post(sysclock);
|
power_mode_update_post(POWER_MODE_SYSTEM_CLOCK);
|
||||||
|
#undef POWER_MODE_SYSTEM_CLOCK
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_HC32
|
#endif // ARDUINO_ARCH_HC32
|
||||||
|
|||||||
@@ -38,48 +38,44 @@ extern Timer0 step_timer;
|
|||||||
// Timer Configurations
|
// Timer Configurations
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
// TODO: some calculations (step irq min_step_rate) require the timer rate to be known at compile time
|
||||||
* HAL_TIMER_RATE must be known at compile time since it's used to calculate
|
// this is not possible with the HC32F460, as the timer rate depends on PCLK1
|
||||||
* STEPPER_TIMER_RATE, which is used in 'constexpr' calculations.
|
// as a workaround, PCLK1 = 50MHz is assumed (check with clock dump in MarlinHAL::init())
|
||||||
* On the HC32F460 the timer rate depends on PCLK1, which is derived from the
|
#define HAL_TIMER_RATE 50000000 // 50MHz
|
||||||
* system clock configured at runtime. As a workaround, we use the existing
|
// #define HAL_TIMER_RATE TIMER0_BASE_FREQUENCY
|
||||||
* assumption of a 200MHz clock, defining F_CPU as 200000000, then configure PCLK1
|
|
||||||
* as F_CPU with a divider of 4 in 'sysclock.cpp::core_hook_sysclock_init'.
|
// TODO: CYCLES_PER_MICROSECOND seems to be used by Marlin to calculate the number of cycles per microsecond in the timer ISRs
|
||||||
*
|
// by default, it uses F_CPU, but since that is not known at compile time for HC32, we overwrite it here
|
||||||
* If you face issues with this assumption, please double-check with the values
|
#undef CYCLES_PER_MICROSECOND
|
||||||
* printed by 'MarlinHAL::HAL_clock_frequencies_dump'.
|
#define CYCLES_PER_MICROSECOND (HAL_TIMER_RATE / 1000000UL)
|
||||||
*
|
|
||||||
* TODO: If the 'constexpr' requirement is ever lifted, use TIMER0_BASE_FREQUENCY instead
|
|
||||||
*/
|
|
||||||
#define HAL_TIMER_RATE (F_CPU / 4) // i.e., 50MHz
|
|
||||||
//#define HAL_TIMER_RATE TIMER0_BASE_FREQUENCY
|
|
||||||
|
|
||||||
// Temperature timer
|
// Temperature timer
|
||||||
#define TEMP_TIMER_NUM (&temp_timer)
|
#define TEMP_TIMER_NUM (&temp_timer)
|
||||||
#define TEMP_TIMER_PRIORITY DDL_IRQ_PRIORITY_02
|
#define TEMP_TIMER_PRIORITY DDL_IRQ_PRIORITY_02
|
||||||
#define TEMP_TIMER_PRESCALE 16UL // 12.5MHz
|
#define TEMP_TIMER_PRESCALE 16ul
|
||||||
#define TEMP_TIMER_RATE 1000 // 1kHz
|
#define TEMP_TIMER_RATE 1000 // 1kHz
|
||||||
#define TEMP_TIMER_FREQUENCY TEMP_TIMER_RATE // 1kHz also
|
#define TEMP_TIMER_FREQUENCY TEMP_TIMER_RATE // Alias for Marlin
|
||||||
|
|
||||||
// Stepper timer
|
// Stepper timer
|
||||||
#define STEP_TIMER_NUM (&step_timer)
|
#define STEP_TIMER_NUM (&step_timer)
|
||||||
#define STEP_TIMER_PRIORITY DDL_IRQ_PRIORITY_00 // Top priority, nothing else uses it
|
#define STEP_TIMER_PRIORITY DDL_IRQ_PRIORITY_01
|
||||||
#define STEPPER_TIMER_PRESCALE 16UL // 12.5MHz
|
#define STEPPER_TIMER_PRESCALE 16ul
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 50MHz / 16 = 3.125MHz
|
// TODO: STEPPER_TIMER_RATE seems to work fine like this, but requires further testing...
|
||||||
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000UL) // Integer 3
|
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 50MHz / 16 = 3.125MHz
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000)
|
||||||
|
|
||||||
// Pulse timer (== stepper timer)
|
// Pulse timer (== stepper timer)
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
//
|
//
|
||||||
// Channel aliases
|
// Channel aliases
|
||||||
//
|
//
|
||||||
#define MF_TIMER_TEMP TEMP_TIMER_NUM
|
#define MF_TIMER_TEMP TEMP_TIMER_NUM
|
||||||
#define MF_TIMER_STEP STEP_TIMER_NUM
|
#define MF_TIMER_STEP STEP_TIMER_NUM
|
||||||
#define MF_TIMER_PULSE PULSE_TIMER_NUM
|
#define MF_TIMER_PULSE PULSE_TIMER_NUM
|
||||||
|
|
||||||
//
|
//
|
||||||
// HAL functions
|
// HAL functions
|
||||||
|
|||||||
@@ -37,10 +37,7 @@ Timer::Timer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Timer::~Timer() {
|
Timer::~Timer() {
|
||||||
if (timerid != 0) {
|
timer_delete(timerid);
|
||||||
timer_delete(timerid);
|
|
||||||
timerid = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer::init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn) {
|
void Timer::init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn) {
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __PLAT_LINUX__
|
#ifdef __PLAT_LINUX__
|
||||||
#ifndef UNIT_TEST
|
|
||||||
|
|
||||||
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
||||||
|
|
||||||
@@ -136,5 +135,4 @@ int main() {
|
|||||||
read_serial.join();
|
read_serial.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // UNIT_TEST
|
|
||||||
#endif // __PLAT_LINUX__
|
#endif // __PLAT_LINUX__
|
||||||
|
|||||||
@@ -1,125 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "../shared/Delay.h"
|
|
||||||
#include "../../../gcode/parser.h"
|
|
||||||
|
|
||||||
DefaultSerial1 USBSerial(false, MCDCSerial0);
|
|
||||||
|
|
||||||
uint32_t MarlinHAL::adc_result = 0;
|
|
||||||
|
|
||||||
// U8glib required functions
|
|
||||||
extern "C" {
|
|
||||||
void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); }
|
|
||||||
void u8g_MicroDelay() { u8g_xMicroDelay(1); }
|
|
||||||
void u8g_10MicroDelay() { u8g_xMicroDelay(10); }
|
|
||||||
void u8g_Delay(uint16_t val) { delay(val); }
|
|
||||||
}
|
|
||||||
|
|
||||||
// return free heap space
|
|
||||||
int freeMemory() {
|
|
||||||
char stack_end;
|
|
||||||
void *heap_start = malloc(sizeof(uint32_t));
|
|
||||||
if (heap_start == 0) return 0;
|
|
||||||
|
|
||||||
uint32_t result = (uint32_t)&stack_end - (uint32_t)heap_start;
|
|
||||||
free(heap_start);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinHAL::reboot() { MCUCore::nvic_system_reset(); }
|
|
||||||
|
|
||||||
uint8_t MarlinHAL::get_reset_source() {
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
if (watchdog_timed_out()) return RST_WATCHDOG;
|
|
||||||
#endif
|
|
||||||
return RST_POWER_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinHAL::clear_reset_source() { watchdog_clear_timeout_flag(); }
|
|
||||||
|
|
||||||
void flashFirmware(const int16_t) {
|
|
||||||
delay(500); // Give OS time to disconnect
|
|
||||||
//USB_Connect(false); // USB clear connection
|
|
||||||
delay(1000); // Give OS time to notice
|
|
||||||
hal.reboot();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
|
|
||||||
#define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8.0f, 4.0f) // 4 or 8 second timeout
|
|
||||||
|
|
||||||
void MarlinHAL::watchdog_init() {
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
|
||||||
// We enable the watchdog timer, but only for the interrupt.
|
|
||||||
|
|
||||||
// Configure WDT to only trigger an interrupt
|
|
||||||
// Disable WDT interrupt (just in case, to avoid triggering it!)
|
|
||||||
NVIC_DisableIRQ(WDT_IRQn);
|
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
|
||||||
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
|
|
||||||
// WDT defaults to trigger an interrupt
|
|
||||||
|
|
||||||
// Configure and enable WDT interrupt.
|
|
||||||
NVIC_ClearPendingIRQ(WDT_IRQn);
|
|
||||||
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
|
|
||||||
NVIC_EnableIRQ(WDT_IRQn);
|
|
||||||
#else
|
|
||||||
MCUI::watchdog_set_timeout_triggers_reset();
|
|
||||||
#endif
|
|
||||||
MCUI::watchdog_set_timeout_in_seconds(WDT_TIMEOUT);
|
|
||||||
MCUI::watchdog_enable();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinHAL::watchdog_refresh() {
|
|
||||||
MCUI::watchdog_feed();
|
|
||||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
|
||||||
static millis_t next_flash = millis();
|
|
||||||
if (ELAPSED(millis(), next_flash)) {
|
|
||||||
next_flash = millis() + 200;
|
|
||||||
TOGGLE(LED_PIN); // heartbeat indicator
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timeout state
|
|
||||||
bool MarlinHAL::watchdog_timed_out() { return MCUI::watchdog_has_triggered(); }
|
|
||||||
void MarlinHAL::watchdog_clear_timeout_flag() { MCUI::watchdog_clear_timeout_flag(); }
|
|
||||||
|
|
||||||
#endif // USE_WATCHDOG
|
|
||||||
|
|
||||||
// For M42/M43, scan command line for pin code
|
|
||||||
// return index into pin map array if found and the pin is valid.
|
|
||||||
// return dval if not found or not a valid pin.
|
|
||||||
int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) {
|
|
||||||
const uint16_t val = (uint16_t)parser.intval(code, -1), port = val / 100, pin = val % 100;
|
|
||||||
const int16_t ind = (port < ((NUM_DIGITAL_PINS) >> 5) && pin < 32) ? ((port << 5) | pin) : -2;
|
|
||||||
return ind > -1 ? ind : dval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HAL_LPC1768/HAL.h
|
|
||||||
* Hardware Abstraction Layer for NXP LPC1768
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define CPU_32_BIT
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
|
||||||
#include "../shared/Delay.h"
|
|
||||||
#include "../shared/math_32bit.h"
|
|
||||||
#include "../shared/HAL_SPI.h"
|
|
||||||
#include "fastio.h"
|
|
||||||
#include "MarlinSerial.h"
|
|
||||||
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Serial ports
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
typedef ForwardSerial1Class< decltype(MCDCSerial0) > DefaultSerial1;
|
|
||||||
extern DefaultSerial1 USBSerial;
|
|
||||||
|
|
||||||
#define _MSERIAL(X) MSerial##X
|
|
||||||
#define MSERIAL(X) _MSERIAL(X)
|
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
|
||||||
#define MYSERIAL1 USBSerial
|
|
||||||
#elif WITHIN(SERIAL_PORT, 0, 3)
|
|
||||||
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
|
||||||
#else
|
|
||||||
#error "SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
|
||||||
#if SERIAL_PORT_2 == -1
|
|
||||||
#define MYSERIAL2 USBSerial
|
|
||||||
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
|
||||||
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
|
||||||
#else
|
|
||||||
#error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
|
||||||
#if SERIAL_PORT_3 == -1
|
|
||||||
#define MYSERIAL3 USBSerial
|
|
||||||
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
|
||||||
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
|
||||||
#else
|
|
||||||
#error "SERIAL_PORT_3 must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
|
||||||
#if MMU2_SERIAL_PORT == -1
|
|
||||||
#define MMU2_SERIAL USBSerial
|
|
||||||
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
|
||||||
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
|
||||||
#else
|
|
||||||
#error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
|
||||||
#if LCD_SERIAL_PORT == -1
|
|
||||||
#define LCD_SERIAL USBSerial
|
|
||||||
#elif WITHIN(LCD_SERIAL_PORT, 0, 3)
|
|
||||||
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
|
||||||
#else
|
|
||||||
#error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
|
||||||
#if HAS_DGUS_LCD
|
|
||||||
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.available()
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// Interrupts
|
|
||||||
//
|
|
||||||
|
|
||||||
#define CRITICAL_SECTION_START() const bool irqon = !MCUCore::primask(); MCUCore::nvic_interrupts_disable()
|
|
||||||
#define CRITICAL_SECTION_END() if (irqon) MCUCore::nvic_interrupts_enable()
|
|
||||||
#define cli() noInterrupts()
|
|
||||||
#define sei() interrupts()
|
|
||||||
//
|
|
||||||
// ADC
|
|
||||||
//
|
|
||||||
|
|
||||||
#define ADC_MEDIAN_FILTER_SIZE (23) // Higher values increase step delay (phase shift),
|
|
||||||
// (ADC_MEDIAN_FILTER_SIZE + 1) / 2 sample step delay (12 samples @ 500Hz: 24ms phase shift)
|
|
||||||
// Memory usage per ADC channel (bytes): (6 * ADC_MEDIAN_FILTER_SIZE) + 16
|
|
||||||
// 8 * ((6 * 23) + 16 ) = 1232 Bytes for 8 channels
|
|
||||||
|
|
||||||
#define ADC_LOWPASS_K_VALUE (2) // Higher values increase rise time
|
|
||||||
// Rise time sample delays for 100% signal convergence on full range step
|
|
||||||
// (1 : 13, 2 : 32, 3 : 67, 4 : 139, 5 : 281, 6 : 565, 7 : 1135, 8 : 2273)
|
|
||||||
// K = 6, 565 samples, 500Hz sample rate, 1.13s convergence on full range step
|
|
||||||
// Memory usage per ADC channel (bytes): 4 (32 Bytes for 8 channels)
|
|
||||||
|
|
||||||
#define HAL_ADC_VREF 3.3 // ADC voltage reference
|
|
||||||
|
|
||||||
#define HAL_ADC_RESOLUTION 12 // 15 bit maximum, raw temperature is stored as int16_t
|
|
||||||
#define HAL_ADC_FILTERED // Disable oversampling done in Marlin as ADC values already filtered in HAL
|
|
||||||
|
|
||||||
//
|
|
||||||
// Pin Mapping for M42, M43, M226
|
|
||||||
//
|
|
||||||
|
|
||||||
// Test whether the pin is valid
|
|
||||||
constexpr bool VALID_PIN(const pin_t pin) {
|
|
||||||
return MCUI::pin_is_valid(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the analog index for a digital pin
|
|
||||||
constexpr int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t pin) {
|
|
||||||
return (MCUI::pin_is_valid(pin) && MCUI::pin_has_adc(pin)) ? pin : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Misc. Functions
|
|
||||||
//
|
|
||||||
#ifndef analogInputToDigitalPin
|
|
||||||
#define analogInputToDigitalPin(p) (p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Return the index of a pin number
|
|
||||||
constexpr int16_t GET_PIN_MAP_INDEX(const pin_t pin) {
|
|
||||||
return MCUI::pin_index(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the pin number at the given index
|
|
||||||
constexpr pin_t GET_PIN_MAP_PIN(const int16_t index) {
|
|
||||||
return MCUI::pin_index(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse a G-code word into a pin index
|
|
||||||
int16_t PARSED_PIN_INDEX(const char code, const int16_t dval);
|
|
||||||
// P0.6 thru P0.9 are for the onboard SD card
|
|
||||||
#define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09,
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Defines
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
void flashFirmware(const int16_t);
|
|
||||||
|
|
||||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
|
||||||
|
|
||||||
// Default graphical display delays
|
|
||||||
#define CPU_ST7920_DELAY_1 600
|
|
||||||
#define CPU_ST7920_DELAY_2 750
|
|
||||||
#define CPU_ST7920_DELAY_3 750
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Free Memory Accessor
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#if GCC_VERSION <= 50000
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int freeMemory();
|
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// MarlinHAL Class
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
class MarlinHAL {
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Earliest possible init, before setup()
|
|
||||||
MarlinHAL() {}
|
|
||||||
|
|
||||||
static void init(); // Called early in setup()
|
|
||||||
static void init_board() {} // Called less early in setup()
|
|
||||||
static void reboot(); // Restart the firmware from 0x0
|
|
||||||
|
|
||||||
// Interrupts
|
|
||||||
static bool isr_state() { return MCUCore::primask(); }
|
|
||||||
static void isr_on() { MCUCore::nvic_interrupts_enable(); }
|
|
||||||
static void isr_off() { MCUCore::nvic_interrupts_disable(); }
|
|
||||||
|
|
||||||
static void delay_ms(const int ms) { DELAY_US(ms * 1000); }
|
|
||||||
|
|
||||||
// Watchdog
|
|
||||||
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
|
||||||
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
|
||||||
static bool watchdog_timed_out() IF_DISABLED(USE_WATCHDOG, { return false; });
|
|
||||||
static void watchdog_clear_timeout_flag() IF_DISABLED(USE_WATCHDOG, {});
|
|
||||||
|
|
||||||
// Tasks, called from idle()
|
|
||||||
static void idletask();
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
static uint8_t get_reset_source();
|
|
||||||
static void clear_reset_source();
|
|
||||||
|
|
||||||
// Free SRAM
|
|
||||||
static int freeMemory() { return ::freeMemory(); }
|
|
||||||
|
|
||||||
//
|
|
||||||
// ADC Methods
|
|
||||||
//
|
|
||||||
|
|
||||||
using FilteredADC = MCUI::ADC<ADC_LOWPASS_K_VALUE, ADC_MEDIAN_FILTER_SIZE>;
|
|
||||||
|
|
||||||
// Called by Temperature::init once at startup
|
|
||||||
static void adc_init() {
|
|
||||||
// Turn on and initialise ADC in burst mode
|
|
||||||
MCUI::adc_hardware.init();
|
|
||||||
MCUI::adc_hardware.burst_start();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called by Temperature::init for each sensor at startup
|
|
||||||
static void adc_enable(const pin_t pin) {
|
|
||||||
FilteredADC::enable_channel(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin ADC sampling on the given pin. Called from Temperature::isr!
|
|
||||||
static uint32_t adc_result;
|
|
||||||
static void adc_start(const pin_t pin) {
|
|
||||||
adc_result = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is the ADC ready for reading?
|
|
||||||
static bool adc_ready() { return true; }
|
|
||||||
|
|
||||||
// The current value of the ADC register
|
|
||||||
static uint16_t adc_value() { return uint16_t(adc_result); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the PWM duty cycle for the pin to the given value.
|
|
||||||
* Optionally invert the duty cycle [default = false]
|
|
||||||
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
|
|
||||||
*/
|
|
||||||
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the frequency of the timer corresponding to the provided pin
|
|
||||||
* All Hardware PWM pins will run at the same frequency and
|
|
||||||
* All Software PWM pins will run at the same frequency
|
|
||||||
*/
|
|
||||||
static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
|
|
||||||
};
|
|
||||||
@@ -1,376 +0,0 @@
|
|||||||
// /**
|
|
||||||
// * Marlin 3D Printer Firmware
|
|
||||||
// * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
// *
|
|
||||||
// * Based on Sprinter and grbl.
|
|
||||||
// * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
// *
|
|
||||||
// * This program is free software: you can redistribute it and/or modify
|
|
||||||
// * it under the terms of the GNU General Public License as published by
|
|
||||||
// * the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// * (at your option) any later version.
|
|
||||||
// *
|
|
||||||
// * This program is distributed in the hope that it will be useful,
|
|
||||||
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// * GNU General Public License for more details.
|
|
||||||
// *
|
|
||||||
// * You should have received a copy of the GNU General Public License
|
|
||||||
// * along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
// *
|
|
||||||
// */
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * Software SPI functions originally from Arduino Sd2Card Library
|
|
||||||
// * Copyright (c) 2009 by William Greiman
|
|
||||||
// */
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * For TARGET_LPC4078
|
|
||||||
// */
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * Hardware SPI and Software SPI implementations are included in this file.
|
|
||||||
// * The hardware SPI runs faster and has higher throughput but is not compatible
|
|
||||||
// * with some LCD interfaces/adapters.
|
|
||||||
// *
|
|
||||||
// * Control of the slave select pin(s) is handled by the calling routines.
|
|
||||||
// *
|
|
||||||
// * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card
|
|
||||||
// * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with
|
|
||||||
// * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is
|
|
||||||
// * active. If any of these pins are shared then the software SPI must be used.
|
|
||||||
// *
|
|
||||||
// * A more sophisticated hardware SPI can be found at the following link.
|
|
||||||
// * This implementation has not been fully debugged.
|
|
||||||
// * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e
|
|
||||||
// */
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include <SPI.h>
|
|
||||||
|
|
||||||
// Hardware SPI and SPIClass
|
|
||||||
|
|
||||||
#include "../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#define LPC_SOFTWARE_SPI
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Public functions
|
|
||||||
// ------------------------
|
|
||||||
#if ENABLED(LPC_SOFTWARE_SPI)
|
|
||||||
#include "SoftwareSPI.h"
|
|
||||||
|
|
||||||
// Software SPI
|
|
||||||
static uint8_t SPI_speed = SPI_FULL_SPEED;
|
|
||||||
|
|
||||||
static uint8_t spiTransfer(uint8_t b) {
|
|
||||||
return swSpiTransfer(b, SPI_speed, SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiBegin() {
|
|
||||||
swSpiBegin(SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
|
||||||
SPI_speed = swSpiInit(spiRate, SD_SCK_PIN, SD_MOSI_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t spiRec() { return spiTransfer(0xFF); }
|
|
||||||
|
|
||||||
void spiRead(uint8_t*buf, uint16_t nbyte) {
|
|
||||||
for (int i = 0; i < nbyte; i++)
|
|
||||||
buf[i] = spiTransfer(0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiSend(uint8_t b) { (void)spiTransfer(b); }
|
|
||||||
|
|
||||||
void spiSend(const uint8_t *buf, size_t nbyte) {
|
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
|
||||||
(void)spiTransfer(buf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
|
||||||
(void)spiTransfer(token);
|
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
|
||||||
(void)spiTransfer(buf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifdef SD_SPI_SPEED
|
|
||||||
#define INIT_SPI_SPEED SD_SPI_SPEED
|
|
||||||
#else
|
|
||||||
#define INIT_SPI_SPEED SPI_FULL_SPEED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void spiBegin() { spiInit(INIT_SPI_SPEED); } // Set up SCK, MOSI & MISO pins for SSP0
|
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
|
||||||
#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
|
|
||||||
SPI.setModule(1);
|
|
||||||
#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
|
|
||||||
SPI.setModule(2);
|
|
||||||
#endif
|
|
||||||
SPI.setDataSize(DATA_SIZE_8BIT);
|
|
||||||
SPI.setDataMode(SPI_MODE0);
|
|
||||||
|
|
||||||
SPI.setClock(SPISettings::spiRate2Clock(spiRate));
|
|
||||||
SPI.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t doio(uint8_t b) {
|
|
||||||
return SPI.transfer(b & 0x00FF) & 0x00FF;
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiSend(uint8_t b) { doio(b); }
|
|
||||||
|
|
||||||
void spiSend(const uint8_t *buf, size_t nbyte) {
|
|
||||||
for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void spiSend(uint32_t chan, byte b) {}
|
|
||||||
|
|
||||||
void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {}
|
|
||||||
|
|
||||||
// Read single byte from SPI
|
|
||||||
uint8_t spiRec() { return doio(0xFF); }
|
|
||||||
|
|
||||||
uint8_t spiRec(uint32_t chan) { return 0; }
|
|
||||||
|
|
||||||
// Read from SPI into buffer
|
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
|
||||||
for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t spiTransfer(uint8_t b) { return doio(b); }
|
|
||||||
|
|
||||||
// Write from buffer to SPI
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
|
||||||
(void)spiTransfer(token);
|
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
|
||||||
(void)spiTransfer(buf[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin SPI transaction, set clock, bit order, data mode
|
|
||||||
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
|
||||||
// TODO: Implement this method
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // LPC_SOFTWARE_SPI
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset.
|
|
||||||
// */
|
|
||||||
static inline void waitSpiTxEnd(void *spi_d) {
|
|
||||||
// while (SSP_GetStatus(spi_d, SSP_STAT_TXFIFO_EMPTY) == RESET) { /* nada */ } // wait until TXE=1
|
|
||||||
// while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0
|
|
||||||
}
|
|
||||||
|
|
||||||
// // Retain the pin init state of the SPI, to avoid init more than once,
|
|
||||||
// // even if more instances of SPIClass exist
|
|
||||||
static bool spiInitialised[BOARD_NR_SPI] = {};
|
|
||||||
|
|
||||||
SPIClass::SPIClass(uint8_t device) {
|
|
||||||
// // Init things specific to each SPI device
|
|
||||||
// // clock divider setup is a bit of hack, and needs to be improved at a later date.
|
|
||||||
|
|
||||||
#if BOARD_NR_SPI >= 1
|
|
||||||
_settings[0].device_id = 0;
|
|
||||||
_settings[0].m_config.pin_miso = BOARD_SPI1_MISO_PIN;
|
|
||||||
_settings[0].m_config.pin_mosi = BOARD_SPI1_MOSI_PIN;
|
|
||||||
_settings[0].m_config.pin_sck = BOARD_SPI1_SCK_PIN;
|
|
||||||
_settings[0].m_config.pin_ssel = BOARD_SPI1_NSS_PIN;
|
|
||||||
_settings[0].m_config.frequency = 100000;
|
|
||||||
_settings[0].m_config.data_bits = 8;
|
|
||||||
_settings[0].m_config.mode = 0;
|
|
||||||
_settings[0].m_config.format = MCUI::SSP::Config::Format::SPI;
|
|
||||||
|
|
||||||
|
|
||||||
// _settings[0].dataMode = SPI_MODE0;
|
|
||||||
// _settings[0].dataSize = DATA_SIZE_8BIT;
|
|
||||||
// _settings[0].clock = SPI_CLOCK_MAX;
|
|
||||||
// //_settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if BOARD_NR_SPI >= 2
|
|
||||||
_settings[1].device_id = 2;
|
|
||||||
_settings[1].m_config.pin_miso = BOARD_SPI2_MISO_PIN;
|
|
||||||
_settings[1].m_config.pin_mosi = BOARD_SPI2_MOSI_PIN;
|
|
||||||
_settings[1].m_config.pin_sck = BOARD_SPI2_SCK_PIN;
|
|
||||||
_settings[1].m_config.pin_ssel = BOARD_SPI2_NSS_PIN;
|
|
||||||
// _settings[1].dataMode = SPI_MODE0;
|
|
||||||
// _settings[1].dataSize = DATA_SIZE_8BIT;
|
|
||||||
// _settings[1].clock = SPI_CLOCK_MAX;
|
|
||||||
// //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if BOARD_NR_SPI >= 3
|
|
||||||
_settings[2].device_id = 1;
|
|
||||||
_settings[2].m_config.pin_miso = BOARD_SPI3_MISO_PIN;
|
|
||||||
_settings[2].m_config.pin_mosi = BOARD_SPI3_MOSI_PIN;
|
|
||||||
_settings[2].m_config.pin_sck = BOARD_SPI3_SCK_PIN;
|
|
||||||
_settings[2].m_config.pin_ssel = BOARD_SPI3_NSS_PIN;
|
|
||||||
// _settings[1].dataMode = SPI_MODE0;
|
|
||||||
// _settings[1].dataSize = DATA_SIZE_8BIT;
|
|
||||||
// _settings[1].clock = SPI_CLOCK_MAX;
|
|
||||||
// //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setModule(device);
|
|
||||||
|
|
||||||
// // Init the GPDMA controller
|
|
||||||
// // TODO: call once in the constructor? or each time?
|
|
||||||
// GPDMA_Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
SPIClass::SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel) {
|
|
||||||
#if BOARD_NR_SPI >= 1
|
|
||||||
if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1);
|
|
||||||
#endif
|
|
||||||
#if BOARD_NR_SPI >= 2
|
|
||||||
if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2);
|
|
||||||
#endif
|
|
||||||
#if BOARD_NR_SPI >= 3
|
|
||||||
if (mosi == BOARD_SPI3_MOSI_PIN) SPIClass(3);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::begin() {
|
|
||||||
// // Init the SPI pins in the first begin call
|
|
||||||
if ((_currentSetting->device_id == 0 && spiInitialised[0] == false) ||
|
|
||||||
(_currentSetting->device_id == 1 && spiInitialised[1] == false) ||
|
|
||||||
(_currentSetting->device_id == 2 && spiInitialised[2] == false)) {
|
|
||||||
MCUI::SSP::init(_currentSetting->device_id, _currentSetting->m_config);
|
|
||||||
spiInitialised[_currentSetting->device_id] = true;
|
|
||||||
}
|
|
||||||
updateSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::beginTransaction(const SPISettings &cfg) {
|
|
||||||
setBitOrder(cfg.bitOrder);
|
|
||||||
setDataMode(cfg.dataMode);
|
|
||||||
setDataSize(cfg.dataSize);
|
|
||||||
//setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock));
|
|
||||||
begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t SPIClass::transfer(const uint16_t b) {
|
|
||||||
uint16_t rx_word = 0;
|
|
||||||
// clear rx fifo
|
|
||||||
while(MCUI::SSP::read(_currentSetting->device_id, &rx_word) == 1);
|
|
||||||
MCUI::SSP::write(_currentSetting->device_id, b);
|
|
||||||
while(MCUI::SSP::read(_currentSetting->device_id, &rx_word) != 1);
|
|
||||||
return rx_word;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t SPIClass::transfer16(const uint16_t data) {
|
|
||||||
return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::end() {
|
|
||||||
// // Neither is needed for Marlin
|
|
||||||
// //SSP_Cmd(_currentSetting->spi_d, DISABLE);
|
|
||||||
// //SSP_DeInit(_currentSetting->spi_d);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::send(uint8_t data) {
|
|
||||||
MCUI::SSP::write(_currentSetting->device_id, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) {
|
|
||||||
// //TODO: LPC dma can only write 0xFFF bytes at once.
|
|
||||||
// GPDMA_Channel_CFG_Type GPDMACfg;
|
|
||||||
|
|
||||||
// /* Configure GPDMA channel 0 -------------------------------------------------------------*/
|
|
||||||
// /* DMA Channel 0 */
|
|
||||||
// GPDMACfg.ChannelNum = 0;
|
|
||||||
// // Source memory
|
|
||||||
// GPDMACfg.SrcMemAddr = (uint32_t)buf;
|
|
||||||
// // Destination memory - Not used
|
|
||||||
// GPDMACfg.DstMemAddr = 0;
|
|
||||||
// // Transfer size
|
|
||||||
// GPDMACfg.TransferSize = length;
|
|
||||||
// // Transfer width
|
|
||||||
// GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE;
|
|
||||||
// // Transfer type
|
|
||||||
// GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P;
|
|
||||||
// // Source connection - unused
|
|
||||||
// GPDMACfg.SrcConn = 0;
|
|
||||||
// // Destination connection
|
|
||||||
// GPDMACfg.DstConn = (_currentSetting->spi_d == LPC_SSP0) ? GPDMA_CONN_SSP0_Tx : GPDMA_CONN_SSP1_Tx;
|
|
||||||
|
|
||||||
// GPDMACfg.DMALLI = 0;
|
|
||||||
|
|
||||||
// // Enable dma on SPI
|
|
||||||
// SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE);
|
|
||||||
|
|
||||||
// // Only increase memory if minc is true
|
|
||||||
// GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0);
|
|
||||||
|
|
||||||
// // Setup channel with given parameter
|
|
||||||
// GPDMA_Setup(&GPDMACfg);
|
|
||||||
|
|
||||||
// // Enable DMA
|
|
||||||
// GPDMA_ChannelCmd(0, ENABLE);
|
|
||||||
|
|
||||||
// // Wait for data transfer
|
|
||||||
// while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { }
|
|
||||||
|
|
||||||
// // Clear err and int
|
|
||||||
// GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0);
|
|
||||||
// GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0);
|
|
||||||
|
|
||||||
// // Disable DMA
|
|
||||||
// GPDMA_ChannelCmd(0, DISABLE);
|
|
||||||
|
|
||||||
// waitSpiTxEnd(_currentSetting->spi_d);
|
|
||||||
|
|
||||||
// SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t SPIClass::read() {
|
|
||||||
uint16_t rx_word = 0;
|
|
||||||
MCUI::SSP::read(_currentSetting->device_id, &rx_word);
|
|
||||||
return rx_word;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::read(uint8_t *buf, uint32_t len) {
|
|
||||||
uint16_t rx_word = 0;
|
|
||||||
// clear rx fifo
|
|
||||||
while(MCUI::SSP::read(_currentSetting->device_id, &rx_word) == 1);
|
|
||||||
for (uint16_t i = 0; i < len; i++) {
|
|
||||||
MCUI::SSP::write(_currentSetting->device_id, 0xFF);
|
|
||||||
while(MCUI::SSP::read(_currentSetting->device_id, &rx_word) != 1);
|
|
||||||
buf[i] = rx_word;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::setClock(uint32_t clock) { _currentSetting->clock = clock; }
|
|
||||||
|
|
||||||
void SPIClass::setModule(uint8_t device) { _currentSetting = &_settings[device - 1]; } // SPI channels are called 1, 2, and 3 but the array is zero-indexed
|
|
||||||
|
|
||||||
void SPIClass::setBitOrder(uint8_t bitOrder) { _currentSetting->bitOrder = bitOrder; }
|
|
||||||
|
|
||||||
void SPIClass::setDataMode(uint8_t dataMode) { _currentSetting->dataMode = dataMode; }
|
|
||||||
|
|
||||||
void SPIClass::setDataSize(uint32_t dataSize) { _currentSetting->dataSize = dataSize; }
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * Set up/tear down
|
|
||||||
// */
|
|
||||||
void SPIClass::updateSettings() {
|
|
||||||
MCUI::SSP::configure(_currentSetting->device_id, _currentSetting->m_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
SPIClass SPI(1);
|
|
||||||
|
|
||||||
#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
|
|
||||||
SPIClass SPI(1);
|
|
||||||
#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
|
|
||||||
SPIClass SPI(2);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <SPI.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Marlin currently requires 3 SPI classes:
|
|
||||||
*
|
|
||||||
* SPIClass:
|
|
||||||
* This class is normally provided by frameworks and has a semi-default interface.
|
|
||||||
* This is needed because some libraries reference it globally.
|
|
||||||
*
|
|
||||||
* SPISettings:
|
|
||||||
* Container for SPI configs for SPIClass. As above, libraries may reference it globally.
|
|
||||||
*
|
|
||||||
* These two classes are often provided by frameworks so we cannot extend them to add
|
|
||||||
* useful methods for Marlin.
|
|
||||||
*
|
|
||||||
* MarlinSPI:
|
|
||||||
* Provides the default SPIClass interface plus some Marlin goodies such as a simplified
|
|
||||||
* interface for SPI DMA transfer.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
using MarlinSPI = SPIClass;
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
MarlinCDCSerial MCDCSerial0;
|
|
||||||
|
|
||||||
#define MarlinSerial(ID) \
|
|
||||||
MarlinSerial _MSerial##ID(ID); \
|
|
||||||
MSerialT MSerial##ID(true, _MSerial##ID)
|
|
||||||
|
|
||||||
#if USING_HW_SERIAL0
|
|
||||||
MarlinSerial(0);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
MarlinSerial(1);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
MarlinSerial(2);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
MarlinSerial(3);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
|
|
||||||
bool MarlinSerial::recv_callback(const char c) {
|
|
||||||
// Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro)
|
|
||||||
if (false) {}
|
|
||||||
#if USING_HW_SERIAL0
|
|
||||||
else if (this == &_MSerial0) emergency_parser.update(MSerial0.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
|
|
||||||
EmergencyParser::State emergency_state;
|
|
||||||
|
|
||||||
bool CDC_RecvCallback(const char c) {
|
|
||||||
emergency_parser.update(emergency_state, c);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
#include <interface/uart.h>
|
|
||||||
#include <driver/usb_cdc.h>
|
|
||||||
|
|
||||||
#include <UART.h>
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
#endif
|
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
|
||||||
#define SERIAL_PORT 0
|
|
||||||
#endif
|
|
||||||
#ifndef RX_BUFFER_SIZE
|
|
||||||
#define RX_BUFFER_SIZE 128
|
|
||||||
#endif
|
|
||||||
#ifndef TX_BUFFER_SIZE
|
|
||||||
#define TX_BUFFER_SIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class MarlinCDCSerial : public HardwareSerial {
|
|
||||||
public:
|
|
||||||
MarlinCDCSerial() {}
|
|
||||||
void begin(unsigned long baudrate) override {}
|
|
||||||
void begin(unsigned long baudrate, uint16_t config) override { }
|
|
||||||
void end() override { }
|
|
||||||
int available() override {
|
|
||||||
return MCUI::CDCSerial0::available();
|
|
||||||
}
|
|
||||||
int peek() override { char c = 0; return MCUI::CDCSerial0::peek((uint8_t*)&c)? c : -1; }
|
|
||||||
int read() override { char c = 0; return MCUI::CDCSerial0::read((uint8_t*)&c, 1)? c : -1; }
|
|
||||||
void flush() override {};
|
|
||||||
size_t write(uint8_t c) override { return write(&c, 1); }
|
|
||||||
size_t write(const uint8_t *buffer, size_t size) override { return MCUI::CDCSerial0::connected() ? MCUI::CDCSerial0::write(buffer, size) : 0; }
|
|
||||||
using Print::write;
|
|
||||||
operator bool() override { return true; }
|
|
||||||
};
|
|
||||||
extern MarlinCDCSerial MCDCSerial0;
|
|
||||||
|
|
||||||
class MarlinSerial : public HardwareSerial {
|
|
||||||
public:
|
|
||||||
MarlinSerial(const uint32_t uart_id) : uart_device(uart_id) {}
|
|
||||||
void begin(unsigned long baudrate) override {
|
|
||||||
uart_device.configure_pins(P0_02, P0_03);
|
|
||||||
uart_device.init({ .baud = baudrate });
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
uart_device.set_rx_callback([this](char rx_value){ return this->recv_callback(rx_value); } );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
void begin(unsigned long baudrate, uint16_t config) override {
|
|
||||||
begin(baudrate);
|
|
||||||
}
|
|
||||||
void end() override { }
|
|
||||||
int available() override {
|
|
||||||
return uart_device.rx_available();
|
|
||||||
}
|
|
||||||
int peek() override { char c = 0; return uart_device.peek(&c)? c : -1; }
|
|
||||||
int read() override { char c = 0; return uart_device.read(&c)? c : -1; }
|
|
||||||
void flush() override {};
|
|
||||||
size_t write(uint8_t c) override { return write(&c, 1); }
|
|
||||||
size_t write(const uint8_t *buffer, size_t size) override { return uart_device.write((const char *)buffer, size); }
|
|
||||||
using Print::write; // pull in write(str) and write(buf, size) from Print
|
|
||||||
operator bool() override { return true; }
|
|
||||||
|
|
||||||
bool recv_callback(char value);
|
|
||||||
private:
|
|
||||||
MCUI::BufferedUARTC uart_device;
|
|
||||||
};
|
|
||||||
|
|
||||||
// On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads
|
|
||||||
// of 'available' and 'read' method are not used in this multiple inheritance scenario.
|
|
||||||
// Instead, use a ForwardSerial here that adapts the interface.
|
|
||||||
typedef ForwardSerial1Class<MarlinSerial> MSerialT;
|
|
||||||
extern MSerialT MSerial0;
|
|
||||||
extern MSerialT MSerial1;
|
|
||||||
extern MSerialT MSerial2;
|
|
||||||
extern MSerialT MSerial3;
|
|
||||||
|
|
||||||
// Consequently, we can't use a RuntimeSerial either. The workaround would be to use
|
|
||||||
// a RuntimeSerial<ForwardSerial<MarlinSerial>> type here. Ignore for now until it's actually required.
|
|
||||||
#if ENABLED(SERIAL_RUNTIME_HOOK)
|
|
||||||
#error "SERIAL_RUNTIME_HOOK is not yet supported for LPC176x."
|
|
||||||
#endif
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "HAL.h"
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
|
|
||||||
#include "../shared/MinSerial.h"
|
|
||||||
#include <debug_frmwrk.h>
|
|
||||||
|
|
||||||
static void TX(char c) { _DBC(c); }
|
|
||||||
void install_min_serial() { HAL_min_serial_out = &TX; }
|
|
||||||
|
|
||||||
#if DISABLED(DYNAMIC_VECTORTABLE)
|
|
||||||
extern "C" {
|
|
||||||
__attribute__((naked)) void JumpHandler_ASM() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"b CommonHandler_ASM\n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // POSTMORTEM_DEBUGGING
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
|
|
||||||
* Copyright (c) 2009 Michael Margolis. All right reserved.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on "servo.h - Interrupt driven Servo library for Arduino using 16 bit timers -
|
|
||||||
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
|
|
||||||
*
|
|
||||||
* The only modification was to update/delete macros to match the LPC176x.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Servo.h>
|
|
||||||
|
|
||||||
class libServo: public Servo {
|
|
||||||
public:
|
|
||||||
void move(const int value) {
|
|
||||||
constexpr uint16_t servo_delay[] = SERVO_DELAY;
|
|
||||||
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
|
|
||||||
|
|
||||||
if (attach(servo_info[servoIndex].Pin.nbr) >= 0) { // try to reattach
|
|
||||||
write(value);
|
|
||||||
safe_delay(servo_delay[servoIndex]); // delay to allow servo to reach position
|
|
||||||
TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class libServo;
|
|
||||||
typedef libServo hal_servo_t;
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include "SoftwareSPI.h"
|
|
||||||
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) {
|
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
|
||||||
if (spi_speed == 0) {
|
|
||||||
MCUI::gpio_set(mosi_pin, !!(b & 0x80));
|
|
||||||
MCUI::gpio_set(sck_pin, HIGH);
|
|
||||||
b <<= 1;
|
|
||||||
if (miso_pin >= 0 && MCUI::gpio_get(miso_pin)) b |= 1;
|
|
||||||
MCUI::gpio_set(sck_pin, LOW);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
|
||||||
for (uint8_t j = 0; j < spi_speed; j++)
|
|
||||||
MCUI::gpio_set(mosi_pin, state);
|
|
||||||
|
|
||||||
for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++)
|
|
||||||
MCUI::gpio_set(sck_pin, HIGH);
|
|
||||||
|
|
||||||
b <<= 1;
|
|
||||||
if (miso_pin >= 0 && MCUI::gpio_get(miso_pin)) b |= 1;
|
|
||||||
|
|
||||||
for (uint8_t j = 0; j < spi_speed; j++)
|
|
||||||
MCUI::gpio_set(sck_pin, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
void swSpiBegin(const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) {
|
|
||||||
pinMode(sck_pin, OUTPUT);
|
|
||||||
if (MCUI::pin_is_valid(miso_pin)) pinMode(miso_pin, INPUT);
|
|
||||||
pinMode(mosi_pin, OUTPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) {
|
|
||||||
MCUI::gpio_set(mosi_pin, HIGH);
|
|
||||||
MCUI::gpio_set(sck_pin, LOW);
|
|
||||||
return (SystemCoreClock == 120000000 ? 44 : 38) / std::pow(2, 6 - std::min(spiRate, (uint8_t)6));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin);
|
|
||||||
void swSpiBegin(const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin);
|
|
||||||
uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin);
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Emulate EEPROM storage using Flash Memory
|
|
||||||
*
|
|
||||||
* Use a single 32K flash sector to store EEPROM data. To reduce the
|
|
||||||
* number of erase operations a simple "leveling" scheme is used that
|
|
||||||
* maintains a number of EEPROM "slots" within the larger flash sector.
|
|
||||||
* Each slot is used in turn and the entire sector is only erased when all
|
|
||||||
* slots have been used.
|
|
||||||
*
|
|
||||||
* A simple RAM image is used to hold the EEPROM data during I/O operations
|
|
||||||
* and this is flushed to the next available slot when an update is complete.
|
|
||||||
* If RAM usage becomes an issue we could store this image in one of the two
|
|
||||||
* 16Kb I/O buffers (intended to hold DMA USB and Ethernet data, but currently
|
|
||||||
* unused).
|
|
||||||
*/
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#include "../shared/eeprom_api.h"
|
|
||||||
|
|
||||||
//#include <cstdio>
|
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
|
||||||
#define MARLIN_EEPROM_SIZE 4032 // 4KB
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t PersistentStore::capacity() { return 4032; }
|
|
||||||
|
|
||||||
constexpr uint32_t page_size = MCUI::EEPROM::page_size;
|
|
||||||
uint32_t buffered_page = 0;
|
|
||||||
uint8_t page_buffer[page_size];
|
|
||||||
bool buffered_page_dirty = false;
|
|
||||||
|
|
||||||
bool PersistentStore::access_start() {
|
|
||||||
MCUI::EEPROM::init();
|
|
||||||
MCUI::EEPROM::read_page(buffered_page, page_buffer, page_size);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::access_finish() {
|
|
||||||
if (buffered_page_dirty) {
|
|
||||||
MCUI::EEPROM::write_page(buffered_page, page_buffer, page_size);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
|
||||||
uint32_t address = pos;
|
|
||||||
//printf("Marlin::eeprom::write(pos = %d, size = %d)\n", pos, size);
|
|
||||||
uint32_t value_index = 0;
|
|
||||||
for (uint32_t addr = address; addr < address + size; ++addr) {
|
|
||||||
uint32_t page_address = addr & 0xFFFFFFC0;
|
|
||||||
if (page_address != buffered_page) {
|
|
||||||
//printf("Marlin::eeprom::write(@%ld):: page change new(%ld) != current(%d)\n",addr, page_address, buffered_page);
|
|
||||||
if (buffered_page_dirty == true) MCUI::EEPROM::write_page(buffered_page, page_buffer, page_size);
|
|
||||||
buffered_page = page_address;
|
|
||||||
buffered_page_dirty = false;
|
|
||||||
MCUI::EEPROM::read_page(buffered_page, page_buffer, page_size);
|
|
||||||
}
|
|
||||||
page_buffer[addr & ~0xFFFFFFC0] = value[value_index++];
|
|
||||||
buffered_page_dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos += size;
|
|
||||||
crc16(crc, value, size);
|
|
||||||
|
|
||||||
return false; // return true for any error
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
|
||||||
uint32_t address = pos;
|
|
||||||
//printf("Marlin::eeprom::read(pos = %d, size = %d, writing = %d)\n", pos, size, writing);
|
|
||||||
uint32_t value_index = 0;
|
|
||||||
for (uint32_t addr = address; addr < address + size; ++addr) {
|
|
||||||
uint32_t page_address = addr & 0xFFFFFFC0;
|
|
||||||
if (page_address != buffered_page) {
|
|
||||||
if (buffered_page_dirty) {
|
|
||||||
MCUI::EEPROM::write_page(buffered_page, page_buffer, page_size);
|
|
||||||
buffered_page_dirty = false;
|
|
||||||
}
|
|
||||||
buffered_page = page_address;
|
|
||||||
MCUI::EEPROM::read_page(buffered_page, page_buffer, page_size);
|
|
||||||
}
|
|
||||||
if (writing) value[value_index++] = page_buffer[addr & ~0xFFFFFFC0];
|
|
||||||
else crc16(crc, &page_buffer[addr & ~0xFFFFFFC0], 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (writing) crc16(crc, value, size);
|
|
||||||
pos += size;
|
|
||||||
|
|
||||||
return false; // return true for any error
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,191 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Endstop Interrupts
|
|
||||||
*
|
|
||||||
* Without endstop interrupts the endstop pins must be polled continually in
|
|
||||||
* the temperature-ISR via endstops.update(), most of the time finding no change.
|
|
||||||
* With this feature endstops.update() is called only when we know that at
|
|
||||||
* least one endstop has changed state, saving valuable CPU cycles.
|
|
||||||
*
|
|
||||||
* This feature only works when all used endstop pins can generate an 'external interrupt'.
|
|
||||||
*
|
|
||||||
* Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'.
|
|
||||||
* (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../../module/endstops.h"
|
|
||||||
|
|
||||||
// One ISR for all EXT-Interrupts
|
|
||||||
void endstop_ISR() { endstops.update(); }
|
|
||||||
|
|
||||||
void setup_endstop_interrupts() {
|
|
||||||
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
|
||||||
#define LPC1768_PIN_INTERRUPT_M(pin) ((pin >> 0x5 & 0x7) == 0 || (pin >> 0x5 & 0x7) == 2)
|
|
||||||
|
|
||||||
#if HAS_X_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN)
|
|
||||||
#error "X_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(X_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_X_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN)
|
|
||||||
#error "X_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(X_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Y_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN)
|
|
||||||
#error "Y_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Y_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Y_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN)
|
|
||||||
#error "Y_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Y_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN)
|
|
||||||
#error "Z_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN)
|
|
||||||
#error "Z_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z2_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN)
|
|
||||||
#error "Z2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z2_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z2_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN)
|
|
||||||
#error "Z2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z2_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z3_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN)
|
|
||||||
#error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z3_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z3_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN)
|
|
||||||
#error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z3_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z4_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN)
|
|
||||||
#error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z4_MAX_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z4_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN)
|
|
||||||
#error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z4_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_Z_MIN_PROBE_PIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN)
|
|
||||||
#error "Z_MIN_PROBE_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
|
||||||
#endif
|
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_I_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(I_MAX_PIN)
|
|
||||||
#error "I_MAX_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(I_MAX_PIN);
|
|
||||||
#elif HAS_I_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(I_MIN_PIN)
|
|
||||||
#error "I_MIN_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(I_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_J_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(J_MAX_PIN)
|
|
||||||
#error "J_MAX_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(J_MAX_PIN);
|
|
||||||
#elif HAS_J_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(J_MIN_PIN)
|
|
||||||
#error "J_MIN_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(J_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_K_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(K_MAX_PIN)
|
|
||||||
#error "K_MAX_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(K_MAX_PIN);
|
|
||||||
#elif HAS_K_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(K_MIN_PIN)
|
|
||||||
#error "K_MIN_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(K_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_U_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(U_MAX_PIN)
|
|
||||||
#error "U_MAX_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(U_MAX_PIN);
|
|
||||||
#elif HAS_U_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(U_MIN_PIN)
|
|
||||||
#error "U_MIN_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(U_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_V_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(V_MAX_PIN)
|
|
||||||
#error "V_MAX_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(V_MAX_PIN);
|
|
||||||
#elif HAS_V_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(V_MIN_PIN)
|
|
||||||
#error "V_MIN_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(V_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
#if HAS_W_MAX
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(W_MAX_PIN)
|
|
||||||
#error "W_MAX_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(W_MAX_PIN);
|
|
||||||
#elif HAS_W_MIN
|
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(W_MIN_PIN)
|
|
||||||
#error "W_MIN_PIN is not INTERRUPT-capable."
|
|
||||||
#endif
|
|
||||||
_ATTACH(W_MIN_PIN);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
|
|
||||||
if (!MCUI::pin_is_valid(pin)) return;
|
|
||||||
if (MCUI::pwm_attach_pin(pin))
|
|
||||||
MCUI::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); // map 1-254 onto PWM range
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
|
||||||
MCUI::pwm_set_frequency(pin, f_desired);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fast I/O Routines for LPC1768/9
|
|
||||||
* Use direct port manipulation to save scads of processor time.
|
|
||||||
* Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Description: Fast IO functions LPC1768
|
|
||||||
*
|
|
||||||
* For TARGET LPC1768
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
#define PWM_PIN(P) true // all pins are software PWM capable
|
|
||||||
|
|
||||||
#define LPC_PIN(pin) MCUI::gpio_pin(pin)
|
|
||||||
#define LPC_GPIO(port) MCUI::gpio_port(port)
|
|
||||||
|
|
||||||
#define SET_DIR_INPUT(IO) MCUI::gpio_set_input(IO)
|
|
||||||
#define SET_DIR_OUTPUT(IO) MCUI::gpio_set_output(IO)
|
|
||||||
|
|
||||||
#define SET_MODE(IO, mode) pinMode(IO, mode)
|
|
||||||
|
|
||||||
#define WRITE_PIN_SET(IO) MCUI::gpio_set(IO)
|
|
||||||
#define WRITE_PIN_CLR(IO) MCUI::gpio_clear(IO)
|
|
||||||
|
|
||||||
#define READ_PIN(IO) MCUI::gpio_get(IO)
|
|
||||||
#define WRITE_PIN(IO,V) MCUI::gpio_set(IO, V)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Magic I/O routines
|
|
||||||
*
|
|
||||||
* Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW);
|
|
||||||
*
|
|
||||||
* Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// Read a pin
|
|
||||||
#define _READ(IO) READ_PIN(IO)
|
|
||||||
|
|
||||||
/// Write to a pin
|
|
||||||
#define _WRITE(IO,V) WRITE_PIN(IO,V)
|
|
||||||
|
|
||||||
/// toggle a pin
|
|
||||||
#define _TOGGLE(IO) MCUI::gpio_toggle(IO)
|
|
||||||
|
|
||||||
/// set pin as input
|
|
||||||
#define _SET_INPUT(IO) SET_DIR_INPUT(IO)
|
|
||||||
|
|
||||||
/// set pin as output
|
|
||||||
#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO)
|
|
||||||
|
|
||||||
/// set pin as input with pullup mode
|
|
||||||
#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT)
|
|
||||||
|
|
||||||
/// set pin as input with pulldown mode
|
|
||||||
#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT)
|
|
||||||
|
|
||||||
/// check if pin is an input
|
|
||||||
#define _IS_INPUT(IO) (!MCUI::gpio_get_dir(IO))
|
|
||||||
|
|
||||||
/// check if pin is an output
|
|
||||||
#define _IS_OUTPUT(IO) (MCUI::gpio_get_dir(IO))
|
|
||||||
|
|
||||||
/// Read a pin wrapper
|
|
||||||
#define READ(IO) _READ(IO)
|
|
||||||
|
|
||||||
/// Write to a pin wrapper
|
|
||||||
#define WRITE(IO,V) _WRITE(IO,V)
|
|
||||||
|
|
||||||
/// toggle a pin wrapper
|
|
||||||
#define TOGGLE(IO) _TOGGLE(IO)
|
|
||||||
|
|
||||||
/// set pin as input wrapper
|
|
||||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
|
||||||
/// set pin as input with pullup wrapper
|
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
|
||||||
/// set pin as input with pulldown wrapper
|
|
||||||
#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0)
|
|
||||||
/// set pin as output wrapper - reads the pin and sets the output to that value
|
|
||||||
#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0)
|
|
||||||
// set pin as PWM
|
|
||||||
#define SET_PWM SET_OUTPUT
|
|
||||||
|
|
||||||
/// check if pin is an input wrapper
|
|
||||||
#define IS_INPUT(IO) _IS_INPUT(IO)
|
|
||||||
/// check if pin is an output wrapper
|
|
||||||
#define IS_OUTPUT(IO) _IS_OUTPUT(IO)
|
|
||||||
|
|
||||||
// Shorthand
|
|
||||||
#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0)
|
|
||||||
|
|
||||||
// digitalRead/Write wrappers
|
|
||||||
#define extDigitalRead(IO) digitalRead(IO)
|
|
||||||
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#if DISABLED(NO_SD_HOST_DRIVE)
|
|
||||||
#define HAS_SD_HOST_DRIVE 1
|
|
||||||
#endif
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#if USE_FALLBACK_EEPROM
|
|
||||||
#define FLASH_EEPROM_EMULATION
|
|
||||||
#elif ANY(I2C_EEPROM, SPI_EEPROM)
|
|
||||||
#define USE_SHARED_EEPROM 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785)
|
|
||||||
// TODO: Which other boards are incompatible?
|
|
||||||
#if defined(MCU_LPC1768) && ENABLED(FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
|
|
||||||
#define PRINTCOUNTER_SYNC 1
|
|
||||||
#endif
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
// #if PIO_PLATFORM_VERSION < 1001
|
|
||||||
// #error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically."
|
|
||||||
// #endif
|
|
||||||
// #if PIO_FRAMEWORK_VERSION < 2006
|
|
||||||
// #error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries."
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detect an old pins file by checking for old ADC pins values.
|
|
||||||
*/
|
|
||||||
#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && !WITHIN(_CAT(P,_PIN), TERN(LPC1768_IS_SKRV1_3, 0, 2), 3) // Include P0_00 and P0_01 for SKR V1.3 board
|
|
||||||
#if _OLD_TEMP_PIN(TEMP_BED)
|
|
||||||
#error "TEMP_BED_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_0)
|
|
||||||
#error "TEMP_0_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_1)
|
|
||||||
#error "TEMP_1_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_2)
|
|
||||||
#error "TEMP_2_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_3)
|
|
||||||
#error "TEMP_3_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_4)
|
|
||||||
#error "TEMP_4_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_5)
|
|
||||||
#error "TEMP_5_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_6)
|
|
||||||
#error "TEMP_6_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#elif _OLD_TEMP_PIN(TEMP_7)
|
|
||||||
#error "TEMP_7_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
|
||||||
#endif
|
|
||||||
#undef _OLD_TEMP_PIN
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Because PWM hardware channels all share the same frequency, along with the
|
|
||||||
* fallback software channels, FAST_PWM_FAN is incompatible with Servos.
|
|
||||||
*/
|
|
||||||
static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are incompatible with FAST_PWM_FAN on LPC176x boards.");
|
|
||||||
|
|
||||||
#if SPINDLE_LASER_FREQUENCY
|
|
||||||
static_assert(!NUM_SERVOS, "BLTOUCH and Servos are incompatible with SPINDLE_LASER_FREQUENCY on LPC176x boards.");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test LPC176x-specific configuration values for errors at compile-time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
|
|
||||||
// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
#if MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF)
|
|
||||||
#if IS_RRD_FG_SC && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI)
|
|
||||||
#error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported on LPC176x.");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flag any serial port conflicts
|
|
||||||
*
|
|
||||||
* Port | TX | RX |
|
|
||||||
* --- | --- | --- |
|
|
||||||
* Serial | P0_02 | P0_03 |
|
|
||||||
* Serial1 | P0_15 | P0_16 |
|
|
||||||
* Serial2 | P0_10 | P0_11 |
|
|
||||||
* Serial3 | P0_00 | P0_01 |
|
|
||||||
*/
|
|
||||||
#define ANY_TX(N,V...) DO(IS_TX##N,||,V)
|
|
||||||
#define ANY_RX(N,V...) DO(IS_RX##N,||,V)
|
|
||||||
|
|
||||||
#if USING_HW_SERIAL0
|
|
||||||
#define IS_TX0(P) (P == P0_02)
|
|
||||||
#define IS_RX0(P) (P == P0_03)
|
|
||||||
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
|
|
||||||
#error "Serial port pins (0) conflict with Trinamic SPI pins!"
|
|
||||||
#elif HAS_PRUSA_MMU1 && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN))
|
|
||||||
#error "Serial port pins (0) conflict with Multi-Material-Unit multiplexer pins!"
|
|
||||||
#elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN))
|
|
||||||
#error "Serial port pins (0) conflict with X/Y axis SPI pins!"
|
|
||||||
#endif
|
|
||||||
#undef IS_TX0
|
|
||||||
#undef IS_RX0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
#define IS_TX1(P) (P == P0_15)
|
|
||||||
#define IS_RX1(P) (P == P0_16)
|
|
||||||
#define _IS_TX1_1 IS_TX1
|
|
||||||
#define _IS_RX1_1 IS_RX1
|
|
||||||
#if IS_TX1(TMC_SW_SCK)
|
|
||||||
#error "Serial port pins (1) conflict with other pins!"
|
|
||||||
#elif HAS_ROTARY_ENCODER
|
|
||||||
#if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
|
|
||||||
#error "Serial port pins (1) conflict with Encoder Buttons!"
|
|
||||||
#elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK_PIN) \
|
|
||||||
|| ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
|
|
||||||
#error "Serial port pins (1) conflict with LCD pins!"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#undef IS_TX1
|
|
||||||
#undef IS_RX1
|
|
||||||
#undef _IS_TX1_1
|
|
||||||
#undef _IS_RX1_1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
#define IS_TX2(P) (P == P0_10)
|
|
||||||
#define IS_RX2(P) (P == P0_11)
|
|
||||||
#define _IS_TX2_1 IS_TX2
|
|
||||||
#define _IS_RX2_1 IS_RX2
|
|
||||||
#if IS_TX2(X2_ENABLE_PIN) || ANY_RX(2, X2_DIR_PIN, X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN))
|
|
||||||
#error "Serial port pins (2) conflict with X2 pins!"
|
|
||||||
#elif IS_TX2(Y2_ENABLE_PIN) || ANY_RX(2, Y2_DIR_PIN, Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN))
|
|
||||||
#error "Serial port pins (2) conflict with Y2 pins!"
|
|
||||||
#elif IS_TX2(Z2_ENABLE_PIN) || ANY_RX(2, Z2_DIR_PIN, Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN))
|
|
||||||
#error "Serial port pins (2) conflict with Z2 pins!"
|
|
||||||
#elif IS_TX2(Z3_ENABLE_PIN) || ANY_RX(2, Z3_DIR_PIN, Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN))
|
|
||||||
#error "Serial port pins (2) conflict with Z3 pins!"
|
|
||||||
#elif IS_TX2(Z4_ENABLE_PIN) || ANY_RX(2, Z4_DIR_PIN, Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN))
|
|
||||||
#error "Serial port pins (2) conflict with Z4 pins!"
|
|
||||||
#elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN)
|
|
||||||
#error "Serial port pins (2) conflict with other pins!"
|
|
||||||
#elif Y_HOME_TO_MIN && IS_TX2(Y_STOP_PIN)
|
|
||||||
#error "Serial port pins (2) conflict with Y endstop pin!"
|
|
||||||
#elif USES_Z_MIN_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN)
|
|
||||||
#error "Serial port pins (2) conflict with probe pin!"
|
|
||||||
#elif ANY_TX(2, X_ENABLE_PIN, Y_ENABLE_PIN) || ANY_RX(2, X_DIR_PIN, Y_DIR_PIN)
|
|
||||||
#error "Serial port pins (2) conflict with X/Y stepper pins!"
|
|
||||||
#elif HAS_MULTI_EXTRUDER && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN)))
|
|
||||||
#error "Serial port pins (2) conflict with E1 stepper pins!"
|
|
||||||
#elif EXTRUDERS && ANY_RX(2, E0_DIR_PIN, E0_STEP_PIN)
|
|
||||||
#error "Serial port pins (2) conflict with E stepper pins!"
|
|
||||||
#endif
|
|
||||||
#undef IS_TX2
|
|
||||||
#undef IS_RX2
|
|
||||||
#undef _IS_TX2_1
|
|
||||||
#undef _IS_RX2_1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
#define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00)
|
|
||||||
#define PIN_IS_RX3(P) (P##_PIN == P0_01)
|
|
||||||
#if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX)
|
|
||||||
#error "Serial port pins (3) conflict with X endstop pins!"
|
|
||||||
#elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) || PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX)
|
|
||||||
#error "Serial port pins (3) conflict with X/Y axis UART pins!"
|
|
||||||
#elif PIN_IS_TX3(X2_DIR) || PIN_IS_RX3(X2_STEP)
|
|
||||||
#error "Serial port pins (3) conflict with X2 pins!"
|
|
||||||
#elif PIN_IS_TX3(Y2_DIR) || PIN_IS_RX3(Y2_STEP)
|
|
||||||
#error "Serial port pins (3) conflict with Y2 pins!"
|
|
||||||
#elif PIN_IS_TX3(Z2_DIR) || PIN_IS_RX3(Z2_STEP)
|
|
||||||
#error "Serial port pins (3) conflict with Z2 pins!"
|
|
||||||
#elif PIN_IS_TX3(Z3_DIR) || PIN_IS_RX3(Z3_STEP)
|
|
||||||
#error "Serial port pins (3) conflict with Z3 pins!"
|
|
||||||
#elif PIN_IS_TX3(Z4_DIR) || PIN_IS_RX3(Z4_STEP)
|
|
||||||
#error "Serial port pins (3) conflict with Z4 pins!"
|
|
||||||
#elif HAS_MULTI_EXTRUDER && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP))
|
|
||||||
#error "Serial port pins (3) conflict with E1 pins!"
|
|
||||||
#endif
|
|
||||||
#undef PIN_IS_TX3
|
|
||||||
#undef PIN_IS_RX3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef ANY_TX
|
|
||||||
#undef ANY_RX
|
|
||||||
|
|
||||||
//
|
|
||||||
// Flag any i2c pin conflicts
|
|
||||||
//
|
|
||||||
#if ANY(HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM)
|
|
||||||
#define USEDI2CDEV_M 1 // <Arduino>/Wire.cpp
|
|
||||||
|
|
||||||
#if USEDI2CDEV_M == 0 // P0_27 [D57] (AUX-1) .......... P0_28 [D58] (AUX-1)
|
|
||||||
#define PIN_IS_SDA0(P) (P##_PIN == P0_27)
|
|
||||||
#define IS_SCL0(P) (P == P0_28)
|
|
||||||
#if ENABLED(SDSUPPORT) && PIN_IS_SDA0(SD_DETECT)
|
|
||||||
#error "SDA0 overlaps with SD_DETECT_PIN!"
|
|
||||||
#elif PIN_IS_SDA0(E0_AUTO_FAN)
|
|
||||||
#error "SDA0 overlaps with E0_AUTO_FAN_PIN!"
|
|
||||||
#elif PIN_IS_SDA0(BEEPER)
|
|
||||||
#error "SDA0 overlaps with BEEPER_PIN!"
|
|
||||||
#elif IS_SCL0(BTN_ENC)
|
|
||||||
#error "SCL0 overlaps with Encoder Button!"
|
|
||||||
#elif IS_SCL0(SD_SS_PIN)
|
|
||||||
#error "SCL0 overlaps with SD_SS_PIN!"
|
|
||||||
#elif IS_SCL0(LCD_SDSS)
|
|
||||||
#error "SCL0 overlaps with LCD_SDSS!"
|
|
||||||
#endif
|
|
||||||
#undef PIN_IS_SDA0
|
|
||||||
#undef IS_SCL0
|
|
||||||
#elif USEDI2CDEV_M == 1 // P0_00 [D20] (SCA) ............ P0_01 [D21] (SCL)
|
|
||||||
#define PIN_IS_SDA1(P) (PIN_EXISTS(P) && P##_PIN == P0_00)
|
|
||||||
#define PIN_IS_SCL1(P) (P##_PIN == P0_01)
|
|
||||||
#if PIN_IS_SDA1(X_MIN) || PIN_IS_SCL1(X_MAX)
|
|
||||||
#error "One or more i2c (1) pins overlaps with X endstop pins! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA1(X2_DIR) || PIN_IS_SCL1(X2_STEP)
|
|
||||||
#error "One or more i2c (1) pins overlaps with X2 pins! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA1(Y2_DIR) || PIN_IS_SCL1(Y2_STEP)
|
|
||||||
#error "One or more i2c (1) pins overlaps with Y2 pins! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA1(Z2_DIR) || PIN_IS_SCL1(Z2_STEP)
|
|
||||||
#error "One or more i2c (1) pins overlaps with Z2 pins! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA1(Z3_DIR) || PIN_IS_SCL1(Z3_STEP)
|
|
||||||
#error "One or more i2c (1) pins overlaps with Z3 pins! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA1(Z4_DIR) || PIN_IS_SCL1(Z4_STEP)
|
|
||||||
#error "One or more i2c (1) pins overlaps with Z4 pins! Disable i2c peripherals."
|
|
||||||
#elif HAS_MULTI_EXTRUDER && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP))
|
|
||||||
#error "One or more i2c (1) pins overlaps with E1 pins! Disable i2c peripherals."
|
|
||||||
#endif
|
|
||||||
#undef PIN_IS_SDA1
|
|
||||||
#undef PIN_IS_SCL1
|
|
||||||
#elif USEDI2CDEV_M == 2 // P0_10 [D38] (X_ENABLE_PIN) ... P0_11 [D55] (X_DIR_PIN)
|
|
||||||
#define PIN_IS_SDA2(P) (P##_PIN == P0_10)
|
|
||||||
#define PIN_IS_SCL2(P) (P##_PIN == P0_11)
|
|
||||||
#if PIN_IS_SDA2(Y_STOP)
|
|
||||||
#error "i2c SDA2 overlaps with Y endstop pin!"
|
|
||||||
#elif USES_Z_MIN_PROBE_PIN && PIN_IS_SDA2(Z_MIN_PROBE)
|
|
||||||
#error "i2c SDA2 overlaps with Z probe pin!"
|
|
||||||
#elif PIN_IS_SDA2(X_ENABLE) || PIN_IS_SDA2(Y_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with X/Y ENABLE pin!"
|
|
||||||
#elif AXIS_HAS_SPI(X) && PIN_IS_SDA2(X_CS)
|
|
||||||
#error "i2c SDA2 overlaps with X CS pin!"
|
|
||||||
#elif PIN_IS_SDA2(X2_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with X2 enable pin! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA2(Y2_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with Y2 enable pin! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA2(Z2_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with Z2 enable pin! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA2(Z3_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with Z3 enable pin! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA2(Z4_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with Z4 enable pin! Disable i2c peripherals."
|
|
||||||
#elif HAS_MULTI_EXTRUDER && PIN_IS_SDA2(E1_ENABLE)
|
|
||||||
#error "i2c SDA2 overlaps with E1 enable pin! Disable i2c peripherals."
|
|
||||||
#elif HAS_MULTI_EXTRUDER && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS)
|
|
||||||
#error "i2c SDA2 overlaps with E1 CS pin! Disable i2c peripherals."
|
|
||||||
#elif EXTRUDERS && (PIN_IS_SDA2(E0_STEP) || PIN_IS_SDA2(E0_DIR))
|
|
||||||
#error "i2c SCL2 overlaps with E0 STEP/DIR pin! Disable i2c peripherals."
|
|
||||||
#elif PIN_IS_SDA2(X_DIR) || PIN_IS_SDA2(Y_DIR)
|
|
||||||
#error "One or more i2c pins overlaps with X/Y DIR pin! Disable i2c peripherals."
|
|
||||||
#endif
|
|
||||||
#undef PIN_IS_SDA2
|
|
||||||
#undef PIN_IS_SCL2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef USEDI2CDEV_M
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
|
||||||
#error "SERIAL_STATS_MAX_RX_QUEUED is not supported on LPC176x."
|
|
||||||
#elif ENABLED(SERIAL_STATS_DROPPED_RX)
|
|
||||||
#error "SERIAL_STATS_DROPPED_RX is not supported on LPX176x."
|
|
||||||
#endif
|
|
||||||
@@ -1,209 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
//#define MSBFIRST 1
|
|
||||||
|
|
||||||
#define SPI_MODE0 0
|
|
||||||
#define SPI_MODE1 1
|
|
||||||
#define SPI_MODE2 2
|
|
||||||
#define SPI_MODE3 3
|
|
||||||
|
|
||||||
#define SSP_CR0_DSS(n) ((uint32_t)((n-1)&0xF))
|
|
||||||
#define SSP_DATABIT_4 SSP_CR0_DSS(4) /*!< Databit number = 4 */
|
|
||||||
#define SSP_DATABIT_5 SSP_CR0_DSS(5) /*!< Databit number = 5 */
|
|
||||||
#define SSP_DATABIT_6 SSP_CR0_DSS(6) /*!< Databit number = 6 */
|
|
||||||
#define SSP_DATABIT_7 SSP_CR0_DSS(7) /*!< Databit number = 7 */
|
|
||||||
#define SSP_DATABIT_8 SSP_CR0_DSS(8) /*!< Databit number = 8 */
|
|
||||||
#define SSP_DATABIT_9 SSP_CR0_DSS(9) /*!< Databit number = 9 */
|
|
||||||
#define SSP_DATABIT_10 SSP_CR0_DSS(10) /*!< Databit number = 10 */
|
|
||||||
#define SSP_DATABIT_11 SSP_CR0_DSS(11) /*!< Databit number = 11 */
|
|
||||||
#define SSP_DATABIT_12 SSP_CR0_DSS(12) /*!< Databit number = 12 */
|
|
||||||
#define SSP_DATABIT_13 SSP_CR0_DSS(13) /*!< Databit number = 13 */
|
|
||||||
#define SSP_DATABIT_14 SSP_CR0_DSS(14) /*!< Databit number = 14 */
|
|
||||||
#define SSP_DATABIT_15 SSP_CR0_DSS(15) /*!< Databit number = 15 */
|
|
||||||
#define SSP_DATABIT_16 SSP_CR0_DSS(16) /*!< Databit number = 16 */
|
|
||||||
|
|
||||||
#define DATA_SIZE_8BIT SSP_DATABIT_8
|
|
||||||
#define DATA_SIZE_16BIT SSP_DATABIT_16
|
|
||||||
|
|
||||||
#define SPI_CLOCK_MAX_TFT 30000000UL
|
|
||||||
#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
|
|
||||||
#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED
|
|
||||||
#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED
|
|
||||||
#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED
|
|
||||||
#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5
|
|
||||||
#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
|
|
||||||
#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h
|
|
||||||
|
|
||||||
#define SPI_CLOCK_MAX SPI_CLOCK_DIV2
|
|
||||||
|
|
||||||
#define BOARD_NR_SPI 3
|
|
||||||
|
|
||||||
// SSP0 TMC port
|
|
||||||
#define BOARD_SPI1_NSS_PIN P_NC
|
|
||||||
#define BOARD_SPI1_SCK_PIN P1_20
|
|
||||||
#define BOARD_SPI1_MISO_PIN P1_23
|
|
||||||
#define BOARD_SPI1_MOSI_PIN P1_24
|
|
||||||
|
|
||||||
// SSP2 LCD SD port
|
|
||||||
#define BOARD_SPI2_NSS_PIN P_NC
|
|
||||||
#define BOARD_SPI2_SCK_PIN P1_00
|
|
||||||
#define BOARD_SPI2_MISO_PIN P1_04
|
|
||||||
#define BOARD_SPI2_MOSI_PIN P1_01
|
|
||||||
|
|
||||||
// SSP1 Onboard SD port
|
|
||||||
#define BOARD_SPI3_NSS_PIN P_NC
|
|
||||||
#define BOARD_SPI3_SCK_PIN P0_07
|
|
||||||
#define BOARD_SPI3_MISO_PIN P0_08
|
|
||||||
#define BOARD_SPI3_MOSI_PIN P0_09
|
|
||||||
|
|
||||||
class SPISettings {
|
|
||||||
public:
|
|
||||||
SPISettings(uint32_t spiRate, int inBitOrder, int inDataMode) {
|
|
||||||
init_AlwaysInline(spiRate2Clock(spiRate), inBitOrder, inDataMode, DATA_SIZE_8BIT);
|
|
||||||
}
|
|
||||||
SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) {
|
|
||||||
if (__builtin_constant_p(inClock))
|
|
||||||
init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize);
|
|
||||||
else
|
|
||||||
init_MightInline(inClock, inBitOrder, inDataMode, inDataSize);
|
|
||||||
}
|
|
||||||
SPISettings() {
|
|
||||||
init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
//uint32_t spiRate() const { return spi_speed; }
|
|
||||||
|
|
||||||
static uint32_t spiRate2Clock(uint32_t spiRate) {
|
|
||||||
uint32_t Marlin_speed[7]; // CPSR is always 2
|
|
||||||
Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
|
|
||||||
Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED
|
|
||||||
Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED
|
|
||||||
Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED
|
|
||||||
Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5
|
|
||||||
Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
|
|
||||||
Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h
|
|
||||||
return Marlin_speed[spiRate > 6 ? 6 : spiRate];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) {
|
|
||||||
init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize);
|
|
||||||
}
|
|
||||||
void init_AlwaysInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) {
|
|
||||||
clock = inClock;
|
|
||||||
bitOrder = inBitOrder;
|
|
||||||
dataMode = inDataMode;
|
|
||||||
dataSize = inDataSize;
|
|
||||||
m_config = {};
|
|
||||||
m_config.frequency = 400000;
|
|
||||||
}
|
|
||||||
|
|
||||||
MCUI::SSP::Config m_config;
|
|
||||||
|
|
||||||
//uint32_t spi_speed;
|
|
||||||
uint32_t clock;
|
|
||||||
uint32_t dataSize;
|
|
||||||
//uint32_t clockDivider;
|
|
||||||
uint8_t bitOrder;
|
|
||||||
uint8_t dataMode;
|
|
||||||
|
|
||||||
uint8_t device_id;
|
|
||||||
|
|
||||||
friend class SPIClass;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Wirish SPI interface.
|
|
||||||
*
|
|
||||||
* This is the same interface is available across HAL
|
|
||||||
*
|
|
||||||
* This implementation uses software slave management, so the caller
|
|
||||||
* is responsible for controlling the slave select line.
|
|
||||||
*/
|
|
||||||
class SPIClass {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @param spiPortNumber Number of the SPI port to manage.
|
|
||||||
*/
|
|
||||||
SPIClass(uint8_t spiPortNumber);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Init using pins
|
|
||||||
*/
|
|
||||||
SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel = (pin_t)-1);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Select and configure the current selected SPI device to use
|
|
||||||
*/
|
|
||||||
void begin();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable the current SPI device
|
|
||||||
*/
|
|
||||||
void end();
|
|
||||||
|
|
||||||
void beginTransaction(const SPISettings&);
|
|
||||||
void endTransaction() {}
|
|
||||||
|
|
||||||
// Transfer using 1 "Data Size"
|
|
||||||
uint8_t transfer(uint16_t data);
|
|
||||||
// Transfer 2 bytes in 8 bit mode
|
|
||||||
uint16_t transfer16(uint16_t data);
|
|
||||||
|
|
||||||
void send(uint8_t data);
|
|
||||||
|
|
||||||
uint16_t read();
|
|
||||||
void read(uint8_t *buf, uint32_t len);
|
|
||||||
|
|
||||||
void dmaSend(void *buf, uint16_t length, bool minc);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sets the number of the SPI peripheral to be used by
|
|
||||||
* this HardwareSPI instance.
|
|
||||||
*
|
|
||||||
* @param spi_num Number of the SPI port. 1-2 in low density devices
|
|
||||||
* or 1-3 in high density devices.
|
|
||||||
*/
|
|
||||||
void setModule(uint8_t device);
|
|
||||||
|
|
||||||
void setClock(uint32_t clock);
|
|
||||||
void setBitOrder(uint8_t bitOrder);
|
|
||||||
void setDataMode(uint8_t dataMode);
|
|
||||||
void setDataSize(uint32_t ds);
|
|
||||||
|
|
||||||
inline uint32_t getDataSize() { return _currentSetting->dataSize; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
SPISettings _settings[BOARD_NR_SPI];
|
|
||||||
SPISettings *_currentSetting;
|
|
||||||
|
|
||||||
void updateSettings();
|
|
||||||
};
|
|
||||||
|
|
||||||
extern SPIClass SPI;
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "../../core/millis_t.h"
|
|
||||||
#include "../../sd/cardreader.h"
|
|
||||||
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
#include <driver/usb_device.h>
|
|
||||||
|
|
||||||
TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial());
|
|
||||||
|
|
||||||
void MarlinHAL::init() {
|
|
||||||
|
|
||||||
MCUI::pwm_init();
|
|
||||||
|
|
||||||
// Init LEDs
|
|
||||||
#if PIN_EXISTS(LED)
|
|
||||||
SET_DIR_OUTPUT(LED_PIN);
|
|
||||||
WRITE_PIN_CLR(LED_PIN);
|
|
||||||
#if PIN_EXISTS(LED2)
|
|
||||||
SET_DIR_OUTPUT(LED2_PIN);
|
|
||||||
WRITE_PIN_CLR(LED2_PIN);
|
|
||||||
#if PIN_EXISTS(LED3)
|
|
||||||
SET_DIR_OUTPUT(LED3_PIN);
|
|
||||||
WRITE_PIN_CLR(LED3_PIN);
|
|
||||||
#if PIN_EXISTS(LED4)
|
|
||||||
SET_DIR_OUTPUT(LED4_PIN);
|
|
||||||
WRITE_PIN_CLR(LED4_PIN);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Flash status LED 3 times to indicate Marlin has started booting
|
|
||||||
for(int i = 0; i < 6; ++i) {
|
|
||||||
TOGGLE(LED_PIN);
|
|
||||||
delay(100);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Init Servo Pins
|
|
||||||
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
|
|
||||||
#if HAS_SERVO_0
|
|
||||||
INIT_SERVO(0);
|
|
||||||
#endif
|
|
||||||
#if HAS_SERVO_1
|
|
||||||
INIT_SERVO(1);
|
|
||||||
#endif
|
|
||||||
#if HAS_SERVO_2
|
|
||||||
INIT_SERVO(2);
|
|
||||||
#endif
|
|
||||||
#if HAS_SERVO_3
|
|
||||||
INIT_SERVO(3);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PIN_EXISTS(SD_SS)
|
|
||||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SD_SS_PIN
|
|
||||||
OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TERN_(HAS_SD_HOST_DRIVE, MCUI::USBDevice::msc_storage_init()); // Enable USB SD card access
|
|
||||||
MCUI::USBDevice::connect(2000, LED_PIN);
|
|
||||||
|
|
||||||
HAL_timer_init();
|
|
||||||
|
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
|
||||||
}
|
|
||||||
|
|
||||||
// HAL idle task
|
|
||||||
void MarlinHAL::idletask() {
|
|
||||||
#if HAS_SHARED_MEDIA
|
|
||||||
// If Marlin is using the SD card we need to lock it to prevent access from
|
|
||||||
// a PC via USB.
|
|
||||||
// Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but
|
|
||||||
// this will not reliably detect delete operations. To be safe we will lock
|
|
||||||
// the disk if Marlin has it mounted. Unfortunately there is currently no way
|
|
||||||
// to unmount the disk from the LCD menu.
|
|
||||||
// if (IS_SD_PRINTING() || IS_SD_FILE_OPEN())
|
|
||||||
if (card.isMounted())
|
|
||||||
MCUI::USBDevice::msc_storage_lock();
|
|
||||||
else
|
|
||||||
MCUI::USBDevice::msc_storage_release();
|
|
||||||
#endif
|
|
||||||
// Perform USB stack housekeeping
|
|
||||||
MCUI::USBDevice::msc_run_deferred_commands();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Support routines for LPC1768
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translation of routines & variables used by pinsDebug.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
|
||||||
#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0)
|
|
||||||
#define digitalRead_mod(p) extDigitalRead(p)
|
|
||||||
#define PRINT_PORT(p)
|
|
||||||
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
|
||||||
#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("P%d_%02d"), MCUI::pin_port(p), MCUI::pin_bit(p)); SERIAL_ECHO(buffer); }while(0)
|
|
||||||
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR("_A%d "), MCUI::pin_get_adc_channel(pin)); SERIAL_ECHO(buffer); }while(0)
|
|
||||||
#define MULTI_NAME_PAD 17 // space needed to be pretty if not first name assigned to a pin
|
|
||||||
|
|
||||||
// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities
|
|
||||||
#ifndef M43_NEVER_TOUCH
|
|
||||||
#define M43_NEVER_TOUCH(Q) ((Q) == P0_29 || (Q) == P0_30 || (Q) == P2_09) // USB pins
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool GET_PINMODE(const pin_t pin) {
|
|
||||||
if (!MCUI::pin_is_valid(pin) || MCUI::pin_adc_enabled(pin)) // found an invalid pin or active analog pin
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return MCUI::gpio_direction(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital)
|
|
||||||
|
|
||||||
void print_port(const pin_t) {}
|
|
||||||
void pwm_details(const pin_t) {}
|
|
||||||
bool pwm_status(const pin_t) { return false; }
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
|
|
||||||
#if ALL(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN)
|
|
||||||
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
|
|
||||||
// needed due to the speed and mode required for communicating with each device being different.
|
|
||||||
// This requirement can be removed if the SPI access to these devices is updated to use
|
|
||||||
// spiBeginTransaction.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** onboard SD card */
|
|
||||||
//#define SD_SCK_PIN P0_07
|
|
||||||
//#define SD_MISO_PIN P0_08
|
|
||||||
//#define SD_MOSI_PIN P0_09
|
|
||||||
//#define SD_SS_PIN P0_06
|
|
||||||
/** external */
|
|
||||||
#ifndef SD_SCK_PIN
|
|
||||||
#define SD_SCK_PIN P0_15
|
|
||||||
#endif
|
|
||||||
#ifndef SD_MISO_PIN
|
|
||||||
#define SD_MISO_PIN P0_17
|
|
||||||
#endif
|
|
||||||
#ifndef SD_MOSI_PIN
|
|
||||||
#define SD_MOSI_PIN P0_18
|
|
||||||
#endif
|
|
||||||
#ifndef SD_SS_PIN
|
|
||||||
#define SD_SS_PIN P1_23
|
|
||||||
#endif
|
|
||||||
#if !defined(SDSS) || SDSS == P_NC // gets defaulted in pins.h
|
|
||||||
#undef SDSS
|
|
||||||
#define SDSS SD_SS_PIN
|
|
||||||
#endif
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Description:
|
|
||||||
*
|
|
||||||
* Timers for LPC1768
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
void HAL_timer_init() {
|
|
||||||
SBI(MCUI::system_control.PCONP, SBIT_TIMER0); // Power ON Timer 0
|
|
||||||
STEP_TIMER_REF.PR = (HAL_TIMER_RATE) / (STEPPER_TIMER_RATE) - 1; // Use prescaler to set frequency if needed
|
|
||||||
|
|
||||||
SBI(MCUI::system_control.PCONP, SBIT_TIMER1); // Power ON Timer 1
|
|
||||||
TEMP_TIMER_REF.PR = (HAL_TIMER_RATE) / 1000000 - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP:
|
|
||||||
STEP_TIMER_REF.MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them
|
|
||||||
STEP_TIMER_REF.MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency
|
|
||||||
STEP_TIMER_REF.TCR = _BV(SBIT_CNTEN); // Counter Enable
|
|
||||||
|
|
||||||
MCUCore::nvic_set_priority(MCUI::IRQNumber::TIMER0, MCUCore::nvic_encode_priority(0, 1, 0));
|
|
||||||
MCUCore::nvic_enable_irq(MCUI::IRQNumber::TIMER0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MF_TIMER_TEMP:
|
|
||||||
TEMP_TIMER_REF.MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them
|
|
||||||
TEMP_TIMER_REF.MR0 = uint32_t(TEMP_TIMER_RATE) / frequency;
|
|
||||||
TEMP_TIMER_REF.TCR = _BV(SBIT_CNTEN); // Counter Enable
|
|
||||||
|
|
||||||
MCUCore::nvic_set_priority(MCUI::IRQNumber::TIMER1, MCUCore::nvic_encode_priority(0, 2, 0));
|
|
||||||
MCUCore::nvic_enable_irq(MCUI::IRQNumber::TIMER1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HAL For LPC1768
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
|
|
||||||
#define SBIT_TIMER0 1
|
|
||||||
#define SBIT_TIMER1 2
|
|
||||||
|
|
||||||
#define SBIT_CNTEN 0
|
|
||||||
|
|
||||||
#define SBIT_MR0I 0 // Timer 0 Interrupt when TC matches MR0
|
|
||||||
#define SBIT_MR0R 1 // Timer 0 Reset TC on Match
|
|
||||||
#define SBIT_MR0S 2 // Timer 0 Stop TC and PC on Match
|
|
||||||
#define SBIT_MR1I 3
|
|
||||||
#define SBIT_MR1R 4
|
|
||||||
#define SBIT_MR1S 5
|
|
||||||
#define SBIT_MR2I 6
|
|
||||||
#define SBIT_MR2R 7
|
|
||||||
#define SBIT_MR2S 8
|
|
||||||
#define SBIT_MR3I 9
|
|
||||||
#define SBIT_MR3R 10
|
|
||||||
#define SBIT_MR3S 11
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Defines
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
#define _HAL_TIMER(T) _CAT(MCUI::timer, T)
|
|
||||||
#define _HAL_TIMER_IRQ(T) TIMER##T##_IRQn
|
|
||||||
#define __HAL_TIMER_ISR(T) extern "C" void TIMER##T##_IRQHandler()
|
|
||||||
#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T)
|
|
||||||
|
|
||||||
typedef uint32_t hal_timer_t;
|
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
|
||||||
|
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
|
||||||
|
|
||||||
#ifndef MF_TIMER_STEP
|
|
||||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
|
||||||
#endif
|
|
||||||
#ifndef MF_TIMER_PULSE
|
|
||||||
#define MF_TIMER_PULSE MF_TIMER_STEP
|
|
||||||
#endif
|
|
||||||
#ifndef MF_TIMER_TEMP
|
|
||||||
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
|
||||||
#endif
|
|
||||||
#ifndef MF_TIMER_PWM
|
|
||||||
#define MF_TIMER_PWM 3 // Timer Index for PWM
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TEMP_TIMER_RATE 1000000
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
|
||||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
|
||||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
|
||||||
|
|
||||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
|
||||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
|
||||||
|
|
||||||
#ifndef HAL_STEP_TIMER_ISR
|
|
||||||
#define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(MF_TIMER_STEP)
|
|
||||||
#endif
|
|
||||||
#ifndef HAL_TEMP_TIMER_ISR
|
|
||||||
#define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(MF_TIMER_TEMP)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Timer references by index
|
|
||||||
#define STEP_TIMER_REF _HAL_TIMER(MF_TIMER_STEP)
|
|
||||||
#define TEMP_TIMER_REF _HAL_TIMER(MF_TIMER_TEMP)
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Public functions
|
|
||||||
// ------------------------
|
|
||||||
void HAL_timer_init();
|
|
||||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
|
|
||||||
|
|
||||||
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: STEP_TIMER_REF.MR0 = compare; break; // Stepper Timer Match Register 0
|
|
||||||
case MF_TIMER_TEMP: TEMP_TIMER_REF.MR0 = compare; break; // Temp Timer Match Register 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: return STEP_TIMER_REF.MR0; // Stepper Timer Match Register 0
|
|
||||||
case MF_TIMER_TEMP: return TEMP_TIMER_REF.MR0; // Temp Timer Match Register 0
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: return STEP_TIMER_REF.TC; // Stepper Timer Count
|
|
||||||
case MF_TIMER_TEMP: return TEMP_TIMER_REF.TC; // Temp Timer Count
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: MCUCore::nvic_enable_irq(MCUI::IRQNumber::TIMER0); break; // Enable interrupt handler
|
|
||||||
case MF_TIMER_TEMP: MCUCore::nvic_enable_irq(MCUI::IRQNumber::TIMER1); break; // Enable interrupt handler
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: MCUCore::nvic_disable_irq(MCUI::IRQNumber::TIMER0); break; // Disable interrupt handler
|
|
||||||
case MF_TIMER_TEMP: MCUCore::nvic_disable_irq(MCUI::IRQNumber::TIMER1); break; // Disable interrupt handler
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: return MCUCore::nvic_irq_is_enabled(MCUI::IRQNumber::TIMER0); // Check if interrupt is enabled or not
|
|
||||||
case MF_TIMER_TEMP: return MCUCore::nvic_irq_is_enabled(MCUI::IRQNumber::TIMER1); // Check if interrupt is enabled or not
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
|
||||||
switch (timer_num) {
|
|
||||||
case MF_TIMER_STEP: SBI(STEP_TIMER_REF.IR, SBIT_CNTEN); break;
|
|
||||||
case MF_TIMER_TEMP: SBI(TEMP_TIMER_REF.IR, SBIT_CNTEN); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define HAL_timer_isr_epilogue(T) NOOP
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// adapted from I2C/master/master.c example
|
|
||||||
// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC1768
|
|
||||||
|
|
||||||
#include "../include/i2c_util.h"
|
|
||||||
#include "../../../core/millis_t.h"
|
|
||||||
|
|
||||||
extern int millis();
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#define I2CDEV_S_ADDR 0x78 // From SSD1306 (actual address is 0x3C - shift left 1 with LSB set to 0 to indicate write)
|
|
||||||
|
|
||||||
// Send slave address and write bit
|
|
||||||
uint8_t u8g_i2c_start(const uint8_t sla) {
|
|
||||||
// Sometimes TX data ACK or NAK status is returned. That mean the start state didn't
|
|
||||||
// happen which means only the value of the slave address was send. Keep looping until
|
|
||||||
// the slave address and write bit are actually sent.
|
|
||||||
do{
|
|
||||||
_I2C_Stop(I2CDEV_M); // output stop state on I2C bus
|
|
||||||
_I2C_Start(I2CDEV_M); // output start state on I2C bus
|
|
||||||
while ((I2C_status != I2C_I2STAT_M_TX_START)
|
|
||||||
&& (I2C_status != I2C_I2STAT_M_TX_RESTART)
|
|
||||||
&& (I2C_status != I2C_I2STAT_M_TX_DAT_ACK)
|
|
||||||
&& (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted
|
|
||||||
|
|
||||||
LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address
|
|
||||||
LPC_I2C1->I2DAT = I2CDEV_S_ADDR & I2C_I2DAT_BITMASK; // transmit slave address & write bit
|
|
||||||
LPC_I2C1->I2CONSET = I2C_I2CONSET_AA;
|
|
||||||
LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC;
|
|
||||||
while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK)
|
|
||||||
&& (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK)
|
|
||||||
&& (I2C_status != I2C_I2STAT_M_TX_DAT_ACK)
|
|
||||||
&& (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for slaw to finish
|
|
||||||
}while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void u8g_i2c_init(const uint8_t clock_option) {
|
|
||||||
configure_i2c(clock_option);
|
|
||||||
u8g_i2c_start(0); // Send slave address and write bit
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_i2c_send_byte(uint8_t data) {
|
|
||||||
#define I2C_TIMEOUT 3
|
|
||||||
LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data
|
|
||||||
LPC_I2C1->I2CONSET = I2C_I2CONSET_AA;
|
|
||||||
LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC;
|
|
||||||
const millis_t timeout = millis() + I2C_TIMEOUT;
|
|
||||||
while ((I2C_status != I2C_I2STAT_M_TX_DAT_ACK) && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK) && PENDING(millis(), timeout)); // wait for xmit to finish
|
|
||||||
// had hangs with SH1106 so added time out - have seen temporary screen corruption when this happens
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void u8g_i2c_stop() {
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
void u8g_i2c_init(const uint8_t clock_options);
|
|
||||||
//uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos);
|
|
||||||
uint8_t u8g_i2c_start(uint8_t sla);
|
|
||||||
uint8_t u8g_i2c_send_byte(uint8_t data);
|
|
||||||
void u8g_i2c_stop();
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LPC1768 LCD-specific defines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef U8G_HAL_LINKS
|
|
||||||
|
|
||||||
#define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn // See U8glib-HAL
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
|
||||||
|
|
||||||
#define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_LPC1768_sw_spi_fn
|
|
||||||
#define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_LPC1768_hw_spi_fn
|
|
||||||
#define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn
|
|
||||||
#define U8G_COM_ST7920_HAL_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn
|
|
||||||
#define U8G_COM_SSD_I2C_HAL u8g_com_HAL_LPC1768_ssd_hw_i2c_fn
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LCD delay routines - used by all the drivers.
|
|
||||||
*
|
|
||||||
* These are based on the LPC1768 routines.
|
|
||||||
*
|
|
||||||
* Couldn't just call exact copies because the overhead
|
|
||||||
* results in a one microsecond delay taking about 4µS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void U8g_delay(int msec);
|
|
||||||
void u8g_MicroDelay();
|
|
||||||
void u8g_10MicroDelay();
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Low level pin manipulation routines - used by all the drivers.
|
|
||||||
*
|
|
||||||
* These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines.
|
|
||||||
*
|
|
||||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
|
||||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
|
||||||
* resulted in using about about 25% of the CPU's time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include <mcu_interface.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
#include "LCD_pin_routines.h"
|
|
||||||
|
|
||||||
void u8g_SetPinOutput(uint8_t pin) {
|
|
||||||
MCUI::gpio_set_output(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void u8g_SetPinInput(uint8_t pin) {
|
|
||||||
MCUI::gpio_set_input(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status) {
|
|
||||||
MCUI::gpio_set(pin, pin_status);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_GetPinLevel(uint8_t pin) {
|
|
||||||
return MCUI::gpio_get(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Low level pin manipulation routines - used by all the drivers.
|
|
||||||
*
|
|
||||||
* These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines.
|
|
||||||
*
|
|
||||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
|
||||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
|
||||||
* resulted in using about about 25% of the CPU's time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void u8g_SetPinOutput(uint8_t internal_pin_number);
|
|
||||||
void u8g_SetPinInput(uint8_t internal_pin_number);
|
|
||||||
void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status);
|
|
||||||
uint8_t u8g_GetPinLevel(uint8_t pin);
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on u8g_com_msp430_hw_spi.c
|
|
||||||
*
|
|
||||||
* Universal 8bit Graphics Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011, olikraus@gmail.com
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer in the documentation and/or other
|
|
||||||
* materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#ifndef LCD_SPI_SPEED
|
|
||||||
#ifdef SD_SPI_SPEED
|
|
||||||
#define LCD_SPI_SPEED SD_SPI_SPEED // Assume SPI speed shared with SD
|
|
||||||
#else
|
|
||||||
#define LCD_SPI_SPEED SPI_FULL_SPEED // Use full speed if SD speed is not supplied
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
|
||||||
switch (msg) {
|
|
||||||
case U8G_COM_MSG_STOP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_INIT:
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, 1);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_A0, 1);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_RESET, 1);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_A0);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_RESET);
|
|
||||||
u8g_Delay(5);
|
|
||||||
spiBegin();
|
|
||||||
spiInit(LCD_SPI_SPEED);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_CHIP_SELECT:
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, (arg_val ? 0 : 1));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_RESET:
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_BYTE:
|
|
||||||
spiSend((uint8_t)arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ: {
|
|
||||||
uint8_t *ptr = (uint8_t*) arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
spiSend(*ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ_P: {
|
|
||||||
uint8_t *ptr = (uint8_t*) arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
spiSend(*ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,198 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on u8g_com_arduino_ssd_i2c.c
|
|
||||||
*
|
|
||||||
* COM interface for Arduino (AND ATmega) and the SSDxxxx chip (SOLOMON) variant
|
|
||||||
* I2C protocol
|
|
||||||
*
|
|
||||||
* Universal 8bit Graphics Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011, olikraus@gmail.com
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer in the documentation and/or other
|
|
||||||
* materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Special pin usage:
|
|
||||||
* U8G_PI_I2C_OPTION additional options
|
|
||||||
* U8G_PI_A0_STATE used to store the last value of the command/data register selection
|
|
||||||
* U8G_PI_SET_A0 1: Signal request to update I2C device with new A0_STATE, 0: Do nothing, A0_STATE matches I2C device
|
|
||||||
* U8G_PI_SCL clock line (NOT USED)
|
|
||||||
* U8G_PI_SDA data line (NOT USED)
|
|
||||||
*
|
|
||||||
* U8G_PI_RESET reset line (currently disabled, see below)
|
|
||||||
*
|
|
||||||
* Protocol:
|
|
||||||
* SLA, Cmd/Data Selection, Arguments
|
|
||||||
* The command/data register is selected by a special instruction byte, which is sent after SLA
|
|
||||||
*
|
|
||||||
* The continue bit is always 0 so that a (re)start is equired for the change from cmd to/data mode
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC1768
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
|
||||||
|
|
||||||
#define I2C_SLA (0x3C*2)
|
|
||||||
//#define I2C_CMD_MODE 0x080
|
|
||||||
#define I2C_CMD_MODE 0x000
|
|
||||||
#define I2C_DATA_MODE 0x040
|
|
||||||
|
|
||||||
uint8_t u8g_com_ssd_I2C_start_sequence(u8g_t *u8g) {
|
|
||||||
/* are we requested to set the a0 state? */
|
|
||||||
if (u8g->pin_list[U8G_PI_SET_A0] == 0) return 1;
|
|
||||||
|
|
||||||
/* setup bus, might be a repeated start */
|
|
||||||
if (u8g_i2c_start(I2C_SLA) == 0) return 0;
|
|
||||||
if (u8g->pin_list[U8G_PI_A0_STATE] == 0) {
|
|
||||||
if (u8g_i2c_send_byte(I2C_CMD_MODE) == 0) return 0;
|
|
||||||
}
|
|
||||||
else if (u8g_i2c_send_byte(I2C_DATA_MODE) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
u8g->pin_list[U8G_PI_SET_A0] = 0;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
|
||||||
switch (msg) {
|
|
||||||
case U8G_COM_MSG_INIT:
|
|
||||||
//u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH);
|
|
||||||
//u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH);
|
|
||||||
//u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: unknown mode */
|
|
||||||
|
|
||||||
u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]);
|
|
||||||
u8g_com_ssd_I2C_start_sequence(u8g);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_STOP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_RESET:
|
|
||||||
/* Currently disabled, but it could be enable. Previous restrictions have been removed */
|
|
||||||
/* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_CHIP_SELECT:
|
|
||||||
u8g->pin_list[U8G_PI_A0_STATE] = 0;
|
|
||||||
u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */
|
|
||||||
if (arg_val == 0 ) {
|
|
||||||
/* disable chip, send stop condition */
|
|
||||||
u8g_i2c_stop();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* enable, do nothing: any byte writing will trigger the i2c start */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_BYTE:
|
|
||||||
//u8g->pin_list[U8G_PI_SET_A0] = 1;
|
|
||||||
if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) {
|
|
||||||
u8g_i2c_stop();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (u8g_i2c_send_byte(arg_val) == 0) {
|
|
||||||
u8g_i2c_stop();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// u8g_i2c_stop();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ: {
|
|
||||||
//u8g->pin_list[U8G_PI_SET_A0] = 1;
|
|
||||||
if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) {
|
|
||||||
u8g_i2c_stop();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *ptr = (uint8_t *)arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
if (u8g_i2c_send_byte(*ptr++) == 0) {
|
|
||||||
u8g_i2c_stop();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// u8g_i2c_stop();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ_P: {
|
|
||||||
//u8g->pin_list[U8G_PI_SET_A0] = 1;
|
|
||||||
if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) {
|
|
||||||
u8g_i2c_stop();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *ptr = (uint8_t *)arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
if (u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0)
|
|
||||||
return 0;
|
|
||||||
ptr++;
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// u8g_i2c_stop();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
|
||||||
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
|
||||||
u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */
|
|
||||||
break;
|
|
||||||
|
|
||||||
} // switch
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on u8g_com_LPC1768_st7920_hw_spi.c
|
|
||||||
*
|
|
||||||
* Universal 8bit Graphics Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011, olikraus@gmail.com
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer in the documentation and/or other
|
|
||||||
* materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
|
||||||
#include "../../shared/Delay.h"
|
|
||||||
|
|
||||||
void spiBegin();
|
|
||||||
void spiInit(uint8_t spiRate);
|
|
||||||
void spiSend(uint8_t b);
|
|
||||||
void spiSend(const uint8_t *buf, size_t n);
|
|
||||||
|
|
||||||
static uint8_t rs_last_state = 255;
|
|
||||||
|
|
||||||
static void u8g_com_LPC1768_st7920_write_byte_hw_spi(uint8_t rs, uint8_t val) {
|
|
||||||
|
|
||||||
if (rs != rs_last_state) { // Time to send a command/data byte
|
|
||||||
rs_last_state = rs;
|
|
||||||
spiSend(rs ? 0x0FA : 0x0F8); // Send data or command
|
|
||||||
DELAY_US(40); // Give the controller some time: 20 is bad, 30 is OK, 40 is safe
|
|
||||||
}
|
|
||||||
|
|
||||||
spiSend(val & 0xF0);
|
|
||||||
spiSend(val << 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
|
||||||
switch (msg) {
|
|
||||||
case U8G_COM_MSG_INIT:
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
|
||||||
u8g_Delay(5);
|
|
||||||
spiBegin();
|
|
||||||
spiInit(SPI_EIGHTH_SPEED); // ST7920 max speed is about 1.1 MHz
|
|
||||||
u8g->pin_list[U8G_PI_A0_STATE] = 0; // initial RS state: command mode
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_STOP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_RESET:
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1)
|
|
||||||
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_CHIP_SELECT:
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); // Note: the ST7920 has an active high chip-select
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_BYTE:
|
|
||||||
u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ: {
|
|
||||||
uint8_t *ptr = (uint8_t*) arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ_P: {
|
|
||||||
uint8_t *ptr = (uint8_t*) arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on u8g_com_st7920_hw_spi.c
|
|
||||||
*
|
|
||||||
* Universal 8bit Graphics Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011, olikraus@gmail.com
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer in the documentation and/or other
|
|
||||||
* materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if IS_U8GLIB_ST7920
|
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
|
||||||
#include "../SoftwareSPI.h"
|
|
||||||
#include "../../shared/Delay.h"
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#ifndef LCD_SPI_SPEED
|
|
||||||
#define LCD_SPI_SPEED SPI_EIGHTH_SPEED // About 1 MHz
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static pin_t SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL;
|
|
||||||
static uint8_t SPI_speed = 0;
|
|
||||||
|
|
||||||
static void u8g_com_LPC1768_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
|
|
||||||
static uint8_t rs_last_state = 255;
|
|
||||||
if (rs != rs_last_state) {
|
|
||||||
// Transfer Data (FA) or Command (F8)
|
|
||||||
swSpiTransfer(rs ? 0x0FA : 0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
|
||||||
rs_last_state = rs;
|
|
||||||
DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe
|
|
||||||
}
|
|
||||||
swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
|
||||||
swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
|
||||||
switch (msg) {
|
|
||||||
case U8G_COM_MSG_INIT:
|
|
||||||
SCK_pin_ST7920_HAL = u8g->pin_list[U8G_PI_SCK];
|
|
||||||
MOSI_pin_ST7920_HAL_HAL = u8g->pin_list[U8G_PI_MOSI];
|
|
||||||
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_SCK);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_MOSI);
|
|
||||||
u8g_Delay(5);
|
|
||||||
|
|
||||||
SPI_speed = swSpiInit(LCD_SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL);
|
|
||||||
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_SCK, 0);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_MOSI, 0);
|
|
||||||
|
|
||||||
u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: command mode */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_STOP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_RESET:
|
|
||||||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
|
||||||
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_CHIP_SELECT:
|
|
||||||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_BYTE:
|
|
||||||
u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ: {
|
|
||||||
uint8_t *ptr = (uint8_t*) arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ_P: {
|
|
||||||
uint8_t *ptr = (uint8_t*) arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // IS_U8GLIB_ST7920
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -1,209 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on u8g_com_std_sw_spi.c
|
|
||||||
*
|
|
||||||
* Universal 8bit Graphics Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015, olikraus@gmail.com
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright notice, this list
|
|
||||||
* of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer in the documentation and/or other
|
|
||||||
* materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TARGET_LPC4078
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
|
|
||||||
|
|
||||||
#include <SoftwareSPI.h>
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#ifndef LCD_SPI_SPEED
|
|
||||||
#define LCD_SPI_SPEED SPI_QUARTER_SPEED // About 2 MHz
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <LPC17xx.h>
|
|
||||||
#include <gpio.h>
|
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
|
||||||
|
|
||||||
uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
|
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
|
||||||
if (spi_speed == 0) {
|
|
||||||
LPC176x::gpio_set(mosi_pin, !!(b & 0x80));
|
|
||||||
LPC176x::gpio_set(sck_pin, HIGH);
|
|
||||||
b <<= 1;
|
|
||||||
if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1;
|
|
||||||
LPC176x::gpio_set(sck_pin, LOW);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
|
||||||
LOOP_L_N(j, spi_speed)
|
|
||||||
LPC176x::gpio_set(mosi_pin, state);
|
|
||||||
|
|
||||||
LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1))
|
|
||||||
LPC176x::gpio_set(sck_pin, HIGH);
|
|
||||||
|
|
||||||
b <<= 1;
|
|
||||||
if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1;
|
|
||||||
|
|
||||||
LOOP_L_N(j, spi_speed)
|
|
||||||
LPC176x::gpio_set(sck_pin, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) {
|
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
|
||||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
|
||||||
if (spi_speed == 0) {
|
|
||||||
LPC176x::gpio_set(sck_pin, LOW);
|
|
||||||
LPC176x::gpio_set(mosi_pin, state);
|
|
||||||
LPC176x::gpio_set(mosi_pin, state); // need some setup time
|
|
||||||
LPC176x::gpio_set(sck_pin, HIGH);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1))
|
|
||||||
LPC176x::gpio_set(sck_pin, LOW);
|
|
||||||
|
|
||||||
LOOP_L_N(j, spi_speed)
|
|
||||||
LPC176x::gpio_set(mosi_pin, state);
|
|
||||||
|
|
||||||
LOOP_L_N(j, spi_speed)
|
|
||||||
LPC176x::gpio_set(sck_pin, HIGH);
|
|
||||||
}
|
|
||||||
b <<= 1;
|
|
||||||
if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t SPI_speed = 0;
|
|
||||||
|
|
||||||
static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) {
|
|
||||||
#if ANY(FYSETC_MINI_12864, MKS_MINI_12864)
|
|
||||||
swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin);
|
|
||||||
#else
|
|
||||||
swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
|
||||||
switch (msg) {
|
|
||||||
case U8G_COM_MSG_INIT:
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_SCK);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_MOSI);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_CS);
|
|
||||||
u8g_SetPIOutput(u8g, U8G_PI_A0);
|
|
||||||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET);
|
|
||||||
SPI_speed = swSpiInit(LCD_SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_SCK, 0);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_MOSI, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_STOP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_RESET:
|
|
||||||
if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_CHIP_SELECT:
|
|
||||||
#if ANY(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
|
|
||||||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
|
||||||
// the next chip select goes active
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, LOW);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, HIGH);
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_CS, !arg_val);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_BYTE:
|
|
||||||
u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ: {
|
|
||||||
uint8_t *ptr = (uint8_t *)arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++);
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ_P: {
|
|
||||||
uint8_t *ptr = (uint8_t *)arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr));
|
|
||||||
ptr++;
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
|
||||||
u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
|
|
||||||
#endif // TARGET_LPC4078
|
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
void serialEvent2() __attribute__((weak));
|
void serialEvent2() __attribute__((weak));
|
||||||
#endif
|
#endif
|
||||||
#ifdef USING_HW_SERIAL3
|
#ifdef USING_HW_SERIAL3
|
||||||
HAL_HardwareSerial HSerial3(USART3);
|
HAL_HardwareSerial Serial3(USART3);
|
||||||
void serialEvent3() __attribute__((weak));
|
void serialEvent3() __attribute__((weak));
|
||||||
#endif
|
#endif
|
||||||
#ifdef USING_HW_SERIAL4
|
#ifdef USING_HW_SERIAL4
|
||||||
@@ -147,11 +147,11 @@
|
|||||||
#endif
|
#endif
|
||||||
#ifdef USING_HW_SERIAL6
|
#ifdef USING_HW_SERIAL6
|
||||||
#ifdef USART6
|
#ifdef USART6
|
||||||
HAL_HardwareSerial HSerial6(USART6);
|
HAL_HardwareSerial HSerial5(USART6);
|
||||||
#else
|
#else
|
||||||
HAL_HardwareSerial HSerial6(UART6);
|
HAL_HardwareSerial HSerial5(UART6);
|
||||||
#endif
|
#endif
|
||||||
void serialEvent6() __attribute__((weak));
|
void serialEvent5() __attribute__((weak));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Constructors ////////////////////////////////////////////////////////////////
|
// Constructors ////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -53,7 +53,6 @@
|
|||||||
inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
|
inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
|
||||||
|
|
||||||
void _rx_complete_irq(serial_t *obj);
|
void _rx_complete_irq(serial_t *obj);
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return 0; } // Not implemented. Void to avoid platform-dependent code.
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
usart_rx_callback_t _rx_callback;
|
usart_rx_callback_t _rx_callback;
|
||||||
|
|||||||
@@ -58,9 +58,8 @@
|
|||||||
* Check for common serial pin conflicts
|
* Check for common serial pin conflicts
|
||||||
*/
|
*/
|
||||||
#define _CHECK_SERIAL_PIN(N) (( \
|
#define _CHECK_SERIAL_PIN(N) (( \
|
||||||
BTN_EN1 == N || BTN_EN2 == N ||DOGLCD_CS == N || HEATER_BED_PIN == N || FAN0_PIN == N || \
|
BTN_EN1 == N || DOGLCD_CS == N || HEATER_BED_PIN == N || FAN0_PIN == N || \
|
||||||
SDIO_D2_PIN == N || SDIO_D3_PIN == N || SDIO_CK_PIN == N || SDIO_CMD_PIN == N || \
|
SDIO_D2_PIN == N || SDIO_D3_PIN == N || SDIO_CK_PIN == N || SDIO_CMD_PIN == N \
|
||||||
Y_STEP_PIN == N || Y_ENABLE_PIN == N || E0_ENABLE_PIN == N || POWER_LOSS_PIN == N \
|
|
||||||
))
|
))
|
||||||
#define CHECK_SERIAL_PIN(T,N) defined(UART##N##_##T##_PIN) && _CHECK_SERIAL_PIN(UART##N##_##T##_PIN)
|
#define CHECK_SERIAL_PIN(T,N) defined(UART##N##_##T##_PIN) && _CHECK_SERIAL_PIN(UART##N##_##T##_PIN)
|
||||||
#if SERIAL_IN_USE(1)
|
#if SERIAL_IN_USE(1)
|
||||||
|
|||||||
@@ -37,61 +37,50 @@ LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD;
|
|||||||
|
|
||||||
void TFT_FSMC::init() {
|
void TFT_FSMC::init() {
|
||||||
uint32_t controllerAddress;
|
uint32_t controllerAddress;
|
||||||
FMC_OR_FSMC(NORSRAM_TimingTypeDef) timing, extTiming;
|
FSMC_NORSRAM_TimingTypeDef timing, extTiming;
|
||||||
|
|
||||||
uint32_t nsBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), pinMap_FSMC_CS);
|
uint32_t nsBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), pinMap_FSMC_CS);
|
||||||
|
|
||||||
// Perform the SRAM1 memory initialization sequence
|
// Perform the SRAM1 memory initialization sequence
|
||||||
SRAMx.Instance = FMC_OR_FSMC(NORSRAM_DEVICE);
|
SRAMx.Instance = FSMC_NORSRAM_DEVICE;
|
||||||
SRAMx.Extended = FMC_OR_FSMC(NORSRAM_EXTENDED_DEVICE);
|
SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
|
||||||
|
|
||||||
// SRAMx.Init
|
// SRAMx.Init
|
||||||
SRAMx.Init.NSBank = nsBank;
|
SRAMx.Init.NSBank = nsBank;
|
||||||
SRAMx.Init.DataAddressMux = FMC_OR_FSMC(DATA_ADDRESS_MUX_DISABLE);
|
SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
|
||||||
SRAMx.Init.MemoryType = FMC_OR_FSMC(MEMORY_TYPE_SRAM);
|
SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
|
||||||
#ifdef STM32F446xx
|
SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
|
||||||
SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FMC_8BIT, FMC_NORSRAM_MEM_BUS_WIDTH_8, FMC_NORSRAM_MEM_BUS_WIDTH_16);
|
SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
|
||||||
#else
|
SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
|
||||||
SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16);
|
SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
|
||||||
|
SRAMx.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
|
||||||
|
SRAMx.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
|
||||||
|
SRAMx.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
|
||||||
|
SRAMx.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
|
||||||
|
SRAMx.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
|
||||||
|
SRAMx.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
|
||||||
|
#ifdef STM32F4xx
|
||||||
|
SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE;
|
||||||
#endif
|
#endif
|
||||||
SRAMx.Init.BurstAccessMode = FMC_OR_FSMC(BURST_ACCESS_MODE_DISABLE);
|
|
||||||
SRAMx.Init.WaitSignalPolarity = FMC_OR_FSMC(WAIT_SIGNAL_POLARITY_LOW);
|
|
||||||
SRAMx.Init.WrapMode = FMC_OR_FSMC(WRAP_MODE_DISABLE);
|
|
||||||
SRAMx.Init.WaitSignalActive = FMC_OR_FSMC(WAIT_TIMING_BEFORE_WS);
|
|
||||||
SRAMx.Init.WriteOperation = FMC_OR_FSMC(WRITE_OPERATION_ENABLE);
|
|
||||||
SRAMx.Init.WaitSignal = FMC_OR_FSMC(WAIT_SIGNAL_DISABLE);
|
|
||||||
SRAMx.Init.ExtendedMode = FMC_OR_FSMC(EXTENDED_MODE_ENABLE);
|
|
||||||
SRAMx.Init.AsynchronousWait = FMC_OR_FSMC(ASYNCHRONOUS_WAIT_DISABLE);
|
|
||||||
SRAMx.Init.WriteBurst = FMC_OR_FSMC(WRITE_BURST_DISABLE);
|
|
||||||
#if defined(STM32F446xx) || defined(STM32F4xx)
|
|
||||||
SRAMx.Init.PageSize = FMC_OR_FSMC(PAGE_SIZE_NONE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Read Timing - relatively slow to ensure ID information is correctly read from TFT controller
|
// Read Timing - relatively slow to ensure ID information is correctly read from TFT controller
|
||||||
// Can be decreased from 15-15-24 to 4-4-8 with risk of stability loss
|
// Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss
|
||||||
timing.AddressSetupTime = 15;
|
timing.AddressSetupTime = 15;
|
||||||
timing.AddressHoldTime = 15;
|
timing.AddressHoldTime = 15;
|
||||||
timing.DataSetupTime = 24;
|
timing.DataSetupTime = 24;
|
||||||
timing.BusTurnAroundDuration = 0;
|
timing.BusTurnAroundDuration = 0;
|
||||||
timing.CLKDivision = 16;
|
timing.CLKDivision = 16;
|
||||||
timing.DataLatency = 17;
|
timing.DataLatency = 17;
|
||||||
timing.AccessMode = FMC_OR_FSMC(ACCESS_MODE_A);
|
timing.AccessMode = FSMC_ACCESS_MODE_A;
|
||||||
|
|
||||||
// Write Timing
|
// Write Timing
|
||||||
// Can be decreased from 8-15-8 to 0-0-1 with risk of stability loss
|
// Can be decreased from 8-15-8 to 0-0-1 with risk of stability loss
|
||||||
extTiming.AddressSetupTime = 8;
|
extTiming.AddressSetupTime = 8;
|
||||||
extTiming.AddressHoldTime = 15;
|
extTiming.AddressHoldTime = 15;
|
||||||
extTiming.DataSetupTime = 8;
|
extTiming.DataSetupTime = 8;
|
||||||
extTiming.BusTurnAroundDuration = 0;
|
extTiming.BusTurnAroundDuration = 0;
|
||||||
extTiming.CLKDivision = 16;
|
extTiming.CLKDivision = 16;
|
||||||
extTiming.DataLatency = 17;
|
extTiming.DataLatency = 17;
|
||||||
extTiming.AccessMode = FMC_OR_FSMC(ACCESS_MODE_A);
|
extTiming.AccessMode = FSMC_ACCESS_MODE_A;
|
||||||
|
|
||||||
#ifdef STM32F446xx
|
__HAL_RCC_FSMC_CLK_ENABLE();
|
||||||
__HAL_RCC_FMC_CLK_ENABLE();
|
|
||||||
#else
|
|
||||||
__HAL_RCC_FSMC_CLK_ENABLE();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (uint16_t i = 0; pinMap_FSMC[i].pin != NC; i++)
|
for (uint16_t i = 0; pinMap_FSMC[i].pin != NC; i++)
|
||||||
pinmap_pinout(pinMap_FSMC[i].pin, pinMap_FSMC);
|
pinmap_pinout(pinMap_FSMC[i].pin, pinMap_FSMC);
|
||||||
@@ -101,9 +90,9 @@ void TFT_FSMC::init() {
|
|||||||
controllerAddress = FSMC_BANK1_1;
|
controllerAddress = FSMC_BANK1_1;
|
||||||
#ifdef PF0
|
#ifdef PF0
|
||||||
switch (nsBank) {
|
switch (nsBank) {
|
||||||
case FMC_OR_FSMC(NORSRAM_BANK2): controllerAddress = FSMC_BANK1_2; break;
|
case FSMC_NORSRAM_BANK2: controllerAddress = FSMC_BANK1_2 ; break;
|
||||||
case FMC_OR_FSMC(NORSRAM_BANK3): controllerAddress = FSMC_BANK1_3; break;
|
case FSMC_NORSRAM_BANK3: controllerAddress = FSMC_BANK1_3 ; break;
|
||||||
case FMC_OR_FSMC(NORSRAM_BANK4): controllerAddress = FSMC_BANK1_4; break;
|
case FSMC_NORSRAM_BANK4: controllerAddress = FSMC_BANK1_4 ; break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -111,44 +100,49 @@ void TFT_FSMC::init() {
|
|||||||
|
|
||||||
HAL_SRAM_Init(&SRAMx, &timing, &extTiming);
|
HAL_SRAM_Init(&SRAMx, &timing, &extTiming);
|
||||||
|
|
||||||
__HAL_RCC_DMA2_CLK_ENABLE();
|
|
||||||
|
|
||||||
#ifdef STM32F1xx
|
#ifdef STM32F1xx
|
||||||
DMAtx.Instance = DMA2_Channel1;
|
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||||
|
DMAtx.Instance = DMA1_Channel1;
|
||||||
#elif defined(STM32F4xx)
|
#elif defined(STM32F4xx)
|
||||||
DMAtx.Instance = DMA2_Stream0;
|
__HAL_RCC_DMA2_CLK_ENABLE();
|
||||||
DMAtx.Init.Channel = DMA_CHANNEL_0;
|
DMAtx.Instance = DMA2_Stream0;
|
||||||
DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
DMAtx.Init.Channel = DMA_CHANNEL_0;
|
||||||
DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
||||||
DMAtx.Init.MemBurst = DMA_MBURST_SINGLE;
|
DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
||||||
DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE;
|
DMAtx.Init.MemBurst = DMA_MBURST_SINGLE;
|
||||||
|
DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY;
|
DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY;
|
||||||
DMAtx.Init.MemInc = DMA_MINC_DISABLE;
|
DMAtx.Init.MemInc = DMA_MINC_DISABLE;
|
||||||
DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||||
DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||||
DMAtx.Init.Mode = DMA_NORMAL;
|
DMAtx.Init.Mode = DMA_NORMAL;
|
||||||
DMAtx.Init.Priority = DMA_PRIORITY_HIGH;
|
DMAtx.Init.Priority = DMA_PRIORITY_HIGH;
|
||||||
|
|
||||||
LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress;
|
LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t TFT_FSMC::getID() {
|
uint32_t TFT_FSMC::getID() {
|
||||||
|
uint32_t id;
|
||||||
writeReg(0);
|
writeReg(0);
|
||||||
uint32_t id = LCD->RAM;
|
id = LCD->RAM;
|
||||||
if (id == 0) id = readID(LCD_READ_ID);
|
|
||||||
if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) id = readID(LCD_READ_ID4);
|
if (id == 0)
|
||||||
|
id = readID(LCD_READ_ID);
|
||||||
|
if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF)
|
||||||
|
id = readID(LCD_READ_ID4);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t TFT_FSMC::readID(tft_data_t inReg) {
|
uint32_t TFT_FSMC::readID(const tft_data_t inReg) {
|
||||||
|
uint32_t id;
|
||||||
writeReg(inReg);
|
writeReg(inReg);
|
||||||
uint32_t id = LCD->RAM; // dummy read
|
id = LCD->RAM; // dummy read
|
||||||
id = inReg << 24;
|
id = inReg << 24;
|
||||||
id |= (LCD->RAM & 0x00FF) << 16;
|
id |= (LCD->RAM & 0x00FF) << 16;
|
||||||
id |= (LCD->RAM & 0x00FF) << 8;
|
id |= (LCD->RAM & 0x00FF) << 8;
|
||||||
id |= (LCD->RAM & 0x00FF);
|
id |= LCD->RAM & 0x00FF;
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,9 +155,7 @@ bool TFT_FSMC::isBusy() {
|
|||||||
#define __IS_DMA_CONFIGURED(__HANDLE__) ((__HANDLE__)->Instance->PAR != 0)
|
#define __IS_DMA_CONFIGURED(__HANDLE__) ((__HANDLE__)->Instance->PAR != 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __IS_DMA_CONFIGURED
|
if (!__IS_DMA_CONFIGURED(&DMAtx)) return false;
|
||||||
if (!__IS_DMA_CONFIGURED(&DMAtx)) return false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Check if DMA transfer error or transfer complete flags are set
|
// Check if DMA transfer error or transfer complete flags are set
|
||||||
if ((__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) == 0) && (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) == 0)) return true;
|
if ((__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) == 0) && (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) == 0)) return true;
|
||||||
@@ -182,6 +174,8 @@ void TFT_FSMC::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t cou
|
|||||||
DMAtx.Init.PeriphInc = memoryIncrease;
|
DMAtx.Init.PeriphInc = memoryIncrease;
|
||||||
HAL_DMA_Init(&DMAtx);
|
HAL_DMA_Init(&DMAtx);
|
||||||
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(LCD->RAM), count);
|
HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(LCD->RAM), count);
|
||||||
|
|
||||||
|
TERN_(TFT_SHARED_IO, while (isBusy()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TFT_FSMC::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
|
void TFT_FSMC::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
|
||||||
|
|||||||
@@ -28,7 +28,11 @@
|
|||||||
#elif defined(STM32F4xx)
|
#elif defined(STM32F4xx)
|
||||||
#include "stm32f4xx_hal.h"
|
#include "stm32f4xx_hal.h"
|
||||||
#else
|
#else
|
||||||
#error "FSMC/FMC TFT is currently only supported on STM32F1 and STM32F4 hardware."
|
#error "FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAL_SRAM_MODULE_ENABLED
|
||||||
|
#error "SRAM module disabled for the STM32 framework (HAL_SRAM_MODULE_ENABLED)! Please consult the development team."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LCD_READ_ID
|
#ifndef LCD_READ_ID
|
||||||
@@ -51,12 +55,6 @@ typedef struct {
|
|||||||
__IO tft_data_t RAM;
|
__IO tft_data_t RAM;
|
||||||
} LCD_CONTROLLER_TypeDef;
|
} LCD_CONTROLLER_TypeDef;
|
||||||
|
|
||||||
#ifdef STM32F446xx
|
|
||||||
#define FMC_OR_FSMC(N) _CAT(FMC_, N)
|
|
||||||
#else
|
|
||||||
#define FMC_OR_FSMC(N) _CAT(FSMC_, N)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class TFT_FSMC {
|
class TFT_FSMC {
|
||||||
private:
|
private:
|
||||||
static SRAM_HandleTypeDef SRAMx;
|
static SRAM_HandleTypeDef SRAMx;
|
||||||
@@ -64,7 +62,7 @@ class TFT_FSMC {
|
|||||||
|
|
||||||
static LCD_CONTROLLER_TypeDef *LCD;
|
static LCD_CONTROLLER_TypeDef *LCD;
|
||||||
|
|
||||||
static uint32_t readID(tft_data_t inReg);
|
static uint32_t readID(const tft_data_t reg);
|
||||||
static void transmit(tft_data_t data) { LCD->RAM = data; __DSB(); }
|
static void transmit(tft_data_t data) { LCD->RAM = data; __DSB(); }
|
||||||
static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
|
static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
|
||||||
static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
|
static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count);
|
||||||
@@ -96,11 +94,7 @@ class TFT_FSMC {
|
|||||||
#ifdef STM32F1xx
|
#ifdef STM32F1xx
|
||||||
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)
|
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)
|
||||||
#elif defined(STM32F4xx)
|
#elif defined(STM32F4xx)
|
||||||
#ifdef STM32F446xx
|
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC)
|
||||||
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FMC)
|
|
||||||
#else
|
|
||||||
#define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC)
|
|
||||||
#endif
|
|
||||||
#define FSMC_BANK1_1 0x60000000U
|
#define FSMC_BANK1_1 0x60000000U
|
||||||
#define FSMC_BANK1_2 0x64000000U
|
#define FSMC_BANK1_2 0x64000000U
|
||||||
#define FSMC_BANK1_3 0x68000000U
|
#define FSMC_BANK1_3 0x68000000U
|
||||||
@@ -110,35 +104,35 @@ class TFT_FSMC {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
const PinMap pinMap_FSMC[] = {
|
const PinMap pinMap_FSMC[] = {
|
||||||
{PD_14, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D00
|
{PD_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D00
|
||||||
{PD_15, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D01
|
{PD_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D01
|
||||||
{PD_0, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D02
|
{PD_0, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D02
|
||||||
{PD_1, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D03
|
{PD_1, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D03
|
||||||
{PE_7, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D04
|
{PE_7, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D04
|
||||||
{PE_8, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D05
|
{PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05
|
||||||
{PE_9, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D06
|
{PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06
|
||||||
{PE_10, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D07
|
{PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07
|
||||||
#if DISABLED(TFT_INTERFACE_FSMC_8BIT)
|
#if DISABLED(TFT_INTERFACE_FSMC_8BIT)
|
||||||
{PE_11, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D08
|
{PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08
|
||||||
{PE_12, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D09
|
{PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09
|
||||||
{PE_13, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D10
|
{PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10
|
||||||
{PE_14, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D11
|
{PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11
|
||||||
{PE_15, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D12
|
{PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12
|
||||||
{PD_8, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D13
|
{PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13
|
||||||
{PD_9, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D14
|
{PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14
|
||||||
{PD_10, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_D15
|
{PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15
|
||||||
#endif
|
#endif
|
||||||
{PD_4, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_NOE
|
{PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE
|
||||||
{PD_5, FMC_OR_FSMC(NORSRAM_DEVICE), FSMC_PIN_DATA}, // FSMC_NWE
|
{PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE
|
||||||
{NC, NP, 0}
|
{NC, NP, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
const PinMap pinMap_FSMC_CS[] = {
|
const PinMap pinMap_FSMC_CS[] = {
|
||||||
{PD_7, (void *)FMC_OR_FSMC(NORSRAM_BANK1), FSMC_PIN_DATA}, // FSMC_NE1
|
{PD_7, (void *)FSMC_NORSRAM_BANK1, FSMC_PIN_DATA}, // FSMC_NE1
|
||||||
#ifdef PF0
|
#ifdef PF0
|
||||||
{PG_9, (void *)FMC_OR_FSMC(NORSRAM_BANK2), FSMC_PIN_DATA}, // FSMC_NE2
|
{PG_9, (void *)FSMC_NORSRAM_BANK2, FSMC_PIN_DATA}, // FSMC_NE2
|
||||||
{PG_10, (void *)FMC_OR_FSMC(NORSRAM_BANK3), FSMC_PIN_DATA}, // FSMC_NE3
|
{PG_10, (void *)FSMC_NORSRAM_BANK3, FSMC_PIN_DATA}, // FSMC_NE3
|
||||||
{PG_12, (void *)FMC_OR_FSMC(NORSRAM_BANK4), FSMC_PIN_DATA}, // FSMC_NE4
|
{PG_12, (void *)FSMC_NORSRAM_BANK4, FSMC_PIN_DATA}, // FSMC_NE4
|
||||||
#endif
|
#endif
|
||||||
{NC, NP, 0}
|
{NC, NP, 0}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ typedef uint32_t hal_timer_t;
|
|||||||
#define FTM0_TIMER_PRESCALE_BITS 0b011
|
#define FTM0_TIMER_PRESCALE_BITS 0b011
|
||||||
#define FTM1_TIMER_PRESCALE_BITS 0b010
|
#define FTM1_TIMER_PRESCALE_BITS 0b010
|
||||||
|
|
||||||
#define FTM0_TIMER_RATE (F_BUS / (FTM0_TIMER_PRESCALE)) // 60MHz / 8 = 7.5MHz
|
#define FTM0_TIMER_RATE (F_BUS / (FTM0_TIMER_PRESCALE)) // 60MHz / 8 = 7500kHz
|
||||||
#define FTM1_TIMER_RATE (F_BUS / (FTM1_TIMER_PRESCALE)) // 60MHz / 4 = 15MHz
|
#define FTM1_TIMER_RATE (F_BUS / (FTM1_TIMER_PRESCALE)) // 60MHz / 4 = 15MHz
|
||||||
|
|
||||||
#define HAL_TIMER_RATE (FTM0_TIMER_RATE)
|
#define HAL_TIMER_RATE (FTM0_TIMER_RATE)
|
||||||
|
|||||||
@@ -37,8 +37,6 @@
|
|||||||
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC1768/NAME)
|
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC1768/NAME)
|
||||||
#elif defined(ARDUINO_ARCH_HC32)
|
#elif defined(ARDUINO_ARCH_HC32)
|
||||||
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/HC32/NAME)
|
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/HC32/NAME)
|
||||||
#elif defined(TARGET_LPC4078)
|
|
||||||
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC4078/NAME)
|
|
||||||
#elif defined(__STM32F1__) || defined(TARGET_STM32F1)
|
#elif defined(__STM32F1__) || defined(TARGET_STM32F1)
|
||||||
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32F1/NAME)
|
#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32F1/NAME)
|
||||||
#elif defined(ARDUINO_ARCH_STM32)
|
#elif defined(ARDUINO_ARCH_STM32)
|
||||||
|
|||||||
@@ -76,8 +76,6 @@
|
|||||||
#include "../LPC1768/Servo.h"
|
#include "../LPC1768/Servo.h"
|
||||||
#elif defined(ARDUINO_ARCH_HC32)
|
#elif defined(ARDUINO_ARCH_HC32)
|
||||||
#include "../HC32/Servo.h"
|
#include "../HC32/Servo.h"
|
||||||
#elif defined(TARGET_LPC4078)
|
|
||||||
#include "../LPC4078/Servo.h"
|
|
||||||
#elif defined(__STM32F1__) || defined(TARGET_STM32F1)
|
#elif defined(__STM32F1__) || defined(TARGET_STM32F1)
|
||||||
#include "../STM32F1/Servo.h"
|
#include "../STM32F1/Servo.h"
|
||||||
#elif defined(ARDUINO_ARCH_STM32)
|
#elif defined(ARDUINO_ARCH_STM32)
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
#include "lcd/e3v2/common/encoder.h"
|
#include "lcd/e3v2/common/encoder.h"
|
||||||
#if ENABLED(DWIN_CREALITY_LCD)
|
#if ENABLED(DWIN_CREALITY_LCD)
|
||||||
#include "lcd/e3v2/creality/dwin.h"
|
#include "lcd/e3v2/creality/dwin.h"
|
||||||
|
#elif ENABLED(DWIN_LCD_PROUI)
|
||||||
|
#include "lcd/e3v2/proui/dwin.h"
|
||||||
#elif ENABLED(DWIN_CREALITY_LCD_JYERSUI)
|
#elif ENABLED(DWIN_CREALITY_LCD_JYERSUI)
|
||||||
#include "lcd/e3v2/jyersui/dwin.h"
|
#include "lcd/e3v2/jyersui/dwin.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -266,7 +268,7 @@ PGMSTR(M112_KILL_STR, "M112 Shutdown");
|
|||||||
MarlinState marlin_state = MF_INITIALIZING;
|
MarlinState marlin_state = MF_INITIALIZING;
|
||||||
|
|
||||||
// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop
|
// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop
|
||||||
bool wait_for_heatup = false;
|
bool wait_for_heatup = true;
|
||||||
|
|
||||||
// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop
|
// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop
|
||||||
#if HAS_RESUME_CONTINUE
|
#if HAS_RESUME_CONTINUE
|
||||||
@@ -474,16 +476,11 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
|
|||||||
|
|
||||||
#if HAS_KILL
|
#if HAS_KILL
|
||||||
|
|
||||||
// Check if the kill button was pressed and wait to ensure the signal is not noise
|
// Check if the kill button was pressed and wait just in case it was an accidental
|
||||||
// typically caused by poor insulation and grounding on LCD cables.
|
// key kill key press
|
||||||
// Lower numbers here will increase response time and therefore safety rating.
|
|
||||||
// It is recommended to set this as low as possibe without false triggers.
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
#ifndef KILL_DELAY
|
|
||||||
#define KILL_DELAY 250
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int killCount = 0; // make the inactivity button a bit less responsive
|
static int killCount = 0; // make the inactivity button a bit less responsive
|
||||||
|
const int KILL_DELAY = 750;
|
||||||
if (kill_state())
|
if (kill_state())
|
||||||
killCount++;
|
killCount++;
|
||||||
else if (killCount > 0)
|
else if (killCount > 0)
|
||||||
@@ -674,12 +671,6 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
|
|||||||
|
|
||||||
TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check());
|
TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check());
|
||||||
|
|
||||||
#if ANY(PSU_CONTROL, AUTO_POWER_CONTROL) && PIN_EXISTS(PS_ON_EDM)
|
|
||||||
if ( ELAPSED(ms, powerManager.last_state_change_ms + PS_EDM_RESPONSE)
|
|
||||||
&& (READ(PS_ON_PIN) != READ(PS_ON_EDM_PIN) || TERN0(PSU_OFF_REDUNDANT, extDigitalRead(PS_ON1_PIN) != extDigitalRead(PS_ON1_EDM_PIN)))
|
|
||||||
) kill(GET_TEXT_F(MSG_POWER_EDM_FAULT));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(EXTRUDER_RUNOUT_PREVENT)
|
#if ENABLED(EXTRUDER_RUNOUT_PREVENT)
|
||||||
if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP)
|
if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP)
|
||||||
&& ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS))
|
&& ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS))
|
||||||
@@ -1597,11 +1588,11 @@ void setup() {
|
|||||||
SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n");
|
SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(DWIN_CREALITY_LCD)
|
#if HAS_DWIN_E3V2_BASIC
|
||||||
SETUP_RUN(dwinInitScreen());
|
SETUP_RUN(dwinInitScreen());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD)
|
#if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC
|
||||||
SETUP_RUN(ui.reset_status(true)); // Show service messages or keep current status
|
SETUP_RUN(ui.reset_status(true)); // Show service messages or keep current status
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,6 @@
|
|||||||
#define BOARD_PXMALION_CORE_I3 1164 // Pxmalion Core I3
|
#define BOARD_PXMALION_CORE_I3 1164 // Pxmalion Core I3
|
||||||
#define BOARD_PANOWIN_CUTLASS 1165 // Panowin Cutlass (as found in the Panowin F1)
|
#define BOARD_PANOWIN_CUTLASS 1165 // Panowin Cutlass (as found in the Panowin F1)
|
||||||
#define BOARD_KODAMA_BARDO 1166 // Kodama Bardo V1.x (as found in the Kodama Trinus)
|
#define BOARD_KODAMA_BARDO 1166 // Kodama Bardo V1.x (as found in the Kodama Trinus)
|
||||||
#define BOARD_DAGOMA_D6 1167 // Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// RAMBo and derivatives
|
// RAMBo and derivatives
|
||||||
@@ -383,9 +382,9 @@
|
|||||||
#define BOARD_CREALITY_V452 5050 // Creality v4.5.2 (STM32F103RC / STM32F103RE)
|
#define BOARD_CREALITY_V452 5050 // Creality v4.5.2 (STM32F103RC / STM32F103RE)
|
||||||
#define BOARD_CREALITY_V453 5051 // Creality v4.5.3 (STM32F103RC / STM32F103RE)
|
#define BOARD_CREALITY_V453 5051 // Creality v4.5.3 (STM32F103RC / STM32F103RE)
|
||||||
#define BOARD_CREALITY_V521 5052 // Creality v5.2.1 (STM32F103VE) as found in the SV04
|
#define BOARD_CREALITY_V521 5052 // Creality v5.2.1 (STM32F103VE) as found in the SV04
|
||||||
#define BOARD_CREALITY_V24S1 5053 // Creality v2.4.S1 (STM32F103RC / STM32F103RE) CR-FDM-v2.4.S1_v101 as found in the Ender-7
|
#define BOARD_CREALITY_V24S1 5053 // Creality v2.4.S1 (STM32F103RC / STM32F103RE) v101 as found in the Ender-7
|
||||||
#define BOARD_CREALITY_V24S1_301 5054 // Creality v2.4.S1_301 (STM32F103RC / STM32F103RE) CR-FDM-v24S1_301 as found in the Ender-3 S1
|
#define BOARD_CREALITY_V24S1_301 5054 // Creality v2.4.S1_301 (STM32F103RC / STM32F103RE) v301 as found in the Ender-3 S1
|
||||||
#define BOARD_CREALITY_V25S1 5055 // Creality v2.5.S1 (STM32F103RE) CR-FDM-v2.5.S1_100 as found in the CR-10 Smart Pro
|
#define BOARD_CREALITY_V25S1 5055 // Creality v2.5.S1 (STM32F103RE) as found in the CR-10 Smart Pro
|
||||||
#define BOARD_TRIGORILLA_PRO 5056 // Trigorilla Pro (STM32F103ZE)
|
#define BOARD_TRIGORILLA_PRO 5056 // Trigorilla Pro (STM32F103ZE)
|
||||||
#define BOARD_FLY_MINI 5057 // FLYmaker FLY MINI (STM32F103RC)
|
#define BOARD_FLY_MINI 5057 // FLYmaker FLY MINI (STM32F103RC)
|
||||||
#define BOARD_FLSUN_HISPEED 5058 // FLSUN HiSpeedV1 (STM32F103VE)
|
#define BOARD_FLSUN_HISPEED 5058 // FLSUN HiSpeedV1 (STM32F103VE)
|
||||||
@@ -410,7 +409,6 @@
|
|||||||
|
|
||||||
#define BOARD_TEENSY31_32 5100 // Teensy3.1 and Teensy3.2
|
#define BOARD_TEENSY31_32 5100 // Teensy3.1 and Teensy3.2
|
||||||
#define BOARD_TEENSY35_36 5101 // Teensy3.5 and Teensy3.6
|
#define BOARD_TEENSY35_36 5101 // Teensy3.5 and Teensy3.6
|
||||||
#define BOARD_EBAB 5102
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// STM32 ARM Cortex-M4F
|
// STM32 ARM Cortex-M4F
|
||||||
@@ -461,7 +459,7 @@
|
|||||||
#define BOARD_OPULO_LUMEN_REV4 5242 // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG)
|
#define BOARD_OPULO_LUMEN_REV4 5242 // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG)
|
||||||
#define BOARD_FYSETC_SPIDER_KING407 5243 // FYSETC Spider King407 (STM32F407ZG)
|
#define BOARD_FYSETC_SPIDER_KING407 5243 // FYSETC Spider King407 (STM32F407ZG)
|
||||||
#define BOARD_MKS_SKIPR_V1 5244 // MKS SKIPR v1.0 all-in-one board (STM32F407VE)
|
#define BOARD_MKS_SKIPR_V1 5244 // MKS SKIPR v1.0 all-in-one board (STM32F407VE)
|
||||||
#define BOARD_TRONXY_CXY_446_V10 5245 // TRONXY CXY-446-V10-220413/CXY-V6-191121 (STM32F446ZE)
|
#define BOARD_TRONXY_V10 5245 // TRONXY V10 (STM32F446ZE)
|
||||||
#define BOARD_CREALITY_F401RE 5246 // Creality CR4NS200141C13 (STM32F401RE) as found in the Ender-5 S1
|
#define BOARD_CREALITY_F401RE 5246 // Creality CR4NS200141C13 (STM32F401RE) as found in the Ender-5 S1
|
||||||
#define BOARD_BLACKPILL_CUSTOM 5247 // Custom board based on STM32F401CDU6.
|
#define BOARD_BLACKPILL_CUSTOM 5247 // Custom board based on STM32F401CDU6.
|
||||||
#define BOARD_I3DBEEZ9_V1 5248 // I3DBEEZ9 V1 (STM32F407ZG)
|
#define BOARD_I3DBEEZ9_V1 5248 // I3DBEEZ9 V1 (STM32F407ZG)
|
||||||
@@ -469,11 +467,6 @@
|
|||||||
#define BOARD_FYSETC_CHEETAH_V30 5250 // FYSETC Cheetah V3.0 (STM32F446RC)
|
#define BOARD_FYSETC_CHEETAH_V30 5250 // FYSETC Cheetah V3.0 (STM32F446RC)
|
||||||
#define BOARD_BLACKBEEZMINI_V1 5251 // BlackBeezMini V1 (STM32F401CCU6)
|
#define BOARD_BLACKBEEZMINI_V1 5251 // BlackBeezMini V1 (STM32F401CCU6)
|
||||||
|
|
||||||
//
|
|
||||||
// Other ARM Cortex-M4
|
|
||||||
//
|
|
||||||
#define BOARD_CREALITY_CR4NS 5300 // Creality CR4NS200320C13 (GD32F303RET6) as found in the Ender-3 V3 SE
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARM Cortex-M7
|
// ARM Cortex-M7
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -41,6 +41,8 @@
|
|||||||
#define _TMC2208_STANDALONE 0x2208B
|
#define _TMC2208_STANDALONE 0x2208B
|
||||||
#define _TMC2209 0x2209A
|
#define _TMC2209 0x2209A
|
||||||
#define _TMC2209_STANDALONE 0x2209B
|
#define _TMC2209_STANDALONE 0x2209B
|
||||||
|
#define _TMC26X 0x2600A
|
||||||
|
#define _TMC26X_STANDALONE 0x2600B
|
||||||
#define _TMC2660 0x2660A
|
#define _TMC2660 0x2660A
|
||||||
#define _TMC2660_STANDALONE 0x2660B
|
#define _TMC2660_STANDALONE 0x2660B
|
||||||
#define _TMC5130 0x5130A
|
#define _TMC5130 0x5130A
|
||||||
@@ -105,8 +107,8 @@
|
|||||||
|
|
||||||
#if ( HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \
|
#if ( HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \
|
||||||
|| HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \
|
|| HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \
|
||||||
|| HAS_DRIVER(TMC2660_STANDALONE) || HAS_DRIVER(TMC5130_STANDALONE) \
|
|| HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \
|
||||||
|| HAS_DRIVER(TMC5160_STANDALONE) )
|
|| HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) )
|
||||||
#define HAS_TRINAMIC_STANDALONE 1
|
#define HAS_TRINAMIC_STANDALONE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -123,13 +125,13 @@
|
|||||||
|| AXIS_DRIVER_TYPE(A,TMC2660) \
|
|| AXIS_DRIVER_TYPE(A,TMC2660) \
|
||||||
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
|
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
|
||||||
|
|
||||||
#define AXIS_IS_TMC_CONFIG AXIS_IS_TMC
|
#define AXIS_IS_TMC_CONFIG(A) ( AXIS_IS_TMC(A) || AXIS_DRIVER_TYPE(A,TMC26X) )
|
||||||
|
|
||||||
// Test for a driver that uses SPI - this allows checking whether a _CS_ pin
|
// Test for a driver that uses SPI - this allows checking whether a _CS_ pin
|
||||||
// is considered sensitive
|
// is considered sensitive
|
||||||
#define AXIS_HAS_SPI(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
|
#define AXIS_HAS_SPI(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
|
||||||
|| AXIS_DRIVER_TYPE(A,TMC2660) || AXIS_DRIVER_TYPE(A,TMC5130) \
|
|| AXIS_DRIVER_TYPE(A,TMC26X) || AXIS_DRIVER_TYPE(A,TMC2660) \
|
||||||
|| AXIS_DRIVER_TYPE(A,TMC5160) )
|
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
|
||||||
|
|
||||||
#define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) )
|
#define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) )
|
||||||
|
|
||||||
@@ -182,8 +184,10 @@
|
|||||||
#if ANY_AXIS_HAS(SPI)
|
#if ANY_AXIS_HAS(SPI)
|
||||||
#define HAS_TMC_SPI 1
|
#define HAS_TMC_SPI 1
|
||||||
#endif
|
#endif
|
||||||
#if HAS_STALLGUARD || HAS_DRIVER(TMC2160_STANDALONE) || HAS_DRIVER(TMC2130_STANDALONE) \
|
|
||||||
|| HAS_DRIVER(TMC2209_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \
|
//
|
||||||
|| HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE)
|
// TMC26XX Stepper Drivers
|
||||||
#define HAS_DIAG_PINS 1
|
//
|
||||||
|
#if HAS_DRIVER(TMC26X)
|
||||||
|
#define HAS_TMC26X 1
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -135,7 +135,6 @@
|
|||||||
#define STR_BUSY_PAUSED_FOR_USER "busy: paused for user"
|
#define STR_BUSY_PAUSED_FOR_USER "busy: paused for user"
|
||||||
#define STR_BUSY_PAUSED_FOR_INPUT "busy: paused for input"
|
#define STR_BUSY_PAUSED_FOR_INPUT "busy: paused for input"
|
||||||
#define STR_Z_MOVE_COMP "Z_move_comp"
|
#define STR_Z_MOVE_COMP "Z_move_comp"
|
||||||
#define STR_LINE_NO "Line: "
|
|
||||||
#define STR_RESEND "Resend: "
|
#define STR_RESEND "Resend: "
|
||||||
#define STR_UNKNOWN_COMMAND "Unknown command: \""
|
#define STR_UNKNOWN_COMMAND "Unknown command: \""
|
||||||
#define STR_ACTIVE_EXTRUDER "Active Extruder: "
|
#define STR_ACTIVE_EXTRUDER "Active Extruder: "
|
||||||
|
|||||||
@@ -89,8 +89,7 @@
|
|||||||
#define HYPOT2(x,y) (sq(x)+sq(y))
|
#define HYPOT2(x,y) (sq(x)+sq(y))
|
||||||
#define NORMSQ(x,y,z) (sq(x)+sq(y)+sq(z))
|
#define NORMSQ(x,y,z) (sq(x)+sq(y)+sq(z))
|
||||||
|
|
||||||
#define FLOAT_SQ(I) float(sq(I))
|
#define CIRCLE_AREA(R) (float(M_PI) * sq(float(R)))
|
||||||
#define CIRCLE_AREA(R) (float(M_PI) * FLOAT_SQ(R))
|
|
||||||
#define CIRCLE_CIRC(R) (2 * float(M_PI) * float(R))
|
#define CIRCLE_CIRC(R) (2 * float(M_PI) * float(R))
|
||||||
|
|
||||||
#define SIGN(a) ({__typeof__(a) _a = (a); (_a>0)-(_a<0);})
|
#define SIGN(a) ({__typeof__(a) _a = (a); (_a>0)-(_a<0);})
|
||||||
|
|||||||
@@ -143,13 +143,13 @@ public:
|
|||||||
|
|
||||||
// Set with format string and arguments, like printf
|
// Set with format string and arguments, like printf
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
MString& setf_P(PGM_P const pfmt, Args... more) { SNPRINTF_P(str, SIZE, pfmt, more...); debug(F("setf_P")); return *this; }
|
MString& setf_P(PGM_P const fmt, Args... more) { SNPRINTF_P(str, SIZE, fmt, more...); debug(F("setf_P")); return *this; }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
MString& setf(const char *fmt, Args... more) { SNPRINTF(str, SIZE, fmt, more...); debug(F("setf")); return *this; }
|
MString& setf(const char *fmt, Args... more) { SNPRINTF(str, SIZE, fmt, more...); debug(F("setf")); return *this; }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
MString& setf(FSTR_P const ffmt, Args... more) { return setf_P(FTOP(ffmt), more...); }
|
MString& setf(FSTR_P const fmt, Args... more) { return setf_P(FTOP(fmt), more...); }
|
||||||
|
|
||||||
// Chainable String appenders
|
// Chainable String appenders
|
||||||
MString& append() { debug(F("nil")); return *this; } // for macros that might emit no output
|
MString& append() { debug(F("nil")); return *this; } // for macros that might emit no output
|
||||||
@@ -206,9 +206,9 @@ public:
|
|||||||
MString& append(const spaces_t &s) { return append(repchr_t(' ', s.count)); }
|
MString& append(const spaces_t &s) { return append(repchr_t(' ', s.count)); }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
MString& appendf_P(PGM_P const pfmt, Args... more) {
|
MString& appendf_P(PGM_P const fmt, Args... more) {
|
||||||
int sz = length();
|
int sz = length();
|
||||||
if (sz < SIZE) SNPRINTF_P(str + sz, SIZE - sz, pfmt, more...);
|
if (sz < SIZE) SNPRINTF_P(str + sz, SIZE - sz, fmt, more...);
|
||||||
debug(F("appendf_P"));
|
debug(F("appendf_P"));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -271,13 +271,13 @@ public:
|
|||||||
SString& set() { super::set(); return *this; }
|
SString& set() { super::set(); return *this; }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
SString& setf_P(PGM_P const pfmt, Args... more) { super::setf_P(pfmt, more...); return *this; }
|
SString& setf_P(PGM_P const fmt, Args... more) { super::setf_P(fmt, more...); return *this; }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
SString& setf(const char *fmt, Args... more) { super::setf(fmt, more...); return *this; }
|
SString& setf(const char *fmt, Args... more) { super::setf(fmt, more...); return *this; }
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
SString& setf(FSTR_P const ffmt, Args... more) { super::setf(ffmt, more...); return *this; }
|
SString& setf(FSTR_P const fmt, Args... more) { super::setf(fmt, more...); return *this; }
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
SString& set(const T &v) { super::set(v); return *this; }
|
SString& set(const T &v) { super::set(v); return *this; }
|
||||||
|
|||||||
+7
-15
@@ -46,7 +46,6 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
|
|||||||
#define NUM_AXIS_ELEM(O) NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
|
#define NUM_AXIS_ELEM(O) NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
|
||||||
#define NUM_AXIS_DECL(T,V) NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
|
#define NUM_AXIS_DECL(T,V) NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
|
||||||
#define MAIN_AXIS_NAMES NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W)
|
#define MAIN_AXIS_NAMES NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W)
|
||||||
#define MAIN_AXIS_NAMES_LC NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)
|
|
||||||
#define STR_AXES_MAIN NUM_AXIS_GANG("X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
|
#define STR_AXES_MAIN NUM_AXIS_GANG("X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
|
||||||
|
|
||||||
#define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E)
|
#define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E)
|
||||||
@@ -59,21 +58,17 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
|
|||||||
#define LOGICAL_AXIS_ELEM(O) LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
|
#define LOGICAL_AXIS_ELEM(O) LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
|
||||||
#define LOGICAL_AXIS_DECL(T,V) LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
|
#define LOGICAL_AXIS_DECL(T,V) LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
|
||||||
#define LOGICAL_AXIS_NAMES LOGICAL_AXIS_LIST(E, X, Y, Z, I, J, K, U, V, W)
|
#define LOGICAL_AXIS_NAMES LOGICAL_AXIS_LIST(E, X, Y, Z, I, J, K, U, V, W)
|
||||||
#define LOGICAL_AXIS_NAMES_LC LOGICAL_AXIS_LIST(e, x, y, z, i, j, k, u, v, w)
|
|
||||||
#define LOGICAL_AXIS_MAP(F) MAP(F, LOGICAL_AXIS_NAMES)
|
#define LOGICAL_AXIS_MAP(F) MAP(F, LOGICAL_AXIS_NAMES)
|
||||||
#define LOGICAL_AXIS_MAP_LC(F) MAP(F, LOGICAL_AXIS_NAMES_LC)
|
|
||||||
#define STR_AXES_LOGICAL LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
|
#define STR_AXES_LOGICAL LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
|
||||||
|
|
||||||
#if NUM_AXES
|
#if NUM_AXES
|
||||||
#define NUM_AXES_SEP ,
|
#define NUM_AXES_SEP ,
|
||||||
#define MAIN_AXIS_MAP(F) MAP(F, MAIN_AXIS_NAMES)
|
#define MAIN_AXIS_MAP(F) MAP(F, MAIN_AXIS_NAMES)
|
||||||
#define MAIN_AXIS_MAP_LC(F) MAP(F, MAIN_AXIS_NAMES_LC)
|
|
||||||
#define OPTARGS_NUM(T) , NUM_AXIS_ARGS(T)
|
#define OPTARGS_NUM(T) , NUM_AXIS_ARGS(T)
|
||||||
#define OPTARGS_LOGICAL(T) , LOGICAL_AXIS_ARGS(T)
|
#define OPTARGS_LOGICAL(T) , LOGICAL_AXIS_ARGS(T)
|
||||||
#else
|
#else
|
||||||
#define NUM_AXES_SEP
|
#define NUM_AXES_SEP
|
||||||
#define MAIN_AXIS_MAP(F)
|
#define MAIN_AXIS_MAP(F)
|
||||||
#define MAIN_AXIS_MAP_LC(F)
|
|
||||||
#define OPTARGS_NUM(T)
|
#define OPTARGS_NUM(T)
|
||||||
#define OPTARGS_LOGICAL(T)
|
#define OPTARGS_LOGICAL(T)
|
||||||
#endif
|
#endif
|
||||||
@@ -84,7 +79,6 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
|
|||||||
#define NUM_AXIS_ARGS_(T) NUM_AXIS_ARGS(T) NUM_AXES_SEP
|
#define NUM_AXIS_ARGS_(T) NUM_AXIS_ARGS(T) NUM_AXES_SEP
|
||||||
#define NUM_AXIS_ELEM_(T) NUM_AXIS_ELEM(T) NUM_AXES_SEP
|
#define NUM_AXIS_ELEM_(T) NUM_AXIS_ELEM(T) NUM_AXES_SEP
|
||||||
#define MAIN_AXIS_NAMES_ MAIN_AXIS_NAMES NUM_AXES_SEP
|
#define MAIN_AXIS_NAMES_ MAIN_AXIS_NAMES NUM_AXES_SEP
|
||||||
#define MAIN_AXIS_NAMES_LC_ MAIN_AXIS_NAMES_LC NUM_AXES_SEP
|
|
||||||
|
|
||||||
#if LOGICAL_AXES
|
#if LOGICAL_AXES
|
||||||
#define LOGICAL_AXES_SEP ,
|
#define LOGICAL_AXES_SEP ,
|
||||||
@@ -98,7 +92,6 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
|
|||||||
#define LOGICAL_AXIS_ARGS_(T) LOGICAL_AXIS_ARGS(T) LOGICAL_AXES_SEP
|
#define LOGICAL_AXIS_ARGS_(T) LOGICAL_AXIS_ARGS(T) LOGICAL_AXES_SEP
|
||||||
#define LOGICAL_AXIS_ELEM_(T) LOGICAL_AXIS_ELEM(T) LOGICAL_AXES_SEP
|
#define LOGICAL_AXIS_ELEM_(T) LOGICAL_AXIS_ELEM(T) LOGICAL_AXES_SEP
|
||||||
#define LOGICAL_AXIS_NAMES_ LOGICAL_AXIS_NAMES LOGICAL_AXES_SEP
|
#define LOGICAL_AXIS_NAMES_ LOGICAL_AXIS_NAMES LOGICAL_AXES_SEP
|
||||||
#define LOGICAL_AXIS_NAMES_LC_ LOGICAL_AXIS_NAMES_LC LOGICAL_AXES_SEP
|
|
||||||
|
|
||||||
#define SECONDARY_AXIS_GANG(V...) GANG_N(SECONDARY_AXES, V)
|
#define SECONDARY_AXIS_GANG(V...) GANG_N(SECONDARY_AXES, V)
|
||||||
#define SECONDARY_AXIS_CODE(V...) CODE_N(SECONDARY_AXES, V)
|
#define SECONDARY_AXIS_CODE(V...) CODE_N(SECONDARY_AXES, V)
|
||||||
@@ -166,7 +159,7 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
|
|||||||
// General Flags for some number of states
|
// General Flags for some number of states
|
||||||
template<size_t N>
|
template<size_t N>
|
||||||
struct Flags {
|
struct Flags {
|
||||||
typedef bits_t(N) flagbits_t;
|
typedef uvalue_t(N) flagbits_t;
|
||||||
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } N8;
|
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; } N8;
|
||||||
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1; } N16;
|
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1; } N16;
|
||||||
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1,
|
typedef struct { bool b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1, b8:1, b9:1, b10:1, b11:1, b12:1, b13:1, b14:1, b15:1,
|
||||||
@@ -226,7 +219,7 @@ typedef struct {
|
|||||||
//
|
//
|
||||||
// - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space
|
// - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space
|
||||||
// - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians
|
// - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians
|
||||||
// - X_HEAD, Y_HEAD, and Z_HEAD should be used for axes on Core kinematics
|
// - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics
|
||||||
//
|
//
|
||||||
enum AxisEnum : uint8_t {
|
enum AxisEnum : uint8_t {
|
||||||
|
|
||||||
@@ -456,7 +449,7 @@ struct XYval {
|
|||||||
// Length reduced to one dimension
|
// Length reduced to one dimension
|
||||||
FI constexpr T magnitude() const { return (T)sqrtf(x*x + y*y); }
|
FI constexpr T magnitude() const { return (T)sqrtf(x*x + y*y); }
|
||||||
// Pointer to the data as a simple array
|
// Pointer to the data as a simple array
|
||||||
explicit FI operator T* () { return pos; }
|
FI operator T* () { return pos; }
|
||||||
// If any element is true then it's true
|
// If any element is true then it's true
|
||||||
FI constexpr operator bool() const { return x || y; }
|
FI constexpr operator bool() const { return x || y; }
|
||||||
// Smallest element
|
// Smallest element
|
||||||
@@ -606,13 +599,13 @@ struct XYZval {
|
|||||||
// Length reduced to one dimension
|
// Length reduced to one dimension
|
||||||
FI constexpr T magnitude() const { return (T)TERN(HAS_X_AXIS, sqrtf(NUM_AXIS_GANG(x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)), 0); }
|
FI constexpr T magnitude() const { return (T)TERN(HAS_X_AXIS, sqrtf(NUM_AXIS_GANG(x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)), 0); }
|
||||||
// Pointer to the data as a simple array
|
// Pointer to the data as a simple array
|
||||||
explicit FI operator T* () { return pos; }
|
FI operator T* () { return pos; }
|
||||||
// If any element is true then it's true
|
// If any element is true then it's true
|
||||||
FI constexpr operator bool() const { return 0 NUM_AXIS_GANG(|| x, || y, || z, || i, || j, || k, || u, || v, || w); }
|
FI constexpr operator bool() const { return 0 NUM_AXIS_GANG(|| x, || y, || z, || i, || j, || k, || u, || v, || w); }
|
||||||
// Smallest element
|
// Smallest element
|
||||||
FI constexpr T small() const { return TERN0(HAS_X_AXIS, _MIN(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w))); }
|
FI constexpr T small() const { return TERN(HAS_X_AXIS, _MIN(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)), 0); }
|
||||||
// Largest element
|
// Largest element
|
||||||
FI constexpr T large() const { return TERN0(HAS_X_AXIS, _MAX(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w))); }
|
FI constexpr T large() const { return TERN(HAS_X_AXIS, _MAX(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)), 0); }
|
||||||
|
|
||||||
// Explicit copy and copies with conversion
|
// Explicit copy and copies with conversion
|
||||||
FI constexpr XYZval<T> copy() const { XYZval<T> o = *this; return o; }
|
FI constexpr XYZval<T> copy() const { XYZval<T> o = *this; return o; }
|
||||||
@@ -754,7 +747,7 @@ struct XYZEval {
|
|||||||
// Length reduced to one dimension
|
// Length reduced to one dimension
|
||||||
FI constexpr T magnitude() const { return (T)sqrtf(LOGICAL_AXIS_GANG(+ e*e, + x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)); }
|
FI constexpr T magnitude() const { return (T)sqrtf(LOGICAL_AXIS_GANG(+ e*e, + x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)); }
|
||||||
// Pointer to the data as a simple array
|
// Pointer to the data as a simple array
|
||||||
explicit FI operator T* () { return pos; }
|
FI operator T* () { return pos; }
|
||||||
// If any element is true then it's true
|
// If any element is true then it's true
|
||||||
FI constexpr operator bool() const { return 0 LOGICAL_AXIS_GANG(|| e, || x, || y, || z, || i, || j, || k, || u, || v, || w); }
|
FI constexpr operator bool() const { return 0 LOGICAL_AXIS_GANG(|| e, || x, || y, || z, || i, || j, || k, || u, || v, || w); }
|
||||||
// Smallest element
|
// Smallest element
|
||||||
@@ -1091,7 +1084,6 @@ public:
|
|||||||
FI bool toggle(const AxisEnum n) { TBI(bits, n); return TEST(bits, n); }
|
FI bool toggle(const AxisEnum n) { TBI(bits, n); return TEST(bits, n); }
|
||||||
FI void bset(const AxisEnum n) { SBI(bits, n); }
|
FI void bset(const AxisEnum n) { SBI(bits, n); }
|
||||||
FI void bclr(const AxisEnum n) { CBI(bits, n); }
|
FI void bclr(const AxisEnum n) { CBI(bits, n); }
|
||||||
FI void bset(const AxisEnum n, const bool b) { if (b) bset(n); else bclr(n); }
|
|
||||||
|
|
||||||
// Accessor via an AxisEnum (or any integer) [index]
|
// Accessor via an AxisEnum (or any integer) [index]
|
||||||
FI bool operator[](const int n) const { return TEST(bits, n); }
|
FI bool operator[](const int n) const { return TEST(bits, n); }
|
||||||
|
|||||||
@@ -46,16 +46,10 @@ BDS_Leveling bdl;
|
|||||||
#define DEBUG_OUT ENABLED(DEBUG_OUT_BD)
|
#define DEBUG_OUT ENABLED(DEBUG_OUT_BD)
|
||||||
#include "../../../core/debug_out.h"
|
#include "../../../core/debug_out.h"
|
||||||
|
|
||||||
/**
|
// M102 S-5 Read raw Calibrate data
|
||||||
* M102 S<#> : Set adjustable Z height in 0.1mm units (10ths of a mm)
|
// M102 S-6 Start Calibrate
|
||||||
* (e.g., 'M102 S4' enables adjusting for Z <= 0.4mm)
|
// M102 S4 Set the adjustable Z height value (e.g., 'M102 S4' means it will do adjusting while the Z height <= 0.4mm , disable with 'M102 S0'.)
|
||||||
* M102 S0 : Disable adjustable Z height
|
// M102 S-1 Read sensor information
|
||||||
*
|
|
||||||
* M102 S-1 : Read BDsensor version
|
|
||||||
* M102 S-2 : Read BDsensor distance value
|
|
||||||
* M102 S-5 : Read raw Calibration data
|
|
||||||
* M102 S-6 : Start Calibration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MAX_BD_HEIGHT 4.0f
|
#define MAX_BD_HEIGHT 4.0f
|
||||||
#define CMD_READ_VERSION 1016
|
#define CMD_READ_VERSION 1016
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
*/
|
*/
|
||||||
void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) {
|
void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) {
|
||||||
// Get current and destination cells for this line
|
// Get current and destination cells for this line
|
||||||
xy_uint8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination);
|
xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination);
|
||||||
NOMORE(scel.x, GRID_MAX_CELLS_X - 1);
|
NOMORE(scel.x, GRID_MAX_CELLS_X - 1);
|
||||||
NOMORE(scel.y, GRID_MAX_CELLS_Y - 1);
|
NOMORE(scel.y, GRID_MAX_CELLS_Y - 1);
|
||||||
NOMORE(ecel.x, GRID_MAX_CELLS_X - 1);
|
NOMORE(ecel.x, GRID_MAX_CELLS_X - 1);
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
|
|
||||||
float normalized_dist;
|
float normalized_dist;
|
||||||
xyze_pos_t dest;
|
xyze_pos_t dest;
|
||||||
const uint8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y);
|
const int8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y);
|
||||||
|
|
||||||
// Crosses on the X and not already split on this X?
|
// Crosses on the X and not already split on this X?
|
||||||
// The x_splits flags are insurance against rounding errors.
|
// The x_splits flags are insurance against rounding errors.
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ public:
|
|||||||
static void report_current_mesh();
|
static void report_current_mesh();
|
||||||
static void report_state();
|
static void report_state();
|
||||||
static void save_ubl_active_state_and_disable();
|
static void save_ubl_active_state_and_disable();
|
||||||
static void restore_ubl_active_state(const bool is_done=true);
|
static void restore_ubl_active_state_and_leave();
|
||||||
static void display_map(const uint8_t) __O0;
|
static void display_map(const uint8_t) __O0;
|
||||||
static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) __O0;
|
static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) __O0;
|
||||||
static mesh_index_pair find_furthest_invalid_mesh_point() __O0;
|
static mesh_index_pair find_furthest_invalid_mesh_point() __O0;
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ void unified_bed_leveling::G29() {
|
|||||||
#if ALL(DWIN_LCD_PROUI, ZHOME_BEFORE_LEVELING)
|
#if ALL(DWIN_LCD_PROUI, ZHOME_BEFORE_LEVELING)
|
||||||
save_ubl_active_state_and_disable();
|
save_ubl_active_state_and_disable();
|
||||||
gcode.process_subcommands_now(F("G28Z"));
|
gcode.process_subcommands_now(F("G28Z"));
|
||||||
restore_ubl_active_state(false); // ...without telling ExtUI "done"
|
restore_ubl_active_state_and_leave();
|
||||||
#else
|
#else
|
||||||
// Send 'N' to force homing before G29 (internal only)
|
// Send 'N' to force homing before G29 (internal only)
|
||||||
if (axes_should_home() || parser.seen_test('N')) gcode.home_all_axes();
|
if (axes_should_home() || parser.seen_test('N')) gcode.home_all_axes();
|
||||||
@@ -425,7 +425,7 @@ void unified_bed_leveling::G29() {
|
|||||||
if (parser.seen_test('J')) {
|
if (parser.seen_test('J')) {
|
||||||
save_ubl_active_state_and_disable();
|
save_ubl_active_state_and_disable();
|
||||||
tilt_mesh_based_on_probed_grid(param.J_grid_size == 0); // Zero size does 3-Point
|
tilt_mesh_based_on_probed_grid(param.J_grid_size == 0); // Zero size does 3-Point
|
||||||
restore_ubl_active_state();
|
restore_ubl_active_state_and_leave();
|
||||||
#if ENABLED(UBL_G29_J_RECENTER)
|
#if ENABLED(UBL_G29_J_RECENTER)
|
||||||
do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y)));
|
do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y)));
|
||||||
#endif
|
#endif
|
||||||
@@ -754,6 +754,7 @@ void unified_bed_leveling::shift_mesh_height() {
|
|||||||
|
|
||||||
TERN_(HAS_MARLINUI_MENU, ui.capture());
|
TERN_(HAS_MARLINUI_MENU, ui.capture());
|
||||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart());
|
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingStart());
|
||||||
|
TERN_(DWIN_LCD_PROUI, dwinLevelingStart());
|
||||||
|
|
||||||
save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained
|
save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained
|
||||||
grid_count_t count = GRID_MAX_POINTS;
|
grid_count_t count = GRID_MAX_POINTS;
|
||||||
@@ -765,8 +766,9 @@ void unified_bed_leveling::shift_mesh_height() {
|
|||||||
|
|
||||||
const grid_count_t point_num = (GRID_MAX_POINTS - count) + 1;
|
const grid_count_t point_num = (GRID_MAX_POINTS - count) + 1;
|
||||||
SERIAL_ECHOLNPGM("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, ".");
|
SERIAL_ECHOLNPGM("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, ".");
|
||||||
TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT_F(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS)));
|
TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS)));
|
||||||
TERN_(HAS_BACKLIGHT_TIMEOUT, ui.refresh_backlight_timeout());
|
TERN_(HAS_BACKLIGHT_TIMEOUT, ui.refresh_backlight_timeout());
|
||||||
|
TERN_(DWIN_LCD_PROUI, dwinRedrawScreen());
|
||||||
|
|
||||||
#if HAS_MARLINUI_MENU
|
#if HAS_MARLINUI_MENU
|
||||||
if (ui.button_pressed()) {
|
if (ui.button_pressed()) {
|
||||||
@@ -776,7 +778,8 @@ void unified_bed_leveling::shift_mesh_height() {
|
|||||||
ui.quick_feedback();
|
ui.quick_feedback();
|
||||||
ui.release();
|
ui.release();
|
||||||
probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW
|
probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW
|
||||||
return restore_ubl_active_state();
|
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||||
|
return restore_ubl_active_state_and_leave();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -812,12 +815,15 @@ void unified_bed_leveling::shift_mesh_height() {
|
|||||||
|
|
||||||
probe.move_z_after_probing();
|
probe.move_z_after_probing();
|
||||||
|
|
||||||
|
restore_ubl_active_state_and_leave();
|
||||||
|
|
||||||
do_blocking_move_to_xy(
|
do_blocking_move_to_xy(
|
||||||
constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X),
|
constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X),
|
||||||
constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y)
|
constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y)
|
||||||
);
|
);
|
||||||
|
|
||||||
restore_ubl_active_state();
|
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||||
|
TERN_(DWIN_LCD_PROUI, dwinLevelingDone());
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_BED_PROBE
|
#endif // HAS_BED_PROBE
|
||||||
@@ -926,7 +932,7 @@ void set_message_with_feedback(FSTR_P const fstr) {
|
|||||||
if (param.V_verbosity > 1)
|
if (param.V_verbosity > 1)
|
||||||
SERIAL_ECHOLNPGM("Business Card is ", p_float_t(thickness, 4), "mm thick.");
|
SERIAL_ECHOLNPGM("Business Card is ", p_float_t(thickness, 4), "mm thick.");
|
||||||
|
|
||||||
restore_ubl_active_state();
|
restore_ubl_active_state_and_leave();
|
||||||
|
|
||||||
return thickness;
|
return thickness;
|
||||||
}
|
}
|
||||||
@@ -981,7 +987,7 @@ void set_message_with_feedback(FSTR_P const fstr) {
|
|||||||
if (_click_and_hold([]{
|
if (_click_and_hold([]{
|
||||||
SERIAL_ECHOLNPGM("\nMesh only partially populated.");
|
SERIAL_ECHOLNPGM("\nMesh only partially populated.");
|
||||||
do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE);
|
do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE);
|
||||||
})) return restore_ubl_active_state();
|
})) return restore_ubl_active_state_and_leave();
|
||||||
|
|
||||||
// Store the Z position minus the shim height
|
// Store the Z position minus the shim height
|
||||||
z_values[lpos.x][lpos.y] = current_position.z - thick;
|
z_values[lpos.x][lpos.y] = current_position.z - thick;
|
||||||
@@ -996,8 +1002,10 @@ void set_message_with_feedback(FSTR_P const fstr) {
|
|||||||
|
|
||||||
if (do_ubl_mesh_map) display_map(param.T_map_type); // show user where we're probing
|
if (do_ubl_mesh_map) display_map(param.T_map_type); // show user where we're probing
|
||||||
|
|
||||||
restore_ubl_active_state();
|
restore_ubl_active_state_and_leave();
|
||||||
do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE);
|
do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE);
|
||||||
|
|
||||||
|
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1103,7 +1111,7 @@ void set_message_with_feedback(FSTR_P const fstr) {
|
|||||||
} while (lpos.x >= 0 && --param.R_repetition > 0);
|
} while (lpos.x >= 0 && --param.R_repetition > 0);
|
||||||
|
|
||||||
if (do_ubl_mesh_map) display_map(param.T_map_type);
|
if (do_ubl_mesh_map) display_map(param.T_map_type);
|
||||||
restore_ubl_active_state();
|
restore_ubl_active_state_and_leave();
|
||||||
|
|
||||||
do_blocking_move_to_xy_z(pos, Z_TWEEN_SAFE_CLEARANCE);
|
do_blocking_move_to_xy_z(pos, Z_TWEEN_SAFE_CLEARANCE);
|
||||||
|
|
||||||
@@ -1255,20 +1263,17 @@ void unified_bed_leveling::save_ubl_active_state_and_disable() {
|
|||||||
set_bed_leveling_enabled(false);
|
set_bed_leveling_enabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unified_bed_leveling::restore_ubl_active_state(const bool is_done/*=true*/) {
|
void unified_bed_leveling::restore_ubl_active_state_and_leave() {
|
||||||
TERN_(HAS_MARLINUI_MENU, ui.release());
|
TERN_(HAS_MARLINUI_MENU, ui.release());
|
||||||
#if ENABLED(UBL_DEVEL_DEBUGGING)
|
#if ENABLED(UBL_DEVEL_DEBUGGING)
|
||||||
if (--ubl_state_recursion_chk) {
|
if (--ubl_state_recursion_chk) {
|
||||||
SERIAL_ECHOLNPGM("restore_ubl_active_state() called too many times.");
|
SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times.");
|
||||||
set_message_with_feedback(GET_TEXT_F(MSG_UBL_RESTORE_ERROR));
|
set_message_with_feedback(GET_TEXT_F(MSG_UBL_RESTORE_ERROR));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
set_bed_leveling_enabled(ubl_state_at_invocation);
|
set_bed_leveling_enabled(ubl_state_at_invocation);
|
||||||
|
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
||||||
if (is_done) {
|
|
||||||
TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() {
|
mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() {
|
||||||
@@ -1494,7 +1499,7 @@ void unified_bed_leveling::smart_fill_mesh() {
|
|||||||
|
|
||||||
for (uint8_t i = 0; i < 3; ++i) {
|
for (uint8_t i = 0; i < 3; ++i) {
|
||||||
SERIAL_ECHOLNPGM("Tilting mesh (", i + 1, "/3)");
|
SERIAL_ECHOLNPGM("Tilting mesh (", i + 1, "/3)");
|
||||||
TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/3"), GET_TEXT_F(MSG_LCD_TILTING_MESH), i + 1));
|
TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/3"), GET_TEXT(MSG_LCD_TILTING_MESH), i + 1));
|
||||||
|
|
||||||
measured_z = probe.probe_at_point(points[i], i < 2 ? PROBE_PT_RAISE : PROBE_PT_LAST_STOW, param.V_verbosity);
|
measured_z = probe.probe_at_point(points[i], i < 2 ? PROBE_PT_RAISE : PROBE_PT_LAST_STOW, param.V_verbosity);
|
||||||
if ((abort_flag = isnan(measured_z))) break;
|
if ((abort_flag = isnan(measured_z))) break;
|
||||||
@@ -1550,7 +1555,7 @@ void unified_bed_leveling::smart_fill_mesh() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
SERIAL_ECHOLNPGM("Tilting mesh point ", point_num, "/", total_points, "\n");
|
SERIAL_ECHOLNPGM("Tilting mesh point ", point_num, "/", total_points, "\n");
|
||||||
TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT_F(MSG_LCD_TILTING_MESH), point_num, total_points));
|
TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points));
|
||||||
|
|
||||||
measured_z = probe.probe_at_point(rpos, parser.seen_test('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling
|
measured_z = probe.probe_at_point(rpos, parser.seen_test('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ void FWRetract::retract(const bool retracting E_OPTARG(bool swapping/*=false*/))
|
|||||||
// Retract by moving from a faux E position back to the current E position
|
// Retract by moving from a faux E position back to the current E position
|
||||||
current_retract[active_extruder] = base_retract;
|
current_retract[active_extruder] = base_retract;
|
||||||
prepare_internal_move_to_destination( // set current from destination
|
prepare_internal_move_to_destination( // set current from destination
|
||||||
MUL_TERN(RETRACT_SYNC_MIXING, settings.retract_feedrate_mm_s, MIXING_STEPPERS)
|
settings.retract_feedrate_mm_s * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS))
|
||||||
);
|
);
|
||||||
|
|
||||||
// Is a Z hop set, and has the hop not yet been done?
|
// Is a Z hop set, and has the hop not yet been done?
|
||||||
@@ -165,7 +165,8 @@ void FWRetract::retract(const bool retracting E_OPTARG(bool swapping/*=false*/))
|
|||||||
|
|
||||||
// Recover E, set_current_to_destination
|
// Recover E, set_current_to_destination
|
||||||
prepare_internal_move_to_destination(
|
prepare_internal_move_to_destination(
|
||||||
MUL_TERN(RETRACT_SYNC_MIXING, swapping ? settings.swap_retract_recover_feedrate_mm_s : settings.retract_recover_feedrate_mm_s, MIXING_STEPPERS)
|
(swapping ? settings.swap_retract_recover_feedrate_mm_s : settings.retract_recover_feedrate_mm_s)
|
||||||
|
* TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,8 +212,6 @@ void FWRetract::M207() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FWRetract::M207_report() {
|
void FWRetract::M207_report() {
|
||||||
TERN_(MARLIN_SMALL_BUILD, return);
|
|
||||||
|
|
||||||
SERIAL_ECHOLNPGM_P(
|
SERIAL_ECHOLNPGM_P(
|
||||||
PSTR(" M207 S"), LINEAR_UNIT(settings.retract_length)
|
PSTR(" M207 S"), LINEAR_UNIT(settings.retract_length)
|
||||||
, PSTR(" W"), LINEAR_UNIT(settings.swap_retract_length)
|
, PSTR(" W"), LINEAR_UNIT(settings.swap_retract_length)
|
||||||
@@ -238,8 +237,6 @@ void FWRetract::M208() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FWRetract::M208_report() {
|
void FWRetract::M208_report() {
|
||||||
TERN_(MARLIN_SMALL_BUILD, return);
|
|
||||||
|
|
||||||
SERIAL_ECHOLNPGM(
|
SERIAL_ECHOLNPGM(
|
||||||
" M208 S", LINEAR_UNIT(settings.retract_recover_extra)
|
" M208 S", LINEAR_UNIT(settings.retract_recover_extra)
|
||||||
, " W", LINEAR_UNIT(settings.swap_retract_recover_extra)
|
, " W", LINEAR_UNIT(settings.swap_retract_recover_extra)
|
||||||
@@ -261,8 +258,6 @@ void FWRetract::M208_report() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FWRetract::M209_report() {
|
void FWRetract::M209_report() {
|
||||||
TERN_(MARLIN_SMALL_BUILD, return);
|
|
||||||
|
|
||||||
SERIAL_ECHOLNPGM(" M209 S", AS_DIGIT(autoretract_enabled));
|
SERIAL_ECHOLNPGM(" M209 S", AS_DIGIT(autoretract_enabled));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -186,13 +186,13 @@ void HostUI::action(FSTR_P const fstr, const bool eol) {
|
|||||||
switch (response) {
|
switch (response) {
|
||||||
|
|
||||||
case 0: // "Purge More" button
|
case 0: // "Purge More" button
|
||||||
#if ENABLED(M600_PURGE_MORE_RESUMABLE)
|
#if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE)
|
||||||
pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more)
|
pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // "Continue" / "Disable Runout" button
|
case 1: // "Continue" / "Disable Runout" button
|
||||||
#if ENABLED(M600_PURGE_MORE_RESUMABLE)
|
#if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE)
|
||||||
pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection
|
pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection
|
||||||
#endif
|
#endif
|
||||||
#if HAS_FILAMENT_SENSOR
|
#if HAS_FILAMENT_SENSOR
|
||||||
|
|||||||
@@ -32,9 +32,7 @@ typedef struct {
|
|||||||
timeout = HOTEND_IDLE_TIMEOUT_SEC;
|
timeout = HOTEND_IDLE_TIMEOUT_SEC;
|
||||||
trigger = HOTEND_IDLE_MIN_TRIGGER;
|
trigger = HOTEND_IDLE_MIN_TRIGGER;
|
||||||
nozzle_target = HOTEND_IDLE_NOZZLE_TARGET;
|
nozzle_target = HOTEND_IDLE_NOZZLE_TARGET;
|
||||||
#if HAS_HEATED_BED
|
bed_target = HOTEND_IDLE_BED_TARGET;
|
||||||
bed_target = HOTEND_IDLE_BED_TARGET;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} hotend_idle_settings_t;
|
} hotend_idle_settings_t;
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
static uint16_t pixels() { return MUL_TERN(NEOPIXEL2_INSERIES, adaneo1.numPixels(), 2); }
|
static uint16_t pixels() { return adaneo1.numPixels() * TERN1(NEOPIXEL2_INSERIES, 2); }
|
||||||
|
|
||||||
static uint32_t pixel_color(const uint16_t n) {
|
static uint32_t pixel_color(const uint16_t n) {
|
||||||
#if ENABLED(NEOPIXEL2_INSERIES)
|
#if ENABLED(NEOPIXEL2_INSERIES)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
|
|
||||||
#if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER
|
#if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER
|
||||||
static void onHeatingDone() { leds.set_white(); }
|
static void onHeatingDone() { leds.set_white(); }
|
||||||
static void onPIDTuningDone(LEDColor c) { leds.set_color(c); }
|
static void onPidTuningDone(LEDColor c) { leds.set_color(c); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_MEDIA
|
#if HAS_MEDIA
|
||||||
|
|||||||
@@ -72,26 +72,6 @@
|
|||||||
uint16_t CodeProfiler::call_count = 0;
|
uint16_t CodeProfiler::call_count = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL
|
|
||||||
static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF;
|
|
||||||
#else
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_HEAD
|
|
||||||
static int16_t last_head_cnt = 0x1;
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_TAIL
|
|
||||||
static int16_t last_tail_cnt = 0x1;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_QUEUE
|
|
||||||
static int16_t last_depth = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_PROFILE
|
|
||||||
static uint8_t last_time_fraction = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_MULTISTEPPING
|
|
||||||
static uint8_t last_multistepping = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Max7219 max7219;
|
Max7219 max7219;
|
||||||
|
|
||||||
uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 };
|
uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 };
|
||||||
@@ -570,29 +550,6 @@ void Max7219::init() {
|
|||||||
#if MAX7219_INIT_TEST
|
#if MAX7219_INIT_TEST
|
||||||
start_test_pattern();
|
start_test_pattern();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MAX7219_REINIT_ON_POWERUP
|
|
||||||
#if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL
|
|
||||||
last_head_cnt = 0xF;
|
|
||||||
last_tail_cnt = 0xF;
|
|
||||||
#else
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_HEAD
|
|
||||||
last_head_cnt = 0x1;
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_TAIL
|
|
||||||
last_tail_cnt = 0x1;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_QUEUE
|
|
||||||
last_depth = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_PROFILE
|
|
||||||
last_time_fraction = 0;
|
|
||||||
#endif
|
|
||||||
#ifdef MAX7219_DEBUG_MULTISTEPPING
|
|
||||||
last_multistepping = 0;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -719,6 +676,8 @@ void Max7219::idle_tasks() {
|
|||||||
|
|
||||||
#if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL
|
#if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL
|
||||||
|
|
||||||
|
static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF;
|
||||||
|
|
||||||
if (last_head_cnt != head || last_tail_cnt != tail) {
|
if (last_head_cnt != head || last_tail_cnt != tail) {
|
||||||
range16(MAX7219_DEBUG_PLANNER_HEAD, last_tail_cnt, tail, last_head_cnt, head, &row_change_mask);
|
range16(MAX7219_DEBUG_PLANNER_HEAD, last_tail_cnt, tail, last_head_cnt, head, &row_change_mask);
|
||||||
last_head_cnt = head;
|
last_head_cnt = head;
|
||||||
@@ -728,6 +687,7 @@ void Max7219::idle_tasks() {
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_HEAD
|
#ifdef MAX7219_DEBUG_PLANNER_HEAD
|
||||||
|
static int16_t last_head_cnt = 0x1;
|
||||||
if (last_head_cnt != head) {
|
if (last_head_cnt != head) {
|
||||||
mark16(MAX7219_DEBUG_PLANNER_HEAD, last_head_cnt, head, &row_change_mask);
|
mark16(MAX7219_DEBUG_PLANNER_HEAD, last_head_cnt, head, &row_change_mask);
|
||||||
last_head_cnt = head;
|
last_head_cnt = head;
|
||||||
@@ -735,6 +695,7 @@ void Max7219::idle_tasks() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MAX7219_DEBUG_PLANNER_TAIL
|
#ifdef MAX7219_DEBUG_PLANNER_TAIL
|
||||||
|
static int16_t last_tail_cnt = 0x1;
|
||||||
if (last_tail_cnt != tail) {
|
if (last_tail_cnt != tail) {
|
||||||
mark16(MAX7219_DEBUG_PLANNER_TAIL, last_tail_cnt, tail, &row_change_mask);
|
mark16(MAX7219_DEBUG_PLANNER_TAIL, last_tail_cnt, tail, &row_change_mask);
|
||||||
last_tail_cnt = tail;
|
last_tail_cnt = tail;
|
||||||
@@ -753,6 +714,7 @@ void Max7219::idle_tasks() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MAX7219_DEBUG_PROFILE
|
#ifdef MAX7219_DEBUG_PROFILE
|
||||||
|
static uint8_t last_time_fraction = 0;
|
||||||
const uint8_t current_time_fraction = (uint16_t(CodeProfiler::get_time_fraction()) * MAX7219_NUMBER_UNITS + 8) / 16;
|
const uint8_t current_time_fraction = (uint16_t(CodeProfiler::get_time_fraction()) * MAX7219_NUMBER_UNITS + 8) / 16;
|
||||||
if (current_time_fraction != last_time_fraction) {
|
if (current_time_fraction != last_time_fraction) {
|
||||||
quantity(MAX7219_DEBUG_PROFILE, last_time_fraction, current_time_fraction, &row_change_mask);
|
quantity(MAX7219_DEBUG_PROFILE, last_time_fraction, current_time_fraction, &row_change_mask);
|
||||||
|
|||||||
@@ -23,8 +23,6 @@
|
|||||||
/**
|
/**
|
||||||
* feature/pause.cpp - Pause feature support functions
|
* feature/pause.cpp - Pause feature support functions
|
||||||
* This may be combined with related G-codes if features are consolidated.
|
* This may be combined with related G-codes if features are consolidated.
|
||||||
*
|
|
||||||
* Note: Calls to ui.pause_show_message are passed to either ExtUI or MarlinUI.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../inc/MarlinConfigPre.h"
|
#include "../inc/MarlinConfigPre.h"
|
||||||
@@ -62,6 +60,8 @@
|
|||||||
|
|
||||||
#if ENABLED(EXTENSIBLE_UI)
|
#if ENABLED(EXTENSIBLE_UI)
|
||||||
#include "../lcd/extui/ui_api.h"
|
#include "../lcd/extui/ui_api.h"
|
||||||
|
#elif ENABLED(DWIN_LCD_PROUI)
|
||||||
|
#include "../lcd/e3v2/proui/dwin.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../lcd/marlinui.h"
|
#include "../lcd/marlinui.h"
|
||||||
@@ -148,7 +148,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P
|
|||||||
thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder);
|
thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode);
|
ui.pause_show_message(PAUSE_MESSAGE_HEATING, mode); UNUSED(mode);
|
||||||
|
|
||||||
if (wait) return thermalManager.wait_for_hotend(active_extruder);
|
if (wait) return thermalManager.wait_for_hotend(active_extruder);
|
||||||
|
|
||||||
@@ -288,8 +288,8 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load
|
|||||||
// Show "Purge More" / "Resume" menu and wait for reply
|
// Show "Purge More" / "Resume" menu and wait for reply
|
||||||
KEEPALIVE_STATE(PAUSED_FOR_USER);
|
KEEPALIVE_STATE(PAUSED_FOR_USER);
|
||||||
wait_for_user = false;
|
wait_for_user = false;
|
||||||
#if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI)
|
#if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI)
|
||||||
ui.pause_show_message(PAUSE_MESSAGE_OPTION); // MarlinUI and MKS UI also set PAUSE_RESPONSE_WAIT_FOR
|
ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR
|
||||||
#else
|
#else
|
||||||
pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
|
pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -52,12 +52,10 @@ enum PauseMessage : char {
|
|||||||
PAUSE_MESSAGE_RESUME,
|
PAUSE_MESSAGE_RESUME,
|
||||||
PAUSE_MESSAGE_HEAT,
|
PAUSE_MESSAGE_HEAT,
|
||||||
PAUSE_MESSAGE_HEATING,
|
PAUSE_MESSAGE_HEATING,
|
||||||
PAUSE_MESSAGE_STATUS,
|
PAUSE_MESSAGE_STATUS
|
||||||
PAUSE_MESSAGE_COUNT
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if M600_PURGE_MORE_RESUMABLE
|
#if M600_PURGE_MORE_RESUMABLE
|
||||||
// Input methods can Purge More, Resume, or request input
|
|
||||||
enum PauseMenuResponse : char {
|
enum PauseMenuResponse : char {
|
||||||
PAUSE_RESPONSE_WAIT_FOR,
|
PAUSE_RESPONSE_WAIT_FOR,
|
||||||
PAUSE_RESPONSE_EXTRUDE_MORE,
|
PAUSE_RESPONSE_EXTRUDE_MORE,
|
||||||
@@ -107,7 +105,7 @@ void wait_for_confirmation(
|
|||||||
void resume_print(
|
void resume_print(
|
||||||
const_float_t slow_load_length=0, // (mm) Slow Load Length for finishing move
|
const_float_t slow_load_length=0, // (mm) Slow Load Length for finishing move
|
||||||
const_float_t fast_load_length=0, // (mm) Fast Load Length for initial move
|
const_float_t fast_load_length=0, // (mm) Fast Load Length for initial move
|
||||||
const_float_t purge_length=ADVANCED_PAUSE_PURGE_LENGTH, // (mm) Purge length
|
const_float_t extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, // (mm) Purge length
|
||||||
const int8_t max_beep_count=0, // Beep alert for attention
|
const int8_t max_beep_count=0, // Beep alert for attention
|
||||||
const celsius_t targetTemp=0 // (°C) A target temperature for the hotend
|
const celsius_t targetTemp=0 // (°C) A target temperature for the hotend
|
||||||
DXC_PARAMS // Dual-X-Carriage extruder index
|
DXC_PARAMS // Dual-X-Carriage extruder index
|
||||||
@@ -116,7 +114,7 @@ void resume_print(
|
|||||||
bool load_filament(
|
bool load_filament(
|
||||||
const_float_t slow_load_length=0, // (mm) Slow Load Length for finishing move
|
const_float_t slow_load_length=0, // (mm) Slow Load Length for finishing move
|
||||||
const_float_t fast_load_length=0, // (mm) Fast Load Length for initial move
|
const_float_t fast_load_length=0, // (mm) Fast Load Length for initial move
|
||||||
const_float_t purge_length=0, // (mm) Purge length
|
const_float_t extrude_length=0, // (mm) Purge length
|
||||||
const int8_t max_beep_count=0, // Beep alert for attention
|
const int8_t max_beep_count=0, // Beep alert for attention
|
||||||
const bool show_lcd=false, // Set LCD status messages?
|
const bool show_lcd=false, // Set LCD status messages?
|
||||||
const bool pause_for_user=false, // Pause for user before returning?
|
const bool pause_for_user=false, // Pause for user before returning?
|
||||||
|
|||||||
@@ -34,10 +34,6 @@
|
|||||||
#include "../module/temperature.h"
|
#include "../module/temperature.h"
|
||||||
#include "../MarlinCore.h"
|
#include "../MarlinCore.h"
|
||||||
|
|
||||||
#if ENABLED(MAX7219_REINIT_ON_POWERUP)
|
|
||||||
#include "max7219.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(PS_OFF_SOUND)
|
#if ENABLED(PS_OFF_SOUND)
|
||||||
#include "../libs/buzzer.h"
|
#include "../libs/buzzer.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -64,10 +60,6 @@ bool Power::psu_on;
|
|||||||
millis_t Power::lastPowerOn;
|
millis_t Power::lastPowerOn;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PSU_TRACK_STATE_MS
|
|
||||||
millis_t Power::last_state_change_ms = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize pins & state for the power manager.
|
* Initialize pins & state for the power manager.
|
||||||
*
|
*
|
||||||
@@ -95,18 +87,9 @@ void Power::power_on() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE);
|
OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE);
|
||||||
#if ENABLED(PSU_OFF_REDUNDANT)
|
|
||||||
OUT_WRITE(PS_ON1_PIN, TERN_(PSU_OFF_REDUNDANT_INVERTED, !)PSU_ACTIVE_STATE);
|
|
||||||
#endif
|
|
||||||
TERN_(PSU_TRACK_STATE_MS, last_state_change_ms = millis());
|
|
||||||
|
|
||||||
psu_on = true;
|
psu_on = true;
|
||||||
safe_delay(PSU_POWERUP_DELAY);
|
safe_delay(PSU_POWERUP_DELAY);
|
||||||
|
|
||||||
restore_stepper_drivers();
|
restore_stepper_drivers();
|
||||||
|
|
||||||
TERN_(MAX7219_REINIT_ON_POWERUP, max7219.init());
|
|
||||||
|
|
||||||
TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY));
|
TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY));
|
||||||
|
|
||||||
#ifdef PSU_POWERUP_GCODE
|
#ifdef PSU_POWERUP_GCODE
|
||||||
@@ -134,11 +117,6 @@ void Power::power_off() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE);
|
OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE);
|
||||||
#if ENABLED(PSU_OFF_REDUNDANT)
|
|
||||||
OUT_WRITE(PS_ON1_PIN, IF_DISABLED(PSU_OFF_REDUNDANT_INVERTED, !)PSU_ACTIVE_STATE);
|
|
||||||
#endif
|
|
||||||
TERN_(PSU_TRACK_STATE_MS, last_state_change_ms = millis());
|
|
||||||
|
|
||||||
psu_on = false;
|
psu_on = false;
|
||||||
|
|
||||||
#if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN)
|
#if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN)
|
||||||
|
|||||||
@@ -24,11 +24,8 @@
|
|||||||
/**
|
/**
|
||||||
* power.h - power control
|
* power.h - power control
|
||||||
*/
|
*/
|
||||||
#if PIN_EXISTS(PS_ON_EDM) || (PIN_EXISTS(PS_ON1_EDM) && ENABLED(PSU_OFF_REDUNDANT))
|
|
||||||
#define PSU_TRACK_STATE_MS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANY(AUTO_POWER_CONTROL, POWER_OFF_TIMER, PSU_TRACK_STATE_MS)
|
#if ANY(AUTO_POWER_CONTROL, POWER_OFF_TIMER)
|
||||||
#include "../core/millis_t.h"
|
#include "../core/millis_t.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -40,10 +37,6 @@ class Power {
|
|||||||
static void power_on();
|
static void power_on();
|
||||||
static void power_off();
|
static void power_off();
|
||||||
|
|
||||||
#if PSU_TRACK_STATE_MS
|
|
||||||
static millis_t last_state_change_ms;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN)
|
#if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN)
|
||||||
#if ENABLED(POWER_OFF_TIMER)
|
#if ENABLED(POWER_OFF_TIMER)
|
||||||
static millis_t power_off_time;
|
static millis_t power_off_time;
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ uint8_t PrintJobRecovery::queue_index_r;
|
|||||||
uint32_t PrintJobRecovery::cmd_sdpos, // = 0
|
uint32_t PrintJobRecovery::cmd_sdpos, // = 0
|
||||||
PrintJobRecovery::sdpos[BUFSIZE];
|
PrintJobRecovery::sdpos[BUFSIZE];
|
||||||
|
|
||||||
#if HAS_PLR_UI_FLAG
|
#if HAS_DWIN_E3V2_BASIC
|
||||||
bool PrintJobRecovery::ui_flag_resume; // = false
|
bool PrintJobRecovery::dwin_flag; // = false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../sd/cardreader.h"
|
#include "../sd/cardreader.h"
|
||||||
|
|||||||
@@ -151,8 +151,8 @@ class PrintJobRecovery {
|
|||||||
static uint32_t cmd_sdpos, //!< SD position of the next command
|
static uint32_t cmd_sdpos, //!< SD position of the next command
|
||||||
sdpos[BUFSIZE]; //!< SD positions of queued commands
|
sdpos[BUFSIZE]; //!< SD positions of queued commands
|
||||||
|
|
||||||
#if HAS_PLR_UI_FLAG
|
#if HAS_DWIN_E3V2_BASIC
|
||||||
static bool ui_flag_resume; //!< Flag the UI to show a dialog to Resume (M1000) or Cancel (M1000C)
|
static bool dwin_flag;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void init();
|
static void init();
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ bool FilamentMonitorBase::enabled = true,
|
|||||||
|
|
||||||
#if ENABLED(EXTENSIBLE_UI)
|
#if ENABLED(EXTENSIBLE_UI)
|
||||||
#include "../lcd/extui/ui_api.h"
|
#include "../lcd/extui/ui_api.h"
|
||||||
|
#elif ENABLED(DWIN_LCD_PROUI)
|
||||||
|
#include "../lcd/e3v2/proui/dwin.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void event_filament_runout(const uint8_t extruder) {
|
void event_filament_runout(const uint8_t extruder) {
|
||||||
@@ -86,6 +88,7 @@ void event_filament_runout(const uint8_t extruder) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getTool(extruder)));
|
TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getTool(extruder)));
|
||||||
|
TERN_(DWIN_LCD_PROUI, dwinFilamentRunout(extruder));
|
||||||
|
|
||||||
#if ANY(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS, MULTI_FILAMENT_SENSOR)
|
#if ANY(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS, MULTI_FILAMENT_SENSOR)
|
||||||
const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, extruder);
|
const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, extruder);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ static uint32_t axis_plug_backward = 0;
|
|||||||
void stepper_driver_backward_error(FSTR_P const fstr) {
|
void stepper_driver_backward_error(FSTR_P const fstr) {
|
||||||
SERIAL_ERROR_START();
|
SERIAL_ERROR_START();
|
||||||
SERIAL_ECHOLN(fstr, F(" driver is backward!"));
|
SERIAL_ECHOLN(fstr, F(" driver is backward!"));
|
||||||
ui.status_printf(2, F(S_FMT S_FMT), FTOP(fstr), GET_TEXT_F(MSG_DRIVER_BACKWARD));
|
ui.status_printf(2, F(S_FMT S_FMT), FTOP(fstr), GET_TEXT(MSG_DRIVER_BACKWARD));
|
||||||
}
|
}
|
||||||
|
|
||||||
void stepper_driver_backward_check() {
|
void stepper_driver_backward_check() {
|
||||||
|
|||||||
@@ -763,7 +763,7 @@
|
|||||||
SERIAL_CHAR('\t');
|
SERIAL_CHAR('\t');
|
||||||
st.printLabel();
|
st.printLabel();
|
||||||
SERIAL_CHAR('\t');
|
SERIAL_CHAR('\t');
|
||||||
print_hex_long(drv_status, ':', true);
|
print_hex_long(drv_status, ':');
|
||||||
if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!");
|
if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!");
|
||||||
SERIAL_EOL();
|
SERIAL_EOL();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -144,13 +144,15 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void refresh_stepper_current() { rms_current(this->val_mA); }
|
#if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI)
|
||||||
|
void refresh_stepper_current() { rms_current(this->val_mA); }
|
||||||
|
|
||||||
#if ENABLED(HYBRID_THRESHOLD)
|
#if ENABLED(HYBRID_THRESHOLD)
|
||||||
void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
|
void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
|
||||||
#endif
|
#endif
|
||||||
#if USE_SENSORLESS
|
#if USE_SENSORLESS
|
||||||
void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
|
void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static constexpr int8_t sgt_min = -64,
|
static constexpr int8_t sgt_min = -64,
|
||||||
@@ -205,10 +207,12 @@ class TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void refresh_stepper_current() { rms_current(this->val_mA); }
|
#if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI)
|
||||||
|
void refresh_stepper_current() { rms_current(this->val_mA); }
|
||||||
|
|
||||||
#if ENABLED(HYBRID_THRESHOLD)
|
#if ENABLED(HYBRID_THRESHOLD)
|
||||||
void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
|
void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -265,13 +269,15 @@ class TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void refresh_stepper_current() { rms_current(this->val_mA); }
|
#if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI)
|
||||||
|
void refresh_stepper_current() { rms_current(this->val_mA); }
|
||||||
|
|
||||||
#if ENABLED(HYBRID_THRESHOLD)
|
#if ENABLED(HYBRID_THRESHOLD)
|
||||||
void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
|
void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
|
||||||
#endif
|
#endif
|
||||||
#if USE_SENSORLESS
|
#if USE_SENSORLESS
|
||||||
void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
|
void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static constexpr uint8_t sgt_min = 0,
|
static constexpr uint8_t sgt_min = 0,
|
||||||
@@ -309,10 +315,12 @@ class TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC266
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void refresh_stepper_current() { rms_current(this->val_mA); }
|
#if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI)
|
||||||
|
void refresh_stepper_current() { rms_current(this->val_mA); }
|
||||||
|
|
||||||
#if USE_SENSORLESS
|
#if USE_SENSORLESS
|
||||||
void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
|
void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static constexpr int8_t sgt_min = -64,
|
static constexpr int8_t sgt_min = -64,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user