Compare commits
467 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dc6d166567 | |||
| 333608a692 | |||
| e99d801e6b | |||
| 0ac1435a8c | |||
| 584abc5835 | |||
| 73fa80f128 | |||
| 7fcc605595 | |||
| 35319049fe | |||
| 544cde20fb | |||
| 084b065f46 | |||
| ec8a6fc7e2 | |||
| 3d7f84dbb6 | |||
| 7b70e39ff6 | |||
| 58bce3781e | |||
| 578ee04243 | |||
| d061e6dbd6 | |||
| 12ac094992 | |||
| ac0fc603ae | |||
| e3ef8d2089 | |||
| b9f0c68e3c | |||
| 64182d60aa | |||
| 3e4344ad7a | |||
| efb58a9a0d | |||
| 2700af52c8 | |||
| c420a0b96a | |||
| 1832500eca | |||
| 5bbf953711 | |||
| 1f38b509e1 | |||
| 38d9b97bbd | |||
| c1908c865e | |||
| ba34902610 | |||
| e35bedab48 | |||
| 50297c65d4 | |||
| fe1d6f93e2 | |||
| 46ee5b0a08 | |||
| 9da6b580d9 | |||
| ccc69582ef | |||
| 8dee0c1281 | |||
| 06c6c479dd | |||
| 402aab968c | |||
| bf7433c937 | |||
| 81a9eb27ad | |||
| 6ed3ea9a6b | |||
| 371ab1eea2 | |||
| e38075710d | |||
| ea2e832dc8 | |||
| 85b82e3ab6 | |||
| 543af426ef | |||
| 646f4c7d69 | |||
| 9788a35107 | |||
| 2774ee8290 | |||
| 4f39b9c09d | |||
| e6a615d882 | |||
| 9d55440d38 | |||
| c7e6b7924a | |||
| c6f4bc1aa1 | |||
| 98c72a3b65 | |||
| ef8873d6ef | |||
| eb2b8a1ddb | |||
| a1a9904d32 | |||
| 1f3309ac06 | |||
| b9e89a5378 | |||
| e2250ce037 | |||
| f872750b70 | |||
| c9488b4f63 | |||
| 8cd9c06084 | |||
| 1c6b723ee6 | |||
| 0f044f76ec | |||
| 8342a5a83e | |||
| e3fa27ac9f | |||
| 3293b2780e | |||
| ebf9aa5c82 | |||
| 54fe84ea32 | |||
| b0f6155d99 | |||
| ba8b685ede | |||
| 579545177d | |||
| 10009b018d | |||
| 689c7b83e1 | |||
| 9393c1ed1b | |||
| cda684b6fd | |||
| a420e3c155 | |||
| 88a4e55945 | |||
| 27dcfe0ea8 | |||
| cf609152c2 | |||
| 6e01ba3ce8 | |||
| cf9f205030 | |||
| 59cee1cb87 | |||
| e53f2a3d82 | |||
| 412513be43 | |||
| f946b60670 | |||
| 90363cefd0 | |||
| 07630e6559 | |||
| 5b34686dda | |||
| 667aa15b87 | |||
| f48aa53d7c | |||
| dd3c3d09f2 | |||
| d1f2b2d27b | |||
| 2073b67e45 | |||
| e176df1e6d | |||
| f6dbb59748 | |||
| 39697628e7 | |||
| e9c5b99722 | |||
| 8e9e039672 | |||
| ce7edc6223 | |||
| 924c2ca0fe | |||
| e0f0a9491d | |||
| 8547f4f5b9 | |||
| ac5836a2a2 | |||
| 6b14b948a9 | |||
| 1774dbd539 | |||
| e9810691ec | |||
| 29ad078fda | |||
| 0c4beea9be | |||
| 79bd65be35 | |||
| 150425e480 | |||
| 61cc3cdf09 | |||
| 252085f462 | |||
| 1ead60ec46 | |||
| 5a0923ed28 | |||
| 40beddeaa3 | |||
| 05a64e2013 | |||
| 3fc45df62f | |||
| 9c3d74f6d1 | |||
| bdfb0cc63f | |||
| 8bf127afe6 | |||
| 33ad711ee8 | |||
| 20e99497dd | |||
| baa20d9ea2 | |||
| 367bcedea7 | |||
| 5d59779a80 | |||
| 1c19cfcbc7 | |||
| 14a83342e1 | |||
| f11f42a23e | |||
| 4bfbe70d66 | |||
| 93394f1ff5 | |||
| fa4b73ee04 | |||
| 5249d10369 | |||
| 89a43a8b1a | |||
| db279967da | |||
| 41c860dce1 | |||
| bfb5430217 | |||
| e1e13ad72c | |||
| c941ce1a5b | |||
| 7c760bd232 | |||
| 42dc89ad32 | |||
| 3a9394c308 | |||
| 97b5c2d3ea | |||
| f635a9d0c3 | |||
| d7550018e3 | |||
| 6918959c07 | |||
| 908d30d4ce | |||
| 49b11f9490 | |||
| d09bf9d088 | |||
| 47727cf0ae | |||
| 51ce1a147d | |||
| 0f6f125724 | |||
| 52a4954b8a | |||
| 4cab99e1d1 | |||
| 2c57b184da | |||
| 14b5d5ba84 | |||
| 5bd28cd840 | |||
| fbc2c76870 | |||
| 4349f4ab0c | |||
| 9eea88bbfc | |||
| 3a77a7eefd | |||
| 788e86ccc6 | |||
| 27da1995f3 | |||
| e3a5319e3c | |||
| e4bc675fbf | |||
| 898dd19175 | |||
| 1b307f7c99 | |||
| d5977e7e2d | |||
| 7aaaaec355 | |||
| 8acd39c494 | |||
| cfac549240 | |||
| 0279f9cf09 | |||
| 37b5b49cce | |||
| 1a5550f643 | |||
| a3929b435b | |||
| 7e6e25929b | |||
| f2b2389b8f | |||
| 9012b9a993 | |||
| fde861ab8c | |||
| 9f0fa5a040 | |||
| fb95e66652 | |||
| c44b9c1c28 | |||
| 3753cb9a94 | |||
| 81d8663f1f | |||
| 2860d048e6 | |||
| cc20b30775 | |||
| 21f0333b43 | |||
| 70d910ac8e | |||
| 23e7905b20 | |||
| 5e1a1fffcf | |||
| e48dd40b53 | |||
| 4ddf626d46 | |||
| 991fc9cf63 | |||
| ef3e9134dc | |||
| 35da223f0a | |||
| 0937fe55a4 | |||
| de98df1651 | |||
| d7156decdc | |||
| e43c2752c7 | |||
| bdf8b0703a | |||
| a506701a8b | |||
| b60838508b | |||
| 0f76f17f16 | |||
| c00415b017 | |||
| 3b149c3505 | |||
| d20d1f8712 | |||
| c626e3efb2 | |||
| 1cea29598c | |||
| cb0706f9cc | |||
| dadbedc4fd | |||
| 3165beeba0 | |||
| 1c9b1240ec | |||
| 122dfa13a2 | |||
| b32a818f37 | |||
| d8b83160ab | |||
| 98d79fb8bb | |||
| eaefa299fb | |||
| ba840750a0 | |||
| cdc960fd1d | |||
| c0a544d385 | |||
| 84b22fcc1d | |||
| c6cd10a92d | |||
| d08a7d4fd2 | |||
| 0ee1c1e4e1 | |||
| dc9e57464f | |||
| 657929740f | |||
| 6e74409c14 | |||
| 5af8425776 | |||
| 0ca860b292 | |||
| 4dd5b713eb | |||
| 0628573fc3 | |||
| 52cc705e60 | |||
| 2f987accaa | |||
| 66aa848b2f | |||
| 6f3de26a4d | |||
| b723e3fd02 | |||
| 7e4c6db12d | |||
| e228a222a3 | |||
| fdac56da15 | |||
| 7e62b60c94 | |||
| b6b0fccd5f | |||
| f2f6b6bd85 | |||
| 6ff18a942c | |||
| 25a2a89517 | |||
| 5917aa73b5 | |||
| d0dc3b619f | |||
| d628d7de44 | |||
| 8fe6bc6745 | |||
| dcbcbb54f9 | |||
| 41f9eec4df | |||
| 33e942514b | |||
| 2aa9f70f5e | |||
| 8aac26275e | |||
| 294903439a | |||
| daa68d560e | |||
| 4ce809380b | |||
| a614352fcf | |||
| a54daeeb39 | |||
| fc4abd1335 | |||
| 881ee69f34 | |||
| 5a8b9d649a | |||
| e80d8e9dcf | |||
| 950d141958 | |||
| 52ea53a3dd | |||
| 7526309ccf | |||
| 4342a0f512 | |||
| 4bca73dc5a | |||
| 67dc3e432f | |||
| 349c3a7243 | |||
| 1bee2dab60 | |||
| 1e51ff1306 | |||
| aa0558eb3a | |||
| 0878147f31 | |||
| 7086ca632f | |||
| 93783e993b | |||
| ab69f87989 | |||
| b0c0074092 | |||
| 2110215a16 | |||
| 50d847a2fe | |||
| 61c57825d7 | |||
| f81ca65a16 | |||
| a020a09903 | |||
| 6361146f0f | |||
| 4fb984e960 | |||
| 081458a3c8 | |||
| 02fe1ff95e | |||
| beb3a0fc4b | |||
| 71834e204b | |||
| 9417af14e9 | |||
| 84448a78be | |||
| 1244a21a21 | |||
| eff0de499f | |||
| de1b97a0ce | |||
| 624f429086 | |||
| 0303a1bfb0 | |||
| 573c21e690 | |||
| 80b8e66189 | |||
| 8ec9c37940 | |||
| 2e8833e315 | |||
| c403381172 | |||
| 02e5225e10 | |||
| 28839c60da | |||
| e7ac0d14cd | |||
| 9a23bcec0b | |||
| 6b9ec417b6 | |||
| 66474f6a13 | |||
| 4f0329bb43 | |||
| dc6f23e435 | |||
| c7fc6eeb1e | |||
| 72c0437b48 | |||
| a6377e5215 | |||
| 0459407a8e | |||
| 685ccf3fdf | |||
| de219dcd63 | |||
| cdc996dd68 | |||
| fe6eb1745f | |||
| 533d752707 | |||
| 037b0096e2 | |||
| eefd63e408 | |||
| 5e410e35ab | |||
| 62bb61b3d9 | |||
| a7f12169b9 | |||
| 29ceba972c | |||
| 7965e066c7 | |||
| f499735280 | |||
| 1e03f696f5 | |||
| 7ac308fe4d | |||
| 54a7ce999f | |||
| 89416a583c | |||
| 9ad9323aac | |||
| cf7f5bcdee | |||
| 950f492ce7 | |||
| 1bb1603886 | |||
| 68dc89cf75 | |||
| c2d586cf5f | |||
| fbce327402 | |||
| c09638f821 | |||
| 348099dabb | |||
| fbee2a2ff7 | |||
| 781d9c470e | |||
| 5a5354107b | |||
| 127bc94891 | |||
| fca60335e1 | |||
| 27621290b8 | |||
| 951b8be3a1 | |||
| f1bb46f5b8 | |||
| 3bb9364c44 | |||
| 7df503de93 | |||
| 098e0961dc | |||
| 6ea4a16212 | |||
| 9f6cafbae3 | |||
| 8c6e9526b0 | |||
| cc05123a80 | |||
| 823014868c | |||
| 7c30124f80 | |||
| 3ddf728333 | |||
| 9dbce712fc | |||
| b59251c388 | |||
| c377237fd8 | |||
| a2452a577b | |||
| a6bfdf351f | |||
| e8f2430dac | |||
| 8f19e2d7d4 | |||
| a270cc36e6 | |||
| fa25737a9f | |||
| 38eee76839 | |||
| 5b59424447 | |||
| c20c6b61f1 | |||
| d0e8edad3c | |||
| 88d368ad9d | |||
| 843f79589c | |||
| 3494482cb0 | |||
| 09e336f78c | |||
| 3572fd75b5 | |||
| ebecd76492 | |||
| 3f3c8257f7 | |||
| e9ae5208cb | |||
| fde0eaf1e7 | |||
| 122c4116f2 | |||
| 21559b0c59 | |||
| 0916d32589 | |||
| af7b126edc | |||
| bc990ccca6 | |||
| c7bcbf944e | |||
| 7f9eb688ad | |||
| dbd60fb38e | |||
| 6a871b2879 | |||
| bd9d7a3c4d | |||
| 2976bb48ed | |||
| 4f93f31af0 | |||
| d76c8c1fbd | |||
| 86c564121e | |||
| db137df6df | |||
| 202ec4b58f | |||
| 1258657b8d | |||
| f49e730b23 | |||
| aa02bb05d3 | |||
| e7662920a6 | |||
| 9c9ed690f7 | |||
| a4382b4dcd | |||
| d5723fcafd | |||
| af553d5fbd | |||
| 3cd945ab5d | |||
| ade6dbf01e | |||
| 88a8e2127d | |||
| fe747ae4bf | |||
| bd4900d6cd | |||
| 8643fa0afb | |||
| 487542083b | |||
| b79f7f203a | |||
| 0927e49756 | |||
| fbea4c6048 | |||
| 4a0b3d1c9b | |||
| 8e0f271f55 | |||
| 8f13c1ecb2 | |||
| 10ecea62c1 | |||
| 7a841cd8cf | |||
| c8265d61d5 | |||
| eaa836b6fc | |||
| 5a88a80690 | |||
| 12fdde24d8 | |||
| 471228018a | |||
| 4de6d655ac | |||
| b12028f4dd | |||
| 54c1a1df4e | |||
| fad7bc66e9 | |||
| 6cda10de0f | |||
| b22df8b189 | |||
| 94e2558e6c | |||
| fd117480d2 | |||
| 72f3a4ac31 | |||
| aa7af2e2ea | |||
| a4d254ee62 | |||
| 222efe1382 | |||
| d806175a80 | |||
| 5266ffb922 | |||
| b7a1681d38 | |||
| 3a3c3b8a22 | |||
| 67948ad6c6 | |||
| e2583b4f85 | |||
| c9e7d6f55c | |||
| 735cd9a092 | |||
| 555b080d85 | |||
| 44ef6e2b70 | |||
| 9bbbcd439b | |||
| cbe8a6867c | |||
| 1f31027fd2 | |||
| 4e1e7fa1b0 | |||
| 414951e42c | |||
| a8d18a0554 | |||
| b9ffe93d1f | |||
| 0c72dc376c | |||
| 766210b8f1 | |||
| b5c05e32ea | |||
| 1d702b3601 | |||
| 2e7b7c8b72 | |||
| a4fbbf9075 | |||
| 25e6852022 | |||
| 5edec5b3a3 | |||
| 0bfa253b73 | |||
| 1117aff777 | |||
| b616b0a67a | |||
| bca0f55a5e |
@@ -38,14 +38,14 @@
|
||||
"platformio.platformio-ide",
|
||||
"marlinfirmware.auto-build",
|
||||
"editorconfig.editorconfig"
|
||||
],
|
||||
]
|
||||
|
||||
// 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.
|
||||
// "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.
|
||||
// "remoteUser": "vscode"
|
||||
// , "remoteUser": "vscode"
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ on:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
- 2.1.x
|
||||
- release-*
|
||||
paths-ignore:
|
||||
- config/**
|
||||
- data/**
|
||||
@@ -36,6 +37,9 @@ jobs:
|
||||
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
env:
|
||||
CONFIG_BRANCH: ${{ github.base_ref || github.ref_name }}
|
||||
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
@@ -54,7 +58,7 @@ jobs:
|
||||
- at90usb1286_dfu
|
||||
|
||||
# AVR Extended
|
||||
- FYSETC_F6
|
||||
- mega2560ext
|
||||
- melzi_optiboot
|
||||
- rambo
|
||||
- sanguino1284p
|
||||
|
||||
@@ -9,14 +9,14 @@ name: CI - Validate boards.h
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
- bugfix-2.1.x
|
||||
paths:
|
||||
- 'Marlin/src/core/boards.h'
|
||||
- "Marlin/src/core/boards.h"
|
||||
push:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
- bugfix-2.1.x
|
||||
paths:
|
||||
- 'Marlin/src/core/boards.h'
|
||||
- "Marlin/src/core/boards.h"
|
||||
|
||||
jobs:
|
||||
validate_pins_files:
|
||||
@@ -26,23 +26,23 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Check out the PR
|
||||
uses: actions/checkout@v4
|
||||
- name: Check out the PR
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-boards-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-boards-
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-validation-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-validation-
|
||||
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.9'
|
||||
architecture: 'x64'
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.9"
|
||||
architecture: "x64"
|
||||
|
||||
- name: Validate core/boards.h
|
||||
run: |
|
||||
make validate-boards -j
|
||||
- name: Validate core/boards.h
|
||||
run: |
|
||||
make validate-boards -j
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#
|
||||
# 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,18 +8,18 @@ name: CI - Validate Pins Files
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
- bugfix-2.1.x
|
||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
||||
#- 2.1.x
|
||||
paths:
|
||||
- 'Marlin/src/pins/*/**'
|
||||
- "Marlin/src/pins/*/**"
|
||||
push:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
- bugfix-2.1.x
|
||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
||||
#- 2.1.x
|
||||
paths:
|
||||
- 'Marlin/src/pins/*/**'
|
||||
- "Marlin/src/pins/*/**"
|
||||
|
||||
jobs:
|
||||
validate_pins_files:
|
||||
@@ -29,23 +29,23 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Check out the PR
|
||||
uses: actions/checkout@v4
|
||||
- name: Check out the PR
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-pins-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-pins-
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-validation-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-validation-
|
||||
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.9'
|
||||
architecture: 'x64'
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.9"
|
||||
architecture: "x64"
|
||||
|
||||
- name: Validate all pins files
|
||||
run: |
|
||||
make validate-pins -j
|
||||
- name: Validate all pins files
|
||||
run: |
|
||||
make validate-pins -j
|
||||
|
||||
Executable → Regular
+5
@@ -31,6 +31,11 @@ out-language/
|
||||
*.gen
|
||||
*.sublime-workspace
|
||||
|
||||
# npm
|
||||
node_modules/
|
||||
package.json
|
||||
package-lock.json
|
||||
|
||||
# OS
|
||||
applet/
|
||||
.DS_Store
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# Prettier Ignore file
|
||||
*.min.js
|
||||
web-ui/
|
||||
buildroot/share/PlatformIO/boards
|
||||
buildroot/share/PlatformIO/variants
|
||||
*.sublime-project
|
||||
*.sublime-syntax
|
||||
.github
|
||||
.vscode
|
||||
launch.json
|
||||
@@ -4,10 +4,36 @@ CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
||||
CONTAINER_IMAGE := marlin-dev
|
||||
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:
|
||||
@echo "Tasks for local development:"
|
||||
@echo "make marlin : Build Marlin for the configured board"
|
||||
@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-boards -j : Validate boards.h and pins.h for standards compliance"
|
||||
@echo "make tests-single-ci : Run a single test from inside the CI"
|
||||
@@ -19,7 +45,7 @@ help:
|
||||
@echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker"
|
||||
@echo "make unit-test-all-local : Run all code tests locally"
|
||||
@echo "make unit-test-all-local-docker : Run all code tests locally, using docker"
|
||||
@echo "make setup-local-docker : Setup local docker using buildx"
|
||||
@echo "make setup-local-docker : Setup local docker"
|
||||
@echo ""
|
||||
@echo "Options for testing:"
|
||||
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
||||
@@ -40,6 +66,9 @@ marlin:
|
||||
./buildroot/bin/mftest -a
|
||||
.PHONY: marlin
|
||||
|
||||
clean:
|
||||
rm -rf .pio/build*
|
||||
|
||||
tests-single-ci:
|
||||
export GIT_RESET_HARD=true
|
||||
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
|
||||
@@ -56,10 +85,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)"
|
||||
|
||||
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 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 \
|
||||
echo "Skipping tests for $$TEST_TARGET on macOS" ; \
|
||||
continue ; \
|
||||
@@ -87,27 +116,56 @@ unit-test-all-local-docker:
|
||||
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local
|
||||
|
||||
setup-local-docker:
|
||||
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
||||
USERNAME := $(shell whoami)
|
||||
USER_ID := $(shell id -u)
|
||||
GROUP_ID := $(shell id -g)
|
||||
|
||||
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
|
||||
.PHONY: setup-local-docker setup-local-docker-old
|
||||
|
||||
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 .
|
||||
|
||||
.PHONY: $(PINS) format-pins validate-pins
|
||||
|
||||
$(PINS): %:
|
||||
@echo "Formatting $@"
|
||||
@python $(SCRIPTS_DIR)/pinsformat.py $< $@
|
||||
@echo "Formatting pins $@"
|
||||
@$(PYTHON) $(SCRIPTS_DIR)/pinsformat.py $< $@
|
||||
|
||||
format-pins: $(PINS)
|
||||
@echo "Processed $(words $(PINS)) pins files"
|
||||
|
||||
validate-pins: format-pins
|
||||
@echo "Validating pins files"
|
||||
@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
|
||||
|
||||
.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
|
||||
|
||||
.PHONY: validate-boards
|
||||
|
||||
validate-boards:
|
||||
@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)
|
||||
|
||||
+84
-27
@@ -148,9 +148,9 @@
|
||||
* Options: 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
|
||||
* :['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']
|
||||
* 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', 'TMC2240', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
||||
*/
|
||||
#define X_DRIVER_TYPE A4988
|
||||
#define Y_DRIVER_TYPE A4988
|
||||
@@ -260,6 +260,7 @@
|
||||
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
|
||||
// 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_LIFT_TO_PROBE // Lift toolheads out of the way while probing
|
||||
#endif
|
||||
|
||||
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
|
||||
@@ -304,6 +305,18 @@
|
||||
|
||||
#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
|
||||
*
|
||||
@@ -705,13 +718,13 @@
|
||||
#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_Kp_LIST { 22.20, 22.20 }
|
||||
#define DEFAULT_Ki_LIST { 1.08, 1.08 }
|
||||
#define DEFAULT_Kd_LIST { 114.00, 114.00 }
|
||||
#define DEFAULT_KP_LIST { 22.20, 22.20 }
|
||||
#define DEFAULT_KI_LIST { 1.08, 1.08 }
|
||||
#define DEFAULT_KD_LIST { 114.00, 114.00 }
|
||||
#else
|
||||
#define DEFAULT_Kp 22.20
|
||||
#define DEFAULT_Ki 1.08
|
||||
#define DEFAULT_Kd 114.00
|
||||
#define DEFAULT_KP 22.20
|
||||
#define DEFAULT_KI 1.08
|
||||
#define DEFAULT_KD 114.00
|
||||
#endif
|
||||
#else
|
||||
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
|
||||
@@ -734,7 +747,12 @@
|
||||
//#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_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
|
||||
#define MPC_HEATER_POWER { 40.0f } // (W) Nominal 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?
|
||||
|
||||
@@ -766,6 +784,7 @@
|
||||
|
||||
#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 EVENT_GCODE_AFTER_MPC_TUNE "M84" // G-code to execute after MPC tune finished and Z raised.
|
||||
#endif
|
||||
|
||||
//===========================================================================
|
||||
@@ -803,9 +822,9 @@
|
||||
|
||||
// 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)
|
||||
#define DEFAULT_bedKp 10.00
|
||||
#define DEFAULT_bedKi .023
|
||||
#define DEFAULT_bedKd 305.4
|
||||
#define DEFAULT_BED_KP 10.00
|
||||
#define DEFAULT_BED_KI 0.023
|
||||
#define DEFAULT_BED_KD 305.4
|
||||
|
||||
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
||||
#else
|
||||
@@ -886,9 +905,9 @@
|
||||
|
||||
// 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.
|
||||
#define DEFAULT_chamberKp 37.04
|
||||
#define DEFAULT_chamberKi 1.40
|
||||
#define DEFAULT_chamberKd 655.17
|
||||
#define DEFAULT_CHAMBER_KP 37.04
|
||||
#define DEFAULT_CHAMBER_KI 1.40
|
||||
#define DEFAULT_CHAMBER_KD 655.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.
|
||||
@@ -935,7 +954,7 @@
|
||||
* protect against a broken or disconnected thermistor wire.
|
||||
*
|
||||
* The issue: If a thermistor falls out, it will report the much lower
|
||||
* temperature of the air in the room, and the the firmware will keep
|
||||
* temperature of the air in the room, and the firmware will keep
|
||||
* the heater on.
|
||||
*
|
||||
* If you get "Thermal Runaway" or "Heating failed" errors the
|
||||
@@ -1046,7 +1065,8 @@
|
||||
// Delta radius and diagonal rod adjustments
|
||||
//#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)
|
||||
#endif
|
||||
|
||||
#endif // DELTA
|
||||
|
||||
// @section scara
|
||||
|
||||
@@ -1102,17 +1122,37 @@
|
||||
#define TPARA_LINKAGE_1 120 // (mm)
|
||||
#define TPARA_LINKAGE_2 120 // (mm)
|
||||
|
||||
// TPARA tower offset (position of Tower relative to bed zero position)
|
||||
// Height of the Shoulder axis (pivot) relative to the tower floor
|
||||
#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.
|
||||
#define TPARA_OFFSET_X 0 // (mm)
|
||||
#define TPARA_OFFSET_Y 0 // (mm)
|
||||
#define TPARA_OFFSET_Z 0 // (mm)
|
||||
#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_Y 0.0 // (mm)
|
||||
#define TPARA_OFFSET_Z 0.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
|
||||
|
||||
// Radius around the center where the arm cannot reach
|
||||
#define MIDDLE_DEAD_ZONE_R 0 // (mm)
|
||||
#endif
|
||||
// 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 100 // (mm)
|
||||
|
||||
// Max angle between L1 and L2
|
||||
#define TPARA_MAX_L1L2_ANGLE 140.0f // (degrees)
|
||||
#endif // AXEL_TPARA
|
||||
|
||||
// @section polar
|
||||
|
||||
@@ -1388,6 +1428,11 @@
|
||||
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
|
||||
*/
|
||||
//#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 =============================
|
||||
@@ -1660,6 +1705,8 @@
|
||||
//#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change
|
||||
#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
|
||||
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
|
||||
#define PROBING_MARGIN 10
|
||||
@@ -2036,8 +2083,11 @@
|
||||
//#define FILAMENT_MOTION_SENSOR
|
||||
|
||||
#if ENABLED(FILAMENT_MOTION_SENSOR)
|
||||
//#define FILAMENT_SWITCH_AND_MOTION
|
||||
//#define FILAMENT_SWITCH_AND_MOTION // Define separate pins below to sense 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 FIL_MOTION1_PIN -1
|
||||
|
||||
@@ -2073,7 +2123,7 @@
|
||||
//#define FIL_MOTION8_STATE LOW
|
||||
//#define FIL_MOTION8_PULLUP
|
||||
//#define FIL_MOTION8_PULLDOWN
|
||||
#endif
|
||||
#endif // FILAMENT_SWITCH_AND_MOTION
|
||||
#endif // FILAMENT_MOTION_SENSOR
|
||||
#endif // FILAMENT_RUNOUT_DISTANCE_MM
|
||||
#endif // FILAMENT_RUNOUT_SENSOR
|
||||
@@ -3108,7 +3158,7 @@
|
||||
|
||||
//
|
||||
// FYSETC variant of the MINI12864 graphic controller with SD support
|
||||
// https://wiki.fysetc.com/Mini12864_Panel/
|
||||
// https://wiki.fysetc.com/docs/Mini12864Panel
|
||||
//
|
||||
//#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)
|
||||
@@ -3458,6 +3508,7 @@
|
||||
* 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.
|
||||
* 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
|
||||
|
||||
@@ -3467,6 +3518,7 @@
|
||||
* BLUE_MARLIN - Default theme with 'midnight blue' background
|
||||
* BLACK_MARLIN - Theme with 'black' background
|
||||
* ANET_BLACK - Theme used for Anet ET4/5
|
||||
* :['BLUE_MARLIN', 'BLACK_MARLIN', 'ANET_BLACK']
|
||||
*/
|
||||
#define TFT_THEME BLACK_MARLIN
|
||||
|
||||
@@ -3504,6 +3556,11 @@
|
||||
//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait 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
|
||||
//
|
||||
|
||||
+168
-89
@@ -297,7 +297,7 @@
|
||||
* protect against a broken or disconnected thermistor wire.
|
||||
*
|
||||
* The issue: If a thermistor falls out, it will report the much lower
|
||||
* temperature of the air in the room, and the the firmware will keep
|
||||
* temperature of the air in the room, and the firmware will keep
|
||||
* the heater on.
|
||||
*
|
||||
* The solution: Once the temperature reaches the target, start observing.
|
||||
@@ -415,14 +415,19 @@
|
||||
// A well-chosen Kc value should add just enough power to melt the increased material volume.
|
||||
//#define PID_EXTRUSION_SCALING
|
||||
#if ENABLED(PID_EXTRUSION_SCALING)
|
||||
#define DEFAULT_Kc (100) // heating power = Kc * e_speed
|
||||
#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
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* 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.
|
||||
*
|
||||
* Constant compensation (use only with fan speeds of 0% and 100%)
|
||||
@@ -453,21 +458,26 @@
|
||||
#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
|
||||
// The alternative definition is used for an easier configuration.
|
||||
// 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_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+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_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 PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
|
||||
#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
|
||||
|
||||
#else
|
||||
#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
|
||||
#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
|
||||
|
||||
/**
|
||||
@@ -486,15 +496,15 @@
|
||||
#define AUTOTEMP
|
||||
#if ENABLED(AUTOTEMP)
|
||||
#define AUTOTEMP_OLDWEIGHT 0.98 // Factor used to weight previous readings (0.0 < value < 1.0)
|
||||
#define AUTOTEMP_MIN 210
|
||||
#define AUTOTEMP_MAX 250
|
||||
#define AUTOTEMP_MIN 210
|
||||
#define AUTOTEMP_MAX 250
|
||||
#define AUTOTEMP_FACTOR 0.1f
|
||||
// Turn on AUTOTEMP on M104/M109 by default using proportions set here
|
||||
//#define AUTOTEMP_PROPORTIONAL
|
||||
#if ENABLED(AUTOTEMP_PROPORTIONAL)
|
||||
#define AUTOTEMP_MIN_P 0 // (°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_MIN_P 0 // (°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)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -778,7 +788,7 @@
|
||||
|
||||
// @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.
|
||||
//#define ENDSTOPS_ALWAYS_ON_DEFAULT
|
||||
|
||||
@@ -1081,11 +1091,26 @@
|
||||
#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_ACC 0.02 // Stop iterating early if the accuracy is better than this
|
||||
|
||||
#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?
|
||||
// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
|
||||
#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
|
||||
@@ -1128,67 +1153,76 @@
|
||||
|
||||
/**
|
||||
* Fixed-time-based Motion Control -- BETA FEATURE
|
||||
* Enable/disable and set parameters with G-code M493.
|
||||
* Enable/disable and set parameters with G-code M493 and M494.
|
||||
* See ft_types.h for named values used by FTM options.
|
||||
*/
|
||||
//#define 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_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_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
|
||||
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
|
||||
#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_SHAPING_DEFAULT_FREQ_Y 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_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
|
||||
|
||||
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
|
||||
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
|
||||
//#define FTM_SHAPER_Z // Include Z shaping support
|
||||
#define FTM_DEFAULT_SHAPER_Z ftMotionShaper_NONE // Default shaper mode on Z 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 FT_MOTION_MENU // Provide a MarlinUI menu to set M493 parameters
|
||||
//#define FTM_SHAPER_E // Include E shaping support
|
||||
// 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
|
||||
*/
|
||||
#define FTM_UNIFIED_BWS // DON'T DISABLE unless you use Ulendo FBS (not implemented)
|
||||
#if ENABLED(FTM_UNIFIED_BWS)
|
||||
#define FTM_BW_SIZE 100 // Unified Window and Batch size with a ratio of 2
|
||||
#else
|
||||
#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
|
||||
#define FTM_BUFFER_SIZE 128 // Window size for trajectory generation, must be a power of 2 (e.g 64, 128, 256, ...)
|
||||
// The total buffered time in seconds is (FTM_BUFFER_SIZE/FTM_FS)
|
||||
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation.
|
||||
#define FTM_STEPPER_FS 2'000'000 // (Hz) Time resolution of stepper I/O update. Shouldn't affect CPU much (slower board testing needed)
|
||||
#define FTM_MIN_SHAPE_FREQ 20 // (Hz) Minimum shaping frequency, lower consumes more RAM
|
||||
|
||||
#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
|
||||
#endif // FT_MOTION
|
||||
|
||||
/**
|
||||
* Input Shaping
|
||||
@@ -1394,7 +1428,7 @@
|
||||
* Multi-stepping sends steps in bursts to reduce MCU usage for high step-rates.
|
||||
* 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
|
||||
@@ -1607,7 +1641,7 @@
|
||||
#if HAS_MARLINUI_U8GLIB
|
||||
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
|
||||
#endif
|
||||
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780)
|
||||
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780, HAS_GRAPHICAL_TFT)
|
||||
//#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup.
|
||||
#endif
|
||||
#endif
|
||||
@@ -1673,11 +1707,12 @@
|
||||
|
||||
#endif // HAS_DISPLAY
|
||||
|
||||
#if HAS_FEEDRATE_EDIT
|
||||
// Some displays offer Feedrate / Flow editing.
|
||||
#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_MAX 999 // (%) Feedrate percentage edit range maximum
|
||||
#endif
|
||||
#if HAS_FLOW_EDIT
|
||||
#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
|
||||
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
|
||||
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
|
||||
#endif
|
||||
@@ -1773,6 +1808,8 @@
|
||||
//#define 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_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 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.
|
||||
@@ -1836,6 +1873,7 @@
|
||||
#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.
|
||||
// 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
|
||||
|
||||
// Allow international symbols in long filenames. To display correctly, the
|
||||
@@ -1938,6 +1976,9 @@
|
||||
//#define CUSTOM_FIRMWARE_UPLOAD
|
||||
#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):
|
||||
*
|
||||
@@ -2343,13 +2384,17 @@
|
||||
* See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
|
||||
*/
|
||||
//#define LIN_ADVANCE
|
||||
#if ENABLED(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
|
||||
#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 applying to all extruders
|
||||
#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.
|
||||
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with 'M900 L'.
|
||||
#endif
|
||||
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
//#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.
|
||||
|
||||
@@ -2363,11 +2408,11 @@
|
||||
* Higher k and higher XY acceleration may require larger ADVANCE_TAU to avoid skipping steps.
|
||||
*/
|
||||
#if ENABLED(DISTINCT_E_FACTORS)
|
||||
#define ADVANCE_TAU { 0.01 } // (s) Smoothing time to reduce extruder acceleration, per extruder
|
||||
#define ADVANCE_TAU { 0.02 } // (s) Smoothing time to reduce extruder acceleration, per extruder
|
||||
#else
|
||||
#define ADVANCE_TAU 0.01 // (s) Smoothing time to reduce extruder acceleration
|
||||
#define ADVANCE_TAU 0.02 // (s) Smoothing time to reduce extruder acceleration
|
||||
#endif
|
||||
#define SMOOTH_LIN_ADV_HZ 5000 // (Hz) How often to update extruder speed
|
||||
#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
|
||||
@@ -2380,6 +2425,9 @@
|
||||
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
|
||||
*/
|
||||
//#define NONLINEAR_EXTRUSION
|
||||
#if ENABLED(NONLINEAR_EXTRUSION)
|
||||
//#define NONLINEAR_EXTRUSION_DEFAULT_ON // Enable if NLE should be ON by default
|
||||
#endif
|
||||
|
||||
// @section leveling
|
||||
|
||||
@@ -2993,7 +3041,7 @@
|
||||
/**
|
||||
* Trinamic Smart Drivers
|
||||
*
|
||||
* To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
|
||||
* To use TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
|
||||
* - Connect your SPI pins to the Hardware SPI interface on the board.
|
||||
* Some boards have simple jumper connections! See your board's documentation.
|
||||
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
|
||||
@@ -3023,6 +3071,14 @@
|
||||
*/
|
||||
#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)
|
||||
#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.)
|
||||
@@ -3245,7 +3301,7 @@
|
||||
// @section tmc/spi
|
||||
|
||||
/**
|
||||
* Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
|
||||
* Override default SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160 drivers here.
|
||||
* The default pins can be found in your board's pins file.
|
||||
*/
|
||||
//#define X_CS_PIN -1
|
||||
@@ -3272,7 +3328,7 @@
|
||||
//#define E7_CS_PIN -1
|
||||
|
||||
/**
|
||||
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
|
||||
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160).
|
||||
* The default SW SPI pins are defined the respective pins files,
|
||||
* but you can override or define them here.
|
||||
*/
|
||||
@@ -3331,7 +3387,7 @@
|
||||
// @section tmc/stealthchop
|
||||
|
||||
/**
|
||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
|
||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
|
||||
* Use Trinamic's ultra quiet stepping mode.
|
||||
* When disabled, Marlin will use spreadCycle stepping mode.
|
||||
*/
|
||||
@@ -3410,7 +3466,7 @@
|
||||
// @section tmc/hybrid
|
||||
|
||||
/**
|
||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
|
||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
|
||||
* 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.
|
||||
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
|
||||
@@ -3444,20 +3500,20 @@
|
||||
/**
|
||||
* Use StallGuard to home / probe X, Y, Z.
|
||||
*
|
||||
* TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
|
||||
* TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, TMC5130, and TMC5160 only
|
||||
* 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/Z_STALL_SENSITIVITY is the default stall threshold.
|
||||
* Use M914 X Y Z to set the stall threshold at runtime:
|
||||
*
|
||||
* Sensitivity TMC2209 Others
|
||||
* HIGHEST 255 -64 (Too sensitive => False positive)
|
||||
* LOWEST 0 63 (Too insensitive => No trigger)
|
||||
* Sensitivity TMC2209 Others
|
||||
* HIGHEST 255 -64 (Too sensitive => False positive)
|
||||
* LOWEST 0 63 (Too insensitive => No trigger)
|
||||
*
|
||||
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
|
||||
*
|
||||
* SPI_ENDSTOPS *** TMC2130/TMC5160 Only ***
|
||||
* SPI_ENDSTOPS *** TMC2130, TMC2240, and TMC5160 Only ***
|
||||
* Poll the driver through SPI to determine load when homing.
|
||||
* Removes the need for a wire from DIAG1 to an endstop pin.
|
||||
*
|
||||
@@ -3485,8 +3541,9 @@
|
||||
//#define U_STALL_SENSITIVITY 8
|
||||
//#define V_STALL_SENSITIVITY 8
|
||||
//#define W_STALL_SENSITIVITY 8
|
||||
//#define SPI_ENDSTOPS // TMC2130/TMC5160 only
|
||||
//#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
|
||||
//#define IMPROVE_HOMING_RELIABILITY
|
||||
//#define SENSORLESS_STALLGUARD_DELAY 0 // (ms) Delay to allow drivers to settle
|
||||
#endif
|
||||
|
||||
// @section tmc/config
|
||||
@@ -3974,7 +4031,7 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* M115 - Report capabilites. Disable to save ~1150 bytes of flash.
|
||||
* M115 - Report capabilities. Disable to save ~1150 bytes of flash.
|
||||
* Some hosts (and serial TFT displays) rely on this feature.
|
||||
*/
|
||||
#define CAPABILITIES_REPORT
|
||||
@@ -4049,13 +4106,17 @@
|
||||
/**
|
||||
* G-code Macros
|
||||
*
|
||||
* Add G-codes M810-M819 to define and run G-code macros.
|
||||
* Macros are not saved to EEPROM.
|
||||
* 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 unless enabled below.
|
||||
*/
|
||||
//#define GCODE_MACROS
|
||||
#if ENABLED(GCODE_MACROS)
|
||||
#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
|
||||
#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
|
||||
|
||||
/**
|
||||
@@ -4077,22 +4138,27 @@
|
||||
#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
|
||||
#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_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_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_IMMEDIATE
|
||||
|
||||
//#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_CONFIRM
|
||||
//#define MAIN_MENU_ITEM_3_IMMEDIATE
|
||||
|
||||
//#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_CONFIRM
|
||||
//#define MAIN_MENU_ITEM_4_IMMEDIATE
|
||||
|
||||
//#define MAIN_MENU_ITEM_5_DESC "Home & Info"
|
||||
//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
|
||||
//#define MAIN_MENU_ITEM_5_CONFIRM
|
||||
//#define MAIN_MENU_ITEM_5_IMMEDIATE
|
||||
#endif
|
||||
|
||||
// @section custom config menu
|
||||
@@ -4109,22 +4175,27 @@
|
||||
#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_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_GCODE "M118 [ESP110] BT pwd=12345678"
|
||||
//#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_GCODE "M118 [ESP110] OFF pwd=12345678"
|
||||
//#define CONFIG_MENU_ITEM_3_CONFIRM
|
||||
//#define CONFIG_MENU_ITEM_3_IMMEDIATE
|
||||
|
||||
//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
|
||||
//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
|
||||
//#define CONFIG_MENU_ITEM_4_CONFIRM
|
||||
//#define CONFIG_MENU_ITEM_4_IMMEDIATE
|
||||
|
||||
//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
|
||||
//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
|
||||
//#define CONFIG_MENU_ITEM_5_CONFIRM
|
||||
//#define CONFIG_MENU_ITEM_5_IMMEDIATE
|
||||
#endif
|
||||
|
||||
// @section custom buttons
|
||||
@@ -4141,6 +4212,7 @@
|
||||
#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
|
||||
#define BUTTON1_GCODE "G28"
|
||||
#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
|
||||
|
||||
//#define BUTTON2_PIN -1
|
||||
@@ -4149,6 +4221,7 @@
|
||||
#define BUTTON2_WHEN_PRINTING false
|
||||
#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_IMMEDIATE
|
||||
#endif
|
||||
|
||||
//#define BUTTON3_PIN -1
|
||||
@@ -4157,6 +4230,7 @@
|
||||
#define BUTTON3_WHEN_PRINTING false
|
||||
#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_IMMEDIATE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -4229,7 +4303,7 @@
|
||||
//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
|
||||
// steps per full revolution (motor steps/rev * microstepping)
|
||||
//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
|
||||
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction.
|
||||
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error correction.
|
||||
#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
|
||||
// smaller than this are ignored to minimize effects of
|
||||
@@ -4661,6 +4735,11 @@
|
||||
//
|
||||
//#define PINS_DEBUGGING
|
||||
|
||||
//
|
||||
// M265 - I2C Scanner
|
||||
//
|
||||
//#define I2C_SCANNER
|
||||
|
||||
// Enable Tests that will run at startup and produce a report
|
||||
//#define MARLIN_TEST_BUILD
|
||||
|
||||
|
||||
+70
-61
@@ -188,15 +188,15 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1033)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1034)
|
||||
|
||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1035)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1040)
|
||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1036)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1041)
|
||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1037)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1042)
|
||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1038)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1043)
|
||||
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1039)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1044)
|
||||
|
||||
#
|
||||
# RAMPS Derivatives - ATmega1280, ATmega2560
|
||||
@@ -286,59 +286,62 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
||||
# Creality: CR10S, CR20, CR-X
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
||||
# Dagoma F5
|
||||
# Creality CR-10 V2, CR-10 V3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
||||
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
||||
# Dagoma F5
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
||||
# FYSETC F6 1.3
|
||||
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
||||
# FYSETC F6 1.4
|
||||
# FYSETC F6 1.3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
||||
# Wanhao Duplicator i3 Plus
|
||||
# FYSETC F6 1.4
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
||||
# VORON Design
|
||||
# Wanhao Duplicator i3 Plus
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
||||
# Tronxy TRONXY-V3-1.0
|
||||
# VORON Design
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
||||
# Z-Bolt X Series
|
||||
# Tronxy TRONXY-V3-1.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
||||
# TT OSCAR
|
||||
# Z-Bolt X Series
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
||||
# BIQU Tango V1
|
||||
# TT OSCAR
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||
# MKS GEN L V2
|
||||
# BIQU Tango V1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||
# MKS GEN L V2.1
|
||||
# MKS GEN L V2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||
# Copymaster 3D
|
||||
# MKS GEN L V2.1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||
# Ortur 4
|
||||
# Copymaster 3D
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||
# Tenlog D3 Hero IDEX printer
|
||||
# Ortur 4
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||
# Tenlog D3, D5, D6 IDEX Printer
|
||||
# Tenlog D3 Hero IDEX printer
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||
# Tenlog D3, D5, D6 IDEX Printer
|
||||
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, Fan, Bed)
|
||||
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: Hotend0, Hotend1, Hotend2, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||
# Pxmalion Core I3
|
||||
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||
# Panowin Cutlass (as found in the Panowin F1)
|
||||
# Pxmalion Core I3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
||||
# Panowin Cutlass (as found in the Panowin F1)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
||||
# XTLW MFF V1.0
|
||||
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
|
||||
# XTLW MFF V2.0
|
||||
# XTLW MFF V1.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
|
||||
|
||||
# XTLW MFF V2.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1167)
|
||||
# E3D Rumba BigBox
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1168)
|
||||
|
||||
#
|
||||
# RAMBo and derivatives
|
||||
@@ -407,32 +410,34 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1319)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
||||
# Einstart retrofit
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||
# Wanhao 0ne+ i3 Mini
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||
# Overlord/Overlord Pro
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||
# ADIMLab Gantry v1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||
# ADIMLab Gantry v2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||
# Leapfrog Xeed 2015
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||
# PICA Shield (original version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||
# PICA Shield (rev C or later)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
||||
# Intamsys 4.0 (Funmat HT)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
|
||||
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
|
||||
# Mega controller & Protoneer CNC Shield V3.00
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
|
||||
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
|
||||
# Geeetech GT2560 V4.1B for A10(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||
# Einstart retrofit
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||
# Wanhao 0ne+ i3 Mini
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||
# Wanhao D9 MK2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||
# Overlord/Overlord Pro
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||
# ADIMLab Gantry v1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||
# ADIMLab Gantry v2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||
# Leapfrog Xeed 2015
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
||||
# PICA Shield (original version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
|
||||
# PICA Shield (rev C or later)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
|
||||
# Intamsys 4.0 (Funmat HT)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
|
||||
# Malyan M180 Mainboard Version 2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
|
||||
# Mega controller & Protoneer CNC Shield V3.00
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1334)
|
||||
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1335)
|
||||
|
||||
#
|
||||
# ATmega1281, ATmega2561
|
||||
@@ -512,7 +517,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# ZoneStar ZMIB V2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1512)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
@@ -626,6 +631,10 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
||||
MCU ?= at90usb1286
|
||||
PROG_MCU ?= usb1286
|
||||
|
||||
#
|
||||
# SAM3X8E ARM Cortex-M3
|
||||
#
|
||||
|
||||
# UltiMachine Archim1 (with DRV8825 drivers)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
||||
HARDWARE_VARIANT ?= archim
|
||||
@@ -798,10 +807,10 @@ endif
|
||||
|
||||
ifeq ($(TMC), 1)
|
||||
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
|
||||
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
|
||||
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
|
||||
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
||||
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
||||
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp \
|
||||
GLOBAL_SCALER.cpp SLAVECONF.cpp IOIN.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp \
|
||||
SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
||||
TMC2209Stepper.cpp TMC2240Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(RELOC_WORKAROUND), 1)
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@
|
||||
* here we define this default string as the date where the latest release
|
||||
* version was tagged.
|
||||
*/
|
||||
//#define STRING_DISTRIBUTION_DATE "2025-05-02"
|
||||
//#define STRING_DISTRIBUTION_DATE "2025-12-02"
|
||||
|
||||
/**
|
||||
* The protocol for communication to the host. Protocol indicates communication
|
||||
|
||||
+32
-22
@@ -86,13 +86,14 @@ heater_0_maxtemp = 275
|
||||
pidtemp = on
|
||||
pid_k1 = 0.95
|
||||
pid_max = 255
|
||||
pid_functional_range = 10
|
||||
pid_functional_range = 20
|
||||
|
||||
default_kp = 22.20
|
||||
default_ki = 1.08
|
||||
default_kd = 114.00
|
||||
|
||||
temp_sensor_bed = 1
|
||||
bed_check_interval = 5000
|
||||
bed_mintemp = 5
|
||||
bed_maxtemp = 150
|
||||
|
||||
@@ -163,18 +164,28 @@ min_steps_per_segment = 6
|
||||
default_minsegmenttime = 20000
|
||||
|
||||
[config:basic]
|
||||
hotend_overshoot = 15
|
||||
bed_overshoot = 10
|
||||
max_bed_power = 255
|
||||
|
||||
busy_while_heating = on
|
||||
host_keepalive_feature = on
|
||||
default_keepalive_interval = 2
|
||||
printjob_timer_autostart = on
|
||||
|
||||
jd_handle_small_segments = on
|
||||
validate_homing_endstops = on
|
||||
editable_steps_per_unit = on
|
||||
|
||||
eeprom_boot_silent = on
|
||||
eeprom_chitchat = on
|
||||
|
||||
endstoppullups = on
|
||||
extrude_maxlength = 200
|
||||
|
||||
prevent_cold_extrusion = on
|
||||
extrude_mintemp = 170
|
||||
host_keepalive_feature = on
|
||||
hotend_overshoot = 15
|
||||
jd_handle_small_segments = on
|
||||
max_bed_power = 255
|
||||
prevent_lengthy_extrude = on
|
||||
extrude_maxlength = 200
|
||||
|
||||
min_software_endstops = on
|
||||
max_software_endstops = on
|
||||
@@ -195,21 +206,19 @@ preheat_2_temp_hotend = 240
|
||||
preheat_2_temp_bed = 110
|
||||
preheat_2_fan_speed = 0
|
||||
|
||||
prevent_cold_extrusion = on
|
||||
prevent_lengthy_extrude = on
|
||||
printjob_timer_autostart = on
|
||||
|
||||
temp_bed_hysteresis = 3
|
||||
temp_bed_residency_time = 10
|
||||
temp_bed_window = 1
|
||||
temp_residency_time = 10
|
||||
temp_window = 1
|
||||
validate_homing_endstops = on
|
||||
|
||||
editable_steps_per_unit = on
|
||||
|
||||
[config:advanced]
|
||||
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
|
||||
|
||||
autotemp = on
|
||||
@@ -223,22 +232,23 @@ disable_idle_x = on
|
||||
disable_idle_y = on
|
||||
disable_idle_z = on
|
||||
disable_idle_e = on
|
||||
|
||||
e0_auto_fan_pin = -1
|
||||
|
||||
faster_gcode_parser = on
|
||||
debug_flags_gcode = on
|
||||
|
||||
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_divisor = 2
|
||||
tx_buffer_size = 0
|
||||
multistepping_limit = 16
|
||||
|
||||
bed_check_interval = 5000
|
||||
watch_bed_temp_increase = 2
|
||||
watch_bed_temp_period = 60
|
||||
serial_overrun_protection = on
|
||||
tx_buffer_size = 0
|
||||
|
||||
watch_temp_increase = 2
|
||||
watch_temp_period = 40
|
||||
|
||||
watch_bed_temp_increase = 2
|
||||
watch_bed_temp_period = 60
|
||||
|
||||
@@ -119,7 +119,6 @@ void MarlinHAL::reboot() {
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
|
||||
#include <avr/wdt.h>
|
||||
#include "../../MarlinCore.h"
|
||||
|
||||
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
||||
void MarlinHAL::watchdog_init() {
|
||||
@@ -154,7 +153,7 @@ void MarlinHAL::reboot() {
|
||||
ISR(WDT_vect) {
|
||||
sei(); // With the interrupt driven serial we need to allow interrupts.
|
||||
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
||||
minkill(); // interrupt-safe final kill and infinite loop
|
||||
marlin.minkill(); // interrupt-safe final kill and infinite loop
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask() {}
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
||||
|
||||
#include "MarlinSerial.h"
|
||||
#include "../../MarlinCore.h"
|
||||
|
||||
#if ENABLED(DIRECT_STEPPING)
|
||||
#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.
|
||||
*/
|
||||
uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) {
|
||||
uint16_t set_pwm_frequency_hz(const float hz, const float dca, const float dcb, const float dcc) {
|
||||
float count = 0;
|
||||
if (hz > 0 && (dca || dcb || dcc)) {
|
||||
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
||||
@@ -254,7 +254,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
|
||||
else { prescaler = 1; SET_CS(5, PRESCALER_1); }
|
||||
|
||||
count /= float(prescaler);
|
||||
const float pwm_top = round(count); // Get the rounded count
|
||||
const float pwm_top = roundf(count); // Get the rounded count
|
||||
|
||||
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
|
||||
OCR5A = pwm_top * ABS(dca); // Update and scale DCs
|
||||
@@ -280,7 +280,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
|
||||
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
|
||||
OCR5A = OCR5B = OCR5C = 0;
|
||||
}
|
||||
return round(count);
|
||||
return roundf(count);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
/**
|
||||
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
||||
*/
|
||||
#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
|
||||
#if ALL(HAS_TMC_SW_SERIAL, ENDSTOP_INTERRUPTS_FEATURE)
|
||||
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
||||
#endif
|
||||
|
||||
|
||||
@@ -93,15 +93,15 @@ namespace AVRHelpers {
|
||||
typedef T type;
|
||||
};
|
||||
template <typename T>
|
||||
struct voltype <T, 1u> {
|
||||
struct voltype <T, 1U> {
|
||||
typedef uint8_t type;
|
||||
};
|
||||
template <typename T>
|
||||
struct voltype <T, 2u> {
|
||||
struct voltype <T, 2U> {
|
||||
typedef uint16_t type;
|
||||
};
|
||||
template <typename T>
|
||||
struct voltype <T, 4u> {
|
||||
struct voltype <T, 4U> {
|
||||
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__)
|
||||
_EEAR._EEAR = 0;
|
||||
dwrite(_EEDR, (uint8_t)0u);
|
||||
dwrite(_EEDR, (uint8_t)0U);
|
||||
#endif
|
||||
|
||||
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__)
|
||||
|
||||
+10
-10
@@ -28,7 +28,7 @@
|
||||
// ------------------------
|
||||
|
||||
typedef uint16_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFU
|
||||
|
||||
// ------------------------
|
||||
// Defines
|
||||
@@ -46,15 +46,15 @@ typedef uint16_t hal_timer_t;
|
||||
#define MF_TIMER_TEMP 0
|
||||
#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_PRESCALE 8
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||
#define STEPPER_TIMER_PRESCALE 8
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
#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 ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(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).
|
||||
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
||||
*/
|
||||
#define HAL_timer_isr_prologue(T) NOOP
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#ifdef ARDUINO_ARCH_SAM
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../MarlinCore.h"
|
||||
|
||||
#include <Wire.h>
|
||||
#include "usb/usb_task.h"
|
||||
|
||||
@@ -132,7 +132,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask();
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
|
||||
#include "MarlinSerial.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_t MarlinSerial<Cfg>::tx_buffer = { 0 };
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||
|
||||
typedef uint32_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
|
||||
|
||||
#define HAL_TIMER_PRESCALER 2
|
||||
#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
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer ISR (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_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_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 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 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 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;
|
||||
}
|
||||
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -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 Interface (UDI) provides USB Class compliance
|
||||
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
|
||||
|
||||
*
|
||||
* Many USB Device applications can be implemented on Atmel MCU.
|
||||
* Atmel provides many application notes for different applications:
|
||||
* - AVR4900, provides general information about Device Stack
|
||||
|
||||
@@ -523,7 +523,7 @@ static bool udd_ep_interrupt(void);
|
||||
* \internal
|
||||
* \brief Function called by UOTGHS interrupt to manage USB Device interrupts
|
||||
*
|
||||
* USB Device interrupt events are splited in three parts:
|
||||
* USB Device interrupt events are split in three parts:
|
||||
* - USB line events (SOF, reset, suspend, resume, wakeup)
|
||||
* - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
|
||||
* - 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))) {
|
||||
// End of reception because it is a short packet
|
||||
// Before send ZLP, call intermediate callback
|
||||
// in case of data receiv generate a stall
|
||||
// in case of data receive generate a stall
|
||||
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
||||
if (NULL != 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) {
|
||||
// Need to send or receiv other data
|
||||
// Need to send or receive other data
|
||||
next_trans = ptr_job->buf_size - ptr_job->buf_cnt;
|
||||
|
||||
if (UDD_ENDPOINT_MAX_TRANS < next_trans) {
|
||||
|
||||
@@ -242,12 +242,13 @@ void MarlinHAL::adc_init() {
|
||||
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_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
||||
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
||||
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
||||
TERN_(HAS_TEMP_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
|
||||
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
||||
TERN_(HAS_TEMP_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
|
||||
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
||||
TERN_(HAS_TEMP_ADC_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_ADC_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_ADC_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_(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.
|
||||
// That's why we're not setting it up here.
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
|
||||
|
||||
#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_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 MAX_PWM_IOPIN 33u // hardware pwm pins < 34
|
||||
#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 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
|
||||
#ifndef MAX_EXPANDER_BITS
|
||||
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
|
||||
#endif
|
||||
@@ -194,7 +194,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask();
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -35,7 +35,7 @@ Servo::Servo() {}
|
||||
|
||||
int8_t Servo::attach(const int 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.
|
||||
}
|
||||
|
||||
|
||||
@@ -78,8 +78,8 @@ void IRAM_ATTR timer_isr(void *para) {
|
||||
|
||||
/**
|
||||
* Enable and initialize the timer
|
||||
* @param timer_num timer number to initialize
|
||||
* @param frequency frequency of the timer
|
||||
* @param timer_num timer number to initialize
|
||||
* @param frequency frequency of the timer
|
||||
*/
|
||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
const tTimerConfig timer = timer_config[timer_num];
|
||||
|
||||
@@ -30,41 +30,46 @@
|
||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||
|
||||
typedef uint64_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
|
||||
|
||||
#ifndef MF_TIMER_STEP
|
||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
||||
#endif
|
||||
#ifndef MF_TIMER_PULSE
|
||||
#define MF_TIMER_PULSE MF_TIMER_STEP
|
||||
#define MF_TIMER_PULSE MF_TIMER_STEP // Timer Index for Pulse interval
|
||||
#endif
|
||||
#ifndef MF_TIMER_TEMP
|
||||
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
||||
#endif
|
||||
#ifndef MF_TIMER_PWM
|
||||
#define MF_TIMER_PWM 2 // index of timer to use for PWM outputs
|
||||
#define MF_TIMER_PWM 2 // Timer Index for PWM outputs
|
||||
#endif
|
||||
#ifndef MF_TIMER_TONE
|
||||
#define MF_TIMER_TONE 3 // index of timer for beeper tones
|
||||
#define MF_TIMER_TONE 3 // Timer Index for beeper tones
|
||||
#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)
|
||||
#define STEPPER_TIMER_PRESCALE 1
|
||||
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock
|
||||
#define STEPPER_TIMER_RATE 250'000 // 250khz, 4µs pulses of i2s word clock
|
||||
#define STEPPER_TIMER_TICKS_PER_US 0.25 // (MHz) Stepper Timer ticks per µs
|
||||
#else
|
||||
#define STEPPER_TIMER_PRESCALE 40
|
||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz
|
||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // (Hz) Frequency of Stepper Timer ISR, 2MHz
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1'000'000UL) // (MHz) Stepper Timer ticks per µs
|
||||
#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 TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
||||
#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 TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
||||
|
||||
#define PWM_TIMER_PRESCALE 10
|
||||
#if ENABLED(FAST_PWM_FAN)
|
||||
@@ -74,13 +79,9 @@ typedef uint64_t hal_timer_t;
|
||||
#endif
|
||||
#define MAX_PWM_PINS 32 // Number of PWM pin-slots
|
||||
|
||||
#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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
@@ -135,5 +136,5 @@ void HAL_timer_enable_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);
|
||||
|
||||
#define HAL_timer_isr_prologue(T) NOOP
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -53,12 +53,15 @@ uint16_t MarlinHAL::adc_result;
|
||||
|
||||
// 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
|
||||
#if PIN_EXISTS(LED)
|
||||
OUT_WRITE(LED_PIN, LOW);
|
||||
#endif
|
||||
|
||||
SetTimerInterruptPriorities();
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@ extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char
|
||||
class MarlinHAL {
|
||||
public:
|
||||
// Before setup()
|
||||
MarlinHAL() {}
|
||||
MarlinHAL() = default;
|
||||
|
||||
// Watchdog
|
||||
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
|
||||
using namespace arduino;
|
||||
|
||||
MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) {
|
||||
UsartSerial& serial = UsartSerial::get_instance(Base, rxPin, txPin);
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPi
|
||||
|
||||
static void emergency_callback() {
|
||||
if (!current_serial_instance) return;
|
||||
const uint8_t last_data = current_serial_instance->get_last_data();
|
||||
const auto last_data = current_serial_instance->get_last_data();
|
||||
emergency_parser.update(current_serial_instance->emergency_state, last_data);
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
using namespace arduino;
|
||||
|
||||
struct MarlinSerial : public UsartSerial {
|
||||
static MarlinSerial& get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN);
|
||||
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); }
|
||||
@@ -57,7 +57,7 @@ struct MarlinSerial : public UsartSerial {
|
||||
EmergencyParser::State emergency_state;
|
||||
|
||||
// Accessor method to get the last received byte
|
||||
uint8_t get_last_data() { return usart_.get_last_data(); }
|
||||
auto get_last_data() -> uint8_t { return usart_.get_last_data(); }
|
||||
|
||||
// Register the emergency callback
|
||||
void register_emergency_callback(void (*callback)());
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library.
|
||||
|
||||
Currently it supports:
|
||||
* GD32F303RET6
|
||||
|
||||
- GD32F303RET6
|
||||
|
||||
Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL).
|
||||
|
||||
@@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
||||
// so only write bytes that have changed!
|
||||
if (v != eeprom_read_byte(p)) {
|
||||
eeprom_write_byte(p, v);
|
||||
if (++written & 0x7F) delay(4); else safe_delay(4);
|
||||
if (++written & 0x7F) delay(2); else safe_delay(2);
|
||||
if (eeprom_read_byte(p) != v) {
|
||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||
return true;
|
||||
|
||||
@@ -42,7 +42,7 @@ void eeprom_init() {
|
||||
|
||||
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
|
||||
const unsigned eeprom_address = (unsigned)pos;
|
||||
return BL24CXX::writeOneByte(eeprom_address, value);
|
||||
BL24CXX::writeOneByte(eeprom_address, value);
|
||||
}
|
||||
|
||||
uint8_t eeprom_read_byte(uint8_t *pos) {
|
||||
|
||||
@@ -21,26 +21,27 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
// Fast I/O interfaces for GD32F303RE
|
||||
// Fast I/O interfaces for GD32
|
||||
|
||||
#include <GPIO.hpp>
|
||||
#include <variant.h>
|
||||
#include <PinOps.hpp>
|
||||
#include <PinOpsMap.hpp>
|
||||
|
||||
template<typename T>
|
||||
static inline void fast_write_pin_wrapper(pin_size_t IO, T V) {
|
||||
auto port = getPortFromPin(IO);
|
||||
auto pin = getPinInPort(IO);
|
||||
if (static_cast<bool>(V)) gpio::fast_set_pin(port, pin);
|
||||
else gpio::fast_clear_pin(port, pin);
|
||||
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));
|
||||
}
|
||||
|
||||
static inline bool fast_read_pin_wrapper(pin_size_t IO) {
|
||||
return gpio::fast_read_pin(getPortFromPin(IO), getPinInPort(IO));
|
||||
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);
|
||||
}
|
||||
|
||||
static inline void fast_toggle_pin_wrapper(pin_size_t IO) {
|
||||
gpio::fast_toggle_pin(getPortFromPin(IO), getPinInPort(IO));
|
||||
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);
|
||||
}
|
||||
|
||||
// ------------------------
|
||||
|
||||
@@ -70,8 +70,9 @@ bool isAnalogPin(const pin_t pin) {
|
||||
if (!isValidPin(pin)) return false;
|
||||
|
||||
if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) {
|
||||
auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value();
|
||||
return instance.get_pin_mode(getPinInPort(pin)) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin);
|
||||
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;
|
||||
@@ -80,8 +81,9 @@ bool isAnalogPin(const pin_t pin) {
|
||||
bool getValidPinMode(const pin_t pin) {
|
||||
if (!isValidPin(pin)) return false;
|
||||
|
||||
auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value();
|
||||
gpio::Pin_Mode mode = instance.get_pin_mode(getPinInPort(pin));
|
||||
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;
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
namespace sdio {
|
||||
|
||||
CardDMA& CardDMA::get_instance() {
|
||||
auto CardDMA::get_instance() -> CardDMA& {
|
||||
static CardDMA instance;
|
||||
return instance;
|
||||
}
|
||||
@@ -38,9 +38,7 @@ CardDMA::CardDMA() :
|
||||
sdcard_cid_{0U, 0U, 0U, 0U},
|
||||
sdcard_scr_{0U, 0U},
|
||||
desired_clock_(Default_Desired_Clock),
|
||||
stop_condition_(0U),
|
||||
total_bytes_(0U),
|
||||
count_(0U),
|
||||
sdio_(SDIO::get_instance()),
|
||||
config_(sdio_.get_config()),
|
||||
dmaBase_(dma::DMA_Base::DMA1_BASE),
|
||||
@@ -50,15 +48,15 @@ CardDMA::CardDMA() :
|
||||
transfer_error_(SDIO_Error_Type::OK),
|
||||
interface_version_(Interface_Version::UNKNOWN),
|
||||
card_type_(Card_Type::UNKNOWN),
|
||||
current_state_(Operational_State::READY),
|
||||
transfer_end_(false),
|
||||
is_rx_(false),
|
||||
multiblock_(false),
|
||||
current_state_(Operational_State::READY)
|
||||
is_rx_(false)
|
||||
{
|
||||
}
|
||||
|
||||
// Initialize card and put in standby state
|
||||
SDIO_Error_Type CardDMA::init() {
|
||||
auto CardDMA::init() -> SDIO_Error_Type {
|
||||
// Reset SDIO peripheral
|
||||
sdio_.reset();
|
||||
sync_domains();
|
||||
@@ -79,7 +77,7 @@ SDIO_Error_Type CardDMA::init() {
|
||||
}
|
||||
|
||||
// Startup command procedure according to SDIO specification
|
||||
SDIO_Error_Type CardDMA::begin_startup_procedure() {
|
||||
auto CardDMA::begin_startup_procedure() -> SDIO_Error_Type {
|
||||
sdio_.set_power_mode(Power_Control::POWER_ON);
|
||||
sdio_.set_clock_enable(true);
|
||||
sync_domains();
|
||||
@@ -124,12 +122,12 @@ SDIO_Error_Type CardDMA::begin_startup_procedure() {
|
||||
}
|
||||
|
||||
// Voltage validation
|
||||
SDIO_Error_Type CardDMA::validate_voltage() {
|
||||
auto CardDMA::validate_voltage() -> SDIO_Error_Type {
|
||||
uint32_t response = 0U;
|
||||
uint32_t count = 0U;
|
||||
bool valid_voltage = false;
|
||||
|
||||
while ((count < Max_Voltage_Checks) && (valid_voltage == false)) {
|
||||
while (count < Max_Voltage_Checks && valid_voltage == false) {
|
||||
if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT,
|
||||
Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() {
|
||||
return get_r1_result(cmd);
|
||||
@@ -144,7 +142,7 @@ SDIO_Error_Type CardDMA::validate_voltage() {
|
||||
return SDIO_Error_Type::ACMD41_FAILED;
|
||||
}
|
||||
response = sdio_.get_response(Response_Type::RESPONSE0);
|
||||
valid_voltage = (((response >> 31U) == 1U) ? true : false);
|
||||
valid_voltage = ((response >> 31U) == 1U);
|
||||
count++;
|
||||
}
|
||||
|
||||
@@ -171,7 +169,7 @@ void CardDMA::begin_shutdown_procedure() {
|
||||
}
|
||||
|
||||
// Initialize card
|
||||
SDIO_Error_Type CardDMA::card_init() {
|
||||
auto CardDMA::card_init() -> SDIO_Error_Type {
|
||||
if (sdio_.get_power_mode() == static_cast<uint32_t>(Power_Control::POWER_OFF)) {
|
||||
return SDIO_Error_Type::INVALID_OPERATION;
|
||||
}
|
||||
@@ -221,7 +219,7 @@ SDIO_Error_Type CardDMA::card_init() {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::store_cid() {
|
||||
auto CardDMA::store_cid() -> SDIO_Error_Type {
|
||||
// Store the CID register values
|
||||
sdcard_cid_[0] = sdio_.get_response(Response_Type::RESPONSE0);
|
||||
sdcard_cid_[1] = sdio_.get_response(Response_Type::RESPONSE1);
|
||||
@@ -231,7 +229,7 @@ SDIO_Error_Type CardDMA::store_cid() {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::store_csd() {
|
||||
auto CardDMA::store_csd() -> SDIO_Error_Type {
|
||||
// Store the CSD register values
|
||||
sdcard_csd_[0] = sdio_.get_response(Response_Type::RESPONSE0);
|
||||
sdcard_csd_[1] = sdio_.get_response(Response_Type::RESPONSE1);
|
||||
@@ -241,7 +239,7 @@ SDIO_Error_Type CardDMA::store_csd() {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) {
|
||||
auto CardDMA::set_hardware_bus_width(Bus_Width width) -> SDIO_Error_Type {
|
||||
if (card_type_ == Card_Type::SD_MMC || width == Bus_Width::WIDTH_8BIT) {
|
||||
return SDIO_Error_Type::UNSUPPORTED_FUNCTION;
|
||||
}
|
||||
@@ -283,7 +281,7 @@ SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) {
|
||||
return SDIO_Error_Type::UNSUPPORTED_FUNCTION;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) {
|
||||
auto CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type {
|
||||
if (current_state_ == Operational_State::READY) {
|
||||
transfer_error_ = SDIO_Error_Type::OK;
|
||||
current_state_ = Operational_State::BUSY;
|
||||
@@ -340,7 +338,7 @@ SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) {
|
||||
}
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) {
|
||||
auto CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type {
|
||||
// Enable the interrupts
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true);
|
||||
@@ -363,7 +361,7 @@ SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) {
|
||||
// CMD25/CMD24 (WRITE_MULTIPLE_BLOCK/WRITE_BLOCK) send write command
|
||||
Command_Index write_cmd = (count > 1U) ? Command_Index::CMD25 : Command_Index::CMD24;
|
||||
if (send_command_and_check(write_cmd, address, Command_Response::RSP_SHORT,
|
||||
Wait_Type::WT_NONE, [this, cmd = write_cmd]() {
|
||||
Wait_Type::WT_NONE, [this, cmd = write_cmd]() {
|
||||
return get_r1_result(cmd);
|
||||
}) != SDIO_Error_Type::OK) {
|
||||
sdio_.clear_multiple_interrupt_flags(clear_common_flags);
|
||||
@@ -379,16 +377,16 @@ SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) {
|
||||
Block_Size block_size = get_data_block_size_index(total_bytes_);
|
||||
|
||||
sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size,
|
||||
Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true);
|
||||
Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true);
|
||||
|
||||
while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) {
|
||||
while (dma_.get_flag(dma::Status_Flags::FLAG_FTFIF) || dma_.get_flag(dma::Status_Flags::FLAG_ERRIF)) {
|
||||
// Wait for the IRQ handler to clear
|
||||
}
|
||||
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::erase(uint32_t address_start, uint32_t address_end) {
|
||||
auto CardDMA::erase(uint32_t address_start, uint32_t address_end) -> SDIO_Error_Type {
|
||||
SDIO_Error_Type result = SDIO_Error_Type::OK;
|
||||
|
||||
// Card command classes CSD
|
||||
@@ -459,9 +457,11 @@ void CardDMA::handle_interrupts() {
|
||||
disable_all_interrupts();
|
||||
sdio_.set_data_state_machine_enable(false);
|
||||
|
||||
if ((multiblock_) && (!is_rx_)) {
|
||||
if (multiblock_ && !is_rx_) {
|
||||
transfer_error_ = stop_transfer();
|
||||
if (transfer_error_ != SDIO_Error_Type::OK) {}
|
||||
if (transfer_error_ != SDIO_Error_Type::OK) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_rx_) {
|
||||
@@ -497,7 +497,7 @@ void CardDMA::handle_interrupts() {
|
||||
}
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::select_deselect() {
|
||||
auto CardDMA::select_deselect() -> SDIO_Error_Type {
|
||||
// CMD7 (SELECT/DESELECT_CARD)
|
||||
if (send_command_and_check(Command_Index::CMD7, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
|
||||
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD7]() {
|
||||
@@ -508,7 +508,7 @@ SDIO_Error_Type CardDMA::select_deselect() {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) {
|
||||
auto CardDMA::get_card_interface_status(uint32_t* status) -> SDIO_Error_Type {
|
||||
if (status == nullptr) return SDIO_Error_Type::INVALID_PARAMETER;
|
||||
|
||||
// CMD13 (SEND_STATUS)
|
||||
@@ -524,7 +524,7 @@ SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_sdcard_status(uint32_t* status) {
|
||||
auto CardDMA::get_sdcard_status(uint32_t* status) -> SDIO_Error_Type {
|
||||
uint32_t count = 0U;
|
||||
|
||||
// CMD16 (SET_BLOCKLEN)
|
||||
@@ -599,7 +599,7 @@ void CardDMA::check_dma_complete() {
|
||||
}
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::stop_transfer() {
|
||||
auto CardDMA::stop_transfer() -> SDIO_Error_Type {
|
||||
// CMD12 (STOP_TRANSMISSION)
|
||||
if (send_command_and_check(Command_Index::CMD12, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD12]() {
|
||||
return get_r1_result(cmd);
|
||||
@@ -609,7 +609,7 @@ SDIO_Error_Type CardDMA::stop_transfer() {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
Transfer_State CardDMA::get_transfer_state() {
|
||||
auto CardDMA::get_transfer_state() -> Transfer_State {
|
||||
Transfer_State transfer_state = Transfer_State::IDLE;
|
||||
if (sdio_.get_flag(Status_Flags::FLAG_TXRUN) | sdio_.get_flag(Status_Flags::FLAG_RXRUN)) {
|
||||
transfer_state = Transfer_State::BUSY;
|
||||
@@ -618,7 +618,7 @@ Transfer_State CardDMA::get_transfer_state() {
|
||||
return transfer_state;
|
||||
}
|
||||
|
||||
uint32_t CardDMA::get_card_capacity() const {
|
||||
[[nodiscard]] auto CardDMA::get_card_capacity() const -> uint32_t {
|
||||
auto extract_bits = [](uint32_t value, uint8_t start_bit, uint8_t length) -> uint32_t {
|
||||
return (value >> start_bit) & ((1U << length) - 1U);
|
||||
};
|
||||
@@ -665,7 +665,7 @@ uint32_t CardDMA::get_card_capacity() const {
|
||||
return capacity;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) {
|
||||
auto CardDMA::get_card_specific_data(Card_Info* info) -> SDIO_Error_Type {
|
||||
if (info == nullptr) return SDIO_Error_Type::INVALID_PARAMETER;
|
||||
|
||||
// Store basic card information
|
||||
@@ -735,28 +735,20 @@ SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
constexpr Block_Size CardDMA::get_data_block_size_index(uint16_t size) {
|
||||
switch (size) {
|
||||
case 1: return Block_Size::BYTES_1;
|
||||
case 2: return Block_Size::BYTES_2;
|
||||
case 4: return Block_Size::BYTES_4;
|
||||
case 8: return Block_Size::BYTES_8;
|
||||
case 16: return Block_Size::BYTES_16;
|
||||
case 32: return Block_Size::BYTES_32;
|
||||
case 64: return Block_Size::BYTES_64;
|
||||
case 128: return Block_Size::BYTES_128;
|
||||
case 256: return Block_Size::BYTES_256;
|
||||
case 512: return Block_Size::BYTES_512;
|
||||
case 1024: return Block_Size::BYTES_1024;
|
||||
case 2048: return Block_Size::BYTES_2048;
|
||||
case 4096: return Block_Size::BYTES_4096;
|
||||
case 8192: return Block_Size::BYTES_8192;
|
||||
case 16384: return Block_Size::BYTES_16384;
|
||||
default: return Block_Size::BYTES_1;
|
||||
}
|
||||
constexpr auto CardDMA::get_data_block_size_index(uint16_t size) -> Block_Size {
|
||||
if (size < 1 || size > 16384) return Block_Size::BYTES_1;
|
||||
|
||||
// Check if size is a power of two
|
||||
if ((size & (size - 1)) != 0) return Block_Size::BYTES_1;
|
||||
|
||||
// Count trailing zeros to find the index
|
||||
uint16_t index = 0;
|
||||
while ((size >>= 1) != 0) ++index;
|
||||
|
||||
return static_cast<Block_Size>(index);
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) {
|
||||
auto CardDMA::get_card_state(Card_State* card_state) -> SDIO_Error_Type {
|
||||
// CMD13 (SEND_STATUS)
|
||||
if (send_command_and_check(Command_Index::CMD13, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
|
||||
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() {
|
||||
@@ -773,7 +765,7 @@ SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) {
|
||||
|
||||
if (response & All_R1_Error_Bits) {
|
||||
for (const auto& entry : errorTableR1) {
|
||||
if (response & entry.mask) {
|
||||
if (TEST(response, entry.bit_position)) {
|
||||
return entry.errorType;
|
||||
}
|
||||
}
|
||||
@@ -783,23 +775,28 @@ SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_command_sent_result() {
|
||||
volatile uint32_t timeout = 0x00FFFFFFU;
|
||||
auto CardDMA::get_command_sent_result() -> SDIO_Error_Type {
|
||||
constexpr uint32_t MAX_TIMEOUT = 0x00FFFFFFU;
|
||||
uint32_t timeout = MAX_TIMEOUT;
|
||||
|
||||
while ((sdio_.get_flag(Status_Flags::FLAG_CMDSEND) == false) && (timeout != 0U)) {
|
||||
timeout = timeout - 1U;
|
||||
// Wait for command sent flag or timeout
|
||||
while (!sdio_.get_flag(Status_Flags::FLAG_CMDSEND) && timeout) {
|
||||
--timeout;
|
||||
}
|
||||
if (timeout == 0U) return SDIO_Error_Type::RESPONSE_TIMEOUT;
|
||||
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
|
||||
|
||||
// Check if timeout occurred
|
||||
if (timeout == 0U) {
|
||||
return SDIO_Error_Type::RESPONSE_TIMEOUT;
|
||||
}
|
||||
|
||||
// Clear command flags and return success
|
||||
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) {
|
||||
auto CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) -> SDIO_Error_Type {
|
||||
// Wait until one of the relevant flags is set
|
||||
bool flag_set = sdio_.wait_cmd_flags();
|
||||
|
||||
if (!flag_set) {
|
||||
if (!sdio_.wait_cmd_flags()) {
|
||||
return SDIO_Error_Type::RESPONSE_TIMEOUT;
|
||||
}
|
||||
|
||||
@@ -810,56 +807,55 @@ SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index
|
||||
// If cmd was received, check the index
|
||||
// Responses that dont do an index check will send an invalid cmd index
|
||||
if (check_index && (index != Command_Index::INVALID)) {
|
||||
uint8_t idx = sdio_.get_command_index();
|
||||
if (idx != static_cast<uint8_t>(index)) {
|
||||
uint8_t received_idx = sdio_.get_command_index();
|
||||
if (received_idx != static_cast<uint8_t>(index)) {
|
||||
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
|
||||
return SDIO_Error_Type::ILLEGAL_COMMAND;
|
||||
}
|
||||
}
|
||||
// Clear all flags before returning
|
||||
|
||||
// Command received successfully
|
||||
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
// Timeout check
|
||||
// Check for timeout
|
||||
if (sdio_.get_flag(Status_Flags::FLAG_CMDTMOUT)) {
|
||||
sdio_.clear_flag(Clear_Flags::FLAG_CMDTMOUTC);
|
||||
return SDIO_Error_Type::RESPONSE_TIMEOUT;
|
||||
}
|
||||
|
||||
// CRC check
|
||||
if (!ignore_crc) {
|
||||
if (sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) {
|
||||
sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC);
|
||||
return SDIO_Error_Type::COMMAND_CRC_ERROR;
|
||||
}
|
||||
// Check for CRC error if not ignored
|
||||
if (!ignore_crc && sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) {
|
||||
sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC);
|
||||
return SDIO_Error_Type::COMMAND_CRC_ERROR;
|
||||
}
|
||||
|
||||
// Responses that dont do an index check will send an invalid cmd index
|
||||
// Final index check (redundant with the first check, but keeping for safety)
|
||||
// This code path should rarely be taken due to the earlier checks
|
||||
if (check_index && (index != Command_Index::INVALID)) {
|
||||
uint8_t idx = sdio_.get_command_index();
|
||||
if (idx != static_cast<uint8_t>(index)) {
|
||||
uint8_t received_idx = sdio_.get_command_index();
|
||||
if (received_idx != static_cast<uint8_t>(index)) {
|
||||
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
|
||||
return SDIO_Error_Type::ILLEGAL_COMMAND;
|
||||
}
|
||||
}
|
||||
|
||||
// Clear all flags before returning
|
||||
// Clear all flags and return success
|
||||
sdio_.clear_multiple_interrupt_flags(clear_command_flags);
|
||||
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) {
|
||||
auto CardDMA::get_r1_result(Command_Index index) -> SDIO_Error_Type {
|
||||
SDIO_Error_Type result = check_sdio_status(index, true, false);
|
||||
if (result != SDIO_Error_Type::OK) {
|
||||
return result;
|
||||
}
|
||||
if (result != SDIO_Error_Type::OK) return result;
|
||||
|
||||
// Get the R1 response and check for errors
|
||||
uint32_t response = sdio_.get_response(Response_Type::RESPONSE0);
|
||||
|
||||
if (response & All_R1_Error_Bits) {
|
||||
for (const auto& entry : errorTableR1) {
|
||||
if (response & entry.mask) {
|
||||
if (TEST(response, entry.bit_position)) {
|
||||
return entry.errorType;
|
||||
}
|
||||
}
|
||||
@@ -869,7 +865,7 @@ SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) {
|
||||
auto CardDMA::get_r6_result(Command_Index index, uint16_t* rca) -> SDIO_Error_Type {
|
||||
SDIO_Error_Type result = check_sdio_status(index, true, false);
|
||||
if (result != SDIO_Error_Type::OK) return result;
|
||||
|
||||
@@ -877,7 +873,7 @@ SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) {
|
||||
|
||||
if (response & R6_Error_Bits) {
|
||||
for (const auto& entry : errorTableR6) {
|
||||
if (response & entry.mask) {
|
||||
if (TEST(response, entry.bit_position)) {
|
||||
return entry.errorType;
|
||||
}
|
||||
}
|
||||
@@ -888,18 +884,13 @@ SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) {
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_r7_result() {
|
||||
return check_sdio_status(Command_Index::INVALID, false, false);
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
|
||||
auto CardDMA::get_scr(uint16_t rca, uint32_t* scr) -> SDIO_Error_Type {
|
||||
uint32_t temp_scr[2] = {0U, 0U};
|
||||
uint32_t index_scr = 0U;
|
||||
uint32_t* src_data = scr;
|
||||
|
||||
// CMD16 (SET_BLOCKLEN)
|
||||
if (send_command_and_check(Command_Index::CMD16, 8U, Command_Response::RSP_SHORT,
|
||||
Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() {
|
||||
Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() {
|
||||
return get_r1_result(cmd);
|
||||
}) != SDIO_Error_Type::OK) {
|
||||
return SDIO_Error_Type::CMD16_FAILED;
|
||||
@@ -907,7 +898,7 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
|
||||
|
||||
// CMD55 (APP_CMD)
|
||||
if (send_command_and_check(Command_Index::CMD55, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
|
||||
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() {
|
||||
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() {
|
||||
return get_r1_result(cmd);
|
||||
}) != SDIO_Error_Type::OK) {
|
||||
return SDIO_Error_Type::CMD55_FAILED;
|
||||
@@ -919,7 +910,7 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
|
||||
|
||||
// ACMD51 (SEND_SCR)
|
||||
if (send_command_and_check(Command_Index::ACMD51, 0U, Command_Response::RSP_SHORT,
|
||||
Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() {
|
||||
Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() {
|
||||
return get_r1_result(cmd);
|
||||
}) != SDIO_Error_Type::OK) {
|
||||
return SDIO_Error_Type::ACMD51_FAILED;
|
||||
@@ -928,36 +919,41 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
|
||||
// Store SCR
|
||||
while (!sdio_.check_scr_flags()) {
|
||||
if (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) {
|
||||
*(temp_scr + index_scr) = sdio_.read_fifo_word();
|
||||
++index_scr;
|
||||
temp_scr[index_scr++] = sdio_.read_fifo_word();
|
||||
}
|
||||
}
|
||||
|
||||
// Check for errors
|
||||
if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) {
|
||||
sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC);
|
||||
return SDIO_Error_Type::DATA_TIMEOUT;
|
||||
} else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) {
|
||||
}
|
||||
else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) {
|
||||
sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC);
|
||||
return SDIO_Error_Type::DATA_CRC_ERROR;
|
||||
} else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) {
|
||||
}
|
||||
else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) {
|
||||
sdio_.clear_flag(Clear_Flags::FLAG_RXOREC);
|
||||
return SDIO_Error_Type::RX_FIFO_OVERRUN;
|
||||
}
|
||||
|
||||
sdio_.clear_multiple_interrupt_flags(clear_data_flags);
|
||||
|
||||
constexpr uint32_t Zero_Seven = (0xFFU << 0U);
|
||||
constexpr uint32_t Eight_Fifteen = (0xFFU << 8U);
|
||||
constexpr uint32_t Sixteen_Twentythree = (0xFFU << 16U);
|
||||
constexpr uint32_t TwentyFour_Thirtyone = (0xFFU << 24U);
|
||||
constexpr uint32_t BYTE0_MASK = 0xFFU;
|
||||
constexpr uint32_t BYTE1_MASK = 0xFF00U;
|
||||
constexpr uint32_t BYTE2_MASK = 0xFF0000U;
|
||||
constexpr uint32_t BYTE3_MASK = 0xFF000000U;
|
||||
|
||||
// adjust SCR value
|
||||
*src_data = ((temp_scr[1] & Zero_Seven) << 24U) | ((temp_scr[1] & Eight_Fifteen) << 8U) |
|
||||
((temp_scr[1] & Sixteen_Twentythree) >> 8U) | ((temp_scr[1] & TwentyFour_Thirtyone) >> 24U);
|
||||
// Byte-swap the SCR values (convert from big-endian to little-endian)
|
||||
scr[0] = ((temp_scr[1] & BYTE0_MASK) << 24) |
|
||||
((temp_scr[1] & BYTE1_MASK) << 8) |
|
||||
((temp_scr[1] & BYTE2_MASK) >> 8) |
|
||||
((temp_scr[1] & BYTE3_MASK) >> 24);
|
||||
|
||||
src_data = src_data + 1U;
|
||||
*src_data = ((temp_scr[0] & Zero_Seven) << 24U) | ((temp_scr[0] & Eight_Fifteen) << 8U) |
|
||||
((temp_scr[0] & Sixteen_Twentythree) >> 8U) | ((temp_scr[0] & TwentyFour_Thirtyone) >> 24U);
|
||||
scr[1] = ((temp_scr[0] & BYTE0_MASK) << 24) |
|
||||
((temp_scr[0] & BYTE1_MASK) << 8) |
|
||||
((temp_scr[0] & BYTE2_MASK) >> 8) |
|
||||
((temp_scr[0] & BYTE3_MASK) >> 24);
|
||||
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
@@ -965,23 +961,22 @@ SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) {
|
||||
// DMA for rx/tx is always DMA1 channel 3
|
||||
void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) {
|
||||
constexpr uint32_t flag_bits = (1U << static_cast<uint32_t>(dma::INTF_Bits::GIF3));
|
||||
|
||||
dma_.clear_flags(flag_bits);
|
||||
|
||||
// Disable and reset DMA
|
||||
dma_.set_channel_enable(false);
|
||||
dma_.clear_channel();
|
||||
|
||||
dma_.init({
|
||||
count,
|
||||
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(buf)),
|
||||
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(sdio_.reg_address(SDIO_Regs::FIFO))),
|
||||
dma::Bit_Width::WIDTH_32BIT,
|
||||
dma::Bit_Width::WIDTH_32BIT,
|
||||
dma::Increase_Mode::INCREASE_DISABLE,
|
||||
dma::Increase_Mode::INCREASE_ENABLE,
|
||||
dma::Channel_Priority::MEDIUM_PRIORITY,
|
||||
is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M
|
||||
dma_.init(dma::DMA_Config{
|
||||
.count = count,
|
||||
.memory_address = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(buf)),
|
||||
.peripheral_address = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(sdio_.reg_address(SDIO_Regs::FIFO))),
|
||||
.peripheral_bit_width = dma::Bit_Width::WIDTH_32BIT,
|
||||
.memory_bit_width = dma::Bit_Width::WIDTH_32BIT,
|
||||
.peripheral_increase = dma::Increase_Mode::INCREASE_DISABLE,
|
||||
.memory_increase = dma::Increase_Mode::INCREASE_ENABLE,
|
||||
.channel_priority = dma::Channel_Priority::MEDIUM_PRIORITY,
|
||||
.direction = is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M
|
||||
});
|
||||
|
||||
dma_.set_memory_to_memory_enable(false);
|
||||
@@ -995,24 +990,29 @@ void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) {
|
||||
dma_.set_channel_enable(true);
|
||||
}
|
||||
|
||||
SDIO_Error_Type CardDMA::wait_for_card_ready() {
|
||||
volatile uint32_t timeout = 0x00FFFFFFU;
|
||||
auto CardDMA::wait_for_card_ready() -> SDIO_Error_Type {
|
||||
constexpr uint32_t MAX_TIMEOUT = 0x00FFFFFFU;
|
||||
uint32_t timeout = MAX_TIMEOUT;
|
||||
uint32_t response = sdio_.get_response(Response_Type::RESPONSE0);
|
||||
|
||||
while (((response & static_cast<uint32_t>(R1_Status::READY_FOR_DATA)) == 0U) && (timeout != 0U)) {
|
||||
// Continue to send CMD13 to poll the state of card until buffer empty or timeout
|
||||
timeout = timeout - 1U;
|
||||
// Poll until card is ready for data or timeout occurs
|
||||
while (((response & static_cast<uint32_t>(R1_Status::READY_FOR_DATA)) == 0U) && timeout) {
|
||||
--timeout;
|
||||
|
||||
// CMD13 (SEND_STATUS)
|
||||
if (send_command_and_check(Command_Index::CMD13, static_cast<uint32_t>(sdcard_rca_ << RCA_Shift),
|
||||
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() {
|
||||
Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() {
|
||||
return get_r1_result(cmd);
|
||||
}) != SDIO_Error_Type::OK) {
|
||||
return SDIO_Error_Type::CMD13_FAILED;
|
||||
}
|
||||
|
||||
// Get updated response
|
||||
response = sdio_.get_response(Response_Type::RESPONSE0);
|
||||
}
|
||||
|
||||
return (timeout == 0U) ? SDIO_Error_Type::ERROR : SDIO_Error_Type::OK;
|
||||
// Return error if timeout occurred, otherwise success
|
||||
return timeout ? SDIO_Error_Type::OK : SDIO_Error_Type::ERROR;
|
||||
}
|
||||
|
||||
} // namespace sdio
|
||||
|
||||
@@ -26,76 +26,82 @@ class DMA;
|
||||
|
||||
class CardDMA {
|
||||
public:
|
||||
static CardDMA& get_instance();
|
||||
static auto get_instance() -> CardDMA&;
|
||||
|
||||
SDIO_Error_Type init();
|
||||
SDIO_Error_Type card_init();
|
||||
SDIO_Error_Type begin_startup_procedure();
|
||||
// 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
|
||||
SDIO_Error_Type set_hardware_bus_width(Bus_Width width);
|
||||
// Main read/write functions for single and multiblock transfers
|
||||
SDIO_Error_Type read(uint8_t* buf, uint32_t address, uint32_t count);
|
||||
SDIO_Error_Type write(uint8_t* buf, uint32_t address, uint32_t count);
|
||||
// DMA transfers
|
||||
// Other card functions
|
||||
SDIO_Error_Type erase(uint32_t address_start, uint32_t address_end);
|
||||
// Interrupt handler
|
||||
void handle_interrupts();
|
||||
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
|
||||
SDIO_Error_Type select_deselect();
|
||||
auto select_deselect() -> SDIO_Error_Type;
|
||||
|
||||
SDIO_Error_Type get_card_interface_status(uint32_t* status);
|
||||
SDIO_Error_Type get_sdcard_status(uint32_t* status);
|
||||
// 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;
|
||||
|
||||
void check_dma_complete();
|
||||
SDIO_Error_Type stop_transfer();
|
||||
|
||||
Transfer_State get_transfer_state();
|
||||
uint32_t get_card_capacity() const;
|
||||
|
||||
SDIO_Error_Type send_bus_width_command(uint32_t width_value);
|
||||
|
||||
SDIO_Error_Type get_card_specific_data(Card_Info* info);
|
||||
constexpr Block_Size get_data_block_size_index(uint16_t size);
|
||||
|
||||
SDIO_Error_Type get_card_state(Card_State* card_state);
|
||||
SDIO_Error_Type check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false);
|
||||
|
||||
// DMA configuration
|
||||
// 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); }
|
||||
|
||||
// Varaible stored parameters
|
||||
SDIO_Error_Type get_scr(uint16_t rca, uint32_t* scr);
|
||||
SDIO_Error_Type store_cid();
|
||||
SDIO_Error_Type store_csd();
|
||||
// Interrupt handler
|
||||
void handle_interrupts();
|
||||
|
||||
// Accessor methods
|
||||
SDIO_Config& get_config() { return config_; }
|
||||
dma::DMA& get_dma_instance() { return dma_; }
|
||||
// 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); }
|
||||
bool get_is_sdio_rx() { return is_rx_; }
|
||||
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); }
|
||||
Operational_State get_state() { return current_state_; }
|
||||
auto get_state() -> Operational_State { return current_state_; }
|
||||
void set_state(Operational_State state) { current_state_ = state; }
|
||||
void set_transfer_end(bool value) { transfer_end_ = value; }
|
||||
void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; }
|
||||
void set_transfer_end(bool end) { transfer_end_ = end; };
|
||||
|
||||
inline SDIO_Error_Type set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) {
|
||||
sdio_.init({
|
||||
desired_clock,
|
||||
Clock_Edge::RISING_EDGE,
|
||||
wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT,
|
||||
false,
|
||||
low_power,
|
||||
false
|
||||
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;
|
||||
|
||||
@@ -107,19 +113,17 @@ private:
|
||||
|
||||
// Prevent copying or assigning
|
||||
CardDMA(const CardDMA&) = delete;
|
||||
CardDMA& operator=(const CardDMA&) = delete;
|
||||
auto operator=(const CardDMA&) -> CardDMA& = delete;
|
||||
|
||||
// Helper function
|
||||
SDIO_Error_Type wait_for_card_ready();
|
||||
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 stop_condition_;
|
||||
uint32_t total_bytes_;
|
||||
uint32_t count_;
|
||||
SDIO& sdio_;
|
||||
SDIO_Config& config_;
|
||||
const dma::DMA_Base dmaBase_;
|
||||
@@ -129,66 +133,70 @@ private:
|
||||
SDIO_Error_Type transfer_error_;
|
||||
Interface_Version interface_version_;
|
||||
Card_Type card_type_;
|
||||
volatile bool transfer_end_;
|
||||
volatile bool is_rx_;
|
||||
volatile bool multiblock_;
|
||||
volatile Operational_State current_state_;
|
||||
Operational_State current_state_;
|
||||
bool transfer_end_;
|
||||
bool multiblock_;
|
||||
bool is_rx_;
|
||||
|
||||
// Private helper methods
|
||||
SDIO_Error_Type validate_voltage();
|
||||
SDIO_Error_Type get_r1_result(Command_Index index);
|
||||
//SDIO_Error_Type get_r2_r3_result();
|
||||
SDIO_Error_Type get_r6_result(Command_Index index, uint16_t* rca);
|
||||
SDIO_Error_Type get_r7_result();
|
||||
//SDIO_Error_Type get_r1_error_type(uint32_t response);
|
||||
SDIO_Error_Type get_command_sent_result();
|
||||
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); }
|
||||
|
||||
inline void sync_domains() {
|
||||
delayMicroseconds(8);
|
||||
}
|
||||
|
||||
inline bool validate_transfer_params(uint32_t* buf, uint16_t size) {
|
||||
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
|
||||
if ((size == 0U) || (size > 2048U) || (size & (size - 1U))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return size > 0U && size <= 2048U && !(size & (size - 1U));
|
||||
}
|
||||
|
||||
void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
|
||||
info->csd.device_size = (static_cast<uint32_t>(csd_bytes[6] & 0x03U) << 10U) |
|
||||
(static_cast<uint32_t>(csd_bytes[7]) << 2U) |
|
||||
(static_cast<uint32_t>((csd_bytes[8] & 0xC0U) >> 6U));
|
||||
info->csd.device_size_multiplier = static_cast<uint8_t>((csd_bytes[9] & 0x03U) << 1U |
|
||||
(csd_bytes[10] & 0x80U) >> 7U);
|
||||
const uint32_t device_size = ((csd_bytes[6] & 0x3U) << 10) |
|
||||
(csd_bytes[7] << 2) |
|
||||
((csd_bytes[8] >> 6) & 0x3U);
|
||||
|
||||
info->block_size = static_cast<uint32_t>(1 << info->csd.read_block_length);
|
||||
info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) *
|
||||
(1U << (info->csd.device_size_multiplier + 2U)) *
|
||||
info->block_size);
|
||||
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) << 16U) |
|
||||
static_cast<uint32_t>((csd_bytes[8]) << 8U) |
|
||||
static_cast<uint32_t>(csd_bytes[9]);
|
||||
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);
|
||||
BLOCK_SIZE * KILOBYTE);
|
||||
}
|
||||
|
||||
void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) {
|
||||
info->csd.sector_size = static_cast<uint8_t>(((csd_bytes[9] & 0x3FU) << 1U) |
|
||||
(csd_bytes[10] & 0x80U) >> 7U);
|
||||
info->csd.speed_factor = static_cast<uint8_t>((csd_bytes[11] & 0x1CU) >> 2U);
|
||||
info->csd.write_block_length = static_cast<uint8_t>(((csd_bytes[11] & 0x03U) << 2U) |
|
||||
((csd_bytes[12] & 0xC0U) >> 6U));
|
||||
info->csd.checksum = static_cast<uint8_t>((csd_bytes[15] & 0xFEU) >> 1U);
|
||||
// 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);
|
||||
}
|
||||
|
||||
inline void disable_all_interrupts() {
|
||||
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);
|
||||
@@ -200,8 +208,8 @@ private:
|
||||
}
|
||||
|
||||
template <typename CheckFunc>
|
||||
inline SDIO_Error_Type send_command_and_check(Command_Index command, uint32_t argument,
|
||||
Command_Response response, Wait_Type type, CheckFunc check_result) {
|
||||
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);
|
||||
|
||||
@@ -47,7 +47,7 @@ inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES;
|
||||
|
||||
Card_State cardState = Card_State::READY;
|
||||
|
||||
bool SDIO_SetBusWidth(Bus_Width width) {
|
||||
auto SDIO_SetBusWidth(Bus_Width width) -> bool {
|
||||
return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,5 +32,5 @@
|
||||
#define SDIO_CMD_PIN PD2
|
||||
|
||||
void sdio_mfl_init();
|
||||
bool SDIO_SetBusWidth(sdio::Bus_Width width);
|
||||
auto SDIO_SetBusWidth(sdio::Bus_Width width) -> bool;
|
||||
void DMA1_IRQHandler(dma::DMA_Channel channel);
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
#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) / 1000)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP)
|
||||
#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)
|
||||
|
||||
@@ -92,7 +92,9 @@ bool is_temp_timer_initialized = false;
|
||||
|
||||
// Retrieves the clock frequency of the stepper timer
|
||||
uint32_t GetStepperTimerClkFreq() {
|
||||
return Step_Timer.getTimerClockFrequency();
|
||||
// Cache result
|
||||
static uint32_t clkFreq = Step_Timer.getTimerClockFrequency();
|
||||
return clkFreq;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -191,10 +193,12 @@ void SetTimerInterruptPriorities() {
|
||||
// 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,
|
||||
@@ -205,6 +209,9 @@ enum TimerPurpose {
|
||||
// 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
|
||||
|
||||
@@ -29,10 +29,6 @@
|
||||
// Defines
|
||||
// ------------------------
|
||||
|
||||
// Timer configuration constants
|
||||
#define STEPPER_TIMER_RATE 2000000
|
||||
#define TEMP_TIMER_FREQUENCY 1000
|
||||
|
||||
// Timer instance definitions
|
||||
#define MF_TIMER_STEP 3
|
||||
#define MF_TIMER_TEMP 1
|
||||
@@ -43,12 +39,17 @@
|
||||
|
||||
extern uint32_t GetStepperTimerClkFreq();
|
||||
|
||||
// Timer configuration constants
|
||||
#define STEPPER_TIMER_RATE 2000000
|
||||
#define TEMP_TIMER_FREQUENCY 1000
|
||||
|
||||
// Timer prescaler calculations
|
||||
#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
||||
#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // (MHz) Stepper Timer ticks per µs
|
||||
|
||||
#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
|
||||
|
||||
// Timer interrupt priorities
|
||||
#define STEP_TIMER_IRQ_PRIORITY 2
|
||||
@@ -57,7 +58,7 @@ extern uint32_t GetStepperTimerClkFreq();
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
|
||||
extern void Step_Handler();
|
||||
@@ -89,7 +90,7 @@ static inline constexpr struct {timer::TIMER_Base base; uint8_t timer_number;} b
|
||||
};
|
||||
|
||||
// Converts a timer base to an integer timer index.
|
||||
constexpr int timer_base_to_index(timer::TIMER_Base base) {
|
||||
constexpr auto timer_base_to_index(timer::TIMER_Base base) -> int {
|
||||
for (const auto& timer : base_to_index) {
|
||||
if (timer.base == base) {
|
||||
return static_cast<int>(timer.timer_number);
|
||||
@@ -131,7 +132,7 @@ FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_number)
|
||||
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const hal_timer_t value) {
|
||||
if (!HAL_timer_initialized(timer_number)) return;
|
||||
|
||||
const uint32_t new_value = static_cast<uint32_t>(value + 1U);
|
||||
const auto new_value = static_cast<uint32_t>(value + 1U);
|
||||
GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer;
|
||||
|
||||
if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) {
|
||||
@@ -141,5 +142,5 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const
|
||||
}
|
||||
}
|
||||
|
||||
#define HAL_timer_isr_prologue(T) NOOP
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms);
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask();
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -37,9 +37,9 @@ public:
|
||||
MarlinServo();
|
||||
|
||||
/**
|
||||
* @brief attach the pin to the servo, set pin mode, return channel number
|
||||
* @param pin pin to attach to
|
||||
* @return channel number, -1 if failed
|
||||
* @brief attach the pin to the servo, set pin mode, return channel number
|
||||
* @param pin pin to attach to
|
||||
* @return channel number, -1 if failed
|
||||
*/
|
||||
int8_t attach(const pin_t apin);
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ void eeprom_init() {
|
||||
|
||||
void eeprom_write_byte(uint8_t *pos, unsigned char value) {
|
||||
const unsigned eeprom_address = (unsigned)pos;
|
||||
return BL24CXX::writeOneByte(eeprom_address, value);
|
||||
BL24CXX::writeOneByte(eeprom_address, value);
|
||||
}
|
||||
|
||||
uint8_t eeprom_read_byte(uint8_t *pos) {
|
||||
|
||||
@@ -53,7 +53,7 @@ bool PersistentStore::access_start() {
|
||||
int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE);
|
||||
if (bytes_read < 0) return false;
|
||||
|
||||
for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++)
|
||||
for (; bytes_read < long(MARLIN_EEPROM_SIZE); bytes_read++)
|
||||
HAL_eeprom_data[bytes_read] = 0xFF;
|
||||
|
||||
file.close();
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
#error "POSTMORTEM_DEBUGGING requires CORE_DISABLE_FAULT_HANDLER to be set."
|
||||
#endif
|
||||
|
||||
#if defined(PANIC_ENABLE)
|
||||
#ifdef PANIC_ENABLE
|
||||
#if defined(PANIC_USART1_TX_PIN) || defined(PANIC_USART2_TX_PIN) || defined(PANIC_USART3_TX_PIN) || defined(PANIC_USART3_TX_PIN)
|
||||
#error "HC32 HAL uses a custom panic handler. Do not define PANIC_USARTx_TX_PIN."
|
||||
#endif
|
||||
|
||||
@@ -171,7 +171,7 @@ void core_hook_sysclock_init() {
|
||||
panic("HRC is not 16 MHz");
|
||||
}
|
||||
|
||||
#if defined(BOARD_XTAL_FREQUENCY)
|
||||
#ifdef BOARD_XTAL_FREQUENCY
|
||||
#warning "No valid XTAL frequency defined, falling back to HRC."
|
||||
#endif
|
||||
|
||||
|
||||
@@ -35,19 +35,19 @@ Timer0 temp_timer(&TIMER02A_config, &Temp_Handler);
|
||||
*/
|
||||
Timer0 step_timer(&TIMER02B_config, &Step_Handler);
|
||||
|
||||
void HAL_timer_start(const timer_channel_t timer_num, const uint32_t frequency) {
|
||||
if (timer_num == TEMP_TIMER_NUM) {
|
||||
void HAL_timer_start(const timer_channel_t timer_ch, const uint32_t frequency) {
|
||||
if (timer_ch == MF_TIMER_TEMP) {
|
||||
CORE_DEBUG_PRINTF("HAL_timer_start: temp timer, f=%ld\n", long(frequency));
|
||||
timer_num->start(frequency, TEMP_TIMER_PRESCALE);
|
||||
timer_num->setCallbackPriority(TEMP_TIMER_PRIORITY);
|
||||
timer_ch->start(frequency, TEMP_TIMER_PRESCALE);
|
||||
timer_ch->setCallbackPriority(TEMP_TIMER_PRIORITY);
|
||||
}
|
||||
else if (timer_num == STEP_TIMER_NUM) {
|
||||
else if (timer_ch == MF_TIMER_STEP) {
|
||||
CORE_DEBUG_PRINTF("HAL_timer_start: step timer, f=%ld\n", long(frequency));
|
||||
timer_num->start(frequency, STEPPER_TIMER_PRESCALE);
|
||||
timer_num->setCallbackPriority(STEP_TIMER_PRIORITY);
|
||||
timer_ch->start(frequency, STEPPER_TIMER_PRESCALE);
|
||||
timer_ch->setCallbackPriority(STEP_TIMER_PRIORITY);
|
||||
}
|
||||
else {
|
||||
CORE_ASSERT_FAIL("HAL_timer_start: invalid timer_num")
|
||||
CORE_ASSERT_FAIL("HAL_timer_start: invalid timer_ch")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
//
|
||||
typedef Timer0 *timer_channel_t;
|
||||
typedef uint16_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFU
|
||||
|
||||
//
|
||||
// Timer instances
|
||||
@@ -49,80 +49,73 @@ extern Timer0 step_timer;
|
||||
* See https://github.com/MarlinFirmware/Marlin/pull/27099 for more information.
|
||||
*
|
||||
* NOTE: If the 'constexpr' requirement is ever lifted, TIMER0_BASE_FREQUENCY could
|
||||
* be used instead. Tho this would probably not make any noticable difference.
|
||||
* be used instead. Tho this would probably not make any noticeable difference.
|
||||
*/
|
||||
#define HAL_TIMER_RATE F_PCLK1
|
||||
|
||||
// Temperature timer
|
||||
#define TEMP_TIMER_NUM (&temp_timer)
|
||||
#define MF_TIMER_TEMP (&temp_timer)
|
||||
#define TEMP_TIMER_PRIORITY DDL_IRQ_PRIORITY_02
|
||||
#define TEMP_TIMER_PRESCALE 16UL // 12.5MHz
|
||||
#define TEMP_TIMER_PRESCALE 16UL // 12.5MHz
|
||||
#define TEMP_TIMER_RATE 1000 // 1kHz
|
||||
#define TEMP_TIMER_FREQUENCY TEMP_TIMER_RATE // 1kHz also
|
||||
|
||||
// Stepper timer
|
||||
#define STEP_TIMER_NUM (&step_timer)
|
||||
#define MF_TIMER_STEP (&step_timer)
|
||||
#define STEP_TIMER_PRIORITY DDL_IRQ_PRIORITY_00 // Top priority, nothing else uses it
|
||||
#define STEPPER_TIMER_PRESCALE 16UL // 12.5MHz
|
||||
#define STEPPER_TIMER_PRESCALE 16UL // 12.5MHz
|
||||
|
||||
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 50MHz / 16 = 3.125MHz
|
||||
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000UL) // Integer 3
|
||||
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // 50MHz / 16 = 3.125MHz
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // Integer 3
|
||||
|
||||
// Pulse timer (== stepper timer)
|
||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||
#define MF_TIMER_PULSE MF_TIMER_STEP
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
|
||||
//
|
||||
// Channel aliases
|
||||
//
|
||||
#define MF_TIMER_TEMP TEMP_TIMER_NUM
|
||||
#define MF_TIMER_STEP STEP_TIMER_NUM
|
||||
#define MF_TIMER_PULSE PULSE_TIMER_NUM
|
||||
|
||||
//
|
||||
// HAL functions
|
||||
//
|
||||
void HAL_timer_start(const timer_channel_t timer_num, const uint32_t frequency);
|
||||
void HAL_timer_start(const timer_channel_t timer_ch, const uint32_t frequency);
|
||||
|
||||
// Inlined since they are somewhat critical
|
||||
#define MARLIN_HAL_TIMER_INLINE_ATTR __attribute__((always_inline)) inline
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_enable_interrupt(const timer_channel_t timer_num) {
|
||||
timer_num->resume();
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_enable_interrupt(const timer_channel_t timer_ch) {
|
||||
timer_ch->resume();
|
||||
}
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_disable_interrupt(const timer_channel_t timer_num) {
|
||||
timer_num->pause();
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_disable_interrupt(const timer_channel_t timer_ch) {
|
||||
timer_ch->pause();
|
||||
}
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR bool HAL_timer_interrupt_enabled(const timer_channel_t timer_num) {
|
||||
return timer_num->isPaused();
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR bool HAL_timer_interrupt_enabled(const timer_channel_t timer_ch) {
|
||||
return timer_ch->isPaused();
|
||||
}
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_set_compare(const timer_channel_t timer_num, const hal_timer_t compare) {
|
||||
timer_num->setCompareValue(compare);
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_set_compare(const timer_channel_t timer_ch, const hal_timer_t compare) {
|
||||
timer_ch->setCompareValue(compare);
|
||||
}
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR hal_timer_t HAL_timer_get_count(const timer_channel_t timer_num) {
|
||||
return timer_num->getCount();
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR hal_timer_t HAL_timer_get_count(const timer_channel_t timer_ch) {
|
||||
return timer_ch->getCount();
|
||||
}
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_isr_prologue(const timer_channel_t timer_num) {
|
||||
timer_num->clearInterruptFlag();
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_isr_prologue(const timer_channel_t timer_ch) {
|
||||
timer_ch->clearInterruptFlag();
|
||||
}
|
||||
|
||||
MARLIN_HAL_TIMER_INLINE_ATTR void HAL_timer_isr_epilogue(const timer_channel_t timer_num) {}
|
||||
inline void HAL_timer_isr_epilogue(const timer_channel_t) {}
|
||||
|
||||
//
|
||||
// HAL function aliases
|
||||
//
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM);
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP);
|
||||
|
||||
//
|
||||
// HAL ISR callbacks
|
||||
@@ -131,8 +124,8 @@ void Step_Handler();
|
||||
void Temp_Handler();
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
#define HAL_STEP_TIMER_ISR() void Step_Handler()
|
||||
#define HAL_STEP_TIMER_ISR() void Step_Handler()
|
||||
#endif
|
||||
#ifndef HAL_TEMP_TIMER_ISR
|
||||
#define HAL_TEMP_TIMER_ISR() void Temp_Handler()
|
||||
#define HAL_TEMP_TIMER_ISR() void Temp_Handler()
|
||||
#endif
|
||||
|
||||
@@ -126,7 +126,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask() {}
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -45,7 +45,7 @@ bool PersistentStore::access_start() {
|
||||
fseek(eeprom_file, 0L, SEEK_END);
|
||||
std::size_t file_size = ftell(eeprom_file);
|
||||
|
||||
if (file_size < MARLIN_EEPROM_SIZE) {
|
||||
if (file_size < long(MARLIN_EEPROM_SIZE)) {
|
||||
memset(buffer + file_size, eeprom_erase_value, MARLIN_EEPROM_SIZE - file_size);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||
|
||||
typedef uint32_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
|
||||
|
||||
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
|
||||
|
||||
@@ -49,21 +49,21 @@ typedef uint32_t hal_timer_t;
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_RATE 1000000
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer ISR (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_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
#define 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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
@@ -93,5 +93,5 @@ void HAL_timer_enable_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);
|
||||
|
||||
#define HAL_timer_isr_prologue(T) NOOP
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -160,7 +160,7 @@ public:
|
||||
static bool watchdog_timed_out() IF_DISABLED(USE_WATCHDOG, { return false; });
|
||||
static void watchdog_clear_timeout_flag() IF_DISABLED(USE_WATCHDOG, {});
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask();
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
|
||||
#include <Servo.h>
|
||||
|
||||
#include "../../MarlinCore.h"
|
||||
|
||||
class libServo: public Servo {
|
||||
public:
|
||||
void move(const int value) {
|
||||
|
||||
@@ -74,7 +74,7 @@ bool PersistentStore::access_start() {
|
||||
|
||||
if (status == CMD_SUCCESS) {
|
||||
// sector is blank so nothing stored yet
|
||||
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EEPROM_ERASE;
|
||||
for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = EEPROM_ERASE;
|
||||
current_slot = EEPROM_SLOTS;
|
||||
}
|
||||
else {
|
||||
@@ -82,7 +82,7 @@ bool PersistentStore::access_start() {
|
||||
current_slot = first_nblank_loc / (MARLIN_EEPROM_SIZE);
|
||||
uint8_t *eeprom_data = SLOT_ADDRESS(EEPROM_SECTOR, current_slot);
|
||||
// load current settings
|
||||
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i];
|
||||
for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = eeprom_data[i];
|
||||
}
|
||||
eeprom_dirty = false;
|
||||
|
||||
|
||||
@@ -29,6 +29,6 @@
|
||||
|
||||
// LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785)
|
||||
// TODO: Which other boards are incompatible?
|
||||
#if defined(MCU_LPC1768) && ENABLED(FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
|
||||
#if ALL(MCU_LPC1768, FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
|
||||
#define PRINTCOUNTER_SYNC
|
||||
#endif
|
||||
|
||||
@@ -57,9 +57,9 @@
|
||||
#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T)
|
||||
|
||||
typedef uint32_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
|
||||
|
||||
#define HAL_TIMER_RATE ((F_CPU) / 4) // frequency of timers peripherals
|
||||
#define HAL_TIMER_RATE ((F_CPU) / 4) // (Hz) Frequency of timers peripherals
|
||||
|
||||
#ifndef MF_TIMER_STEP
|
||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
||||
@@ -74,22 +74,22 @@ typedef uint32_t hal_timer_t;
|
||||
#define MF_TIMER_PWM 3 // Timer Index for PWM
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_RATE 1000000
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_RATE 1000000 // 1MHz
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) 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_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
#define 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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
@@ -171,4 +171,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
||||
}
|
||||
}
|
||||
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
*
|
||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
||||
* resulted in using about about 25% of the CPU's time.
|
||||
* resulted in using about 25% of the CPU's time.
|
||||
*/
|
||||
|
||||
#ifdef TARGET_LPC1768
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
*
|
||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
||||
* resulted in using about about 25% of the CPU's time.
|
||||
* resulted in using about 25% of the CPU's time.
|
||||
*/
|
||||
|
||||
void u8g_SetPinOutput(uint8_t internal_pin_number);
|
||||
|
||||
@@ -54,18 +54,25 @@ if pioutil.is_pio_build():
|
||||
final_drive_name = drive + ':'
|
||||
# print ('disc check: {}'.format(final_drive_name))
|
||||
try:
|
||||
volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
|
||||
volume_info = str(subprocess.check_output('cmd /C vol ' + final_drive_name, stderr=subprocess.STDOUT))
|
||||
except Exception as e:
|
||||
print ('error:{}'.format(e))
|
||||
continue
|
||||
else:
|
||||
if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
|
||||
target_drive_found = True
|
||||
if target_drive in volume_info: # set upload
|
||||
upload_disk = PureWindowsPath(final_drive_name)
|
||||
if target_filename in volume_info:
|
||||
if not target_file_found:
|
||||
target_drive_found = True
|
||||
break
|
||||
try:
|
||||
dir_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
|
||||
except Exception as e:
|
||||
print ('error:{}'.format(e))
|
||||
continue
|
||||
else:
|
||||
if target_filename in dir_info:
|
||||
upload_disk = PureWindowsPath(final_drive_name)
|
||||
target_file_found = True
|
||||
target_file_found = True
|
||||
break
|
||||
|
||||
elif current_OS == 'Linux':
|
||||
#
|
||||
|
||||
@@ -197,7 +197,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask();
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include "../shared/Marduino.h"
|
||||
#include <pinmapping.h>
|
||||
|
||||
#define NO_COMPILE_TIME_PWM
|
||||
|
||||
#define SET_DIR_INPUT(IO) Gpio::setDir(IO, 1)
|
||||
#define SET_DIR_OUTPUT(IO) Gpio::setDir(IO, 0)
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||
|
||||
typedef uint64_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
|
||||
|
||||
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
|
||||
|
||||
@@ -52,22 +52,22 @@ typedef uint64_t hal_timer_t;
|
||||
#endif
|
||||
#define SYSTICK_TIMER_FREQUENCY 1000
|
||||
|
||||
#define TEMP_TIMER_RATE 1000000
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_RATE 1'000'000 // (Hz) Temperature Timer count rate
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR call frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1'000'000) // (MHz) Stepper Timer ticks per µs
|
||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
#define 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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
@@ -88,5 +88,5 @@ void HAL_timer_enable_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);
|
||||
|
||||
#define HAL_timer_isr_prologue(T) NOOP
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
*
|
||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
||||
* resulted in using about about 25% of the CPU's time.
|
||||
* resulted in using about 25% of the CPU's time.
|
||||
*/
|
||||
|
||||
#ifdef __PLAT_NATIVE_SIM__
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
*
|
||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
||||
* resulted in using about about 25% of the CPU's time.
|
||||
* resulted in using about 25% of the CPU's time.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -71,13 +71,13 @@ static uint8_t SPI_speed = 0;
|
||||
|
||||
static uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) {
|
||||
for (uint8_t i = 0; i < 8; i++) {
|
||||
WRITE_PIN(mosi_pin, !!(b & 0x80));
|
||||
WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, LOW, HIGH));
|
||||
DELAY_CYCLES(SPI_SPEED);
|
||||
WRITE_PIN(sck_pin, HIGH);
|
||||
WRITE_PIN(mosi_pin, !!(b & 0x80));
|
||||
DELAY_CYCLES(SPI_SPEED);
|
||||
b <<= 1;
|
||||
if (miso_pin >= 0 && READ_PIN(miso_pin)) b |= 1;
|
||||
WRITE_PIN(sck_pin, LOW);
|
||||
WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, HIGH, LOW));
|
||||
DELAY_CYCLES(SPI_SPEED);
|
||||
}
|
||||
return b;
|
||||
@@ -85,7 +85,7 @@ static uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck
|
||||
|
||||
static uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) {
|
||||
WRITE_PIN(mosi_pin, HIGH);
|
||||
WRITE_PIN(sck_pin, LOW);
|
||||
WRITE_PIN(sck_pin, TERN(U8G_SPI_USE_MODE_3, HIGH, LOW));
|
||||
return spiRate;
|
||||
}
|
||||
|
||||
@@ -93,11 +93,11 @@ static void u8g_com_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
|
||||
static uint8_t rs_last_state = 255;
|
||||
if (rs != rs_last_state) {
|
||||
// Transfer Data (FA) or Command (F8)
|
||||
swSpiTransfer(rs ? 0x0FA : 0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
||||
swSpiTransfer(rs ? 0xFA : 0xF8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
||||
rs_last_state = rs;
|
||||
DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe
|
||||
}
|
||||
swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
||||
swSpiTransfer(val & 0xF0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
||||
swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL);
|
||||
}
|
||||
|
||||
@@ -169,5 +169,32 @@ uint8_t u8g_com_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ENABLED(LIGHTWEIGHT_UI)
|
||||
|
||||
#define ST7920_CS() { WRITE(LCD_PINS_RS, HIGH); }
|
||||
#define ST7920_NCS() { WRITE(LCD_PINS_RS, LOW); }
|
||||
#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); }
|
||||
#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); }
|
||||
#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); }
|
||||
|
||||
#define ST7920_DAT(V) !!((V) & 0x80)
|
||||
|
||||
#define ST7920_SND_BIT(...) do{ \
|
||||
WRITE(LCD_PINS_D4, LOW); \
|
||||
WRITE(LCD_PINS_EN, ST7920_DAT(val)); \
|
||||
WRITE(LCD_PINS_D4, HIGH); \
|
||||
val <<= 1; }while(0);
|
||||
|
||||
void ST7920_SWSPI_SND_8BIT(uint8_t val) {
|
||||
REPEAT(8, ST7920_SND_BIT);
|
||||
}
|
||||
|
||||
void ST7920_cs() { ST7920_CS(); }
|
||||
void ST7920_ncs() { ST7920_NCS(); }
|
||||
void ST7920_set_cmd() { ST7920_SET_CMD(); }
|
||||
void ST7920_set_dat() { ST7920_SET_DAT(); }
|
||||
void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); }
|
||||
#endif // LIGHTWEIGHT_UI
|
||||
|
||||
#endif // IS_U8GLIB_ST7920
|
||||
#endif // __PLAT_NATIVE_SIM__
|
||||
|
||||
@@ -127,7 +127,7 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck
|
||||
static uint8_t SPI_speed = 0;
|
||||
|
||||
static uint8_t swSpiInit(const uint8_t spi_speed, const uint8_t clk_pin, const uint8_t mosi_pin) {
|
||||
return spi_speed;
|
||||
return spi_speed;
|
||||
}
|
||||
|
||||
static void u8g_sw_spi_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) {
|
||||
|
||||
+148
-31
@@ -32,17 +32,123 @@
|
||||
extern "C" {
|
||||
#include "pico/bootrom.h"
|
||||
#include "hardware/watchdog.h"
|
||||
#include "pico/multicore.h"
|
||||
#include "hardware/adc.h"
|
||||
#include "pico/time.h"
|
||||
}
|
||||
|
||||
#if HAS_SD_HOST_DRIVE
|
||||
#include "msc_sd.h"
|
||||
#include "usbd_cdc_if.h"
|
||||
#endif
|
||||
|
||||
// Core 1 watchdog configuration
|
||||
#define CORE1_MAX_RESETS 5 // Maximum number of Core 1 resets before halting system
|
||||
|
||||
// ------------------------
|
||||
// Public Variables
|
||||
// ------------------------
|
||||
|
||||
volatile uint32_t adc_accumulators[5] = {0}; // Accumulators for oversampling (sum of readings)
|
||||
volatile uint8_t adc_counts[5] = {0}; // Count of readings accumulated per channel
|
||||
volatile uint16_t adc_values[5] = {512, 512, 512, 512, 512}; // Final oversampled ADC values (averages) - initialized to mid-range
|
||||
|
||||
// Core 1 watchdog monitoring
|
||||
volatile uint32_t core1_last_heartbeat = 0; // Timestamp of Core 1's last activity
|
||||
volatile bool core1_watchdog_triggered = false; // Flag to indicate Core 1 reset
|
||||
volatile uint8_t core1_reset_count = 0; // Count of Core 1 resets - halt system if >= CORE1_MAX_RESETS
|
||||
volatile uint8_t current_pin;
|
||||
volatile bool MarlinHAL::adc_has_result;
|
||||
volatile uint8_t adc_channels_enabled[5] = {false}; // Track which ADC channels are enabled
|
||||
|
||||
// Helper function for LED blinking patterns
|
||||
void blink_led_pattern(uint8_t blink_count, uint32_t blink_duration_us = 100000) {
|
||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
||||
for (uint8_t i = 0; i < blink_count; i++) {
|
||||
WRITE(LED_PIN, HIGH);
|
||||
busy_wait_us(blink_duration_us);
|
||||
WRITE(LED_PIN, LOW);
|
||||
if (i < blink_count - 1) { // Don't delay after the last blink
|
||||
busy_wait_us(blink_duration_us);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Core 1 ADC reading task - dynamically reads all enabled channels with oversampling
|
||||
void core1_adc_task() {
|
||||
static uint32_t last_led_toggle = 0;
|
||||
const uint8_t OVERSAMPLENR = 16; // Standard Marlin oversampling count
|
||||
|
||||
// Signal successful Core 1 startup/restart
|
||||
SERIAL_ECHO_MSG("Core 1 ADC task started");
|
||||
|
||||
while (true) {
|
||||
// Update heartbeat timestamp at start of each scan cycle
|
||||
core1_last_heartbeat = time_us_32();
|
||||
|
||||
// Scan all enabled ADC channels
|
||||
for (uint8_t channel = 0; channel < 5; channel++) {
|
||||
if (!adc_channels_enabled[channel]) continue;
|
||||
|
||||
// Enable temperature sensor if reading channel 4
|
||||
if (channel == 4) {
|
||||
adc_set_temp_sensor_enabled(true);
|
||||
}
|
||||
|
||||
// Select and read the channel
|
||||
adc_select_input(channel);
|
||||
busy_wait_us(100); // Settling delay
|
||||
adc_fifo_drain();
|
||||
adc_run(true);
|
||||
|
||||
// Wait for conversion with timeout
|
||||
uint32_t timeout = 10000;
|
||||
while (adc_fifo_is_empty() && timeout--) {
|
||||
busy_wait_us(1);
|
||||
}
|
||||
|
||||
adc_run(false);
|
||||
uint16_t reading = adc_fifo_is_empty() ? 0 : adc_fifo_get();
|
||||
|
||||
// Accumulate readings for oversampling
|
||||
adc_accumulators[channel] += reading;
|
||||
adc_counts[channel]++;
|
||||
|
||||
// Update the averaged value with current accumulation (provides immediate valid data)
|
||||
adc_values[channel] = adc_accumulators[channel] / adc_counts[channel];
|
||||
|
||||
// When we reach the full oversampling count, reset accumulator for next cycle
|
||||
if (adc_counts[channel] >= OVERSAMPLENR) {
|
||||
adc_accumulators[channel] = 0;
|
||||
adc_counts[channel] = 0;
|
||||
}
|
||||
|
||||
// Disable temp sensor after reading to save power
|
||||
if (channel == 4) {
|
||||
adc_set_temp_sensor_enabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Core 1 LED indicator: Double blink every 2 seconds to show Core 1 is active
|
||||
uint32_t now = time_us_32();
|
||||
if (now - last_led_toggle >= 2000000) { // 2 seconds
|
||||
last_led_toggle = now;
|
||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
||||
// Triple blink pattern if watchdog was triggered (shows Core 1 was reset)
|
||||
if (core1_watchdog_triggered) {
|
||||
core1_watchdog_triggered = false; // Clear flag
|
||||
blink_led_pattern(3); // Triple blink for watchdog reset
|
||||
} else {
|
||||
blink_led_pattern(2); // Normal double blink
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Delay between full scan cycles
|
||||
busy_wait_us(10000); // 10ms between scans
|
||||
}
|
||||
}
|
||||
|
||||
volatile uint16_t adc_result;
|
||||
|
||||
// ------------------------
|
||||
@@ -56,10 +162,10 @@ 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 int cpuFreq = F_CPU;
|
||||
constexpr unsigned int cpuFreq = F_CPU;
|
||||
UNUSED(cpuFreq);
|
||||
|
||||
#if HAS_MEDIA && DISABLED(SDIO_SUPPORT) && PIN_EXISTS(SD_SS)
|
||||
#if HAS_MEDIA && DISABLED(ONBOARD_SDIO) && PIN_EXISTS(SD_SS)
|
||||
OUT_WRITE(SD_SS_PIN, HIGH); // Try to set SD_SS_PIN inactive before any other SPI users start up
|
||||
#endif
|
||||
|
||||
@@ -112,15 +218,34 @@ void MarlinHAL::reboot() { watchdog_reboot(0, 0, 1); }
|
||||
|
||||
void MarlinHAL::watchdog_init() {
|
||||
#if DISABLED(DISABLE_WATCHDOG_INIT)
|
||||
static_assert(WDT_TIMEOUT_US > 1000, "WDT Timout is too small, aborting");
|
||||
static_assert(WDT_TIMEOUT_US > 1000, "WDT Timeout is too small, aborting");
|
||||
watchdog_enable(WDT_TIMEOUT_US/1000, true);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MarlinHAL::watchdog_refresh() {
|
||||
// If Core 1 has reset CORE1_MAX_RESETS+ times, stop updating watchdog to halt system
|
||||
if (core1_reset_count >= CORE1_MAX_RESETS) {
|
||||
SERIAL_ECHO_MSG("Core 1 reset limit exceeded (", core1_reset_count, " resets) - halting system for safety");
|
||||
return; // Don't update watchdog - system will halt
|
||||
}
|
||||
|
||||
watchdog_update();
|
||||
|
||||
// Check Core 1 watchdog (15 second timeout)
|
||||
uint32_t now = time_us_32();
|
||||
if (now - core1_last_heartbeat > 15000000) { // 15 seconds
|
||||
// Core 1 appears stuck - reset it
|
||||
multicore_reset_core1();
|
||||
multicore_launch_core1(core1_adc_task);
|
||||
core1_watchdog_triggered = true; // Signal for LED indicator
|
||||
core1_reset_count++; // Increment reset counter
|
||||
SERIAL_ECHO_MSG("Core 1 ADC watchdog triggered - resetting Core 1 (attempt ", core1_reset_count, ")");
|
||||
}
|
||||
|
||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
||||
TOGGLE(LED_PIN); // heartbeat indicator
|
||||
// Core 0 LED indicator: Single toggle every watchdog refresh (shows Core 0 activity)
|
||||
TOGGLE(LED_PIN);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -130,43 +255,35 @@ void MarlinHAL::reboot() { watchdog_reboot(0, 0, 1); }
|
||||
// ADC
|
||||
// ------------------------
|
||||
|
||||
volatile bool MarlinHAL::adc_has_result = false;
|
||||
|
||||
void MarlinHAL::adc_init() {
|
||||
analogReadResolution(HAL_ADC_RESOLUTION);
|
||||
::adc_init();
|
||||
adc_fifo_setup(true, false, 1, false, false);
|
||||
irq_set_exclusive_handler(ADC_IRQ_FIFO, adc_exclusive_handler);
|
||||
irq_set_enabled(ADC_IRQ_FIFO, true);
|
||||
adc_irq_set_enabled(true);
|
||||
// Launch Core 1 for continuous ADC reading
|
||||
multicore_launch_core1(core1_adc_task);
|
||||
adc_has_result = true; // Results are always available with continuous sampling
|
||||
}
|
||||
|
||||
void MarlinHAL::adc_enable(const pin_t pin) {
|
||||
if (pin >= A0 && pin <= A3)
|
||||
if (pin >= A0 && pin <= A3) {
|
||||
adc_gpio_init(pin);
|
||||
else if (pin == HAL_ADC_MCU_TEMP_DUMMY_PIN)
|
||||
adc_set_temp_sensor_enabled(true);
|
||||
}
|
||||
|
||||
void MarlinHAL::adc_start(const pin_t pin) {
|
||||
adc_has_result = false;
|
||||
// Select an ADC input. 0...3 are GPIOs 26...29 respectively.
|
||||
adc_select_input(pin == HAL_ADC_MCU_TEMP_DUMMY_PIN ? 4 : pin - A0);
|
||||
adc_run(true);
|
||||
}
|
||||
|
||||
void MarlinHAL::adc_exclusive_handler() {
|
||||
adc_run(false); // Disable since we only want one result
|
||||
irq_clear(ADC_IRQ_FIFO); // Clear the IRQ
|
||||
|
||||
if (adc_fifo_get_level() >= 1) {
|
||||
adc_result = adc_fifo_get(); // Pop the result
|
||||
adc_fifo_drain();
|
||||
adc_has_result = true; // Signal the end of the conversion
|
||||
adc_channels_enabled[pin - A0] = true; // Mark this channel as enabled
|
||||
}
|
||||
else if (pin == HAL_ADC_MCU_TEMP_DUMMY_PIN) {
|
||||
adc_channels_enabled[4] = true; // Mark MCU temp channel as enabled
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t MarlinHAL::adc_value() { return adc_result; }
|
||||
void MarlinHAL::adc_start(const pin_t pin) {
|
||||
// Just store which pin we need to read - values are continuously updated by Core 1
|
||||
current_pin = pin;
|
||||
}
|
||||
|
||||
uint16_t MarlinHAL::adc_value() {
|
||||
// Return the latest ADC value from Core 1's continuous readings
|
||||
const uint8_t channel = (current_pin == HAL_ADC_MCU_TEMP_DUMMY_PIN) ? 4 : (current_pin - A0);
|
||||
return adc_values[channel];
|
||||
}
|
||||
|
||||
// Reset the system to initiate a firmware flash
|
||||
void flashFirmware(const int16_t) { hal.reboot(); }
|
||||
|
||||
@@ -40,6 +40,11 @@
|
||||
#include "msc_sd.h"
|
||||
#endif
|
||||
|
||||
// ADC index 4 is the MCU temperature
|
||||
#define HAL_ADC_MCU_TEMP_DUMMY_PIN 127
|
||||
#define TEMP_SOC_PIN HAL_ADC_MCU_TEMP_DUMMY_PIN // ADC4 is internal temp sensor
|
||||
#include "temp_soc.h"
|
||||
|
||||
//
|
||||
// Serial Ports
|
||||
//
|
||||
@@ -85,8 +90,6 @@ typedef libServo hal_servo_t;
|
||||
#else
|
||||
#define HAL_ADC_RESOLUTION 12
|
||||
#endif
|
||||
// ADC index 4 is the MCU temperature
|
||||
#define HAL_ADC_MCU_TEMP_DUMMY_PIN 127
|
||||
|
||||
//
|
||||
// Pin Mapping for M42, M43, M226
|
||||
@@ -141,7 +144,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask() { TERN_(HAS_SD_HOST_DRIVE, tuh_task()); }
|
||||
|
||||
// Reset
|
||||
@@ -164,9 +167,6 @@ public:
|
||||
// Begin ADC sampling on the given pin. Called from Temperature::isr!
|
||||
static void adc_start(const pin_t pin);
|
||||
|
||||
// This ADC runs a periodic task
|
||||
static void adc_exclusive_handler();
|
||||
|
||||
// Is the ADC ready for reading?
|
||||
static volatile bool adc_has_result;
|
||||
static bool adc_ready() { return adc_has_result; }
|
||||
|
||||
@@ -31,28 +31,48 @@
|
||||
|
||||
// NOTE: The Bigtreetech SKR Pico has an onboard W25Q16 flash module
|
||||
|
||||
// Use EEPROM.h for compatibility, for now.
|
||||
#include <EEPROM.h>
|
||||
// RP2040 Flash-based EEPROM emulation using internal flash memory
|
||||
#include <hardware/flash.h>
|
||||
#include <hardware/sync.h>
|
||||
|
||||
static bool eeprom_data_written = false;
|
||||
// Flash sector size is already defined in hardware/flash.h as FLASH_SECTOR_SIZE
|
||||
// Place EEPROM emulation at the end of flash, before the filesystem
|
||||
// This assumes 2MB flash, adjust if using different flash size
|
||||
#define FLASH_TARGET_OFFSET (PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE)
|
||||
|
||||
#ifndef MARLIN_EEPROM_SIZE
|
||||
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
||||
#endif
|
||||
|
||||
static uint8_t eeprom_buffer[MARLIN_EEPROM_SIZE];
|
||||
static bool eeprom_data_written = false;
|
||||
static bool eeprom_initialized = false;
|
||||
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
||||
|
||||
bool PersistentStore::access_start() {
|
||||
EEPROM.begin(); // Avoid EEPROM.h warning (do nothing)
|
||||
eeprom_buffer_fill();
|
||||
if (!eeprom_initialized) {
|
||||
// Read from flash into buffer
|
||||
const uint8_t *flash_data = (const uint8_t *)(XIP_BASE + FLASH_TARGET_OFFSET);
|
||||
memcpy(eeprom_buffer, flash_data, MARLIN_EEPROM_SIZE);
|
||||
eeprom_initialized = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistentStore::access_finish() {
|
||||
if (eeprom_data_written) {
|
||||
TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT());
|
||||
hal.isr_off();
|
||||
eeprom_buffer_flush();
|
||||
hal.isr_on();
|
||||
|
||||
// Disable interrupts during flash write
|
||||
const uint32_t intstate = save_and_disable_interrupts();
|
||||
|
||||
// Erase and program the sector
|
||||
flash_range_erase(FLASH_TARGET_OFFSET, FLASH_SECTOR_SIZE);
|
||||
flash_range_program(FLASH_TARGET_OFFSET, eeprom_buffer, MARLIN_EEPROM_SIZE);
|
||||
|
||||
// Restore interrupts
|
||||
restore_interrupts(intstate);
|
||||
|
||||
TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT());
|
||||
eeprom_data_written = false;
|
||||
}
|
||||
@@ -62,8 +82,8 @@ bool PersistentStore::access_finish() {
|
||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||
while (size--) {
|
||||
uint8_t v = *value;
|
||||
if (v != eeprom_buffered_read_byte(pos)) {
|
||||
eeprom_buffered_write_byte(pos, v);
|
||||
if (pos < (int)MARLIN_EEPROM_SIZE && v != eeprom_buffer[pos]) {
|
||||
eeprom_buffer[pos] = v;
|
||||
eeprom_data_written = true;
|
||||
}
|
||||
crc16(crc, &v, 1);
|
||||
@@ -75,7 +95,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
||||
|
||||
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_buffered_read_byte(pos);
|
||||
const uint8_t c = (pos < (int)MARLIN_EEPROM_SIZE) ? eeprom_buffer[pos] : 0xFF;
|
||||
if (writing) *value = c;
|
||||
crc16(crc, &c, 1);
|
||||
pos++;
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "HAL.h"
|
||||
|
||||
#ifndef NUM_DIGITAL_PINS
|
||||
#error "Expected NUM_DIGITAL_PINS not found"
|
||||
#error "Expected NUM_DIGITAL_PINS not found."
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -74,6 +74,27 @@
|
||||
* signal. The Arduino pin number is listed by the M43 I command.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Pins Debugging for RP2040
|
||||
*
|
||||
* - 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 NUM_ANALOG_FIRST A0
|
||||
|
||||
#define MODE_PIN_INPUT 0 // Input mode (reset state)
|
||||
@@ -81,66 +102,66 @@
|
||||
#define MODE_PIN_ALT 2 // Alternate function mode
|
||||
#define MODE_PIN_ANALOG 3 // Analog mode
|
||||
|
||||
#define PIN_NUM(P) (P & 0x000F)
|
||||
#define PIN_NUM_ALPHA_LEFT(P) (((P & 0x000F) < 10) ? ('0' + (P & 0x000F)) : '1')
|
||||
#define PIN_NUM_ALPHA_RIGHT(P) (((P & 0x000F) > 9) ? ('0' + (P & 0x000F) - 10) : 0 )
|
||||
#define PORT_NUM(P) ((P >> 4) & 0x0007)
|
||||
#define PORT_ALPHA(P) ('A' + (P >> 4))
|
||||
#define getPinByIndex(x) pin_array[x].pin
|
||||
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||
#define getPinIsDigitalByIndex(x) pin_array[x].is_digital
|
||||
#define digitalPinToAnalogIndex(P) digital_pin_to_analog_pin(P)
|
||||
|
||||
/**
|
||||
* Translation of routines & variables used by pinsDebug.h
|
||||
*/
|
||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
||||
#define VALID_PIN(ANUM) (pin_t(ANUM) >= 0 && pin_t(ANUM) < NUMBER_PINS_TOTAL)
|
||||
#define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads
|
||||
#define PRINT_PIN(Q)
|
||||
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||
#define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine
|
||||
uint8_t get_pin_mode(const pin_t pin) {
|
||||
// Check if pin is in alternate function mode (I2C, SPI, etc.)
|
||||
const uint32_t gpio_func = gpio_get_function(pin);
|
||||
|
||||
// x is a variable used to search pin_array
|
||||
#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital)
|
||||
#define GET_ARRAY_PIN(x) ((pin_t) pin_array[x].pin)
|
||||
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||
#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin
|
||||
|
||||
uint8_t get_pin_mode(const pin_t Ard_num) {
|
||||
|
||||
uint dir = gpio_get_dir( Ard_num);
|
||||
|
||||
if (dir) return MODE_PIN_OUTPUT;
|
||||
else return MODE_PIN_INPUT;
|
||||
// GPIO_FUNC_I2C is typically function 3 on RP2040
|
||||
if ( gpio_func == GPIO_FUNC_I2C
|
||||
|| gpio_func == GPIO_FUNC_SPI
|
||||
|| gpio_func == GPIO_FUNC_UART
|
||||
|| gpio_func == GPIO_FUNC_PWM
|
||||
) {
|
||||
return MODE_PIN_ALT;
|
||||
}
|
||||
|
||||
// For GPIO mode, check direction
|
||||
return gpio_get_dir(pin) ? MODE_PIN_OUTPUT : MODE_PIN_INPUT;
|
||||
}
|
||||
|
||||
bool getValidPinMode(const pin_t Ard_num) {
|
||||
const uint8_t pin_mode = get_pin_mode(Ard_num);
|
||||
bool getValidPinMode(const pin_t pin) {
|
||||
const uint8_t pin_mode = get_pin_mode(pin);
|
||||
return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM
|
||||
}
|
||||
|
||||
int8_t digital_pin_to_analog_pin(pin_t Ard_num) {
|
||||
Ard_num -= NUM_ANALOG_FIRST;
|
||||
return (Ard_num >= 0 && Ard_num < NUM_ANALOG_INPUTS) ? Ard_num : -1;
|
||||
#define isValidPin(P) WITHIN(P, 0, pin_t(NUMBER_PINS_TOTAL - 1))
|
||||
|
||||
int8_t digital_pin_to_analog_pin(pin_t pin) {
|
||||
pin -= NUM_ANALOG_FIRST;
|
||||
return (WITHIN(pin, 0, NUM_ANALOG_INPUTS - 1)) ? pin : -1;
|
||||
}
|
||||
|
||||
bool isAnalogPin(const pin_t Ard_num) {
|
||||
return digital_pin_to_analog_pin(Ard_num) != -1;
|
||||
bool isAnalogPin(const pin_t pin) {
|
||||
return digital_pin_to_analog_pin(pin) != -1;
|
||||
}
|
||||
|
||||
bool is_digital(const pin_t x) {
|
||||
const uint8_t pin_mode = get_pin_mode(x);
|
||||
return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT;
|
||||
#define digitalRead_mod(A) extDigitalRead(A) // must use Arduino pin numbers when doing reads
|
||||
#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 MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin
|
||||
|
||||
//bool is_digital(const pin_t pin) {
|
||||
// const uint8_t pin_mode = get_pin_mode(pin);
|
||||
// return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT;
|
||||
//}
|
||||
|
||||
bool pwm_status(const pin_t pin) {
|
||||
// Check if this pin is configured for PWM
|
||||
return PWM_PIN(pin) && get_pin_mode(pin) == MODE_PIN_ALT;
|
||||
}
|
||||
|
||||
void printPinPort(const pin_t Ard_num) {
|
||||
SERIAL_ECHOPGM("Pin: ");
|
||||
SERIAL_ECHO(Ard_num);
|
||||
}
|
||||
|
||||
bool pwm_status(const pin_t Ard_num) {
|
||||
return get_pin_mode(Ard_num) == MODE_PIN_ALT;
|
||||
}
|
||||
|
||||
void printPinPWM(const pin_t Ard_num) {
|
||||
if (PWM_PIN(Ard_num)) {
|
||||
void printPinPWM(const pin_t pin) {
|
||||
if (pwm_status(pin)) {
|
||||
// RP2040 has hardware PWM on specific pins
|
||||
char buffer[22];
|
||||
sprintf_P(buffer, PSTR("PWM: pin %d "), pin);
|
||||
SERIAL_ECHO(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void printPinPort(const pin_t pin) {}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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
|
||||
|
||||
// RP2040 internal temperature sensor
|
||||
// Formula: T = 27 - (ADC_voltage - 0.706) / 0.001721
|
||||
// ADC_voltage = (RAW / OVERSAMPLENR) * 3.3 / 4096 (RAW is accumulated over OVERSAMPLENR samples)
|
||||
// T = 27 - ((RAW / OVERSAMPLENR) * 3.3 / 4096 - 0.706) / 0.001721
|
||||
// Simplified: T = 437.423 - (RAW / OVERSAMPLENR) * 0.46875
|
||||
|
||||
#define TEMP_SOC_SENSOR(RAW) (437.423f - ((RAW) / OVERSAMPLENR) * 0.46875f)
|
||||
@@ -41,9 +41,9 @@
|
||||
#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T)
|
||||
|
||||
typedef uint64_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFF'FFFF'FFFF'FFFFULL
|
||||
|
||||
#define HAL_TIMER_RATE (1000000ull) // fixed value as we use a microsecond timesource
|
||||
#define HAL_TIMER_RATE (1'000'000ULL) // fixed value as we use a microsecond timesource
|
||||
#ifndef MF_TIMER_STEP
|
||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
||||
#endif
|
||||
@@ -58,21 +58,21 @@ typedef uint64_t hal_timer_t;
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_RATE HAL_TIMER_RATE
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE / 10 // 100khz roughly
|
||||
#define STEPPER_TIMER_TICKS_PER_US (0.1) // fixed value as we use a microsecond timesource
|
||||
#define STEPPER_TIMER_PRESCALE (10)
|
||||
|
||||
#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 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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||
|
||||
#ifndef HAL_STEP_TIMER_ISR
|
||||
@@ -86,10 +86,10 @@ typedef uint64_t hal_timer_t;
|
||||
//#define STEP_TIMER_PTR _HAL_TIMER(MF_TIMER_STEP)
|
||||
//#define TEMP_TIMER_PTR _HAL_TIMER(MF_TIMER_TEMP)
|
||||
|
||||
extern alarm_pool_t* HAL_timer_pool_0;
|
||||
extern alarm_pool_t* HAL_timer_pool_1;
|
||||
extern alarm_pool_t* HAL_timer_pool_2;
|
||||
extern alarm_pool_t* HAL_timer_pool_3;
|
||||
extern alarm_pool_t *HAL_timer_pool_0;
|
||||
extern alarm_pool_t *HAL_timer_pool_1;
|
||||
extern alarm_pool_t *HAL_timer_pool_2;
|
||||
extern alarm_pool_t *HAL_timer_pool_3;
|
||||
|
||||
extern struct repeating_timer HAL_timer_0;
|
||||
|
||||
@@ -120,28 +120,23 @@ void HAL_timer_stop(const uint8_t timer_num);
|
||||
|
||||
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t compare) {
|
||||
|
||||
if (timer_num == MF_TIMER_STEP){
|
||||
if (compare == HAL_TIMER_TYPE_MAX){
|
||||
HAL_timer_stop(timer_num);
|
||||
return;
|
||||
}
|
||||
if (timer_num == MF_TIMER_STEP && compare == HAL_TIMER_TYPE_MAX) {
|
||||
HAL_timer_stop(timer_num);
|
||||
return;
|
||||
}
|
||||
|
||||
compare = compare *10; //Dirty fix, figure out a proper way
|
||||
compare *= 10; // Dirty fix, figure out a proper way
|
||||
|
||||
switch (timer_num) {
|
||||
case 0:
|
||||
alarm_pool_add_alarm_in_us(HAL_timer_pool_0, compare, HAL_timer_alarm_pool_0_callback, 0, false);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
alarm_pool_add_alarm_in_us(HAL_timer_pool_1, compare, HAL_timer_alarm_pool_1_callback, 0, false);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
alarm_pool_add_alarm_in_us(HAL_timer_pool_2, compare, HAL_timer_alarm_pool_2_callback, 0, false);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
alarm_pool_add_alarm_in_us(HAL_timer_pool_3, compare, HAL_timer_alarm_pool_3_callback, 0, false);
|
||||
break;
|
||||
@@ -151,27 +146,20 @@ FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, hal_time
|
||||
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
|
||||
if (timer_num == MF_TIMER_STEP) return 0ull;
|
||||
return time_us_64();
|
||||
}
|
||||
|
||||
|
||||
FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) {
|
||||
HAL_timer_irq_en[timer_num] = 1;
|
||||
}
|
||||
|
||||
FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
||||
HAL_timer_irq_en[timer_num] = 0;
|
||||
}
|
||||
|
||||
FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
||||
return HAL_timer_irq_en[timer_num]; //lucky coincidence that timer_num and rp2040 irq num matches
|
||||
return HAL_timer_irq_en[timer_num]; // Lucky coincidence that timer_num and rp2040 IRQ num matches
|
||||
}
|
||||
|
||||
FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
||||
return;
|
||||
}
|
||||
|
||||
#define HAL_timer_isr_epilogue(T) NOOP
|
||||
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* 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
|
||||
|
||||
/**
|
||||
* RP2040 LCD-specific defines
|
||||
*/
|
||||
uint8_t u8g_com_rp2040_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); // u8g_com_rp2040_ssd_i2c.cpp
|
||||
#define U8G_COM_SSD_I2C_HAL u8g_com_rp2040_ssd_i2c_fn
|
||||
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* 2-Wire I2C COM Driver
|
||||
*
|
||||
* Handles Hardware I2C on valid pin combinations.
|
||||
* Wire library is used for Hardware I2C.
|
||||
*
|
||||
* Hardware I2C uses pins defined in pins_arduino.h.
|
||||
*/
|
||||
|
||||
#ifdef __PLAT_RP2040__
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if HAS_U8GLIB_I2C_OLED
|
||||
|
||||
#include <U8glib-HAL.h>
|
||||
|
||||
#include <Wire.h>
|
||||
#ifndef MASTER_ADDRESS
|
||||
#define MASTER_ADDRESS 0x01
|
||||
#endif
|
||||
|
||||
/**
|
||||
* BUFFER_LENGTH is defined in libraries\Wire\utility\WireBase.h
|
||||
* Default value is 32
|
||||
* Increase this value to 144 to send U8G_COM_MSG_WRITE_SEQ in single block
|
||||
*/
|
||||
#ifndef BUFFER_LENGTH
|
||||
#define BUFFER_LENGTH 32
|
||||
#endif
|
||||
#if BUFFER_LENGTH > 144
|
||||
#error "BUFFER_LENGTH should not be greater than 144."
|
||||
#endif
|
||||
#define I2C_MAX_LENGTH (BUFFER_LENGTH - 1)
|
||||
|
||||
uint8_t u8g_com_rp2040_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
||||
|
||||
// Hardware I2C flag
|
||||
//static bool i2c_initialized = false; // Flag to only run init/linking code once
|
||||
//if (!i2c_initialized) { // Init runtime linkages
|
||||
// i2c_initialized = true; // Only do this once
|
||||
//}
|
||||
|
||||
static uint8_t control;
|
||||
// Use the global Wire instance (already initialized with correct pins for RP2040)
|
||||
switch (msg) {
|
||||
case U8G_COM_MSG_INIT:
|
||||
Wire.setClock(400000);
|
||||
// Wire already initialized in MarlinUI::init(), no need to call begin() again
|
||||
break;
|
||||
|
||||
case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1)
|
||||
control = arg_val ? 0x40 : 0x00;
|
||||
break;
|
||||
|
||||
case U8G_COM_MSG_WRITE_BYTE:
|
||||
::Wire.beginTransmission(0x3C);
|
||||
::Wire.write(control);
|
||||
::Wire.write(arg_val);
|
||||
::Wire.endTransmission();
|
||||
break;
|
||||
|
||||
case U8G_COM_MSG_WRITE_SEQ: {
|
||||
uint8_t* dataptr = (uint8_t*)arg_ptr;
|
||||
while (arg_val > 0) {
|
||||
::Wire.beginTransmission(0x3C);
|
||||
::Wire.write(control);
|
||||
if (arg_val <= I2C_MAX_LENGTH) {
|
||||
::Wire.write(dataptr, arg_val);
|
||||
arg_val = 0;
|
||||
}
|
||||
else {
|
||||
::Wire.write(dataptr, I2C_MAX_LENGTH);
|
||||
arg_val -= I2C_MAX_LENGTH;
|
||||
dataptr += I2C_MAX_LENGTH;
|
||||
}
|
||||
::Wire.endTransmission();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif // HAS_U8GLIB_I2C_OLED
|
||||
#endif // __PLAT_RP2040__
|
||||
@@ -144,7 +144,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask() {}
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -83,7 +83,7 @@ bool PersistentStore::access_start() {
|
||||
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC;
|
||||
while (NVMCTRL->INTFLAG.bit.READY == 0) { }
|
||||
|
||||
PAGE_SIZE = pow(2,3 + NVMCTRL->PARAM.bit.PSZ);
|
||||
PAGE_SIZE = POW(2, 3 + NVMCTRL->PARAM.bit.PSZ);
|
||||
ROW_SIZE= PAGE_SIZE * 4;
|
||||
/*NVMCTRL->SEECFG.reg = NVMCTRL_SEECFG_WMODE_BUFFERED; // Buffered mode and segment reallocation active
|
||||
if (NVMCTRL->SEESTAT.bit.RLOCK)
|
||||
|
||||
@@ -165,7 +165,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
tc->COUNT32.INTENCLR.reg = TC_INTENCLR_OVF; // disable overflow interrupt
|
||||
|
||||
// TCn clock setup
|
||||
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_TC4_TC5)) ;
|
||||
GCLK->CLKCTRL.reg = uint16_t(GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID(GCM_TC4_TC5));
|
||||
SYNC (GCLK->STATUS.bit.SYNCBUSY);
|
||||
|
||||
tcReset(tc); // reset TC
|
||||
@@ -176,7 +176,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
tc->COUNT32.CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ;
|
||||
//set prescaler
|
||||
//the clock normally counts at the GCLK_TC frequency, but we can set it to divide that frequency to slow it down
|
||||
//you can use different prescaler divisons here like TC_CTRLA_PRESCALER_DIV1 to get a different range
|
||||
//you can use different prescaler divisions here like TC_CTRLA_PRESCALER_DIV1 to get a different range
|
||||
tc->COUNT32.CTRLA.reg |= TC_CTRLA_PRESCALER_DIV1 | TC_CTRLA_ENABLE; //it will divide GCLK_TC frequency by 1024
|
||||
//set the compare-capture register.
|
||||
//The counter will count up to this value (it's a 16bit counter so we use uint16_t)
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
typedef uint32_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
|
||||
|
||||
#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals
|
||||
|
||||
@@ -49,15 +49,15 @@ typedef uint32_t hal_timer_t;
|
||||
#define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000) // stepper timer ticks per µs
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer ISR (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000) // (MHz) Stepper Timer ticks per µs
|
||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
#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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
@@ -157,4 +157,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
||||
}
|
||||
}
|
||||
|
||||
#define HAL_timer_isr_epilogue(timer_num)
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
*
|
||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
||||
* resulted in using about about 25% of the CPU's time.
|
||||
* resulted in using about 25% of the CPU's time.
|
||||
*/
|
||||
|
||||
#ifdef __SAMD21__
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
*
|
||||
* Couldn't just call exact copies because the overhead killed the LCD update speed
|
||||
* With an intermediate level the softspi was running in the 10-20kHz range which
|
||||
* resulted in using about about 25% of the CPU's time.
|
||||
* resulted in using about 25% of the CPU's time.
|
||||
*/
|
||||
|
||||
void u8g_SetPinOutput(uint8_t internal_pin_number);
|
||||
|
||||
@@ -61,7 +61,8 @@
|
||||
#define GET_COOLER_ADC() TERN(HAS_TEMP_ADC_COOLER, PIN_TO_ADC(TEMP_COOLER_PIN), -1)
|
||||
#define GET_BOARD_ADC() TERN(HAS_TEMP_ADC_BOARD, PIN_TO_ADC(TEMP_BOARD_PIN), -1)
|
||||
#define GET_SOC_ADC() TERN(HAS_TEMP_ADC_BOARD, PIN_TO_ADC(TEMP_BOARD_PIN), -1)
|
||||
#define GET_FILAMENT_WIDTH_ADC() TERN(FILAMENT_WIDTH_SENSOR, PIN_TO_ADC(FILWIDTH_PIN), -1)
|
||||
#define GET_FILAMENT_WIDTH_ADC() TERN(HAS_FILWIDTH_ADC, PIN_TO_ADC(FILWIDTH_PIN), -1)
|
||||
#define GET_FILAMENT2_WIDTH_ADC() TERN(HAS_FILWIDTH2_ADC, PIN_TO_ADC(FILWIDTH2_PIN), -1)
|
||||
#define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1)
|
||||
#define GET_JOY_ADC_X() TERN(HAS_JOY_ADC_X, PIN_TO_ADC(JOY_X_PIN), -1)
|
||||
#define GET_JOY_ADC_Y() TERN(HAS_JOY_ADC_Y, PIN_TO_ADC(JOY_Y_PIN), -1)
|
||||
@@ -77,7 +78,7 @@
|
||||
|| GET_PROBE_ADC() == n \
|
||||
|| GET_COOLER_ADC() == n \
|
||||
|| GET_BOARD_ADC() == n || GET_SOC_ADC() == n \
|
||||
|| GET_FILAMENT_WIDTH_ADC() == n \
|
||||
|| GET_FILAMENT_WIDTH_ADC() == n || GET_FILAMENT2_WIDTH_ADC() == n \
|
||||
|| GET_BUTTONS_ADC() == n \
|
||||
|| GET_JOY_ADC_X() == n || GET_JOY_ADC_Y() == n || GET_JOY_ADC_Z() == n \
|
||||
|| GET_POWERMON_ADC_CURRENT() == n || GET_POWERMON_ADC_VOLTS() == n \
|
||||
@@ -146,6 +147,9 @@ enum ADCIndex {
|
||||
#if GET_FILAMENT_WIDTH_ADC() == 0
|
||||
FILWIDTH,
|
||||
#endif
|
||||
#if GET_FILAMENT2_WIDTH_ADC() == 0
|
||||
FILWIDTH2,
|
||||
#endif
|
||||
#if GET_BUTTONS_ADC() == 0
|
||||
ADC_KEY,
|
||||
#endif
|
||||
@@ -212,6 +216,9 @@ enum ADCIndex {
|
||||
#if GET_FILAMENT_WIDTH_ADC() == 1
|
||||
FILWIDTH,
|
||||
#endif
|
||||
#if GET_FILAMENT2_WIDTH_ADC() == 1
|
||||
FILWIDTH2,
|
||||
#endif
|
||||
#if GET_BUTTONS_ADC() == 1
|
||||
ADC_KEY,
|
||||
#endif
|
||||
@@ -334,6 +341,9 @@ enum ADCIndex {
|
||||
#if GET_FILAMENT_WIDTH_ADC() == 0
|
||||
FILWIDTH_PIN,
|
||||
#endif
|
||||
#if GET_FILAMENT2_WIDTH_ADC() == 0
|
||||
FILWIDTH2_PIN,
|
||||
#endif
|
||||
#if GET_BUTTONS_ADC() == 0
|
||||
ADC_KEYPAD_PIN,
|
||||
#endif
|
||||
@@ -400,6 +410,9 @@ enum ADCIndex {
|
||||
#if GET_FILAMENT_WIDTH_ADC() == 1
|
||||
FILWIDTH_PIN,
|
||||
#endif
|
||||
#if GET_FILAMENT2_WIDTH_ADC() == 1
|
||||
FILWIDTH2_PIN,
|
||||
#endif
|
||||
#if GET_BUTTONS_ADC() == 1
|
||||
ADC_KEYPAD_PIN,
|
||||
#endif
|
||||
@@ -471,6 +484,9 @@ enum ADCIndex {
|
||||
#if GET_FILAMENT_WIDTH_ADC() == 0
|
||||
{ PIN_TO_INPUTCTRL(FILWIDTH_PIN) },
|
||||
#endif
|
||||
#if GET_FILAMENT2_WIDTH_ADC() == 0
|
||||
{ PIN_TO_INPUTCTRL(FILWIDTH2_PIN) },
|
||||
#endif
|
||||
#if GET_BUTTONS_ADC() == 0
|
||||
{ PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) },
|
||||
#endif
|
||||
@@ -543,6 +559,9 @@ enum ADCIndex {
|
||||
#if GET_FILAMENT_WIDTH_ADC() == 1
|
||||
{ PIN_TO_INPUTCTRL(FILWIDTH_PIN) },
|
||||
#endif
|
||||
#if GET_FILAMENT2_WIDTH_ADC() == 1
|
||||
{ PIN_TO_INPUTCTRL(FILWIDTH2_PIN) },
|
||||
#endif
|
||||
#if GET_BUTTONS_ADC() == 1
|
||||
{ PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) },
|
||||
#endif
|
||||
|
||||
@@ -121,7 +121,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask() {}
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
typedef uint32_t hal_timer_t;
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFUL
|
||||
|
||||
#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals
|
||||
|
||||
@@ -48,15 +48,15 @@ typedef uint32_t hal_timer_t;
|
||||
#define MF_TIMER_TEMP MF_TIMER_RTC // Timer Index for Temperature
|
||||
#endif
|
||||
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000) // stepper timer ticks per µs
|
||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer ISR (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||
#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000) // (MHz) Stepper Timer ticks per µs
|
||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||
|
||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||
#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 ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||
@@ -145,4 +145,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
||||
}
|
||||
}
|
||||
|
||||
#define HAL_timer_isr_epilogue(timer_num)
|
||||
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||
|
||||
@@ -66,7 +66,7 @@ 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 int cpuFreq = F_CPU;
|
||||
constexpr unsigned int cpuFreq = F_CPU;
|
||||
UNUSED(cpuFreq);
|
||||
|
||||
#if HAS_MEDIA && DISABLED(ONBOARD_SDIO) && PIN_EXISTS(SD_SS)
|
||||
@@ -114,7 +114,7 @@ void MarlinHAL::idletask() {
|
||||
void MarlinHAL::reboot() { NVIC_SystemReset(); }
|
||||
|
||||
uint8_t MarlinHAL::get_reset_source() {
|
||||
return
|
||||
return (
|
||||
#ifdef RCC_FLAG_IWDGRST // Some sources may not exist...
|
||||
RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ? RST_WATCHDOG :
|
||||
#endif
|
||||
@@ -134,7 +134,7 @@ uint8_t MarlinHAL::get_reset_source() {
|
||||
RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) ? RST_POWER_ON :
|
||||
#endif
|
||||
0
|
||||
;
|
||||
);
|
||||
}
|
||||
|
||||
void MarlinHAL::clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); }
|
||||
|
||||
@@ -157,7 +157,7 @@ public:
|
||||
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
// Tasks, called from marlin.idle()
|
||||
static void idletask();
|
||||
|
||||
// Reset
|
||||
|
||||
@@ -209,7 +209,7 @@ HAL_HardwareSerial::HAL_HardwareSerial(void *peripheral) {
|
||||
}
|
||||
#endif
|
||||
|
||||
else { // else get the pins of the first peripheral occurence in PinMap
|
||||
else { // else get the pins of the first peripheral occurrence in PinMap
|
||||
_serial.pin_rx = pinmap_pin(peripheral, PinMap_UART_RX);
|
||||
_serial.pin_tx = pinmap_pin(peripheral, PinMap_UART_TX);
|
||||
}
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
This HAL is intended to act as the generic STM32 HAL for all STM32 chips (The whole F, H and L family).
|
||||
|
||||
Currently it supports:
|
||||
* STM32F0xx
|
||||
* STM32F1xx
|
||||
* STM32F4xx
|
||||
* STM32F7xx
|
||||
|
||||
- STM32F0xx
|
||||
- STM32F1xx
|
||||
- STM32F4xx
|
||||
- STM32F7xx
|
||||
|
||||
Targeting the official [Arduino STM32 Core](https://github.com/stm32duino/Arduino_Core_STM32).
|
||||
|
||||
@@ -39,8 +39,8 @@ static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM
|
||||
static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
|
||||
|
||||
// This must be called after the STM32 Servo class has initialized the timer.
|
||||
// It may only be needed after the first call to attach(), but it is possible
|
||||
// that is is necessary after every detach() call. To be safe this is currently
|
||||
// It may only be needed after the first call to attach(), but it's possible
|
||||
// that this is needed after every detach() call. To be safe this is currently
|
||||
// called after every call to attach().
|
||||
static void fixServoTimerInterruptPriority() {
|
||||
NVIC_SetPriority(getTimerUpIrq(TIMER_SERVO), servo_interrupt_priority);
|
||||
|
||||
@@ -125,13 +125,13 @@ bool PersistentStore::access_start() {
|
||||
}
|
||||
if (current_slot == -1) {
|
||||
// We didn't find anything, so we'll just initialize to empty
|
||||
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8;
|
||||
for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = EMPTY_UINT8;
|
||||
current_slot = EEPROM_SLOTS;
|
||||
}
|
||||
else {
|
||||
// load current settings
|
||||
uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot);
|
||||
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i];
|
||||
for (int i = 0; i < long(MARLIN_EEPROM_SIZE); i++) ram_eeprom[i] = eeprom_data[i];
|
||||
DEBUG_ECHOLNPGM("EEPROM loaded from slot ", current_slot, ".");
|
||||
}
|
||||
eeprom_data_written = false;
|
||||
|
||||
@@ -44,7 +44,7 @@ void eeprom_init() { BL24CXX::init(); }
|
||||
|
||||
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
|
||||
const unsigned eeprom_address = (unsigned)pos;
|
||||
return BL24CXX::writeOneByte(eeprom_address, value);
|
||||
BL24CXX::writeOneByte(eeprom_address, value);
|
||||
}
|
||||
|
||||
uint8_t eeprom_read_byte(uint8_t *pos) {
|
||||
|
||||
@@ -54,7 +54,7 @@ bool PersistentStore::access_start() {
|
||||
|
||||
int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE);
|
||||
if (bytes_read < 0) return false;
|
||||
for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++)
|
||||
for (; bytes_read < long(MARLIN_EEPROM_SIZE); bytes_read++)
|
||||
HAL_eeprom_data[bytes_read] = 0xFF;
|
||||
file.close();
|
||||
return true;
|
||||
|
||||
@@ -29,6 +29,6 @@
|
||||
#endif
|
||||
|
||||
// Some STM32F4 boards may lose steps when saving to EEPROM during print (PR #17946)
|
||||
#if defined(STM32F4xx) && ENABLED(FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
|
||||
#if ALL(STM32F4xx, FLASH_EEPROM_EMULATION) && PRINTCOUNTER_SAVE_INTERVAL > 0
|
||||
#define PRINTCOUNTER_SYNC
|
||||
#endif
|
||||
|
||||
@@ -136,10 +136,8 @@ const XrefInfo pin_xref[] PROGMEM = {
|
||||
#define printPinNumber(Q)
|
||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
||||
#define digitalPinToAnalogIndex(P) -1 // will report analog pin number in the print port routine
|
||||
|
||||
// x is a variable used to search pin_array
|
||||
#define getPinIsDigitalByIndex(x) ((bool) pin_array[x].is_digital)
|
||||
#define getPinByIndex(x) ((pin_t) pin_array[x].pin)
|
||||
#define getPinIsDigitalByIndex(x) bool(pin_array[x].is_digital)
|
||||
#define getPinByIndex(x) pin_t(pin_array[x].pin)
|
||||
#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 33 // space needed to be pretty if not first name assigned to a pin
|
||||
|
||||
@@ -150,7 +148,7 @@ const XrefInfo pin_xref[] PROGMEM = {
|
||||
|
||||
#ifndef M43_NEVER_TOUCH
|
||||
#define _M43_NEVER_TOUCH(x) WITHIN(x, 9, 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP)
|
||||
#ifdef KILL_PIN
|
||||
#if PIN_EXISTS(KILL)
|
||||
#define M43_NEVER_TOUCH(x) m43_never_touch(x)
|
||||
|
||||
bool m43_never_touch(const pin_t index) {
|
||||
@@ -229,8 +227,7 @@ void printPinPort(const pin_t pin) {
|
||||
calc_p -= NUM_ANALOG_FIRST;
|
||||
if (calc_p > 7) calc_p += 8;
|
||||
}
|
||||
SERIAL_ECHOPGM(" M42 P", calc_p);
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHO(F(" M42 P"), calc_p, C(' '));
|
||||
if (calc_p < 100) {
|
||||
SERIAL_CHAR(' ');
|
||||
if (calc_p < 10)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user