Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e9dda85ddd | |||
| beea1f1d14 | |||
| a9072b00e8 | |||
| a530446b62 |
@@ -1,21 +0,0 @@
|
|||||||
# Build artifacts
|
|
||||||
buildroot/
|
|
||||||
*.o
|
|
||||||
*.a
|
|
||||||
*.so
|
|
||||||
*.dylib
|
|
||||||
*.dll
|
|
||||||
*.exe
|
|
||||||
|
|
||||||
# Web assets
|
|
||||||
*.min.js
|
|
||||||
*.min.css
|
|
||||||
|
|
||||||
# Generated files
|
|
||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# IDE files
|
|
||||||
.vscode/
|
|
||||||
.idea/
|
|
||||||
@@ -38,14 +38,14 @@
|
|||||||
"platformio.platformio-ide",
|
"platformio.platformio-ide",
|
||||||
"marlinfirmware.auto-build",
|
"marlinfirmware.auto-build",
|
||||||
"editorconfig.editorconfig"
|
"editorconfig.editorconfig"
|
||||||
]
|
],
|
||||||
|
|
||||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||||
// , "forwardPorts": []
|
// "forwardPorts": [],
|
||||||
|
|
||||||
// Use 'postCreateCommand' to run commands after the container is created.
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
// , "postCreateCommand": "pip3 install --user -r requirements.txt"
|
// "postCreateCommand": "pip3 install --user -r requirements.txt",
|
||||||
|
|
||||||
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||||
// , "remoteUser": "vscode"
|
// "remoteUser": "vscode"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
autolabel:
|
autolabel:
|
||||||
name: Auto Label
|
name: Auto Label
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Auto Label for [BUG]
|
- name: Auto Label for [BUG]
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v7
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Bump Distribution Date
|
name: Bump Distribution Date
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ jobs:
|
|||||||
name: PR Bad Target
|
name: PR Bad Target
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: superbrothers/close-pull-request@v3
|
- uses: superbrothers/close-pull-request@v3
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
- 2.1.x
|
- 2.1.x
|
||||||
- release-*
|
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- config/**
|
- config/**
|
||||||
- data/**
|
- data/**
|
||||||
@@ -35,19 +34,13 @@ jobs:
|
|||||||
name: Build Test
|
name: Build Test
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
env:
|
|
||||||
CONFIG_BRANCH: ${{ github.base_ref || github.ref_name }}
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
test-platform:
|
test-platform:
|
||||||
|
|
||||||
# RP2040
|
|
||||||
- SKR_Pico
|
|
||||||
|
|
||||||
# Native
|
# Native
|
||||||
- linux_native
|
- linux_native
|
||||||
- simulator_linux_release
|
- simulator_linux_release
|
||||||
@@ -58,7 +51,7 @@ jobs:
|
|||||||
- at90usb1286_dfu
|
- at90usb1286_dfu
|
||||||
|
|
||||||
# AVR Extended
|
# AVR Extended
|
||||||
- mega2560ext
|
- FYSETC_F6
|
||||||
- melzi_optiboot
|
- melzi_optiboot
|
||||||
- rambo
|
- rambo
|
||||||
- sanguino1284p
|
- sanguino1284p
|
||||||
@@ -117,7 +110,7 @@ jobs:
|
|||||||
- BTT_GTR_V1_0
|
- BTT_GTR_V1_0
|
||||||
- BTT_SKR_PRO
|
- BTT_SKR_PRO
|
||||||
- FLYF407ZG
|
- FLYF407ZG
|
||||||
- STM32F446VE_fysetc
|
- FYSETC_S6
|
||||||
- LERDGEK
|
- LERDGEK
|
||||||
- LERDGEX
|
- LERDGEX
|
||||||
- mks_robin_pro2
|
- mks_robin_pro2
|
||||||
@@ -155,12 +148,6 @@ jobs:
|
|||||||
# HC32
|
# HC32
|
||||||
- HC32F460C_aquila_101
|
- HC32F460C_aquila_101
|
||||||
|
|
||||||
# GD32F3
|
|
||||||
- GD32F303RE_creality_mfl
|
|
||||||
|
|
||||||
# GD32F1
|
|
||||||
- GD32F103RC_aquila_mfl
|
|
||||||
|
|
||||||
# LPC176x - Lengthy tests
|
# LPC176x - Lengthy tests
|
||||||
- LPC1768
|
- LPC1768
|
||||||
- LPC1769
|
- LPC1769
|
||||||
@@ -174,20 +161,15 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-build-v1
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-build-
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
- name: Cache PlatformIO
|
- name: Cache PlatformIO
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: ~/.platformio
|
||||||
~/.platformio
|
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||||
.pio/build
|
|
||||||
.pio/libdeps
|
|
||||||
key: ${{ runner.os }}-pio-build-v1
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pio-build-
|
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
@@ -203,7 +185,6 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Simulator dependencies
|
- name: Install Simulator dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install build-essential
|
sudo apt-get install build-essential
|
||||||
sudo apt-get install libsdl2-dev
|
sudo apt-get install libsdl2-dev
|
||||||
sudo apt-get install libsdl2-net-dev
|
sudo apt-get install libsdl2-net-dev
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
# pulls them into additional branches.
|
# pulls them into additional branches.
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
@@ -46,20 +46,15 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-unit-v1
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-unit-
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
- name: Cache PlatformIO
|
- name: Cache PlatformIO
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: ~/.platformio
|
||||||
~/.platformio
|
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||||
.pio/build
|
|
||||||
.pio/libdeps
|
|
||||||
key: ${{ runner.os }}-pio-tests-v1
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-pio-tests-
|
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
|
|||||||
@@ -9,40 +9,40 @@ name: CI - Validate boards.h
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
paths:
|
paths:
|
||||||
- "Marlin/src/core/boards.h"
|
- 'Marlin/src/core/boards.h'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
paths:
|
paths:
|
||||||
- "Marlin/src/core/boards.h"
|
- 'Marlin/src/core/boards.h'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate_pins_files:
|
validate_pins_files:
|
||||||
name: Validate boards.h
|
name: Validate boards.h
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Cache pip
|
- name: Cache pip
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-validation-v1
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-validation-
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.9"
|
python-version: '3.9'
|
||||||
architecture: "x64"
|
architecture: 'x64'
|
||||||
|
|
||||||
- name: Validate core/boards.h
|
- name: Validate core/boards.h
|
||||||
run: |
|
run: |
|
||||||
make validate-boards -j
|
make validate-boards -j
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
#
|
|
||||||
# ci-validate-lines.yml
|
|
||||||
# Validate that all text files are unchanged by linesformat.py
|
|
||||||
#
|
|
||||||
|
|
||||||
name: CI - Validate Source Files
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.1.x
|
|
||||||
- 2.1.x
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.1.x
|
|
||||||
- 2.1.x
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate_source_files:
|
|
||||||
name: Validate Source Files
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out the PR
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache node_modules
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: node_modules
|
|
||||||
key: ${{ runner.os }}-npm-lines-v1
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-npm-lines-
|
|
||||||
|
|
||||||
- name: Validate text file formatting
|
|
||||||
run: |
|
|
||||||
npm install --save-dev prettier
|
|
||||||
make validate-lines -j
|
|
||||||
@@ -8,44 +8,44 @@ name: CI - Validate Pins Files
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
||||||
#- 2.1.x
|
#- 2.1.x
|
||||||
paths:
|
paths:
|
||||||
- "Marlin/src/pins/*/**"
|
- 'Marlin/src/pins/*/**'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
||||||
#- 2.1.x
|
#- 2.1.x
|
||||||
paths:
|
paths:
|
||||||
- "Marlin/src/pins/*/**"
|
- 'Marlin/src/pins/*/**'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate_pins_files:
|
validate_pins_files:
|
||||||
name: Validate Pins Files
|
name: Validate Pins Files
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Cache pip
|
- name: Cache pip
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-validation-v1
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-validation-
|
${{ runner.os }}-pip-
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.9"
|
python-version: '3.9'
|
||||||
architecture: "x64"
|
architecture: 'x64'
|
||||||
|
|
||||||
- name: Validate all pins files
|
- name: Validate all pins files
|
||||||
run: |
|
run: |
|
||||||
make validate-pins -j
|
make validate-pins -j
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
remove_label:
|
remove_label:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Close Stale Issues
|
name: Close Stale Issues
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v9
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Lock Closed Issues
|
name: Lock Closed Issues
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v5
|
- uses: dessant/lock-threads@v5
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Unlock Reopened
|
name: Unlock Reopened
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: OSDKDev/unlock-issues@v1.1
|
- uses: OSDKDev/unlock-issues@v1.1
|
||||||
|
|||||||
Regular → Executable
-8
@@ -31,11 +31,6 @@ out-language/
|
|||||||
*.gen
|
*.gen
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
|
|
||||||
# npm
|
|
||||||
node_modules/
|
|
||||||
package.json
|
|
||||||
package-lock.json
|
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
applet/
|
applet/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@@ -174,6 +169,3 @@ __pycache__
|
|||||||
tags
|
tags
|
||||||
*.logs
|
*.logs
|
||||||
*.bak
|
*.bak
|
||||||
.aider*
|
|
||||||
!.aiderignore
|
|
||||||
.env
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
# Prettier Ignore file
|
|
||||||
*.min.js
|
|
||||||
web-ui/
|
|
||||||
buildroot/share/PlatformIO/boards
|
|
||||||
buildroot/share/PlatformIO/variants
|
|
||||||
*.sublime-project
|
|
||||||
*.sublime-syntax
|
|
||||||
.github
|
|
||||||
.vscode
|
|
||||||
launch.json
|
|
||||||
@@ -4,36 +4,10 @@ CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
|||||||
CONTAINER_IMAGE := marlin-dev
|
CONTAINER_IMAGE := marlin-dev
|
||||||
UNIT_TEST_CONFIG ?= default
|
UNIT_TEST_CONFIG ?= default
|
||||||
|
|
||||||
# Find a Python 3 interpreter
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
# Windows: use `where` – fall back through the three common names
|
|
||||||
PYTHON := $(shell which python 2>nul || which python3 2>nul || which py 2>nul)
|
|
||||||
# Windows: Use cmd tools to find pins files
|
|
||||||
PINS_RAW := $(shell cmd //c "dir /s /b Marlin\src\pins\*.h 2>nul | findstr /r ".*Marlin\\\\src\\\\pins\\\\.*\\\\pins_.*\.h"")
|
|
||||||
PINS := $(subst \,/,$(PINS_RAW))
|
|
||||||
else
|
|
||||||
# POSIX: use `command -v` – prefer python3 over python
|
|
||||||
PYTHON := $(shell command -v python3 2>/dev/null || command -v python 2>/dev/null)
|
|
||||||
# Unix/Linux: Use find command
|
|
||||||
PINS := $(shell find Marlin/src/pins -mindepth 2 -name 'pins_*.h')
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Check that the found interpreter is Python 3
|
|
||||||
# Error if there's no Python 3 available
|
|
||||||
ifneq ($(strip $(PYTHON)),)
|
|
||||||
PYTHON_VERSION := $(shell $(PYTHON) -c "import sys; print(sys.version_info[0])" 2>/dev/null)
|
|
||||||
ifneq ($(PYTHON_VERSION),3)
|
|
||||||
$(error $(PYTHON) is not Python 3 – install a Python‑3.x interpreter or adjust your PATH)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
$(error No Python executable found – install Python 3.x and make sure it is in your PATH)
|
|
||||||
endif
|
|
||||||
|
|
||||||
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 -j : Reformat all pins files (-j for parallel execution)"
|
||||||
@echo "make validate-lines -j : Validate line endings, fails on trailing whitespace, etc."
|
|
||||||
@echo "make validate-pins -j : Validate all pins files, fails if any require reformatting"
|
@echo "make validate-pins -j : Validate all pins files, fails if any require reformatting"
|
||||||
@echo "make validate-boards -j : Validate boards.h and pins.h for standards compliance"
|
@echo "make validate-boards -j : Validate boards.h and pins.h for standards compliance"
|
||||||
@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"
|
||||||
@@ -43,9 +17,9 @@ help:
|
|||||||
@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 unit-test-single-local : Run unit tests for a single config locally"
|
||||||
@echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker"
|
@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 : Run all code tests locally"
|
||||||
@echo "make unit-test-all-local-docker : Run all code tests locally, using docker"
|
@echo "make unit-test-all-local-docker : Run all code tests locally, using docker"
|
||||||
@echo "make setup-local-docker : Setup local 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"
|
||||||
@@ -66,9 +40,6 @@ marlin:
|
|||||||
./buildroot/bin/mftest -a
|
./buildroot/bin/mftest -a
|
||||||
.PHONY: marlin
|
.PHONY: marlin
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf .pio/build*
|
|
||||||
|
|
||||||
tests-single-ci:
|
tests-single-ci:
|
||||||
export GIT_RESET_HARD=true
|
export GIT_RESET_HARD=true
|
||||||
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
|
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
|
||||||
@@ -85,10 +56,10 @@ tests-single-local-docker:
|
|||||||
$(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)
|
@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 $$(python $(SCRIPTS_DIR)/get_test_targets.py) ; do \
|
||||||
if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \
|
if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \
|
||||||
echo "Skipping tests for $$TEST_TARGET on macOS" ; \
|
echo "Skipping tests for $$TEST_TARGET on macOS" ; \
|
||||||
continue ; \
|
continue ; \
|
||||||
@@ -116,56 +87,27 @@ unit-test-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 unit-test-all-local
|
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local
|
||||||
|
|
||||||
USERNAME := $(shell whoami)
|
|
||||||
USER_ID := $(shell id -u)
|
|
||||||
GROUP_ID := $(shell id -g)
|
|
||||||
|
|
||||||
.PHONY: setup-local-docker setup-local-docker-old
|
|
||||||
|
|
||||||
setup-local-docker:
|
setup-local-docker:
|
||||||
@echo "Building marlin-dev Docker image..."
|
|
||||||
$(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) \
|
|
||||||
--build-arg USERNAME=$(USERNAME) \
|
|
||||||
--build-arg USER_ID=$(USER_ID) \
|
|
||||||
--build-arg GROUP_ID=$(GROUP_ID) \
|
|
||||||
-f docker/Dockerfile .
|
|
||||||
@echo
|
|
||||||
@echo "To run all tests in Docker:"
|
|
||||||
@echo " make tests-all-local-docker"
|
|
||||||
@echo "To run a single test in Docker:"
|
|
||||||
@echo " make tests-single-local-docker TEST_TARGET=mega2560"
|
|
||||||
|
|
||||||
setup-local-docker-old:
|
|
||||||
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
||||||
|
|
||||||
|
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
|
||||||
|
|
||||||
.PHONY: $(PINS) format-pins validate-pins
|
.PHONY: $(PINS) format-pins validate-pins
|
||||||
|
|
||||||
$(PINS): %:
|
$(PINS): %:
|
||||||
@echo "Formatting pins $@"
|
@echo "Formatting $@"
|
||||||
@$(PYTHON) $(SCRIPTS_DIR)/pinsformat.py $< $@
|
@python $(SCRIPTS_DIR)/pinsformat.py $< $@
|
||||||
|
|
||||||
format-pins: $(PINS)
|
format-pins: $(PINS)
|
||||||
@echo "Processed $(words $(PINS)) pins files"
|
|
||||||
|
|
||||||
validate-pins: format-pins
|
validate-pins: format-pins
|
||||||
@echo "Validating pins files"
|
@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)
|
@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
|
||||||
|
|
||||||
.PHONY: format-lines validate-lines
|
|
||||||
|
|
||||||
format-lines:
|
|
||||||
@echo "Formatting all sources"
|
|
||||||
@$(PYTHON) $(SCRIPTS_DIR)/linesformat.py buildroot
|
|
||||||
@$(PYTHON) $(SCRIPTS_DIR)/linesformat.py Marlin
|
|
||||||
|
|
||||||
validate-lines:
|
|
||||||
@echo "Validating text formatting"
|
|
||||||
@npx prettier --check . --editorconfig --object-wrap preserve
|
|
||||||
|
|
||||||
BOARDS_FILE := Marlin/src/core/boards.h
|
BOARDS_FILE := Marlin/src/core/boards.h
|
||||||
|
|
||||||
.PHONY: validate-boards
|
.PHONY: validate-boards
|
||||||
|
|
||||||
validate-boards:
|
validate-boards:
|
||||||
@echo "Validating boards.h file"
|
@echo "Validating boards.h file"
|
||||||
@$(PYTHON) $(SCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1)
|
@python $(SCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1)
|
||||||
|
|||||||
+98
-193
@@ -71,8 +71,6 @@
|
|||||||
#define MOTHERBOARD BOARD_RAMPS_14_EFB
|
#define MOTHERBOARD BOARD_RAMPS_14_EFB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section serial
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select the serial port on the board to use for communication with the host.
|
* Select the serial port on the board to use for communication with the host.
|
||||||
* This allows the connection of wireless adapters (for instance) to non-default port pins.
|
* This allows the connection of wireless adapters (for instance) to non-default port pins.
|
||||||
@@ -129,7 +127,6 @@
|
|||||||
|
|
||||||
// Name displayed in the LCD "Ready" message and Info menu
|
// Name displayed in the LCD "Ready" message and Info menu
|
||||||
//#define CUSTOM_MACHINE_NAME "3D Printer"
|
//#define CUSTOM_MACHINE_NAME "3D Printer"
|
||||||
//#define CONFIGURABLE_MACHINE_NAME // Add G-code M550 to set/report the machine name
|
|
||||||
|
|
||||||
// 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
|
||||||
@@ -148,9 +145,9 @@
|
|||||||
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
|
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
|
||||||
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
|
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
|
||||||
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
|
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
|
||||||
* TMC2240, TMC2660, TMC2660_STANDALONE,
|
* TMC2660, TMC2660_STANDALONE, TMC5130, TMC5130_STANDALONE,
|
||||||
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
|
* TMC5160, TMC5160_STANDALONE
|
||||||
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', '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', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
||||||
*/
|
*/
|
||||||
#define X_DRIVER_TYPE A4988
|
#define X_DRIVER_TYPE A4988
|
||||||
#define Y_DRIVER_TYPE A4988
|
#define Y_DRIVER_TYPE A4988
|
||||||
@@ -260,7 +257,6 @@
|
|||||||
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
|
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
|
||||||
// For Dual Servo use two pairs: { { lower, raise }, { lower, raise } }
|
// For Dual Servo use two pairs: { { lower, raise }, { lower, raise } }
|
||||||
#define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move
|
#define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move
|
||||||
#define SWITCHING_NOZZLE_LIFT_TO_PROBE // Lift toolheads out of the way while probing
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
|
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
|
||||||
@@ -305,18 +301,6 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* Differential Extruder
|
|
||||||
*
|
|
||||||
* The X and E steppers work together to create a differential drive system.
|
|
||||||
* Simple : E steps = X + E ; X steps = X (E drives a loop, X stays the same)
|
|
||||||
* Balanced: E steps = X + E/2 ; X steps = X - E/2 (Dual loop system)
|
|
||||||
*/
|
|
||||||
//#define DIFFERENTIAL_EXTRUDER
|
|
||||||
#if ENABLED(DIFFERENTIAL_EXTRUDER)
|
|
||||||
//#define BALANCED_DIFFERENTIAL_EXTRUDER
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switching Toolhead
|
* Switching Toolhead
|
||||||
*
|
*
|
||||||
@@ -600,7 +584,7 @@
|
|||||||
#define DUMMY_THERMISTOR_998_VALUE 25
|
#define DUMMY_THERMISTOR_998_VALUE 25
|
||||||
#define DUMMY_THERMISTOR_999_VALUE 100
|
#define DUMMY_THERMISTOR_999_VALUE 100
|
||||||
|
|
||||||
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1 / 2 / BED
|
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1
|
||||||
#if TEMP_SENSOR_IS_MAX_TC(0)
|
#if TEMP_SENSOR_IS_MAX_TC(0)
|
||||||
#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
|
#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
|
||||||
#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
|
#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
|
||||||
@@ -613,10 +597,6 @@
|
|||||||
#define MAX31865_SENSOR_OHMS_2 100
|
#define MAX31865_SENSOR_OHMS_2 100
|
||||||
#define MAX31865_CALIBRATION_OHMS_2 430
|
#define MAX31865_CALIBRATION_OHMS_2 430
|
||||||
#endif
|
#endif
|
||||||
#if TEMP_SENSOR_IS_MAX_TC(BED)
|
|
||||||
#define MAX31865_SENSOR_OHMS_BED 100
|
|
||||||
#define MAX31865_CALIBRATION_OHMS_BED 430
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_E_TEMP_SENSOR
|
#if HAS_E_TEMP_SENSOR
|
||||||
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
||||||
@@ -709,22 +689,20 @@
|
|||||||
#define PID_K1 0.95 // Smoothing factor within any PID loop
|
#define PID_K1 0.95 // Smoothing factor within any PID loop
|
||||||
|
|
||||||
#if ENABLED(PIDTEMP)
|
#if ENABLED(PIDTEMP)
|
||||||
//#define MIN_POWER 0 // Min power to improve PID stability (0..PID_MAX).
|
//#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation.
|
||||||
// Get the power from the temperature report ('M105' => @:nnn) and try P*2-20 to P*2-10.
|
|
||||||
//#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to enable/disable.
|
|
||||||
//#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders)
|
//#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders)
|
||||||
// Set/get with G-code: M301 E[extruder number, 0-2]
|
// Set/get with G-code: M301 E[extruder number, 0-2]
|
||||||
|
|
||||||
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
||||||
// Specify up to one value per hotend here, according to your setup.
|
// Specify up to one value per hotend here, according to your setup.
|
||||||
// If there are fewer values, the last one applies to the remaining hotends.
|
// If there are fewer values, the last one applies to the remaining hotends.
|
||||||
#define DEFAULT_KP_LIST { 22.20, 22.20 }
|
#define DEFAULT_Kp_LIST { 22.20, 22.20 }
|
||||||
#define DEFAULT_KI_LIST { 1.08, 1.08 }
|
#define DEFAULT_Ki_LIST { 1.08, 1.08 }
|
||||||
#define DEFAULT_KD_LIST { 114.00, 114.00 }
|
#define DEFAULT_Kd_LIST { 114.00, 114.00 }
|
||||||
#else
|
#else
|
||||||
#define DEFAULT_KP 22.20
|
#define DEFAULT_Kp 22.20
|
||||||
#define DEFAULT_KI 1.08
|
#define DEFAULT_Ki 1.08
|
||||||
#define DEFAULT_KD 114.00
|
#define DEFAULT_Kd 114.00
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
|
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
|
||||||
@@ -747,12 +725,7 @@
|
|||||||
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
|
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
|
||||||
|
|
||||||
#define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active.
|
#define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active.
|
||||||
#define MPC_HEATER_POWER { 40.0f } // (W) Nominal heat cartridge powers.
|
#define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
|
||||||
//#define MPC_PTC // Hotend power changes with temperature (e.g., PTC heat cartridges).
|
|
||||||
#if ENABLED(MPC_PTC)
|
|
||||||
#define MPC_HEATER_ALPHA { 0.0028f } // Temperature coefficient of resistance of the heat cartridges.
|
|
||||||
#define MPC_HEATER_REFTEMP { 20 } // (°C) Reference temperature for MPC_HEATER_POWER and MPC_HEATER_ALPHA.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MPC_INCLUDE_FAN // Model the fan speed?
|
#define MPC_INCLUDE_FAN // Model the fan speed?
|
||||||
|
|
||||||
@@ -784,7 +757,6 @@
|
|||||||
|
|
||||||
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
|
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
|
||||||
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
|
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
|
||||||
//#define EVENT_GCODE_AFTER_MPC_TUNE "M84" // G-code to execute after MPC tune finished and Z raised.
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@@ -816,15 +788,14 @@
|
|||||||
//#define PIDTEMPBED
|
//#define PIDTEMPBED
|
||||||
|
|
||||||
#if ENABLED(PIDTEMPBED)
|
#if ENABLED(PIDTEMPBED)
|
||||||
//#define MIN_BED_POWER 0 // Min power to improve PID stability (0..MAX_BED_POWER).
|
//#define MIN_BED_POWER 0
|
||||||
// Get the power from the temperature report ('M105' => B@:nnn) and try P*2-20 to P*2-10.
|
//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port.
|
||||||
//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. Use 'M303 D' to enable/disable.
|
|
||||||
|
|
||||||
// 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
|
// 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
|
||||||
// from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
|
// from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
|
||||||
#define DEFAULT_BED_KP 10.00
|
#define DEFAULT_bedKp 10.00
|
||||||
#define DEFAULT_BED_KI 0.023
|
#define DEFAULT_bedKi .023
|
||||||
#define DEFAULT_BED_KD 305.4
|
#define DEFAULT_bedKd 305.4
|
||||||
|
|
||||||
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
||||||
#else
|
#else
|
||||||
@@ -899,15 +870,15 @@
|
|||||||
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
|
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
|
||||||
|
|
||||||
#if ENABLED(PIDTEMPCHAMBER)
|
#if ENABLED(PIDTEMPCHAMBER)
|
||||||
//#define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER)
|
#define MIN_CHAMBER_POWER 0
|
||||||
// Get the power from the temperature report ('M105' => C@:nnn) and try P*2-20 to P*2-10.
|
//#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port.
|
||||||
//#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. Use 'M303 D' to enable/disable.
|
|
||||||
|
|
||||||
// Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element
|
// Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element
|
||||||
// and placed inside the small Creality printer enclosure tent.
|
// and placed inside the small Creality printer enclosure tent.
|
||||||
#define DEFAULT_CHAMBER_KP 37.04
|
//
|
||||||
#define DEFAULT_CHAMBER_KI 1.40
|
#define DEFAULT_chamberKp 37.04
|
||||||
#define DEFAULT_CHAMBER_KD 655.17
|
#define DEFAULT_chamberKi 1.40
|
||||||
|
#define DEFAULT_chamberKd 655.17
|
||||||
// M309 P37.04 I1.04 D655.17
|
// M309 P37.04 I1.04 D655.17
|
||||||
|
|
||||||
// FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
|
// FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
|
||||||
@@ -918,7 +889,7 @@
|
|||||||
#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
|
#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
|
||||||
//#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
|
//#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
|
||||||
//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
|
//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
|
||||||
#define PID_FUNCTIONAL_RANGE 20 // 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)
|
||||||
@@ -954,7 +925,7 @@
|
|||||||
* protect against a broken or disconnected thermistor wire.
|
* protect against a broken or disconnected thermistor wire.
|
||||||
*
|
*
|
||||||
* The issue: If a thermistor falls out, it will report the much lower
|
* The issue: If a thermistor falls out, it will report the much lower
|
||||||
* temperature of the air in the room, and the firmware will keep
|
* temperature of the air in the room, and the the firmware will keep
|
||||||
* the heater on.
|
* the heater on.
|
||||||
*
|
*
|
||||||
* If you get "Thermal Runaway" or "Heating failed" errors the
|
* If you get "Thermal Runaway" or "Heating failed" errors the
|
||||||
@@ -970,7 +941,7 @@
|
|||||||
//============================= Mechanical Settings =========================
|
//============================= Mechanical Settings =========================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
// @section kinematics
|
// @section machine
|
||||||
|
|
||||||
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
|
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
|
||||||
// either in the usual order or reversed
|
// either in the usual order or reversed
|
||||||
@@ -994,15 +965,6 @@
|
|||||||
// Enable for a belt style printer with endless "Z" motion
|
// Enable for a belt style printer with endless "Z" motion
|
||||||
//#define BELTPRINTER
|
//#define BELTPRINTER
|
||||||
|
|
||||||
// Articulated robot (arm). Joints are directly mapped to axes with no kinematics.
|
|
||||||
//#define ARTICULATED_ROBOT_ARM
|
|
||||||
|
|
||||||
// For a hot wire cutter with parallel horizontal axes (X, I) where the heights of the two wire
|
|
||||||
// ends are controlled by parallel axes (Y, J). Joints are directly mapped to axes (no kinematics).
|
|
||||||
//#define FOAMCUTTER_XYUV
|
|
||||||
|
|
||||||
// @section polargraph
|
|
||||||
|
|
||||||
// Enable for Polargraph Kinematics
|
// Enable for Polargraph Kinematics
|
||||||
//#define POLARGRAPH
|
//#define POLARGRAPH
|
||||||
#if ENABLED(POLARGRAPH)
|
#if ENABLED(POLARGRAPH)
|
||||||
@@ -1046,6 +1008,9 @@
|
|||||||
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
|
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
|
||||||
#define PRINTABLE_RADIUS 140.0 // (mm)
|
#define PRINTABLE_RADIUS 140.0 // (mm)
|
||||||
|
|
||||||
|
// Maximum reachable area
|
||||||
|
#define DELTA_MAX_RADIUS 140.0 // (mm)
|
||||||
|
|
||||||
// Center-to-center distance of the holes in the diagonal push rods.
|
// Center-to-center distance of the holes in the diagonal push rods.
|
||||||
#define DELTA_DIAGONAL_ROD 250.0 // (mm)
|
#define DELTA_DIAGONAL_ROD 250.0 // (mm)
|
||||||
|
|
||||||
@@ -1065,8 +1030,7 @@
|
|||||||
// Delta radius and diagonal rod adjustments
|
// Delta radius and diagonal rod adjustments
|
||||||
//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
||||||
//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
||||||
|
#endif
|
||||||
#endif // DELTA
|
|
||||||
|
|
||||||
// @section scara
|
// @section scara
|
||||||
|
|
||||||
@@ -1122,37 +1086,17 @@
|
|||||||
#define TPARA_LINKAGE_1 120 // (mm)
|
#define TPARA_LINKAGE_1 120 // (mm)
|
||||||
#define TPARA_LINKAGE_2 120 // (mm)
|
#define TPARA_LINKAGE_2 120 // (mm)
|
||||||
|
|
||||||
// Height of the Shoulder axis (pivot) relative to the tower floor
|
// TPARA tower offset (position of Tower relative to bed zero position)
|
||||||
#define TPARA_SHOULDER_AXIS_HEIGHT 135.0 // (mm)
|
|
||||||
|
|
||||||
// The position of the last linkage relative to the robot arm origin
|
|
||||||
// (intersection of the base axis and floor) when at the home position
|
|
||||||
#define TPARA_ARM_X_HOME_POS 28.75 // (mm) Measured from shoulder axis to tool holder axis in home position
|
|
||||||
#define TPARA_ARM_Y_HOME_POS 0 // (mm)
|
|
||||||
#define TPARA_ARM_Z_HOME_POS 250.00 // (mm) Measured from tool holder axis to the floor
|
|
||||||
|
|
||||||
// TPARA Workspace offset relative to the tower (position of workspace origin relative to robot Tower origin )
|
|
||||||
// This needs to be reasonably accurate as it defines the printbed position in the TPARA space.
|
// This needs to be reasonably accurate as it defines the printbed position in the TPARA space.
|
||||||
#define TPARA_OFFSET_X 127.0 // (mm) to coincide with minimum radius MIDDLE_DEAD_ZONE_R, and W(0,0,0) is reachable
|
#define TPARA_OFFSET_X 0 // (mm)
|
||||||
#define TPARA_OFFSET_Y 0.0 // (mm)
|
#define TPARA_OFFSET_Y 0 // (mm)
|
||||||
#define TPARA_OFFSET_Z 0.0 // (mm)
|
#define TPARA_OFFSET_Z 0 // (mm)
|
||||||
|
|
||||||
// TPARA tool connection point offset, relative to the tool moving frame origin which is in the last linkage axis,
|
|
||||||
// (TCP: tool center/connection point) of the robot,
|
|
||||||
// the plane of measured offset must be alligned with home position plane
|
|
||||||
#define TPARA_TCP_OFFSET_X 27.0 // (mm) Tool flange: 27 (distance from pivot to bolt holes), extruder tool: 50.0,
|
|
||||||
#define TPARA_TCP_OFFSET_Y 0.0 // (mm)
|
|
||||||
#define TPARA_TCP_OFFSET_Z -65.0 // (mm) Tool flange (bottom): -6 (caution as Z 0 posiion will crash second linkage to the floor, -35 is safe for testing with no tool), extruder tool (depends on extruder): -65.0
|
|
||||||
|
|
||||||
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
||||||
|
|
||||||
// Radius around the center where the arm cannot reach
|
// Radius around the center where the arm cannot reach
|
||||||
// For now use a hardcoded uniform limit, although it should be calculated, or fix a limit for each axis angle
|
#define MIDDLE_DEAD_ZONE_R 0 // (mm)
|
||||||
#define MIDDLE_DEAD_ZONE_R 100 // (mm)
|
#endif
|
||||||
|
|
||||||
// Max angle between L1 and L2
|
|
||||||
#define TPARA_MAX_L1L2_ANGLE 140.0f // (degrees)
|
|
||||||
#endif // AXEL_TPARA
|
|
||||||
|
|
||||||
// @section polar
|
// @section polar
|
||||||
|
|
||||||
@@ -1207,6 +1151,15 @@
|
|||||||
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// @section machine
|
||||||
|
|
||||||
|
// Articulated robot (arm). Joints are directly mapped to axes with no kinematics.
|
||||||
|
//#define ARTICULATED_ROBOT_ARM
|
||||||
|
|
||||||
|
// For a hot wire cutter with parallel horizontal axes (X, I) where the heights of the two wire
|
||||||
|
// ends are controlled by parallel axes (Y, J). Joints are directly mapped to axes (no kinematics).
|
||||||
|
//#define FOAMCUTTER_XYUV
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================== Endstop Settings ===========================
|
//============================== Endstop Settings ===========================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@@ -1428,11 +1381,6 @@
|
|||||||
* 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)
|
|
||||||
// Define to use 4th instead of 6th order motion curve
|
|
||||||
//#define S_CURVE_FACTOR 0.25 // Initial and final acceleration factor, ideally 0.1 to 0.4.
|
|
||||||
// Shouldn't generally require tuning.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Z Probe Options =============================
|
//============================= Z Probe Options =============================
|
||||||
@@ -1557,6 +1505,7 @@
|
|||||||
* For information about this sensor https://github.com/bigtreetech/MicroProbe
|
* For information about this sensor https://github.com/bigtreetech/MicroProbe
|
||||||
*
|
*
|
||||||
* Also requires PROBE_ENABLE_DISABLE
|
* Also requires PROBE_ENABLE_DISABLE
|
||||||
|
* With FT_MOTION requires ENDSTOP_INTERRUPTS_FEATURE
|
||||||
*/
|
*/
|
||||||
//#define BIQU_MICROPROBE_V1 // Triggers HIGH
|
//#define BIQU_MICROPROBE_V1 // Triggers HIGH
|
||||||
//#define BIQU_MICROPROBE_V2 // Triggers LOW
|
//#define BIQU_MICROPROBE_V2 // Triggers LOW
|
||||||
@@ -1584,20 +1533,6 @@
|
|||||||
#define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed
|
#define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed
|
||||||
#define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed
|
#define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed
|
||||||
|
|
||||||
/**
|
|
||||||
* Magnetically Mounted Probe with a Servo mechanism
|
|
||||||
* Probe Deploy and Stow both follow the same basic sequence:
|
|
||||||
* - Rotate the SERVO to its Deployed angle
|
|
||||||
* - Perform XYZ moves to deploy or stow the PROBE
|
|
||||||
* - Rotate the SERVO to its Stowed angle
|
|
||||||
*/
|
|
||||||
//#define MAG_MOUNTED_PROBE_SERVO_NR 0 // Servo Number for this probe
|
|
||||||
#ifdef MAG_MOUNTED_PROBE_SERVO_NR
|
|
||||||
#define MAG_MOUNTED_PROBE_SERVO_ANGLES { 90, 0 } // Servo Angles for Deployed, Stowed
|
|
||||||
#define MAG_MOUNTED_PRE_DEPLOY { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo activation
|
|
||||||
#define MAG_MOUNTED_PRE_STOW { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo deactivation
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe
|
#define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe
|
||||||
#define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock
|
#define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock
|
||||||
#define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
|
#define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
|
||||||
@@ -1705,21 +1640,19 @@
|
|||||||
//#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change
|
//#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define PROBE_WAKEUP_TIME_MS 30 // (ms) Time for the probe to wake up
|
|
||||||
|
|
||||||
// Most probes should stay away from the edges of the bed, but
|
// Most probes should stay away from the edges of the bed, but
|
||||||
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
|
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
|
||||||
#define PROBING_MARGIN 10
|
#define PROBING_MARGIN 10
|
||||||
|
|
||||||
// X and Y axis travel speed between probes.
|
// X and Y axis travel speed (mm/min) between probes.
|
||||||
// Leave undefined to use the average of the current XY homing feedrate.
|
// Leave undefined to use the average of the current XY homing feedrate.
|
||||||
#define XY_PROBE_FEEDRATE (133*60) // (mm/min)
|
#define XY_PROBE_FEEDRATE (133*60)
|
||||||
|
|
||||||
// Feedrate for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
||||||
#define Z_PROBE_FEEDRATE_FAST (4*60) // (mm/min)
|
#define Z_PROBE_FEEDRATE_FAST (4*60)
|
||||||
|
|
||||||
// Feedrate for the "accurate" probe of each point
|
// Feedrate (mm/min) for the "accurate" probe of each point
|
||||||
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) // (mm/min)
|
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Probe Activation Switch
|
* Probe Activation Switch
|
||||||
@@ -1836,17 +1769,17 @@
|
|||||||
// @section stepper drivers
|
// @section stepper drivers
|
||||||
|
|
||||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||||
// :['LOW', 'HIGH']
|
// :{ 0:'Low', 1:'High' }
|
||||||
#define X_ENABLE_ON LOW
|
#define X_ENABLE_ON 0
|
||||||
#define Y_ENABLE_ON LOW
|
#define Y_ENABLE_ON 0
|
||||||
#define Z_ENABLE_ON LOW
|
#define Z_ENABLE_ON 0
|
||||||
#define E_ENABLE_ON LOW // For all extruders
|
#define E_ENABLE_ON 0 // For all extruders
|
||||||
//#define I_ENABLE_ON LOW
|
//#define I_ENABLE_ON 0
|
||||||
//#define J_ENABLE_ON LOW
|
//#define J_ENABLE_ON 0
|
||||||
//#define K_ENABLE_ON LOW
|
//#define K_ENABLE_ON 0
|
||||||
//#define U_ENABLE_ON LOW
|
//#define U_ENABLE_ON 0
|
||||||
//#define V_ENABLE_ON LOW
|
//#define V_ENABLE_ON 0
|
||||||
//#define W_ENABLE_ON LOW
|
//#define W_ENABLE_ON 0
|
||||||
|
|
||||||
// Disable axis steppers immediately when they're not being stepped.
|
// Disable axis steppers immediately when they're not being stepped.
|
||||||
// WARNING: When motors turn off there is a chance of losing position accuracy!
|
// WARNING: When motors turn off there is a chance of losing position accuracy!
|
||||||
@@ -2083,11 +2016,8 @@
|
|||||||
//#define FILAMENT_MOTION_SENSOR
|
//#define FILAMENT_MOTION_SENSOR
|
||||||
|
|
||||||
#if ENABLED(FILAMENT_MOTION_SENSOR)
|
#if ENABLED(FILAMENT_MOTION_SENSOR)
|
||||||
//#define FILAMENT_SWITCH_AND_MOTION // Define separate pins below to sense motion
|
//#define FILAMENT_SWITCH_AND_MOTION
|
||||||
#if ENABLED(FILAMENT_SWITCH_AND_MOTION)
|
#if ENABLED(FILAMENT_SWITCH_AND_MOTION)
|
||||||
|
|
||||||
#define FILAMENT_MOTION_DISTANCE_MM 3.0 // (mm) Missing distance required to trigger runout
|
|
||||||
|
|
||||||
#define NUM_MOTION_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_MOTION#_PIN for each.
|
#define NUM_MOTION_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_MOTION#_PIN for each.
|
||||||
//#define FIL_MOTION1_PIN -1
|
//#define FIL_MOTION1_PIN -1
|
||||||
|
|
||||||
@@ -2123,10 +2053,10 @@
|
|||||||
//#define FIL_MOTION8_STATE LOW
|
//#define FIL_MOTION8_STATE LOW
|
||||||
//#define FIL_MOTION8_PULLUP
|
//#define FIL_MOTION8_PULLUP
|
||||||
//#define FIL_MOTION8_PULLDOWN
|
//#define FIL_MOTION8_PULLDOWN
|
||||||
#endif // FILAMENT_SWITCH_AND_MOTION
|
#endif
|
||||||
#endif // FILAMENT_MOTION_SENSOR
|
#endif
|
||||||
#endif // FILAMENT_RUNOUT_DISTANCE_MM
|
#endif
|
||||||
#endif // FILAMENT_RUNOUT_SENSOR
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================== Bed Leveling ==============================
|
//=============================== Bed Leveling ==============================
|
||||||
@@ -2172,12 +2102,6 @@
|
|||||||
//#define AUTO_BED_LEVELING_UBL
|
//#define AUTO_BED_LEVELING_UBL
|
||||||
//#define MESH_BED_LEVELING
|
//#define MESH_BED_LEVELING
|
||||||
|
|
||||||
/**
|
|
||||||
* Commands to execute at the start of G29 probing,
|
|
||||||
* after switching to the PROBING_TOOL.
|
|
||||||
*/
|
|
||||||
//#define EVENT_GCODE_BEFORE_G29 "M300 P440 S200"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
@@ -2326,7 +2250,7 @@
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
#define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
|
#define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
|
||||||
#define GRID_MAX_POINTS_X 3
|
#define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited.
|
||||||
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
||||||
|
|
||||||
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
|
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
|
||||||
@@ -2962,15 +2886,13 @@
|
|||||||
//
|
//
|
||||||
//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
|
//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
|
||||||
|
|
||||||
/**
|
//
|
||||||
* ANET and Tronxy 20x4 Controller
|
// ANET and Tronxy 20x4 Controller
|
||||||
* LCD2004 display with 5 analog buttons.
|
//
|
||||||
*
|
//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
|
||||||
* NOTE: Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
|
// This LCD is known to be susceptible to electrical interference
|
||||||
* This LCD is known to be susceptible to electrical interference which
|
// which scrambles the display. Pressing any button clears it up.
|
||||||
* scrambles the display. Press any button to clear it up.
|
// This is a LCD2004 display with 5 analog buttons.
|
||||||
*/
|
|
||||||
//#define ZONESTAR_LCD
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD.
|
// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD.
|
||||||
@@ -3158,7 +3080,7 @@
|
|||||||
|
|
||||||
//
|
//
|
||||||
// FYSETC variant of the MINI12864 graphic controller with SD support
|
// FYSETC variant of the MINI12864 graphic controller with SD support
|
||||||
// https://wiki.fysetc.com/docs/Mini12864Panel
|
// https://wiki.fysetc.com/Mini12864_Panel/
|
||||||
//
|
//
|
||||||
//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default
|
//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default
|
||||||
//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on)
|
//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on)
|
||||||
@@ -3247,14 +3169,14 @@
|
|||||||
//
|
//
|
||||||
// Tiny, but very sharp OLED display
|
// Tiny, but very sharp OLED display
|
||||||
//
|
//
|
||||||
//#define MKS_12864OLED // Uses the SH1106 controller
|
//#define MKS_12864OLED // Uses the SH1106 controller (default)
|
||||||
//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
|
//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
|
||||||
|
|
||||||
//
|
//
|
||||||
// Zonestar OLED 128×64 Full Graphics Controller
|
// Zonestar OLED 128×64 Full Graphics Controller
|
||||||
//
|
//
|
||||||
//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller
|
//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller
|
||||||
//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller
|
//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default)
|
||||||
//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller
|
//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3332,7 +3254,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// LCD for Malyan M200/M300 printers
|
// Touch-screen LCD for Malyan M200/M300 printers
|
||||||
//
|
//
|
||||||
//#define MALYAN_LCD
|
//#define MALYAN_LCD
|
||||||
|
|
||||||
@@ -3503,22 +3425,20 @@
|
|||||||
|
|
||||||
#if ENABLED(TFT_COLOR_UI)
|
#if ENABLED(TFT_COLOR_UI)
|
||||||
/**
|
/**
|
||||||
* TFT Font for Color UI. Choose one of the following:
|
* TFT Font for Color_UI. Choose one of the following:
|
||||||
*
|
*
|
||||||
* NOTOSANS - Default font with anti-aliasing. Supports Latin Extended and non-Latin characters.
|
* NOTOSANS - Default font with anti-aliasing. Supports Latin Extended and non-Latin characters.
|
||||||
* UNIFONT - Lightweight font, no anti-aliasing. Supports Latin Extended and non-Latin characters.
|
* UNIFONT - Lightweight font, no anti-aliasing. Supports Latin Extended and non-Latin characters.
|
||||||
* HELVETICA - Lightweight font, no anti-aliasing. Supports Basic Latin (0x0020-0x007F) and Latin-1 Supplement (0x0080-0x00FF) characters only.
|
* HELVETICA - Lightweight font, no anti-aliasing. Supports Basic Latin (0x0020-0x007F) and Latin-1 Supplement (0x0080-0x00FF) characters only.
|
||||||
* :['NOTOSANS', 'UNIFONT', 'HELVETICA']
|
|
||||||
*/
|
*/
|
||||||
#define TFT_FONT NOTOSANS
|
#define TFT_FONT NOTOSANS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TFT Theme for Color UI. Choose one of the following or add a new one to 'Marlin/src/lcd/tft/themes' directory
|
* TFT Theme for Color_UI. Choose one of the following or add a new one to 'Marlin/src/lcd/tft/themes' directory
|
||||||
*
|
*
|
||||||
* BLUE_MARLIN - Default theme with 'midnight blue' background
|
* BLUE_MARLIN - Default theme with 'midnight blue' background
|
||||||
* BLACK_MARLIN - Theme with 'black' background
|
* BLACK_MARLIN - Theme with 'black' background
|
||||||
* ANET_BLACK - Theme used for Anet ET4/5
|
* ANET_BLACK - Theme used for Anet ET4/5
|
||||||
* :['BLUE_MARLIN', 'BLACK_MARLIN', 'ANET_BLACK']
|
|
||||||
*/
|
*/
|
||||||
#define TFT_THEME BLACK_MARLIN
|
#define TFT_THEME BLACK_MARLIN
|
||||||
|
|
||||||
@@ -3538,8 +3458,6 @@
|
|||||||
* TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y,
|
* TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y,
|
||||||
* TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y,
|
* TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y,
|
||||||
* TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION
|
* TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION
|
||||||
*
|
|
||||||
* :{ 'TFT_NO_ROTATION':'None', 'TFT_ROTATE_90':'90°', 'TFT_ROTATE_90_MIRROR_X':'90° (Mirror X)', 'TFT_ROTATE_90_MIRROR_Y':'90° (Mirror Y)', 'TFT_ROTATE_180':'180°', 'TFT_ROTATE_180_MIRROR_X':'180° (Mirror X)', 'TFT_ROTATE_180_MIRROR_Y':'180° (Mirror Y)', 'TFT_ROTATE_270':'270°', 'TFT_ROTATE_270_MIRROR_X':'270° (Mirror X)', 'TFT_ROTATE_270_MIRROR_Y':'270° (Mirror Y)', 'TFT_MIRROR_X':'Mirror X', 'TFT_MIRROR_Y':'Mirror Y' }
|
|
||||||
*/
|
*/
|
||||||
//#define TFT_ROTATION TFT_NO_ROTATION
|
//#define TFT_ROTATION TFT_NO_ROTATION
|
||||||
|
|
||||||
@@ -3556,11 +3474,6 @@
|
|||||||
//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
|
//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
|
||||||
//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
|
//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
|
||||||
|
|
||||||
#if ENABLED(DWIN_CREALITY_LCD)
|
|
||||||
//#define USE_STRING_HEADINGS // Use string headings for Creality UI instead of images
|
|
||||||
//#define USE_STRING_TITLES // Use string titles for Creality UI instead of images
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Touch Screen Settings
|
// Touch Screen Settings
|
||||||
//
|
//
|
||||||
@@ -3595,9 +3508,7 @@
|
|||||||
// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/
|
// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/
|
||||||
//
|
//
|
||||||
//#define REPRAPWORLD_KEYPAD
|
//#define REPRAPWORLD_KEYPAD
|
||||||
#if ENABLED(REPRAPWORLD_KEYPAD)
|
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
|
||||||
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EasyThreeD ET-4000+ with button input and status LED
|
// EasyThreeD ET-4000+ with button input and status LED
|
||||||
@@ -3614,26 +3525,22 @@
|
|||||||
// :[1,2,3,4,5,6,7,8]
|
// :[1,2,3,4,5,6,7,8]
|
||||||
//#define NUM_M106_FANS 1
|
//#define NUM_M106_FANS 1
|
||||||
|
|
||||||
/**
|
// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
|
||||||
* Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
|
// which is not as annoying as with the hardware PWM. On the other hand, if this frequency
|
||||||
* which is not as annoying as with the hardware PWM. On the other hand, if this frequency
|
// is too low, you should also increment SOFT_PWM_SCALE.
|
||||||
* is too low, you should also increment SOFT_PWM_SCALE.
|
|
||||||
*/
|
|
||||||
//#define FAN_SOFT_PWM
|
//#define FAN_SOFT_PWM
|
||||||
|
|
||||||
/**
|
// Incrementing this by 1 will double the software PWM frequency,
|
||||||
* Incrementing this by 1 will double the software PWM frequency, affecting heaters, and
|
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
|
||||||
* the fan if FAN_SOFT_PWM is enabled. However, control resolution will be halved for each
|
// However, control resolution will be halved for each increment;
|
||||||
* increment; at zero value, there are 128 effective control positions.
|
// at zero value, there are 128 effective control positions.
|
||||||
* :[0,1,2,3,4,5,6,7]
|
// :[0,1,2,3,4,5,6,7]
|
||||||
*/
|
|
||||||
#define SOFT_PWM_SCALE 0
|
#define SOFT_PWM_SCALE 0
|
||||||
|
|
||||||
/**
|
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
|
||||||
* If SOFT_PWM_SCALE is set to a value higher than 0, dithering can be used to mitigate the
|
// be used to mitigate the associated resolution loss. If enabled,
|
||||||
* associated resolution loss. If enabled, some of the PWM cycles are stretched so on average
|
// some of the PWM cycles are stretched so on average the desired
|
||||||
* the desired duty cycle is attained.
|
// duty cycle is attained.
|
||||||
*/
|
|
||||||
//#define SOFT_PWM_DITHER
|
//#define SOFT_PWM_DITHER
|
||||||
|
|
||||||
// @section extras
|
// @section extras
|
||||||
@@ -3643,11 +3550,9 @@
|
|||||||
|
|
||||||
// @section lights
|
// @section lights
|
||||||
|
|
||||||
/**
|
// Temperature status LEDs that display the hotend and bed temperature.
|
||||||
* Temperature status LEDs that display the hotend and bed temperature.
|
// If all hotends, bed temperature, and target temperature are under 54C
|
||||||
* If all hotends, bed temperature, and target temperature are under 54C
|
// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
|
||||||
* the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
|
|
||||||
*/
|
|
||||||
//#define TEMP_STAT_LEDS
|
//#define TEMP_STAT_LEDS
|
||||||
|
|
||||||
// Support for BlinkM/CyzRgb
|
// Support for BlinkM/CyzRgb
|
||||||
|
|||||||
+149
-263
@@ -174,10 +174,9 @@
|
|||||||
* Thermocouple Options — for MAX6675 (-2), MAX31855 (-3), and MAX31865 (-5).
|
* Thermocouple Options — for MAX6675 (-2), MAX31855 (-3), and MAX31865 (-5).
|
||||||
*/
|
*/
|
||||||
//#define TEMP_SENSOR_FORCE_HW_SPI // Ignore SCK/MOSI/MISO pins; use CS and the default SPI bus.
|
//#define TEMP_SENSOR_FORCE_HW_SPI // Ignore SCK/MOSI/MISO pins; use CS and the default SPI bus.
|
||||||
//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board.
|
//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board.
|
||||||
//#define MAX31865_SENSOR_WIRES_1 2
|
//#define MAX31865_SENSOR_WIRES_1 2
|
||||||
//#define MAX31865_SENSOR_WIRES_2 2
|
//#define MAX31865_SENSOR_WIRES_2 2
|
||||||
//#define MAX31865_SENSOR_WIRES_BED 2
|
|
||||||
|
|
||||||
//#define MAX31865_50HZ_FILTER // Use a 50Hz filter instead of the default 60Hz.
|
//#define MAX31865_50HZ_FILTER // Use a 50Hz filter instead of the default 60Hz.
|
||||||
//#define MAX31865_USE_READ_ERROR_DETECTION // Treat value spikes (20°C delta in under 1s) as read errors.
|
//#define MAX31865_USE_READ_ERROR_DETECTION // Treat value spikes (20°C delta in under 1s) as read errors.
|
||||||
@@ -189,7 +188,6 @@
|
|||||||
//#define MAX31865_WIRE_OHMS_0 0.95f // For 2-wire, set the wire resistances for more accurate readings.
|
//#define MAX31865_WIRE_OHMS_0 0.95f // For 2-wire, set the wire resistances for more accurate readings.
|
||||||
//#define MAX31865_WIRE_OHMS_1 0.0f
|
//#define MAX31865_WIRE_OHMS_1 0.0f
|
||||||
//#define MAX31865_WIRE_OHMS_2 0.0f
|
//#define MAX31865_WIRE_OHMS_2 0.0f
|
||||||
//#define MAX31865_WIRE_OHMS_BED 0.0f
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hephestos 2 24V heated bed upgrade kit.
|
* Hephestos 2 24V heated bed upgrade kit.
|
||||||
@@ -213,19 +211,18 @@
|
|||||||
//
|
//
|
||||||
// Heated Chamber options
|
// Heated Chamber options
|
||||||
//
|
//
|
||||||
|
#if DISABLED(PIDTEMPCHAMBER)
|
||||||
|
#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
||||||
|
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
||||||
|
#define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TEMP_SENSOR_CHAMBER
|
#if TEMP_SENSOR_CHAMBER
|
||||||
//#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug)
|
//#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug)
|
||||||
//#define HEATER_CHAMBER_INVERTING false
|
//#define HEATER_CHAMBER_INVERTING false
|
||||||
//#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug)
|
//#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug)
|
||||||
|
|
||||||
#if DISABLED(PIDTEMPCHAMBER)
|
|
||||||
#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
|
||||||
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
|
||||||
#define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define CHAMBER_FAN // Enable a fan on the chamber
|
//#define CHAMBER_FAN // Enable a fan on the chamber
|
||||||
#if ENABLED(CHAMBER_FAN)
|
#if ENABLED(CHAMBER_FAN)
|
||||||
//#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
|
//#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
|
||||||
@@ -297,7 +294,7 @@
|
|||||||
* protect against a broken or disconnected thermistor wire.
|
* protect against a broken or disconnected thermistor wire.
|
||||||
*
|
*
|
||||||
* The issue: If a thermistor falls out, it will report the much lower
|
* The issue: If a thermistor falls out, it will report the much lower
|
||||||
* temperature of the air in the room, and the firmware will keep
|
* temperature of the air in the room, and the the firmware will keep
|
||||||
* the heater on.
|
* the heater on.
|
||||||
*
|
*
|
||||||
* The solution: Once the temperature reaches the target, start observing.
|
* The solution: Once the temperature reaches the target, start observing.
|
||||||
@@ -415,19 +412,14 @@
|
|||||||
// A well-chosen Kc value should add just enough power to melt the increased material volume.
|
// A well-chosen Kc value should add just enough power to melt the increased material volume.
|
||||||
//#define PID_EXTRUSION_SCALING
|
//#define PID_EXTRUSION_SCALING
|
||||||
#if ENABLED(PID_EXTRUSION_SCALING)
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
||||||
|
#define DEFAULT_Kc (100) // heating power = Kc * e_speed
|
||||||
#define LPQ_MAX_LEN 50
|
#define LPQ_MAX_LEN 50
|
||||||
#define DEFAULT_KC 100 // heating power = Kc * e_speed
|
|
||||||
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
|
||||||
// Specify up to one value per hotend here, according to your setup.
|
|
||||||
// If there are fewer values, the last one applies to the remaining hotends.
|
|
||||||
#define DEFAULT_KC_LIST { DEFAULT_KC, DEFAULT_KC } // heating power = Kc * e_speed
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an additional term to the heater power, proportional to the fan speed.
|
* Add an additional term to the heater power, proportional to the fan speed.
|
||||||
* A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
|
* A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
|
||||||
* You can either just add a constant compensation with the DEFAULT_KF value
|
* You can either just add a constant compensation with the DEFAULT_Kf value
|
||||||
* or follow the instruction below to get speed-dependent compensation.
|
* or follow the instruction below to get speed-dependent compensation.
|
||||||
*
|
*
|
||||||
* Constant compensation (use only with fan speeds of 0% and 100%)
|
* Constant compensation (use only with fan speeds of 0% and 100%)
|
||||||
@@ -458,26 +450,21 @@
|
|||||||
#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
|
#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
|
||||||
// The alternative definition is used for an easier configuration.
|
// The alternative definition is used for an easier configuration.
|
||||||
// Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED.
|
// Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED.
|
||||||
// DEFAULT_KF and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
|
// DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
|
||||||
|
|
||||||
#define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_KF
|
#define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf
|
||||||
#define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_KF
|
#define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf
|
||||||
#define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
|
#define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
|
||||||
|
|
||||||
#define DEFAULT_KF (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
|
#define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
|
||||||
#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
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
|
||||||
// Specify up to one value per hotend here, according to your setup.
|
|
||||||
// If there are fewer values, the last one applies to the remaining hotends.
|
|
||||||
#define DEFAULT_KF_LIST { DEFAULT_KF, DEFAULT_KF }
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -496,15 +483,15 @@
|
|||||||
#define AUTOTEMP
|
#define AUTOTEMP
|
||||||
#if ENABLED(AUTOTEMP)
|
#if ENABLED(AUTOTEMP)
|
||||||
#define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0)
|
#define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0)
|
||||||
#define AUTOTEMP_MIN 210
|
#define AUTOTEMP_MIN 210
|
||||||
#define AUTOTEMP_MAX 250
|
#define AUTOTEMP_MAX 250
|
||||||
#define AUTOTEMP_FACTOR 0.1f
|
#define AUTOTEMP_FACTOR 0.1f
|
||||||
// Turn on AUTOTEMP on M104/M109 by default using proportions set here
|
// Turn on AUTOTEMP on M104/M109 by default using proportions set here
|
||||||
//#define AUTOTEMP_PROPORTIONAL
|
//#define AUTOTEMP_PROPORTIONAL
|
||||||
#if ENABLED(AUTOTEMP_PROPORTIONAL)
|
#if ENABLED(AUTOTEMP_PROPORTIONAL)
|
||||||
#define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature
|
#define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature
|
||||||
#define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature
|
#define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature
|
||||||
#define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F)
|
#define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -788,7 +775,7 @@
|
|||||||
|
|
||||||
// @section endstops
|
// @section endstops
|
||||||
|
|
||||||
// If you want endstops to stay on (by default) even when not homing,
|
// If you want endstops to stay on (by default) even when not homing
|
||||||
// enable this option. Override at any time with M120, M121.
|
// enable this option. Override at any time with M120, M121.
|
||||||
//#define ENDSTOPS_ALWAYS_ON_DEFAULT
|
//#define ENDSTOPS_ALWAYS_ON_DEFAULT
|
||||||
|
|
||||||
@@ -1032,7 +1019,7 @@
|
|||||||
|
|
||||||
#endif // BLTOUCH
|
#endif // BLTOUCH
|
||||||
|
|
||||||
// @section calibrate
|
// @section calibration
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Z Steppers Auto-Alignment
|
* Z Steppers Auto-Alignment
|
||||||
@@ -1091,26 +1078,11 @@
|
|||||||
#define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle
|
#define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle
|
||||||
#define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment
|
#define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment
|
||||||
#define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this
|
#define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this
|
||||||
|
|
||||||
#define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done?
|
#define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done?
|
||||||
|
|
||||||
// After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
|
// After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
|
||||||
// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
|
// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
|
||||||
#define HOME_AFTER_G34
|
#define HOME_AFTER_G34
|
||||||
|
#endif
|
||||||
/**
|
|
||||||
* Commands to execute at the start of G34 probing,
|
|
||||||
* after switching to the PROBING_TOOL.
|
|
||||||
*/
|
|
||||||
//#define EVENT_GCODE_BEFORE_G34 "M300 P440 S200"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Commands to execute at the end of G34 probing.
|
|
||||||
* Useful to retract or move the Z probe out of the way.
|
|
||||||
*/
|
|
||||||
//#define EVENT_GCODE_AFTER_G34 "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10"
|
|
||||||
|
|
||||||
#endif // Z_STEPPER_AUTO_ALIGN
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assisted Tramming
|
* Assisted Tramming
|
||||||
@@ -1153,76 +1125,67 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Fixed-time-based Motion Control -- BETA FEATURE
|
* Fixed-time-based Motion Control -- BETA FEATURE
|
||||||
* Enable/disable and set parameters with G-code M493 and M494.
|
* Enable/disable and set parameters with G-code M493.
|
||||||
* See ft_types.h for named values used by FTM options.
|
* See ft_types.h for named values used by FTM options.
|
||||||
*/
|
*/
|
||||||
//#define FT_MOTION
|
//#define FT_MOTION
|
||||||
#if ENABLED(FT_MOTION)
|
#if ENABLED(FT_MOTION)
|
||||||
//#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default?
|
//#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default?
|
||||||
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 and M494 parameters
|
|
||||||
//#define FTM_HOME_AND_PROBE // Use FT Motion for homing / probing. Disable if FT Motion breaks these functions.
|
|
||||||
|
|
||||||
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
|
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
|
||||||
|
|
||||||
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
|
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
|
||||||
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
|
|
||||||
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
|
|
||||||
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
|
|
||||||
|
|
||||||
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
|
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
|
||||||
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
|
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
|
||||||
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
|
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
|
||||||
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
|
#define FTM_LINEAR_ADV_DEFAULT_ENA false // Default linear advance enable (true) or disable (false)
|
||||||
|
#define FTM_LINEAR_ADV_DEFAULT_K 0.0f // Default linear advance gain. (Acceleration-based scaling factor.)
|
||||||
|
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
|
||||||
|
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
|
||||||
|
|
||||||
//#define FTM_SHAPER_Z // Include Z shaping support
|
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
|
||||||
#define FTM_DEFAULT_SHAPER_Z ftMotionShaper_NONE // Default shaper mode on Z axis
|
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
|
||||||
#define FTM_SHAPING_DEFAULT_FREQ_Z 21.0f // (Hz) Default peak frequency used by input shapers
|
|
||||||
#define FTM_SHAPING_ZETA_Z 0.03f // Zeta used by input shapers for Z axis
|
|
||||||
#define FTM_SHAPING_V_TOL_Z 0.05f // Vibration tolerance used by EI input shapers for Z axis
|
|
||||||
|
|
||||||
//#define FTM_SHAPER_E // Include E shaping support
|
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 parameters
|
||||||
// Required to synchronize extruder with XYZ (better quality)
|
|
||||||
#define FTM_DEFAULT_SHAPER_E ftMotionShaper_NONE // Default shaper mode on Extruder axis
|
|
||||||
#define FTM_SHAPING_DEFAULT_FREQ_E 21.0f // (Hz) Default peak frequency used by input shapers
|
|
||||||
#define FTM_SHAPING_ZETA_E 0.03f // Zeta used by input shapers for E axis
|
|
||||||
#define FTM_SHAPING_V_TOL_E 0.05f // Vibration tolerance used by EI input shapers for E axis
|
|
||||||
|
|
||||||
//#define FTM_RESONANCE_TEST // Sine sweep motion for resonance study
|
|
||||||
|
|
||||||
//#define FTM_SMOOTHING // Smoothing can reduce artifacts and make steppers quieter
|
|
||||||
// on sharp corners, but too much will round corners.
|
|
||||||
#if ENABLED(FTM_SMOOTHING)
|
|
||||||
#define FTM_MAX_SMOOTHING_TIME 0.10f // (s) Maximum smoothing time. Higher values consume more RAM.
|
|
||||||
// Increase smoothing time to reduce jerky motion, ghosting and noises.
|
|
||||||
#define FTM_SMOOTHING_TIME_X 0.00f // (s) Smoothing time for X axis. Zero means disabled.
|
|
||||||
#define FTM_SMOOTHING_TIME_Y 0.00f // (s) Smoothing time for Y axis
|
|
||||||
#define FTM_SMOOTHING_TIME_Z 0.00f // (s) Smoothing time for Z axis
|
|
||||||
#define FTM_SMOOTHING_TIME_E 0.02f // (s) Smoothing time for E axis. Prevents noise/skipping from LA by
|
|
||||||
// smoothing acceleration peaks, which may also smooth curved surfaces.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FTM_POLYS // Disable POLY5/6 to save ~3k of Flash. Preserves TRAPEZOIDAL.
|
|
||||||
#if ENABLED(FTM_POLYS)
|
|
||||||
#define FTM_TRAJECTORY_TYPE TRAPEZOIDAL // Block acceleration profile (TRAPEZOIDAL, POLY5, POLY6)
|
|
||||||
// TRAPEZOIDAL: Continuous Velocity. Max acceleration is respected.
|
|
||||||
// POLY5: Like POLY6 with 1.5x but uses less CPU.
|
|
||||||
// POLY6: Continuous Acceleration (aka S_CURVE).
|
|
||||||
// POLY trajectories not only reduce resonances without rounding corners, but also
|
|
||||||
// reduce extruder strain due to linear advance.
|
|
||||||
|
|
||||||
#define FTM_POLY6_ACCELERATION_OVERSHOOT 1.875f // Max acceleration overshoot factor for POLY6 (1.25 to 1.875)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advanced configuration
|
* Advanced configuration
|
||||||
*/
|
*/
|
||||||
#define FTM_BUFFER_SIZE 128 // Window size for trajectory generation, must be a power of 2 (e.g 64, 128, 256, ...)
|
#define FTM_UNIFIED_BWS // DON'T DISABLE unless you use Ulendo FBS (not implemented)
|
||||||
// The total buffered time in seconds is (FTM_BUFFER_SIZE/FTM_FS)
|
#if ENABLED(FTM_UNIFIED_BWS)
|
||||||
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation.
|
#define FTM_BW_SIZE 100 // Unified Window and Batch size with a ratio of 2
|
||||||
#define FTM_STEPPER_FS 2'000'000 // (Hz) Time resolution of stepper I/O update. Shouldn't affect CPU much (slower board testing needed)
|
#else
|
||||||
#define FTM_MIN_SHAPE_FREQ 20 // (Hz) Minimum shaping frequency, lower consumes more RAM
|
#define FTM_WINDOW_SIZE 200 // Custom Window size for trajectory generation needed by Ulendo FBS
|
||||||
|
#define FTM_BATCH_SIZE 100 // Custom Batch size for trajectory generation needed by Ulendo FBS
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // FT_MOTION
|
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation. (Reciprocal of FTM_TS)
|
||||||
|
#define FTM_TS 0.001f // (s) Time step for trajectory generation. (Reciprocal of FTM_FS)
|
||||||
|
|
||||||
|
#if DISABLED(COREXY)
|
||||||
|
#define FTM_STEPPER_FS 20000 // (Hz) Frequency for stepper I/O update
|
||||||
|
|
||||||
|
// Use this to adjust the time required to consume the command buffer.
|
||||||
|
// Try increasing this value if stepper motion is choppy.
|
||||||
|
#define FTM_STEPPERCMD_BUFF_SIZE 3000 // Size of the stepper command buffers
|
||||||
|
|
||||||
|
#else
|
||||||
|
// CoreXY motion needs a larger buffer size. These values are based on our testing.
|
||||||
|
#define FTM_STEPPER_FS 30000
|
||||||
|
#define FTM_STEPPERCMD_BUFF_SIZE 6000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FTM_STEPS_PER_UNIT_TIME (FTM_STEPPER_FS / FTM_FS) // Interpolated stepper commands per unit time
|
||||||
|
#define FTM_CTS_COMPARE_VAL (FTM_STEPS_PER_UNIT_TIME / 2) // Comparison value used in interpolation algorithm
|
||||||
|
#define FTM_MIN_TICKS ((STEPPER_TIMER_RATE) / (FTM_STEPPER_FS)) // Minimum stepper ticks between steps
|
||||||
|
|
||||||
|
#define FTM_MIN_SHAPE_FREQ 10 // Minimum shaping frequency
|
||||||
|
#define FTM_RATIO (FTM_FS / FTM_MIN_SHAPE_FREQ) // Factor for use in FTM_ZMAX. DON'T CHANGE.
|
||||||
|
#define FTM_ZMAX (FTM_RATIO * 2) // Maximum delays for shaping functions (even numbers only!)
|
||||||
|
// Calculate as:
|
||||||
|
// ZV : FTM_RATIO / 2
|
||||||
|
// ZVD, MZV : FTM_RATIO
|
||||||
|
// 2HEI : FTM_RATIO * 3 / 2
|
||||||
|
// 3HEI : FTM_RATIO * 2
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input Shaping
|
* Input Shaping
|
||||||
@@ -1297,8 +1260,8 @@
|
|||||||
#define DISABLE_IDLE_E // Shut down all idle extruders
|
#define DISABLE_IDLE_E // Shut down all idle extruders
|
||||||
|
|
||||||
// Default Minimum Feedrates for printing and travel moves
|
// Default Minimum Feedrates for printing and travel moves
|
||||||
#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S.
|
#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s. °/s for rotational-only moves) Minimum feedrate. Set with M205 S.
|
||||||
#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T.
|
#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s. °/s for rotational-only moves) Minimum travel feedrate. Set with M205 T.
|
||||||
|
|
||||||
// Minimum time that a segment needs to take as the buffer gets emptied
|
// Minimum time that a segment needs to take as the buffer gets emptied
|
||||||
#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B.
|
#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B.
|
||||||
@@ -1376,20 +1339,20 @@
|
|||||||
//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
|
//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
|
||||||
//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"
|
//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"
|
||||||
|
|
||||||
#define CALIBRATION_FEEDRATE_SLOW 60 // (mm/min)
|
#define CALIBRATION_FEEDRATE_SLOW 60 // mm/min
|
||||||
#define CALIBRATION_FEEDRATE_FAST 1200 // (mm/min)
|
#define CALIBRATION_FEEDRATE_FAST 1200 // mm/min
|
||||||
#define CALIBRATION_FEEDRATE_TRAVEL 3000 // (mm/min)
|
#define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min
|
||||||
|
|
||||||
// The following parameters refer to the conical section of the nozzle tip.
|
// The following parameters refer to the conical section of the nozzle tip.
|
||||||
#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 flash).
|
// 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.
|
||||||
#define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // (mm)
|
#define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm
|
||||||
#define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // (mm)
|
#define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm
|
||||||
|
|
||||||
// Comment out any sides which are unreachable by the probe. For best
|
// Comment out any sides which are unreachable by the probe. For best
|
||||||
// auto-calibration results, all sides must be reachable.
|
// auto-calibration results, all sides must be reachable.
|
||||||
@@ -1428,7 +1391,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 16 // :[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
|
||||||
@@ -1453,24 +1416,24 @@
|
|||||||
#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16]
|
#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @section stepper motor current
|
* @section stepper motor current
|
||||||
*
|
*
|
||||||
* Some boards have a means of setting the stepper motor current via firmware.
|
* Some boards have a means of setting the stepper motor current via firmware.
|
||||||
*
|
*
|
||||||
* The power on motor currents are set by:
|
* The power on motor currents are set by:
|
||||||
* PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2
|
* PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2
|
||||||
* known compatible chips: A4982
|
* known compatible chips: A4982
|
||||||
* DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H
|
* DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H
|
||||||
* known compatible chips: AD5206
|
* known compatible chips: AD5206
|
||||||
* DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2
|
* DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2
|
||||||
* known compatible chips: MCP4728
|
* known compatible chips: MCP4728
|
||||||
* DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE
|
* DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE
|
||||||
* known compatible chips: MCP4451, MCP4018
|
* known compatible chips: MCP4451, MCP4018
|
||||||
*
|
*
|
||||||
* Motor currents can also be set by M907 - M910 and by the LCD.
|
* Motor currents can also be set by M907 - M910 and by the LCD.
|
||||||
* M907 - applies to all.
|
* M907 - applies to all.
|
||||||
* M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H
|
* M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H
|
||||||
* M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2
|
* M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2
|
||||||
*/
|
*/
|
||||||
//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps
|
//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps
|
||||||
//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
|
//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
|
||||||
@@ -1585,7 +1548,6 @@
|
|||||||
//#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
|
||||||
//#define BUILD_INFO_MENU_ITEM // Add a menu item to display the build date and time
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1641,7 +1603,7 @@
|
|||||||
#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, HAS_MARLINUI_HD44780, HAS_GRAPHICAL_TFT)
|
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780)
|
||||||
//#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.
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -1653,10 +1615,6 @@
|
|||||||
//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
|
//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
|
||||||
#define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state
|
#define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state
|
||||||
|
|
||||||
#if ENABLED(U8GLIB_SSD1309)
|
|
||||||
//#define LCD_DOUBLE_BUFFER // Optimize display updates. Costs ~1K of SRAM.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_WIRED_LCD
|
#if HAS_WIRED_LCD
|
||||||
//#define DOUBLE_LCD_FRAMERATE // Not recommended for slow boards.
|
//#define DOUBLE_LCD_FRAMERATE // Not recommended for slow boards.
|
||||||
#endif
|
#endif
|
||||||
@@ -1707,12 +1665,11 @@
|
|||||||
|
|
||||||
#endif // HAS_DISPLAY
|
#endif // HAS_DISPLAY
|
||||||
|
|
||||||
// Some displays offer Feedrate / Flow editing.
|
#if HAS_FEEDRATE_EDIT
|
||||||
#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN, ULTIPANEL_FEEDMULTIPLY)
|
|
||||||
#define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum
|
#define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum
|
||||||
#define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum
|
#define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum
|
||||||
#endif
|
#endif
|
||||||
#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
|
#if HAS_FLOW_EDIT
|
||||||
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
|
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
|
||||||
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
|
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
|
||||||
#endif
|
#endif
|
||||||
@@ -1808,8 +1765,6 @@
|
|||||||
//#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_HEAT_BED_ON_REBOOT // Heat up bed immediately on reboot to mitigate object detaching/warping.
|
|
||||||
//#define PLR_HEAT_BED_EXTRA 0 // (°C) Relative increase of bed temperature for better adhesion (limited by max temp).
|
|
||||||
//#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 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, or comment to use board default.
|
||||||
@@ -1873,7 +1828,6 @@
|
|||||||
#define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
|
#define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
|
||||||
#define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
|
#define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
|
||||||
// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
|
// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
|
||||||
#define SDSORT_QUICK true // Use Quick Sort as a sorting algorithm. Otherwise use Bubble Sort.
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Allow international symbols in long filenames. To display correctly, the
|
// Allow international symbols in long filenames. To display correctly, the
|
||||||
@@ -1912,7 +1866,7 @@
|
|||||||
*
|
*
|
||||||
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
|
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
|
||||||
* INT --> SD_DETECT_PIN [1]
|
* INT --> SD_DETECT_PIN [1]
|
||||||
* SS --> SD_SS_PIN
|
* SS --> SDSS
|
||||||
*
|
*
|
||||||
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
|
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
|
||||||
*/
|
*/
|
||||||
@@ -1939,7 +1893,7 @@
|
|||||||
//#define USE_OTG_USB_HOST
|
//#define USE_OTG_USB_HOST
|
||||||
|
|
||||||
#if DISABLED(USE_OTG_USB_HOST)
|
#if DISABLED(USE_OTG_USB_HOST)
|
||||||
#define USB_CS_PIN SD_SS_PIN
|
#define USB_CS_PIN SDSS
|
||||||
#define USB_INTR_PIN SD_DETECT_PIN
|
#define USB_INTR_PIN SD_DETECT_PIN
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -1976,9 +1930,6 @@
|
|||||||
//#define CUSTOM_FIRMWARE_UPLOAD
|
//#define CUSTOM_FIRMWARE_UPLOAD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// "Over-the-air" Firmware Update with M936 - Required to set EEPROM flag
|
|
||||||
//#define OTA_FIRMWARE_UPDATE
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set this option to one of the following (or the board's defaults apply):
|
* Set this option to one of the following (or the board's defaults apply):
|
||||||
*
|
*
|
||||||
@@ -2001,8 +1952,8 @@
|
|||||||
#if ENABLED(MULTI_VOLUME)
|
#if ENABLED(MULTI_VOLUME)
|
||||||
#define VOLUME_SD_ONBOARD
|
#define VOLUME_SD_ONBOARD
|
||||||
#define VOLUME_USB_FLASH_DRIVE
|
#define VOLUME_USB_FLASH_DRIVE
|
||||||
#define DEFAULT_VOLUME SD_ONBOARD // :[ 'SD_ONBOARD', 'USB_FLASH_DRIVE' ]
|
#define DEFAULT_VOLUME SV_SD_ONBOARD
|
||||||
#define DEFAULT_SHARED_VOLUME USB_FLASH_DRIVE // :[ 'SD_ONBOARD', 'USB_FLASH_DRIVE' ]
|
#define DEFAULT_SHARED_VOLUME SV_USB_FLASH_DRIVE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_MEDIA
|
#endif // HAS_MEDIA
|
||||||
@@ -2053,7 +2004,7 @@
|
|||||||
#if IS_U8GLIB_ST7920
|
#if IS_U8GLIB_ST7920
|
||||||
// Enable this option and reduce the value to optimize screen updates.
|
// Enable this option and reduce the value to optimize screen updates.
|
||||||
// The normal delay is 10µs. Use the lowest value that still gives a reliable display.
|
// The normal delay is 10µs. Use the lowest value that still gives a reliable display.
|
||||||
//#define DOGM_SPI_DELAY_US 5 // (µs) Delay after each SPI transfer
|
//#define DOGM_SPI_DELAY_US 5
|
||||||
|
|
||||||
//#define LIGHTWEIGHT_UI
|
//#define LIGHTWEIGHT_UI
|
||||||
#if ENABLED(LIGHTWEIGHT_UI)
|
#if ENABLED(LIGHTWEIGHT_UI)
|
||||||
@@ -2083,17 +2034,17 @@
|
|||||||
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
|
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
|
||||||
//#define STATUS_HEAT_POWER // Show heater output power as a vertical bar
|
//#define STATUS_HEAT_POWER // Show heater output power as a vertical bar
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB
|
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB || IS_DWIN_MARLINUI
|
|
||||||
#define MENU_HOLLOW_FRAME // Enable to save many cycles by drawing a hollow frame on Menu Screens
|
|
||||||
//#define OVERLAY_GFX_REVERSE // Swap the CW/CCW indicators in the graphics overlay
|
|
||||||
|
|
||||||
// Frivolous Game Options
|
// Frivolous Game Options
|
||||||
//#define MARLIN_BRICKOUT
|
//#define MARLIN_BRICKOUT
|
||||||
//#define MARLIN_INVADERS
|
//#define MARLIN_INVADERS
|
||||||
//#define MARLIN_SNAKE
|
//#define MARLIN_SNAKE
|
||||||
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
|
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
|
||||||
|
|
||||||
|
#endif // HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
|
#if HAS_MARLINUI_U8GLIB || IS_DWIN_MARLINUI
|
||||||
|
#define MENU_HOLLOW_FRAME // Enable to save many cycles by drawing a hollow frame on Menu Screens
|
||||||
|
//#define OVERLAY_GFX_REVERSE // Swap the CW/CCW indicators in the graphics overlay
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2272,7 +2223,7 @@
|
|||||||
|
|
||||||
// Developer menu (accessed by touching "About Printer" copyright text)
|
// Developer menu (accessed by touching "About Printer" copyright text)
|
||||||
//#define TOUCH_UI_DEVELOPER_MENU
|
//#define TOUCH_UI_DEVELOPER_MENU
|
||||||
#endif // TOUCH_UI_FTDI_EVE
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Classic UI Options
|
// Classic UI Options
|
||||||
@@ -2306,11 +2257,9 @@
|
|||||||
// ADC Button Debounce
|
// ADC Button Debounce
|
||||||
//
|
//
|
||||||
#if HAS_ADC_BUTTONS
|
#if HAS_ADC_BUTTONS
|
||||||
#define ADC_BUTTON_DEBOUNCE_DELAY 16 // (count) Increase if buttons bounce or repeat too fast
|
#define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define FAST_BUTTON_POLLING // Poll buttons at ~1kHz on 8-bit AVR. Set to 'false' for slow polling on 32-bit.
|
|
||||||
|
|
||||||
// @section safety
|
// @section safety
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2349,7 +2298,7 @@
|
|||||||
|
|
||||||
//#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 // (ms) Maximum interval between clicks.
|
#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
|
||||||
// Note: Extra time may be added to mitigate controller latency.
|
// Note: Extra time may be added to mitigate controller latency.
|
||||||
//#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on double-click when printer is idle.
|
//#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on double-click when printer is idle.
|
||||||
#if ENABLED(MOVE_Z_WHEN_IDLE)
|
#if ENABLED(MOVE_Z_WHEN_IDLE)
|
||||||
@@ -2384,37 +2333,15 @@
|
|||||||
* 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 ANY(LIN_ADVANCE, FT_MOTION)
|
|
||||||
#if ENABLED(DISTINCT_E_FACTORS)
|
|
||||||
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder. Override with 'M900 T<tool> K<mm>'.
|
|
||||||
#else
|
|
||||||
#define ADVANCE_K 0.22 // (mm) Compression length for all extruders. Override with 'M900 K<mm>'.
|
|
||||||
#endif
|
|
||||||
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with 'M900 L'.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
|
#if ENABLED(DISTINCT_E_FACTORS)
|
||||||
|
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder
|
||||||
|
#else
|
||||||
|
#define ADVANCE_K 0.22 // (mm) Compression length applying to all extruders
|
||||||
|
#endif
|
||||||
|
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with M900 L.
|
||||||
//#define LA_DEBUG // Print debug information to serial during operation. Disable for production use.
|
//#define LA_DEBUG // Print debug information to serial during operation. Disable for production use.
|
||||||
//#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz.
|
//#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz.
|
||||||
|
|
||||||
//#define SMOOTH_LIN_ADVANCE // Remove limits on acceleration by gradual increase of nozzle pressure
|
|
||||||
#if ENABLED(SMOOTH_LIN_ADVANCE)
|
|
||||||
/**
|
|
||||||
* ADVANCE_TAU is also the time ahead that the smoother needs to look
|
|
||||||
* into the planner, so the planner needs to have enough blocks loaded.
|
|
||||||
* For k=0.04 at 10k acceleration and an "Orbiter 2" extruder it can be as low as 0.0075.
|
|
||||||
* Adjust by lowering the value until you observe the extruder skipping, then raise slightly.
|
|
||||||
* Higher k and higher XY acceleration may require larger ADVANCE_TAU to avoid skipping steps.
|
|
||||||
*/
|
|
||||||
#if ENABLED(DISTINCT_E_FACTORS)
|
|
||||||
#define ADVANCE_TAU { 0.02 } // (s) Smoothing time to reduce extruder acceleration, per extruder
|
|
||||||
#else
|
|
||||||
#define ADVANCE_TAU 0.02 // (s) Smoothing time to reduce extruder acceleration
|
|
||||||
#endif
|
|
||||||
#define SMOOTH_LIN_ADV_HZ 1000 // (Hz) How often to update extruder speed
|
|
||||||
#define INPUT_SHAPING_E_SYNC // Synchronize the extruder-shaped XY axes (to increase precision)
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2425,9 +2352,6 @@
|
|||||||
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
|
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
|
||||||
*/
|
*/
|
||||||
//#define NONLINEAR_EXTRUSION
|
//#define NONLINEAR_EXTRUSION
|
||||||
#if ENABLED(NONLINEAR_EXTRUSION)
|
|
||||||
//#define NONLINEAR_EXTRUSION_DEFAULT_ON // Enable if NLE should be ON by default
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// @section leveling
|
// @section leveling
|
||||||
|
|
||||||
@@ -2706,23 +2630,19 @@
|
|||||||
#define MAX_CMD_SIZE 96
|
#define MAX_CMD_SIZE 96
|
||||||
#define BUFSIZE 4
|
#define BUFSIZE 4
|
||||||
|
|
||||||
/**
|
// Transmission to Host Buffer Size
|
||||||
* Host Transmit Buffer Size
|
// To save 386 bytes of flash (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0.
|
||||||
* - Costs 386 bytes of flash and TX_BUFFER_SIZE+3 bytes of SRAM (if not 0).
|
// To buffer a simple "ok" you need 4 bytes.
|
||||||
* - 4 bytes required to buffer a simple "ok".
|
// For ADVANCED_OK (M105) you need 32 bytes.
|
||||||
* - 32 bytes for ADVANCED_OK (M105).
|
// For debug-echo: 128 bytes for the optimal speed.
|
||||||
* - 128 bytes for the optimal speed of 'debug-echo:'
|
// Other output doesn't need to be that speedy.
|
||||||
* - Other output doesn't need to be that speedy.
|
// :[0, 2, 4, 8, 16, 32, 64, 128, 256]
|
||||||
* :[0, 2, 4, 8, 16, 32, 64, 128, 256]
|
|
||||||
*/
|
|
||||||
#define TX_BUFFER_SIZE 0
|
#define TX_BUFFER_SIZE 0
|
||||||
|
|
||||||
/**
|
// Host Receive Buffer Size
|
||||||
* Host Receive Buffer Size
|
// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
|
||||||
* Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
|
// To use flow control, set this buffer size to at least 1024 bytes.
|
||||||
* To use flow control, set this buffer size to at least 1024 bytes.
|
// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
|
||||||
* :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
|
|
||||||
*/
|
|
||||||
//#define RX_BUFFER_SIZE 1024
|
//#define RX_BUFFER_SIZE 1024
|
||||||
|
|
||||||
#if RX_BUFFER_SIZE >= 1024
|
#if RX_BUFFER_SIZE >= 1024
|
||||||
@@ -3041,7 +2961,7 @@
|
|||||||
/**
|
/**
|
||||||
* Trinamic Smart Drivers
|
* Trinamic Smart Drivers
|
||||||
*
|
*
|
||||||
* To use TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
|
* To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
|
||||||
* - Connect your SPI pins to the Hardware SPI interface on the board.
|
* - Connect your SPI pins to the Hardware SPI interface on the board.
|
||||||
* Some boards have simple jumper connections! See your board's documentation.
|
* Some boards have simple jumper connections! See your board's documentation.
|
||||||
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
|
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
|
||||||
@@ -3063,22 +2983,12 @@
|
|||||||
|
|
||||||
#define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
|
#define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
|
||||||
|
|
||||||
//#define EDITABLE_HOMING_CURRENT // Add a G-code and menu to modify the Homing Current
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interpolate microsteps to 256
|
* Interpolate microsteps to 256
|
||||||
* Override for each driver with <driver>_INTERPOLATE settings below
|
* Override for each driver with <driver>_INTERPOLATE settings below
|
||||||
*/
|
*/
|
||||||
#define INTERPOLATE true
|
#define INTERPOLATE true
|
||||||
|
|
||||||
#if HAS_DRIVER(TMC2240)
|
|
||||||
#define TMC2240_RREF 12000 // (Ω) 12000 .. 60000. (FLY TMC2240 = 12300)
|
|
||||||
// Max Current. Lower for more internal resolution. Raise to run cooler.
|
|
||||||
#define TMC2240_CURRENT_RANGE 1 // :{ 0:'RMS=690mA PEAK=1A', 1:'RMS=1410mA PEAK=2A', 2:'RMS=2120mA PEAK=3A', 3:'RMS=2110mA PEAK=3A' }
|
|
||||||
// Slope Control: Lower is more silent. Higher runs cooler.
|
|
||||||
#define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/µs', 1:'200V/µs', 2:'400V/µs', 3:'800V/µs' }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if AXIS_IS_TMC_CONFIG(X)
|
#if AXIS_IS_TMC_CONFIG(X)
|
||||||
#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 homing. (Typically lower than *_CURRENT.)
|
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
|
||||||
@@ -3301,7 +3211,7 @@
|
|||||||
// @section tmc/spi
|
// @section tmc/spi
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override default SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160 drivers here.
|
* Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
|
||||||
* The default pins can be found in your board's pins file.
|
* The default pins can be found in your board's pins file.
|
||||||
*/
|
*/
|
||||||
//#define X_CS_PIN -1
|
//#define X_CS_PIN -1
|
||||||
@@ -3328,7 +3238,7 @@
|
|||||||
//#define E7_CS_PIN -1
|
//#define E7_CS_PIN -1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160).
|
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
|
||||||
* 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.
|
||||||
*/
|
*/
|
||||||
@@ -3387,7 +3297,7 @@
|
|||||||
// @section tmc/stealthchop
|
// @section tmc/stealthchop
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
|
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
|
||||||
* Use Trinamic's ultra quiet stepping mode.
|
* Use Trinamic's ultra quiet stepping mode.
|
||||||
* When disabled, Marlin will use spreadCycle stepping mode.
|
* When disabled, Marlin will use spreadCycle stepping mode.
|
||||||
*/
|
*/
|
||||||
@@ -3466,7 +3376,7 @@
|
|||||||
// @section tmc/hybrid
|
// @section tmc/hybrid
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
|
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
|
||||||
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
|
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
|
||||||
* This mode allows for faster movements at the expense of higher noise levels.
|
* This mode allows for faster movements at the expense of higher noise levels.
|
||||||
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
|
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
|
||||||
@@ -3500,20 +3410,20 @@
|
|||||||
/**
|
/**
|
||||||
* Use StallGuard to home / probe X, Y, Z.
|
* Use StallGuard to home / probe X, Y, Z.
|
||||||
*
|
*
|
||||||
* TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, TMC5130, and TMC5160 only
|
* TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
|
||||||
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
|
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
|
||||||
* X, Y, and Z homing will always be done in spreadCycle mode.
|
* X, Y, and Z homing will always be done in spreadCycle mode.
|
||||||
*
|
*
|
||||||
* X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
|
* X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
|
||||||
* Use M914 X Y Z to set the stall threshold at runtime:
|
* Use M914 X Y Z to set the stall threshold at runtime:
|
||||||
*
|
*
|
||||||
* Sensitivity TMC2209 Others
|
* Sensitivity TMC2209 Others
|
||||||
* HIGHEST 255 -64 (Too sensitive => False positive)
|
* HIGHEST 255 -64 (Too sensitive => False positive)
|
||||||
* LOWEST 0 63 (Too insensitive => No trigger)
|
* LOWEST 0 63 (Too insensitive => No trigger)
|
||||||
*
|
*
|
||||||
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
|
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
|
||||||
*
|
*
|
||||||
* SPI_ENDSTOPS *** TMC2130, TMC2240, and TMC5160 Only ***
|
* SPI_ENDSTOPS *** TMC2130/TMC5160 Only ***
|
||||||
* Poll the driver through SPI to determine load when homing.
|
* Poll the driver through SPI to determine load when homing.
|
||||||
* Removes the need for a wire from DIAG1 to an endstop pin.
|
* Removes the need for a wire from DIAG1 to an endstop pin.
|
||||||
*
|
*
|
||||||
@@ -3541,9 +3451,8 @@
|
|||||||
//#define U_STALL_SENSITIVITY 8
|
//#define U_STALL_SENSITIVITY 8
|
||||||
//#define V_STALL_SENSITIVITY 8
|
//#define V_STALL_SENSITIVITY 8
|
||||||
//#define W_STALL_SENSITIVITY 8
|
//#define W_STALL_SENSITIVITY 8
|
||||||
//#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
|
//#define SPI_ENDSTOPS // TMC2130/TMC5160 only
|
||||||
//#define IMPROVE_HOMING_RELIABILITY
|
//#define IMPROVE_HOMING_RELIABILITY
|
||||||
//#define SENSORLESS_STALLGUARD_DELAY 0 // (ms) Delay to allow drivers to settle
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section tmc/config
|
// @section tmc/config
|
||||||
@@ -3759,8 +3668,6 @@
|
|||||||
#define SPEED_POWER_MIN 5000 // (RPM)
|
#define SPEED_POWER_MIN 5000 // (RPM)
|
||||||
#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
|
#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
|
||||||
#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
|
#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
|
||||||
|
|
||||||
//#define DEFAULT_ACCELERATION_SPINDLE 1000 // (°/s/s) Default spindle acceleration (speed change with time)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -4002,7 +3909,7 @@
|
|||||||
/**
|
/**
|
||||||
* Extra options for the M114 "Current Position" report
|
* Extra options for the M114 "Current Position" report
|
||||||
*/
|
*/
|
||||||
//#define M114_DETAIL // Use 'M114 D' for details to check planner calculations
|
//#define M114_DETAIL // Use 'M114` for details to check planner calculations
|
||||||
//#define M114_REALTIME // Real current position based on forward kinematics
|
//#define M114_REALTIME // Real current position based on forward kinematics
|
||||||
//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed.
|
//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed.
|
||||||
|
|
||||||
@@ -4031,7 +3938,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M115 - Report capabilities. Disable to save ~1150 bytes of flash.
|
* M115 - Report capabilites. Disable to save ~1150 bytes of flash.
|
||||||
* Some hosts (and serial TFT displays) rely on this feature.
|
* Some hosts (and serial TFT displays) rely on this feature.
|
||||||
*/
|
*/
|
||||||
#define CAPABILITIES_REPORT
|
#define CAPABILITIES_REPORT
|
||||||
@@ -4049,6 +3956,7 @@
|
|||||||
* Spend 28 bytes of SRAM to optimize the G-code parser
|
* Spend 28 bytes of SRAM to optimize the G-code parser
|
||||||
*/
|
*/
|
||||||
#define FASTER_GCODE_PARSER
|
#define FASTER_GCODE_PARSER
|
||||||
|
|
||||||
#if ENABLED(FASTER_GCODE_PARSER)
|
#if ENABLED(FASTER_GCODE_PARSER)
|
||||||
//#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
|
//#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
|
||||||
#endif
|
#endif
|
||||||
@@ -4106,17 +4014,13 @@
|
|||||||
/**
|
/**
|
||||||
* G-code Macros
|
* G-code Macros
|
||||||
*
|
*
|
||||||
* Add G-codes M810-M819 to define and run G-code macros
|
* Add G-codes M810-M819 to define and run G-code macros.
|
||||||
* and M820 to report the current set of macros.
|
* Macros are not saved to EEPROM.
|
||||||
* Macros are not saved to EEPROM unless enabled below.
|
|
||||||
*/
|
*/
|
||||||
//#define GCODE_MACROS
|
//#define GCODE_MACROS
|
||||||
#if ENABLED(GCODE_MACROS)
|
#if ENABLED(GCODE_MACROS)
|
||||||
#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
|
#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
|
||||||
#define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
|
#define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
|
||||||
#if ENABLED(EEPROM_SETTINGS)
|
|
||||||
//#define GCODE_MACROS_IN_EEPROM // Include macros in EEPROM
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -4138,27 +4042,22 @@
|
|||||||
#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
|
#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
|
||||||
#define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W"
|
#define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W"
|
||||||
//#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
//#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
||||||
//#define MAIN_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
|
|
||||||
|
|
||||||
#define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL
|
#define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL
|
||||||
#define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
#define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
||||||
//#define MAIN_MENU_ITEM_2_CONFIRM
|
//#define MAIN_MENU_ITEM_2_CONFIRM
|
||||||
//#define MAIN_MENU_ITEM_2_IMMEDIATE
|
|
||||||
|
|
||||||
//#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL
|
//#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL
|
||||||
//#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
//#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
||||||
//#define MAIN_MENU_ITEM_3_CONFIRM
|
//#define MAIN_MENU_ITEM_3_CONFIRM
|
||||||
//#define MAIN_MENU_ITEM_3_IMMEDIATE
|
|
||||||
|
|
||||||
//#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level"
|
//#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level"
|
||||||
//#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
|
//#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
|
||||||
//#define MAIN_MENU_ITEM_4_CONFIRM
|
//#define MAIN_MENU_ITEM_4_CONFIRM
|
||||||
//#define MAIN_MENU_ITEM_4_IMMEDIATE
|
|
||||||
|
|
||||||
//#define MAIN_MENU_ITEM_5_DESC "Home & Info"
|
//#define MAIN_MENU_ITEM_5_DESC "Home & Info"
|
||||||
//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
|
//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
|
||||||
//#define MAIN_MENU_ITEM_5_CONFIRM
|
//#define MAIN_MENU_ITEM_5_CONFIRM
|
||||||
//#define MAIN_MENU_ITEM_5_IMMEDIATE
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section custom config menu
|
// @section custom config menu
|
||||||
@@ -4175,27 +4074,22 @@
|
|||||||
#define CONFIG_MENU_ITEM_1_DESC "Wifi ON"
|
#define CONFIG_MENU_ITEM_1_DESC "Wifi ON"
|
||||||
#define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678"
|
#define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678"
|
||||||
//#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
//#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
||||||
//#define CONFIG_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
|
|
||||||
|
|
||||||
#define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON"
|
#define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON"
|
||||||
#define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678"
|
#define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678"
|
||||||
//#define CONFIG_MENU_ITEM_2_CONFIRM
|
//#define CONFIG_MENU_ITEM_2_CONFIRM
|
||||||
//#define CONFIG_MENU_ITEM_2_IMMEDIATE
|
|
||||||
|
|
||||||
//#define CONFIG_MENU_ITEM_3_DESC "Radio OFF"
|
//#define CONFIG_MENU_ITEM_3_DESC "Radio OFF"
|
||||||
//#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678"
|
//#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678"
|
||||||
//#define CONFIG_MENU_ITEM_3_CONFIRM
|
//#define CONFIG_MENU_ITEM_3_CONFIRM
|
||||||
//#define CONFIG_MENU_ITEM_3_IMMEDIATE
|
|
||||||
|
|
||||||
//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
|
//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
|
||||||
//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
|
//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
|
||||||
//#define CONFIG_MENU_ITEM_4_CONFIRM
|
//#define CONFIG_MENU_ITEM_4_CONFIRM
|
||||||
//#define CONFIG_MENU_ITEM_4_IMMEDIATE
|
|
||||||
|
|
||||||
//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
|
//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
|
||||||
//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
|
//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
|
||||||
//#define CONFIG_MENU_ITEM_5_CONFIRM
|
//#define CONFIG_MENU_ITEM_5_CONFIRM
|
||||||
//#define CONFIG_MENU_ITEM_5_IMMEDIATE
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section custom buttons
|
// @section custom buttons
|
||||||
@@ -4212,7 +4106,6 @@
|
|||||||
#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
|
#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
|
||||||
#define BUTTON1_GCODE "G28"
|
#define BUTTON1_GCODE "G28"
|
||||||
#define BUTTON1_DESC "Homing" // Optional string to set the LCD status
|
#define BUTTON1_DESC "Homing" // Optional string to set the LCD status
|
||||||
//#define BUTTON1_IMMEDIATE // Skip the queue and run the G-code immediately. Rarely needed.
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define BUTTON2_PIN -1
|
//#define BUTTON2_PIN -1
|
||||||
@@ -4221,7 +4114,6 @@
|
|||||||
#define BUTTON2_WHEN_PRINTING false
|
#define BUTTON2_WHEN_PRINTING false
|
||||||
#define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
#define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
||||||
#define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
|
#define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
|
||||||
//#define BUTTON2_IMMEDIATE
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define BUTTON3_PIN -1
|
//#define BUTTON3_PIN -1
|
||||||
@@ -4230,7 +4122,6 @@
|
|||||||
#define BUTTON3_WHEN_PRINTING false
|
#define BUTTON3_WHEN_PRINTING false
|
||||||
#define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
#define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
||||||
#define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
|
#define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
|
||||||
//#define BUTTON3_IMMEDIATE
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4303,7 +4194,7 @@
|
|||||||
//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
|
//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
|
||||||
// steps per full revolution (motor steps/rev * microstepping)
|
// steps per full revolution (motor steps/rev * microstepping)
|
||||||
//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
|
//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
|
||||||
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error correction.
|
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction.
|
||||||
#define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the
|
#define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the
|
||||||
// printer will attempt to correct the error; errors
|
// printer will attempt to correct the error; errors
|
||||||
// smaller than this are ignored to minimize effects of
|
// smaller than this are ignored to minimize effects of
|
||||||
@@ -4735,11 +4626,6 @@
|
|||||||
//
|
//
|
||||||
//#define PINS_DEBUGGING
|
//#define PINS_DEBUGGING
|
||||||
|
|
||||||
//
|
|
||||||
// M265 - I2C Scanner
|
|
||||||
//
|
|
||||||
//#define I2C_SCANNER
|
|
||||||
|
|
||||||
// Enable Tests that will run at startup and produce a report
|
// Enable Tests that will run at startup and produce a report
|
||||||
//#define MARLIN_TEST_BUILD
|
//#define MARLIN_TEST_BUILD
|
||||||
|
|
||||||
|
|||||||
+58
-67
@@ -127,9 +127,9 @@ NEOPIXEL ?= 0
|
|||||||
# on GCC versions:
|
# on GCC versions:
|
||||||
# https://www.avrfreaks.net/comment/1789106#comment-1789106
|
# https://www.avrfreaks.net/comment/1789106#comment-1789106
|
||||||
|
|
||||||
CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d' ' )
|
CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ )
|
||||||
CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d' ' )
|
CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ )
|
||||||
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d' ' )
|
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
|
||||||
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
||||||
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
||||||
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
||||||
@@ -188,15 +188,15 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1033)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1034)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1034)
|
||||||
|
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
|
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1040)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1035)
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
|
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1041)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1036)
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
|
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1042)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1037)
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
|
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1043)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1038)
|
||||||
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
|
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1044)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1039)
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMPS Derivatives - ATmega1280, ATmega2560
|
# RAMPS Derivatives - ATmega1280, ATmega2560
|
||||||
@@ -286,62 +286,59 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
||||||
# Creality: CR10S, CR20, CR-X
|
# Creality: CR10S, CR20, CR-X
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
||||||
# Creality CR-10 V2, CR-10 V3
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
|
||||||
# Dagoma F5
|
# Dagoma F5
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
||||||
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
||||||
# FYSETC F6 1.3
|
# FYSETC F6 1.3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
||||||
# FYSETC F6 1.4
|
# FYSETC F6 1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
||||||
# Wanhao Duplicator i3 Plus
|
# Wanhao Duplicator i3 Plus
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
||||||
# VORON Design
|
# VORON Design
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
||||||
# Tronxy TRONXY-V3-1.0
|
# Tronxy TRONXY-V3-1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
||||||
# Z-Bolt X Series
|
# Z-Bolt X Series
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
||||||
# TT OSCAR
|
# TT OSCAR
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
||||||
# BIQU Tango V1
|
# BIQU Tango V1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||||
# MKS GEN L V2
|
# MKS GEN L V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||||
# MKS GEN L V2.1
|
# MKS GEN L V2.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||||
# Copymaster 3D
|
# Copymaster 3D
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||||
# Ortur 4
|
# Ortur 4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||||
# Tenlog D3 Hero IDEX printer
|
# Tenlog D3 Hero IDEX printer
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||||
# Tenlog D3, D5, D6 IDEX Printer
|
# Tenlog D3, D5, D6 IDEX Printer
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||||
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||||
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||||
# Pxmalion Core I3
|
# Pxmalion Core I3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||||
# Panowin Cutlass (as found in the Panowin F1)
|
# Panowin Cutlass (as found in the Panowin F1)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||||
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
||||||
# XTLW MFF V1.0
|
# XTLW MFF V1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
|
||||||
# XTLW MFF V2.0
|
# XTLW MFF V2.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1167)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
|
||||||
# E3D Rumba BigBox
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1168)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMBo and derivatives
|
# RAMBo and derivatives
|
||||||
@@ -410,34 +407,32 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1319)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
||||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
||||||
# Geeetech GT2560 V4.1B for A10(M/T/D)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
|
||||||
# Einstart retrofit
|
# Einstart retrofit
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||||
# Wanhao 0ne+ i3 Mini
|
# Wanhao 0ne+ i3 Mini
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||||
# Wanhao D9 MK2
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
|
||||||
# Overlord/Overlord Pro
|
# Overlord/Overlord Pro
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||||
# ADIMLab Gantry v1
|
# ADIMLab Gantry v1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||||
# ADIMLab Gantry v2
|
# ADIMLab Gantry v2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||||
# Leapfrog Xeed 2015
|
# Leapfrog Xeed 2015
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||||
# PICA Shield (original version)
|
# PICA Shield (original version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||||
# PICA Shield (rev C or later)
|
# PICA Shield (rev C or later)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
||||||
# Intamsys 4.0 (Funmat HT)
|
# Intamsys 4.0 (Funmat HT)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
|
||||||
# Malyan M180 Mainboard Version 2
|
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
|
||||||
# Mega controller & Protoneer CNC Shield V3.00
|
# Mega controller & Protoneer CNC Shield V3.00
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1334)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
|
||||||
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
|
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1335)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
|
||||||
|
# Geeetech GT2560 V4.1B for A10(M/T/D)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1334)
|
||||||
|
|
||||||
#
|
#
|
||||||
# ATmega1281, ATmega2561
|
# ATmega1281, ATmega2561
|
||||||
@@ -517,7 +512,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
|||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
PROG_MCU ?= m1284p
|
PROG_MCU ?= m1284p
|
||||||
# ZoneStar ZMIB V2
|
# ZoneStar ZMIB V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1512)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
PROG_MCU ?= m1284p
|
PROG_MCU ?= m1284p
|
||||||
@@ -631,10 +626,6 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
|||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
PROG_MCU ?= usb1286
|
PROG_MCU ?= usb1286
|
||||||
|
|
||||||
#
|
|
||||||
# SAM3X8E ARM Cortex-M3
|
|
||||||
#
|
|
||||||
|
|
||||||
# UltiMachine Archim1 (with DRV8825 drivers)
|
# UltiMachine Archim1 (with DRV8825 drivers)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
||||||
HARDWARE_VARIANT ?= archim
|
HARDWARE_VARIANT ?= archim
|
||||||
@@ -807,10 +798,10 @@ endif
|
|||||||
|
|
||||||
ifeq ($(TMC), 1)
|
ifeq ($(TMC), 1)
|
||||||
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
|
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
|
||||||
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp \
|
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
|
||||||
GLOBAL_SCALER.cpp SLAVECONF.cpp IOIN.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp \
|
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
|
||||||
SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
||||||
TMC2209Stepper.cpp TMC2240Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(RELOC_WORKAROUND), 1)
|
ifeq ($(RELOC_WORKAROUND), 1)
|
||||||
@@ -877,8 +868,8 @@ else ifeq ($(HARDWARE_VARIANT), archim)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Add all the source directories as include directories too
|
# Add all the source directories as include directories too
|
||||||
CINCS = ${addprefix -I, ${VPATH}}
|
CINCS = ${addprefix -I ,${VPATH}}
|
||||||
CXXINCS = ${addprefix -I, ${VPATH}}
|
CXXINCS = ${addprefix -I ,${VPATH}}
|
||||||
|
|
||||||
# Silence warnings for library code (won't work for .h files, unfortunately)
|
# Silence warnings for library code (won't work for .h files, unfortunately)
|
||||||
LIBWARN = -w -Wno-packed-bitfield-compat
|
LIBWARN = -w -Wno-packed-bitfield-compat
|
||||||
@@ -1035,7 +1026,7 @@ extcoff: $(TARGET).elf
|
|||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
# Link: create ELF output file from library.
|
# Link: create ELF output file from library.
|
||||||
LDFLAGS+= -Wl,-V
|
|
||||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
||||||
$(Pecho) " CXX $@"
|
$(Pecho) " CXX $@"
|
||||||
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
||||||
|
|||||||
+3
-10
@@ -41,14 +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 "2025-12-02"
|
//#define STRING_DISTRIBUTION_DATE "2024-10-17"
|
||||||
|
|
||||||
/**
|
|
||||||
* The protocol for communication to the host. Protocol indicates communication
|
|
||||||
* standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc.
|
|
||||||
* (Other behaviors are given by the firmware version and capabilities report.)
|
|
||||||
*/
|
|
||||||
//#define PROTOCOL_VERSION "1.0"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
@@ -75,8 +68,8 @@
|
|||||||
//#define WEBSITE_URL "marlinfw.org"
|
//#define WEBSITE_URL "marlinfw.org"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the vendor info the serial USB interface, if changeable.
|
* Set the vendor info the serial USB interface, if changable
|
||||||
* Currently only supported by DUE platform.
|
* Currently only supported by DUE platform
|
||||||
*/
|
*/
|
||||||
//#define USB_DEVICE_VENDOR_ID 0x0000
|
//#define USB_DEVICE_VENDOR_ID 0x0000
|
||||||
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
||||||
|
|||||||
+60
-67
@@ -62,11 +62,6 @@ motherboard = BOARD_RAMPS_14_EFB
|
|||||||
serial_port = 0
|
serial_port = 0
|
||||||
baudrate = 250000
|
baudrate = 250000
|
||||||
|
|
||||||
string_config_h_author = "(default from config.ini)"
|
|
||||||
|
|
||||||
capabilities_report = on
|
|
||||||
extended_capabilities_report = on
|
|
||||||
|
|
||||||
use_watchdog = on
|
use_watchdog = on
|
||||||
thermal_protection_hotends = on
|
thermal_protection_hotends = on
|
||||||
thermal_protection_hysteresis = 4
|
thermal_protection_hysteresis = 4
|
||||||
@@ -82,25 +77,18 @@ temp_sensor_0 = 1
|
|||||||
temp_hysteresis = 3
|
temp_hysteresis = 3
|
||||||
heater_0_mintemp = 5
|
heater_0_mintemp = 5
|
||||||
heater_0_maxtemp = 275
|
heater_0_maxtemp = 275
|
||||||
|
preheat_1_temp_hotend = 180
|
||||||
|
|
||||||
|
bang_max = 255
|
||||||
pidtemp = on
|
pidtemp = on
|
||||||
pid_k1 = 0.95
|
pid_k1 = 0.95
|
||||||
pid_max = 255
|
pid_max = 255
|
||||||
pid_functional_range = 20
|
pid_functional_range = 10
|
||||||
|
|
||||||
default_kp = 22.20
|
default_kp = 22.20
|
||||||
default_ki = 1.08
|
default_ki = 1.08
|
||||||
default_kd = 114.00
|
default_kd = 114.00
|
||||||
|
|
||||||
temp_sensor_bed = 1
|
|
||||||
bed_check_interval = 5000
|
|
||||||
bed_mintemp = 5
|
|
||||||
bed_maxtemp = 150
|
|
||||||
|
|
||||||
thermal_protection_bed = on
|
|
||||||
thermal_protection_bed_hysteresis = 2
|
|
||||||
thermal_protection_bed_period = 20
|
|
||||||
|
|
||||||
x_driver_type = A4988
|
x_driver_type = A4988
|
||||||
y_driver_type = A4988
|
y_driver_type = A4988
|
||||||
z_driver_type = A4988
|
z_driver_type = A4988
|
||||||
@@ -133,10 +121,10 @@ default_max_acceleration = { 3000, 3000, 100, 10000 }
|
|||||||
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
|
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
|
||||||
homing_bump_divisor = { 2, 2, 4 }
|
homing_bump_divisor = { 2, 2, 4 }
|
||||||
|
|
||||||
x_enable_on = LOW
|
x_enable_on = 0
|
||||||
y_enable_on = LOW
|
y_enable_on = 0
|
||||||
z_enable_on = LOW
|
z_enable_on = 0
|
||||||
e_enable_on = LOW
|
e_enable_on = 0
|
||||||
|
|
||||||
invert_x_dir = false
|
invert_x_dir = false
|
||||||
invert_y_dir = true
|
invert_y_dir = true
|
||||||
@@ -148,6 +136,11 @@ step_state_x = HIGH
|
|||||||
step_state_y = HIGH
|
step_state_y = HIGH
|
||||||
step_state_z = HIGH
|
step_state_z = HIGH
|
||||||
|
|
||||||
|
disable_x = off
|
||||||
|
disable_y = off
|
||||||
|
disable_z = off
|
||||||
|
disable_e = off
|
||||||
|
|
||||||
proportional_font_ratio = 1.0
|
proportional_font_ratio = 1.0
|
||||||
default_nominal_filament_dia = 1.75
|
default_nominal_filament_dia = 1.75
|
||||||
|
|
||||||
@@ -160,33 +153,30 @@ default_retract_acceleration = 3000
|
|||||||
default_minimumfeedrate = 0.0
|
default_minimumfeedrate = 0.0
|
||||||
default_mintravelfeedrate = 0.0
|
default_mintravelfeedrate = 0.0
|
||||||
|
|
||||||
|
minimum_planner_speed = 0.05
|
||||||
min_steps_per_segment = 6
|
min_steps_per_segment = 6
|
||||||
default_minsegmenttime = 20000
|
default_minsegmenttime = 20000
|
||||||
|
|
||||||
[config:basic]
|
[config:basic]
|
||||||
hotend_overshoot = 15
|
|
||||||
bed_overshoot = 10
|
bed_overshoot = 10
|
||||||
max_bed_power = 255
|
|
||||||
|
|
||||||
busy_while_heating = on
|
busy_while_heating = on
|
||||||
host_keepalive_feature = on
|
default_ejerk = 5.0
|
||||||
default_keepalive_interval = 2
|
default_keepalive_interval = 2
|
||||||
printjob_timer_autostart = on
|
default_leveling_fade_height = 0.0
|
||||||
|
disable_other_extruders = on
|
||||||
jd_handle_small_segments = on
|
display_charset_hd44780 = JAPANESE
|
||||||
validate_homing_endstops = on
|
|
||||||
editable_steps_per_unit = on
|
|
||||||
|
|
||||||
eeprom_boot_silent = on
|
eeprom_boot_silent = on
|
||||||
eeprom_chitchat = on
|
eeprom_chitchat = on
|
||||||
|
|
||||||
endstoppullups = on
|
endstoppullups = on
|
||||||
|
|
||||||
prevent_cold_extrusion = on
|
|
||||||
extrude_mintemp = 170
|
|
||||||
prevent_lengthy_extrude = on
|
|
||||||
extrude_maxlength = 200
|
extrude_maxlength = 200
|
||||||
|
extrude_mintemp = 170
|
||||||
|
host_keepalive_feature = on
|
||||||
|
hotend_overshoot = 15
|
||||||
|
jd_handle_small_segments = on
|
||||||
|
lcd_info_screen_style = 0
|
||||||
|
lcd_language = en
|
||||||
|
max_bed_power = 255
|
||||||
|
mesh_inset = 0
|
||||||
min_software_endstops = on
|
min_software_endstops = on
|
||||||
max_software_endstops = on
|
max_software_endstops = on
|
||||||
min_software_endstop_x = on
|
min_software_endstop_x = on
|
||||||
@@ -195,60 +185,63 @@ min_software_endstop_z = on
|
|||||||
max_software_endstop_x = on
|
max_software_endstop_x = on
|
||||||
max_software_endstop_y = on
|
max_software_endstop_y = on
|
||||||
max_software_endstop_z = on
|
max_software_endstop_z = on
|
||||||
|
|
||||||
preheat_1_label = "PLA"
|
|
||||||
preheat_1_temp_hotend = 180
|
|
||||||
preheat_1_temp_bed = 70
|
|
||||||
preheat_1_fan_speed = 0
|
preheat_1_fan_speed = 0
|
||||||
|
preheat_1_label = "PLA"
|
||||||
preheat_2_label = "ABS"
|
preheat_1_temp_bed = 70
|
||||||
preheat_2_temp_hotend = 240
|
prevent_cold_extrusion = on
|
||||||
preheat_2_temp_bed = 110
|
prevent_lengthy_extrude = on
|
||||||
preheat_2_fan_speed = 0
|
printjob_timer_autostart = on
|
||||||
|
probing_margin = 10
|
||||||
|
show_bootscreen = on
|
||||||
|
soft_pwm_scale = 0
|
||||||
|
string_config_h_author = "(none, default config)"
|
||||||
temp_bed_hysteresis = 3
|
temp_bed_hysteresis = 3
|
||||||
temp_bed_residency_time = 10
|
temp_bed_residency_time = 10
|
||||||
temp_bed_window = 1
|
temp_bed_window = 1
|
||||||
temp_residency_time = 10
|
temp_residency_time = 10
|
||||||
temp_window = 1
|
temp_window = 1
|
||||||
|
validate_homing_endstops = on
|
||||||
|
xy_probe_feedrate = (133*60)
|
||||||
|
z_clearance_between_probes = 5
|
||||||
|
z_clearance_deploy_probe = 10
|
||||||
|
z_clearance_multi_probe = 5
|
||||||
|
|
||||||
[config:advanced]
|
[config:advanced]
|
||||||
arc_support = on
|
arc_support = on
|
||||||
min_arc_segment_mm = 0.1
|
|
||||||
max_arc_segment_mm = 1.0
|
|
||||||
min_circle_segments = 72
|
|
||||||
n_arc_correction = 25
|
|
||||||
|
|
||||||
auto_report_temperatures = on
|
auto_report_temperatures = on
|
||||||
|
|
||||||
autotemp = on
|
autotemp = on
|
||||||
autotemp_min = 210
|
|
||||||
autotemp_max = 250
|
|
||||||
autotemp_factor = 0.1f
|
|
||||||
autotemp_oldweight = 0.98
|
autotemp_oldweight = 0.98
|
||||||
|
bed_check_interval = 5000
|
||||||
default_stepper_timeout_sec = 120
|
default_stepper_timeout_sec = 120
|
||||||
|
default_volumetric_extruder_limit = 0.00
|
||||||
disable_idle_x = on
|
disable_idle_x = on
|
||||||
disable_idle_y = on
|
disable_idle_y = on
|
||||||
disable_idle_z = on
|
disable_idle_z = on
|
||||||
disable_idle_e = on
|
disable_idle_e = on
|
||||||
|
|
||||||
e0_auto_fan_pin = -1
|
e0_auto_fan_pin = -1
|
||||||
|
encoder_100x_steps_per_sec = 80
|
||||||
|
encoder_10x_steps_per_sec = 30
|
||||||
|
encoder_rate_multiplier = on
|
||||||
|
extended_capabilities_report = on
|
||||||
|
extruder_auto_fan_speed = 255
|
||||||
|
extruder_auto_fan_temperature = 50
|
||||||
|
fanmux0_pin = -1
|
||||||
|
fanmux1_pin = -1
|
||||||
|
fanmux2_pin = -1
|
||||||
faster_gcode_parser = on
|
faster_gcode_parser = on
|
||||||
debug_flags_gcode = on
|
|
||||||
|
|
||||||
homing_bump_mm = { 5, 5, 2 }
|
homing_bump_mm = { 5, 5, 2 }
|
||||||
|
max_arc_segment_mm = 1.0
|
||||||
|
min_arc_segment_mm = 0.1
|
||||||
|
min_circle_segments = 72
|
||||||
|
n_arc_correction = 25
|
||||||
|
serial_overrun_protection = on
|
||||||
slowdown = on
|
slowdown = on
|
||||||
slowdown_divisor = 2
|
slowdown_divisor = 2
|
||||||
multistepping_limit = 16
|
temp_sensor_bed = 0
|
||||||
|
thermal_protection_bed_hysteresis = 2
|
||||||
serial_overrun_protection = on
|
thermocouple_max_errors = 15
|
||||||
tx_buffer_size = 0
|
tx_buffer_size = 0
|
||||||
|
|
||||||
watch_temp_increase = 2
|
|
||||||
watch_temp_period = 40
|
|
||||||
|
|
||||||
watch_bed_temp_increase = 2
|
watch_bed_temp_increase = 2
|
||||||
watch_bed_temp_period = 60
|
watch_bed_temp_period = 60
|
||||||
|
watch_temp_increase = 2
|
||||||
|
watch_temp_period = 20
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ void MarlinHAL::reboot() {
|
|||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
||||||
void MarlinHAL::watchdog_init() {
|
void MarlinHAL::watchdog_init() {
|
||||||
@@ -153,7 +154,7 @@ void MarlinHAL::reboot() {
|
|||||||
ISR(WDT_vect) {
|
ISR(WDT_vect) {
|
||||||
sei(); // With the interrupt driven serial we need to allow interrupts.
|
sei(); // With the interrupt driven serial we need to allow interrupts.
|
||||||
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
||||||
marlin.minkill(); // interrupt-safe final kill and infinite loop
|
minkill(); // interrupt-safe final kill and infinite loop
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -204,9 +204,9 @@ public:
|
|||||||
static void isr_on() { sei(); }
|
static void isr_on() { sei(); }
|
||||||
static void isr_off() { cli(); }
|
static void isr_off() { cli(); }
|
||||||
|
|
||||||
static void delay_ms(const int ms) { delay(ms); }
|
static void delay_ms(const int ms) { _delay_ms(ms); }
|
||||||
|
|
||||||
// Tasks, called from marlin.idle()
|
// Tasks, called from idle()
|
||||||
static void idletask() {}
|
static void idletask() {}
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
#if ENABLED(DIRECT_STEPPING)
|
#if ENABLED(DIRECT_STEPPING)
|
||||||
#include "../../feature/direct_stepping.h"
|
#include "../../feature/direct_stepping.h"
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ uint8_t extDigitalRead(const int8_t pin) {
|
|||||||
*
|
*
|
||||||
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
||||||
*/
|
*/
|
||||||
uint16_t set_pwm_frequency_hz(const float hz, const float dca, const float dcb, const float dcc) {
|
uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) {
|
||||||
float count = 0;
|
float count = 0;
|
||||||
if (hz > 0 && (dca || dcb || dcc)) {
|
if (hz > 0 && (dca || dcb || dcc)) {
|
||||||
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
||||||
@@ -254,7 +254,7 @@ uint16_t set_pwm_frequency_hz(const float hz, const float dca, const float dcb,
|
|||||||
else { prescaler = 1; SET_CS(5, PRESCALER_1); }
|
else { prescaler = 1; SET_CS(5, PRESCALER_1); }
|
||||||
|
|
||||||
count /= float(prescaler);
|
count /= float(prescaler);
|
||||||
const float pwm_top = roundf(count); // Get the rounded count
|
const float pwm_top = round(count); // Get the rounded count
|
||||||
|
|
||||||
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
|
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
|
||||||
OCR5A = pwm_top * ABS(dca); // Update and scale DCs
|
OCR5A = pwm_top * ABS(dca); // Update and scale DCs
|
||||||
@@ -280,7 +280,7 @@ uint16_t set_pwm_frequency_hz(const float hz, const float dca, const float dcb,
|
|||||||
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
|
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
|
||||||
OCR5A = OCR5B = OCR5C = 0;
|
OCR5A = OCR5B = OCR5C = 0;
|
||||||
}
|
}
|
||||||
return roundf(count);
|
return round(count);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -363,11 +363,8 @@
|
|||||||
#define AIO7_PWM 0
|
#define AIO7_PWM 0
|
||||||
#define AIO7_DDR DDRF
|
#define AIO7_DDR DDRF
|
||||||
|
|
||||||
//-- 46-47 are not supported by Teensyduino
|
//-- Begin not supported by Teensyduino
|
||||||
//-- Don't use Arduino functions (pinMode, digitalWrite, etc.) on these pins
|
//-- don't use Arduino functions on these pins pinMode/digitalWrite/etc
|
||||||
#define PIN_E2 46
|
|
||||||
#define PIN_E3 47
|
|
||||||
|
|
||||||
#define DIO46_PIN PINE2
|
#define DIO46_PIN PINE2
|
||||||
#define DIO46_RPORT PINE
|
#define DIO46_RPORT PINE
|
||||||
#define DIO46_WPORT PORTE
|
#define DIO46_WPORT PORTE
|
||||||
@@ -380,7 +377,10 @@
|
|||||||
#define DIO47_PWM 0
|
#define DIO47_PWM 0
|
||||||
#define DIO47_DDR DDRE
|
#define DIO47_DDR DDRE
|
||||||
|
|
||||||
//--
|
#define TEENSY_E2 46
|
||||||
|
#define TEENSY_E3 47
|
||||||
|
|
||||||
|
//-- end not supported by Teensyduino
|
||||||
|
|
||||||
#undef PA0
|
#undef PA0
|
||||||
#define PA0_PIN PINA0
|
#define PA0_PIN PINA0
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
/**
|
/**
|
||||||
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
||||||
*/
|
*/
|
||||||
#if ALL(HAS_TMC_SW_SERIAL, ENDSTOP_INTERRUPTS_FEATURE)
|
#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
|
||||||
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -22,23 +22,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pins Debugging for Atmel 8 bit AVR CPUs
|
* PWM print routines for Atmel 8 bit AVR CPUs
|
||||||
*
|
|
||||||
* - NUMBER_PINS_TOTAL
|
|
||||||
* - MULTI_NAME_PAD
|
|
||||||
* - getPinByIndex(index)
|
|
||||||
* - printPinNameByIndex(index)
|
|
||||||
* - getPinIsDigitalByIndex(index)
|
|
||||||
* - digitalPinToAnalogIndex(pin)
|
|
||||||
* - getValidPinMode(pin)
|
|
||||||
* - isValidPin(pin)
|
|
||||||
* - isAnalogPin(pin)
|
|
||||||
* - digitalRead_mod(pin)
|
|
||||||
* - pwm_status(pin)
|
|
||||||
* - printPinPWM(pin)
|
|
||||||
* - printPinPort(pin)
|
|
||||||
* - printPinNumber(pin)
|
|
||||||
* - printPinAnalog(pin)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
@@ -55,30 +39,30 @@
|
|||||||
#include "pinsDebug_Teensyduino.h"
|
#include "pinsDebug_Teensyduino.h"
|
||||||
// Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
|
// Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
|
||||||
// portModeRegister takes a different argument
|
// portModeRegister takes a different argument
|
||||||
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer(P)
|
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||||
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask(P)
|
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||||
#define digitalPinToPort_DEBUG(P) digitalPinToPort(P)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||||
#define getValidPinMode(P) (*portModeRegister(P) & digitalPinToBitMask_DEBUG(P))
|
#define getValidPinMode(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
||||||
|
|
||||||
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
||||||
|
|
||||||
#include "pinsDebug_plus_70.h"
|
#include "pinsDebug_plus_70.h"
|
||||||
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer_plus_70(P)
|
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p)
|
||||||
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask_plus_70(P)
|
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p)
|
||||||
#define digitalPinToPort_DEBUG(P) digitalPinToPort_plus_70(P)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p)
|
||||||
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer(P)
|
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||||
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask(P)
|
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||||
#define digitalPinToPort_DEBUG(P) digitalPinToPort(P)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||||
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||||
#define getPinByIndex(x) pgm_read_byte(&pin_array[x].pin)
|
#define getPinByIndex(p) pgm_read_byte(&pin_array[p].pin)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define isValidPin(P) (P >= 0 && P < NUMBER_PINS_TOTAL)
|
#define isValidPin(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
|
||||||
#if AVR_ATmega1284_FAMILY
|
#if AVR_ATmega1284_FAMILY
|
||||||
#define isAnalogPin(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
#define isAnalogPin(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
||||||
#define digitalPinToAnalogIndex(P) int(isAnalogPin(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
#define digitalPinToAnalogIndex(P) int(isAnalogPin(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
||||||
@@ -88,11 +72,11 @@
|
|||||||
#define isAnalogPin(P) (_ANALOG1(P) || _ANALOG2(P))
|
#define isAnalogPin(P) (_ANALOG1(P) || _ANALOG2(P))
|
||||||
#define digitalPinToAnalogIndex(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
|
#define digitalPinToAnalogIndex(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
|
||||||
#endif
|
#endif
|
||||||
#define getPinByIndex(x) pgm_read_byte(&pin_array[x].pin)
|
#define getPinByIndex(p) pgm_read_byte(&pin_array[p].pin)
|
||||||
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
void printPinNameByIndex(const uint8_t index) {
|
void printPinNameByIndex(uint8_t x) {
|
||||||
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[index].name);
|
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
|
||||||
for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) {
|
for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) {
|
||||||
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
||||||
if (temp_char != 0)
|
if (temp_char != 0)
|
||||||
@@ -125,7 +109,7 @@ void printPinNameByIndex(const uint8_t index) {
|
|||||||
* Print a pin's PWM status.
|
* Print a pin's PWM status.
|
||||||
* Return true if it's currently a PWM pin.
|
* Return true if it's currently a PWM pin.
|
||||||
*/
|
*/
|
||||||
bool pwm_status(const uint8_t pin) {
|
bool pwm_status(uint8_t pin) {
|
||||||
char buffer[20]; // for the sprintf statements
|
char buffer[20]; // for the sprintf statements
|
||||||
|
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
@@ -292,7 +276,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
|
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void printPinPWM(const uint8_t pin) {
|
void printPinPWM(uint8_t pin) {
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
|
|
||||||
#if ABTEST(0)
|
#if ABTEST(0)
|
||||||
@@ -377,16 +361,16 @@ void printPinPort(const pin_t pin) { // print port number
|
|||||||
uint8_t x;
|
uint8_t x;
|
||||||
SERIAL_ECHOPGM(" Port: ");
|
SERIAL_ECHOPGM(" Port: ");
|
||||||
#if AVR_AT90USB1286_FAMILY
|
#if AVR_AT90USB1286_FAMILY
|
||||||
x = (pin == PIN_E2 || pin == PIN_E3) ? 'E' : 'A' + digitalPinToPort_DEBUG(pin) - 1;
|
x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64;
|
||||||
#else
|
#else
|
||||||
x = 'A' + digitalPinToPort_DEBUG(pin) - 1;
|
x = digitalPinToPort_DEBUG(pin) + 64;
|
||||||
#endif
|
#endif
|
||||||
SERIAL_CHAR(x);
|
SERIAL_CHAR(x);
|
||||||
|
|
||||||
#if AVR_AT90USB1286_FAMILY
|
#if AVR_AT90USB1286_FAMILY
|
||||||
if (pin == PIN_E2)
|
if (pin == 46)
|
||||||
x = '2';
|
x = '2';
|
||||||
else if (pin == PIN_E3)
|
else if (pin == 47)
|
||||||
x = '3';
|
x = '3';
|
||||||
else {
|
else {
|
||||||
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
||||||
@@ -402,7 +386,7 @@ void printPinPort(const pin_t pin) { // print port number
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define printPinNumber(P) do{ sprintf_P(buffer, PSTR("%3d "), P); SERIAL_ECHO(buffer); }while(0)
|
#define printPinNumber(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
#define printPinAnalog(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
|
||||||
#undef ABTEST
|
#undef ABTEST
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
|||||||
|
|
||||||
// digitalPinToBitMask(pin) is OK
|
// digitalPinToBitMask(pin) is OK
|
||||||
|
|
||||||
#define digitalRead_mod(P) extDigitalRead(P) // Teensyduino's version of digitalRead doesn't
|
#define digitalRead_mod(p) extDigitalRead(p) // Teensyduino's version of digitalRead doesn't
|
||||||
// disable the PWMs so we can use it as is
|
// disable the PWMs so we can use it as is
|
||||||
|
|
||||||
// portModeRegister(pin) is OK
|
// portModeRegister(pin) is OK
|
||||||
|
|||||||
@@ -48,92 +48,92 @@
|
|||||||
const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = {
|
const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = {
|
||||||
// PORTLIST
|
// PORTLIST
|
||||||
// ------------------------
|
// ------------------------
|
||||||
PE, // PE 0 ** 0 ** USART0_RX
|
PE , // PE 0 ** 0 ** USART0_RX
|
||||||
PE, // PE 1 ** 1 ** USART0_TX
|
PE , // PE 1 ** 1 ** USART0_TX
|
||||||
PE, // PE 4 ** 2 ** PWM2
|
PE , // PE 4 ** 2 ** PWM2
|
||||||
PE, // PE 5 ** 3 ** PWM3
|
PE , // PE 5 ** 3 ** PWM3
|
||||||
PG, // PG 5 ** 4 ** PWM4
|
PG , // PG 5 ** 4 ** PWM4
|
||||||
PE, // PE 3 ** 5 ** PWM5
|
PE , // PE 3 ** 5 ** PWM5
|
||||||
PH, // PH 3 ** 6 ** PWM6
|
PH , // PH 3 ** 6 ** PWM6
|
||||||
PH, // PH 4 ** 7 ** PWM7
|
PH , // PH 4 ** 7 ** PWM7
|
||||||
PH, // PH 5 ** 8 ** PWM8
|
PH , // PH 5 ** 8 ** PWM8
|
||||||
PH, // PH 6 ** 9 ** PWM9
|
PH , // PH 6 ** 9 ** PWM9
|
||||||
PB, // PB 4 ** 10 ** PWM10
|
PB , // PB 4 ** 10 ** PWM10
|
||||||
PB, // PB 5 ** 11 ** PWM11
|
PB , // PB 5 ** 11 ** PWM11
|
||||||
PB, // PB 6 ** 12 ** PWM12
|
PB , // PB 6 ** 12 ** PWM12
|
||||||
PB, // PB 7 ** 13 ** PWM13
|
PB , // PB 7 ** 13 ** PWM13
|
||||||
PJ, // PJ 1 ** 14 ** USART3_TX
|
PJ , // PJ 1 ** 14 ** USART3_TX
|
||||||
PJ, // PJ 0 ** 15 ** USART3_RX
|
PJ , // PJ 0 ** 15 ** USART3_RX
|
||||||
PH, // PH 1 ** 16 ** USART2_TX
|
PH , // PH 1 ** 16 ** USART2_TX
|
||||||
PH, // PH 0 ** 17 ** USART2_RX
|
PH , // PH 0 ** 17 ** USART2_RX
|
||||||
PD, // PD 3 ** 18 ** USART1_TX
|
PD , // PD 3 ** 18 ** USART1_TX
|
||||||
PD, // PD 2 ** 19 ** USART1_RX
|
PD , // PD 2 ** 19 ** USART1_RX
|
||||||
PD, // PD 1 ** 20 ** I2C_SDA
|
PD , // PD 1 ** 20 ** I2C_SDA
|
||||||
PD, // PD 0 ** 21 ** I2C_SCL
|
PD , // PD 0 ** 21 ** I2C_SCL
|
||||||
PA, // PA 0 ** 22 ** D22
|
PA , // PA 0 ** 22 ** D22
|
||||||
PA, // PA 1 ** 23 ** D23
|
PA , // PA 1 ** 23 ** D23
|
||||||
PA, // PA 2 ** 24 ** D24
|
PA , // PA 2 ** 24 ** D24
|
||||||
PA, // PA 3 ** 25 ** D25
|
PA , // PA 3 ** 25 ** D25
|
||||||
PA, // PA 4 ** 26 ** D26
|
PA , // PA 4 ** 26 ** D26
|
||||||
PA, // PA 5 ** 27 ** D27
|
PA , // PA 5 ** 27 ** D27
|
||||||
PA, // PA 6 ** 28 ** D28
|
PA , // PA 6 ** 28 ** D28
|
||||||
PA, // PA 7 ** 29 ** D29
|
PA , // PA 7 ** 29 ** D29
|
||||||
PC, // PC 7 ** 30 ** D30
|
PC , // PC 7 ** 30 ** D30
|
||||||
PC, // PC 6 ** 31 ** D31
|
PC , // PC 6 ** 31 ** D31
|
||||||
PC, // PC 5 ** 32 ** D32
|
PC , // PC 5 ** 32 ** D32
|
||||||
PC, // PC 4 ** 33 ** D33
|
PC , // PC 4 ** 33 ** D33
|
||||||
PC, // PC 3 ** 34 ** D34
|
PC , // PC 3 ** 34 ** D34
|
||||||
PC, // PC 2 ** 35 ** D35
|
PC , // PC 2 ** 35 ** D35
|
||||||
PC, // PC 1 ** 36 ** D36
|
PC , // PC 1 ** 36 ** D36
|
||||||
PC, // PC 0 ** 37 ** D37
|
PC , // PC 0 ** 37 ** D37
|
||||||
PD, // PD 7 ** 38 ** D38
|
PD , // PD 7 ** 38 ** D38
|
||||||
PG, // PG 2 ** 39 ** D39
|
PG , // PG 2 ** 39 ** D39
|
||||||
PG, // PG 1 ** 40 ** D40
|
PG , // PG 1 ** 40 ** D40
|
||||||
PG, // PG 0 ** 41 ** D41
|
PG , // PG 0 ** 41 ** D41
|
||||||
PL, // PL 7 ** 42 ** D42
|
PL , // PL 7 ** 42 ** D42
|
||||||
PL, // PL 6 ** 43 ** D43
|
PL , // PL 6 ** 43 ** D43
|
||||||
PL, // PL 5 ** 44 ** D44
|
PL , // PL 5 ** 44 ** D44
|
||||||
PL, // PL 4 ** 45 ** D45
|
PL , // PL 4 ** 45 ** D45
|
||||||
PL, // PL 3 ** 46 ** D46
|
PL , // PL 3 ** 46 ** D46
|
||||||
PL, // PL 2 ** 47 ** D47
|
PL , // PL 2 ** 47 ** D47
|
||||||
PL, // PL 1 ** 48 ** D48
|
PL , // PL 1 ** 48 ** D48
|
||||||
PL, // PL 0 ** 49 ** D49
|
PL , // PL 0 ** 49 ** D49
|
||||||
PB, // PB 3 ** 50 ** SPI_MISO
|
PB , // PB 3 ** 50 ** SPI_MISO
|
||||||
PB, // PB 2 ** 51 ** SPI_MOSI
|
PB , // PB 2 ** 51 ** SPI_MOSI
|
||||||
PB, // PB 1 ** 52 ** SPI_SCK
|
PB , // PB 1 ** 52 ** SPI_SCK
|
||||||
PB, // PB 0 ** 53 ** SPI_SS
|
PB , // PB 0 ** 53 ** SPI_SS
|
||||||
PF, // PF 0 ** 54 ** A0
|
PF , // PF 0 ** 54 ** A0
|
||||||
PF, // PF 1 ** 55 ** A1
|
PF , // PF 1 ** 55 ** A1
|
||||||
PF, // PF 2 ** 56 ** A2
|
PF , // PF 2 ** 56 ** A2
|
||||||
PF, // PF 3 ** 57 ** A3
|
PF , // PF 3 ** 57 ** A3
|
||||||
PF, // PF 4 ** 58 ** A4
|
PF , // PF 4 ** 58 ** A4
|
||||||
PF, // PF 5 ** 59 ** A5
|
PF , // PF 5 ** 59 ** A5
|
||||||
PF, // PF 6 ** 60 ** A6
|
PF , // PF 6 ** 60 ** A6
|
||||||
PF, // PF 7 ** 61 ** A7
|
PF , // PF 7 ** 61 ** A7
|
||||||
PK, // PK 0 ** 62 ** A8
|
PK , // PK 0 ** 62 ** A8
|
||||||
PK, // PK 1 ** 63 ** A9
|
PK , // PK 1 ** 63 ** A9
|
||||||
PK, // PK 2 ** 64 ** A10
|
PK , // PK 2 ** 64 ** A10
|
||||||
PK, // PK 3 ** 65 ** A11
|
PK , // PK 3 ** 65 ** A11
|
||||||
PK, // PK 4 ** 66 ** A12
|
PK , // PK 4 ** 66 ** A12
|
||||||
PK, // PK 5 ** 67 ** A13
|
PK , // PK 5 ** 67 ** A13
|
||||||
PK, // PK 6 ** 68 ** A14
|
PK , // PK 6 ** 68 ** A14
|
||||||
PK, // PK 7 ** 69 ** A15
|
PK , // PK 7 ** 69 ** A15
|
||||||
PG, // PG 4 ** 70 **
|
PG , // PG 4 ** 70 **
|
||||||
PG, // PG 3 ** 71 **
|
PG , // PG 3 ** 71 **
|
||||||
PJ, // PJ 2 ** 72 **
|
PJ , // PJ 2 ** 72 **
|
||||||
PJ, // PJ 3 ** 73 **
|
PJ , // PJ 3 ** 73 **
|
||||||
PJ, // PJ 7 ** 74 **
|
PJ , // PJ 7 ** 74 **
|
||||||
PJ, // PJ 4 ** 75 **
|
PJ , // PJ 4 ** 75 **
|
||||||
PJ, // PJ 5 ** 76 **
|
PJ , // PJ 5 ** 76 **
|
||||||
PJ, // PJ 6 ** 77 **
|
PJ , // PJ 6 ** 77 **
|
||||||
PE, // PE 2 ** 78 **
|
PE , // PE 2 ** 78 **
|
||||||
PE, // PE 6 ** 79 **
|
PE , // PE 6 ** 79 **
|
||||||
PE, // PE 7 ** 80 **
|
PE , // PE 7 ** 80 **
|
||||||
PD, // PD 4 ** 81 **
|
PD , // PD 4 ** 81 **
|
||||||
PD, // PD 5 ** 82 **
|
PD , // PD 5 ** 82 **
|
||||||
PD, // PD 6 ** 83 **
|
PD , // PD 6 ** 83 **
|
||||||
PH, // PH 2 ** 84 **
|
PH , // PH 2 ** 84 **
|
||||||
PH, // PH 7 ** 85 **
|
PH , // PH 7 ** 85 **
|
||||||
};
|
};
|
||||||
|
|
||||||
#define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) )
|
#define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) )
|
||||||
@@ -141,92 +141,92 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = {
|
|||||||
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
|
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
|
||||||
// PIN IN PORT
|
// PIN IN PORT
|
||||||
// ------------------------
|
// ------------------------
|
||||||
_BV( 0 ), // PE 0 ** 0 ** USART0_RX
|
_BV( 0 ) , // PE 0 ** 0 ** USART0_RX
|
||||||
_BV( 1 ), // PE 1 ** 1 ** USART0_TX
|
_BV( 1 ) , // PE 1 ** 1 ** USART0_TX
|
||||||
_BV( 4 ), // PE 4 ** 2 ** PWM2
|
_BV( 4 ) , // PE 4 ** 2 ** PWM2
|
||||||
_BV( 5 ), // PE 5 ** 3 ** PWM3
|
_BV( 5 ) , // PE 5 ** 3 ** PWM3
|
||||||
_BV( 5 ), // PG 5 ** 4 ** PWM4
|
_BV( 5 ) , // PG 5 ** 4 ** PWM4
|
||||||
_BV( 3 ), // PE 3 ** 5 ** PWM5
|
_BV( 3 ) , // PE 3 ** 5 ** PWM5
|
||||||
_BV( 3 ), // PH 3 ** 6 ** PWM6
|
_BV( 3 ) , // PH 3 ** 6 ** PWM6
|
||||||
_BV( 4 ), // PH 4 ** 7 ** PWM7
|
_BV( 4 ) , // PH 4 ** 7 ** PWM7
|
||||||
_BV( 5 ), // PH 5 ** 8 ** PWM8
|
_BV( 5 ) , // PH 5 ** 8 ** PWM8
|
||||||
_BV( 6 ), // PH 6 ** 9 ** PWM9
|
_BV( 6 ) , // PH 6 ** 9 ** PWM9
|
||||||
_BV( 4 ), // PB 4 ** 10 ** PWM10
|
_BV( 4 ) , // PB 4 ** 10 ** PWM10
|
||||||
_BV( 5 ), // PB 5 ** 11 ** PWM11
|
_BV( 5 ) , // PB 5 ** 11 ** PWM11
|
||||||
_BV( 6 ), // PB 6 ** 12 ** PWM12
|
_BV( 6 ) , // PB 6 ** 12 ** PWM12
|
||||||
_BV( 7 ), // PB 7 ** 13 ** PWM13
|
_BV( 7 ) , // PB 7 ** 13 ** PWM13
|
||||||
_BV( 1 ), // PJ 1 ** 14 ** USART3_TX
|
_BV( 1 ) , // PJ 1 ** 14 ** USART3_TX
|
||||||
_BV( 0 ), // PJ 0 ** 15 ** USART3_RX
|
_BV( 0 ) , // PJ 0 ** 15 ** USART3_RX
|
||||||
_BV( 1 ), // PH 1 ** 16 ** USART2_TX
|
_BV( 1 ) , // PH 1 ** 16 ** USART2_TX
|
||||||
_BV( 0 ), // PH 0 ** 17 ** USART2_RX
|
_BV( 0 ) , // PH 0 ** 17 ** USART2_RX
|
||||||
_BV( 3 ), // PD 3 ** 18 ** USART1_TX
|
_BV( 3 ) , // PD 3 ** 18 ** USART1_TX
|
||||||
_BV( 2 ), // PD 2 ** 19 ** USART1_RX
|
_BV( 2 ) , // PD 2 ** 19 ** USART1_RX
|
||||||
_BV( 1 ), // PD 1 ** 20 ** I2C_SDA
|
_BV( 1 ) , // PD 1 ** 20 ** I2C_SDA
|
||||||
_BV( 0 ), // PD 0 ** 21 ** I2C_SCL
|
_BV( 0 ) , // PD 0 ** 21 ** I2C_SCL
|
||||||
_BV( 0 ), // PA 0 ** 22 ** D22
|
_BV( 0 ) , // PA 0 ** 22 ** D22
|
||||||
_BV( 1 ), // PA 1 ** 23 ** D23
|
_BV( 1 ) , // PA 1 ** 23 ** D23
|
||||||
_BV( 2 ), // PA 2 ** 24 ** D24
|
_BV( 2 ) , // PA 2 ** 24 ** D24
|
||||||
_BV( 3 ), // PA 3 ** 25 ** D25
|
_BV( 3 ) , // PA 3 ** 25 ** D25
|
||||||
_BV( 4 ), // PA 4 ** 26 ** D26
|
_BV( 4 ) , // PA 4 ** 26 ** D26
|
||||||
_BV( 5 ), // PA 5 ** 27 ** D27
|
_BV( 5 ) , // PA 5 ** 27 ** D27
|
||||||
_BV( 6 ), // PA 6 ** 28 ** D28
|
_BV( 6 ) , // PA 6 ** 28 ** D28
|
||||||
_BV( 7 ), // PA 7 ** 29 ** D29
|
_BV( 7 ) , // PA 7 ** 29 ** D29
|
||||||
_BV( 7 ), // PC 7 ** 30 ** D30
|
_BV( 7 ) , // PC 7 ** 30 ** D30
|
||||||
_BV( 6 ), // PC 6 ** 31 ** D31
|
_BV( 6 ) , // PC 6 ** 31 ** D31
|
||||||
_BV( 5 ), // PC 5 ** 32 ** D32
|
_BV( 5 ) , // PC 5 ** 32 ** D32
|
||||||
_BV( 4 ), // PC 4 ** 33 ** D33
|
_BV( 4 ) , // PC 4 ** 33 ** D33
|
||||||
_BV( 3 ), // PC 3 ** 34 ** D34
|
_BV( 3 ) , // PC 3 ** 34 ** D34
|
||||||
_BV( 2 ), // PC 2 ** 35 ** D35
|
_BV( 2 ) , // PC 2 ** 35 ** D35
|
||||||
_BV( 1 ), // PC 1 ** 36 ** D36
|
_BV( 1 ) , // PC 1 ** 36 ** D36
|
||||||
_BV( 0 ), // PC 0 ** 37 ** D37
|
_BV( 0 ) , // PC 0 ** 37 ** D37
|
||||||
_BV( 7 ), // PD 7 ** 38 ** D38
|
_BV( 7 ) , // PD 7 ** 38 ** D38
|
||||||
_BV( 2 ), // PG 2 ** 39 ** D39
|
_BV( 2 ) , // PG 2 ** 39 ** D39
|
||||||
_BV( 1 ), // PG 1 ** 40 ** D40
|
_BV( 1 ) , // PG 1 ** 40 ** D40
|
||||||
_BV( 0 ), // PG 0 ** 41 ** D41
|
_BV( 0 ) , // PG 0 ** 41 ** D41
|
||||||
_BV( 7 ), // PL 7 ** 42 ** D42
|
_BV( 7 ) , // PL 7 ** 42 ** D42
|
||||||
_BV( 6 ), // PL 6 ** 43 ** D43
|
_BV( 6 ) , // PL 6 ** 43 ** D43
|
||||||
_BV( 5 ), // PL 5 ** 44 ** D44
|
_BV( 5 ) , // PL 5 ** 44 ** D44
|
||||||
_BV( 4 ), // PL 4 ** 45 ** D45
|
_BV( 4 ) , // PL 4 ** 45 ** D45
|
||||||
_BV( 3 ), // PL 3 ** 46 ** D46
|
_BV( 3 ) , // PL 3 ** 46 ** D46
|
||||||
_BV( 2 ), // PL 2 ** 47 ** D47
|
_BV( 2 ) , // PL 2 ** 47 ** D47
|
||||||
_BV( 1 ), // PL 1 ** 48 ** D48
|
_BV( 1 ) , // PL 1 ** 48 ** D48
|
||||||
_BV( 0 ), // PL 0 ** 49 ** D49
|
_BV( 0 ) , // PL 0 ** 49 ** D49
|
||||||
_BV( 3 ), // PB 3 ** 50 ** SPI_MISO
|
_BV( 3 ) , // PB 3 ** 50 ** SPI_MISO
|
||||||
_BV( 2 ), // PB 2 ** 51 ** SPI_MOSI
|
_BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI
|
||||||
_BV( 1 ), // PB 1 ** 52 ** SPI_SCK
|
_BV( 1 ) , // PB 1 ** 52 ** SPI_SCK
|
||||||
_BV( 0 ), // PB 0 ** 53 ** SPI_SS
|
_BV( 0 ) , // PB 0 ** 53 ** SPI_SS
|
||||||
_BV( 0 ), // PF 0 ** 54 ** A0
|
_BV( 0 ) , // PF 0 ** 54 ** A0
|
||||||
_BV( 1 ), // PF 1 ** 55 ** A1
|
_BV( 1 ) , // PF 1 ** 55 ** A1
|
||||||
_BV( 2 ), // PF 2 ** 56 ** A2
|
_BV( 2 ) , // PF 2 ** 56 ** A2
|
||||||
_BV( 3 ), // PF 3 ** 57 ** A3
|
_BV( 3 ) , // PF 3 ** 57 ** A3
|
||||||
_BV( 4 ), // PF 4 ** 58 ** A4
|
_BV( 4 ) , // PF 4 ** 58 ** A4
|
||||||
_BV( 5 ), // PF 5 ** 59 ** A5
|
_BV( 5 ) , // PF 5 ** 59 ** A5
|
||||||
_BV( 6 ), // PF 6 ** 60 ** A6
|
_BV( 6 ) , // PF 6 ** 60 ** A6
|
||||||
_BV( 7 ), // PF 7 ** 61 ** A7
|
_BV( 7 ) , // PF 7 ** 61 ** A7
|
||||||
_BV( 0 ), // PK 0 ** 62 ** A8
|
_BV( 0 ) , // PK 0 ** 62 ** A8
|
||||||
_BV( 1 ), // PK 1 ** 63 ** A9
|
_BV( 1 ) , // PK 1 ** 63 ** A9
|
||||||
_BV( 2 ), // PK 2 ** 64 ** A10
|
_BV( 2 ) , // PK 2 ** 64 ** A10
|
||||||
_BV( 3 ), // PK 3 ** 65 ** A11
|
_BV( 3 ) , // PK 3 ** 65 ** A11
|
||||||
_BV( 4 ), // PK 4 ** 66 ** A12
|
_BV( 4 ) , // PK 4 ** 66 ** A12
|
||||||
_BV( 5 ), // PK 5 ** 67 ** A13
|
_BV( 5 ) , // PK 5 ** 67 ** A13
|
||||||
_BV( 6 ), // PK 6 ** 68 ** A14
|
_BV( 6 ) , // PK 6 ** 68 ** A14
|
||||||
_BV( 7 ), // PK 7 ** 69 ** A15
|
_BV( 7 ) , // PK 7 ** 69 ** A15
|
||||||
_BV( 4 ), // PG 4 ** 70 **
|
_BV( 4 ) , // PG 4 ** 70 **
|
||||||
_BV( 3 ), // PG 3 ** 71 **
|
_BV( 3 ) , // PG 3 ** 71 **
|
||||||
_BV( 2 ), // PJ 2 ** 72 **
|
_BV( 2 ) , // PJ 2 ** 72 **
|
||||||
_BV( 3 ), // PJ 3 ** 73 **
|
_BV( 3 ) , // PJ 3 ** 73 **
|
||||||
_BV( 7 ), // PJ 7 ** 74 **
|
_BV( 7 ) , // PJ 7 ** 74 **
|
||||||
_BV( 4 ), // PJ 4 ** 75 **
|
_BV( 4 ) , // PJ 4 ** 75 **
|
||||||
_BV( 5 ), // PJ 5 ** 76 **
|
_BV( 5 ) , // PJ 5 ** 76 **
|
||||||
_BV( 6 ), // PJ 6 ** 77 **
|
_BV( 6 ) , // PJ 6 ** 77 **
|
||||||
_BV( 2 ), // PE 2 ** 78 **
|
_BV( 2 ) , // PE 2 ** 78 **
|
||||||
_BV( 6 ), // PE 6 ** 79 **
|
_BV( 6 ) , // PE 6 ** 79 **
|
||||||
_BV( 7 ), // PE 7 ** 80 **
|
_BV( 7 ) , // PE 7 ** 80 **
|
||||||
_BV( 4 ), // PD 4 ** 81 **
|
_BV( 4 ) , // PD 4 ** 81 **
|
||||||
_BV( 5 ), // PD 5 ** 82 **
|
_BV( 5 ) , // PD 5 ** 82 **
|
||||||
_BV( 6 ), // PD 6 ** 83 **
|
_BV( 6 ) , // PD 6 ** 83 **
|
||||||
_BV( 2 ), // PH 2 ** 84 **
|
_BV( 2 ) , // PH 2 ** 84 **
|
||||||
_BV( 7 ), // PH 7 ** 85 **
|
_BV( 7 ) , // PH 7 ** 85 **
|
||||||
};
|
};
|
||||||
|
|
||||||
#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
|
#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
|
||||||
@@ -234,86 +234,86 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
|
|||||||
const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
|
const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
|
||||||
// TIMERS
|
// TIMERS
|
||||||
// ------------------------
|
// ------------------------
|
||||||
NOT_ON_TIMER, // PE 0 ** 0 ** USART0_RX
|
NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX
|
||||||
NOT_ON_TIMER, // PE 1 ** 1 ** USART0_TX
|
NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX
|
||||||
TIMER3B, // PE 4 ** 2 ** PWM2
|
TIMER3B , // PE 4 ** 2 ** PWM2
|
||||||
TIMER3C, // PE 5 ** 3 ** PWM3
|
TIMER3C , // PE 5 ** 3 ** PWM3
|
||||||
TIMER0B, // PG 5 ** 4 ** PWM4
|
TIMER0B , // PG 5 ** 4 ** PWM4
|
||||||
TIMER3A, // PE 3 ** 5 ** PWM5
|
TIMER3A , // PE 3 ** 5 ** PWM5
|
||||||
TIMER4A, // PH 3 ** 6 ** PWM6
|
TIMER4A , // PH 3 ** 6 ** PWM6
|
||||||
TIMER4B, // PH 4 ** 7 ** PWM7
|
TIMER4B , // PH 4 ** 7 ** PWM7
|
||||||
TIMER4C, // PH 5 ** 8 ** PWM8
|
TIMER4C , // PH 5 ** 8 ** PWM8
|
||||||
TIMER2B, // PH 6 ** 9 ** PWM9
|
TIMER2B , // PH 6 ** 9 ** PWM9
|
||||||
TIMER2A, // PB 4 ** 10 ** PWM10
|
TIMER2A , // PB 4 ** 10 ** PWM10
|
||||||
TIMER1A, // PB 5 ** 11 ** PWM11
|
TIMER1A , // PB 5 ** 11 ** PWM11
|
||||||
TIMER1B, // PB 6 ** 12 ** PWM12
|
TIMER1B , // PB 6 ** 12 ** PWM12
|
||||||
TIMER0A, // PB 7 ** 13 ** PWM13
|
TIMER0A , // PB 7 ** 13 ** PWM13
|
||||||
NOT_ON_TIMER, // PJ 1 ** 14 ** USART3_TX
|
NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX
|
||||||
NOT_ON_TIMER, // PJ 0 ** 15 ** USART3_RX
|
NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX
|
||||||
NOT_ON_TIMER, // PH 1 ** 16 ** USART2_TX
|
NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX
|
||||||
NOT_ON_TIMER, // PH 0 ** 17 ** USART2_RX
|
NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX
|
||||||
NOT_ON_TIMER, // PD 3 ** 18 ** USART1_TX
|
NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX
|
||||||
NOT_ON_TIMER, // PD 2 ** 19 ** USART1_RX
|
NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX
|
||||||
NOT_ON_TIMER, // PD 1 ** 20 ** I2C_SDA
|
NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA
|
||||||
NOT_ON_TIMER, // PD 0 ** 21 ** I2C_SCL
|
NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL
|
||||||
NOT_ON_TIMER, // PA 0 ** 22 ** D22
|
NOT_ON_TIMER , // PA 0 ** 22 ** D22
|
||||||
NOT_ON_TIMER, // PA 1 ** 23 ** D23
|
NOT_ON_TIMER , // PA 1 ** 23 ** D23
|
||||||
NOT_ON_TIMER, // PA 2 ** 24 ** D24
|
NOT_ON_TIMER , // PA 2 ** 24 ** D24
|
||||||
NOT_ON_TIMER, // PA 3 ** 25 ** D25
|
NOT_ON_TIMER , // PA 3 ** 25 ** D25
|
||||||
NOT_ON_TIMER, // PA 4 ** 26 ** D26
|
NOT_ON_TIMER , // PA 4 ** 26 ** D26
|
||||||
NOT_ON_TIMER, // PA 5 ** 27 ** D27
|
NOT_ON_TIMER , // PA 5 ** 27 ** D27
|
||||||
NOT_ON_TIMER, // PA 6 ** 28 ** D28
|
NOT_ON_TIMER , // PA 6 ** 28 ** D28
|
||||||
NOT_ON_TIMER, // PA 7 ** 29 ** D29
|
NOT_ON_TIMER , // PA 7 ** 29 ** D29
|
||||||
NOT_ON_TIMER, // PC 7 ** 30 ** D30
|
NOT_ON_TIMER , // PC 7 ** 30 ** D30
|
||||||
NOT_ON_TIMER, // PC 6 ** 31 ** D31
|
NOT_ON_TIMER , // PC 6 ** 31 ** D31
|
||||||
NOT_ON_TIMER, // PC 5 ** 32 ** D32
|
NOT_ON_TIMER , // PC 5 ** 32 ** D32
|
||||||
NOT_ON_TIMER, // PC 4 ** 33 ** D33
|
NOT_ON_TIMER , // PC 4 ** 33 ** D33
|
||||||
NOT_ON_TIMER, // PC 3 ** 34 ** D34
|
NOT_ON_TIMER , // PC 3 ** 34 ** D34
|
||||||
NOT_ON_TIMER, // PC 2 ** 35 ** D35
|
NOT_ON_TIMER , // PC 2 ** 35 ** D35
|
||||||
NOT_ON_TIMER, // PC 1 ** 36 ** D36
|
NOT_ON_TIMER , // PC 1 ** 36 ** D36
|
||||||
NOT_ON_TIMER, // PC 0 ** 37 ** D37
|
NOT_ON_TIMER , // PC 0 ** 37 ** D37
|
||||||
NOT_ON_TIMER, // PD 7 ** 38 ** D38
|
NOT_ON_TIMER , // PD 7 ** 38 ** D38
|
||||||
NOT_ON_TIMER, // PG 2 ** 39 ** D39
|
NOT_ON_TIMER , // PG 2 ** 39 ** D39
|
||||||
NOT_ON_TIMER, // PG 1 ** 40 ** D40
|
NOT_ON_TIMER , // PG 1 ** 40 ** D40
|
||||||
NOT_ON_TIMER, // PG 0 ** 41 ** D41
|
NOT_ON_TIMER , // PG 0 ** 41 ** D41
|
||||||
NOT_ON_TIMER, // PL 7 ** 42 ** D42
|
NOT_ON_TIMER , // PL 7 ** 42 ** D42
|
||||||
NOT_ON_TIMER, // PL 6 ** 43 ** D43
|
NOT_ON_TIMER , // PL 6 ** 43 ** D43
|
||||||
TIMER5C, // PL 5 ** 44 ** D44
|
TIMER5C , // PL 5 ** 44 ** D44
|
||||||
TIMER5B, // PL 4 ** 45 ** D45
|
TIMER5B , // PL 4 ** 45 ** D45
|
||||||
TIMER5A, // PL 3 ** 46 ** D46
|
TIMER5A , // PL 3 ** 46 ** D46
|
||||||
NOT_ON_TIMER, // PL 2 ** 47 ** D47
|
NOT_ON_TIMER , // PL 2 ** 47 ** D47
|
||||||
NOT_ON_TIMER, // PL 1 ** 48 ** D48
|
NOT_ON_TIMER , // PL 1 ** 48 ** D48
|
||||||
NOT_ON_TIMER, // PL 0 ** 49 ** D49
|
NOT_ON_TIMER , // PL 0 ** 49 ** D49
|
||||||
NOT_ON_TIMER, // PB 3 ** 50 ** SPI_MISO
|
NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO
|
||||||
NOT_ON_TIMER, // PB 2 ** 51 ** SPI_MOSI
|
NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI
|
||||||
NOT_ON_TIMER, // PB 1 ** 52 ** SPI_SCK
|
NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK
|
||||||
NOT_ON_TIMER, // PB 0 ** 53 ** SPI_SS
|
NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS
|
||||||
NOT_ON_TIMER, // PF 0 ** 54 ** A0
|
NOT_ON_TIMER , // PF 0 ** 54 ** A0
|
||||||
NOT_ON_TIMER, // PF 1 ** 55 ** A1
|
NOT_ON_TIMER , // PF 1 ** 55 ** A1
|
||||||
NOT_ON_TIMER, // PF 2 ** 56 ** A2
|
NOT_ON_TIMER , // PF 2 ** 56 ** A2
|
||||||
NOT_ON_TIMER, // PF 3 ** 57 ** A3
|
NOT_ON_TIMER , // PF 3 ** 57 ** A3
|
||||||
NOT_ON_TIMER, // PF 4 ** 58 ** A4
|
NOT_ON_TIMER , // PF 4 ** 58 ** A4
|
||||||
NOT_ON_TIMER, // PF 5 ** 59 ** A5
|
NOT_ON_TIMER , // PF 5 ** 59 ** A5
|
||||||
NOT_ON_TIMER, // PF 6 ** 60 ** A6
|
NOT_ON_TIMER , // PF 6 ** 60 ** A6
|
||||||
NOT_ON_TIMER, // PF 7 ** 61 ** A7
|
NOT_ON_TIMER , // PF 7 ** 61 ** A7
|
||||||
NOT_ON_TIMER, // PK 0 ** 62 ** A8
|
NOT_ON_TIMER , // PK 0 ** 62 ** A8
|
||||||
NOT_ON_TIMER, // PK 1 ** 63 ** A9
|
NOT_ON_TIMER , // PK 1 ** 63 ** A9
|
||||||
NOT_ON_TIMER, // PK 2 ** 64 ** A10
|
NOT_ON_TIMER , // PK 2 ** 64 ** A10
|
||||||
NOT_ON_TIMER, // PK 3 ** 65 ** A11
|
NOT_ON_TIMER , // PK 3 ** 65 ** A11
|
||||||
NOT_ON_TIMER, // PK 4 ** 66 ** A12
|
NOT_ON_TIMER , // PK 4 ** 66 ** A12
|
||||||
NOT_ON_TIMER, // PK 5 ** 67 ** A13
|
NOT_ON_TIMER , // PK 5 ** 67 ** A13
|
||||||
NOT_ON_TIMER, // PK 6 ** 68 ** A14
|
NOT_ON_TIMER , // PK 6 ** 68 ** A14
|
||||||
NOT_ON_TIMER, // PK 7 ** 69 ** A15
|
NOT_ON_TIMER , // PK 7 ** 69 ** A15
|
||||||
NOT_ON_TIMER, // PG 4 ** 70 **
|
NOT_ON_TIMER , // PG 4 ** 70 **
|
||||||
NOT_ON_TIMER, // PG 3 ** 71 **
|
NOT_ON_TIMER , // PG 3 ** 71 **
|
||||||
NOT_ON_TIMER, // PJ 2 ** 72 **
|
NOT_ON_TIMER , // PJ 2 ** 72 **
|
||||||
NOT_ON_TIMER, // PJ 3 ** 73 **
|
NOT_ON_TIMER , // PJ 3 ** 73 **
|
||||||
NOT_ON_TIMER, // PJ 7 ** 74 **
|
NOT_ON_TIMER , // PJ 7 ** 74 **
|
||||||
NOT_ON_TIMER, // PJ 4 ** 75 **
|
NOT_ON_TIMER , // PJ 4 ** 75 **
|
||||||
NOT_ON_TIMER, // PJ 5 ** 76 **
|
NOT_ON_TIMER , // PJ 5 ** 76 **
|
||||||
NOT_ON_TIMER, // PJ 6 ** 77 **
|
NOT_ON_TIMER , // PJ 6 ** 77 **
|
||||||
NOT_ON_TIMER, // PE 2 ** 78 **
|
NOT_ON_TIMER , // PE 2 ** 78 **
|
||||||
NOT_ON_TIMER, // PE 6 ** 79 **
|
NOT_ON_TIMER , // PE 6 ** 79 **
|
||||||
};
|
};
|
||||||
|
|
||||||
#define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) )
|
#define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) )
|
||||||
|
|||||||
@@ -93,15 +93,15 @@ namespace AVRHelpers {
|
|||||||
typedef T type;
|
typedef T type;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct voltype <T, 1U> {
|
struct voltype <T, 1u> {
|
||||||
typedef uint8_t type;
|
typedef uint8_t type;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct voltype <T, 2U> {
|
struct voltype <T, 2u> {
|
||||||
typedef uint16_t type;
|
typedef uint16_t type;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct voltype <T, 4U> {
|
struct voltype <T, 4u> {
|
||||||
typedef uint32_t type;
|
typedef uint32_t type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2007,7 +2007,7 @@ inline void _ATmega_resetperipherals() {
|
|||||||
|
|
||||||
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM05__)
|
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM05__)
|
||||||
_EEAR._EEAR = 0;
|
_EEAR._EEAR = 0;
|
||||||
dwrite(_EEDR, (uint8_t)0U);
|
dwrite(_EEDR, (uint8_t)0u);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__)
|
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__)
|
||||||
|
|||||||
@@ -23,41 +23,43 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Define SPI Pins: SCK, MISO, MOSI, SS
|
* Define SPI Pins: SCK, MISO, MOSI, SS
|
||||||
* Platform pins have parentheses, e.g., "(53)", so we cannot use them.
|
|
||||||
*/
|
*/
|
||||||
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
|
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
|
||||||
#define _PIN_SPI_SCK 13
|
#define AVR_SCK_PIN 13
|
||||||
#define _PIN_SPI_MISO 12
|
#define AVR_MISO_PIN 12
|
||||||
#define _PIN_SPI_MOSI 11
|
#define AVR_MOSI_PIN 11
|
||||||
#define _PIN_SPI_SS 10
|
#define AVR_SS_PIN 10
|
||||||
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
||||||
#define _PIN_SPI_SCK 7
|
#define AVR_SCK_PIN 7
|
||||||
#define _PIN_SPI_MISO 6
|
#define AVR_MISO_PIN 6
|
||||||
#define _PIN_SPI_MOSI 5
|
#define AVR_MOSI_PIN 5
|
||||||
#define _PIN_SPI_SS 4
|
#define AVR_SS_PIN 4
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
#define _PIN_SPI_SCK 52
|
#define AVR_SCK_PIN 52
|
||||||
#define _PIN_SPI_MISO 50
|
#define AVR_MISO_PIN 50
|
||||||
#define _PIN_SPI_MOSI 51
|
#define AVR_MOSI_PIN 51
|
||||||
#define _PIN_SPI_SS 53
|
#define AVR_SS_PIN 53
|
||||||
#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
|
#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
|
||||||
#define _PIN_SPI_SCK 21
|
#define AVR_SCK_PIN 21
|
||||||
#define _PIN_SPI_MISO 23
|
#define AVR_MISO_PIN 23
|
||||||
#define _PIN_SPI_MOSI 22
|
#define AVR_MOSI_PIN 22
|
||||||
#define _PIN_SPI_SS 20
|
#define AVR_SS_PIN 20
|
||||||
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
#define _PIN_SPI_SCK 10
|
#define AVR_SCK_PIN 10
|
||||||
#define _PIN_SPI_MISO 12
|
#define AVR_MISO_PIN 12
|
||||||
#define _PIN_SPI_MOSI 11
|
#define AVR_MOSI_PIN 11
|
||||||
#define _PIN_SPI_SS 16
|
#define AVR_SS_PIN 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SD_SCK_PIN _PIN_SPI_SCK
|
#define SD_SCK_PIN AVR_SCK_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define SD_MISO_PIN _PIN_SPI_MISO
|
#define SD_MISO_PIN AVR_MISO_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define SD_MOSI_PIN _PIN_SPI_MOSI
|
#define SD_MOSI_PIN AVR_MOSI_PIN
|
||||||
|
#endif
|
||||||
|
#ifndef SD_SS_PIN
|
||||||
|
#define SD_SS_PIN AVR_SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+10
-10
@@ -28,7 +28,7 @@
|
|||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
typedef uint16_t hal_timer_t;
|
typedef uint16_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFU
|
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Defines
|
// Defines
|
||||||
@@ -46,15 +46,15 @@ typedef uint16_t hal_timer_t;
|
|||||||
#define MF_TIMER_TEMP 0
|
#define MF_TIMER_TEMP 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY (((F_CPU) + 0x2000) / 0x4000)
|
#define TEMP_TIMER_FREQUENCY (((F_CPU) + 0x2000) / 0x4000)
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||||
#define STEPPER_TIMER_PRESCALE 8
|
#define STEPPER_TIMER_PRESCALE 8
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL)
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
#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 ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
||||||
@@ -111,8 +111,8 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
|||||||
* (otherwise, characters will be lost due to UART overflow).
|
* (otherwise, characters will be lost due to UART overflow).
|
||||||
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
||||||
*/
|
*/
|
||||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
#define HAL_timer_isr_prologue(T) NOOP
|
||||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
#define HAL_timer_isr_epilogue(T) NOOP
|
||||||
|
|
||||||
#ifndef HAL_STEP_TIMER_ISR
|
#ifndef HAL_STEP_TIMER_ISR
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -55,12 +55,12 @@
|
|||||||
|
|
||||||
#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM)
|
#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM)
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
+11
-15
@@ -27,6 +27,7 @@
|
|||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include "usb/usb_task.h"
|
#include "usb/usb_task.h"
|
||||||
@@ -47,7 +48,7 @@ uint16_t MarlinHAL::adc_result;
|
|||||||
|
|
||||||
void MarlinHAL::init() {
|
void MarlinHAL::init() {
|
||||||
#if HAS_MEDIA
|
#if HAS_MEDIA
|
||||||
OUT_WRITE(SD_SS_PIN, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||||
#endif
|
#endif
|
||||||
usb_task_init(); // Initialize the USB stack
|
usb_task_init(); // Initialize the USB stack
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||||
@@ -101,10 +102,6 @@ void watchdogSetup() {
|
|||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
#ifndef WATCHDOG_PIO_RESET
|
|
||||||
#define WATCHDOG_PIO_RESET
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// 4 seconds timeout
|
// 4 seconds timeout
|
||||||
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
||||||
|
|
||||||
@@ -118,16 +115,15 @@ void watchdogSetup() {
|
|||||||
timeout = 0xFFF;
|
timeout = 0xFFF;
|
||||||
|
|
||||||
// We want to enable the watchdog with the specified timeout
|
// We want to enable the watchdog with the specified timeout
|
||||||
uint32_t value = (0
|
uint32_t value =
|
||||||
| WDT_MR_WDV(timeout) // With the specified timeout
|
WDT_MR_WDV(timeout) | // With the specified timeout
|
||||||
| WDT_MR_WDD(timeout) // and no invalid write window
|
WDT_MR_WDD(timeout) | // and no invalid write window
|
||||||
#if NONE(WATCHDOG_PIO_RESET, SAMV70, SAMV71, SAME70, SAMS70)
|
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
|
||||||
| WDT_MR_WDRPROC // WDT fault resets processor only with this flag.
|
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
|
||||||
// Omit to also reset the PIO controller.
|
// to keep PIO controller state
|
||||||
#endif
|
#endif
|
||||||
| WDT_MR_WDDBGHLT // WDT stops in debug state.
|
WDT_MR_WDDBGHLT | // WDT stops in debug state.
|
||||||
| WDT_MR_WDIDLEHLT // WDT stops in idle state.
|
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
|
||||||
);
|
|
||||||
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
// We enable the watchdog timer, but only for the interrupt.
|
// We enable the watchdog timer, but only for the interrupt.
|
||||||
|
|||||||
@@ -35,9 +35,67 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
//
|
#include "../../core/serial_hook.h"
|
||||||
// Serial Ports
|
|
||||||
//
|
// ------------------------
|
||||||
|
// Serial ports
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
||||||
|
extern DefaultSerial1 MSerial0;
|
||||||
|
extern DefaultSerial2 MSerial1;
|
||||||
|
extern DefaultSerial3 MSerial2;
|
||||||
|
extern DefaultSerial4 MSerial3;
|
||||||
|
|
||||||
|
#define _MSERIAL(X) MSerial##X
|
||||||
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
|
||||||
|
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
|
#define MYSERIAL1 customizedSerial1
|
||||||
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
|
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "The required SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SERIAL_PORT_2
|
||||||
|
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
|
#define MYSERIAL2 customizedSerial2
|
||||||
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
|
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
||||||
|
#else
|
||||||
|
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SERIAL_PORT_3
|
||||||
|
#if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
|
#define MYSERIAL3 customizedSerial3
|
||||||
|
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
|
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
||||||
|
#else
|
||||||
|
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MMU_SERIAL_PORT
|
||||||
|
#if WITHIN(MMU_SERIAL_PORT, 0, 3)
|
||||||
|
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "MMU_SERIAL_PORT must be from 0 to 3."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
#if WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
@@ -132,7 +190,7 @@ public:
|
|||||||
|
|
||||||
static void delay_ms(const int ms) { delay(ms); }
|
static void delay_ms(const int ms) { delay(ms); }
|
||||||
|
|
||||||
// Tasks, called from marlin.idle()
|
// Tasks, called from idle()
|
||||||
static void idletask();
|
static void idletask();
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
|
|||||||
@@ -208,8 +208,8 @@
|
|||||||
A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
|
A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
|
||||||
A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */
|
A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */
|
||||||
|
|
||||||
: [bin]"+r"( bin ),
|
: [bin]"+r"(bin),
|
||||||
[work]"+r"( work )
|
[work]"+r"(work)
|
||||||
: [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
|
: [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
|
||||||
[sck_mask]"r"( SCK_MASK ),
|
[sck_mask]"r"( SCK_MASK ),
|
||||||
[sck_port]"r"( SCK_PORT_PLUS30 )
|
[sck_port]"r"( SCK_PORT_PLUS30 )
|
||||||
@@ -350,7 +350,7 @@
|
|||||||
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS(((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
@@ -412,10 +412,10 @@
|
|||||||
A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */
|
A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */
|
||||||
A("bne.n loop%=") /* Repeat until done */
|
A("bne.n loop%=") /* Repeat until done */
|
||||||
|
|
||||||
: [ptr]"+r"( ptr ),
|
: [ptr]"+r"(ptr),
|
||||||
[todo]"+r"( todo ),
|
[todo]"+r"(todo),
|
||||||
[bin]"+r"( bin ),
|
[bin]"+r"(bin),
|
||||||
[work]"+r"( work )
|
[work]"+r"(work)
|
||||||
: [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
|
: [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
|
||||||
[sck_mask]"r"( SCK_MASK ),
|
[sck_mask]"r"( SCK_MASK ),
|
||||||
[sck_port]"r"( SCK_PORT_PLUS30 )
|
[sck_port]"r"( SCK_PORT_PLUS30 )
|
||||||
@@ -600,8 +600,9 @@
|
|||||||
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
||||||
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
||||||
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
||||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
WRITE(SD_SS_PIN, HIGH);
|
||||||
WRITE(SD_SS_PIN, LOW);
|
|
||||||
|
OUT_WRITE(SDSS, LOW);
|
||||||
|
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SPI_PIN].pPort,
|
g_APinDescription[SPI_PIN].pPort,
|
||||||
@@ -766,7 +767,7 @@
|
|||||||
|
|
||||||
// Disable PIO on A26 and A27
|
// Disable PIO on A26 and A27
|
||||||
REG_PIOA_PDR = 0x0C000000;
|
REG_PIOA_PDR = 0x0C000000;
|
||||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
OUT_WRITE(SDSS, HIGH);
|
||||||
|
|
||||||
// Reset SPI0 (from sam lib)
|
// Reset SPI0 (from sam lib)
|
||||||
SPI0->SPI_CR = SPI_CR_SPIDIS;
|
SPI0->SPI_CR = SPI_CR_SPIDIS;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "InterruptVectors.h"
|
#include "InterruptVectors.h"
|
||||||
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_r MarlinSerial<Cfg>::rx_buffer = { 0, 0, { 0 } };
|
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_r MarlinSerial<Cfg>::rx_buffer = { 0, 0, { 0 } };
|
||||||
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_t MarlinSerial<Cfg>::tx_buffer = { 0 };
|
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_t MarlinSerial<Cfg>::tx_buffer = { 0 };
|
||||||
|
|||||||
@@ -33,21 +33,6 @@
|
|||||||
#include "../../core/types.h"
|
#include "../../core/types.h"
|
||||||
#include "../../core/serial_hook.h"
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
|
||||||
extern DefaultSerial1 MSerial0;
|
|
||||||
extern DefaultSerial2 MSerial1;
|
|
||||||
extern DefaultSerial3 MSerial2;
|
|
||||||
extern DefaultSerial4 MSerial3;
|
|
||||||
|
|
||||||
#define SERIAL_INDEX_MIN 0
|
|
||||||
#define SERIAL_INDEX_MAX 3
|
|
||||||
#define EP_SERIAL_PORT(N) customizedSerial##N
|
|
||||||
#define USB_SERIAL_PORT(N) customizedSerial##N
|
|
||||||
#include "../shared/serial_ports.h"
|
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||||
// location to which to write the next incoming character and rx_buffer_tail
|
// location to which to write the next incoming character and rx_buffer_tail
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if ENABLED(FLASH_EEPROM_EMULATION)
|
#if ENABLED(FLASH_EEPROM_EMULATION)
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes
|
|||||||
curGroup = 0xFF; // Current FLASH group
|
curGroup = 0xFF; // Current FLASH group
|
||||||
|
|
||||||
#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
|
#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
|
||||||
#include "../../../core/debug_out.h"
|
#include "../../core/debug_out.h"
|
||||||
|
|
||||||
static void ee_Dump(const int page, const void *data) {
|
static void ee_Dump(const int page, const void *data) {
|
||||||
|
|
||||||
@@ -291,7 +291,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
|||||||
uint32_t *p1 = (uint32_t*)addrflash;
|
uint32_t *p1 = (uint32_t*)addrflash;
|
||||||
uint32_t *p2 = (uint32_t*)data;
|
uint32_t *p2 = (uint32_t*)data;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (i = 0; i < PageSize >> 2; i++) {
|
for (i =0; i<PageSize >> 2; i++) {
|
||||||
if (p1[i] != p2[i]) {
|
if (p1[i] != p2[i]) {
|
||||||
uint32_t delta = p1[i] ^ p2[i];
|
uint32_t delta = p1[i] ^ p2[i];
|
||||||
while (delta) {
|
while (delta) {
|
||||||
@@ -953,7 +953,7 @@ static void ee_Init() {
|
|||||||
|
|
||||||
/* PersistentStore -----------------------------------------------------------*/
|
/* PersistentStore -----------------------------------------------------------*/
|
||||||
|
|
||||||
#include "../../shared/eeprom_api.h"
|
#include "../shared/eeprom_api.h"
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if USE_WIRED_EEPROM
|
#if USE_WIRED_EEPROM
|
||||||
|
|
||||||
@@ -30,8 +30,8 @@
|
|||||||
* with simple implementations supplied by Marlin.
|
* with simple implementations supplied by Marlin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../shared/eeprom_if.h"
|
#include "../shared/eeprom_if.h"
|
||||||
#include "../../shared/eeprom_api.h"
|
#include "../shared/eeprom_api.h"
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
||||||
@@ -40,12 +40,11 @@
|
|||||||
* Some jitter in the Vref signal is OK so the interrupt priority is left at its default value.
|
* Some jitter in the Vref signal is OK so the interrupt priority is left at its default value.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if MB(PRINTRBOARD_G2)
|
#if MB(PRINTRBOARD_G2)
|
||||||
|
|
||||||
#include "G2_PWM.h"
|
#include "G2_PWM.h"
|
||||||
#include "../../../module/stepper.h"
|
|
||||||
|
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
||||||
#define G2_PWM_X 1
|
#define G2_PWM_X 1
|
||||||
@@ -57,12 +56,16 @@
|
|||||||
#else
|
#else
|
||||||
#define G2_PWM_Y 0
|
#define G2_PWM_Y 0
|
||||||
#endif
|
#endif
|
||||||
#if HAS_MOTOR_CURRENT_PWM_Z
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
||||||
#define G2_PWM_Z 1
|
#define G2_PWM_Z 1
|
||||||
#else
|
#else
|
||||||
#define G2_PWM_Z 0
|
#define G2_PWM_Z 0
|
||||||
#endif
|
#endif
|
||||||
#define G2_PWM_E HAS_MOTOR_CURRENT_PWM_E
|
#if HAS_MOTOR_CURRENT_PWM_E
|
||||||
|
#define G2_PWM_E 1
|
||||||
|
#else
|
||||||
|
#define G2_PWM_E 0
|
||||||
|
#endif
|
||||||
#define G2_MASK_X(V) (G2_PWM_X * (V))
|
#define G2_MASK_X(V) (G2_PWM_X * (V))
|
||||||
#define G2_MASK_Y(V) (G2_PWM_Y * (V))
|
#define G2_MASK_Y(V) (G2_PWM_Y * (V))
|
||||||
#define G2_MASK_Z(V) (G2_PWM_Z * (V))
|
#define G2_MASK_Z(V) (G2_PWM_Z * (V))
|
||||||
@@ -77,22 +80,17 @@ PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT;
|
|||||||
|
|
||||||
void Stepper::digipot_init() {
|
void Stepper::digipot_init() {
|
||||||
|
|
||||||
#if G2_PWM_X
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, LOW); // init pins
|
OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins
|
||||||
#endif
|
#endif
|
||||||
#if G2_PWM_Y
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y)
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, LOW);
|
OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0);
|
||||||
#endif
|
#endif
|
||||||
#if G2_PWM_Z
|
#if G2_PWM_Z
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, LOW);
|
OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0);
|
||||||
#endif
|
#endif
|
||||||
#if G2_PWM_E
|
#if G2_PWM_E
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
|
OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0);
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, LOW);
|
|
||||||
#endif
|
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E0)
|
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_E0_PIN, LOW);
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define WPKEY (0x50574D << 8) // “PWM” in ASCII
|
#define WPKEY (0x50574D << 8) // “PWM” in ASCII
|
||||||
|
|||||||
@@ -26,7 +26,10 @@
|
|||||||
* PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs.
|
* PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../../module/stepper.h"
|
||||||
|
//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\module\stepper.h
|
||||||
|
//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\HAL\HAL_DUE\G2_PWM.h
|
||||||
|
|
||||||
#define PWM_PERIOD_US 100 // base repetition rate in micro seconds
|
#define PWM_PERIOD_US 100 // base repetition rate in micro seconds
|
||||||
|
|
||||||
|
|||||||
@@ -19,26 +19,13 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pins Debugging for DUE
|
* Support routines for Due
|
||||||
*
|
*/
|
||||||
* - NUMBER_PINS_TOTAL
|
|
||||||
* - MULTI_NAME_PAD
|
/**
|
||||||
* - getPinByIndex(index)
|
* Translation of routines & variables used by pinsDebug.h
|
||||||
* - printPinNameByIndex(index)
|
|
||||||
* - getPinIsDigitalByIndex(index)
|
|
||||||
* - digitalPinToAnalogIndex(pin)
|
|
||||||
* - getValidPinMode(pin)
|
|
||||||
* - isValidPin(pin)
|
|
||||||
* - isAnalogPin(pin)
|
|
||||||
* - digitalRead_mod(pin)
|
|
||||||
* - pwm_status(pin)
|
|
||||||
* - printPinPWM(pin)
|
|
||||||
* - printPinPort(pin)
|
|
||||||
* - printPinNumber(pin)
|
|
||||||
* - printPinAnalog(pin)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
@@ -76,20 +63,20 @@
|
|||||||
|
|
||||||
#define NUMBER_PINS_TOTAL PINS_COUNT
|
#define NUMBER_PINS_TOTAL PINS_COUNT
|
||||||
|
|
||||||
#define digitalRead_mod(P) extDigitalRead(P) // AVR digitalRead disabled PWM before it read the pin
|
#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
|
||||||
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define printPinNumber(P) do{ sprintf_P(buffer, PSTR("%02d"), P); SERIAL_ECHO(buffer); }while(0)
|
#define printPinNumber(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
#define printPinAnalog(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define getPinByIndex(x) pin_array[x].pin
|
#define getPinByIndex(p) pin_array[p].pin
|
||||||
#define getPinIsDigitalByIndex(x) pin_array[x].is_digital
|
#define getPinIsDigitalByIndex(p) pin_array[p].is_digital
|
||||||
#define isValidPin(P) (P >= 0 && P < pin_t(NUMBER_PINS_TOTAL))
|
#define isValidPin(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL))
|
||||||
#define digitalPinToAnalogIndex(P) int(P - analogInputToDigitalPin(0))
|
#define digitalPinToAnalogIndex(p) int(p - analogInputToDigitalPin(0))
|
||||||
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
||||||
#define pwm_status(P) (((g_pinStatus[P] & 0xF) == PIN_STATUS_PWM) && \
|
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
||||||
((g_APinDescription[P].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM))
|
((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM))
|
||||||
#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin
|
#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
bool getValidPinMode(const pin_t pin) { // 1: output, 0: input
|
bool getValidPinMode(int8_t pin) { // 1: output, 0: input
|
||||||
volatile Pio* port = g_APinDescription[pin].pPort;
|
volatile Pio* port = g_APinDescription[pin].pPort;
|
||||||
uint32_t mask = g_APinDescription[pin].ulPin;
|
uint32_t mask = g_APinDescription[pin].ulPin;
|
||||||
uint8_t pin_status = g_pinStatus[pin] & 0xF;
|
uint8_t pin_status = g_pinStatus[pin] & 0xF;
|
||||||
@@ -98,7 +85,7 @@ bool getValidPinMode(const pin_t pin) { // 1: output, 0: input
|
|||||||
|| pwm_status(pin));
|
|| pwm_status(pin));
|
||||||
}
|
}
|
||||||
|
|
||||||
void printPinPWM(const int32_t pin) {
|
void printPinPWM(int32_t pin) {
|
||||||
if (pwm_status(pin)) {
|
if (pwm_status(pin)) {
|
||||||
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
||||||
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
||||||
|
|||||||
@@ -26,36 +26,39 @@
|
|||||||
*
|
*
|
||||||
* Available chip select pins for HW SPI are 4 10 52 77 87
|
* Available chip select pins for HW SPI are 4 10 52 77 87
|
||||||
*/
|
*/
|
||||||
#if SD_SS_PIN == 4 || SD_SS_PIN == 10 || SD_SS_PIN == 52 || SD_SS_PIN == 77 || SD_SS_PIN == 87
|
#if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87
|
||||||
#define SD_SCK_PIN 76
|
#if SDSS == 4
|
||||||
#define SD_MISO_PIN 74
|
#define SPI_PIN 87
|
||||||
#define SD_MOSI_PIN 75
|
#define SPI_CHAN 1
|
||||||
#endif
|
#elif SDSS == 10
|
||||||
|
#define SPI_PIN 77
|
||||||
#if SD_SS_PIN == 4
|
#define SPI_CHAN 0
|
||||||
#define SPI_PIN 87
|
#elif SDSS == 52
|
||||||
#define SPI_CHAN 1
|
#define SPI_PIN 86
|
||||||
#elif SD_SS_PIN == 10
|
#define SPI_CHAN 2
|
||||||
#define SPI_PIN 77
|
#elif SDSS == 77
|
||||||
#define SPI_CHAN 0
|
#define SPI_PIN 77
|
||||||
#elif SD_SS_PIN == 52
|
#define SPI_CHAN 0
|
||||||
#define SPI_PIN 86
|
#else
|
||||||
#define SPI_CHAN 2
|
#define SPI_PIN 87
|
||||||
#elif SD_SS_PIN == 77
|
#define SPI_CHAN 1
|
||||||
#define SPI_PIN 77
|
#endif
|
||||||
#define SPI_CHAN 0
|
#define SD_SCK_PIN 76
|
||||||
#elif SD_SS_PIN == 87
|
#define SD_MISO_PIN 74
|
||||||
#define SPI_PIN 87
|
#define SD_MOSI_PIN 75
|
||||||
#define SPI_CHAN 1
|
|
||||||
#else
|
#else
|
||||||
|
// defaults
|
||||||
#define SOFTWARE_SPI
|
#define SOFTWARE_SPI
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SD_SCK_PIN 52
|
#define SD_SCK_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define SD_MISO_PIN 50
|
#define SD_MISO_PIN 50
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define SD_MOSI_PIN 51
|
#define SD_MOSI_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* A.28, A.29, B.21, C.26, C.29 */
|
||||||
|
#define SD_SS_PIN SDSS
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
|
||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||||
|
|
||||||
#define HAL_TIMER_PRESCALER 2
|
#define HAL_TIMER_PRESCALER 2
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
|
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
|
||||||
@@ -52,19 +52,19 @@ typedef uint32_t hal_timer_t;
|
|||||||
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones
|
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer ISR (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
#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) / 1000000UL) // (MHz) Stepper Timer ticks per µs
|
#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 STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
#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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
#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 DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(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 ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||||
@@ -127,4 +127,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
|||||||
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
|
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
#define HAL_timer_isr_epilogue(T) NOOP
|
||||||
|
|||||||
@@ -63,8 +63,8 @@
|
|||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
#include "preprocessor.h"
|
#include "preprocessor.h"
|
||||||
#ifdef FREERTOS_USED
|
#ifdef FREERTOS_USED
|
||||||
#include <FreeRTOS.h>
|
#include "FreeRTOS.h"
|
||||||
#include <semphr.h>
|
#include "semphr.h"
|
||||||
#endif
|
#endif
|
||||||
#include "ctrl_access.h"
|
#include "ctrl_access.h"
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ void sd_mmc_spi_mem_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline bool media_ready() {
|
inline bool media_ready() {
|
||||||
return card.isMounted() && card.isInserted() && !card.isFileOpen() && !card.isStillPrinting();
|
return IS_SD_MOUNTED() && IS_SD_INSERTED() && !IS_SD_FILE_OPEN() && !IS_SD_PRINTING();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sd_mmc_spi_unload(bool) { return true; }
|
bool sd_mmc_spi_unload(bool) { return true; }
|
||||||
@@ -29,10 +29,11 @@ bool sd_mmc_spi_wr_protect() { return false; }
|
|||||||
bool sd_mmc_spi_removal() { return !media_ready(); }
|
bool sd_mmc_spi_removal() { return !media_ready(); }
|
||||||
|
|
||||||
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
||||||
#if ENABLED(DISABLE_DUE_SD_MMC)
|
#ifdef DISABLE_DUE_SD_MMC
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
#endif
|
#endif
|
||||||
return sd_mmc_spi_removal() ? CTRL_NO_PRESENT : CTRL_GOOD;
|
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||||
|
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
|
||||||
@@ -57,10 +58,9 @@ uint8_t sector_buf[SD_MMC_BLOCK_SIZE];
|
|||||||
// #define DEBUG_MMC
|
// #define DEBUG_MMC
|
||||||
|
|
||||||
Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
||||||
#if ENABLED(DISABLE_DUE_SD_MMC)
|
#ifdef DISABLE_DUE_SD_MMC
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||||
|
|
||||||
#ifdef DEBUG_MMC
|
#ifdef DEBUG_MMC
|
||||||
@@ -97,10 +97,9 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
||||||
#if ENABLED(DISABLE_DUE_SD_MMC)
|
#ifdef DISABLE_DUE_SD_MMC
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||||
|
|
||||||
#ifdef DEBUG_MMC
|
#ifdef DEBUG_MMC
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void);
|
|||||||
* - USB Device Controller (UDC) provides USB chapter 9 compliance
|
* - USB Device Controller (UDC) provides USB chapter 9 compliance
|
||||||
* - USB Device Interface (UDI) provides USB Class compliance
|
* - USB Device Interface (UDI) provides USB Class compliance
|
||||||
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
|
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
|
||||||
*
|
|
||||||
* Many USB Device applications can be implemented on Atmel MCU.
|
* Many USB Device applications can be implemented on Atmel MCU.
|
||||||
* Atmel provides many application notes for different applications:
|
* Atmel provides many application notes for different applications:
|
||||||
* - AVR4900, provides general information about Device Stack
|
* - AVR4900, provides general information about Device Stack
|
||||||
|
|||||||
@@ -523,7 +523,7 @@ static bool udd_ep_interrupt(void);
|
|||||||
* \internal
|
* \internal
|
||||||
* \brief Function called by UOTGHS interrupt to manage USB Device interrupts
|
* \brief Function called by UOTGHS interrupt to manage USB Device interrupts
|
||||||
*
|
*
|
||||||
* USB Device interrupt events are split in three parts:
|
* USB Device interrupt events are splited in three parts:
|
||||||
* - USB line events (SOF, reset, suspend, resume, wakeup)
|
* - USB line events (SOF, reset, suspend, resume, wakeup)
|
||||||
* - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
|
* - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
|
||||||
* - bulk/interrupt/isochronous endpoints events (end of data transfer)
|
* - bulk/interrupt/isochronous endpoints events (end of data transfer)
|
||||||
@@ -1567,7 +1567,7 @@ static void udd_ctrl_out_received(void)
|
|||||||
udd_ctrl_payload_buf_cnt))) {
|
udd_ctrl_payload_buf_cnt))) {
|
||||||
// End of reception because it is a short packet
|
// End of reception because it is a short packet
|
||||||
// Before send ZLP, call intermediate callback
|
// Before send ZLP, call intermediate callback
|
||||||
// in case of data receive generate a stall
|
// in case of data receiv generate a stall
|
||||||
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
||||||
if (NULL != udd_g_ctrlreq.over_under_run) {
|
if (NULL != udd_g_ctrlreq.over_under_run) {
|
||||||
if (!udd_g_ctrlreq.over_under_run()) {
|
if (!udd_g_ctrlreq.over_under_run()) {
|
||||||
@@ -1808,7 +1808,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ptr_job->buf_cnt != ptr_job->buf_size) {
|
if (ptr_job->buf_cnt != ptr_job->buf_size) {
|
||||||
// Need to send or receive other data
|
// Need to send or receiv other data
|
||||||
next_trans = ptr_job->buf_size - ptr_job->buf_cnt;
|
next_trans = ptr_job->buf_size - ptr_job->buf_cnt;
|
||||||
|
|
||||||
if (UDD_ENDPOINT_MAX_TRANS < next_trans) {
|
if (UDD_ENDPOINT_MAX_TRANS < next_trans) {
|
||||||
|
|||||||
@@ -34,13 +34,13 @@
|
|||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
#include "wifi/wifi.h"
|
#include "wifi.h"
|
||||||
#if ENABLED(OTASUPPORT)
|
#if ENABLED(OTASUPPORT)
|
||||||
#include "wifi/ota.h"
|
#include "ota.h"
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(WEBSUPPORT)
|
#if ENABLED(WEBSUPPORT)
|
||||||
#include "wifi/spiffs.h"
|
#include "spiffs.h"
|
||||||
#include "wifi/web.h"
|
#include "web.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -175,6 +175,8 @@ uint8_t MarlinHAL::get_reset_source() { return rtc_get_reset_reason(1); }
|
|||||||
|
|
||||||
void MarlinHAL::reboot() { ESP.restart(); }
|
void MarlinHAL::reboot() { ESP.restart(); }
|
||||||
|
|
||||||
|
void _delay_ms(const int ms) { delay(ms); }
|
||||||
|
|
||||||
// return free memory between end of heap (or end bss) and whatever is current
|
// return free memory between end of heap (or end bss) and whatever is current
|
||||||
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
||||||
|
|
||||||
@@ -242,13 +244,12 @@ void MarlinHAL::adc_init() {
|
|||||||
TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_FILWIDTH_ADC, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_FILWIDTH2_ADC, adc1_set_attenuation(get_channel(FILWIDTH2_PIN), ADC_ATTEN_11db));
|
|
||||||
|
|
||||||
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
||||||
// That's why we're not setting it up here.
|
// That's why we're not setting it up here.
|
||||||
|
|||||||
@@ -37,11 +37,11 @@
|
|||||||
#include "i2s.h"
|
#include "i2s.h"
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
#include "wifi/WebSocketSerial.h"
|
#include "WebSocketSerial.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
#include <esp3dlib.h>
|
#include "esp3dlib.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "FlushableHardwareSerial.h"
|
#include "FlushableHardwareSerial.h"
|
||||||
@@ -64,10 +64,10 @@
|
|||||||
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
|
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
|
||||||
|
|
||||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||||
#define PWM_FREQUENCY 1000U // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
#define PWM_FREQUENCY 1000u // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
||||||
#define PWM_RESOLUTION 10U // Default PWM bit resolution
|
#define PWM_RESOLUTION 10u // Default PWM bit resolution
|
||||||
#define CHANNEL_MAX_NUM 15U // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
|
#define CHANNEL_MAX_NUM 15u // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
|
||||||
#define MAX_PWM_IOPIN 33U // hardware pwm pins < 34
|
#define MAX_PWM_IOPIN 33u // hardware pwm pins < 34
|
||||||
#ifndef MAX_EXPANDER_BITS
|
#ifndef MAX_EXPANDER_BITS
|
||||||
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
|
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
|
||||||
#endif
|
#endif
|
||||||
@@ -165,6 +165,8 @@ int freeMemory();
|
|||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
void _delay_ms(const int ms);
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// MarlinHAL Class
|
// MarlinHAL Class
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -192,9 +194,9 @@ public:
|
|||||||
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
|
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
|
||||||
static void isr_off() { portENTER_CRITICAL(&spinlock); }
|
static void isr_off() { portENTER_CRITICAL(&spinlock); }
|
||||||
|
|
||||||
static void delay_ms(const int ms) { delay(ms); }
|
static void delay_ms(const int ms) { _delay_ms(ms); }
|
||||||
|
|
||||||
// Tasks, called from marlin.idle()
|
// Tasks, called from idle()
|
||||||
static void idletask();
|
static void idletask();
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ Servo::Servo() {}
|
|||||||
|
|
||||||
int8_t Servo::attach(const int inPin) {
|
int8_t Servo::attach(const int inPin) {
|
||||||
if (inPin > 0) pin = inPin;
|
if (inPin > 0) pin = inPin;
|
||||||
channel = get_pwm_channel(pin, 50U, 16U);
|
channel = get_pwm_channel(pin, 50u, 16u);
|
||||||
return channel; // -1 if no PWM avail.
|
return channel; // -1 if no PWM avail.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
|
|
||||||
+2
-2
@@ -21,8 +21,8 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "../../../core/serial_hook.h"
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
||||||
@@ -37,10 +37,6 @@
|
|||||||
// Set pin as output
|
// Set pin as output
|
||||||
#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT)
|
#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT)
|
||||||
|
|
||||||
// TODO: Store set modes in an array and use those to get the mode
|
|
||||||
#define _IS_OUTPUT(IO) true
|
|
||||||
#define _IS_INPUT(IO) true
|
|
||||||
|
|
||||||
// Set pin as input with pullup mode
|
// Set pin as input with pullup mode
|
||||||
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
||||||
|
|
||||||
@@ -74,9 +70,6 @@
|
|||||||
// Set pin as output and init
|
// Set pin as output and init
|
||||||
#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
|
#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
|
||||||
|
|
||||||
#define IS_OUTPUT(IO) _IS_OUTPUT(IO)
|
|
||||||
#define IS_INPUT(IO) _IS_INPUT(IO)
|
|
||||||
|
|
||||||
// digitalRead/Write wrappers
|
// digitalRead/Write wrappers
|
||||||
#define extDigitalRead(IO) digitalRead(IO)
|
#define extDigitalRead(IO) digitalRead(IO)
|
||||||
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
|
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) {
|
|||||||
void stepperTask(void *parameter) {
|
void stepperTask(void *parameter) {
|
||||||
uint32_t nextMainISR = 0;
|
uint32_t nextMainISR = 0;
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
uint32_t nextAdvanceISR = stepper.LA_ADV_NEVER;
|
uint32_t nextAdvanceISR = Stepper::LA_ADV_NEVER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -167,13 +167,13 @@ void stepperTask(void *parameter) {
|
|||||||
|
|
||||||
if (!using_ftMotion) {
|
if (!using_ftMotion) {
|
||||||
if (!nextMainISR) {
|
if (!nextMainISR) {
|
||||||
stepper.pulse_phase_isr();
|
Stepper::pulse_phase_isr();
|
||||||
nextMainISR = stepper.block_phase_isr();
|
nextMainISR = Stepper::block_phase_isr();
|
||||||
}
|
}
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
else if (!nextAdvanceISR) {
|
else if (!nextAdvanceISR) {
|
||||||
stepper.advance_isr();
|
Stepper::advance_isr();
|
||||||
nextAdvanceISR = stepper.la_interval;
|
nextAdvanceISR = Stepper::la_interval;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
@@ -182,10 +182,10 @@ void stepperTask(void *parameter) {
|
|||||||
nextMainISR--;
|
nextMainISR--;
|
||||||
|
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
if (nextAdvanceISR == stepper.LA_ADV_NEVER)
|
if (nextAdvanceISR == Stepper::LA_ADV_NEVER)
|
||||||
nextAdvanceISR = stepper.la_interval;
|
nextAdvanceISR = Stepper::la_interval;
|
||||||
|
|
||||||
if (nextAdvanceISR && nextAdvanceISR != stepper.LA_ADV_NEVER)
|
if (nextAdvanceISR && nextAdvanceISR != Stepper::LA_ADV_NEVER)
|
||||||
nextAdvanceISR--;
|
nextAdvanceISR--;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,15 +22,11 @@
|
|||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include <WiFi.h>
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#undef ENABLED
|
|
||||||
#undef DISABLED
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if ALL(WIFISUPPORT, OTASUPPORT)
|
#if ALL(WIFISUPPORT, OTASUPPORT)
|
||||||
|
|
||||||
|
#include <WiFi.h>
|
||||||
#include <ESPmDNS.h>
|
#include <ESPmDNS.h>
|
||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
#include <ArduinoOTA.h>
|
#include <ArduinoOTA.h>
|
||||||
@@ -1,71 +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
|
|
||||||
|
|
||||||
#error "PINS_DEBUGGING is not yet supported for ESP32!"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pins Debugging for ESP32
|
|
||||||
*
|
|
||||||
* - NUMBER_PINS_TOTAL
|
|
||||||
* - MULTI_NAME_PAD
|
|
||||||
* - getPinByIndex(index)
|
|
||||||
* - printPinNameByIndex(index)
|
|
||||||
* - getPinIsDigitalByIndex(index)
|
|
||||||
* - digitalPinToAnalogIndex(pin)
|
|
||||||
* - getValidPinMode(pin)
|
|
||||||
* - isValidPin(pin)
|
|
||||||
* - isAnalogPin(pin)
|
|
||||||
* - digitalRead_mod(pin)
|
|
||||||
* - pwm_status(pin)
|
|
||||||
* - printPinPWM(pin)
|
|
||||||
* - printPinPort(pin)
|
|
||||||
* - printPinNumber(pin)
|
|
||||||
* - printPinAnalog(pin)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
|
||||||
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
|
|
||||||
|
|
||||||
#define digitalRead_mod(P) extDigitalRead(P)
|
|
||||||
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
|
||||||
#define printPinNumber(P) do{ sprintf_P(buffer, PSTR("%02d"), P); SERIAL_ECHO(buffer); }while(0)
|
|
||||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
|
||||||
#define getPinByIndex(x) pin_array[x].pin
|
|
||||||
#define getPinIsDigitalByIndex(x) pin_array[x].is_digital
|
|
||||||
#define isValidPin(P) (P >= 0 && P < pin_t(NUMBER_PINS_TOTAL))
|
|
||||||
#define digitalPinToAnalogIndex(P) int(P - analogInputToDigitalPin(0))
|
|
||||||
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
|
||||||
bool pwm_status(const pin_t) { return false; }
|
|
||||||
|
|
||||||
void printPinPort(const pin_t) {}
|
|
||||||
|
|
||||||
static bool getValidPinMode(const pin_t pin) {
|
|
||||||
return isValidPin(pin) && !IS_INPUT(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void printPinPWM(const int32_t pin) {
|
|
||||||
if (pwm_status(pin)) {
|
|
||||||
//uint32_t chan = g_APinDescription[pin].ulPWMChannel TODO when fast pwm is operative;
|
|
||||||
//SERIAL_ECHOPGM("PWM = ", duty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -21,16 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define PIN_SPI_SCK 18
|
#define SD_SS_PIN SDSS
|
||||||
#define PIN_SPI_MISO 19
|
#define SD_SCK_PIN 18
|
||||||
#define PIN_SPI_MOSI 23
|
#define SD_MISO_PIN 19
|
||||||
|
#define SD_MOSI_PIN 23
|
||||||
#ifndef SD_SCK_PIN
|
|
||||||
#define SD_SCK_PIN PIN_SPI_SCK
|
|
||||||
#endif
|
|
||||||
#ifndef SD_MISO_PIN
|
|
||||||
#define SD_MISO_PIN PIN_SPI_MISO
|
|
||||||
#endif
|
|
||||||
#ifndef SD_MOSI_PIN
|
|
||||||
#define SD_MOSI_PIN PIN_SPI_MOSI
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -21,11 +21,11 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
||||||
|
|
||||||
#include "../../../core/serial.h"
|
#include "../../core/serial.h"
|
||||||
|
|
||||||
#include <FS.h>
|
#include <FS.h>
|
||||||
#include <SPIFFS.h>
|
#include <SPIFFS.h>
|
||||||
@@ -78,8 +78,8 @@ void IRAM_ATTR timer_isr(void *para) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable and initialize the timer
|
* Enable and initialize the timer
|
||||||
* @param timer_num timer number to initialize
|
* @param timer_num timer number to initialize
|
||||||
* @param frequency frequency of the timer
|
* @param frequency frequency of the timer
|
||||||
*/
|
*/
|
||||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||||
const tTimerConfig timer = timer_config[timer_num];
|
const tTimerConfig timer = timer_config[timer_num];
|
||||||
|
|||||||
@@ -30,47 +30,42 @@
|
|||||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
|
||||||
typedef uint64_t hal_timer_t;
|
typedef uint64_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL
|
||||||
|
|
||||||
#ifndef MF_TIMER_STEP
|
#ifndef MF_TIMER_STEP
|
||||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_PULSE
|
#ifndef MF_TIMER_PULSE
|
||||||
#define MF_TIMER_PULSE MF_TIMER_STEP // Timer Index for Pulse interval
|
#define MF_TIMER_PULSE MF_TIMER_STEP
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_TEMP
|
#ifndef MF_TIMER_TEMP
|
||||||
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_PWM
|
#ifndef MF_TIMER_PWM
|
||||||
#define MF_TIMER_PWM 2 // Timer Index for PWM outputs
|
#define MF_TIMER_PWM 2 // index of timer to use for PWM outputs
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_TONE
|
#ifndef MF_TIMER_TONE
|
||||||
#define MF_TIMER_TONE 3 // Timer Index for beeper tones
|
#define MF_TIMER_TONE 3 // index of timer for beeper tones
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define HAL_TIMER_RATE APB_CLK_FREQ // Frequency of timer peripherals
|
#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // Prescaler for setting Temp Timer, 72Khz
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
|
||||||
|
|
||||||
#if ENABLED(I2S_STEPPER_STREAM)
|
#if ENABLED(I2S_STEPPER_STREAM)
|
||||||
#define STEPPER_TIMER_PRESCALE 1
|
#define STEPPER_TIMER_PRESCALE 1
|
||||||
#define STEPPER_TIMER_RATE 250'000 // 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 0.25 // (MHz) Stepper Timer ticks per µs
|
|
||||||
#else
|
#else
|
||||||
#define STEPPER_TIMER_PRESCALE 40
|
#define STEPPER_TIMER_PRESCALE 40
|
||||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // (Hz) Frequency of Stepper Timer ISR, 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) / 1'000'000UL) // (MHz) 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
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
|
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
|
|
||||||
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
||||||
|
|
||||||
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
#define PWM_TIMER_PRESCALE 10
|
#define PWM_TIMER_PRESCALE 10
|
||||||
#if ENABLED(FAST_PWM_FAN)
|
#if ENABLED(FAST_PWM_FAN)
|
||||||
#define PWM_TIMER_FREQUENCY FAST_PWM_FAN_FREQUENCY
|
#define PWM_TIMER_FREQUENCY FAST_PWM_FAN_FREQUENCY
|
||||||
@@ -79,9 +74,13 @@ typedef uint64_t hal_timer_t;
|
|||||||
#endif
|
#endif
|
||||||
#define MAX_PWM_PINS 32 // Number of PWM pin-slots
|
#define MAX_PWM_PINS 32 // Number of PWM pin-slots
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
#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 DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(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 ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||||
@@ -136,5 +135,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
|
|||||||
void HAL_timer_disable_interrupt(const uint8_t timer_num);
|
void HAL_timer_disable_interrupt(const uint8_t timer_num);
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
||||||
|
|
||||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
#define HAL_timer_isr_prologue(T) NOOP
|
||||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
#define HAL_timer_isr_epilogue(T) NOOP
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
#if HAS_MEDIA
|
#if HAS_MEDIA
|
||||||
#include "../../sd/cardreader.h"
|
#include "../../sd/cardreader.h"
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
#include <sd_ESP32.h>
|
#include "sd_ESP32.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -21,11 +21,11 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#undef DISABLED // esp32-hal-gpio.h
|
#undef DISABLED // esp32-hal-gpio.h
|
||||||
#include <SPIFFS.h>
|
#include <SPIFFS.h>
|
||||||
@@ -21,12 +21,11 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../core/serial.h"
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
|
|
||||||
#include "../../../core/serial.h"
|
|
||||||
|
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include <ESPmDNS.h>
|
#include <ESPmDNS.h>
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "../shared/Delay.h"
|
|
||||||
|
|
||||||
uint16_t MarlinHAL::adc_result;
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
extern void install_min_serial();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(MARLIN_DEV_MODE)
|
|
||||||
// Dump the clock frequencies of the system, AHB, APB1, APB2, and F_CPU.
|
|
||||||
static inline void HAL_clock_frequencies_dump() {
|
|
||||||
auto& rcuInstance = rcu::RCU::get_instance();
|
|
||||||
uint32_t freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_SYS);
|
|
||||||
SERIAL_ECHOPGM("\nSYSTEM_CLOCK=", freq);
|
|
||||||
freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_AHB);
|
|
||||||
SERIAL_ECHOPGM("\nABH_CLOCK=", freq);
|
|
||||||
freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB1);
|
|
||||||
SERIAL_ECHOPGM("\nAPB1_CLOCK=", freq);
|
|
||||||
freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB2);
|
|
||||||
SERIAL_ECHOPGM("\nAPB2_CLOCK=", freq,
|
|
||||||
"\nF_CPU=", F_CPU);
|
|
||||||
// Done
|
|
||||||
SERIAL_ECHOPGM("\n--\n");
|
|
||||||
}
|
|
||||||
#endif // MARLIN_DEV_MODE
|
|
||||||
|
|
||||||
// Initializes the Marlin HAL
|
|
||||||
void MarlinHAL::init() {
|
|
||||||
// Ensure F_CPU is a constant expression.
|
|
||||||
// If the compiler breaks here, it means that delay code that should compute at compile time will not work.
|
|
||||||
// So better safe than sorry here.
|
|
||||||
constexpr unsigned int cpuFreq = F_CPU;
|
|
||||||
UNUSED(cpuFreq);
|
|
||||||
|
|
||||||
#if PIN_EXISTS(LED)
|
|
||||||
OUT_WRITE(LED_PIN, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SetTimerInterruptPriorities();
|
|
||||||
|
|
||||||
// Print clock frequencies to host serial
|
|
||||||
TERN_(MARLIN_DEV_MODE, HAL_clock_frequencies_dump());
|
|
||||||
|
|
||||||
// Register min serial
|
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the reset source based on the flags set in the RCU module
|
|
||||||
uint8_t MarlinHAL::get_reset_source() {
|
|
||||||
return
|
|
||||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_FWDGTRST)) ? RST_WATCHDOG :
|
|
||||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_SWRST)) ? RST_SOFTWARE :
|
|
||||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_EPRST)) ? RST_EXTERNAL :
|
|
||||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_PORRST)) ? RST_POWER_ON :
|
|
||||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_LPRST)) ? RST_BROWN_OUT :
|
|
||||||
0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the amount of free memory available in bytes
|
|
||||||
int MarlinHAL::freeMemory() {
|
|
||||||
volatile char top;
|
|
||||||
return &top - reinterpret_cast<char*>(_sbrk(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Watchdog Timer
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
|
||||||
|
|
||||||
#include <FWatchdogTimer.h>
|
|
||||||
|
|
||||||
FWatchdogTimer& watchdogTimer = FWatchdogTimer::get_instance();
|
|
||||||
|
|
||||||
// Initializes the watchdog timer
|
|
||||||
void MarlinHAL::watchdog_init() {
|
|
||||||
IF_DISABLED(DISABLE_WATCHDOG_INIT, watchdogTimer.begin(WDT_TIMEOUT_US));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Refreshes the watchdog timer to prevent system reset
|
|
||||||
void MarlinHAL::watchdog_refresh() {
|
|
||||||
watchdogTimer.reload();
|
|
||||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
|
||||||
TOGGLE(LED_PIN); // Heartbeat indicator
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
extern unsigned int _ebss; // End of bss section
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resets the system to initiate a firmware flash.
|
|
||||||
WEAK void flashFirmware(const int16_t) {
|
|
||||||
hal.reboot();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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
|
|
||||||
|
|
||||||
#define CPU_32_BIT
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
#include "../shared/Marduino.h"
|
|
||||||
#include "../shared/math_32bit.h"
|
|
||||||
#include "../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#include "temp_soc.h"
|
|
||||||
#include "fastio.h"
|
|
||||||
#include "Servo.h"
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <GPIO.hpp>
|
|
||||||
#include <AFIO.hpp>
|
|
||||||
|
|
||||||
// Default graphical display delays
|
|
||||||
#define CPU_ST7920_DELAY_1 300
|
|
||||||
#define CPU_ST7920_DELAY_2 40
|
|
||||||
#define CPU_ST7920_DELAY_3 340
|
|
||||||
|
|
||||||
// Serial Ports
|
|
||||||
#include "MarlinSerial.h"
|
|
||||||
|
|
||||||
// Interrupts
|
|
||||||
#define CRITICAL_SECTION_START() const bool irqon = !__get_PRIMASK(); __disable_irq()
|
|
||||||
#define CRITICAL_SECTION_END() if (irqon) __enable_irq()
|
|
||||||
|
|
||||||
#define cli() __disable_irq()
|
|
||||||
#define sei() __enable_irq()
|
|
||||||
|
|
||||||
// Alias of __bss_end__
|
|
||||||
#define __bss_end __bss_end__
|
|
||||||
|
|
||||||
// Types
|
|
||||||
typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs.
|
|
||||||
typedef uint8_t pin_t; // Parity with mfl platform
|
|
||||||
|
|
||||||
// Servo
|
|
||||||
class libServo;
|
|
||||||
typedef libServo hal_servo_t;
|
|
||||||
#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos()
|
|
||||||
#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos()
|
|
||||||
|
|
||||||
// Debugging
|
|
||||||
#define JTAG_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_DP_ONLY_REMAP)
|
|
||||||
#define JTAGSWD_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_ALL_DISABLED_REMAP)
|
|
||||||
#define JTAGSWD_RESET() AFIO_I.set_remap(gpio::Pin_Remap_Select::FULL_SWJ_REMAP)
|
|
||||||
|
|
||||||
// ADC
|
|
||||||
#ifdef ADC_RESOLUTION
|
|
||||||
#define HAL_ADC_RESOLUTION ADC_RESOLUTION
|
|
||||||
#else
|
|
||||||
#define HAL_ADC_RESOLUTION 12
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HAL_ADC_VREF_MV 3300
|
|
||||||
|
|
||||||
// Disable Marlin's software oversampling.
|
|
||||||
// The MFL framework uses 16x hardware oversampling by default
|
|
||||||
#ifdef GD32F303RE
|
|
||||||
#define HAL_ADC_FILTERED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define GET_PIN_MAP_PIN(index) index
|
|
||||||
#define GET_PIN_MAP_INDEX(pin) pin
|
|
||||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
|
||||||
|
|
||||||
#ifndef PLATFORM_M997_SUPPORT
|
|
||||||
#define PLATFORM_M997_SUPPORT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void flashFirmware(const int16_t);
|
|
||||||
|
|
||||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
|
||||||
|
|
||||||
extern "C" char* _sbrk(int incr);
|
|
||||||
extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char* sout);
|
|
||||||
|
|
||||||
// MarlinHAL Class
|
|
||||||
class MarlinHAL {
|
|
||||||
public:
|
|
||||||
// Before setup()
|
|
||||||
MarlinHAL() = default;
|
|
||||||
|
|
||||||
// Watchdog
|
|
||||||
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
|
||||||
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
|
||||||
|
|
||||||
static void init(); // called early in setup()
|
|
||||||
static void init_board() {} // called less early in setup()
|
|
||||||
static void reboot() { NVIC_SystemReset(); } // restart the firmware from 0x0
|
|
||||||
|
|
||||||
// Interrupts
|
|
||||||
static bool isr_state() { return !__get_PRIMASK(); }
|
|
||||||
static void isr_on() { sei(); }
|
|
||||||
static void isr_off() { cli(); }
|
|
||||||
static void delay_ms(const int ms) { delay(ms); }
|
|
||||||
|
|
||||||
// Tasks called from idle()
|
|
||||||
static void idletask() {}
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
static uint8_t get_reset_source();
|
|
||||||
static void clear_reset_source() { RCU_I.clear_all_reset_flags(); }
|
|
||||||
|
|
||||||
// Free SRAM
|
|
||||||
static int freeMemory();
|
|
||||||
|
|
||||||
// ADC methods
|
|
||||||
static uint16_t adc_result;
|
|
||||||
|
|
||||||
// Called by Temperature::init once at startup
|
|
||||||
static void adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); }
|
|
||||||
|
|
||||||
// Called by Temperature::init for each sensor at startup
|
|
||||||
static void adc_enable(const pin_t pin) { pinMode(pin, INPUT); }
|
|
||||||
|
|
||||||
// Called from Temperature::isr to start ADC sampling on the given pin
|
|
||||||
static void adc_start(const pin_t pin) { adc_result = static_cast<uint16_t>(analogRead(pin)); }
|
|
||||||
|
|
||||||
// Check if ADC is ready for reading
|
|
||||||
static bool adc_ready() { return true; }
|
|
||||||
|
|
||||||
// Current value of the ADC register
|
|
||||||
static uint16_t adc_value() { return adc_result; }
|
|
||||||
|
|
||||||
// Set the PWM duty cycle for the pin to the given value.
|
|
||||||
// Optionally invert the duty cycle [default = false]
|
|
||||||
// Optionally change the maximum size of the provided value to enable finer PWM duty control [default = 255]
|
|
||||||
static void set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale = 255U, const bool invert = false);
|
|
||||||
|
|
||||||
// Set the frequency of the timer for the given pin.
|
|
||||||
// All Timer PWM pins run at the same frequency.
|
|
||||||
static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
|
|
||||||
};
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <SPI.h>
|
|
||||||
|
|
||||||
using MarlinSPI = SPIClass;
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "MarlinSerial.h"
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
||||||
auto MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) -> MarlinSerial& {
|
|
||||||
auto& serial = UsartSerial::get_instance(Base, rxPin, txPin);
|
|
||||||
return *reinterpret_cast<MarlinSerial*>(&serial);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if USING_HW_SERIAL0
|
|
||||||
MSerialT MSerial0(true, MarlinSerial::get_instance(usart::USART_Base::USART0_BASE, NO_PIN, NO_PIN));
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
MSerialT MSerial1(true, MarlinSerial::get_instance(usart::USART_Base::USART1_BASE, NO_PIN, NO_PIN));
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
MSerialT MSerial2(true, MarlinSerial::get_instance(usart::USART_Base::USART2_BASE, NO_PIN, NO_PIN));
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
MSerialT MSerial3(true, MarlinSerial::get_instance(usart::USART_Base::UART3_BASE, NO_PIN, NO_PIN));
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL4
|
|
||||||
MSerialT MSerial4(true, MarlinSerial::get_instance(usart::USART_Base::UART4_BASE, NO_PIN, NO_PIN));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
// This callback needs to access the specific MarlinSerial instance
|
|
||||||
// We'll use a static pointer to track the current instance
|
|
||||||
static MarlinSerial* current_serial_instance = nullptr;
|
|
||||||
|
|
||||||
static void emergency_callback() {
|
|
||||||
if (!current_serial_instance) return;
|
|
||||||
const auto last_data = current_serial_instance->get_last_data();
|
|
||||||
emergency_parser.update(current_serial_instance->emergency_state, last_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerial::register_emergency_callback(void (*callback)()) {
|
|
||||||
usart_.register_interrupt_callback(usart::Interrupt_Type::INTR_RBNEIE, callback);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void MarlinSerial::begin(unsigned long baudrate, uint16_t config) {
|
|
||||||
UsartSerial::begin(baudrate, config, ENABLED(SERIAL_DMA));
|
|
||||||
#if ENABLED(EMERGENCY_PARSER) && DISABLED(SERIAL_DMA)
|
|
||||||
current_serial_instance = this;
|
|
||||||
register_emergency_callback(emergency_callback);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerial::updateRxDmaBuffer() {
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
// Get the number of bytes available in the receive buffer
|
|
||||||
const size_t available_bytes = usart_.available_for_read(true);
|
|
||||||
|
|
||||||
// Process only the available data
|
|
||||||
for (size_t i = 0; i < available_bytes; ++i) {
|
|
||||||
uint8_t data;
|
|
||||||
if (usart_.read_rx_buffer(data))
|
|
||||||
emergency_parser.update(emergency_state, data);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// Call the base class implementation to handle any additional updates
|
|
||||||
UsartSerial::updateRxDmaBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <UsartSerial.hpp>
|
|
||||||
|
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
|
||||||
#define SERIAL_INDEX_MIN 0
|
|
||||||
#define SERIAL_INDEX_MAX 4
|
|
||||||
|
|
||||||
#include "../shared/serial_ports.h"
|
|
||||||
|
|
||||||
#if defined(LCD_SERIAL_PORT) && ANY(HAS_DGUS_LCD, EXTENSIBLE_UI)
|
|
||||||
#define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace arduino;
|
|
||||||
|
|
||||||
struct MarlinSerial : public UsartSerial {
|
|
||||||
static auto get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN) -> MarlinSerial&;
|
|
||||||
|
|
||||||
void begin(unsigned long baudrate, uint16_t config);
|
|
||||||
inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); }
|
|
||||||
void updateRxDmaBuffer();
|
|
||||||
|
|
||||||
#if DISABLED(SERIAL_DMA)
|
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return 0; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
EmergencyParser::State emergency_state;
|
|
||||||
|
|
||||||
// Accessor method to get the last received byte
|
|
||||||
auto get_last_data() -> uint8_t { return usart_.get_last_data(); }
|
|
||||||
|
|
||||||
// Register the emergency callback
|
|
||||||
void register_emergency_callback(void (*callback)());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
protected:
|
|
||||||
using UsartSerial::UsartSerial;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef Serial1Class<MarlinSerial> MSerialT;
|
|
||||||
extern MSerialT MSerial0;
|
|
||||||
extern MSerialT MSerial1;
|
|
||||||
extern MSerialT MSerial2;
|
|
||||||
extern MSerialT MSerial3;
|
|
||||||
extern MSerialT MSerial4;
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
#include "../shared/MinSerial.h"
|
|
||||||
|
|
||||||
// Base addresses for USART peripherals
|
|
||||||
static constexpr uintptr_t USART_base[] = {
|
|
||||||
0x40013800, // USART0
|
|
||||||
0x40004400, // USART1
|
|
||||||
0x40004800, // USART2
|
|
||||||
0x40004C00, // UART3
|
|
||||||
0x40005000 // UART4
|
|
||||||
};
|
|
||||||
|
|
||||||
// Register offsets
|
|
||||||
static constexpr uint32_t STAT0_OFFSET = 0x00U;
|
|
||||||
static constexpr uint32_t DATA_OFFSET = 0x04U;
|
|
||||||
static constexpr uint32_t BAUD_OFFSET = 0x08U;
|
|
||||||
static constexpr uint32_t CTL0_OFFSET = 0x0CU;
|
|
||||||
static constexpr uint32_t CTL1_OFFSET = 0x14U;
|
|
||||||
|
|
||||||
// Bit positions
|
|
||||||
static constexpr uint32_t TBE_BIT = 7;
|
|
||||||
static constexpr uint32_t TEN_BIT = 3;
|
|
||||||
static constexpr uint32_t UEN_BIT = 13;
|
|
||||||
|
|
||||||
// NVIC interrupt numbers for USART
|
|
||||||
static constexpr int nvicUART[] = { 37, 38, 39, 52, 53 };
|
|
||||||
|
|
||||||
// RCU PCLK values for USART
|
|
||||||
static constexpr rcu::RCU_PCLK clockRegs[] = {
|
|
||||||
rcu::RCU_PCLK::PCLK_USART0,
|
|
||||||
rcu::RCU_PCLK::PCLK_USART1,
|
|
||||||
rcu::RCU_PCLK::PCLK_USART2,
|
|
||||||
rcu::RCU_PCLK::PCLK_UART3,
|
|
||||||
rcu::RCU_PCLK::PCLK_UART4
|
|
||||||
};
|
|
||||||
|
|
||||||
// Memory barrier instructions
|
|
||||||
#define isb() __asm__ __volatile__ ("isb" : : : "memory")
|
|
||||||
#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
|
|
||||||
#define sw_barrier() __asm__ volatile("" : : : "memory")
|
|
||||||
|
|
||||||
// Direct register access macros
|
|
||||||
#define USART_REG(offset) (*(volatile uint32_t*)(USART_base[SERIAL_PORT] + (offset)))
|
|
||||||
#define USART_STAT0 USART_REG(STAT0_OFFSET)
|
|
||||||
#define USART_DATA USART_REG(DATA_OFFSET)
|
|
||||||
#define USART_BAUD USART_REG(BAUD_OFFSET)
|
|
||||||
#define USART_CTL0 USART_REG(CTL0_OFFSET)
|
|
||||||
#define USART_CTL1 USART_REG(CTL1_OFFSET)
|
|
||||||
|
|
||||||
// Bit manipulation macros
|
|
||||||
#define READ_BIT(reg, bit) (((reg) >> (bit)) & 1U)
|
|
||||||
#define SET_BIT(reg, bit) ((reg) |= (1U << (bit)))
|
|
||||||
#define CLEAR_BIT(reg, bit) ((reg) &= ~(1U << (bit)))
|
|
||||||
|
|
||||||
// Initializes the MinSerial interface.
|
|
||||||
// This function sets up the USART interface for serial communication.
|
|
||||||
// If the selected serial port is not a hardware port, it disables the severe error reporting feature.
|
|
||||||
static void MinSerialBegin() {
|
|
||||||
#if !WITHIN(SERIAL_PORT, 0, 4)
|
|
||||||
#warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error."
|
|
||||||
#warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port."
|
|
||||||
#else
|
|
||||||
int nvicIndex = nvicUART[SERIAL_PORT];
|
|
||||||
|
|
||||||
// NVIC base address for interrupt disable
|
|
||||||
struct NVICMin {
|
|
||||||
volatile uint32_t ISER[32];
|
|
||||||
volatile uint32_t ICER[32];
|
|
||||||
};
|
|
||||||
NVICMin *nvicBase = (NVICMin*)0xE000E100;
|
|
||||||
|
|
||||||
SBI32(nvicBase->ICER[nvicIndex >> 5], nvicIndex & 0x1F);
|
|
||||||
|
|
||||||
// We require memory barriers to properly disable interrupts
|
|
||||||
// (https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the)
|
|
||||||
dsb();
|
|
||||||
isb();
|
|
||||||
|
|
||||||
// Get the RCU PCLK for this USART
|
|
||||||
rcu::RCU_PCLK pclk = clockRegs[SERIAL_PORT];
|
|
||||||
|
|
||||||
// Disable then enable usart peripheral clocks
|
|
||||||
rcu::RCU_DEVICE.set_pclk_enable(pclk, false);
|
|
||||||
rcu::RCU_DEVICE.set_pclk_enable(pclk, true);
|
|
||||||
|
|
||||||
// Save current baudrate
|
|
||||||
uint32_t baudrate = USART_BAUD;
|
|
||||||
|
|
||||||
// Reset USART control registers
|
|
||||||
USART_CTL0 = 0;
|
|
||||||
USART_CTL1 = 0; // 1 stop bit
|
|
||||||
|
|
||||||
// Restore baudrate
|
|
||||||
USART_BAUD = baudrate;
|
|
||||||
|
|
||||||
// Enable transmitter and USART (8 bits, no parity, 1 stop bit)
|
|
||||||
SET_BIT(USART_CTL0, TEN_BIT);
|
|
||||||
SET_BIT(USART_CTL0, UEN_BIT);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes a single character to the serial port.
|
|
||||||
static void MinSerialWrite(char c) {
|
|
||||||
#if WITHIN(SERIAL_PORT, 0, 4)
|
|
||||||
// Wait until transmit buffer is empty
|
|
||||||
while (!READ_BIT(USART_STAT0, TBE_BIT)) {
|
|
||||||
hal.watchdog_refresh();
|
|
||||||
sw_barrier();
|
|
||||||
}
|
|
||||||
// Write character to data register
|
|
||||||
USART_DATA = c;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Installs the minimum serial interface.
|
|
||||||
// Sets the HAL_min_serial_init and HAL_min_serial_out function pointers to MinSerialBegin and MinSerialWrite respectively.
|
|
||||||
void install_min_serial() {
|
|
||||||
HAL_min_serial_init = &MinSerialBegin;
|
|
||||||
HAL_min_serial_out = &MinSerialWrite;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
// A low-level assembly-based jump handler.
|
|
||||||
// Unconditionally branches to the CommonHandler_ASM function.
|
|
||||||
__attribute__((naked, aligned(4))) void JumpHandler_ASM() {
|
|
||||||
__asm__ __volatile__ ("b CommonHandler_ASM\n");
|
|
||||||
}
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // POSTMORTEM_DEBUGGING
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# Generic GD32 HAL based on the MFL Arduino Core
|
|
||||||
|
|
||||||
This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library.
|
|
||||||
|
|
||||||
Currently it supports:
|
|
||||||
|
|
||||||
- GD32F303RET6
|
|
||||||
|
|
||||||
Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL).
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if HAS_SERVOS
|
|
||||||
|
|
||||||
#include "Servo.h"
|
|
||||||
|
|
||||||
static uint_fast8_t servoCount = 0;
|
|
||||||
static libServo* servos[NUM_SERVOS] = {0};
|
|
||||||
constexpr millis_t servoDelay[] = SERVO_DELAY;
|
|
||||||
static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
|
|
||||||
|
|
||||||
// Initialize to the default timer priority. This will be overridden by a call from timers.cpp.
|
|
||||||
// This allows all timer interrupt priorities to be managed from a single location in the HAL.
|
|
||||||
static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 12, 0);
|
|
||||||
|
|
||||||
// This must be called after the MFL Servo class has initialized the timer.
|
|
||||||
// To be safe this is currently called after every call to attach().
|
|
||||||
static void fixServoTimerInterruptPriority() {
|
|
||||||
auto& servoTimerIdx = GeneralTimer::get_instance(static_cast<timer::TIMER_Base>(TIMER_SERVO));
|
|
||||||
NVIC_SetPriority(servoTimerIdx.getTimerUpIRQ(), servo_interrupt_priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default constructor for libServo class.
|
|
||||||
// Initializes the servo delay, pause state, and pause value.
|
|
||||||
// Registers the servo instance in the servos array.
|
|
||||||
libServo::libServo() :
|
|
||||||
delay(servoDelay[servoCount]),
|
|
||||||
was_attached_before_pause(false),
|
|
||||||
value_before_pause(0)
|
|
||||||
{
|
|
||||||
servos[servoCount++] = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attaches a servo to a specified pin.
|
|
||||||
int8_t libServo::attach(const int pin) {
|
|
||||||
if (servoCount >= MAX_SERVOS) return -1;
|
|
||||||
if (pin > 0) servoPin = pin;
|
|
||||||
auto result = mflServo.attach(servoPin);
|
|
||||||
fixServoTimerInterruptPriority();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attaches a servo to a specified pin with minimum and maximum pulse widths.
|
|
||||||
int8_t libServo::attach(const int pin, const int min, const int max) {
|
|
||||||
if (servoCount >= MAX_SERVOS) return -1;
|
|
||||||
if (pin > 0) servoPin = pin;
|
|
||||||
auto result = mflServo.attach(servoPin, min, max);
|
|
||||||
fixServoTimerInterruptPriority();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Moves the servo to a specified position.
|
|
||||||
void libServo::move(const int value) {
|
|
||||||
if (attach(0) >= 0) {
|
|
||||||
mflServo.write(value);
|
|
||||||
safe_delay(delay);
|
|
||||||
TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pause the servo by detaching it and storing its current state.
|
|
||||||
void libServo::pause() {
|
|
||||||
was_attached_before_pause = mflServo.attached();
|
|
||||||
if (was_attached_before_pause) {
|
|
||||||
value_before_pause = mflServo.read();
|
|
||||||
mflServo.detach();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resume a previously paused servo.
|
|
||||||
// If the servo was attached before the pause, this function re-attaches
|
|
||||||
// the servo and moves it to the position it was in before the pause.
|
|
||||||
void libServo::resume() {
|
|
||||||
if (was_attached_before_pause) {
|
|
||||||
attach();
|
|
||||||
move(value_before_pause);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pause all servos by stopping their timers.
|
|
||||||
void libServo::pause_all_servos() {
|
|
||||||
for (auto& servo : servos)
|
|
||||||
if (servo) servo->pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resume all paused servos by starting their timers.
|
|
||||||
void libServo::resume_all_servos() {
|
|
||||||
for (auto& servo : servos)
|
|
||||||
if (servo) servo->resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the interrupt priority for the servo.
|
|
||||||
// @param preemptPriority The preempt priority level.
|
|
||||||
// @param subPriority The sub priority level.
|
|
||||||
void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) {
|
|
||||||
servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAS_SERVOS
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 <Servo.h>
|
|
||||||
|
|
||||||
#include "../../core/millis_t.h"
|
|
||||||
|
|
||||||
// Inherit and expand on the official library
|
|
||||||
class libServo {
|
|
||||||
public:
|
|
||||||
libServo();
|
|
||||||
|
|
||||||
int8_t attach(const int pin = 0); // pin == 0 uses value from previous call
|
|
||||||
int8_t attach(const int pin, const int min, const int max);
|
|
||||||
void detach() { mflServo.detach(); }
|
|
||||||
|
|
||||||
int read() { return mflServo.read(); }
|
|
||||||
void move(const int value);
|
|
||||||
|
|
||||||
void pause();
|
|
||||||
void resume();
|
|
||||||
|
|
||||||
static void pause_all_servos();
|
|
||||||
static void resume_all_servos();
|
|
||||||
|
|
||||||
static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Servo mflServo;
|
|
||||||
|
|
||||||
int servoPin = 0;
|
|
||||||
millis_t delay = 0;
|
|
||||||
|
|
||||||
bool was_attached_before_pause;
|
|
||||||
int value_before_pause;
|
|
||||||
};
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm / Ryan Power
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
|
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
#define nop asm volatile ("\tnop\n")
|
|
||||||
|
|
||||||
static inline uint8_t swSpiTransfer_mode_0(uint8_t b) {
|
|
||||||
for (uint8_t i = 0; i < 8; ++i) {
|
|
||||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
|
||||||
WRITE(DOGLCD_SCK, HIGH);
|
|
||||||
WRITE(DOGLCD_MOSI, state);
|
|
||||||
b <<= 1;
|
|
||||||
WRITE(DOGLCD_SCK, LOW);
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint8_t swSpiTransfer_mode_3(uint8_t b) {
|
|
||||||
for (uint8_t i = 0; i < 8; ++i) {
|
|
||||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
|
||||||
WRITE(DOGLCD_SCK, LOW);
|
|
||||||
WRITE(DOGLCD_MOSI, state);
|
|
||||||
b <<= 1;
|
|
||||||
WRITE(DOGLCD_SCK, HIGH);
|
|
||||||
}
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void u8g_sw_spi_shift_out(uint8_t val) {
|
|
||||||
#if U8G_SPI_USE_MODE_3
|
|
||||||
swSpiTransfer_mode_3(val);
|
|
||||||
#else
|
|
||||||
swSpiTransfer_mode_0(val);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void swSpiInit() {
|
|
||||||
#if PIN_EXISTS(LCD_RESET)
|
|
||||||
SET_OUTPUT(LCD_RESET_PIN);
|
|
||||||
#endif
|
|
||||||
SET_OUTPUT(DOGLCD_A0);
|
|
||||||
OUT_WRITE(DOGLCD_SCK, LOW);
|
|
||||||
OUT_WRITE(DOGLCD_MOSI, LOW);
|
|
||||||
OUT_WRITE(DOGLCD_CS, HIGH);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
|
||||||
switch (msg) {
|
|
||||||
case U8G_COM_MSG_INIT:
|
|
||||||
swSpiInit();
|
|
||||||
break;
|
|
||||||
case U8G_COM_MSG_STOP:
|
|
||||||
break;
|
|
||||||
case U8G_COM_MSG_RESET:
|
|
||||||
#if PIN_EXISTS(LCD_RESET)
|
|
||||||
WRITE(LCD_RESET_PIN, arg_val);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case U8G_COM_MSG_CHIP_SELECT:
|
|
||||||
#if U8G_SPI_USE_MODE_3 // This 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
|
|
||||||
WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active
|
|
||||||
WRITE(DOGLCD_CS, LOW);
|
|
||||||
nop; // Hold SCK high for a few ns
|
|
||||||
nop;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WRITE(DOGLCD_CS, HIGH);
|
|
||||||
WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
WRITE(DOGLCD_CS, !arg_val);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case U8G_COM_MSG_WRITE_BYTE:
|
|
||||||
u8g_sw_spi_shift_out(arg_val);
|
|
||||||
break;
|
|
||||||
case U8G_COM_MSG_WRITE_SEQ: {
|
|
||||||
uint8_t* ptr = (uint8_t*)arg_ptr;
|
|
||||||
while (arg_val > 0) {
|
|
||||||
u8g_sw_spi_shift_out(*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_shift_out(u8g_pgm_read(ptr));
|
|
||||||
ptr++;
|
|
||||||
arg_val--;
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1)
|
|
||||||
WRITE(DOGLCD_A0, arg_val);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PersistentStore for Arduino-style EEPROM interface
|
|
||||||
* with simple implementations supplied by Marlin.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if ENABLED(IIC_BL24CXX_EEPROM)
|
|
||||||
|
|
||||||
#include "../../shared/eeprom_if.h"
|
|
||||||
#include "../../shared/eeprom_api.h"
|
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
|
||||||
#error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t PersistentStore::capacity() {
|
|
||||||
return MARLIN_EEPROM_SIZE - eeprom_exclude_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::access_start() {
|
|
||||||
eeprom_init();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::access_finish() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
|
||||||
uint16_t written = 0;
|
|
||||||
while (size--) {
|
|
||||||
uint8_t v = *value;
|
|
||||||
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
|
||||||
// EPROM has only ~100,000 write cycles,
|
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
|
||||||
if (++written & 0x7F) delay(2); else safe_delay(2);
|
|
||||||
if (eeprom_read_byte(p) != v) {
|
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
crc16(crc, &v, 1);
|
|
||||||
pos++;
|
|
||||||
value++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
|
||||||
do {
|
|
||||||
const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos));
|
|
||||||
if (writing) *value = c;
|
|
||||||
crc16(crc, &c, 1);
|
|
||||||
pos++;
|
|
||||||
value++;
|
|
||||||
} while (--size);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // IIC_BL24CXX_EEPROM
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Platform-independent Arduino functions for I2C EEPROM.
|
|
||||||
* Enable USE_SHARED_EEPROM if not supplied by the framework.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if ENABLED(IIC_BL24CXX_EEPROM)
|
|
||||||
|
|
||||||
#include "../../../libs/BL24CXX.h"
|
|
||||||
#include "../../shared/eeprom_if.h"
|
|
||||||
|
|
||||||
void eeprom_init() {
|
|
||||||
BL24CXX::init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
|
|
||||||
const unsigned eeprom_address = (unsigned)pos;
|
|
||||||
BL24CXX::writeOneByte(eeprom_address, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t eeprom_read_byte(uint8_t *pos) {
|
|
||||||
const unsigned eeprom_address = (unsigned)pos;
|
|
||||||
return BL24CXX::readOneByte(eeprom_address);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // IIC_BL24CXX_EEPROM
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "../../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if USE_WIRED_EEPROM
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PersistentStore for Arduino-style EEPROM interface
|
|
||||||
* with simple implementations supplied by Marlin.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../../shared/eeprom_if.h"
|
|
||||||
#include "../../shared/eeprom_api.h"
|
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
|
||||||
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size_t PersistentStore::capacity() {
|
|
||||||
return MARLIN_EEPROM_SIZE - eeprom_exclude_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::access_start() {
|
|
||||||
eeprom_init();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::access_finish() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
|
||||||
uint16_t written = 0;
|
|
||||||
while (size--) {
|
|
||||||
uint8_t v = *value;
|
|
||||||
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
|
||||||
// EEPROM has only ~100,000 write cycles,
|
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
|
||||||
// Avoid triggering watchdog during long EEPROM writes
|
|
||||||
if (++written & 0x7F)
|
|
||||||
delay(2);
|
|
||||||
else
|
|
||||||
safe_delay(2);
|
|
||||||
if (eeprom_read_byte(p) != v) {
|
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
crc16(crc, &v, 1);
|
|
||||||
pos++;
|
|
||||||
value++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
|
||||||
do {
|
|
||||||
const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos));
|
|
||||||
if (writing)
|
|
||||||
*value = c;
|
|
||||||
crc16(crc, &c, 1);
|
|
||||||
pos++;
|
|
||||||
value++;
|
|
||||||
} while (--size);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // USE_WIRED_EEPROM
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 "../../module/endstops.h"
|
|
||||||
|
|
||||||
// One ISR for all EXT-Interrupts
|
|
||||||
void endstop_ISR() { endstops.update(); }
|
|
||||||
|
|
||||||
void setup_endstop_interrupts() {
|
|
||||||
#define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE)
|
|
||||||
TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN));
|
|
||||||
TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN));
|
|
||||||
TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN));
|
|
||||||
TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN));
|
|
||||||
TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN));
|
|
||||||
TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN));
|
|
||||||
TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN));
|
|
||||||
TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN));
|
|
||||||
TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN));
|
|
||||||
TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN));
|
|
||||||
TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN));
|
|
||||||
TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN));
|
|
||||||
TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN));
|
|
||||||
TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN));
|
|
||||||
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
|
||||||
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
|
||||||
TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN));
|
|
||||||
TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN));
|
|
||||||
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN));
|
|
||||||
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN));
|
|
||||||
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN));
|
|
||||||
TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN));
|
|
||||||
TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN));
|
|
||||||
TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN));
|
|
||||||
TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN));
|
|
||||||
TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN));
|
|
||||||
TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN));
|
|
||||||
TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN));
|
|
||||||
TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN));
|
|
||||||
TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN));
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#include <PinOpsMap.hpp>
|
|
||||||
#include <PinOps.hpp>
|
|
||||||
#include "timers.h"
|
|
||||||
|
|
||||||
static uint16_t timer_frequency[TIMER_COUNT];
|
|
||||||
|
|
||||||
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale, const bool invert) {
|
|
||||||
// Calculate duty cycle based on inversion flag
|
|
||||||
const uint16_t duty = invert ? scale - value : value;
|
|
||||||
|
|
||||||
// Check if the pin supports PWM
|
|
||||||
if (PWM_PIN(pin)) {
|
|
||||||
// Get the timer peripheral base associated with the pin
|
|
||||||
const auto timer_base = getPinOpsPeripheralBase<TIMERPinOps, timer::TIMER_Base>(TIMER_PinOps, static_cast<pin_size_t>(pin));
|
|
||||||
|
|
||||||
// Initialize the timer instance
|
|
||||||
auto& TimerInstance = GeneralTimer::get_instance(timer_base);
|
|
||||||
|
|
||||||
// Get channel and previous channel mode
|
|
||||||
const auto channel = getPackedPinChannel(getPackedPinOps(TIMER_PinOps, static_cast<pin_size_t>(pin)));
|
|
||||||
const InputOutputMode previous = TimerInstance.getChannelMode(channel);
|
|
||||||
|
|
||||||
if (timer_frequency[static_cast<size_t>(timer_base)] == 0) {
|
|
||||||
set_pwm_frequency(pin, PWM_FREQUENCY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the PWM duty cycle
|
|
||||||
TimerInstance.setCaptureCompare(channel, duty, CCFormat::B8);
|
|
||||||
|
|
||||||
// Configure pin as PWM output
|
|
||||||
pinOpsPinout(TIMER_PinOps, static_cast<pin_size_t>(pin));
|
|
||||||
|
|
||||||
// Set channel mode if not already set and start timer
|
|
||||||
if (previous != InputOutputMode::PWM0) {
|
|
||||||
TimerInstance.setChannelMode(channel, InputOutputMode::PWM0, static_cast<pin_size_t>(pin));
|
|
||||||
TimerInstance.start();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pinMode(pin, OUTPUT);
|
|
||||||
digitalWrite(pin, duty < scale / 2 ? LOW : HIGH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
|
||||||
// Check if the pin supports PWM
|
|
||||||
if (!PWM_PIN(pin)) return;
|
|
||||||
|
|
||||||
// Get the timer peripheral base associated with the pin
|
|
||||||
const auto timer_base = getPinOpsPeripheralBase<TIMERPinOps, timer::TIMER_Base>(TIMER_PinOps, static_cast<pin_size_t>(pin));
|
|
||||||
|
|
||||||
// Guard against modifying protected timers
|
|
||||||
#ifdef STEP_TIMER
|
|
||||||
if (timer_base == static_cast<timer::TIMER_Base>(STEP_TIMER)) return;
|
|
||||||
#endif
|
|
||||||
#ifdef TEMP_TIMER
|
|
||||||
if (timer_base == static_cast<timer::TIMER_Base>(TEMP_TIMER)) return;
|
|
||||||
#endif
|
|
||||||
#if defined(PULSE_TIMER) && MF_TIMER_PULSE != MF_TIMER_STEP
|
|
||||||
if (timer_base == static_cast<timer::TIMER_Base>(PULSE_TIMER)) return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Initialize the timer instance
|
|
||||||
auto& TimerInstance = GeneralTimer::get_instance(timer_base);
|
|
||||||
|
|
||||||
TimerInstance.setRolloverValue(f_desired, TimerFormat::HERTZ);
|
|
||||||
timer_frequency[timer_base_to_index(timer_base)] = f_desired;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 interfaces for GD32
|
|
||||||
|
|
||||||
#include <GPIO.hpp>
|
|
||||||
#include <variant.h>
|
|
||||||
#include <PinOps.hpp>
|
|
||||||
#include <PinOpsMap.hpp>
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
FORCE_INLINE static void fast_write_pin_wrapper(pin_size_t IO, T V) {
|
|
||||||
const PortPinPair& pp = port_pin_map[IO];
|
|
||||||
gpio::fast_write_pin(pp.port, pp.pin, static_cast<bool>(V));
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static auto fast_read_pin_wrapper(pin_size_t IO) -> bool {
|
|
||||||
const PortPinPair& pp = port_pin_map[IO];
|
|
||||||
return gpio::fast_read_pin(pp.port, pp.pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE static void fast_toggle_pin_wrapper(pin_size_t IO) {
|
|
||||||
const PortPinPair& pp = port_pin_map[IO];
|
|
||||||
gpio::fast_toggle_pin(pp.port, pp.pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Defines
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
#ifndef PWM
|
|
||||||
#define PWM OUTPUT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define _WRITE(IO, V) fast_write_pin_wrapper(IO, V)
|
|
||||||
#define _READ(IO) fast_read_pin_wrapper(IO)
|
|
||||||
#define _TOGGLE(IO) fast_toggle_pin_wrapper(IO)
|
|
||||||
|
|
||||||
#define _GET_MODE(IO)
|
|
||||||
#define _SET_MODE(IO, M) pinMode((IO), (M))
|
|
||||||
#define _SET_OUTPUT(IO) pinMode((IO), OUTPUT)
|
|
||||||
#define _SET_OUTPUT_OD(IO) pinMode((IO), OUTPUT_OPEN_DRAIN)
|
|
||||||
|
|
||||||
#define WRITE(IO, V) _WRITE((IO), (V))
|
|
||||||
#define READ(IO) _READ(IO)
|
|
||||||
#define TOGGLE(IO) _TOGGLE(IO)
|
|
||||||
|
|
||||||
#define OUT_WRITE(IO, V) do { _SET_OUTPUT(IO); WRITE((IO), (V)); } while (0)
|
|
||||||
#define OUT_WRITE_OD(IO, V) do { _SET_OUTPUT_OD(IO); WRITE((IO), (V)); } while (0)
|
|
||||||
|
|
||||||
#define SET_INPUT(IO) _SET_MODE((IO), INPUT)
|
|
||||||
#define SET_INPUT_PULLUP(IO) _SET_MODE((IO), INPUT_PULLUP)
|
|
||||||
#define SET_INPUT_PULLDOWN(IO) _SET_MODE((IO), INPUT_PULLDOWN)
|
|
||||||
#define SET_OUTPUT(IO) OUT_WRITE((IO), LOW)
|
|
||||||
#define SET_OUTPUT_OD(IO) OUT_WRITE_OD((IO), LOW)
|
|
||||||
#define SET_PWM(IO) _SET_MODE((IO), PWM)
|
|
||||||
|
|
||||||
#define IS_INPUT(IO)
|
|
||||||
#define IS_OUTPUT(IO)
|
|
||||||
|
|
||||||
#define PWM_PIN(P) isPinInPinOps(TIMER_PinOps, P)
|
|
||||||
#define NO_COMPILE_TIME_PWM
|
|
||||||
|
|
||||||
// Wrappers for digitalRead and digitalWrite
|
|
||||||
#define extDigitalRead(IO) digitalRead(IO)
|
|
||||||
#define extDigitalWrite(IO, V) digitalWrite((IO), (V))
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
|
|
||||||
#define U8G_SW_SPI_MFL 1
|
|
||||||
#endif
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 ALL(HAS_MEDIA, USBD_USE_CDC_MSC)
|
|
||||||
#define HAS_SD_HOST_DRIVE 1
|
|
||||||
#endif
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 no real or emulated EEPROM selected, fall back to SD emulation
|
|
||||||
#if USE_FALLBACK_EEPROM
|
|
||||||
#define SDCARD_EEPROM_EMULATION
|
|
||||||
#elif ANY(I2C_EEPROM, SPI_EEPROM)
|
|
||||||
#define USE_SHARED_EEPROM 1
|
|
||||||
#endif
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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,97 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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
|
|
||||||
|
|
||||||
// Test MFL GD32 specific configuration values for errors at compile-time.
|
|
||||||
#if ENABLED(SDCARD_EEPROM_EMULATION) && !HAS_MEDIA
|
|
||||||
#undef SDCARD_EEPROM_EMULATION // avoid additional error noise
|
|
||||||
#if USE_FALLBACK_EEPROM
|
|
||||||
#warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION."
|
|
||||||
#endif
|
|
||||||
#error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(FLASH_EEPROM_LEVELING)
|
|
||||||
#error "FLASH_EEPROM_LEVELING is not supported on GD32."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
|
||||||
#error "SERIAL_STATS_MAX_RX_QUEUED is not supported on GD32."
|
|
||||||
#elif ENABLED(SERIAL_STATS_DROPPED_RX)
|
|
||||||
#error "SERIAL_STATS_DROPPED_RX is not supported on GD32."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if TEMP_SENSOR_SOC && defined(ATEMP) && TEMP_SOC_PIN != ATEMP
|
|
||||||
#error "TEMP_SENSOR_SOC requires 'TEMP_SOC_PIN ATEMP' on GD32"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Check for common serial pin conflicts
|
|
||||||
#define _CHECK_SERIAL_PIN(N) (( \
|
|
||||||
BTN_EN1 == N || BTN_EN2 == 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 || \
|
|
||||||
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)
|
|
||||||
|
|
||||||
#if SERIAL_IN_USE(0)
|
|
||||||
#if CHECK_SERIAL_PIN(TX, 0)
|
|
||||||
#error "Serial Port 0 TX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#if CHECK_SERIAL_PIN(RX, 0)
|
|
||||||
#error "Serial Port 0 RX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if SERIAL_IN_USE(1)
|
|
||||||
#if CHECK_SERIAL_PIN(TX, 1)
|
|
||||||
#error "Serial Port 1 TX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#if CHECK_SERIAL_PIN(RX, 1)
|
|
||||||
#error "Serial Port 1 RX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if SERIAL_IN_USE(2)
|
|
||||||
#if CHECK_SERIAL_PIN(TX, 2)
|
|
||||||
#error "Serial Port 2 TX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#if CHECK_SERIAL_PIN(RX, 2)
|
|
||||||
#error "Serial Port 2 RX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if SERIAL_IN_USE(3)
|
|
||||||
#if CHECK_SERIAL_PIN(TX, 3)
|
|
||||||
#error "Serial Port 3 TX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#if CHECK_SERIAL_PIN(RX, 3)
|
|
||||||
#error "Serial Port 3 RX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if SERIAL_IN_USE(4)
|
|
||||||
#if CHECK_SERIAL_PIN(TX, 4)
|
|
||||||
#error "Serial Port 4 TX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#if CHECK_SERIAL_PIN(RX, 4)
|
|
||||||
#error "Serial Port 4 RX IO pins conflict with another pin on the board."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#undef CHECK_SERIAL_PIN
|
|
||||||
#undef _CHECK_SERIAL_PIN
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pins Debugging for GD32
|
|
||||||
*
|
|
||||||
* - NUMBER_PINS_TOTAL
|
|
||||||
* - MULTI_NAME_PAD
|
|
||||||
* - getPinByIndex(index)
|
|
||||||
* - printPinNameByIndex(index)
|
|
||||||
* - getPinIsDigitalByIndex(index)
|
|
||||||
* - digitalPinToAnalogIndex(pin)
|
|
||||||
* - getValidPinMode(pin)
|
|
||||||
* - isValidPin(pin)
|
|
||||||
* - isAnalogPin(pin)
|
|
||||||
* - digitalRead_mod(pin)
|
|
||||||
* - pwm_status(pin)
|
|
||||||
* - printPinPWM(pin)
|
|
||||||
* - printPinPort(pin)
|
|
||||||
* - printPinNumber(pin)
|
|
||||||
* - printPinAnalog(pin)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <PinOps.hpp>
|
|
||||||
#include <Analog.h>
|
|
||||||
|
|
||||||
#ifndef TOTAL_PIN_COUNT
|
|
||||||
#error "Expected TOTAL_PIN_COUNT not found."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NUM_DIGITAL_PINS TOTAL_PIN_COUNT
|
|
||||||
#define NUMBER_PINS_TOTAL TOTAL_PIN_COUNT
|
|
||||||
|
|
||||||
#define getPinByIndex(x) pin_t(pin_array[x].pin)
|
|
||||||
#define isValidPin(P) WITHIN(P, 0, (NUM_DIGITAL_PINS - 1))
|
|
||||||
#define digitalRead_mod(P) extDigitalRead(P)
|
|
||||||
#define printPinNumber(P) do { sprintf_P(buffer, PSTR("%3hd "), pin_t(P)); SERIAL_ECHO(buffer); } while (0)
|
|
||||||
#define printPinAnalog(P) do { sprintf_P(buffer, PSTR(" (A%2d) "), pin_t(getAdcChannelFromPin(P))); SERIAL_ECHO(buffer); } while (0)
|
|
||||||
#define printPinNameByIndex(x) do { sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); } while (0)
|
|
||||||
|
|
||||||
#define MULTI_NAME_PAD 21 // Space needed to be pretty if not first name assigned to a pin
|
|
||||||
|
|
||||||
#ifndef M43_NEVER_TOUCH
|
|
||||||
#define M43_NEVER_TOUCH(x) WITHIN(x, 9, 10) // SERIAL pins: PA9(TX) PA10(RX)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool isAnalogPin(const pin_t pin) {
|
|
||||||
if (!isValidPin(pin)) return false;
|
|
||||||
|
|
||||||
if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) {
|
|
||||||
const PortPinPair& pp = port_pin_map[pin];
|
|
||||||
auto& instance = gpio::GPIO::get_instance(pp.port).value();
|
|
||||||
return instance.get_pin_mode(pp.pin) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool getValidPinMode(const pin_t pin) {
|
|
||||||
if (!isValidPin(pin)) return false;
|
|
||||||
|
|
||||||
const PortPinPair& pp = port_pin_map[pin];
|
|
||||||
auto& instance = gpio::GPIO::get_instance(pp.port).value();
|
|
||||||
gpio::Pin_Mode mode = instance.get_pin_mode(pp.pin);
|
|
||||||
|
|
||||||
return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING &&
|
|
||||||
mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool getPinIsDigitalByIndex(const int16_t index) {
|
|
||||||
const pin_t pin = getPinByIndex(index);
|
|
||||||
return (!isAnalogPin(pin));
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t digitalPinToAnalogIndex(const pin_t pin) {
|
|
||||||
if (!isValidPin(pin) || !isAnalogPin(pin)) return -1;
|
|
||||||
return pin; // Analog and digital pin indexes are shared
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pwm_status(const pin_t pin) { return false; }
|
|
||||||
void printPinPWM(const pin_t pin) { /* TODO */ }
|
|
||||||
void printPinPort(const pin_t pin) { /* TODO */ }
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,222 +0,0 @@
|
|||||||
//
|
|
||||||
// MFL gd32f30x SDCARD using DMA through SDIO in C++
|
|
||||||
//
|
|
||||||
// Copyright (C) 2025 B. Mourit <bnmguy@gmail.com>
|
|
||||||
//
|
|
||||||
// This software 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 3 of the License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This software 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 software.
|
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
//
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#include <SDIO.hpp>
|
|
||||||
|
|
||||||
namespace sdio {
|
|
||||||
|
|
||||||
class DMA;
|
|
||||||
|
|
||||||
class CardDMA {
|
|
||||||
public:
|
|
||||||
static auto get_instance() -> CardDMA&;
|
|
||||||
|
|
||||||
// Initialization
|
|
||||||
auto init() -> SDIO_Error_Type;
|
|
||||||
auto card_init() -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Startup and shutdown procedures
|
|
||||||
auto begin_startup_procedure() -> SDIO_Error_Type;
|
|
||||||
void begin_shutdown_procedure();
|
|
||||||
|
|
||||||
// Configuration
|
|
||||||
auto set_hardware_bus_width(Bus_Width width) -> SDIO_Error_Type;
|
|
||||||
auto send_bus_width_command(uint32_t width_value) -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Main read/write/erase functions
|
|
||||||
auto read(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type;
|
|
||||||
auto write(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type;
|
|
||||||
auto erase(uint32_t address_start, uint32_t address_end) -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Card select
|
|
||||||
auto select_deselect() -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Status and state
|
|
||||||
auto get_card_interface_status(uint32_t* status) -> SDIO_Error_Type;
|
|
||||||
auto get_sdcard_status(uint32_t* status) -> SDIO_Error_Type;
|
|
||||||
auto get_transfer_state() -> Transfer_State;
|
|
||||||
auto get_card_state(Card_State* card_state) -> SDIO_Error_Type;
|
|
||||||
auto check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false) -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// DMA
|
|
||||||
void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write);
|
|
||||||
void check_dma_complete();
|
|
||||||
|
|
||||||
// Stop transfer
|
|
||||||
auto stop_transfer() -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Card information
|
|
||||||
auto get_card_specific_data(Card_Info* info) -> SDIO_Error_Type;
|
|
||||||
constexpr auto get_data_block_size_index(uint16_t size) -> Block_Size;
|
|
||||||
[[nodiscard]] auto get_card_capacity() const -> uint32_t;
|
|
||||||
|
|
||||||
// SDIO configuration
|
|
||||||
void sdio_configure(const SDIO_Config config) { sdio_.init(config); }
|
|
||||||
|
|
||||||
// Interrupt handler
|
|
||||||
void handle_interrupts();
|
|
||||||
|
|
||||||
// Variable stored parameters
|
|
||||||
auto get_scr(uint16_t rca, uint32_t* scr) -> SDIO_Error_Type;
|
|
||||||
auto store_cid() -> SDIO_Error_Type;
|
|
||||||
auto store_csd() -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Inlined accessor methods
|
|
||||||
auto get_config() -> SDIO_Config& { return config_; }
|
|
||||||
auto get_dma_instance() -> dma::DMA& { return dma_; }
|
|
||||||
void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); }
|
|
||||||
void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); }
|
|
||||||
auto get_is_sdio_rx() -> bool { return is_rx_; }
|
|
||||||
void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); }
|
|
||||||
void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); }
|
|
||||||
void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); }
|
|
||||||
auto get_state() -> Operational_State { return current_state_; }
|
|
||||||
void set_state(Operational_State state) { current_state_ = state; }
|
|
||||||
void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; }
|
|
||||||
void set_transfer_end(bool end) { transfer_end_ = end; };
|
|
||||||
|
|
||||||
auto set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) -> SDIO_Error_Type {
|
|
||||||
sdio_.init(SDIO_Config{
|
|
||||||
.desired_clock = desired_clock,
|
|
||||||
.enable_bypass = false,
|
|
||||||
.enable_powersave = low_power,
|
|
||||||
.enable_hwclock = false,
|
|
||||||
.clock_edge = Clock_Edge::RISING_EDGE,
|
|
||||||
.width = wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT
|
|
||||||
});
|
|
||||||
|
|
||||||
sync_domains();
|
|
||||||
desired_clock_ = desired_clock;
|
|
||||||
|
|
||||||
return SDIO_Error_Type::OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
CardDMA();
|
|
||||||
|
|
||||||
// Prevent copying or assigning
|
|
||||||
CardDMA(const CardDMA&) = delete;
|
|
||||||
auto operator=(const CardDMA&) -> CardDMA& = delete;
|
|
||||||
|
|
||||||
// Helper function
|
|
||||||
auto wait_for_card_ready() -> SDIO_Error_Type;
|
|
||||||
|
|
||||||
// Member variables
|
|
||||||
alignas(4) uint32_t sdcard_csd_[4];
|
|
||||||
alignas(4) uint32_t sdcard_cid_[4];
|
|
||||||
alignas(4) uint32_t sdcard_scr_[2];
|
|
||||||
uint32_t desired_clock_;
|
|
||||||
uint32_t total_bytes_;
|
|
||||||
SDIO& sdio_;
|
|
||||||
SDIO_Config& config_;
|
|
||||||
const dma::DMA_Base dmaBase_;
|
|
||||||
const dma::DMA_Channel dmaChannel_;
|
|
||||||
dma::DMA& dma_;
|
|
||||||
uint16_t sdcard_rca_;
|
|
||||||
SDIO_Error_Type transfer_error_;
|
|
||||||
Interface_Version interface_version_;
|
|
||||||
Card_Type card_type_;
|
|
||||||
Operational_State current_state_;
|
|
||||||
bool transfer_end_;
|
|
||||||
bool multiblock_;
|
|
||||||
bool is_rx_;
|
|
||||||
|
|
||||||
// Private helper methods
|
|
||||||
auto validate_voltage() -> SDIO_Error_Type;
|
|
||||||
auto get_command_sent_result() -> SDIO_Error_Type;
|
|
||||||
auto get_r1_result(Command_Index index) -> SDIO_Error_Type;
|
|
||||||
auto get_r6_result(Command_Index index, uint16_t* rca) -> SDIO_Error_Type;
|
|
||||||
auto get_r7_result() -> SDIO_Error_Type { return check_sdio_status(Command_Index::INVALID, false, false); };
|
|
||||||
void sync_domains() { delayMicroseconds(8); }
|
|
||||||
|
|
||||||
auto validate_transfer_params(uint32_t* buf, uint16_t size) -> bool {
|
|
||||||
if (buf == nullptr) return false;
|
|
||||||
// Size must be > 0, <= 2048 and power of 2
|
|
||||||
return size > 0U && size <= 2048U && !(size & (size - 1U));
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
|
|
||||||
const uint32_t device_size = ((csd_bytes[6] & 0x3U) << 10) |
|
|
||||||
(csd_bytes[7] << 2) |
|
|
||||||
((csd_bytes[8] >> 6) & 0x3U);
|
|
||||||
|
|
||||||
const uint8_t device_size_multiplier = ((csd_bytes[9] & 0x3U) << 1) |
|
|
||||||
((csd_bytes[10] >> 7) & 0x1U);
|
|
||||||
|
|
||||||
// Store calculated values
|
|
||||||
info->csd.device_size = device_size;
|
|
||||||
info->csd.device_size_multiplier = device_size_multiplier;
|
|
||||||
|
|
||||||
// Calculate block size and capacity
|
|
||||||
info->block_size = 1U << info->csd.read_block_length;
|
|
||||||
info->capacity = (device_size + 1U) *
|
|
||||||
(1U << (device_size_multiplier + 2U)) *
|
|
||||||
info->block_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
|
|
||||||
info->csd.device_size = static_cast<uint32_t>((csd_bytes[7] & 0x3FU) << 16) |
|
|
||||||
static_cast<uint32_t>((csd_bytes[8]) << 8) |
|
|
||||||
static_cast<uint32_t>(csd_bytes[9]);
|
|
||||||
|
|
||||||
// Set block size and calculate capacity
|
|
||||||
info->block_size = BLOCK_SIZE;
|
|
||||||
info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) *
|
|
||||||
BLOCK_SIZE * KILOBYTE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) {
|
|
||||||
// Calculate sector_size
|
|
||||||
info->csd.sector_size = static_cast<uint8_t>(((csd_bytes[9] & 0x3FU) << 1) |
|
|
||||||
(csd_bytes[10] & 0x80U) >> 7);
|
|
||||||
|
|
||||||
// Calculate speed_factor and write_block_length
|
|
||||||
info->csd.speed_factor = static_cast<uint8_t>((csd_bytes[11] & 0x1CU) >> 2);
|
|
||||||
info->csd.write_block_length = static_cast<uint8_t>(((csd_bytes[11] & 0x3U) << 2) |
|
|
||||||
((csd_bytes[12] & 0xC0U) >> 6));
|
|
||||||
|
|
||||||
// Calculate checksum
|
|
||||||
info->csd.checksum = static_cast<uint8_t>((csd_bytes[15] & 0xFEU) >> 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void disable_all_interrupts() {
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::TFHIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::RFHIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, false);
|
|
||||||
sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename CheckFunc>
|
|
||||||
auto send_command_and_check(Command_Index command, uint32_t argument,
|
|
||||||
Command_Response response, Wait_Type type, CheckFunc check_result) -> SDIO_Error_Type {
|
|
||||||
sdio_.set_command_state_machine(command, argument, response, type);
|
|
||||||
sync_domains();
|
|
||||||
sdio_.set_command_state_machine_enable(true);
|
|
||||||
return check_result();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace sdio
|
|
||||||
|
|
||||||
extern sdio::CardDMA& CardDMA_I;
|
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "../../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if ENABLED(ONBOARD_SDIO)
|
|
||||||
|
|
||||||
#include <PinOpsMap.hpp>
|
|
||||||
#include <PinOps.hpp>
|
|
||||||
#include "SDCard.h"
|
|
||||||
#include "sdio.h"
|
|
||||||
|
|
||||||
using namespace sdio;
|
|
||||||
|
|
||||||
#define TARGET_CLOCK 6000000U
|
|
||||||
#define BLOCK_SIZE 512U
|
|
||||||
#define CARD_TIMEOUT 500 // ms
|
|
||||||
#define READ_RETRIES 3U
|
|
||||||
|
|
||||||
inline constexpr uint32_t TARGET_SDIO_CLOCK = TARGET_CLOCK;
|
|
||||||
inline constexpr uint32_t SDIO_BLOCK_SIZE = BLOCK_SIZE;
|
|
||||||
inline constexpr uint32_t SD_TIMEOUT = CARD_TIMEOUT;
|
|
||||||
inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES;
|
|
||||||
|
|
||||||
Card_State cardState = Card_State::READY;
|
|
||||||
|
|
||||||
auto SDIO_SetBusWidth(Bus_Width width) -> bool {
|
|
||||||
return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mfl_sdio_init() {
|
|
||||||
pinOpsPinout(SD_CMD_PinOps, static_cast<pin_size_t>(SDIO_CMD_PIN));
|
|
||||||
pinOpsPinout(SD_CK_PinOps, static_cast<pin_size_t>(SDIO_CK_PIN));
|
|
||||||
pinOpsPinout(SD_DATA0_PinOps, static_cast<pin_size_t>(SDIO_D0_PIN));
|
|
||||||
pinOpsPinout(SD_DATA1_PinOps, static_cast<pin_size_t>(SDIO_D1_PIN));
|
|
||||||
pinOpsPinout(SD_DATA2_PinOps, static_cast<pin_size_t>(SDIO_D2_PIN));
|
|
||||||
pinOpsPinout(SD_DATA3_PinOps, static_cast<pin_size_t>(SDIO_D3_PIN));
|
|
||||||
|
|
||||||
NVIC_EnableIRQ(DMA1_Channel3_4_IRQn);
|
|
||||||
NVIC_EnableIRQ(SDIO_IRQn);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SDIO_Init() {
|
|
||||||
SDIO_Error_Type result = SDIO_Error_Type::OK;
|
|
||||||
uint8_t retryCount = SDIO_READ_RETRIES;
|
|
||||||
|
|
||||||
mfl_sdio_init();
|
|
||||||
|
|
||||||
uint8_t retries = retryCount;
|
|
||||||
for (;;) {
|
|
||||||
hal.watchdog_refresh();
|
|
||||||
result = CardDMA_I.init();
|
|
||||||
if (result == SDIO_Error_Type::OK) break;
|
|
||||||
if (!--retries) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, false);
|
|
||||||
|
|
||||||
retries = retryCount;
|
|
||||||
for (;;) {
|
|
||||||
hal.watchdog_refresh();
|
|
||||||
if (SDIO_SetBusWidth(Bus_Width::WIDTH_4BIT)) break;
|
|
||||||
if (!--retries) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, true, true);
|
|
||||||
|
|
||||||
// Fallback
|
|
||||||
if (!retries) {
|
|
||||||
mfl_sdio_init();
|
|
||||||
retries = retryCount;
|
|
||||||
for (;;) {
|
|
||||||
hal.watchdog_refresh();
|
|
||||||
result = CardDMA_I.init();
|
|
||||||
if (result == SDIO_Error_Type::OK) break;
|
|
||||||
if (!--retries) return false;
|
|
||||||
}
|
|
||||||
CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t* src, uint8_t* dst) {
|
|
||||||
hal.watchdog_refresh();
|
|
||||||
SDIO_Error_Type result = SDIO_Error_Type::OK;
|
|
||||||
|
|
||||||
// Write
|
|
||||||
if (src) {
|
|
||||||
result = CardDMA_I.write(reinterpret_cast<uint8_t*>(const_cast<uint8_t*>(src)), block, 1);
|
|
||||||
}
|
|
||||||
// Read
|
|
||||||
else {
|
|
||||||
result = CardDMA_I.read(dst, block, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result != SDIO_Error_Type::OK) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
millis_t timeout = millis() + SD_TIMEOUT;
|
|
||||||
while (CardDMA_I.get_state() != sdio::Operational_State::READY) {
|
|
||||||
if (ELAPSED(millis(), timeout)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CardDMA_I.check_dma_complete();
|
|
||||||
|
|
||||||
timeout = millis() + SD_TIMEOUT;
|
|
||||||
do {
|
|
||||||
result = CardDMA_I.get_card_state(&cardState);
|
|
||||||
if (ELAPSED(millis(), timeout)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} while (result == SDIO_Error_Type::OK && cardState != sdio::Card_State::TRANSFER);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SDIO_ReadBlock(uint32_t block, uint8_t* dst) {
|
|
||||||
// Check if the address is aligned to 4 bytes
|
|
||||||
if (reinterpret_cast<uint32_t>(dst) & 0x03) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t retries = SDIO_READ_RETRIES;
|
|
||||||
while (retries--) {
|
|
||||||
if (SDIO_ReadWriteBlock_DMA(block, nullptr, dst)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SDIO_WriteBlock(uint32_t block, const uint8_t* src) {
|
|
||||||
// Check if the address is aligned to 4 bytes
|
|
||||||
if (reinterpret_cast<uint32_t>(src) & 0x03) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t retries = SDIO_READ_RETRIES;
|
|
||||||
while (retries--) {
|
|
||||||
if (SDIO_ReadWriteBlock_DMA(block, src, nullptr)) {
|
|
||||||
return true;
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SDIO_IsReady() {
|
|
||||||
return (CardDMA_I.get_state() == sdio::Operational_State::READY);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t SDIO_GetCardSize() {
|
|
||||||
return CardDMA_I.get_card_capacity();
|
|
||||||
}
|
|
||||||
|
|
||||||
// DMA interrupt handler
|
|
||||||
void DMA1_IRQHandler() {
|
|
||||||
auto& dma_instance = CardDMA_I.get_dma_instance();
|
|
||||||
bool is_receive = CardDMA_I.get_is_sdio_rx();
|
|
||||||
|
|
||||||
// Check for Transfer Complete Interrupt
|
|
||||||
if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF)) {
|
|
||||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false);
|
|
||||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false);
|
|
||||||
dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF);
|
|
||||||
if (is_receive) {
|
|
||||||
CardDMA_I.set_sdio_dma_enable(false);
|
|
||||||
CardDMA_I.clear_sdio_data_flags();
|
|
||||||
CardDMA_I.set_state(sdio::Operational_State::READY);
|
|
||||||
} else {
|
|
||||||
CardDMA_I.set_data_end_interrupt();
|
|
||||||
}
|
|
||||||
// Signal that transfer is complete
|
|
||||||
CardDMA_I.set_transfer_end(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_ERRIF)) {
|
|
||||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_HTFIE, false);
|
|
||||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false);
|
|
||||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false);
|
|
||||||
// Clear all flags
|
|
||||||
dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_GIF);
|
|
||||||
// Signal that an error occurred
|
|
||||||
CardDMA_I.set_transfer_error(SDIO_Error_Type::ERROR);
|
|
||||||
CardDMA_I.set_state(sdio::Operational_State::READY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
void SDIO_IRQHandler(void) {
|
|
||||||
CardDMA_I.handle_interrupts();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DMA1_Channel3_4_IRQHandler(void) {
|
|
||||||
DMA1_IRQHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
#endif // ONBOARD_SDIO
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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 <SDIO.hpp>
|
|
||||||
#include <DMA.hpp>
|
|
||||||
|
|
||||||
#define SDIO_D0_PIN PC8
|
|
||||||
#define SDIO_D1_PIN PC9
|
|
||||||
#define SDIO_D2_PIN PC10
|
|
||||||
#define SDIO_D3_PIN PC11
|
|
||||||
#define SDIO_CK_PIN PC12
|
|
||||||
#define SDIO_CMD_PIN PD2
|
|
||||||
|
|
||||||
void sdio_mfl_init();
|
|
||||||
auto SDIO_SetBusWidth(sdio::Bus_Width width) -> bool;
|
|
||||||
void DMA1_IRQHandler(dma::DMA_Channel channel);
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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
|
|
||||||
|
|
||||||
// Define SPI Pins: SCK, MISO, MOSI
|
|
||||||
#ifndef SD_SCK_PIN
|
|
||||||
#define SD_SCK_PIN PIN_SPI_SCK
|
|
||||||
#endif
|
|
||||||
#ifndef SD_MISO_PIN
|
|
||||||
#define SD_MISO_PIN PIN_SPI_MISO
|
|
||||||
#endif
|
|
||||||
#ifndef SD_MOSI_PIN
|
|
||||||
#define SD_MOSI_PIN PIN_SPI_MOSI
|
|
||||||
#endif
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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
|
|
||||||
|
|
||||||
#define TS_TYPICAL_V 1.405
|
|
||||||
#define TS_TYPICAL_TEMP 25
|
|
||||||
#define TS_TYPICAL_SLOPE 4.5
|
|
||||||
|
|
||||||
// TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable)
|
|
||||||
#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) * 0.001f)) / ((TS_TYPICAL_SLOPE) * 0.001f) + TS_TYPICAL_TEMP)
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2025 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/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include "../platforms.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_MFL
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "timers.h"
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Local defines
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
#define SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight bit timing to communicate reliably with TMC drivers
|
|
||||||
#define SERVO_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight PWM timing to control a BLTouch reliably
|
|
||||||
#define STEP_TIMER_IRQ_PRIORITY_DEFAULT 2
|
|
||||||
#define TEMP_TIMER_IRQ_PRIORITY_DEFAULT 14 // Low priority avoids interference with other hardware and timers
|
|
||||||
|
|
||||||
#ifndef TIMER_IRQ_PRIORITY
|
|
||||||
#define TIMER_IRQ_PRIORITY 12
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef STEP_TIMER_IRQ_PRIORITY
|
|
||||||
#define STEP_TIMER_IRQ_PRIORITY STEP_TIMER_IRQ_PRIORITY_DEFAULT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TEMP_TIMER_IRQ_PRIORITY
|
|
||||||
#define TEMP_TIMER_IRQ_PRIORITY TEMP_TIMER_IRQ_PRIORITY_DEFAULT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
|
||||||
#include <SoftwareSerial.h>
|
|
||||||
#ifndef SWSERIAL_TIMER_IRQ_PRIORITY
|
|
||||||
#define SWSERIAL_TIMER_IRQ_PRIORITY SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_SERVOS
|
|
||||||
#include "Servo.h"
|
|
||||||
#ifndef SERVO_TIMER_IRQ_PRIORITY
|
|
||||||
#define SERVO_TIMER_IRQ_PRIORITY SERVO_TIMER_IRQ_PRIORITY_DEFAULT
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(SPEAKER)
|
|
||||||
// The MFL framework default timer priority is 12. The TEMP timer must have lower priority
|
|
||||||
// than this due to the long running temperature ISR, and STEP timer should higher priority.
|
|
||||||
#if !(TIMER_IRQ_PRIORITY > STEP_TIMER_IRQ_PRIORITY && TIMER_IRQ_PRIORITY < TEMP_TIMER_IRQ_PRIORITY)
|
|
||||||
#error "Default timer interrupt priority is unspecified or set to a value which may degrade performance."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAL_TIMER_RATE
|
|
||||||
#define HAL_TIMER_RATE GetStepperTimerClkFreq()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef STEP_TIMER
|
|
||||||
#define STEP_TIMER MF_TIMER_STEP
|
|
||||||
#endif
|
|
||||||
#ifndef TEMP_TIMER
|
|
||||||
#define TEMP_TIMER MF_TIMER_TEMP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GeneralTimer& Step_Timer = GeneralTimer::get_instance(static_cast<timer::TIMER_Base>(STEP_TIMER));
|
|
||||||
GeneralTimer& Temp_Timer = GeneralTimer::get_instance(static_cast<timer::TIMER_Base>(TEMP_TIMER));
|
|
||||||
|
|
||||||
bool is_step_timer_initialized = false;
|
|
||||||
bool is_temp_timer_initialized = false;
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Public functions
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
// Retrieves the clock frequency of the stepper timer
|
|
||||||
uint32_t GetStepperTimerClkFreq() {
|
|
||||||
// Cache result
|
|
||||||
static uint32_t clkFreq = Step_Timer.getTimerClockFrequency();
|
|
||||||
return clkFreq;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Starts a hardware timer
|
|
||||||
*
|
|
||||||
* If the timer is not already initialized, this function will initialize it with the given frequency.
|
|
||||||
* The timer is started immediately after initialization
|
|
||||||
*
|
|
||||||
* @param timer The timer base index to start
|
|
||||||
* @param frequency The frequency at which the timer should run
|
|
||||||
* @return None
|
|
||||||
*/
|
|
||||||
void HAL_timer_start(const uint8_t timer_number, const uint32_t frequency) {
|
|
||||||
if (HAL_timer_initialized(timer_number) || (timer_number != MF_TIMER_STEP && timer_number != MF_TIMER_TEMP))
|
|
||||||
return;
|
|
||||||
|
|
||||||
const bool is_step = (timer_number == MF_TIMER_STEP);
|
|
||||||
const uint8_t priority = is_step ?
|
|
||||||
static_cast<uint8_t>(STEP_TIMER_IRQ_PRIORITY) :
|
|
||||||
static_cast<uint8_t>(TEMP_TIMER_IRQ_PRIORITY);
|
|
||||||
|
|
||||||
// Get the reference of the timer instance
|
|
||||||
GeneralTimer& timer = is_step ? Step_Timer : Temp_Timer;
|
|
||||||
|
|
||||||
if (is_step) {
|
|
||||||
timer.setPrescaler(STEPPER_TIMER_PRESCALE);
|
|
||||||
timer.setRolloverValue(_MIN(static_cast<hal_timer_t>(HAL_TIMER_TYPE_MAX),
|
|
||||||
(HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)),
|
|
||||||
TimerFormat::TICK);
|
|
||||||
is_step_timer_initialized = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
timer.setRolloverValue(frequency, TimerFormat::HERTZ);
|
|
||||||
is_temp_timer_initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
timer.setAutoReloadEnable(false);
|
|
||||||
timer.setInterruptPriority(priority, 0U);
|
|
||||||
HAL_timer_enable_interrupt(timer_number);
|
|
||||||
timer.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Enables the interrupt for the specified timer
|
|
||||||
*
|
|
||||||
* @param handle The timer handle for which to enable the interrupt
|
|
||||||
* @return None
|
|
||||||
*/
|
|
||||||
void HAL_timer_enable_interrupt(const uint8_t timer_number) {
|
|
||||||
if (!HAL_timer_initialized(timer_number)) return;
|
|
||||||
|
|
||||||
GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer;
|
|
||||||
|
|
||||||
if (timer_number == MF_TIMER_STEP && !timer.hasInterrupt())
|
|
||||||
timer.attachInterrupt(Step_Handler);
|
|
||||||
else if (timer_number == MF_TIMER_TEMP && !timer.hasInterrupt())
|
|
||||||
timer.attachInterrupt(Temp_Handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Disables the interrupt for the specified timer
|
|
||||||
*
|
|
||||||
* @param handle The timer handle for which to disable the interrupt
|
|
||||||
* @return None
|
|
||||||
*/
|
|
||||||
void HAL_timer_disable_interrupt(const uint8_t timer_number) {
|
|
||||||
if (!HAL_timer_initialized(timer_number)) return;
|
|
||||||
|
|
||||||
GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer;
|
|
||||||
if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP)
|
|
||||||
timer.detachInterrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Checks if the interrupt is enabled for the specified timer
|
|
||||||
*
|
|
||||||
* @param handle The timer handle to check
|
|
||||||
* @return True if the interrupt is enabled, false otherwise
|
|
||||||
*/
|
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_number) {
|
|
||||||
if (!HAL_timer_initialized(timer_number)) return false;
|
|
||||||
|
|
||||||
GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer;
|
|
||||||
return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP)
|
|
||||||
? timer.hasInterrupt()
|
|
||||||
: false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets the interrupt priorities for timers used by TMC SW serial and servos.
|
|
||||||
void SetTimerInterruptPriorities() {
|
|
||||||
TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIORITY, 0));
|
|
||||||
TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIORITY, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// Detect timer conflicts
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
TERN_(HAS_TMC_SW_SERIAL, static constexpr timer::TIMER_Base timer_serial[] = {static_cast<timer::TIMER_Base>(TIMER_SERIAL)});
|
|
||||||
TERN_(SPEAKER, static constexpr timer::TIMER_Base timer_tone[] = {static_cast<timer::TIMER_Base>(TIMER_TONE)});
|
|
||||||
TERN_(HAS_SERVOS, static constexpr timer::TIMER_Base timer_servo[] = {static_cast<timer::TIMER_Base>(TIMER_SERVO)});
|
|
||||||
|
|
||||||
enum TimerPurpose {
|
|
||||||
PURPOSE_SERIAL,
|
|
||||||
PURPOSE_TONE,
|
|
||||||
PURPOSE_SERVO,
|
|
||||||
PURPOSE_STEP,
|
|
||||||
PURPOSE_TEMP
|
|
||||||
};
|
|
||||||
|
|
||||||
// List of timers to check for conflicts
|
|
||||||
// Includes the timer purpose to ease debugging when evaluating at build-time
|
|
||||||
// This cannot yet account for timers used for PWM output, such as for fans
|
|
||||||
static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = {
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
|
||||||
{ PURPOSE_SERIAL, timer_base_to_index(timer_serial[0]) }, // Set in variant.h
|
|
||||||
#endif
|
|
||||||
#if ENABLED(SPEAKER)
|
|
||||||
{ PURPOSE_TONE, timer_base_to_index(timer_tone[0]) }, // Set in variant.h
|
|
||||||
#endif
|
|
||||||
#if HAS_SERVOS
|
|
||||||
{ PURPOSE_SERVO, timer_base_to_index(timer_servo[0]) }, // Set in variant.h
|
|
||||||
#endif
|
|
||||||
{ PURPOSE_STEP, MF_TIMER_STEP },
|
|
||||||
{ PURPOSE_TEMP, MF_TIMER_TEMP },
|
|
||||||
};
|
|
||||||
|
|
||||||
// Verifies if there are any timer conflicts in the timers_in_use array
|
|
||||||
static constexpr bool verify_no_timer_conflicts() {
|
|
||||||
for (uint8_t i = 0; i < COUNT(timers_in_use); i++)
|
|
||||||
for (uint8_t j = i + 1; j < COUNT(timers_in_use); j++)
|
|
||||||
if (timers_in_use[i].t == timers_in_use[j].t)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this assertion fails at compile time, review the timers_in_use array.
|
|
||||||
// If default_envs is defined properly in platformio.ini, VSCode can evaluate the array
|
|
||||||
// when hovering over it, making it easy to identify the conflicting timers
|
|
||||||
static_assert(verify_no_timer_conflicts(), "One or more timer conflict detected. Examine \"timers_in_use\" to help identify conflict.");
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_MFL
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user