Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
08650e69e2 | ||
|
e48bc01dbc |
@@ -4,10 +4,10 @@ root = true
|
|||||||
[{*.patch,syntax_test_*}]
|
[{*.patch,syntax_test_*}]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h,*.ino}]
|
[{*.c,*.cpp,*.h}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h,*.ino,Makefile}]
|
[{*.c,*.cpp,*.h,Makefile}]
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
|
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -17,5 +17,3 @@
|
|||||||
*.png binary
|
*.png binary
|
||||||
*.jpg binary
|
*.jpg binary
|
||||||
*.fon binary
|
*.fon binary
|
||||||
*.bin binary
|
|
||||||
*.woff binary
|
|
||||||
|
43
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
43
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report a bug in Marlin
|
||||||
|
title: "[BUG] (short description)"
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md
|
||||||
|
|
||||||
|
Do you want to ask a question? Are you looking for support? Please don't post here. Instead please use one of the support links at https://github.com/MarlinFirmware/Marlin/issues/new/choose
|
||||||
|
|
||||||
|
Before filing an issue be sure to test the "bugfix" branches to see whether the issue has been resolved.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Bug Description
|
||||||
|
|
||||||
|
<!-- Description of the bug -->
|
||||||
|
|
||||||
|
### My Configurations
|
||||||
|
|
||||||
|
**Required:** Please include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files.
|
||||||
|
|
||||||
|
### Steps to Reproduce
|
||||||
|
|
||||||
|
<!-- Please describe the steps needed to reproduce the issue -->
|
||||||
|
|
||||||
|
1. [First Step]
|
||||||
|
2. [Second Step]
|
||||||
|
3. [and so on...]
|
||||||
|
|
||||||
|
**Expected behavior:** [What you expect to happen]
|
||||||
|
|
||||||
|
**Actual behavior:** [What actually happens]
|
||||||
|
|
||||||
|
#### Additional Information
|
||||||
|
|
||||||
|
* Provide pictures or links to videos that clearly demonstrate the issue.
|
||||||
|
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.
|
157
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
157
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,157 +0,0 @@
|
|||||||
name: 🪲 Report a bug
|
|
||||||
description: Create a bug report to help improve Marlin Firmware
|
|
||||||
title: "[BUG] (bug summary)"
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: >
|
|
||||||
Do you want to ask a question? Are you looking for support? Please use one of the [support links](https://github.com/MarlinFirmware/Marlin/issues/new/choose).
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
**Thank you for reporting a bug in Marlin Firmware!**
|
|
||||||
|
|
||||||
## Before Reporting a Bug
|
|
||||||
|
|
||||||
- Read and understand Marlin's [Code of Conduct](https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md). You are expected to comply with it, including treating everyone with respect.
|
|
||||||
|
|
||||||
- Test with the [`bugfix-2.0.x` branch](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.0.x.zip) to see whether the issue still exists.
|
|
||||||
|
|
||||||
## Instructions
|
|
||||||
|
|
||||||
Please follow the instructions below. Failure to do so may result in your issue being closed. See [Contributing to Marlin](https://github.com/MarlinFirmware/Marlin/blob/2.0.x/.github/contributing.md) for additional guidelines.
|
|
||||||
|
|
||||||
1. Provide a good title starting with [BUG].
|
|
||||||
2. Fill out all sections of this bug report form.
|
|
||||||
3. Always attach configuration files so we can build and test your setup.
|
|
||||||
|
|
||||||
- type: dropdown
|
|
||||||
attributes:
|
|
||||||
label: Did you test the latest `bugfix-2.0.x` code?
|
|
||||||
description: >-
|
|
||||||
Always try the latest code to make sure the issue you are reporting is not already fixed. To download
|
|
||||||
the latest code just [click this link](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.0.x.zip).
|
|
||||||
options:
|
|
||||||
- Yes, and the problem still exists.
|
|
||||||
- No, but I will test it now!
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
# Bug Details
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Bug Description
|
|
||||||
description: >-
|
|
||||||
Describe the bug in this section. Tell us what you were trying to do and what
|
|
||||||
happened that you did not expect. Provide a clear and concise description of the
|
|
||||||
problem and include as many details as possible.
|
|
||||||
placeholder: |
|
|
||||||
Marlin doesn't work.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Bug Timeline
|
|
||||||
description: Is this a new bug or an old issue? When did it first start?
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Expected behavior
|
|
||||||
description: >-
|
|
||||||
What did you expect to happen?
|
|
||||||
placeholder: I expected it to move left.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Actual behavior
|
|
||||||
description: What actually happened instead?
|
|
||||||
placeholder: It moved right instead of left.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Steps to Reproduce
|
|
||||||
description: >-
|
|
||||||
Please describe the steps needed to reproduce the issue.
|
|
||||||
placeholder: |
|
|
||||||
1. [First Step] ...
|
|
||||||
2. [Second Step] ...
|
|
||||||
3. [and so on] ...
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
# Your Setup
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Version of Marlin Firmware
|
|
||||||
description: "See the About Menu on the LCD or the output of `M115`. NOTE: For older releases we only patch critical bugs."
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Printer model
|
|
||||||
description: Creality Ender 3, Prusa mini, or Kossel Delta?
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Electronics
|
|
||||||
description: Stock electronics, upgrade board, or something else?
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Add-ons
|
|
||||||
description: Please list any hardware add-ons that could be involved.
|
|
||||||
|
|
||||||
- type: dropdown
|
|
||||||
attributes:
|
|
||||||
label: Your Slicer
|
|
||||||
description: Do you use Slic3r, Prusa Slicer, Simplify3D, IdeaMaker...?
|
|
||||||
options:
|
|
||||||
- Slic3r
|
|
||||||
- Simplify3D
|
|
||||||
- Prusa Slicer
|
|
||||||
- IdeaMaker
|
|
||||||
- Cura
|
|
||||||
- Other (explain below)
|
|
||||||
|
|
||||||
- type: dropdown
|
|
||||||
attributes:
|
|
||||||
label: Host Software
|
|
||||||
description: Do you use OctoPrint, Repetier Host, Pronterface...?
|
|
||||||
options:
|
|
||||||
- SD Card (headless)
|
|
||||||
- Repetier Host
|
|
||||||
- OctoPrint
|
|
||||||
- Pronterface
|
|
||||||
- Cura
|
|
||||||
- Same as my slicer
|
|
||||||
- Other (explain below)
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: >-
|
|
||||||
## Other things to include
|
|
||||||
|
|
||||||
Please also be sure to include these items to help with troubleshooting:
|
|
||||||
|
|
||||||
* **A ZIP file** containing your `Configuration.h` and `Configuration_adv.h`.
|
|
||||||
(Please don't paste lengthy configuration text here.)
|
|
||||||
* **Log output** from the host. (`M111 S247` for maximum logging.)
|
|
||||||
* **Images or videos** demonstrating the problem, if it helps to make it clear.
|
|
||||||
* **A G-Code file** that exposes the problem, if not affecting _all_ G-code.
|
|
||||||
|
|
||||||
If you've made any other modifications to the firmware, please describe them in detail in the space provided.
|
|
||||||
|
|
||||||
When pasting formatted text into the box below don't forget to put ` ``` ` (on its own line) before and after to make it readable.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Additional information & file uploads
|
|
13
.github/ISSUE_TEMPLATE/config.yml
vendored
13
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,20 +1,17 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: 📖 Marlin Documentation
|
- name: Marlin Documentation
|
||||||
url: http://marlinfw.org/
|
url: http://marlinfw.org/
|
||||||
about: Lots of documentation on installing and using Marlin.
|
about: Lots of documentation on installing and using Marlin.
|
||||||
- name: 👤 MarlinFirmware Facebook group
|
- name: MarlinFirmware Facebook group
|
||||||
url: https://www.facebook.com/groups/1049718498464482
|
url: https://www.facebook.com/groups/1049718498464482
|
||||||
about: Please ask and answer questions here.
|
about: Please ask and answer questions here.
|
||||||
- name: 🕹 Marlin on Discord
|
- name: Marlin on Discord
|
||||||
url: https://discord.gg/n5NJ59y
|
url: https://discord.gg/n5NJ59y
|
||||||
about: Join the Discord server for support and discussion.
|
about: Join the Discord server for support and discussion.
|
||||||
- name: 🔗 Marlin Discussion Forum
|
- name: Marlin Discussion Forum
|
||||||
url: http://forums.reprap.org/list.php?415
|
url: http://forums.reprap.org/list.php?415
|
||||||
about: A searchable web forum hosted by RepRap dot org.
|
about: A searchable web forum hosted by RepRap dot org.
|
||||||
- name: 📺 Marlin Videos on YouTube
|
- name: Marlin Videos on YouTube
|
||||||
url: https://www.youtube.com/results?search_query=marlin+firmware
|
url: https://www.youtube.com/results?search_query=marlin+firmware
|
||||||
about: Tutorials and more from Marlin users all around the world. Great for new users!
|
about: Tutorials and more from Marlin users all around the world. Great for new users!
|
||||||
- name: 💸 Want to donate?
|
|
||||||
url: https://www.thinkyhead.com/donate-to-marlin
|
|
||||||
about: Please take a look at the various options to support Marlin Firmware's development financially!
|
|
||||||
|
35
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
35
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Request a Feature
|
||||||
|
title: "[FR] (feature request title)"
|
||||||
|
labels: 'T: Feature Request'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md
|
||||||
|
|
||||||
|
Do you want to ask a question? Are you looking for support? Please don't post here. Instead please use one of the support links at https://github.com/MarlinFirmware/Marlin/issues/new/choose
|
||||||
|
|
||||||
|
Before filing an issue be sure to test the "bugfix" branches to see whether the issue has been resolved.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Description
|
||||||
|
|
||||||
|
<!-- Description of the requested feature -->
|
||||||
|
|
||||||
|
### Feature Workflow
|
||||||
|
|
||||||
|
<!-- Please describe the feature's behavior, user interaction, etc. -->
|
||||||
|
|
||||||
|
1. [First Action]
|
||||||
|
2. [Second Action]
|
||||||
|
3. [and so on...]
|
||||||
|
|
||||||
|
#### Additional Information
|
||||||
|
|
||||||
|
* Provide pictures or links that demonstrate a similar feature or concept.
|
||||||
|
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.
|
44
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
44
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
name: ✨ Request a feature
|
|
||||||
description: Request a new Marlin Firmware feature
|
|
||||||
title: "[FR] (feature summary)"
|
|
||||||
labels: 'T: Feature Request'
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: >
|
|
||||||
Do you want to ask a question? Are you looking for support? Please use one of the [support links](https://github.com/MarlinFirmware/Marlin/issues/new/choose).
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: >
|
|
||||||
**Thank you for requesting a new Marlin Firmware feature!**
|
|
||||||
|
|
||||||
## Before Requesting a Feature
|
|
||||||
|
|
||||||
- Read and understand Marlin's [Code of Conduct](https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md). You are expected to comply with it, including treating everyone with respect.
|
|
||||||
|
|
||||||
- Check the latest [`bugfix-2.0.x` branch](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.0.x.zip) to see if the feature already exists.
|
|
||||||
|
|
||||||
- Before you proceed with your request, please consider if it is necessary to make it into a firmware feature, or if it may be better suited for a slicer or host feature.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Is your feature request related to a problem? Please describe.
|
|
||||||
description: A clear description of the problem (e.g., "I need X but Marlin can't do it [...]").
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Are you looking for hardware support?
|
|
||||||
description: Tell us the printer, board, or peripheral that needs support.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Describe the feature you want
|
|
||||||
description: A clear description of the feature and how you think it should work.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Additional context
|
|
||||||
description: Add any other context or screenshots about the feature request here.
|
|
30
.github/issue_template.md
vendored
30
.github/issue_template.md
vendored
@@ -1,35 +1,11 @@
|
|||||||
<!--
|
# NO SUPPORT REQUESTS PLEASE
|
||||||
|
|
||||||
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.0.x/.github/code_of_conduct.md
|
Do you want to ask a question? Are you looking for support? Please don't post here. Support Requests posted here will be automatically closed!
|
||||||
|
|
||||||
Do you want to ask a question? Are you looking for support? Please don't post here. Instead use one of the following options:
|
Instead use one of the following options:
|
||||||
|
|
||||||
- The Marlin Firmware forum at https://reprap.org/forum/list.php?415
|
- The Marlin Firmware forum at https://reprap.org/forum/list.php?415
|
||||||
- The MarlinFirmware Facebook Group at https://www.facebook.com/groups/1049718498464482/
|
- The MarlinFirmware Facebook Group at https://www.facebook.com/groups/1049718498464482/
|
||||||
- The MarlinFirmware Discord Server at https://discord.gg/n5NJ59y.
|
- The MarlinFirmware Discord Server at https://discord.gg/n5NJ59y.
|
||||||
|
|
||||||
Before filing an issue be sure to test the latest "bugfix" branch to see whether the issue is already addressed.
|
Before filing an issue be sure to test the latest "bugfix" branch to see whether the issue is already addressed.
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Description
|
|
||||||
|
|
||||||
<!-- Description of the bug or requested feature -->
|
|
||||||
|
|
||||||
### Steps to Reproduce
|
|
||||||
|
|
||||||
<!-- If this is a Bug Report, please describe the steps needed to reproduce the issue -->
|
|
||||||
|
|
||||||
1. [First Step]
|
|
||||||
2. [Second Step]
|
|
||||||
3. [and so on...]
|
|
||||||
|
|
||||||
**Expected behavior:** [What you expect to happen]
|
|
||||||
|
|
||||||
**Actual behavior:** [What actually happens]
|
|
||||||
|
|
||||||
#### Additional Information
|
|
||||||
|
|
||||||
* Include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files.
|
|
||||||
* Provide pictures or links to videos that clearly demonstrate the issue.
|
|
||||||
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.
|
|
||||||
|
22
.github/pull_request_template.md
vendored
22
.github/pull_request_template.md
vendored
@@ -1,33 +1,23 @@
|
|||||||
<!--
|
### Requirements
|
||||||
|
|
||||||
Submitting a Pull Request
|
* Filling out this template is required. Pull Requests without a clear description may be closed at the maintainers' discretion.
|
||||||
|
|
||||||
- Please fill out all sections of this form. You can delete the helpful comments.
|
|
||||||
- Pull Requests without clear information will take longer and may even be rejected.
|
|
||||||
- We get a high volume of submissions so please be patient during review.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
Clearly describe the submitted changes with lots of details. Include images where helpful. Initial reviewers may not be familiar with the subject, so be as thorough as possible. You can use MarkDown syntax to improve readability with bullet lists, code blocks, and so on. PREVIEW and fix up formatting before submitting.
|
We must be able to understand your proposed change from this description. If we can't understand what the code will do from this description, the Pull Request may be closed at the maintainers' discretion. Keep in mind that the maintainer reviewing this PR may not be familiar with or have worked with the code recently, so please walk us through the concepts.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
### Requirements
|
|
||||||
|
|
||||||
<!-- Does this PR require a specific board, LCD, etc.? -->
|
|
||||||
|
|
||||||
### Benefits
|
### Benefits
|
||||||
|
|
||||||
<!-- What does this PR fix or improve? -->
|
<!-- What does this fix or improve? -->
|
||||||
|
|
||||||
### Configurations
|
### Configurations
|
||||||
|
|
||||||
<!-- Attach Configurations ZIP and any other files needed to test this PR. -->
|
<!-- Attach any Configuration.h, Configuration_adv.h, or platformio.ini files needed to compile/test your Pull Request. -->
|
||||||
|
|
||||||
### Related Issues
|
### Related Issues
|
||||||
|
|
||||||
<!-- Does this PR fix a bug or fulfill a Feature Request? Link related Issues here. -->
|
<!-- Whether this fixes a bug or fulfills a feature request, please list any related Issues here. -->
|
||||||
|
3
.github/workflows/check-pr.yml
vendored
3
.github/workflows/check-pr.yml
vendored
@@ -20,8 +20,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: superbrothers/close-pull-request@v3
|
- uses: peter-evans/close-pull@v1
|
||||||
with:
|
with:
|
||||||
|
delete-branch: false
|
||||||
comment: >
|
comment: >
|
||||||
Thanks for your contribution! Unfortunately we can't accept PRs directed at release branches. We make patches to the bugfix branches and only later do we push them out as releases.
|
Thanks for your contribution! Unfortunately we can't accept PRs directed at release branches. We make patches to the bugfix branches and only later do we push them out as releases.
|
||||||
|
|
||||||
|
39
.github/workflows/clean-closed.yml
vendored
39
.github/workflows/clean-closed.yml
vendored
@@ -1,39 +0,0 @@
|
|||||||
#
|
|
||||||
# clean-closed.yml
|
|
||||||
# Remove obsolete labels when an Issue or PR is closed
|
|
||||||
#
|
|
||||||
|
|
||||||
name: Clean Closed
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [closed]
|
|
||||||
issues:
|
|
||||||
types: [closed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
remove_label:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
label:
|
|
||||||
- "S: Don't Merge"
|
|
||||||
- "S: Hold for 2.1"
|
|
||||||
- "S: Please Merge"
|
|
||||||
- "S: Please Test"
|
|
||||||
- "help wanted"
|
|
||||||
- "Needs: Discussion"
|
|
||||||
- "Needs: Documentation"
|
|
||||||
- "Needs: More Data"
|
|
||||||
- "Needs: Patch"
|
|
||||||
- "Needs: Testing"
|
|
||||||
- "Needs: Work"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- name: Remove Labels
|
|
||||||
uses: actions-ecosystem/action-remove-labels@v1
|
|
||||||
with:
|
|
||||||
github_token: ${{ github.token }}
|
|
||||||
labels: ${{ matrix.label }}
|
|
9
.github/workflows/close-stale.yml
vendored
9
.github/workflows/close-stale.yml
vendored
@@ -20,9 +20,8 @@ jobs:
|
|||||||
- uses: actions/stale@v3
|
- uses: actions/stale@v3
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
stale-issue-message: 'This issue has had no activity in the last 60 days. Please add a reply if you want to keep this issue active, otherwise it will be automatically closed within 10 days.'
|
stale-issue-message: 'This issue has had no activity in the last 30 days. Please add a reply if you want to keep this issue active, otherwise it will be automatically closed within 7 days.'
|
||||||
days-before-stale: 60
|
days-before-stale: 30
|
||||||
days-before-close: 10
|
days-before-close: 7
|
||||||
stale-issue-label: 'stale-closing-soon'
|
stale-issue-label: 'stale-closing-soon'
|
||||||
exempt-all-assignees: true
|
exempt-issue-labels: 'T: Feature Request'
|
||||||
exempt-issue-labels: 'Bug: Confirmed !,T: Feature Request,Needs: Discussion,Needs: Documentation,Needs: More Data,Needs: Patch,Needs: Work,Needs: Testing,help wanted,no-locking'
|
|
||||||
|
2
.github/workflows/lock-closed.yml
vendored
2
.github/workflows/lock-closed.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
process-only: 'issues'
|
process-only: 'issues'
|
||||||
issue-lock-inactive-days: '60'
|
issue-lock-inactive-days: '60'
|
||||||
issue-exclude-created-before: '2017-07-01T00:00:00Z'
|
issue-exclude-created-before: ''
|
||||||
issue-exclude-labels: 'no-locking'
|
issue-exclude-labels: 'no-locking'
|
||||||
issue-lock-labels: ''
|
issue-lock-labels: ''
|
||||||
issue-lock-comment: >
|
issue-lock-comment: >
|
||||||
|
39
.github/workflows/test-builds.yml
vendored
39
.github/workflows/test-builds.yml
vendored
@@ -36,11 +36,9 @@ jobs:
|
|||||||
# Base Environments
|
# Base Environments
|
||||||
|
|
||||||
- DUE
|
- DUE
|
||||||
- DUE_archim
|
|
||||||
- esp32
|
- esp32
|
||||||
- linux_native
|
- linux_native
|
||||||
- mega2560
|
- mega2560
|
||||||
- at90usb1286_dfu
|
|
||||||
- teensy31
|
- teensy31
|
||||||
- teensy35
|
- teensy35
|
||||||
- teensy41
|
- teensy41
|
||||||
@@ -48,13 +46,13 @@ jobs:
|
|||||||
|
|
||||||
# Extended AVR Environments
|
# Extended AVR Environments
|
||||||
|
|
||||||
- FYSETC_F6
|
- FYSETC_F6_13
|
||||||
- mega1280
|
- mega1280
|
||||||
- rambo
|
- rambo
|
||||||
- sanguino1284p
|
- sanguino1284p
|
||||||
- sanguino644p
|
- sanguino644p
|
||||||
|
|
||||||
# STM32F1 (Maple) Environments
|
# Extended STM32 Environments
|
||||||
|
|
||||||
- STM32F103RC_btt
|
- STM32F103RC_btt
|
||||||
- STM32F103RC_btt_USB
|
- STM32F103RC_btt_USB
|
||||||
@@ -64,45 +62,40 @@ jobs:
|
|||||||
- STM32F103RC_meeb
|
- STM32F103RC_meeb
|
||||||
- jgaurora_a5s_a1
|
- jgaurora_a5s_a1
|
||||||
- STM32F103VE_longer
|
- STM32F103VE_longer
|
||||||
- mks_robin
|
|
||||||
- mks_robin_lite
|
|
||||||
- mks_robin_pro
|
|
||||||
- STM32F103RET6_creality
|
|
||||||
- mks_robin_nano35
|
|
||||||
|
|
||||||
# STM32 (ST) Environments
|
|
||||||
|
|
||||||
- STM32F103RC_btt_stm32
|
|
||||||
- STM32F407VE_black
|
- STM32F407VE_black
|
||||||
- STM32F401VE_STEVAL
|
- STM32F401VE_STEVAL
|
||||||
- BIGTREE_BTT002
|
- BIGTREE_BTT002
|
||||||
- BIGTREE_SKR_PRO
|
- BIGTREE_SKR_PRO
|
||||||
- BIGTREE_GTR_V1_0
|
- BIGTREE_GTR_V1_0
|
||||||
|
- mks_robin
|
||||||
- mks_robin_stm32
|
- mks_robin_stm32
|
||||||
- ARMED
|
- ARMED
|
||||||
- FYSETC_S6
|
- FYSETC_S6
|
||||||
- STM32F070CB_malyan
|
- STM32F070CB_malyan
|
||||||
- STM32F070RB_malyan
|
- STM32F070RB_malyan
|
||||||
- malyan_M300
|
- malyan_M300
|
||||||
|
- mks_robin_lite
|
||||||
- FLYF407ZG
|
- FLYF407ZG
|
||||||
- rumba32
|
- rumba32
|
||||||
|
- mks_robin_pro
|
||||||
|
- STM32F103RET6_creality
|
||||||
- LERDGEX
|
- LERDGEX
|
||||||
- LERDGEK
|
- mks_robin_nano35
|
||||||
- mks_robin_nano35_stm32
|
|
||||||
- NUCLEO_F767ZI
|
|
||||||
- REMRAM_V1
|
|
||||||
- BTT_SKR_SE_BX
|
|
||||||
- chitu_f103
|
|
||||||
|
|
||||||
# Put lengthy tests last
|
# Put lengthy tests last
|
||||||
|
|
||||||
- LPC1768
|
- LPC1768
|
||||||
- LPC1769
|
- LPC1769
|
||||||
|
|
||||||
|
# STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working.
|
||||||
|
|
||||||
|
#- STM32F4
|
||||||
|
#- STM32F7
|
||||||
|
|
||||||
# Non-working environment tests
|
# Non-working environment tests
|
||||||
#- at90usb1286_cdc
|
#- at90usb1286_cdc
|
||||||
|
#- at90usb1286_dfu
|
||||||
#- STM32F103CB_malyan
|
#- STM32F103CB_malyan
|
||||||
#- STM32F103RE
|
|
||||||
#- mks_robin_mini
|
#- mks_robin_mini
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -123,4 +116,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Run ${{ matrix.test-platform }} Tests
|
- name: Run ${{ matrix.test-platform }} Tests
|
||||||
run: |
|
run: |
|
||||||
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}
|
# Inline tests script
|
||||||
|
chmod +x buildroot/bin/*
|
||||||
|
chmod +x buildroot/tests/*
|
||||||
|
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH}
|
||||||
|
run_tests . ${{ matrix.test-platform }}
|
||||||
|
47
.gitignore
vendored
47
.gitignore
vendored
@@ -19,9 +19,9 @@
|
|||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
# Generated files
|
# Our automatic versioning scheme generates the following file
|
||||||
|
# NEVER put it in the repository
|
||||||
_Version.h
|
_Version.h
|
||||||
bdf2u8g
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# OS
|
# OS
|
||||||
@@ -77,6 +77,7 @@ tags
|
|||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# C
|
# C
|
||||||
#
|
#
|
||||||
@@ -122,10 +123,33 @@ tags
|
|||||||
.gcc-flags.json
|
.gcc-flags.json
|
||||||
/lib/
|
/lib/
|
||||||
|
|
||||||
|
# Workaround for Deviot+platformio quirks
|
||||||
|
Marlin/lib
|
||||||
|
Marlin/platformio.ini
|
||||||
|
Marlin/*/platformio.ini
|
||||||
|
Marlin/*/*/platformio.ini
|
||||||
|
Marlin/*/*/*/platformio.ini
|
||||||
|
Marlin/*/*/*/*/platformio.ini
|
||||||
|
Marlin/.travis.yml
|
||||||
|
Marlin/*/.travis.yml
|
||||||
|
Marlin/*/*/.travis.yml
|
||||||
|
Marlin/*/*/*/.travis.yml
|
||||||
|
Marlin/*/*/*/*/.travis.yml
|
||||||
|
Marlin/.gitignore
|
||||||
|
Marlin/*/.gitignore
|
||||||
|
Marlin/*/*/.gitignore
|
||||||
|
Marlin/*/*/*/.gitignore
|
||||||
|
Marlin/*/*/*/*/.gitignore
|
||||||
|
Marlin/readme.txt
|
||||||
|
Marlin/*/readme.txt
|
||||||
|
Marlin/*/*/readme.txt
|
||||||
|
Marlin/*/*/*/readme.txt
|
||||||
|
Marlin/*/*/*/*/readme.txt
|
||||||
|
|
||||||
# Secure Credentials
|
# Secure Credentials
|
||||||
Configuration_Secure.h
|
Configuration_Secure.h
|
||||||
|
|
||||||
# Visual Studio
|
#Visual Studio
|
||||||
*.sln
|
*.sln
|
||||||
*.vcxproj
|
*.vcxproj
|
||||||
*.vcxproj.user
|
*.vcxproj.user
|
||||||
@@ -136,34 +160,27 @@ __vm/
|
|||||||
.vs/
|
.vs/
|
||||||
vc-fileutils.settings
|
vc-fileutils.settings
|
||||||
|
|
||||||
# Visual Studio Code
|
#Visual Studio Code
|
||||||
.vscode
|
.vscode
|
||||||
.vscode/.browse.c_cpp.db*
|
.vscode/.browse.c_cpp.db*
|
||||||
.vscode/c_cpp_properties.json
|
.vscode/c_cpp_properties.json
|
||||||
.vscode/launch.json
|
.vscode/launch.json
|
||||||
.vscode/*.db
|
.vscode/*.db
|
||||||
|
|
||||||
# cmake
|
#cmake
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
src/CMakeLists.txt
|
src/CMakeLists.txt
|
||||||
CMakeListsPrivate.txt
|
CMakeListsPrivate.txt
|
||||||
|
|
||||||
# CLion
|
#CLion
|
||||||
cmake-build-*
|
cmake-build-*
|
||||||
|
|
||||||
# Eclipse
|
#Eclipse
|
||||||
.project
|
.project
|
||||||
.cproject
|
.cproject
|
||||||
.pydevproject
|
.pydevproject
|
||||||
.settings
|
.settings
|
||||||
.classpath
|
.classpath
|
||||||
|
|
||||||
# Python
|
#Python
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|
||||||
# IOLogger logs
|
|
||||||
*_log.csv
|
|
||||||
|
|
||||||
# Simulation / Native
|
|
||||||
eeprom.dat
|
|
||||||
imgui.ini
|
|
||||||
|
52
Makefile
52
Makefile
@@ -1,52 +0,0 @@
|
|||||||
help:
|
|
||||||
@echo "Tasks for local development:"
|
|
||||||
@echo "* tests-single-ci: Run a single test from inside the CI"
|
|
||||||
@echo "* tests-single-local: Run a single test locally"
|
|
||||||
@echo "* tests-single-local-docker: Run a single test locally, using docker-compose"
|
|
||||||
@echo "* tests-all-local: Run all tests locally"
|
|
||||||
@echo "* tests-all-local-docker: Run all tests locally, using docker-compose"
|
|
||||||
@echo "* setup-local-docker: Setup local docker-compose"
|
|
||||||
@echo ""
|
|
||||||
@echo "Options for testing:"
|
|
||||||
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
|
||||||
@echo " test. If you set it to ALL it will run all "
|
|
||||||
@echo " tests, but some of them are broken: use "
|
|
||||||
@echo " tests-all-* instead to run only the ones that "
|
|
||||||
@echo " run on GitHub CI"
|
|
||||||
@echo " ONLY_TEST Limit tests to only those that contain this, or"
|
|
||||||
@echo " the index of the test (1-based)"
|
|
||||||
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
|
|
||||||
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
|
|
||||||
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
|
|
||||||
.PHONY: help
|
|
||||||
|
|
||||||
tests-single-ci:
|
|
||||||
export GIT_RESET_HARD=true
|
|
||||||
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET)
|
|
||||||
.PHONY: tests-single-ci
|
|
||||||
|
|
||||||
tests-single-local:
|
|
||||||
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
|
|
||||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
|
||||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
|
||||||
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
|
|
||||||
.PHONY: tests-single-local
|
|
||||||
|
|
||||||
tests-single-local-docker:
|
|
||||||
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
|
|
||||||
docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
|
||||||
.PHONY: tests-single-local-docker
|
|
||||||
|
|
||||||
tests-all-local:
|
|
||||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
|
||||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
|
||||||
&& for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
|
||||||
.PHONY: tests-all-local
|
|
||||||
|
|
||||||
tests-all-local-docker:
|
|
||||||
docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
|
|
||||||
.PHONY: tests-all-local-docker
|
|
||||||
|
|
||||||
setup-local-docker:
|
|
||||||
docker-compose build
|
|
||||||
.PHONY: setup-local-docker
|
|
@@ -35,36 +35,37 @@
|
|||||||
*
|
*
|
||||||
* Advanced settings can be found in Configuration_adv.h
|
* Advanced settings can be found in Configuration_adv.h
|
||||||
*/
|
*/
|
||||||
#define CONFIGURATION_H_VERSION 02000801
|
#define CONFIGURATION_H_VERSION 020007
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Getting Started =============================
|
//============================= Getting Started =============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Here are some useful links to help get your machine configured and calibrated:
|
* Here are some standard links for getting your machine calibrated:
|
||||||
*
|
*
|
||||||
* Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all
|
* https://reprap.org/wiki/Calibration
|
||||||
*
|
* https://youtu.be/wAL9d7FgInk
|
||||||
* Průša Calculator: https://blog.prusaprinters.org/calculator_3416/
|
* http://calculator.josefprusa.cz
|
||||||
*
|
* https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
|
||||||
* Calibration Guides: https://reprap.org/wiki/Calibration
|
* https://www.thingiverse.com/thing:5573
|
||||||
* https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
|
* https://sites.google.com/site/repraplogphase/calibration-of-your-reprap
|
||||||
* https://sites.google.com/site/repraplogphase/calibration-of-your-reprap
|
* https://www.thingiverse.com/thing:298812
|
||||||
* https://youtu.be/wAL9d7FgInk
|
|
||||||
*
|
|
||||||
* Calibration Objects: https://www.thingiverse.com/thing:5573
|
|
||||||
* https://www.thingiverse.com/thing:1278865
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//========================== DELTA / SCARA / TPARA ==========================
|
//============================= DELTA Printer ===============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
// For a Delta printer start with one of the configuration files in the
|
||||||
|
// config/examples/delta directory and customize for your machine.
|
||||||
//
|
//
|
||||||
// Download configurations from the link above and customize for your machine.
|
|
||||||
// Examples are located in config/examples/delta, .../SCARA, and .../TPARA.
|
|
||||||
//
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
//============================= SCARA Printer ===============================
|
||||||
|
//===========================================================================
|
||||||
|
// For a SCARA printer start with the configuration files in
|
||||||
|
// config/examples/SCARA and customize for your machine.
|
||||||
|
//
|
||||||
|
|
||||||
// @section info
|
// @section info
|
||||||
|
|
||||||
@@ -105,9 +106,13 @@
|
|||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serial Port Baud Rate
|
* Select a secondary serial port on the board to use for communication with the host.
|
||||||
* This is the default communication speed for all serial ports.
|
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
* Set the baud rate defaults for additional serial ports below.
|
*/
|
||||||
|
//#define SERIAL_PORT_2 -1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This setting determines the communication speed of the printer.
|
||||||
*
|
*
|
||||||
* 250000 works in most cases, but you might try a lower speed if
|
* 250000 works in most cases, but you might try a lower speed if
|
||||||
* you commonly experience drop-outs during host printing.
|
* you commonly experience drop-outs during host printing.
|
||||||
@@ -116,23 +121,6 @@
|
|||||||
* :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000]
|
* :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000]
|
||||||
*/
|
*/
|
||||||
#define BAUDRATE 250000
|
#define BAUDRATE 250000
|
||||||
//#define BAUD_RATE_GCODE // Enable G-code M575 to set the baud rate
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Select a secondary serial port on the board to use for communication with the host.
|
|
||||||
* Currently Ethernet (-2) is only supported on Teensy 4.1 boards.
|
|
||||||
* :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
|
|
||||||
*/
|
|
||||||
//#define SERIAL_PORT_2 -1
|
|
||||||
//#define BAUDRATE_2 250000 // Enable to override BAUDRATE
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Select a third serial port on the board to use for communication with the host.
|
|
||||||
* Currently only supported for AVR, DUE, LPC1768/9 and STM32/STM32F1
|
|
||||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
|
|
||||||
*/
|
|
||||||
//#define SERIAL_PORT_3 1
|
|
||||||
//#define BAUDRATE_3 250000 // Enable to override BAUDRATE
|
|
||||||
|
|
||||||
// Enable the Bluetooth serial interface on AT90USB devices
|
// Enable the Bluetooth serial interface on AT90USB devices
|
||||||
//#define BLUETOOTH
|
//#define BLUETOOTH
|
||||||
@@ -169,19 +157,33 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multi-Material Unit
|
* Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants.
|
||||||
* Set to one of these predefined models:
|
|
||||||
*
|
*
|
||||||
* PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version)
|
* This device allows one stepper driver on a control board to drive
|
||||||
* PRUSA_MMU2 : Průša MMU2
|
* two to eight stepper motors, one at a time, in a manner suitable
|
||||||
* PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5)
|
* for extruders.
|
||||||
* EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
|
*
|
||||||
* EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
|
* This option only allows the multiplexer to switch on tool-change.
|
||||||
|
* Additional options to configure custom E moves are pending.
|
||||||
|
*/
|
||||||
|
//#define MK2_MULTIPLEXER
|
||||||
|
#if ENABLED(MK2_MULTIPLEXER)
|
||||||
|
// Override the default DIO selector pins here, if needed.
|
||||||
|
// Some pins files may provide defaults for these pins.
|
||||||
|
//#define E_MUX0_PIN 40 // Always Required
|
||||||
|
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
|
||||||
|
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Průša Multi-Material Unit v2
|
||||||
*
|
*
|
||||||
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
|
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
|
||||||
* See additional options in Configuration_adv.h.
|
* Requires EXTRUDERS = 5
|
||||||
|
*
|
||||||
|
* For additional configuration see Configuration_adv.h
|
||||||
*/
|
*/
|
||||||
//#define MMU_MODEL PRUSA_MMU2
|
//#define PRUSA_MMU2
|
||||||
|
|
||||||
// A dual extruder that uses a single stepper motor
|
// A dual extruder that uses a single stepper motor
|
||||||
//#define SWITCHING_EXTRUDER
|
//#define SWITCHING_EXTRUDER
|
||||||
@@ -332,21 +334,15 @@
|
|||||||
//#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80
|
//#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80
|
||||||
//#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power
|
//#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power
|
||||||
|
|
||||||
//#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on)
|
|
||||||
//#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off)
|
|
||||||
|
|
||||||
//#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin
|
//#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin
|
||||||
#if ENABLED(AUTO_POWER_CONTROL)
|
#if ENABLED(AUTO_POWER_CONTROL)
|
||||||
#define AUTO_POWER_FANS // Turn on PSU if fans need power
|
#define AUTO_POWER_FANS // Turn on PSU if fans need power
|
||||||
#define AUTO_POWER_E_FANS
|
#define AUTO_POWER_E_FANS
|
||||||
#define AUTO_POWER_CONTROLLERFAN
|
#define AUTO_POWER_CONTROLLERFAN
|
||||||
#define AUTO_POWER_CHAMBER_FAN
|
#define AUTO_POWER_CHAMBER_FAN
|
||||||
#define AUTO_POWER_COOLER_FAN
|
//#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU over this temperature
|
||||||
//#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU if any extruder is over this temperature
|
//#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU over this temperature
|
||||||
//#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU if the chamber is over this temperature
|
#define POWER_TIMEOUT 30
|
||||||
//#define AUTO_POWER_COOLER_TEMP 26 // (°C) Turn on PSU if the cooler is over this temperature
|
|
||||||
#define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration
|
|
||||||
//#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time.
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -388,10 +384,8 @@
|
|||||||
* 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE"
|
* 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE"
|
||||||
* 15 : 100k thermistor calibration for JGAurora A5 hotend
|
* 15 : 100k thermistor calibration for JGAurora A5 hotend
|
||||||
* 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327
|
* 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327
|
||||||
* 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage.
|
* 20 : Pt100 with circuit in the Ultimainboard V2.x with 5v excitation (AVR)
|
||||||
* NOTES: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21.
|
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....)
|
||||||
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply.
|
|
||||||
* NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C.
|
|
||||||
* 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB)
|
* 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB)
|
||||||
* 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB)
|
* 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB)
|
||||||
* 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup)
|
* 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup)
|
||||||
@@ -432,34 +426,29 @@
|
|||||||
#define TEMP_SENSOR_BED 0
|
#define TEMP_SENSOR_BED 0
|
||||||
#define TEMP_SENSOR_PROBE 0
|
#define TEMP_SENSOR_PROBE 0
|
||||||
#define TEMP_SENSOR_CHAMBER 0
|
#define TEMP_SENSOR_CHAMBER 0
|
||||||
#define TEMP_SENSOR_COOLER 0
|
|
||||||
|
|
||||||
// Dummy thermistor constant temperature readings, for use with 998 and 999
|
// Dummy thermistor constant temperature readings, for use with 998 and 999
|
||||||
#define DUMMY_THERMISTOR_998_VALUE 25
|
#define DUMMY_THERMISTOR_998_VALUE 25
|
||||||
#define DUMMY_THERMISTOR_999_VALUE 100
|
#define DUMMY_THERMISTOR_999_VALUE 100
|
||||||
|
|
||||||
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1
|
// Resistor values when using a MAX31865 (sensor -5)
|
||||||
//#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
|
// Sensor value is typically 100 (PT100) or 1000 (PT1000)
|
||||||
//#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for AdaFruit PT100; 4300 for AdaFruit PT1000
|
// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules.
|
||||||
//#define MAX31865_SENSOR_OHMS_1 100
|
//#define MAX31865_SENSOR_OHMS 100
|
||||||
//#define MAX31865_CALIBRATION_OHMS_1 430
|
//#define MAX31865_CALIBRATION_OHMS 430
|
||||||
|
|
||||||
// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings
|
// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings
|
||||||
// from the two sensors differ too much the print will be aborted.
|
// from the two sensors differ too much the print will be aborted.
|
||||||
//#define TEMP_SENSOR_1_AS_REDUNDANT
|
//#define TEMP_SENSOR_1_AS_REDUNDANT
|
||||||
#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10
|
#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10
|
||||||
|
|
||||||
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
||||||
#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
|
#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
|
||||||
#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
|
#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
|
||||||
|
|
||||||
#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190
|
#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190
|
||||||
#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
|
#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
|
||||||
#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
|
#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
|
||||||
|
|
||||||
#define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191
|
|
||||||
#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer
|
|
||||||
#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target
|
|
||||||
|
|
||||||
// Below this temperature the heater will be switched off
|
// Below this temperature the heater will be switched off
|
||||||
// because it probably indicates a broken thermistor wire.
|
// because it probably indicates a broken thermistor wire.
|
||||||
@@ -472,7 +461,6 @@
|
|||||||
#define HEATER_6_MINTEMP 5
|
#define HEATER_6_MINTEMP 5
|
||||||
#define HEATER_7_MINTEMP 5
|
#define HEATER_7_MINTEMP 5
|
||||||
#define BED_MINTEMP 5
|
#define BED_MINTEMP 5
|
||||||
#define CHAMBER_MINTEMP 5
|
|
||||||
|
|
||||||
// Above this temperature the heater will be switched off.
|
// Above this temperature the heater will be switched off.
|
||||||
// This can protect components from overheating, but NOT from shorts and failures.
|
// This can protect components from overheating, but NOT from shorts and failures.
|
||||||
@@ -486,17 +474,6 @@
|
|||||||
#define HEATER_6_MAXTEMP 275
|
#define HEATER_6_MAXTEMP 275
|
||||||
#define HEATER_7_MAXTEMP 275
|
#define HEATER_7_MAXTEMP 275
|
||||||
#define BED_MAXTEMP 150
|
#define BED_MAXTEMP 150
|
||||||
#define CHAMBER_MAXTEMP 60
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Thermal Overshoot
|
|
||||||
* During heatup (and printing) the temperature can often "overshoot" the target by many degrees
|
|
||||||
* (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees
|
|
||||||
* a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP.
|
|
||||||
*/
|
|
||||||
#define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT
|
|
||||||
#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT
|
|
||||||
#define COOLER_OVERSHOOT 2 // (°C) Forbid temperatures closer than OVERSHOOT
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= PID Settings ================================
|
//============================= PID Settings ================================
|
||||||
@@ -570,51 +547,7 @@
|
|||||||
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
||||||
#endif // PIDTEMPBED
|
#endif // PIDTEMPBED
|
||||||
|
|
||||||
//===========================================================================
|
#if EITHER(PIDTEMP, PIDTEMPBED)
|
||||||
//==================== PID > Chamber Temperature Control ====================
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PID Chamber Heating
|
|
||||||
*
|
|
||||||
* If this option is enabled set PID constants below.
|
|
||||||
* If this option is disabled, bang-bang will be used and CHAMBER_LIMIT_SWITCHING will enable
|
|
||||||
* hysteresis.
|
|
||||||
*
|
|
||||||
* The PID frequency will be the same as the extruder PWM.
|
|
||||||
* If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz,
|
|
||||||
* which is fine for driving a square wave into a resistive load and does not significantly
|
|
||||||
* impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 200W
|
|
||||||
* heater. If your configuration is significantly different than this and you don't understand
|
|
||||||
* the issues involved, don't use chamber PID until someone else verifies that your hardware works.
|
|
||||||
*/
|
|
||||||
//#define PIDTEMPCHAMBER
|
|
||||||
//#define CHAMBER_LIMIT_SWITCHING
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Max Chamber Power
|
|
||||||
* Applies to all forms of chamber control (PID, bang-bang, and bang-bang with hysteresis).
|
|
||||||
* When set to any value below 255, enables a form of PWM to the chamber heater that acts like a divider
|
|
||||||
* so don't use it unless you are OK with PWM on your heater. (See the comment on enabling PIDTEMPCHAMBER)
|
|
||||||
*/
|
|
||||||
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
|
|
||||||
|
|
||||||
#if ENABLED(PIDTEMPCHAMBER)
|
|
||||||
#define MIN_CHAMBER_POWER 0
|
|
||||||
//#define PID_CHAMBER_DEBUG // Sends debug data to the serial port.
|
|
||||||
|
|
||||||
// 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
|
|
||||||
// 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.
|
|
||||||
#endif // PIDTEMPCHAMBER
|
|
||||||
|
|
||||||
#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
|
|
||||||
//#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation.
|
//#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation.
|
||||||
//#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
|
//#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
|
||||||
//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
|
//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
|
||||||
@@ -661,7 +594,6 @@
|
|||||||
#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders
|
#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders
|
||||||
#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed
|
#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed
|
||||||
#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber
|
#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber
|
||||||
#define THERMAL_PROTECTION_COOLER // Enable thermal protection for the laser cooling
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Mechanical Settings =========================
|
//============================= Mechanical Settings =========================
|
||||||
@@ -738,8 +670,6 @@
|
|||||||
*
|
*
|
||||||
* A4988 is assumed for unspecified drivers.
|
* A4988 is assumed for unspecified drivers.
|
||||||
*
|
*
|
||||||
* Use TMC2208/TMC2208_STANDALONE for TMC2225 drivers and TMC2209/TMC2209_STANDALONE for TMC2226 drivers.
|
|
||||||
*
|
|
||||||
* Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01,
|
* Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01,
|
||||||
* TB6560, TB6600, TMC2100,
|
* TB6560, TB6600, TMC2100,
|
||||||
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
|
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
|
||||||
@@ -748,15 +678,15 @@
|
|||||||
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
|
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
|
||||||
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
||||||
*/
|
*/
|
||||||
#define X_DRIVER_TYPE A4988
|
//#define X_DRIVER_TYPE A4988
|
||||||
#define Y_DRIVER_TYPE A4988
|
//#define Y_DRIVER_TYPE A4988
|
||||||
#define Z_DRIVER_TYPE A4988
|
//#define Z_DRIVER_TYPE A4988
|
||||||
//#define X2_DRIVER_TYPE A4988
|
//#define X2_DRIVER_TYPE A4988
|
||||||
//#define Y2_DRIVER_TYPE A4988
|
//#define Y2_DRIVER_TYPE A4988
|
||||||
//#define Z2_DRIVER_TYPE A4988
|
//#define Z2_DRIVER_TYPE A4988
|
||||||
//#define Z3_DRIVER_TYPE A4988
|
//#define Z3_DRIVER_TYPE A4988
|
||||||
//#define Z4_DRIVER_TYPE A4988
|
//#define Z4_DRIVER_TYPE A4988
|
||||||
#define E0_DRIVER_TYPE A4988
|
//#define E0_DRIVER_TYPE A4988
|
||||||
//#define E1_DRIVER_TYPE A4988
|
//#define E1_DRIVER_TYPE A4988
|
||||||
//#define E2_DRIVER_TYPE A4988
|
//#define E2_DRIVER_TYPE A4988
|
||||||
//#define E3_DRIVER_TYPE A4988
|
//#define E3_DRIVER_TYPE A4988
|
||||||
@@ -811,7 +741,7 @@
|
|||||||
* Override with M92
|
* Override with M92
|
||||||
* X, Y, Z, E0 [, E1[, E2...]]
|
* X, Y, Z, E0 [, E1[, E2...]]
|
||||||
*/
|
*/
|
||||||
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 500 }
|
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Max Feed Rate (mm/s)
|
* Default Max Feed Rate (mm/s)
|
||||||
@@ -946,6 +876,7 @@
|
|||||||
* or (with LCD_BED_LEVELING) the LCD controller.
|
* or (with LCD_BED_LEVELING) the LCD controller.
|
||||||
*/
|
*/
|
||||||
//#define PROBE_MANUALLY
|
//#define PROBE_MANUALLY
|
||||||
|
//#define MANUAL_PROBE_START_Z 0.2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Fix-Mounted Probe either doesn't deploy or needs manual deployment.
|
* A Fix-Mounted Probe either doesn't deploy or needs manual deployment.
|
||||||
@@ -970,6 +901,11 @@
|
|||||||
*/
|
*/
|
||||||
//#define BLTOUCH
|
//#define BLTOUCH
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pressure sensor with a BLTouch-like interface
|
||||||
|
*/
|
||||||
|
//#define CREALITY_TOUCH
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Touch-MI Probe by hotends.fr
|
* Touch-MI Probe by hotends.fr
|
||||||
*
|
*
|
||||||
@@ -1023,20 +959,10 @@
|
|||||||
/**
|
/**
|
||||||
* Nozzle-to-Probe offsets { X, Y, Z }
|
* Nozzle-to-Probe offsets { X, Y, Z }
|
||||||
*
|
*
|
||||||
* X and Y offset
|
* - Use a caliper or ruler to measure the distance from the tip of
|
||||||
* Use a caliper or ruler to measure the distance from the tip of
|
|
||||||
* the Nozzle to the center-point of the Probe in the X and Y axes.
|
* the Nozzle to the center-point of the Probe in the X and Y axes.
|
||||||
*
|
|
||||||
* Z offset
|
|
||||||
* - For the Z offset use your best known value and adjust at runtime.
|
* - For the Z offset use your best known value and adjust at runtime.
|
||||||
* - Common probes trigger below the nozzle and have negative values for Z offset.
|
* - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc.
|
||||||
* - Probes triggering above the nozzle height are uncommon but do exist. When using
|
|
||||||
* probes such as this, carefully set Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES
|
|
||||||
* to avoid collisions during probing.
|
|
||||||
*
|
|
||||||
* Tune and Adjust
|
|
||||||
* - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc.
|
|
||||||
* - PROBE_OFFSET_WIZARD (configuration_adv.h) can be used for setting the Z offset.
|
|
||||||
*
|
*
|
||||||
* Assuming the typical work area orientation:
|
* Assuming the typical work area orientation:
|
||||||
* - Probe to RIGHT of the Nozzle has a Positive X offset
|
* - Probe to RIGHT of the Nozzle has a Positive X offset
|
||||||
@@ -1067,40 +993,13 @@
|
|||||||
#define PROBING_MARGIN 10
|
#define PROBING_MARGIN 10
|
||||||
|
|
||||||
// X and Y axis travel speed (mm/min) between probes
|
// X and Y axis travel speed (mm/min) between probes
|
||||||
#define XY_PROBE_FEEDRATE (133*60)
|
#define XY_PROBE_SPEED (133*60)
|
||||||
|
|
||||||
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
||||||
#define Z_PROBE_FEEDRATE_FAST (4*60)
|
#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z
|
||||||
|
|
||||||
// Feedrate (mm/min) for the "accurate" probe of each point
|
// Feedrate (mm/min) for the "accurate" probe of each point
|
||||||
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2)
|
#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2)
|
||||||
|
|
||||||
/**
|
|
||||||
* Probe Activation Switch
|
|
||||||
* A switch indicating proper deployment, or an optical
|
|
||||||
* switch triggered when the carriage is near the bed.
|
|
||||||
*/
|
|
||||||
//#define PROBE_ACTIVATION_SWITCH
|
|
||||||
#if ENABLED(PROBE_ACTIVATION_SWITCH)
|
|
||||||
#define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active
|
|
||||||
//#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tare Probe (determine zero-point) prior to each probe.
|
|
||||||
* Useful for a strain gauge or piezo sensor that needs to factor out
|
|
||||||
* elements such as cables pulling on the carriage.
|
|
||||||
*/
|
|
||||||
//#define PROBE_TARE
|
|
||||||
#if ENABLED(PROBE_TARE)
|
|
||||||
#define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin
|
|
||||||
#define PROBE_TARE_DELAY 200 // (ms) Delay after tare before
|
|
||||||
#define PROBE_TARE_STATE HIGH // State to write pin for tare
|
|
||||||
//#define PROBE_TARE_PIN PA5 // Override default pin
|
|
||||||
#if ENABLED(PROBE_ACTIVATION_SWITCH)
|
|
||||||
//#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multiple Probing
|
* Multiple Probing
|
||||||
@@ -1158,19 +1057,11 @@
|
|||||||
//#define PROBING_HEATERS_OFF // Turn heaters off when probing
|
//#define PROBING_HEATERS_OFF // Turn heaters off when probing
|
||||||
#if ENABLED(PROBING_HEATERS_OFF)
|
#if ENABLED(PROBING_HEATERS_OFF)
|
||||||
//#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy)
|
//#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy)
|
||||||
//#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude)
|
|
||||||
#endif
|
#endif
|
||||||
//#define PROBING_FANS_OFF // Turn fans off when probing
|
//#define PROBING_FANS_OFF // Turn fans off when probing
|
||||||
//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing
|
//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing
|
||||||
//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors
|
//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors
|
||||||
|
|
||||||
// Require minimum nozzle and/or bed temperature for probing
|
|
||||||
//#define PREHEAT_BEFORE_PROBING
|
|
||||||
#if ENABLED(PREHEAT_BEFORE_PROBING)
|
|
||||||
#define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
|
|
||||||
#define PROBING_BED_TEMP 50
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||||
// :{ 0:'Low', 1:'High' }
|
// :{ 0:'Low', 1:'High' }
|
||||||
#define X_ENABLE_ON 0
|
#define X_ENABLE_ON 0
|
||||||
@@ -1213,15 +1104,9 @@
|
|||||||
|
|
||||||
// @section homing
|
// @section homing
|
||||||
|
|
||||||
//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety.
|
//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed
|
||||||
//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety.
|
|
||||||
|
|
||||||
/**
|
//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off.
|
||||||
* Set Z_IDLE_HEIGHT if the Z-Axis moves on its own when steppers are disabled.
|
|
||||||
* - Use a low value (i.e., Z_MIN_POS) if the nozzle falls down to the bed.
|
|
||||||
* - Use a large value (i.e., Z_MAX_POS) if the bed falls down, away from the nozzle.
|
|
||||||
*/
|
|
||||||
//#define Z_IDLE_HEIGHT Z_HOME_POS
|
|
||||||
|
|
||||||
//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ...
|
//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ...
|
||||||
// Be sure to have this much clearance over your Z_MAX_POS to prevent grinding.
|
// Be sure to have this much clearance over your Z_MAX_POS to prevent grinding.
|
||||||
@@ -1236,7 +1121,7 @@
|
|||||||
|
|
||||||
// @section machine
|
// @section machine
|
||||||
|
|
||||||
// The size of the printable area
|
// The size of the print bed
|
||||||
#define X_BED_SIZE 200
|
#define X_BED_SIZE 200
|
||||||
#define Y_BED_SIZE 200
|
#define Y_BED_SIZE 200
|
||||||
|
|
||||||
@@ -1281,12 +1166,6 @@
|
|||||||
* Filament Runout Sensors
|
* Filament Runout Sensors
|
||||||
* Mechanical or opto endstops are used to check for the presence of filament.
|
* Mechanical or opto endstops are used to check for the presence of filament.
|
||||||
*
|
*
|
||||||
* IMPORTANT: Runout will only trigger if Marlin is aware that a print job is running.
|
|
||||||
* Marlin knows a print job is running when:
|
|
||||||
* 1. Running a print job from media started with M24.
|
|
||||||
* 2. The Print Job Timer has been started with M75.
|
|
||||||
* 3. The heaters were turned on and PRINTJOB_TIMER_AUTOSTART is enabled.
|
|
||||||
*
|
|
||||||
* RAMPS-based boards use SERVO3_PIN for the first runout sensor.
|
* RAMPS-based boards use SERVO3_PIN for the first runout sensor.
|
||||||
* For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc.
|
* For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc.
|
||||||
*/
|
*/
|
||||||
@@ -1294,49 +1173,12 @@
|
|||||||
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
|
||||||
#define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500.
|
#define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500.
|
||||||
#define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
|
#define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
|
||||||
|
|
||||||
#define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present.
|
#define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present.
|
||||||
#define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
|
#define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
|
||||||
//#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.
|
//#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.
|
||||||
//#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder.
|
|
||||||
// This is automatically enabled for MIXING_EXTRUDERs.
|
|
||||||
|
|
||||||
// Override individually if the runout sensors vary
|
// Set one or more commands to execute on filament runout.
|
||||||
//#define FIL_RUNOUT1_STATE LOW
|
// (After 'M412 H' Marlin will ask the host to handle the process.)
|
||||||
//#define FIL_RUNOUT1_PULLUP
|
|
||||||
//#define FIL_RUNOUT1_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT2_STATE LOW
|
|
||||||
//#define FIL_RUNOUT2_PULLUP
|
|
||||||
//#define FIL_RUNOUT2_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT3_STATE LOW
|
|
||||||
//#define FIL_RUNOUT3_PULLUP
|
|
||||||
//#define FIL_RUNOUT3_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT4_STATE LOW
|
|
||||||
//#define FIL_RUNOUT4_PULLUP
|
|
||||||
//#define FIL_RUNOUT4_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT5_STATE LOW
|
|
||||||
//#define FIL_RUNOUT5_PULLUP
|
|
||||||
//#define FIL_RUNOUT5_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT6_STATE LOW
|
|
||||||
//#define FIL_RUNOUT6_PULLUP
|
|
||||||
//#define FIL_RUNOUT6_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT7_STATE LOW
|
|
||||||
//#define FIL_RUNOUT7_PULLUP
|
|
||||||
//#define FIL_RUNOUT7_PULLDOWN
|
|
||||||
|
|
||||||
//#define FIL_RUNOUT8_STATE LOW
|
|
||||||
//#define FIL_RUNOUT8_PULLUP
|
|
||||||
//#define FIL_RUNOUT8_PULLDOWN
|
|
||||||
|
|
||||||
// Commands to execute on filament runout.
|
|
||||||
// With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c")
|
|
||||||
// NOTE: After 'M412 H1' the host handles filament runout and this script does not apply.
|
|
||||||
#define FILAMENT_RUNOUT_SCRIPT "M600"
|
#define FILAMENT_RUNOUT_SCRIPT "M600"
|
||||||
|
|
||||||
// After a runout is detected, continue printing this length of filament
|
// After a runout is detected, continue printing this length of filament
|
||||||
@@ -1397,21 +1239,10 @@
|
|||||||
//#define MESH_BED_LEVELING
|
//#define MESH_BED_LEVELING
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normally G28 leaves leveling disabled on completion. Enable one of
|
* Normally G28 leaves leveling disabled on completion. Enable
|
||||||
* these options to restore the prior leveling state or to always enable
|
* this option to have G28 restore the prior leveling state.
|
||||||
* leveling immediately after G28.
|
|
||||||
*/
|
*/
|
||||||
//#define RESTORE_LEVELING_AFTER_G28
|
//#define RESTORE_LEVELING_AFTER_G28
|
||||||
//#define ENABLE_LEVELING_AFTER_G28
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Auto-leveling needs preheating
|
|
||||||
*/
|
|
||||||
//#define PREHEAT_BEFORE_LEVELING
|
|
||||||
#if ENABLED(PREHEAT_BEFORE_LEVELING)
|
|
||||||
#define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time
|
|
||||||
#define LEVELING_BED_TEMP 50
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable detailed logging of G28, G29, M48, etc.
|
* Enable detailed logging of G28, G29, M48, etc.
|
||||||
@@ -1420,19 +1251,11 @@
|
|||||||
*/
|
*/
|
||||||
//#define DEBUG_LEVELING_FEATURE
|
//#define DEBUG_LEVELING_FEATURE
|
||||||
|
|
||||||
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL, PROBE_MANUALLY)
|
|
||||||
// Set a height for the start of manual adjustment
|
|
||||||
#define MANUAL_PROBE_START_Z 0.2 // (mm) Comment out to use the last-measured height
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL)
|
#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL)
|
||||||
// Gradually reduce leveling correction until a set height is reached,
|
// Gradually reduce leveling correction until a set height is reached,
|
||||||
// at which point movement will be level to the machine's XY plane.
|
// at which point movement will be level to the machine's XY plane.
|
||||||
// The height can be set with M420 Z<height>
|
// The height can be set with M420 Z<height>
|
||||||
#define ENABLE_LEVELING_FADE_HEIGHT
|
#define ENABLE_LEVELING_FADE_HEIGHT
|
||||||
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
|
||||||
#define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// For Cartesian machines, instead of dividing moves on mesh boundaries,
|
// For Cartesian machines, instead of dividing moves on mesh boundaries,
|
||||||
// split up moves into short segments like a Delta. This follows the
|
// split up moves into short segments like a Delta. This follows the
|
||||||
@@ -1446,11 +1269,10 @@
|
|||||||
//#define G26_MESH_VALIDATION
|
//#define G26_MESH_VALIDATION
|
||||||
#if ENABLED(G26_MESH_VALIDATION)
|
#if ENABLED(G26_MESH_VALIDATION)
|
||||||
#define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
|
#define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle.
|
||||||
#define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26.
|
#define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool.
|
||||||
#define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for G26.
|
#define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool.
|
||||||
#define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for G26.
|
#define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool.
|
||||||
#define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for G26 XY moves.
|
#define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool.
|
||||||
#define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for G26 XY travel moves.
|
|
||||||
#define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements.
|
#define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1495,16 +1317,12 @@
|
|||||||
#define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited.
|
#define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited.
|
||||||
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
||||||
|
|
||||||
//#define UBL_HILBERT_CURVE // Use Hilbert distribution for less travel when probing multiple points
|
|
||||||
|
|
||||||
#define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle
|
#define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle
|
||||||
#define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500
|
#define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500
|
||||||
|
|
||||||
//#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used
|
//#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used
|
||||||
// as the Z-Height correction value.
|
// as the Z-Height correction value.
|
||||||
|
|
||||||
//#define UBL_MESH_WIZARD // Run several commands in a row to get a complete mesh
|
|
||||||
|
|
||||||
#elif ENABLED(MESH_BED_LEVELING)
|
#elif ENABLED(MESH_BED_LEVELING)
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@@ -1539,31 +1357,6 @@
|
|||||||
#define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
|
#define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
|
||||||
#define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
|
#define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
|
||||||
//#define LEVEL_CENTER_TOO // Move to the center after the last corner
|
//#define LEVEL_CENTER_TOO // Move to the center after the last corner
|
||||||
//#define LEVEL_CORNERS_USE_PROBE
|
|
||||||
#if ENABLED(LEVEL_CORNERS_USE_PROBE)
|
|
||||||
#define LEVEL_CORNERS_PROBE_TOLERANCE 0.1
|
|
||||||
#define LEVEL_CORNERS_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify
|
|
||||||
//#define LEVEL_CORNERS_AUDIO_FEEDBACK
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Corner Leveling Order
|
|
||||||
*
|
|
||||||
* Set 2 or 4 points. When 2 points are given, the 3rd is the center of the opposite edge.
|
|
||||||
*
|
|
||||||
* LF Left-Front RF Right-Front
|
|
||||||
* LB Left-Back RB Right-Back
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
*
|
|
||||||
* Default {LF,RB,LB,RF} {LF,RF} {LB,LF}
|
|
||||||
* LB --------- RB LB --------- RB LB --------- RB LB --------- RB
|
|
||||||
* | 4 3 | | 3 2 | | <3> | | 1 |
|
|
||||||
* | | | | | | | <3>|
|
|
||||||
* | 1 2 | | 1 4 | | 1 2 | | 2 |
|
|
||||||
* LF --------- RF LF --------- RF LF --------- RF LF --------- RF
|
|
||||||
*/
|
|
||||||
#define LEVEL_CORNERS_LEVELING_ORDER { LF, RF, RB, LB }
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1600,7 +1393,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Homing speeds (mm/min)
|
// Homing speeds (mm/min)
|
||||||
#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) }
|
#define HOMING_FEEDRATE_XY (50*60)
|
||||||
|
#define HOMING_FEEDRATE_Z (4*60)
|
||||||
|
|
||||||
// Validate that endstops are triggered on homing moves
|
// Validate that endstops are triggered on homing moves
|
||||||
#define VALIDATE_HOMING_ENDSTOPS
|
#define VALIDATE_HOMING_ENDSTOPS
|
||||||
@@ -1707,19 +1501,15 @@
|
|||||||
|
|
||||||
// @section temperature
|
// @section temperature
|
||||||
|
|
||||||
//
|
// Preheat Constants
|
||||||
// Preheat Constants - Up to 5 are supported without changes
|
|
||||||
//
|
|
||||||
#define PREHEAT_1_LABEL "PLA"
|
#define PREHEAT_1_LABEL "PLA"
|
||||||
#define PREHEAT_1_TEMP_HOTEND 180
|
#define PREHEAT_1_TEMP_HOTEND 180
|
||||||
#define PREHEAT_1_TEMP_BED 70
|
#define PREHEAT_1_TEMP_BED 70
|
||||||
#define PREHEAT_1_TEMP_CHAMBER 35
|
|
||||||
#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255
|
#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255
|
||||||
|
|
||||||
#define PREHEAT_2_LABEL "ABS"
|
#define PREHEAT_2_LABEL "ABS"
|
||||||
#define PREHEAT_2_TEMP_HOTEND 240
|
#define PREHEAT_2_TEMP_HOTEND 240
|
||||||
#define PREHEAT_2_TEMP_BED 110
|
#define PREHEAT_2_TEMP_BED 110
|
||||||
#define PREHEAT_2_TEMP_CHAMBER 35
|
|
||||||
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255
|
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1812,10 +1602,6 @@
|
|||||||
// For a purge/clean station mounted on the X axis
|
// For a purge/clean station mounted on the X axis
|
||||||
//#define NOZZLE_CLEAN_NO_Y
|
//#define NOZZLE_CLEAN_NO_Y
|
||||||
|
|
||||||
// Require a minimum hotend temperature for cleaning
|
|
||||||
#define NOZZLE_CLEAN_MIN_TEMP 170
|
|
||||||
//#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe
|
|
||||||
|
|
||||||
// Explicit wipe G-code script applies to a G12 with no arguments.
|
// Explicit wipe G-code script applies to a G12 with no arguments.
|
||||||
//#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0"
|
//#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0"
|
||||||
|
|
||||||
@@ -1851,9 +1637,6 @@
|
|||||||
* View the current statistics with M78.
|
* View the current statistics with M78.
|
||||||
*/
|
*/
|
||||||
//#define PRINTCOUNTER
|
//#define PRINTCOUNTER
|
||||||
#if ENABLED(PRINTCOUNTER)
|
|
||||||
#define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Password
|
* Password
|
||||||
@@ -1898,9 +1681,9 @@
|
|||||||
* Select the language to display on the LCD. These languages are available:
|
* Select the language to display on the LCD. These languages are available:
|
||||||
*
|
*
|
||||||
* en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it,
|
* en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it,
|
||||||
* jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW
|
* jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, tr, uk, vi, zh_CN, zh_TW, test
|
||||||
*
|
*
|
||||||
* :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
|
* :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' }
|
||||||
*/
|
*/
|
||||||
#define LCD_LANGUAGE en
|
#define LCD_LANGUAGE en
|
||||||
|
|
||||||
@@ -1943,6 +1726,16 @@
|
|||||||
*/
|
*/
|
||||||
//#define SDSUPPORT
|
//#define SDSUPPORT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SD CARD: SPI SPEED
|
||||||
|
*
|
||||||
|
* Enable one of the following items for a slower SPI transfer speed.
|
||||||
|
* This may be required to resolve "volume init" errors.
|
||||||
|
*/
|
||||||
|
//#define SPI_SPEED SPI_HALF_SPEED
|
||||||
|
//#define SPI_SPEED SPI_QUARTER_SPEED
|
||||||
|
//#define SPI_SPEED SPI_EIGHTH_SPEED
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SD CARD: ENABLE CRC
|
* SD CARD: ENABLE CRC
|
||||||
*
|
*
|
||||||
@@ -2044,14 +1837,6 @@
|
|||||||
//
|
//
|
||||||
//#define REPRAP_DISCOUNT_SMART_CONTROLLER
|
//#define REPRAP_DISCOUNT_SMART_CONTROLLER
|
||||||
|
|
||||||
//
|
|
||||||
// GT2560 (YHCB2004) LCD Display
|
|
||||||
//
|
|
||||||
// Requires Testato, Koepel softwarewire library and
|
|
||||||
// Andriy Golovnya's LiquidCrystal_AIP31068 library.
|
|
||||||
//
|
|
||||||
//#define YHCB2004
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Original RADDS LCD Display+Encoder+SDCardReader
|
// Original RADDS LCD Display+Encoder+SDCardReader
|
||||||
// http://doku.radds.org/dokumentation/lcd-display/
|
// http://doku.radds.org/dokumentation/lcd-display/
|
||||||
@@ -2202,11 +1987,6 @@
|
|||||||
//
|
//
|
||||||
//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
|
//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
|
||||||
|
|
||||||
//
|
|
||||||
// K.3D Full Graphic Smart Controller
|
|
||||||
//
|
|
||||||
//#define K3D_FULL_GRAPHIC_SMART_CONTROLLER
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ReprapWorld Graphical LCD
|
// ReprapWorld Graphical LCD
|
||||||
// https://reprapworld.com/?products_details&products_id/1218
|
// https://reprapworld.com/?products_details&products_id/1218
|
||||||
@@ -2272,8 +2052,7 @@
|
|||||||
// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout.
|
// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout.
|
||||||
// https://www.aliexpress.com/item/33018110072.html
|
// https://www.aliexpress.com/item/33018110072.html
|
||||||
//
|
//
|
||||||
//#define MKS_LCD12864A
|
//#define MKS_LCD12864
|
||||||
//#define MKS_LCD12864B
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// FYSETC variant of the MINI12864 graphic controller with SD support
|
// FYSETC variant of the MINI12864 graphic controller with SD support
|
||||||
@@ -2304,10 +2083,9 @@
|
|||||||
//
|
//
|
||||||
// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6
|
// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6
|
||||||
// A clone of the RepRapDiscount full graphics display but with
|
// A clone of the RepRapDiscount full graphics display but with
|
||||||
// different pins/wiring (see pins_ANET_10.h). Enable one of these.
|
// different pins/wiring (see pins_ANET_10.h).
|
||||||
//
|
//
|
||||||
//#define ANET_FULL_GRAPHICS_LCD
|
//#define ANET_FULL_GRAPHICS_LCD
|
||||||
//#define ANET_FULL_GRAPHICS_LCD_ALT_WIRING
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// AZSMZ 12864 LCD with SD
|
// AZSMZ 12864 LCD with SD
|
||||||
@@ -2345,7 +2123,7 @@
|
|||||||
//#define OLED_PANEL_TINYBOY2
|
//#define OLED_PANEL_TINYBOY2
|
||||||
|
|
||||||
//
|
//
|
||||||
// MKS OLED 1.3" 128×64 Full Graphics Controller
|
// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER
|
||||||
// https://reprap.org/wiki/MKS_12864OLED
|
// https://reprap.org/wiki/MKS_12864OLED
|
||||||
//
|
//
|
||||||
// Tiny, but very sharp OLED display
|
// Tiny, but very sharp OLED display
|
||||||
@@ -2354,7 +2132,7 @@
|
|||||||
//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
|
//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
|
||||||
|
|
||||||
//
|
//
|
||||||
// Zonestar OLED 128×64 Full Graphics Controller
|
// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER
|
||||||
//
|
//
|
||||||
//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller
|
//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller
|
||||||
//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default)
|
//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default)
|
||||||
@@ -2371,15 +2149,10 @@
|
|||||||
//#define OVERLORD_OLED
|
//#define OVERLORD_OLED
|
||||||
|
|
||||||
//
|
//
|
||||||
// FYSETC OLED 2.42" 128×64 Full Graphics Controller with WS2812 RGB
|
// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB
|
||||||
// Where to find : https://www.aliexpress.com/item/4000345255731.html
|
// Where to find : https://www.aliexpress.com/item/4000345255731.html
|
||||||
//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller
|
//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller
|
||||||
|
|
||||||
//
|
|
||||||
// K.3D SSD1309 OLED 2.42" 128×64 Full Graphics Controller
|
|
||||||
//
|
|
||||||
//#define K3D_242_OLED_CONTROLLER // Software SPI
|
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//========================== Extensible UI Displays ===========================
|
//========================== Extensible UI Displays ===========================
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
@@ -2393,11 +2166,6 @@
|
|||||||
//#define DGUS_LCD_UI_FYSETC
|
//#define DGUS_LCD_UI_FYSETC
|
||||||
//#define DGUS_LCD_UI_HIPRECY
|
//#define DGUS_LCD_UI_HIPRECY
|
||||||
|
|
||||||
//#define DGUS_LCD_UI_MKS
|
|
||||||
#if ENABLED(DGUS_LCD_UI_MKS)
|
|
||||||
#define USE_MKS_GREEN_UI
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Touch-screen LCD for Malyan M200/M300 printers
|
// Touch-screen LCD for Malyan M200/M300 printers
|
||||||
//
|
//
|
||||||
@@ -2422,17 +2190,9 @@
|
|||||||
//#define ANYCUBIC_LCD_DEBUG
|
//#define ANYCUBIC_LCD_DEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028
|
|
||||||
//
|
|
||||||
//#define NEXTION_TFT
|
|
||||||
#if ENABLED(NEXTION_TFT)
|
|
||||||
#define LCD_SERIAL_PORT 1 // Default is 1 for Nextion
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Third-party or vendor-customized controller interfaces.
|
// Third-party or vendor-customized controller interfaces.
|
||||||
// Sources should be installed in 'src/lcd/extui'.
|
// Sources should be installed in 'src/lcd/extensible_ui'.
|
||||||
//
|
//
|
||||||
//#define EXTENSIBLE_UI
|
//#define EXTENSIBLE_UI
|
||||||
|
|
||||||
@@ -2445,98 +2205,22 @@
|
|||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specific TFT Model Presets. Enable one of the following options
|
* TFT Type - Select your Display type
|
||||||
* or enable TFT_GENERIC and set sub-options.
|
*
|
||||||
|
* Available options are:
|
||||||
|
* MKS_TS35_V2_0,
|
||||||
|
* MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35,
|
||||||
|
* MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R
|
||||||
|
* TFT_TRONXY_X5SA, ANYCUBIC_TFT35, LONGER_LK_TFT28
|
||||||
|
* TFT_GENERIC
|
||||||
|
*
|
||||||
|
* For TFT_GENERIC, you need to configure these 3 options:
|
||||||
|
* Driver: TFT_DRIVER
|
||||||
|
* Current Drivers are: AUTO, ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488
|
||||||
|
* Resolution: TFT_WIDTH and TFT_HEIGHT
|
||||||
|
* Interface: TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//
|
|
||||||
// 480x320, 3.5", SPI Display From MKS
|
|
||||||
// Normally used in MKS Robin Nano V2
|
|
||||||
//
|
|
||||||
//#define MKS_TS35_V2_0
|
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240, 2.4", FSMC Display From MKS
|
|
||||||
// Normally used in MKS Robin Nano V1.2
|
|
||||||
//
|
|
||||||
//#define MKS_ROBIN_TFT24
|
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240, 2.8", FSMC Display From MKS
|
|
||||||
// Normally used in MKS Robin Nano V1.2
|
|
||||||
//
|
|
||||||
//#define MKS_ROBIN_TFT28
|
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240, 3.2", FSMC Display From MKS
|
|
||||||
// Normally used in MKS Robin Nano V1.2
|
|
||||||
//
|
|
||||||
//#define MKS_ROBIN_TFT32
|
|
||||||
|
|
||||||
//
|
|
||||||
// 480x320, 3.5", FSMC Display From MKS
|
|
||||||
// Normally used in MKS Robin Nano V1.2
|
|
||||||
//
|
|
||||||
//#define MKS_ROBIN_TFT35
|
|
||||||
|
|
||||||
//
|
|
||||||
// 480x272, 4.3", FSMC Display From MKS
|
|
||||||
//
|
|
||||||
//#define MKS_ROBIN_TFT43
|
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240, 3.2", FSMC Display From MKS
|
|
||||||
// Normally used in MKS Robin
|
|
||||||
//
|
|
||||||
//#define MKS_ROBIN_TFT_V1_1R
|
|
||||||
|
|
||||||
//
|
|
||||||
// 480x320, 3.5", FSMC Stock Display from TronxXY
|
|
||||||
//
|
|
||||||
//#define TFT_TRONXY_X5SA
|
|
||||||
|
|
||||||
//
|
|
||||||
// 480x320, 3.5", FSMC Stock Display from AnyCubic
|
|
||||||
//
|
|
||||||
//#define ANYCUBIC_TFT35
|
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240, 2.8", FSMC Stock Display from Longer/Alfawise
|
|
||||||
//
|
|
||||||
//#define LONGER_LK_TFT28
|
|
||||||
|
|
||||||
//
|
|
||||||
// 320x240, 2.8", FSMC Stock Display from ET4
|
|
||||||
//
|
|
||||||
//#define ANET_ET4_TFT28
|
|
||||||
|
|
||||||
//
|
|
||||||
// 480x320, 3.5", FSMC Stock Display from ET5
|
|
||||||
//
|
|
||||||
//#define ANET_ET5_TFT35
|
|
||||||
|
|
||||||
//
|
|
||||||
// 1024x600, 7", RGB Stock Display from BIQU-BX
|
|
||||||
//
|
|
||||||
//#define BIQU_BX_TFT70
|
|
||||||
|
|
||||||
//
|
|
||||||
// Generic TFT with detailed options
|
|
||||||
//
|
|
||||||
//#define TFT_GENERIC
|
//#define TFT_GENERIC
|
||||||
#if ENABLED(TFT_GENERIC)
|
|
||||||
// :[ 'AUTO', 'ST7735', 'ST7789', 'ST7796', 'R61505', 'ILI9328', 'ILI9341', 'ILI9488' ]
|
|
||||||
#define TFT_DRIVER AUTO
|
|
||||||
|
|
||||||
// Interface. Enable one of the following options:
|
|
||||||
//#define TFT_INTERFACE_FSMC
|
|
||||||
//#define TFT_INTERFACE_SPI
|
|
||||||
|
|
||||||
// TFT Resolution. Enable one of the following options:
|
|
||||||
//#define TFT_RES_320x240
|
|
||||||
//#define TFT_RES_480x272
|
|
||||||
//#define TFT_RES_480x320
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TFT UI - User Interface Selection. Enable one of the following options:
|
* TFT UI - User Interface Selection. Enable one of the following options:
|
||||||
@@ -2552,10 +2236,6 @@
|
|||||||
//#define TFT_COLOR_UI
|
//#define TFT_COLOR_UI
|
||||||
//#define TFT_LVGL_UI
|
//#define TFT_LVGL_UI
|
||||||
|
|
||||||
#if ENABLED(TFT_LVGL_UI)
|
|
||||||
//#define MKS_WIFI_MODULE // MKS WiFi module
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TFT Rotation. Set to one of the following values:
|
* TFT Rotation. Set to one of the following values:
|
||||||
*
|
*
|
||||||
@@ -2576,7 +2256,7 @@
|
|||||||
//#define DWIN_CREALITY_LCD
|
//#define DWIN_CREALITY_LCD
|
||||||
|
|
||||||
//
|
//
|
||||||
// Touch Screen Settings
|
// ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8
|
||||||
//
|
//
|
||||||
//#define TOUCH_SCREEN
|
//#define TOUCH_SCREEN
|
||||||
#if ENABLED(TOUCH_SCREEN)
|
#if ENABLED(TOUCH_SCREEN)
|
||||||
@@ -2585,19 +2265,10 @@
|
|||||||
|
|
||||||
#define TOUCH_SCREEN_CALIBRATION
|
#define TOUCH_SCREEN_CALIBRATION
|
||||||
|
|
||||||
//#define TOUCH_CALIBRATION_X 12316
|
//#define XPT2046_X_CALIBRATION 12316
|
||||||
//#define TOUCH_CALIBRATION_Y -8981
|
//#define XPT2046_Y_CALIBRATION -8981
|
||||||
//#define TOUCH_OFFSET_X -43
|
//#define XPT2046_X_OFFSET -43
|
||||||
//#define TOUCH_OFFSET_Y 257
|
//#define XPT2046_Y_OFFSET 257
|
||||||
//#define TOUCH_ORIENTATION TOUCH_LANDSCAPE
|
|
||||||
|
|
||||||
#if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS)
|
|
||||||
#define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(TFT_COLOR_UI)
|
|
||||||
//#define SINGLE_TOUCH_NAVIGATION
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2690,7 +2361,7 @@
|
|||||||
//#define NEOPIXEL_LED
|
//#define NEOPIXEL_LED
|
||||||
#if ENABLED(NEOPIXEL_LED)
|
#if ENABLED(NEOPIXEL_LED)
|
||||||
#define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
|
#define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h)
|
||||||
//#define NEOPIXEL_PIN 4 // LED driving pin
|
#define NEOPIXEL_PIN 4 // LED driving pin
|
||||||
//#define NEOPIXEL2_TYPE NEOPIXEL_TYPE
|
//#define NEOPIXEL2_TYPE NEOPIXEL_TYPE
|
||||||
//#define NEOPIXEL2_PIN 5
|
//#define NEOPIXEL2_PIN 5
|
||||||
#define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.)
|
#define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.)
|
||||||
@@ -2708,11 +2379,9 @@
|
|||||||
//#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel
|
//#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use some of the NeoPixel LEDs for static (background) lighting
|
// Use a single NeoPixel LED for static (background) lighting
|
||||||
//#define NEOPIXEL_BKGD_INDEX_FIRST 0 // Index of the first background LED
|
//#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use
|
||||||
//#define NEOPIXEL_BKGD_INDEX_LAST 5 // Index of the last background LED
|
//#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W
|
||||||
//#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W
|
|
||||||
//#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -219,7 +219,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
||||||
# MKS GEN L
|
# MKS GEN L
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
||||||
# zrib V2.0 control board (Chinese RAMPS replica)
|
# zrib V2.0 control board (Chinese knock off RAMPS replica)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
||||||
# BigTreeTech or BIQU KFB2.0
|
# BigTreeTech or BIQU KFB2.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
||||||
@@ -323,8 +323,6 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
||||||
# abee Scoovo X9H
|
# abee Scoovo X9H
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
||||||
# Rambo ThinkerV2
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1206)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other ATmega1280, ATmega2560
|
# Other ATmega1280, ATmega2560
|
||||||
@@ -993,5 +991,5 @@ clean:
|
|||||||
|
|
||||||
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter
|
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter
|
||||||
|
|
||||||
# Automatically include the dependency files created by gcc
|
# Automaticaly include the dependency files created by gcc
|
||||||
-include ${patsubst %.o, %.d, ${OBJ}}
|
-include ${patsubst %.o, %.d, ${OBJ}}
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin release version identifier
|
* Marlin release version identifier
|
||||||
*/
|
*/
|
||||||
//#define SHORT_BUILD_VERSION "2.0.8.2"
|
//#define SHORT_BUILD_VERSION "2.0.7.3"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verbose version identifier which should contain a reference to the location
|
* Verbose version identifier which should contain a reference to the location
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
* here we define this default string as the date where the latest release
|
* here we define this default string as the date where the latest release
|
||||||
* version was tagged.
|
* version was tagged.
|
||||||
*/
|
*/
|
||||||
//#define STRING_DISTRIBUTION_DATE "2021-05-29"
|
//#define STRING_DISTRIBUTION_DATE "2023-07-18"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
* has a distinct Github fork— the Source Code URL should just be the main
|
* has a distinct Github fork— the Source Code URL should just be the main
|
||||||
* Marlin repository.
|
* Marlin repository.
|
||||||
*/
|
*/
|
||||||
//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
|
//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default generic printer UUID.
|
* Default generic printer UUID.
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
* The WEBSITE_URL is the location where users can get more information such as
|
* The WEBSITE_URL is the location where users can get more information such as
|
||||||
* documentation about a specific Marlin release.
|
* documentation about a specific Marlin release.
|
||||||
*/
|
*/
|
||||||
//#define WEBSITE_URL "marlinfw.org"
|
//#define WEBSITE_URL "https://marlinfw.org"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the vendor info the serial USB interface, if changable
|
* Set the vendor info the serial USB interface, if changable
|
||||||
|
@@ -24,13 +24,6 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
|
||||||
#ifdef USBCON
|
|
||||||
DefaultSerial1 MSerial0(false, Serial);
|
|
||||||
#ifdef BLUETOOTH
|
|
||||||
BTSerial btSerial(false, bluetoothSerial);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -58,15 +51,6 @@ void HAL_init() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_reboot() {
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
while (1) { /* run out the watchdog */ }
|
|
||||||
#else
|
|
||||||
void (*resetFunc)() = 0; // Declare resetFunc() at address 0
|
|
||||||
resetFunc(); // Jump to address 0
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if ENABLED(SDSUPPORT)
|
||||||
|
|
||||||
#include "../../sd/SdFatUtil.h"
|
#include "../../sd/SdFatUtil.h"
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
#ifdef USBCON
|
#ifdef IS_AT90USB
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
#else
|
#else
|
||||||
#define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion
|
#define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion
|
||||||
@@ -81,47 +81,25 @@ typedef int8_t pin_t;
|
|||||||
//extern uint8_t MCUSR;
|
//extern uint8_t MCUSR;
|
||||||
|
|
||||||
// Serial ports
|
// Serial ports
|
||||||
#ifdef USBCON
|
#ifdef IS_AT90USB
|
||||||
#include "../../core/serial_hook.h"
|
#define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial)
|
||||||
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
|
||||||
extern DefaultSerial1 MSerial0;
|
|
||||||
#ifdef BLUETOOTH
|
|
||||||
typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial;
|
|
||||||
extern BTSerial btSerial;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
|
|
||||||
#else
|
#else
|
||||||
#if !WITHIN(SERIAL_PORT, -1, 3)
|
#if !WITHIN(SERIAL_PORT, -1, 3)
|
||||||
#error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL1 customizedSerial1
|
#define MYSERIAL0 customizedSerial1
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if !WITHIN(SERIAL_PORT_2, -1, 3)
|
#if !WITHIN(SERIAL_PORT_2, -1, 3)
|
||||||
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL2 customizedSerial2
|
#define MYSERIAL1 customizedSerial2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
|
||||||
#if !WITHIN(SERIAL_PORT_3, -1, 3)
|
|
||||||
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
|
||||||
#endif
|
|
||||||
#define MYSERIAL3 customizedSerial3
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
|
||||||
#if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
|
|
||||||
#error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
|
||||||
#endif
|
|
||||||
#define MMU2_SERIAL mmuSerial
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
|
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
|
||||||
#error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
#error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
#endif
|
||||||
#define LCD_SERIAL lcdSerial
|
#define LCD_SERIAL lcdSerial
|
||||||
#if HAS_DGUS_LCD
|
#if HAS_DGUS_LCD
|
||||||
@@ -142,18 +120,14 @@ void HAL_init();
|
|||||||
inline void HAL_clear_reset_source() { MCUSR = 0; }
|
inline void HAL_clear_reset_source() { MCUSR = 0; }
|
||||||
inline uint8_t HAL_get_reset_source() { return MCUSR; }
|
inline uint8_t HAL_get_reset_source() { return MCUSR; }
|
||||||
|
|
||||||
void HAL_reboot();
|
inline void HAL_reboot() {} // reboot the board or restart the bootloader
|
||||||
|
|
||||||
#if GCC_VERSION <= 50000
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
extern "C" {
|
||||||
#endif
|
int freeMemory();
|
||||||
|
}
|
||||||
extern "C" int freeMemory();
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
#if GCC_VERSION <= 50000
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
#ifdef DIDR2
|
#ifdef DIDR2
|
||||||
|
@@ -34,17 +34,17 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
OUT_WRITE(SS_PIN, HIGH);
|
||||||
SET_OUTPUT(SD_SCK_PIN);
|
SET_OUTPUT(SCK_PIN);
|
||||||
SET_INPUT(SD_MISO_PIN);
|
SET_INPUT(MISO_PIN);
|
||||||
SET_OUTPUT(SD_MOSI_PIN);
|
SET_OUTPUT(MOSI_PIN);
|
||||||
|
|
||||||
#if DISABLED(SOFTWARE_SPI)
|
#if DISABLED(SOFTWARE_SPI)
|
||||||
// SS must be in output mode even it is not chip select
|
// SS must be in output mode even it is not chip select
|
||||||
//SET_OUTPUT(SD_SS_PIN);
|
//SET_OUTPUT(SS_PIN);
|
||||||
// set SS high - may be chip select for another SPI device
|
// set SS high - may be chip select for another SPI device
|
||||||
//#if SET_SPI_SS_HIGH
|
//#if SET_SPI_SS_HIGH
|
||||||
//WRITE(SD_SS_PIN, HIGH);
|
//WRITE(SS_PIN, HIGH);
|
||||||
//#endif
|
//#endif
|
||||||
// set a default rate
|
// set a default rate
|
||||||
spiInit(1);
|
spiInit(1);
|
||||||
@@ -88,7 +88,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** SPI read data */
|
/** SPI read data */
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
||||||
if (nbyte-- == 0) return;
|
if (nbyte-- == 0) return;
|
||||||
SPDR = 0xFF;
|
SPDR = 0xFF;
|
||||||
for (uint16_t i = 0; i < nbyte; i++) {
|
for (uint16_t i = 0; i < nbyte; i++) {
|
||||||
@@ -107,7 +107,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** SPI send block */
|
/** SPI send block */
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
SPDR = token;
|
SPDR = token;
|
||||||
for (uint16_t i = 0; i < 512; i += 2) {
|
for (uint16_t i = 0; i < 512; i += 2) {
|
||||||
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
||||||
@@ -195,19 +195,19 @@ void spiBegin() {
|
|||||||
// no interrupts during byte receive - about 8µs
|
// no interrupts during byte receive - about 8µs
|
||||||
cli();
|
cli();
|
||||||
// output pin high - like sending 0xFF
|
// output pin high - like sending 0xFF
|
||||||
WRITE(SD_MOSI_PIN, HIGH);
|
WRITE(MOSI_PIN, HIGH);
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SD_SCK_PIN, HIGH);
|
WRITE(SCK_PIN, HIGH);
|
||||||
|
|
||||||
nop; // adjust so SCK is nice
|
nop; // adjust so SCK is nice
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
|
|
||||||
if (READ(SD_MISO_PIN)) data |= 1;
|
if (READ(MISO_PIN)) data |= 1;
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
@@ -215,7 +215,7 @@ void spiBegin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Soft SPI read data
|
// Soft SPI read data
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
buf[i] = spiRec();
|
buf[i] = spiRec();
|
||||||
}
|
}
|
||||||
@@ -225,10 +225,10 @@ void spiBegin() {
|
|||||||
// no interrupts during byte send - about 8µs
|
// no interrupts during byte send - about 8µs
|
||||||
cli();
|
cli();
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SCK_PIN, LOW);
|
||||||
WRITE(SD_MOSI_PIN, data & 0x80);
|
WRITE(MOSI_PIN, data & 0x80);
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
WRITE(SD_SCK_PIN, HIGH);
|
WRITE(SCK_PIN, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
nop; // hold SCK high for a few ns
|
nop; // hold SCK high for a few ns
|
||||||
@@ -236,13 +236,13 @@ void spiBegin() {
|
|||||||
nop;
|
nop;
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SCK_PIN, LOW);
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Soft SPI send block
|
// Soft SPI send block
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
spiSend(token);
|
spiSend(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
spiSend(buf[i]);
|
spiSend(buf[i]);
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
#if !IS_AT90USB && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "../../MarlinCore.h"
|
#include "../../MarlinCore.h"
|
||||||
@@ -556,6 +556,161 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Imports from print.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(char c, int base) {
|
||||||
|
print((long)c, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(unsigned char b, int base) {
|
||||||
|
print((unsigned long)b, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(int n, int base) {
|
||||||
|
print((long)n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(unsigned int n, int base) {
|
||||||
|
print((unsigned long)n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(long n, int base) {
|
||||||
|
if (base == 0) write(n);
|
||||||
|
else if (base == 10) {
|
||||||
|
if (n < 0) { print('-'); n = -n; }
|
||||||
|
printNumber(n, 10);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(unsigned long n, int base) {
|
||||||
|
if (base == 0) write(n);
|
||||||
|
else printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(double n, int digits) {
|
||||||
|
printFloat(n, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println() {
|
||||||
|
print('\r');
|
||||||
|
print('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(const String& s) {
|
||||||
|
print(s);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(const char c[]) {
|
||||||
|
print(c);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(char c, int base) {
|
||||||
|
print(c, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(unsigned char b, int base) {
|
||||||
|
print(b, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(int n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(unsigned int n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(long n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(unsigned long n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(double n, int digits) {
|
||||||
|
print(n, digits);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private Methods
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::printNumber(unsigned long n, uint8_t base) {
|
||||||
|
if (n) {
|
||||||
|
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
||||||
|
int8_t i = 0;
|
||||||
|
while (n) {
|
||||||
|
buf[i++] = n % base;
|
||||||
|
n /= base;
|
||||||
|
}
|
||||||
|
while (i--)
|
||||||
|
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print('0');
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
|
||||||
|
// Handle negative numbers
|
||||||
|
if (number < 0.0) {
|
||||||
|
print('-');
|
||||||
|
number = -number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Round correctly so that print(1.999, 2) prints as "2.00"
|
||||||
|
double rounding = 0.5;
|
||||||
|
LOOP_L_N(i, digits) rounding *= 0.1;
|
||||||
|
number += rounding;
|
||||||
|
|
||||||
|
// Extract the integer part of the number and print it
|
||||||
|
unsigned long int_part = (unsigned long)number;
|
||||||
|
double remainder = number - (double)int_part;
|
||||||
|
print(int_part);
|
||||||
|
|
||||||
|
// Print the decimal point, but only if there are digits beyond
|
||||||
|
if (digits) {
|
||||||
|
print('.');
|
||||||
|
// Extract digits from the remainder one at a time
|
||||||
|
while (digits--) {
|
||||||
|
remainder *= 10.0;
|
||||||
|
int toPrint = int(remainder);
|
||||||
|
print(toPrint);
|
||||||
|
remainder -= toPrint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Hookup ISR handlers
|
// Hookup ISR handlers
|
||||||
ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) {
|
ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) {
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::store_rxd_char();
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::store_rxd_char();
|
||||||
@@ -565,9 +720,11 @@ ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) {
|
|||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::_tx_udr_empty_irq();
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Because of the template definition above, it's required to instantiate the template to have all methods generated
|
// Preinstantiate
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>;
|
||||||
MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
|
||||||
|
// Instantiate
|
||||||
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
|
|
||||||
@@ -580,26 +737,13 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
|||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>::_tx_udr_empty_irq();
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
// Preinstantiate
|
||||||
MSerialT2 customizedSerial2(MSerialT2::HasEmergencyParser);
|
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>;
|
||||||
|
|
||||||
#endif // SERIAL_PORT_2
|
// Instantiate
|
||||||
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
#endif
|
||||||
|
|
||||||
// Hookup ISR handlers
|
|
||||||
ISR(SERIAL_REGNAME(USART, SERIAL_PORT_3, _RX_vect)) {
|
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_3>>::store_rxd_char();
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(SERIAL_REGNAME(USART, SERIAL_PORT_3, _UDRE_vect)) {
|
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_3>>::_tx_udr_empty_irq();
|
|
||||||
}
|
|
||||||
|
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> >;
|
|
||||||
MSerialT3 customizedSerial3(MSerialT3::HasEmergencyParser);
|
|
||||||
|
|
||||||
#endif // SERIAL_PORT_3
|
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
|
||||||
@@ -611,10 +755,13 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
|||||||
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq();
|
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
template class MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> >;
|
// Preinstantiate
|
||||||
MSerialMMU2 mmuSerial(MSerialMMU2::HasEmergencyParser);
|
template class MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>;
|
||||||
|
|
||||||
#endif // MMU2_SERIAL_PORT
|
// Instantiate
|
||||||
|
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>> mmuSerial;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
|
||||||
@@ -626,8 +773,11 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
|||||||
MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>>::_tx_udr_empty_irq();
|
MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
template class MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> >;
|
// Preinstantiate
|
||||||
MSerialLCD lcdSerial(MSerialLCD::HasEmergencyParser);
|
template class MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>>;
|
||||||
|
|
||||||
|
// Instantiate
|
||||||
|
MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>> lcdSerial;
|
||||||
|
|
||||||
#if HAS_DGUS_LCD
|
#if HAS_DGUS_LCD
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
@@ -640,13 +790,13 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // LCD_SERIAL_PORT
|
#endif
|
||||||
|
|
||||||
#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H)
|
#endif // !IS_AT90USB && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H)
|
||||||
|
|
||||||
// For AT90USB targets use the UART for BT interfacing
|
// For AT90USB targets use the UART for BT interfacing
|
||||||
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
#if BOTH(IS_AT90USB, BLUETOOTH)
|
||||||
MSerialBT bluetoothSerial(false);
|
HardwareSerial bluetoothSerial;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
@@ -34,7 +34,6 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
#ifndef SERIAL_PORT
|
||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
@@ -136,6 +135,10 @@
|
|||||||
UART_DECL(3);
|
UART_DECL(3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DEC 10
|
||||||
|
#define HEX 16
|
||||||
|
#define OCT 8
|
||||||
|
#define BIN 2
|
||||||
#define BYTE 0
|
#define BYTE 0
|
||||||
|
|
||||||
// Templated type selector
|
// Templated type selector
|
||||||
@@ -199,30 +202,60 @@
|
|||||||
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
||||||
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
FORCE_INLINE static void store_rxd_char();
|
FORCE_INLINE static void store_rxd_char();
|
||||||
FORCE_INLINE static void _tx_udr_empty_irq();
|
FORCE_INLINE static void _tx_udr_empty_irq();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void begin(const long);
|
MarlinSerial() {};
|
||||||
static void end();
|
static void begin(const long);
|
||||||
static int peek();
|
static void end();
|
||||||
static int read();
|
static int peek();
|
||||||
static void flush();
|
static int read();
|
||||||
static ring_buffer_pos_t available();
|
static void flush();
|
||||||
static void write(const uint8_t c);
|
static ring_buffer_pos_t available();
|
||||||
static void flushTX();
|
static void write(const uint8_t c);
|
||||||
#if HAS_DGUS_LCD
|
static void flushTX();
|
||||||
static ring_buffer_pos_t get_tx_buffer_free();
|
#if HAS_DGUS_LCD
|
||||||
#endif
|
static ring_buffer_pos_t get_tx_buffer_free();
|
||||||
|
#endif
|
||||||
|
|
||||||
enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
|
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
|
||||||
|
|
||||||
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
|
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
||||||
|
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
||||||
|
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
||||||
|
FORCE_INLINE static void print(const char* str) { write(str); }
|
||||||
|
|
||||||
|
static void print(char, int = BYTE);
|
||||||
|
static void print(unsigned char, int = BYTE);
|
||||||
|
static void print(int, int = DEC);
|
||||||
|
static void print(unsigned int, int = DEC);
|
||||||
|
static void print(long, int = DEC);
|
||||||
|
static void print(unsigned long, int = DEC);
|
||||||
|
static void print(double, int = 2);
|
||||||
|
|
||||||
|
static void println(const String& s);
|
||||||
|
static void println(const char[]);
|
||||||
|
static void println(char, int = BYTE);
|
||||||
|
static void println(unsigned char, int = BYTE);
|
||||||
|
static void println(int, int = DEC);
|
||||||
|
static void println(unsigned int, int = DEC);
|
||||||
|
static void println(long, int = DEC);
|
||||||
|
static void println(unsigned long, int = DEC);
|
||||||
|
static void println(double, int = 2);
|
||||||
|
static void println();
|
||||||
|
operator bool() { return true; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void printNumber(unsigned long, const uint8_t);
|
||||||
|
static void printFloat(double, uint8_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
@@ -237,18 +270,12 @@
|
|||||||
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
|
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
||||||
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
|
||||||
extern MSerialT1 customizedSerial1;
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
|
||||||
extern MSerialT2 customizedSerial2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
||||||
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
|
||||||
extern MSerialT3 customizedSerial3;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // !USBCON
|
#endif // !USBCON
|
||||||
@@ -257,41 +284,49 @@
|
|||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
struct MMU2SerialCfg {
|
struct MMU2SerialCfg {
|
||||||
static constexpr int PORT = serial;
|
static constexpr int PORT = serial;
|
||||||
static constexpr unsigned int RX_SIZE = 32;
|
|
||||||
static constexpr unsigned int TX_SIZE = 32;
|
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
static constexpr bool EMERGENCYPARSER = false;
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
|
static constexpr unsigned int RX_SIZE = 32;
|
||||||
|
static constexpr unsigned int TX_SIZE = 32;
|
||||||
static constexpr bool RX_OVERRUNS = false;
|
static constexpr bool RX_OVERRUNS = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> > > MSerialMMU2;
|
extern MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>> mmuSerial;
|
||||||
extern MSerialMMU2 mmuSerial;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
struct LCDSerialCfg {
|
struct LCDSerialCfg {
|
||||||
static constexpr int PORT = serial;
|
static constexpr int PORT = serial;
|
||||||
static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64);
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128);
|
static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
#if HAS_DGUS_LCD
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE;
|
||||||
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE;
|
||||||
|
static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
||||||
|
#elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON)
|
||||||
|
static constexpr unsigned int RX_SIZE = 64;
|
||||||
|
static constexpr unsigned int TX_SIZE = 128;
|
||||||
|
static constexpr bool RX_OVERRUNS = false;
|
||||||
|
#else
|
||||||
|
static constexpr unsigned int RX_SIZE = 64;
|
||||||
|
static constexpr unsigned int TX_SIZE = 128;
|
||||||
|
static constexpr bool RX_OVERRUNS = false
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;
|
extern MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>> lcdSerial;
|
||||||
extern MSerialLCD lcdSerial;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use the UART for Bluetooth in AT90USB configurations
|
// Use the UART for Bluetooth in AT90USB configurations
|
||||||
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
#if BOTH(IS_AT90USB, BLUETOOTH)
|
||||||
typedef Serial1Class<HardwareSerial> MSerialBT;
|
extern HardwareSerial bluetoothSerial;
|
||||||
extern MSerialBT bluetoothSerial;
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -40,13 +40,13 @@ bool PersistentStore::access_start() { return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
// EEPROM has only ~100,000 write cycles,
|
||||||
|
// so only write bytes that have changed!
|
||||||
|
if (v != eeprom_read_byte(p)) {
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -59,7 +59,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
|
@@ -124,7 +124,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MAX_PIN);
|
_ATTACH(X_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(X_MAX_PIN);
|
pciSetup(X_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -132,7 +132,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MIN_PIN);
|
_ATTACH(X_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(X_MIN_PIN);
|
pciSetup(X_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -140,7 +140,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MAX_PIN);
|
_ATTACH(Y_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(Y_MAX_PIN);
|
pciSetup(Y_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -148,7 +148,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MIN_PIN);
|
_ATTACH(Y_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(Y_MIN_PIN);
|
pciSetup(Y_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -156,7 +156,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MAX_PIN);
|
_ATTACH(Z_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(Z_MAX_PIN);
|
pciSetup(Z_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -164,7 +164,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PIN);
|
_ATTACH(Z_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(Z_MIN_PIN);
|
pciSetup(Z_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -172,7 +172,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MAX_PIN);
|
_ATTACH(X2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(X2_MAX_PIN);
|
pciSetup(X2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -180,7 +180,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MIN_PIN);
|
_ATTACH(X2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(X2_MIN_PIN);
|
pciSetup(X2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -188,7 +188,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MAX_PIN);
|
_ATTACH(Y2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(Y2_MAX_PIN);
|
pciSetup(Y2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -196,7 +196,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MIN_PIN);
|
_ATTACH(Y2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(Y2_MIN_PIN);
|
pciSetup(Y2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -204,7 +204,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MAX_PIN);
|
_ATTACH(Z2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(Z2_MAX_PIN);
|
pciSetup(Z2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -212,7 +212,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MIN_PIN);
|
_ATTACH(Z2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(Z2_MIN_PIN);
|
pciSetup(Z2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -220,7 +220,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MAX_PIN);
|
_ATTACH(Z3_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(Z3_MAX_PIN);
|
pciSetup(Z3_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -228,7 +228,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MIN_PIN);
|
_ATTACH(Z3_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(Z3_MIN_PIN);
|
pciSetup(Z3_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -236,7 +236,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MAX_PIN);
|
_ATTACH(Z4_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable");
|
||||||
pciSetup(Z4_MAX_PIN);
|
pciSetup(Z4_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -244,7 +244,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MIN_PIN);
|
_ATTACH(Z4_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable");
|
||||||
pciSetup(Z4_MIN_PIN);
|
pciSetup(Z4_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -252,7 +252,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
_ATTACH(Z_MIN_PROBE_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable");
|
||||||
pciSetup(Z_MIN_PROBE_PIN);
|
pciSetup(Z_MIN_PROBE_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -241,7 +241,7 @@ uint8_t extDigitalRead(const int8_t pin) {
|
|||||||
*
|
*
|
||||||
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
||||||
*/
|
*/
|
||||||
uint16_t set_pwm_frequency_hz(const_float_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;
|
float count = 0;
|
||||||
if (hz > 0 && (dca || dcb || dcc)) {
|
if (hz > 0 && (dca || dcb || dcc)) {
|
||||||
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
||||||
|
@@ -285,7 +285,7 @@ enum ClockSource2 : char {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Determine which harware PWMs are already in use
|
// Determine which harware PWMs are already in use
|
||||||
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
|
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN)
|
||||||
#if PIN_EXISTS(CONTROLLER_FAN)
|
#if PIN_EXISTS(CONTROLLER_FAN)
|
||||||
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
||||||
#else
|
#else
|
||||||
|
@@ -56,10 +56,3 @@
|
|||||||
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
||||||
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* Postmortem debugging
|
|
||||||
*/
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
#error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
|
|
||||||
#endif
|
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
// portModeRegister takes a different argument
|
// portModeRegister takes a different argument
|
||||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p)
|
||||||
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
||||||
|
|
||||||
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
||||||
@@ -235,8 +235,8 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin");
|
|||||||
|
|
||||||
inline void com_print(const uint8_t N, const uint8_t Z) {
|
inline void com_print(const uint8_t N, const uint8_t Z) {
|
||||||
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
||||||
SERIAL_ECHOPAIR(" COM", AS_CHAR('0' + N));
|
SERIAL_ECHOPGM(" COM");
|
||||||
SERIAL_CHAR(Z);
|
SERIAL_CHAR('0' + N, Z);
|
||||||
SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,8 +247,8 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
||||||
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
||||||
|
|
||||||
SERIAL_ECHOPAIR(" TIMER", AS_CHAR(T + '0'));
|
SERIAL_ECHOPGM(" TIMER");
|
||||||
SERIAL_CHAR(L);
|
SERIAL_CHAR(T + '0', L);
|
||||||
SERIAL_ECHO_SP(3);
|
SERIAL_ECHO_SP(3);
|
||||||
|
|
||||||
if (N == 3) {
|
if (N == 3) {
|
||||||
@@ -262,11 +262,19 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
SERIAL_ECHOPAIR(" WGM: ", WGM);
|
SERIAL_ECHOPAIR(" WGM: ", WGM);
|
||||||
com_print(T,L);
|
com_print(T,L);
|
||||||
SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
||||||
SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "A: ", *TCCRA);
|
|
||||||
SERIAL_ECHOPAIR(" TCCR", AS_CHAR(T + '0'), "B: ", *TCCRB);
|
SERIAL_ECHOPGM(" TCCR");
|
||||||
|
SERIAL_CHAR(T + '0');
|
||||||
|
SERIAL_ECHOPAIR("A: ", *TCCRA);
|
||||||
|
|
||||||
|
SERIAL_ECHOPGM(" TCCR");
|
||||||
|
SERIAL_CHAR(T + '0');
|
||||||
|
SERIAL_ECHOPAIR("B: ", *TCCRB);
|
||||||
|
|
||||||
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
||||||
SERIAL_ECHOPAIR(" TIMSK", AS_CHAR(T + '0'), ": ", *TMSK);
|
SERIAL_ECHOPGM(" TIMSK");
|
||||||
|
SERIAL_CHAR(T + '0');
|
||||||
|
SERIAL_ECHOPAIR(": ", *TMSK);
|
||||||
|
|
||||||
const uint8_t OCIE = L - 'A' + 1;
|
const uint8_t OCIE = L - 'A' + 1;
|
||||||
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
||||||
|
@@ -51,15 +51,15 @@
|
|||||||
#define AVR_SS_PIN 16
|
#define AVR_SS_PIN 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SCK_PIN
|
||||||
#define SD_SCK_PIN AVR_SCK_PIN
|
#define SCK_PIN AVR_SCK_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MISO_PIN
|
#ifndef MISO_PIN
|
||||||
#define SD_MISO_PIN AVR_MISO_PIN
|
#define MISO_PIN AVR_MISO_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MOSI_PIN
|
#ifndef MOSI_PIN
|
||||||
#define SD_MOSI_PIN AVR_MOSI_PIN
|
#define MOSI_PIN AVR_MOSI_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_SS_PIN
|
#ifndef SS_PIN
|
||||||
#define SD_SS_PIN AVR_SS_PIN
|
#define SS_PIN AVR_SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
342
Marlin/src/HAL/DUE/DebugMonitor.cpp
Normal file
342
Marlin/src/HAL/DUE/DebugMonitor.cpp
Normal file
@@ -0,0 +1,342 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
|
#include "../../core/macros.h"
|
||||||
|
#include "../../core/serial.h"
|
||||||
|
|
||||||
|
#include "../shared/backtrace/unwinder.h"
|
||||||
|
#include "../shared/backtrace/unwmemaccess.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
// Debug monitor that dumps to the Programming port all status when
|
||||||
|
// an exception or WDT timeout happens - And then resets the board
|
||||||
|
|
||||||
|
// All the Monitor routines must run with interrupts disabled and
|
||||||
|
// under an ISR execution context. That is why we cannot reuse the
|
||||||
|
// Serial interrupt routines or any C runtime, as we don't know the
|
||||||
|
// state we are when running them
|
||||||
|
|
||||||
|
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
||||||
|
#define sw_barrier() __asm__ volatile("": : :"memory");
|
||||||
|
|
||||||
|
// (re)initialize UART0 as a monitor output to 250000,n,8,1
|
||||||
|
static void TXBegin() {
|
||||||
|
|
||||||
|
// Disable UART interrupt in NVIC
|
||||||
|
NVIC_DisableIRQ( UART_IRQn );
|
||||||
|
|
||||||
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
|
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
// Disable clock
|
||||||
|
pmc_disable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Configure PMC
|
||||||
|
pmc_enable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Disable PDC channel
|
||||||
|
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
||||||
|
|
||||||
|
// Reset and disable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
||||||
|
|
||||||
|
// Configure mode: 8bit, No parity, 1 bit stop
|
||||||
|
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
||||||
|
|
||||||
|
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
||||||
|
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
||||||
|
|
||||||
|
// Enable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send character through UART with no interrupts
|
||||||
|
static void TX(char c) {
|
||||||
|
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
||||||
|
UART->UART_THR = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send String through UART
|
||||||
|
static void TX(const char* s) {
|
||||||
|
while (*s) TX(*s++);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TXDigit(uint32_t d) {
|
||||||
|
if (d < 10) TX((char)(d+'0'));
|
||||||
|
else if (d < 16) TX((char)(d+'A'-10));
|
||||||
|
else TX('?');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send Hex number thru UART
|
||||||
|
static void TXHex(uint32_t v) {
|
||||||
|
TX("0x");
|
||||||
|
for (uint8_t i = 0; i < 8; i++, v <<= 4)
|
||||||
|
TXDigit((v >> 28) & 0xF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send Decimal number thru UART
|
||||||
|
static void TXDec(uint32_t v) {
|
||||||
|
if (!v) {
|
||||||
|
TX('0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char nbrs[14];
|
||||||
|
char *p = &nbrs[0];
|
||||||
|
while (v != 0) {
|
||||||
|
*p++ = '0' + (v % 10);
|
||||||
|
v /= 10;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
p--;
|
||||||
|
TX(*p);
|
||||||
|
} while (p != &nbrs[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dump a backtrace entry
|
||||||
|
static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
||||||
|
int* p = (int*)ctx;
|
||||||
|
|
||||||
|
(*p)++;
|
||||||
|
TX('#'); TXDec(*p); TX(" : ");
|
||||||
|
TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function);
|
||||||
|
TX('+'); TXDec(bte->address - bte->function);
|
||||||
|
TX(" PC:");TXHex(bte->address); TX('\n');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef UNW_DEBUG
|
||||||
|
void UnwPrintf(const char* format, ...) {
|
||||||
|
char dest[256];
|
||||||
|
va_list argptr;
|
||||||
|
va_start(argptr, format);
|
||||||
|
vsprintf(dest, format, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
TX(&dest[0]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Table of function pointers for passing to the unwinder */
|
||||||
|
static const UnwindCallbacks UnwCallbacks = {
|
||||||
|
UnwReportOut,
|
||||||
|
UnwReadW,
|
||||||
|
UnwReadH,
|
||||||
|
UnwReadB
|
||||||
|
#ifdef UNW_DEBUG
|
||||||
|
, UnwPrintf
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HardFaultHandler_C:
|
||||||
|
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
|
||||||
|
* as the parameter. We can then read the values from the stack and place them
|
||||||
|
* into local variables for ease of reading.
|
||||||
|
* We then read the various Fault Status and Address Registers to help decode
|
||||||
|
* cause of the fault.
|
||||||
|
* The function ends with a BKPT instruction to force control back into the debugger
|
||||||
|
*/
|
||||||
|
extern "C"
|
||||||
|
void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) {
|
||||||
|
|
||||||
|
static const char* causestr[] = {
|
||||||
|
"NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC"
|
||||||
|
};
|
||||||
|
|
||||||
|
UnwindFrame btf;
|
||||||
|
|
||||||
|
// Dump report to the Programming port (interrupts are DISABLED)
|
||||||
|
TXBegin();
|
||||||
|
TX("\n\n## Software Fault detected ##\n");
|
||||||
|
TX("Cause: "); TX(causestr[cause]); TX('\n');
|
||||||
|
|
||||||
|
TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n');
|
||||||
|
TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n');
|
||||||
|
TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n');
|
||||||
|
TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n');
|
||||||
|
TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n');
|
||||||
|
TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n');
|
||||||
|
TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n');
|
||||||
|
TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n');
|
||||||
|
|
||||||
|
// Configurable Fault Status Register
|
||||||
|
// Consists of MMSR, BFSR and UFSR
|
||||||
|
TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n');
|
||||||
|
|
||||||
|
// Hard Fault Status Register
|
||||||
|
TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n');
|
||||||
|
|
||||||
|
// Debug Fault Status Register
|
||||||
|
TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n');
|
||||||
|
|
||||||
|
// Auxiliary Fault Status Register
|
||||||
|
TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n');
|
||||||
|
|
||||||
|
// Read the Fault Address Registers. These may not contain valid values.
|
||||||
|
// Check BFARVALID/MMARVALID to see if they are valid values
|
||||||
|
// MemManage Fault Address Register
|
||||||
|
TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n');
|
||||||
|
|
||||||
|
// Bus Fault Address Register
|
||||||
|
TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n');
|
||||||
|
|
||||||
|
TX("ExcLR: "); TXHex(lr); TX('\n');
|
||||||
|
TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n');
|
||||||
|
|
||||||
|
btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer
|
||||||
|
btf.fp = btf.sp;
|
||||||
|
btf.lr = ((unsigned long)sp[5]);
|
||||||
|
btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it
|
||||||
|
|
||||||
|
// Perform a backtrace
|
||||||
|
TX("\nBacktrace:\n\n");
|
||||||
|
int ctr = 0;
|
||||||
|
UnwindStart(&btf, &UnwCallbacks, &ctr);
|
||||||
|
|
||||||
|
// Disable all NVIC interrupts
|
||||||
|
NVIC->ICER[0] = 0xFFFFFFFF;
|
||||||
|
NVIC->ICER[1] = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
// Relocate VTOR table to default position
|
||||||
|
SCB->VTOR = 0;
|
||||||
|
|
||||||
|
// Disable USB
|
||||||
|
otg_disable();
|
||||||
|
|
||||||
|
// Restart watchdog
|
||||||
|
WDT_Restart(WDT);
|
||||||
|
|
||||||
|
// Reset controller
|
||||||
|
NVIC_SystemReset();
|
||||||
|
for (;;) WDT_Restart(WDT);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void NMI_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#0")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void HardFault_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#1")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void MemManage_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#2")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void BusFault_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#3")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void UsageFault_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#4")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void DebugMon_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#5")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
|
||||||
|
__attribute__((naked)) void WDT_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#6")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void RSTC_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#7")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ARDUINO_ARCH_SAM
|
@@ -40,8 +40,6 @@ uint16_t HAL_adc_result;
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial());
|
|
||||||
|
|
||||||
// HAL initialization task
|
// HAL initialization task
|
||||||
void HAL_init() {
|
void HAL_init() {
|
||||||
// Initialize the USB stack
|
// Initialize the USB stack
|
||||||
@@ -49,7 +47,6 @@ void HAL_init() {
|
|||||||
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||||
#endif
|
#endif
|
||||||
usb_task_init();
|
usb_task_init();
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// HAL idle task
|
// HAL idle task
|
||||||
@@ -77,8 +74,6 @@ uint8_t HAL_get_reset_source() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_reboot() { rstc_start_software_reset(RSTC); }
|
|
||||||
|
|
||||||
void _delay_ms(const int delay_ms) {
|
void _delay_ms(const int delay_ms) {
|
||||||
// Todo: port for Due?
|
// Todo: port for Due?
|
||||||
delay(delay_ms);
|
delay(delay_ms);
|
||||||
@@ -107,18 +102,4 @@ uint16_t HAL_adc_get_result() {
|
|||||||
return HAL_adc_result;
|
return HAL_adc_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forward the default serial ports
|
|
||||||
#if USING_HW_SERIAL0
|
|
||||||
DefaultSerial1 MSerial0(false, Serial);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
DefaultSerial2 MSerial1(false, Serial1);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
DefaultSerial3 MSerial2(false, Serial2);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
DefaultSerial4 MSerial3(false, Serial3);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
@@ -36,61 +36,36 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "../../core/serial_hook.h"
|
#define _MSERIAL(X) Serial##X
|
||||||
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
|
||||||
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
|
||||||
extern DefaultSerial1 MSerial0;
|
|
||||||
extern DefaultSerial2 MSerial1;
|
|
||||||
extern DefaultSerial3 MSerial2;
|
|
||||||
extern DefaultSerial4 MSerial3;
|
|
||||||
|
|
||||||
#define _MSERIAL(X) MSerial##X
|
|
||||||
#define MSERIAL(X) _MSERIAL(X)
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
#define Serial0 Serial
|
||||||
|
|
||||||
|
// Define MYSERIAL0/1 before MarlinSerial includes!
|
||||||
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#define MYSERIAL1 customizedSerial1
|
#define MYSERIAL0 customizedSerial1
|
||||||
#elif WITHIN(SERIAL_PORT, 0, 3)
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
#define MYSERIAL0 MSERIAL(SERIAL_PORT)
|
||||||
#else
|
#else
|
||||||
#error "The required SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
#error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#define MYSERIAL2 customizedSerial2
|
#define MYSERIAL1 customizedSerial2
|
||||||
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
#define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
|
||||||
#if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
|
|
||||||
#define MYSERIAL3 customizedSerial3
|
|
||||||
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
|
||||||
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
|
||||||
#else
|
|
||||||
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
|
||||||
#if WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
|
||||||
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
|
||||||
#else
|
|
||||||
#error "MMU2_SERIAL_PORT must be from 0 to 3."
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if WITHIN(LCD_SERIAL_PORT, 0, 3)
|
#if LCD_SERIAL_PORT == -1
|
||||||
|
#define LCD_SERIAL lcdSerial
|
||||||
|
#elif WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
#else
|
#else
|
||||||
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
#error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -100,6 +75,16 @@ extern DefaultSerial4 MSerial3;
|
|||||||
// On AVR this is in math.h?
|
// On AVR this is in math.h?
|
||||||
#define square(x) ((x)*(x))
|
#define square(x) ((x)*(x))
|
||||||
|
|
||||||
|
#ifndef strncpy_P
|
||||||
|
#define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Fix bug in pgm_read_ptr
|
||||||
|
#undef pgm_read_ptr
|
||||||
|
#define pgm_read_ptr(addr) (*((void**)(addr)))
|
||||||
|
#undef pgm_read_word
|
||||||
|
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
|
||||||
|
|
||||||
typedef int8_t pin_t;
|
typedef int8_t pin_t;
|
||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS
|
||||||
@@ -120,7 +105,7 @@ void sei(); // Enable interrupts
|
|||||||
void HAL_clear_reset_source(); // clear reset reason
|
void HAL_clear_reset_source(); // clear reset reason
|
||||||
uint8_t HAL_get_reset_source(); // get reset reason
|
uint8_t HAL_get_reset_source(); // get reset reason
|
||||||
|
|
||||||
void HAL_reboot();
|
inline void HAL_reboot() {} // reboot the board or restart the bootloader
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC
|
// ADC
|
||||||
@@ -168,16 +153,10 @@ void HAL_init();
|
|||||||
//
|
//
|
||||||
void _delay_ms(const int delay);
|
void _delay_ms(const int delay);
|
||||||
|
|
||||||
#if GCC_VERSION <= 50000
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
#if GCC_VERSION <= 50000
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@@ -1,91 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
|
|
||||||
#include "../shared/HAL_MinSerial.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
static void TXBegin() {
|
|
||||||
// Disable UART interrupt in NVIC
|
|
||||||
NVIC_DisableIRQ( UART_IRQn );
|
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
|
||||||
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
|
|
||||||
// Disable clock
|
|
||||||
pmc_disable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Configure PMC
|
|
||||||
pmc_enable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Disable PDC channel
|
|
||||||
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
|
||||||
|
|
||||||
// Reset and disable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
|
||||||
|
|
||||||
// Configure mode: 8bit, No parity, 1 bit stop
|
|
||||||
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
|
||||||
|
|
||||||
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
|
||||||
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
|
||||||
|
|
||||||
// Enable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
|
||||||
#define sw_barrier() __asm__ volatile("": : :"memory");
|
|
||||||
static void TX(char c) {
|
|
||||||
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
|
||||||
UART->UART_THR = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void install_min_serial() {
|
|
||||||
HAL_min_serial_init = &TXBegin;
|
|
||||||
HAL_min_serial_out = &TX;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DISABLED(DYNAMIC_VECTORTABLE)
|
|
||||||
extern "C" {
|
|
||||||
__attribute__((naked)) void JumpHandler_ASM() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"b CommonHandler_ASM\n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // POSTMORTEM_DEBUGGING
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
|
@@ -56,8 +56,8 @@
|
|||||||
#pragma GCC optimize (3)
|
#pragma GCC optimize (3)
|
||||||
|
|
||||||
typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
|
typedef uint8_t (*pfnSpiTransfer)(uint8_t b);
|
||||||
typedef void (*pfnSpiRxBlock)(uint8_t *buf, uint32_t nbyte);
|
typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte);
|
||||||
typedef void (*pfnSpiTxBlock)(const uint8_t *buf, uint32_t nbyte);
|
typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte);
|
||||||
|
|
||||||
/* ---------------- Macros to be able to access definitions from asm */
|
/* ---------------- Macros to be able to access definitions from asm */
|
||||||
#define _PORT(IO) DIO ## IO ## _WPORT
|
#define _PORT(IO) DIO ## IO ## _WPORT
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
|
|
||||||
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
||||||
uint32_t idx = 0;
|
uint32_t idx = 0;
|
||||||
|
|
||||||
/* Negate bout, as the assembler requires a negated value */
|
/* Negate bout, as the assembler requires a negated value */
|
||||||
@@ -154,9 +154,9 @@
|
|||||||
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -225,36 +225,36 @@
|
|||||||
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(SD_MOSI_PIN, b & 0x80);
|
WRITE(MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, HIGH);
|
WRITE(SCK_PIN, HIGH);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
|
|
||||||
b |= (READ(SD_MISO_PIN) != 0);
|
b |= (READ(MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SCK_PIN, LOW);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
// all the others
|
// all the others
|
||||||
static uint32_t spiDelayCyclesX4 = 4 * (F_CPU) / 1000000; // 4µs => 125khz
|
static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz
|
||||||
|
|
||||||
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(SD_MOSI_PIN, b & 0x80);
|
WRITE(MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, HIGH);
|
WRITE(SCK_PIN, HIGH);
|
||||||
DELAY_CYCLES(spiDelayCyclesX4);
|
__delay_4cycles(spiDelayCyclesX4);
|
||||||
|
|
||||||
b |= (READ(SD_MISO_PIN) != 0);
|
b |= (READ(MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SCK_PIN, LOW);
|
||||||
DELAY_CYCLES(spiDelayCyclesX4);
|
__delay_4cycles(spiDelayCyclesX4);
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
@@ -270,11 +270,11 @@
|
|||||||
static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
|
|
||||||
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) {
|
static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) {
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t txval = 0;
|
uint32_t txval = 0;
|
||||||
|
|
||||||
@@ -349,12 +349,12 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
static void spiRxBlock0(uint8_t* ptr, uint32_t todo) {
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -425,13 +425,13 @@
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiTxBlockX(const uint8_t *buf, uint32_t todo) {
|
static void spiTxBlockX(const uint8_t* buf, uint32_t todo) {
|
||||||
do {
|
do {
|
||||||
(void)spiTransferTx(*buf++);
|
(void)spiTransferTx(*buf++);
|
||||||
} while (--todo);
|
} while (--todo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spiRxBlockX(uint8_t *buf, uint32_t todo) {
|
static void spiRxBlockX(uint8_t* buf, uint32_t todo) {
|
||||||
do {
|
do {
|
||||||
*buf++ = spiTransferRx(0xFF);
|
*buf++ = spiTransferRx(0xFF);
|
||||||
} while (--todo);
|
} while (--todo);
|
||||||
@@ -442,31 +442,31 @@
|
|||||||
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
|
|
||||||
#if MB(ALLIGATOR)
|
#if MB(ALLIGATOR)
|
||||||
#define _SS_WRITE(S) WRITE(SD_SS_PIN, S)
|
#define _SS_WRITE(S) WRITE(SS_PIN, S)
|
||||||
#else
|
#else
|
||||||
#define _SS_WRITE(S) NOOP
|
#define _SS_WRITE(S) NOOP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
SET_OUTPUT(SD_SS_PIN);
|
SET_OUTPUT(SS_PIN);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
SET_OUTPUT(SD_SCK_PIN);
|
SET_OUTPUT(SCK_PIN);
|
||||||
SET_INPUT(SD_MISO_PIN);
|
SET_INPUT(MISO_PIN);
|
||||||
SET_OUTPUT(SD_MOSI_PIN);
|
SET_OUTPUT(MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiRec() {
|
uint8_t spiRec() {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
||||||
uint8_t b = spiTransferRx(0xFF);
|
uint8_t b = spiTransferRx(0xFF);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
||||||
if (nbyte) {
|
if (nbyte) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
||||||
spiRxBlock(buf, nbyte);
|
spiRxBlock(buf, nbyte);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
@@ -478,7 +478,7 @@
|
|||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
(void)spiTransferTx(token);
|
(void)spiTransferTx(token);
|
||||||
spiTxBlock(buf, 512);
|
spiTxBlock(buf, 512);
|
||||||
@@ -510,7 +510,7 @@
|
|||||||
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate) << 2; // spiRate of 2 gives the maximum error with current CPU
|
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate);
|
||||||
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||||
@@ -519,8 +519,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
WRITE(SD_MOSI_PIN, HIGH);
|
WRITE(MOSI_PIN, HIGH);
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Begin SPI transaction, set clock, bit order, data mode */
|
/** Begin SPI transaction, set clock, bit order, data mode */
|
||||||
@@ -575,20 +575,20 @@
|
|||||||
|
|
||||||
// Configure SPI pins
|
// Configure SPI pins
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SD_SCK_PIN].pPort,
|
g_APinDescription[SCK_PIN].pPort,
|
||||||
g_APinDescription[SD_SCK_PIN].ulPinType,
|
g_APinDescription[SCK_PIN].ulPinType,
|
||||||
g_APinDescription[SD_SCK_PIN].ulPin,
|
g_APinDescription[SCK_PIN].ulPin,
|
||||||
g_APinDescription[SD_SCK_PIN].ulPinConfiguration);
|
g_APinDescription[SCK_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SD_MOSI_PIN].pPort,
|
g_APinDescription[MOSI_PIN].pPort,
|
||||||
g_APinDescription[SD_MOSI_PIN].ulPinType,
|
g_APinDescription[MOSI_PIN].ulPinType,
|
||||||
g_APinDescription[SD_MOSI_PIN].ulPin,
|
g_APinDescription[MOSI_PIN].ulPin,
|
||||||
g_APinDescription[SD_MOSI_PIN].ulPinConfiguration);
|
g_APinDescription[MOSI_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SD_MISO_PIN].pPort,
|
g_APinDescription[MISO_PIN].pPort,
|
||||||
g_APinDescription[SD_MISO_PIN].ulPinType,
|
g_APinDescription[MISO_PIN].ulPinType,
|
||||||
g_APinDescription[SD_MISO_PIN].ulPin,
|
g_APinDescription[MISO_PIN].ulPin,
|
||||||
g_APinDescription[SD_MISO_PIN].ulPinConfiguration);
|
g_APinDescription[MISO_PIN].ulPinConfiguration);
|
||||||
|
|
||||||
// set master mode, peripheral select, fault detection
|
// set master mode, peripheral select, fault detection
|
||||||
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
||||||
@@ -606,7 +606,7 @@
|
|||||||
WRITE(SPI_EEPROM1_CS, HIGH);
|
WRITE(SPI_EEPROM1_CS, HIGH);
|
||||||
WRITE(SPI_EEPROM2_CS, HIGH);
|
WRITE(SPI_EEPROM2_CS, HIGH);
|
||||||
WRITE(SPI_FLASH_CS, HIGH);
|
WRITE(SPI_FLASH_CS, HIGH);
|
||||||
WRITE(SD_SS_PIN, HIGH);
|
WRITE(SS_PIN, HIGH);
|
||||||
|
|
||||||
OUT_WRITE(SDSS, LOW);
|
OUT_WRITE(SDSS, LOW);
|
||||||
|
|
||||||
@@ -645,7 +645,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read from SPI into buffer
|
// Read from SPI into buffer
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (int i = 0; i < nbyte; i++) {
|
for (int i = 0; i < nbyte; i++) {
|
||||||
@@ -668,7 +668,7 @@
|
|||||||
//DELAY_US(1U);
|
//DELAY_US(1U);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(const uint8_t *buf, size_t nbyte) {
|
void spiSend(const uint8_t* buf, size_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (size_t i = 0; i < nbyte; i++) {
|
for (size_t i = 0; i < nbyte; i++) {
|
||||||
@@ -689,7 +689,7 @@
|
|||||||
FLUSH_RX();
|
FLUSH_RX();
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {
|
void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
|
||||||
if (!nbyte) return;
|
if (!nbyte) return;
|
||||||
--nbyte;
|
--nbyte;
|
||||||
for (size_t i = 0; i < nbyte; i++) {
|
for (size_t i = 0; i < nbyte; i++) {
|
||||||
@@ -702,7 +702,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write from buffer to SPI
|
// Write from buffer to SPI
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
|
SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN);
|
||||||
WHILE_TX(0);
|
WHILE_TX(0);
|
||||||
//WHILE_RX(0);
|
//WHILE_RX(0);
|
||||||
@@ -801,19 +801,19 @@
|
|||||||
|
|
||||||
uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
|
uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
|
||||||
|
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
||||||
for (int i = 0; i < nbyte; i++)
|
for (int i = 0; i < nbyte; i++)
|
||||||
buf[i] = spiTransfer(0xFF);
|
buf[i] = spiTransfer(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint8_t data) { spiTransfer(data); }
|
void spiSend(uint8_t data) { spiTransfer(data); }
|
||||||
|
|
||||||
void spiSend(const uint8_t *buf, size_t nbyte) {
|
void spiSend(const uint8_t* buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
spiTransfer(buf[i]);
|
spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
spiTransfer(token);
|
spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
spiTransfer(buf[i]);
|
spiTransfer(buf[i]);
|
||||||
|
@@ -382,7 +382,7 @@ void MarlinSerial<Cfg>::flush() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
void MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||||
_written = true;
|
_written = true;
|
||||||
|
|
||||||
if (Cfg::TX_SIZE == 0) {
|
if (Cfg::TX_SIZE == 0) {
|
||||||
@@ -400,7 +400,7 @@ size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// XOFF char at the RX isr, but it is properly handled there
|
// XOFF char at the RX isr, but it is properly handled there
|
||||||
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
||||||
HWUART->UART_THR = c;
|
HWUART->UART_THR = c;
|
||||||
return 1;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
||||||
@@ -428,7 +428,6 @@ size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
||||||
HWUART->UART_IER = UART_IER_TXRDY;
|
HWUART->UART_IER = UART_IER_TXRDY;
|
||||||
}
|
}
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
@@ -474,21 +473,169 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Imports from print.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(char c, int base) {
|
||||||
|
print((long)c, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(unsigned char b, int base) {
|
||||||
|
print((unsigned long)b, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(int n, int base) {
|
||||||
|
print((long)n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(unsigned int n, int base) {
|
||||||
|
print((unsigned long)n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(long n, int base) {
|
||||||
|
if (base == 0) write(n);
|
||||||
|
else if (base == 10) {
|
||||||
|
if (n < 0) { print('-'); n = -n; }
|
||||||
|
printNumber(n, 10);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(unsigned long n, int base) {
|
||||||
|
if (base == 0) write(n);
|
||||||
|
else printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::print(double n, int digits) {
|
||||||
|
printFloat(n, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println() {
|
||||||
|
print('\r');
|
||||||
|
print('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(const String& s) {
|
||||||
|
print(s);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(const char c[]) {
|
||||||
|
print(c);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(char c, int base) {
|
||||||
|
print(c, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(unsigned char b, int base) {
|
||||||
|
print(b, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(int n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(unsigned int n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(long n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(unsigned long n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::println(double n, int digits) {
|
||||||
|
print(n, digits);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private Methods
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::printNumber(unsigned long n, uint8_t base) {
|
||||||
|
if (n) {
|
||||||
|
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
||||||
|
int8_t i = 0;
|
||||||
|
while (n) {
|
||||||
|
buf[i++] = n % base;
|
||||||
|
n /= base;
|
||||||
|
}
|
||||||
|
while (i--)
|
||||||
|
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print('0');
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Cfg>
|
||||||
|
void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
|
||||||
|
// Handle negative numbers
|
||||||
|
if (number < 0.0) {
|
||||||
|
print('-');
|
||||||
|
number = -number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Round correctly so that print(1.999, 2) prints as "2.00"
|
||||||
|
double rounding = 0.5;
|
||||||
|
LOOP_L_N(i, digits) rounding *= 0.1;
|
||||||
|
number += rounding;
|
||||||
|
|
||||||
|
// Extract the integer part of the number and print it
|
||||||
|
unsigned long int_part = (unsigned long)number;
|
||||||
|
double remainder = number - (double)int_part;
|
||||||
|
print(int_part);
|
||||||
|
|
||||||
|
// Print the decimal point, but only if there are digits beyond
|
||||||
|
if (digits) {
|
||||||
|
print('.');
|
||||||
|
// Extract digits from the remainder one at a time
|
||||||
|
while (digits--) {
|
||||||
|
remainder *= 10.0;
|
||||||
|
int toPrint = int(remainder);
|
||||||
|
print(toPrint);
|
||||||
|
remainder -= toPrint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If not using the USB port as serial port
|
// If not using the USB port as serial port
|
||||||
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
#if SERIAL_PORT >= 0
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>; // Define
|
||||||
MSerialT1 customizedSerial1(MarlinSerialCfg<SERIAL_PORT>::EMERGENCYPARSER);
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1; // Instantiate
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>; // Define
|
||||||
MSerialT2 customizedSerial2(MarlinSerialCfg<SERIAL_PORT_2>::EMERGENCYPARSER);
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2; // Instantiate
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> >;
|
|
||||||
MSerialT3 customizedSerial3(MarlinSerialCfg<SERIAL_PORT_3>::EMERGENCYPARSER);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
@@ -30,7 +30,11 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
#define DEC 10
|
||||||
|
#define HEX 16
|
||||||
|
#define OCT 8
|
||||||
|
#define BIN 2
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||||
@@ -115,7 +119,7 @@ public:
|
|||||||
static int read();
|
static int read();
|
||||||
static void flush();
|
static void flush();
|
||||||
static ring_buffer_pos_t available();
|
static ring_buffer_pos_t available();
|
||||||
static size_t write(const uint8_t c);
|
static void write(const uint8_t c);
|
||||||
static void flushTX();
|
static void flushTX();
|
||||||
|
|
||||||
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
@@ -124,6 +128,35 @@ public:
|
|||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
|
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
||||||
|
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
||||||
|
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
||||||
|
FORCE_INLINE static void print(const char* str) { write(str); }
|
||||||
|
|
||||||
|
static void print(char, int = 0);
|
||||||
|
static void print(unsigned char, int = 0);
|
||||||
|
static void print(int, int = DEC);
|
||||||
|
static void print(unsigned int, int = DEC);
|
||||||
|
static void print(long, int = DEC);
|
||||||
|
static void print(unsigned long, int = DEC);
|
||||||
|
static void print(double, int = 2);
|
||||||
|
|
||||||
|
static void println(const String& s);
|
||||||
|
static void println(const char[]);
|
||||||
|
static void println(char, int = 0);
|
||||||
|
static void println(unsigned char, int = 0);
|
||||||
|
static void println(int, int = DEC);
|
||||||
|
static void println(unsigned int, int = DEC);
|
||||||
|
static void println(long, int = DEC);
|
||||||
|
static void println(unsigned long, int = DEC);
|
||||||
|
static void println(double, int = 2);
|
||||||
|
static void println();
|
||||||
|
operator bool() { return true; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void printNumber(unsigned long, const uint8_t);
|
||||||
|
static void printFloat(double, uint8_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Serial port configuration
|
// Serial port configuration
|
||||||
@@ -140,17 +173,10 @@ struct MarlinSerialCfg {
|
|||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
#if SERIAL_PORT >= 0
|
||||||
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
||||||
extern MSerialT1 customizedSerial1;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
||||||
extern MSerialT2 customizedSerial2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
|
||||||
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
|
||||||
extern MSerialT3 customizedSerial3;
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -19,13 +19,13 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
||||||
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
||||||
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||||
*/
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
@@ -33,6 +33,10 @@
|
|||||||
|
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
|
|
||||||
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
|
#include "../../feature/e_parser.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Imports from Atmel USB Stack/CDC implementation
|
// Imports from Atmel USB Stack/CDC implementation
|
||||||
extern "C" {
|
extern "C" {
|
||||||
bool usb_task_cdc_isenabled();
|
bool usb_task_cdc_isenabled();
|
||||||
@@ -46,6 +50,10 @@ extern "C" {
|
|||||||
// Pending character
|
// Pending character
|
||||||
static int pending_char = -1;
|
static int pending_char = -1;
|
||||||
|
|
||||||
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
|
static EmergencyParser::State emergency_state; // = EP_RESET
|
||||||
|
#endif
|
||||||
|
|
||||||
// Public Methods
|
// Public Methods
|
||||||
void MarlinSerialUSB::begin(const long) {}
|
void MarlinSerialUSB::begin(const long) {}
|
||||||
|
|
||||||
@@ -65,7 +73,7 @@ int MarlinSerialUSB::peek() {
|
|||||||
|
|
||||||
pending_char = udi_cdc_getc();
|
pending_char = udi_cdc_getc();
|
||||||
|
|
||||||
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)pending_char));
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)pending_char));
|
||||||
|
|
||||||
return pending_char;
|
return pending_char;
|
||||||
}
|
}
|
||||||
@@ -87,27 +95,29 @@ int MarlinSerialUSB::read() {
|
|||||||
|
|
||||||
int c = udi_cdc_getc();
|
int c = udi_cdc_getc();
|
||||||
|
|
||||||
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)c));
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)c));
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MarlinSerialUSB::available() {
|
bool MarlinSerialUSB::available() {
|
||||||
if (pending_char > 0) return pending_char;
|
/* If Pending chars */
|
||||||
return pending_char == 0 ||
|
return pending_char >= 0 ||
|
||||||
// or USB CDC enumerated and configured on the PC side and some bytes where sent to us */
|
/* or USB CDC enumerated and configured on the PC side and some
|
||||||
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
bytes where sent to us */
|
||||||
|
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinSerialUSB::flush() { }
|
void MarlinSerialUSB::flush() { }
|
||||||
|
void MarlinSerialUSB::flushTX() { }
|
||||||
|
|
||||||
size_t MarlinSerialUSB::write(const uint8_t c) {
|
void MarlinSerialUSB::write(const uint8_t c) {
|
||||||
|
|
||||||
/* Do not even bother sending anything if USB CDC is not enumerated
|
/* Do not even bother sending anything if USB CDC is not enumerated
|
||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages */
|
listening to our messages */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
/* Wait until the PC has read the pending to be sent data */
|
/* Wait until the PC has read the pending to be sent data */
|
||||||
while (usb_task_cdc_isenabled() &&
|
while (usb_task_cdc_isenabled() &&
|
||||||
@@ -119,23 +129,161 @@ size_t MarlinSerialUSB::write(const uint8_t c) {
|
|||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages at this point */
|
listening to our messages at this point */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
// Fifo full
|
// Fifo full
|
||||||
// udi_cdc_signal_overrun();
|
// udi_cdc_signal_overrun();
|
||||||
udi_cdc_putc(c);
|
udi_cdc_putc(c);
|
||||||
return 1;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Imports from print.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(char c, int base) {
|
||||||
|
print((long)c, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(unsigned char b, int base) {
|
||||||
|
print((unsigned long)b, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(int n, int base) {
|
||||||
|
print((long)n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(unsigned int n, int base) {
|
||||||
|
print((unsigned long)n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(long n, int base) {
|
||||||
|
if (base == 0)
|
||||||
|
write(n);
|
||||||
|
else if (base == 10) {
|
||||||
|
if (n < 0) {
|
||||||
|
print('-');
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
printNumber(n, 10);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(unsigned long n, int base) {
|
||||||
|
if (base == 0) write(n);
|
||||||
|
else printNumber(n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::print(double n, int digits) {
|
||||||
|
printFloat(n, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println() {
|
||||||
|
print('\r');
|
||||||
|
print('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(const String& s) {
|
||||||
|
print(s);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(const char c[]) {
|
||||||
|
print(c);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(char c, int base) {
|
||||||
|
print(c, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(unsigned char b, int base) {
|
||||||
|
print(b, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(int n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(unsigned int n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(long n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(unsigned long n, int base) {
|
||||||
|
print(n, base);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::println(double n, int digits) {
|
||||||
|
print(n, digits);
|
||||||
|
println();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private Methods
|
||||||
|
|
||||||
|
void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) {
|
||||||
|
if (n) {
|
||||||
|
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
||||||
|
int8_t i = 0;
|
||||||
|
while (n) {
|
||||||
|
buf[i++] = n % base;
|
||||||
|
n /= base;
|
||||||
|
}
|
||||||
|
while (i--)
|
||||||
|
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print('0');
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinSerialUSB::printFloat(double number, uint8_t digits) {
|
||||||
|
// Handle negative numbers
|
||||||
|
if (number < 0.0) {
|
||||||
|
print('-');
|
||||||
|
number = -number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Round correctly so that print(1.999, 2) prints as "2.00"
|
||||||
|
double rounding = 0.5;
|
||||||
|
LOOP_L_N(i, digits)
|
||||||
|
rounding *= 0.1;
|
||||||
|
|
||||||
|
number += rounding;
|
||||||
|
|
||||||
|
// Extract the integer part of the number and print it
|
||||||
|
unsigned long int_part = (unsigned long)number;
|
||||||
|
double remainder = number - (double)int_part;
|
||||||
|
print(int_part);
|
||||||
|
|
||||||
|
// Print the decimal point, but only if there are digits beyond
|
||||||
|
if (digits) {
|
||||||
|
print('.');
|
||||||
|
// Extract digits from the remainder one at a time
|
||||||
|
while (digits--) {
|
||||||
|
remainder *= 10.0;
|
||||||
|
int toPrint = int(remainder);
|
||||||
|
print(toPrint);
|
||||||
|
remainder -= toPrint;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
// Preinstantiate
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
MSerialT1 customizedSerial1(TERN0(EMERGENCY_PARSER, true));
|
MarlinSerialUSB customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
MSerialT2 customizedSerial2(TERN0(EMERGENCY_PARSER, true));
|
MarlinSerialUSB customizedSerial2;
|
||||||
#endif
|
|
||||||
#if SERIAL_PORT_3 == -1
|
|
||||||
MSerialT3 customizedSerial3(TERN0(EMERGENCY_PARSER, true));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#endif // HAS_USB_SERIAL
|
||||||
|
@@ -27,39 +27,73 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
#if HAS_USB_SERIAL
|
||||||
|
|
||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
struct MarlinSerialUSB {
|
#define DEC 10
|
||||||
void begin(const long);
|
#define HEX 16
|
||||||
void end();
|
#define OCT 8
|
||||||
int peek();
|
#define BIN 2
|
||||||
int read();
|
|
||||||
void flush();
|
class MarlinSerialUSB {
|
||||||
int available();
|
|
||||||
size_t write(const uint8_t c);
|
public:
|
||||||
|
MarlinSerialUSB() {};
|
||||||
|
static void begin(const long);
|
||||||
|
static void end();
|
||||||
|
static int peek();
|
||||||
|
static int read();
|
||||||
|
static void flush();
|
||||||
|
static void flushTX();
|
||||||
|
static bool available();
|
||||||
|
static void write(const uint8_t c);
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE uint32_t dropped() { return 0; }
|
FORCE_INLINE static uint32_t dropped() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
||||||
FORCE_INLINE int rxMaxEnqueued() { return 0; }
|
FORCE_INLINE static int rxMaxEnqueued() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
||||||
|
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
||||||
|
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
||||||
|
FORCE_INLINE static void print(const char* str) { write(str); }
|
||||||
|
|
||||||
|
static void print(char, int = 0);
|
||||||
|
static void print(unsigned char, int = 0);
|
||||||
|
static void print(int, int = DEC);
|
||||||
|
static void print(unsigned int, int = DEC);
|
||||||
|
static void print(long, int = DEC);
|
||||||
|
static void print(unsigned long, int = DEC);
|
||||||
|
static void print(double, int = 2);
|
||||||
|
|
||||||
|
static void println(const String& s);
|
||||||
|
static void println(const char[]);
|
||||||
|
static void println(char, int = 0);
|
||||||
|
static void println(unsigned char, int = 0);
|
||||||
|
static void println(int, int = DEC);
|
||||||
|
static void println(unsigned int, int = DEC);
|
||||||
|
static void println(long, int = DEC);
|
||||||
|
static void println(unsigned long, int = DEC);
|
||||||
|
static void println(double, int = 2);
|
||||||
|
static void println();
|
||||||
|
operator bool() { return true; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void printNumber(unsigned long, const uint8_t);
|
||||||
|
static void printFloat(double, uint8_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
typedef Serial1Class<MarlinSerialUSB> MSerialT1;
|
extern MarlinSerialUSB customizedSerial1;
|
||||||
extern MSerialT1 customizedSerial1;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
typedef Serial1Class<MarlinSerialUSB> MSerialT2;
|
extern MarlinSerialUSB customizedSerial2;
|
||||||
extern MSerialT2 customizedSerial2;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERIAL_PORT_3 == -1
|
#endif // HAS_USB_SERIAL
|
||||||
typedef Serial1Class<MarlinSerialUSB> MSerialT3;
|
|
||||||
extern MSerialT3 customizedSerial3;
|
|
||||||
#endif
|
|
||||||
|
@@ -64,11 +64,12 @@
|
|||||||
|
|
||||||
#include "../../../MarlinCore.h"
|
#include "../../../MarlinCore.h"
|
||||||
|
|
||||||
#ifndef LCD_SPI_SPEED
|
void spiBegin();
|
||||||
#define LCD_SPI_SPEED SPI_QUARTER_SPEED
|
void spiInit(uint8_t spiRate);
|
||||||
#endif
|
void spiSend(uint8_t b);
|
||||||
|
void spiSend(const uint8_t* buf, size_t n);
|
||||||
|
|
||||||
#include "../../shared/HAL_SPI.h"
|
#include "../../shared/Marduino.h"
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
||||||
@@ -99,7 +100,11 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
|
|
||||||
spiBegin();
|
spiBegin();
|
||||||
|
|
||||||
spiInit(LCD_SPI_SPEED);
|
#ifndef SPI_SPEED
|
||||||
|
#define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card
|
||||||
|
#endif
|
||||||
|
spiInit(2);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
@@ -59,7 +59,6 @@
|
|||||||
|
|
||||||
#if ENABLED(U8GLIB_ST7920)
|
#if ENABLED(U8GLIB_ST7920)
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib.h>
|
||||||
@@ -146,7 +145,7 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLED(LIGHTWEIGHT_UI)
|
#if ENABLED(LIGHTWEIGHT_UI)
|
||||||
#include "../../../lcd/marlinui.h"
|
#include "../../../lcd/ultralcd.h"
|
||||||
#include "../../shared/HAL_ST7920.h"
|
#include "../../shared/HAL_ST7920.h"
|
||||||
|
|
||||||
#define ST7920_CS_PIN LCD_PINS_RS
|
#define ST7920_CS_PIN LCD_PINS_RS
|
||||||
|
@@ -59,6 +59,9 @@
|
|||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
|
#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
|
||||||
|
|
||||||
|
#undef SPI_SPEED
|
||||||
|
#define SPI_SPEED 2 // About 2 MHz
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/Marduino.h"
|
||||||
|
@@ -59,7 +59,6 @@
|
|||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib.h>
|
||||||
|
@@ -135,11 +135,11 @@ static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes
|
|||||||
#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
|
#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
|
||||||
#include "../../core/debug_out.h"
|
#include "../../core/debug_out.h"
|
||||||
|
|
||||||
static void ee_Dump(const int page, const void *data) {
|
static void ee_Dump(const int page, const void* data) {
|
||||||
|
|
||||||
#ifdef EE_EMU_DEBUG
|
#ifdef EE_EMU_DEBUG
|
||||||
|
|
||||||
const uint8_t *c = (const uint8_t*) data;
|
const uint8_t* c = (const uint8_t*) data;
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
|
|
||||||
sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
|
sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page);
|
||||||
@@ -181,7 +181,7 @@ static void ee_Dump(const int page, const void *data) {
|
|||||||
* @param data (pointer to the data buffer)
|
* @param data (pointer to the data buffer)
|
||||||
*/
|
*/
|
||||||
__attribute__ ((long_call, section (".ramfunc")))
|
__attribute__ ((long_call, section (".ramfunc")))
|
||||||
static bool ee_PageWrite(uint16_t page, const void *data) {
|
static bool ee_PageWrite(uint16_t page, const void* data) {
|
||||||
|
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
||||||
@@ -293,8 +293,8 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
|||||||
ee_Dump(-page, data);
|
ee_Dump(-page, data);
|
||||||
|
|
||||||
// Calculate count of changed bits
|
// Calculate count of changed bits
|
||||||
uint32_t *p1 = (uint32_t*)addrflash;
|
uint32_t* p1 = (uint32_t*)addrflash;
|
||||||
uint32_t *p2 = (uint32_t*)data;
|
uint32_t* p2 = (uint32_t*)data;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (i =0; i<PageSize >> 2; i++) {
|
for (i =0; i<PageSize >> 2; i++) {
|
||||||
if (p1[i] != p2[i]) {
|
if (p1[i] != p2[i]) {
|
||||||
@@ -470,7 +470,7 @@ static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) {
|
|||||||
for (int page = curPage - 1; page >= 0; --page) {
|
for (int page = curPage - 1; page >= 0; --page) {
|
||||||
|
|
||||||
// Get a pointer to the flash page
|
// Get a pointer to the flash page
|
||||||
uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
||||||
|
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
||||||
@@ -550,7 +550,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) {
|
|||||||
for (int page = curPage - 1; page >= 0; --page) {
|
for (int page = curPage - 1; page >= 0; --page) {
|
||||||
|
|
||||||
// Get a pointer to the flash page
|
// Get a pointer to the flash page
|
||||||
uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup);
|
||||||
|
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */
|
||||||
@@ -589,7 +589,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool ee_IsPageClean(int page) {
|
static bool ee_IsPageClean(int page) {
|
||||||
uint32_t *pflash = (uint32_t*) getFlashStorage(page);
|
uint32_t* pflash = (uint32_t*) getFlashStorage(page);
|
||||||
for (uint16_t i = 0; i < (PageSize >> 2); ++i)
|
for (uint16_t i = 0; i < (PageSize >> 2); ++i)
|
||||||
if (*pflash++ != 0xFFFFFFFF) return false;
|
if (*pflash++ != 0xFFFFFFFF) return false;
|
||||||
return true;
|
return true;
|
||||||
@@ -599,7 +599,7 @@ static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData
|
|||||||
|
|
||||||
// Check if RAM buffer has something to be written
|
// Check if RAM buffer has something to be written
|
||||||
bool isEmpty = true;
|
bool isEmpty = true;
|
||||||
uint32_t *p = (uint32_t*) &buffer[0];
|
uint32_t* p = (uint32_t*) &buffer[0];
|
||||||
for (uint16_t j = 0; j < (PageSize >> 2); j++) {
|
for (uint16_t j = 0; j < (PageSize >> 2); j++) {
|
||||||
if (*p++ != 0xFFFFFFFF) {
|
if (*p++ != 0xFFFFFFFF) {
|
||||||
isEmpty = false;
|
isEmpty = false;
|
||||||
@@ -976,13 +976,14 @@ bool PersistentStore::access_start() { ee_Init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
// EEPROM has only ~100,000 write cycles,
|
||||||
|
// so only write bytes that have changed!
|
||||||
|
if (v != ee_Read(uint32_t(p))) {
|
||||||
ee_Write(uint32_t(p), v);
|
ee_Write(uint32_t(p), v);
|
||||||
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
delay(2);
|
||||||
if (ee_Read(uint32_t(p)) != v) {
|
if (ee_Read(uint32_t(p)) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -995,7 +996,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = ee_Read(uint32_t(pos));
|
uint8_t c = ee_Read(uint32_t(pos));
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
|
@@ -42,13 +42,14 @@ bool PersistentStore::access_start() { eeprom_init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
// EEPROM has only ~100,000 write cycles,
|
||||||
|
// so only write bytes that have changed!
|
||||||
|
if (v != eeprom_read_byte(p)) {
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
delay(2);
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
@@ -61,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
* For ARDUINO_ARCH_SAM
|
* For ARDUINO_ARCH_SAM
|
||||||
* Note the code here was specifically crafted by disassembling what GCC produces
|
* Note the code here was specifically crafted by disassembling what GCC produces
|
||||||
* out of it, so GCC is able to optimize it out as much as possible to the least
|
* out of it, so GCC is able to optimize it out as much as possible to the least
|
||||||
* amount of instructions. Be very careful if you modify them, as "clean code"
|
* amount of instructions. Be very carefull if you modify them, as "clean code"
|
||||||
* leads to less efficient compiled code!!
|
* leads to less efficient compiled code!!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
||||||
|
|
||||||
#ifndef MASK
|
#ifndef MASK
|
||||||
#define MASK(PIN) _BV(PIN)
|
#define MASK(PIN) (1 << PIN)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -163,9 +163,6 @@
|
|||||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
#define SET_INPUT(IO) _SET_INPUT(IO)
|
||||||
// Set pin as input with pullup (wrapper)
|
// Set pin as input with pullup (wrapper)
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
// Set pin as input with pulldown (substitution)
|
|
||||||
#define SET_INPUT_PULLDOWN SET_INPUT
|
|
||||||
|
|
||||||
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
||||||
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
||||||
// Set pin as PWM
|
// Set pin as PWM
|
||||||
@@ -480,7 +477,7 @@
|
|||||||
#define DIO91_PIN 15
|
#define DIO91_PIN 15
|
||||||
#define DIO91_WPORT PIOB
|
#define DIO91_WPORT PIOB
|
||||||
|
|
||||||
#ifdef ARDUINO_SAM_ARCHIM
|
#if ARDUINO_SAM_ARCHIM
|
||||||
|
|
||||||
#define DIO92_PIN 11
|
#define DIO92_PIN 11
|
||||||
#define DIO92_WPORT PIOC
|
#define DIO92_WPORT PIOC
|
||||||
|
@@ -40,7 +40,7 @@
|
|||||||
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
||||||
* as the TMC2130 soft SPI the most common setup.
|
* as the TMC2130 soft SPI the most common setup.
|
||||||
*/
|
*/
|
||||||
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
|
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN))
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
||||||
#if ENABLED(TMC_USE_SW_SPI)
|
#if ENABLED(TMC_USE_SW_SPI)
|
||||||
@@ -57,5 +57,5 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on the DUE platform."
|
#error "TMC220x Software Serial is not supported on this platform."
|
||||||
#endif
|
#endif
|
||||||
|
@@ -43,22 +43,22 @@
|
|||||||
#define SPI_PIN 87
|
#define SPI_PIN 87
|
||||||
#define SPI_CHAN 1
|
#define SPI_CHAN 1
|
||||||
#endif
|
#endif
|
||||||
#define SD_SCK_PIN 76
|
#define SCK_PIN 76
|
||||||
#define SD_MISO_PIN 74
|
#define MISO_PIN 74
|
||||||
#define SD_MOSI_PIN 75
|
#define MOSI_PIN 75
|
||||||
#else
|
#else
|
||||||
// defaults
|
// defaults
|
||||||
#define DUE_SOFTWARE_SPI
|
#define DUE_SOFTWARE_SPI
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SCK_PIN
|
||||||
#define SD_SCK_PIN 52
|
#define SCK_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MISO_PIN
|
#ifndef MISO_PIN
|
||||||
#define SD_MISO_PIN 50
|
#define MISO_PIN 50
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MOSI_PIN
|
#ifndef MOSI_PIN
|
||||||
#define SD_MOSI_PIN 51
|
#define MOSI_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* A.28, A.29, B.21, C.26, C.29 */
|
/* A.28, A.29, B.21, C.26, C.29 */
|
||||||
#define SD_SS_PIN SDSS
|
#define SS_PIN SDSS
|
||||||
|
@@ -121,7 +121,7 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
|||||||
|
|
||||||
// missing from CMSIS: Check if interrupt is enabled or not
|
// missing from CMSIS: Check if interrupt is enabled or not
|
||||||
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
||||||
return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
|
return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
||||||
|
@@ -32,7 +32,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready() {
|
|||||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||||
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
*nb_sector = card.getSd2Card().cardSize() - 1;
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,30 +68,30 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
PORT_REDIRECT(0);
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Start reading
|
// Start reading
|
||||||
if (!card.diskIODriver()->readStart(addr))
|
if (!card.getSd2Card().readStart(addr))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// Read a sector
|
// Read a sector
|
||||||
card.diskIODriver()->readData(sector_buf);
|
card.getSd2Card().readData(sector_buf);
|
||||||
|
|
||||||
// RAM -> USB
|
// RAM -> USB
|
||||||
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
||||||
card.diskIODriver()->readStop();
|
card.getSd2Card().readStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop reading
|
// Stop reading
|
||||||
card.diskIODriver()->readStop();
|
card.getSd2Card().readStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
@@ -108,29 +108,29 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
PORT_REDIRECT(0);
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!card.diskIODriver()->writeStart(addr, nb_sector))
|
if (!card.getSd2Card().writeStart(addr, nb_sector))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// USB -> RAM
|
// USB -> RAM
|
||||||
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
||||||
card.diskIODriver()->writeStop();
|
card.getSd2Card().writeStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a sector
|
// Write a sector
|
||||||
card.diskIODriver()->writeData(sector_buf);
|
card.getSd2Card().writeData(sector_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop writing
|
// Stop writing
|
||||||
card.diskIODriver()->writeStop();
|
card.getSd2Card().writeStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
|
@@ -675,11 +675,11 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s
|
|||||||
* - \code // Waits and gets a value on CDC line
|
* - \code // Waits and gets a value on CDC line
|
||||||
int udi_cdc_getc(void);
|
int udi_cdc_getc(void);
|
||||||
// Reads a RAM buffer on CDC line
|
// Reads a RAM buffer on CDC line
|
||||||
iram_size_t udi_cdc_read_buf(int *buf, iram_size_t size);
|
iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size);
|
||||||
// Puts a byte on CDC line
|
// Puts a byte on CDC line
|
||||||
int udi_cdc_putc(int value);
|
int udi_cdc_putc(int value);
|
||||||
// Writes a RAM buffer on CDC line
|
// Writes a RAM buffer on CDC line
|
||||||
iram_size_t udi_cdc_write_buf(const int *buf, iram_size_t size); \endcode
|
iram_size_t udi_cdc_write_buf(const int* buf, iram_size_t size); \endcode
|
||||||
*
|
*
|
||||||
* \section udi_cdc_use_cases Advanced use cases
|
* \section udi_cdc_use_cases Advanced use cases
|
||||||
* For more advanced use of the UDI CDC module, see the following use cases:
|
* For more advanced use of the UDI CDC module, see the following use cases:
|
||||||
|
@@ -264,7 +264,7 @@ bool usb_task_extra_string(void) {
|
|||||||
** Handle device requests that the ASF stack doesn't
|
** Handle device requests that the ASF stack doesn't
|
||||||
*/
|
*/
|
||||||
bool usb_task_other_requests(void) {
|
bool usb_task_other_requests(void) {
|
||||||
uint8_t *ptr = 0;
|
uint8_t* ptr = 0;
|
||||||
uint16_t size = 0;
|
uint16_t size = 0;
|
||||||
|
|
||||||
if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) {
|
if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) {
|
||||||
@@ -322,7 +322,7 @@ void usb_task_init(void) {
|
|||||||
char *sptr;
|
char *sptr;
|
||||||
|
|
||||||
// Patch in the filament diameter
|
// Patch in the filament diameter
|
||||||
itoa((int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000), diam, 10);
|
sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0));
|
||||||
|
|
||||||
// And copy it to the proper place, expanding it to unicode
|
// And copy it to the proper place, expanding it to unicode
|
||||||
sptr = &diam[0];
|
sptr = &diam[0];
|
||||||
|
@@ -36,7 +36,7 @@ void watchdogSetup() {
|
|||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
// 4 seconds timeout
|
// 4 seconds timeout
|
||||||
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
uint32_t timeout = 4000;
|
||||||
|
|
||||||
// Calculate timeout value in WDT counter ticks: This assumes
|
// Calculate timeout value in WDT counter ticks: This assumes
|
||||||
// the slow clock is running at 32.768 kHz watchdog
|
// the slow clock is running at 32.768 kHz watchdog
|
||||||
|
@@ -20,10 +20,14 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
|
||||||
|
|
||||||
#include "FlushableHardwareSerial.h"
|
#include "FlushableHardwareSerial.h"
|
||||||
|
|
||||||
Serial1Class<FlushableHardwareSerial> flushableSerial(false, 0);
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#endif
|
FlushableHardwareSerial::FlushableHardwareSerial(int uart_nr)
|
||||||
|
: HardwareSerial(uart_nr)
|
||||||
|
{}
|
||||||
|
|
||||||
|
FlushableHardwareSerial flushableSerial(0);
|
||||||
|
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
@@ -21,14 +21,17 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <HardwareSerial.h>
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include <HardwareSerial.h>
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
|
||||||
class FlushableHardwareSerial : public HardwareSerial {
|
class FlushableHardwareSerial : public HardwareSerial {
|
||||||
public:
|
public:
|
||||||
FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {}
|
FlushableHardwareSerial(int uart_nr);
|
||||||
|
|
||||||
|
inline void flushTX() { /* No need to flush the hardware serial, but defined here for compatibility. */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
extern Serial1Class<FlushableHardwareSerial> flushableSerial;
|
extern FlushableHardwareSerial flushableSerial;
|
||||||
|
|
||||||
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
@@ -40,10 +40,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
|
||||||
DefaultSerial1 MSerial0(false, Serial2Socket);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Externs
|
// Externs
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -90,6 +86,8 @@ volatile int numPWMUsed = 0,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void HAL_init() { i2s_init(); }
|
||||||
|
|
||||||
void HAL_init_board() {
|
void HAL_init_board() {
|
||||||
|
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
@@ -124,10 +122,6 @@ void HAL_init_board() {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Initialize the i2s peripheral only if the I2S stepper stream is enabled.
|
|
||||||
// The following initialization is performed after Serial1 and Serial2 are defined as
|
|
||||||
// their native pins might conflict with the i2s stream even when they are remapped.
|
|
||||||
TERN_(I2S_STEPPER_STREAM, i2s_init());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_idletask() {
|
void HAL_idletask() {
|
||||||
@@ -141,8 +135,6 @@ void HAL_clear_reset_source() { }
|
|||||||
|
|
||||||
uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); }
|
uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); }
|
||||||
|
|
||||||
void HAL_reboot() { ESP.restart(); }
|
|
||||||
|
|
||||||
void _delay_ms(int delay_ms) { delay(delay_ms); }
|
void _delay_ms(int delay_ms) { delay(delay_ms); }
|
||||||
|
|
||||||
// return free memory between end of heap (or end bss) and whatever is current
|
// return free memory between end of heap (or end bss) and whatever is current
|
||||||
@@ -187,7 +179,6 @@ void HAL_adc_init() {
|
|||||||
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
|
||||||
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
||||||
|
|
||||||
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
||||||
|
@@ -51,15 +51,13 @@
|
|||||||
|
|
||||||
extern portMUX_TYPE spinlock;
|
extern portMUX_TYPE spinlock;
|
||||||
|
|
||||||
#define MYSERIAL1 flushableSerial
|
#define MYSERIAL0 flushableSerial
|
||||||
|
|
||||||
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1;
|
#define MYSERIAL1 Serial2Socket
|
||||||
extern DefaultSerial1 MSerial0;
|
|
||||||
#define MYSERIAL2 MSerial0
|
|
||||||
#else
|
#else
|
||||||
#define MYSERIAL2 webSocketSerial
|
#define MYSERIAL1 webSocketSerial
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -69,6 +67,10 @@ extern portMUX_TYPE spinlock;
|
|||||||
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock)
|
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock)
|
||||||
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock)
|
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock)
|
||||||
|
|
||||||
|
// Fix bug in pgm_read_ptr
|
||||||
|
#undef pgm_read_ptr
|
||||||
|
#define pgm_read_ptr(addr) (*(addr))
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -88,33 +90,20 @@ extern uint16_t HAL_adc_result;
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
//
|
|
||||||
// Tone
|
|
||||||
//
|
|
||||||
void toneInit();
|
|
||||||
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
|
|
||||||
void noTone(const pin_t _pin);
|
|
||||||
|
|
||||||
// clear reset reason
|
// clear reset reason
|
||||||
void HAL_clear_reset_source();
|
void HAL_clear_reset_source();
|
||||||
|
|
||||||
// reset reason
|
// reset reason
|
||||||
uint8_t HAL_get_reset_source();
|
uint8_t HAL_get_reset_source();
|
||||||
|
|
||||||
void HAL_reboot();
|
inline void HAL_reboot() {} // reboot the board or restart the bootloader
|
||||||
|
|
||||||
void _delay_ms(int delay);
|
void _delay_ms(int delay);
|
||||||
|
|
||||||
#if GCC_VERSION <= 50000
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
#if GCC_VERSION <= 50000
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void analogWrite(pin_t pin, int value);
|
void analogWrite(pin_t pin, int value);
|
||||||
|
|
||||||
@@ -139,7 +128,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin);
|
|||||||
#define HAL_IDLETASK 1
|
#define HAL_IDLETASK 1
|
||||||
#define BOARD_INIT() HAL_init_board();
|
#define BOARD_INIT() HAL_init_board();
|
||||||
void HAL_idletask();
|
void HAL_idletask();
|
||||||
inline void HAL_init() {}
|
void HAL_init();
|
||||||
void HAL_init_board();
|
void HAL_init_board();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -53,11 +53,11 @@ static SPISettings spiConfig;
|
|||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
#if !PIN_EXISTS(SD_SS)
|
#if !PIN_EXISTS(SS)
|
||||||
#error "SD_SS_PIN not defined!"
|
#error "SS_PIN not defined!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
OUT_WRITE(SS_PIN, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
@@ -85,7 +85,7 @@ uint8_t spiRec() {
|
|||||||
return returnByte;
|
return returnByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t* buf, uint16_t nbyte) {
|
||||||
SPI.beginTransaction(spiConfig);
|
SPI.beginTransaction(spiConfig);
|
||||||
SPI.transferBytes(0, buf, nbyte);
|
SPI.transferBytes(0, buf, nbyte);
|
||||||
SPI.endTransaction();
|
SPI.endTransaction();
|
||||||
@@ -97,7 +97,7 @@ void spiSend(uint8_t b) {
|
|||||||
SPI.endTransaction();
|
SPI.endTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
SPI.beginTransaction(spiConfig);
|
SPI.beginTransaction(spiConfig);
|
||||||
SPI.transfer(token);
|
SPI.transfer(token);
|
||||||
SPI.writeBytes(const_cast<uint8_t*>(buf), 512);
|
SPI.writeBytes(const_cast<uint8_t*>(buf), 512);
|
||||||
|
@@ -30,7 +30,7 @@ class Servo {
|
|||||||
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
||||||
TAU_MSEC = 20,
|
TAU_MSEC = 20,
|
||||||
TAU_USEC = (TAU_MSEC * 1000),
|
TAU_USEC = (TAU_MSEC * 1000),
|
||||||
MAX_COMPARE = _BV(16) - 1, // 65535
|
MAX_COMPARE = ((1 << 16) - 1), // 65535
|
||||||
CHANNEL_MAX_NUM = 16;
|
CHANNEL_MAX_NUM = 16;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
#include "wifi.h"
|
#include "wifi.h"
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
MSerialWebSocketT webSocketSerial(false);
|
WebSocketSerial webSocketSerial;
|
||||||
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
|
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
|
||||||
|
|
||||||
// RingBuffer impl
|
// RingBuffer impl
|
||||||
@@ -137,12 +137,16 @@ size_t WebSocketSerial::write(const uint8_t c) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t WebSocketSerial::write(const uint8_t *buffer, size_t size) {
|
size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) {
|
||||||
size_t written = 0;
|
size_t written = 0;
|
||||||
for (size_t i = 0; i < size; i++)
|
for (size_t i = 0; i < size; i++)
|
||||||
written += write(buffer[i]);
|
written += write(buffer[i]);
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebSocketSerial::flushTX() {
|
||||||
|
// No need to do anything as there's no benefit to sending partial lines over the websocket connection.
|
||||||
|
}
|
||||||
|
|
||||||
#endif // WIFISUPPORT
|
#endif // WIFISUPPORT
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
||||||
@@ -54,7 +53,7 @@ public:
|
|||||||
ring_buffer_pos_t read(uint8_t *buffer);
|
ring_buffer_pos_t read(uint8_t *buffer);
|
||||||
void flush();
|
void flush();
|
||||||
ring_buffer_pos_t write(const uint8_t c);
|
ring_buffer_pos_t write(const uint8_t c);
|
||||||
ring_buffer_pos_t write(const uint8_t *buffer, ring_buffer_pos_t size);
|
ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
class WebSocketSerial: public Stream {
|
class WebSocketSerial: public Stream {
|
||||||
@@ -69,8 +68,11 @@ public:
|
|||||||
int peek();
|
int peek();
|
||||||
int read();
|
int read();
|
||||||
void flush();
|
void flush();
|
||||||
|
void flushTX();
|
||||||
size_t write(const uint8_t c);
|
size_t write(const uint8_t c);
|
||||||
size_t write(const uint8_t *buffer, size_t size);
|
size_t write(const uint8_t* buffer, size_t size);
|
||||||
|
|
||||||
|
operator bool() { return true; }
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE uint32_t dropped() { return 0; }
|
FORCE_INLINE uint32_t dropped() { return 0; }
|
||||||
@@ -81,5 +83,4 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Serial1Class<WebSocketSerial> MSerialWebSocketT;
|
extern WebSocketSerial webSocketSerial;
|
||||||
extern MSerialWebSocketT webSocketSerial;
|
|
||||||
|
@@ -44,7 +44,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
for (size_t i = 0; i < size; i++) {
|
for (size_t i = 0; i < size; i++) {
|
||||||
uint8_t c = EEPROM.read(pos++);
|
uint8_t c = EEPROM.read(pos++);
|
||||||
if (writing) value[i] = c;
|
if (writing) value[i] = c;
|
||||||
|
@@ -52,9 +52,6 @@
|
|||||||
// Set pin as input with pullup wrapper
|
// Set pin as input with pullup wrapper
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
|
|
||||||
// Set pin as input with pulldown (substitution)
|
|
||||||
#define SET_INPUT_PULLDOWN SET_INPUT
|
|
||||||
|
|
||||||
// Set pin as output wrapper
|
// Set pin as output wrapper
|
||||||
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
||||||
|
|
||||||
|
@@ -139,7 +139,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) {
|
|||||||
I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt
|
I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt
|
||||||
}
|
}
|
||||||
|
|
||||||
void stepperTask(void *parameter) {
|
void stepperTask(void* parameter) {
|
||||||
uint32_t remaining = 0;
|
uint32_t remaining = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -184,7 +184,7 @@ int i2s_init() {
|
|||||||
|
|
||||||
// Allocate the array of pointers to the buffers
|
// Allocate the array of pointers to the buffers
|
||||||
dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT);
|
dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT);
|
||||||
if (!dma.buffers) return -1;
|
if (dma.buffers == nullptr) return -1;
|
||||||
|
|
||||||
// Allocate each buffer that can be used by the DMA controller
|
// Allocate each buffer that can be used by the DMA controller
|
||||||
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
||||||
@@ -194,7 +194,7 @@ int i2s_init() {
|
|||||||
|
|
||||||
// Allocate the array of DMA descriptors
|
// Allocate the array of DMA descriptors
|
||||||
dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT);
|
dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT);
|
||||||
if (!dma.desc) return -1;
|
if (dma.desc == nullptr) return -1;
|
||||||
|
|
||||||
// Allocate each DMA descriptor that will be used by the DMA controller
|
// Allocate each DMA descriptor that will be used by the DMA controller
|
||||||
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) {
|
||||||
|
@@ -30,13 +30,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on ESP32."
|
#error "TMC220x Software Serial is not supported on this platform."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
||||||
#error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT."
|
#error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
#error "POSTMORTEM_DEBUGGING is not yet supported on ESP32."
|
|
||||||
#endif
|
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define SD_SS_PIN SDSS
|
#define SS_PIN SDSS
|
||||||
#define SD_SCK_PIN 18
|
#define SCK_PIN 18
|
||||||
#define SD_MISO_PIN 19
|
#define MISO_PIN 19
|
||||||
#define SD_MOSI_PIN 23
|
#define MOSI_PIN 23
|
||||||
|
@@ -45,7 +45,7 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
|
|||||||
{ TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper
|
{ TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper
|
||||||
{ TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature
|
{ TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature
|
||||||
{ TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM
|
{ TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM
|
||||||
{ TIMER_GROUP_1, TIMER_1, TONE_TIMER_PRESCALE, toneTC_Handler }, // 3 - Tone
|
{ TIMER_GROUP_1, TIMER_1, 1, nullptr }, // 3
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
@@ -24,9 +24,15 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <driver/timer.h>
|
#include <driver/timer.h>
|
||||||
|
|
||||||
|
// Includes needed to get I2S_STEPPER_STREAM. Note that pins.h
|
||||||
|
// is included in case this header is being included early.
|
||||||
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../pins/pins.h"
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Defines
|
// Defines
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
//
|
||||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
|
||||||
typedef uint64_t hal_timer_t;
|
typedef uint64_t hal_timer_t;
|
||||||
@@ -44,9 +50,6 @@ typedef uint64_t hal_timer_t;
|
|||||||
#ifndef PWM_TIMER_NUM
|
#ifndef PWM_TIMER_NUM
|
||||||
#define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs
|
#define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs
|
||||||
#endif
|
#endif
|
||||||
#ifndef TONE_TIMER_NUM
|
|
||||||
#define TONE_TIMER_NUM 3 // index of timer 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
|
||||||
|
|
||||||
@@ -62,8 +65,6 @@ typedef uint64_t hal_timer_t;
|
|||||||
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
||||||
|
|
||||||
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
@@ -95,16 +96,10 @@ typedef uint64_t hal_timer_t;
|
|||||||
#ifndef HAL_PWM_TIMER_ISR
|
#ifndef HAL_PWM_TIMER_ISR
|
||||||
#define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
|
#define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler()
|
||||||
#endif
|
#endif
|
||||||
#ifndef HAL_TONE_TIMER_ISR
|
|
||||||
#define HAL_TONE_TIMER_ISR() extern "C" void toneTC_Handler()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" void tempTC_Handler();
|
||||||
void tempTC_Handler();
|
extern "C" void stepTC_Handler();
|
||||||
void stepTC_Handler();
|
extern "C" void pwmTC_Handler();
|
||||||
void pwmTC_Handler();
|
|
||||||
void toneTC_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
|
@@ -25,8 +25,6 @@
|
|||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
|
||||||
|
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
|
|
||||||
void watchdogSetup() {
|
void watchdogSetup() {
|
||||||
|
@@ -23,12 +23,14 @@
|
|||||||
|
|
||||||
#include "platforms.h"
|
#include "platforms.h"
|
||||||
|
|
||||||
#ifndef GCC_VERSION
|
|
||||||
#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include HAL_PATH(.,HAL.h)
|
#include HAL_PATH(.,HAL.h)
|
||||||
|
|
||||||
|
#ifdef SERIAL_PORT_2
|
||||||
|
#define NUM_SERIAL 2
|
||||||
|
#else
|
||||||
|
#define NUM_SERIAL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION)
|
#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION)
|
||||||
|
|
||||||
#ifndef I2C_ADDRESS
|
#ifndef I2C_ADDRESS
|
||||||
|
@@ -24,16 +24,21 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
|
|
||||||
MSerialT usb_serial(TERN0(EMERGENCY_PARSER, true));
|
HalSerial usb_serial;
|
||||||
|
|
||||||
// U8glib required functions
|
// U8glib required functions
|
||||||
extern "C" {
|
extern "C" void u8g_xMicroDelay(uint16_t val) {
|
||||||
void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); }
|
DELAY_US(val);
|
||||||
void u8g_MicroDelay() { u8g_xMicroDelay(1); }
|
}
|
||||||
void u8g_10MicroDelay() { u8g_xMicroDelay(10); }
|
extern "C" void u8g_MicroDelay() {
|
||||||
void u8g_Delay(uint16_t val) { delay(val); }
|
u8g_xMicroDelay(1);
|
||||||
|
}
|
||||||
|
extern "C" void u8g_10MicroDelay() {
|
||||||
|
u8g_xMicroDelay(10);
|
||||||
|
}
|
||||||
|
extern "C" void u8g_Delay(uint16_t val) {
|
||||||
|
delay(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
//************************//
|
//************************//
|
||||||
|
|
||||||
// return free heap space
|
// return free heap space
|
||||||
@@ -73,6 +78,4 @@ void HAL_pwm_init() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_reboot() { /* Reset the application state and GPIO */ }
|
|
||||||
|
|
||||||
#endif // __PLAT_LINUX__
|
#endif // __PLAT_LINUX__
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#define CPU_32_BIT
|
#define CPU_32_BIT
|
||||||
|
|
||||||
#define F_CPU 100000000UL
|
#define F_CPU 100000000
|
||||||
#define SystemCoreClock F_CPU
|
#define SystemCoreClock F_CPU
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -60,8 +60,8 @@ uint8_t _getc();
|
|||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS
|
||||||
|
|
||||||
extern MSerialT usb_serial;
|
extern HalSerial usb_serial;
|
||||||
#define MYSERIAL1 usb_serial
|
#define MYSERIAL0 usb_serial
|
||||||
|
|
||||||
#define ST7920_DELAY_1 DELAY_NS(600)
|
#define ST7920_DELAY_1 DELAY_NS(600)
|
||||||
#define ST7920_DELAY_2 DELAY_NS(750)
|
#define ST7920_DELAY_2 DELAY_NS(750)
|
||||||
@@ -79,16 +79,10 @@ extern MSerialT usb_serial;
|
|||||||
inline void HAL_init() {}
|
inline void HAL_init() {}
|
||||||
|
|
||||||
// Utility functions
|
// Utility functions
|
||||||
#if GCC_VERSION <= 50000
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
#if GCC_VERSION <= 50000
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
#define HAL_ADC_VREF 5.0
|
#define HAL_ADC_VREF 5.0
|
||||||
@@ -107,9 +101,14 @@ uint16_t HAL_adc_get_result();
|
|||||||
inline void HAL_clear_reset_source(void) {}
|
inline void HAL_clear_reset_source(void) {}
|
||||||
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
|
inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; }
|
||||||
|
|
||||||
void HAL_reboot(); // Reset the application state and GPIO
|
inline void HAL_reboot() {} // reboot the board or restart the bootloader
|
||||||
|
|
||||||
/* ---------------- Delay in cycles */
|
/* ---------------- Delay in cycles */
|
||||||
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
|
FORCE_INLINE static void DELAY_CYCLES(uint64_t x) {
|
||||||
Clock::delayCycles(x);
|
Clock::delayCycles(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add strcmp_P if missing
|
||||||
|
#ifndef strcmp_P
|
||||||
|
#define strcmp_P(a, b) strcmp((a), (b))
|
||||||
|
#endif
|
||||||
|
@@ -40,7 +40,7 @@ size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
|||||||
bool PersistentStore::access_start() {
|
bool PersistentStore::access_start() {
|
||||||
const char eeprom_erase_value = 0xFF;
|
const char eeprom_erase_value = 0xFF;
|
||||||
FILE * eeprom_file = fopen(filename, "rb");
|
FILE * eeprom_file = fopen(filename, "rb");
|
||||||
if (!eeprom_file) return false;
|
if (eeprom_file == nullptr) return false;
|
||||||
|
|
||||||
fseek(eeprom_file, 0L, SEEK_END);
|
fseek(eeprom_file, 0L, SEEK_END);
|
||||||
std::size_t file_size = ftell(eeprom_file);
|
std::size_t file_size = ftell(eeprom_file);
|
||||||
@@ -59,7 +59,7 @@ bool PersistentStore::access_start() {
|
|||||||
|
|
||||||
bool PersistentStore::access_finish() {
|
bool PersistentStore::access_finish() {
|
||||||
FILE * eeprom_file = fopen(filename, "wb");
|
FILE * eeprom_file = fopen(filename, "wb");
|
||||||
if (!eeprom_file) return false;
|
if (eeprom_file == nullptr) return false;
|
||||||
fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file);
|
fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file);
|
||||||
fclose(eeprom_file);
|
fclose(eeprom_file);
|
||||||
return true;
|
return true;
|
||||||
@@ -78,7 +78,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return (bytes_written != size); // return true for any error
|
return (bytes_written != size); // return true for any error
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
std::size_t bytes_read = 0;
|
std::size_t bytes_read = 0;
|
||||||
if (writing) {
|
if (writing) {
|
||||||
for (std::size_t i = 0; i < size; i++) {
|
for (std::size_t i = 0; i < size; i++) {
|
||||||
|
@@ -86,10 +86,10 @@ public:
|
|||||||
GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP;
|
GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP;
|
||||||
pin_map[pin].value = value;
|
pin_map[pin].value = value;
|
||||||
GpioEvent evt(Clock::nanos(), pin, evt_type);
|
GpioEvent evt(Clock::nanos(), pin, evt_type);
|
||||||
if (pin_map[pin].cb) {
|
if (pin_map[pin].cb != nullptr) {
|
||||||
pin_map[pin].cb->interrupt(evt);
|
pin_map[pin].cb->interrupt(evt);
|
||||||
}
|
}
|
||||||
if (Gpio::logger) Gpio::logger->log(evt);
|
if (Gpio::logger != nullptr) Gpio::logger->log(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t get(pin_type pin) {
|
static uint16_t get(pin_type pin) {
|
||||||
@@ -105,8 +105,8 @@ public:
|
|||||||
if (!valid_pin(pin)) return;
|
if (!valid_pin(pin)) return;
|
||||||
pin_map[pin].mode = value;
|
pin_map[pin].mode = value;
|
||||||
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM);
|
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM);
|
||||||
if (pin_map[pin].cb) pin_map[pin].cb->interrupt(evt);
|
if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt);
|
||||||
if (Gpio::logger) Gpio::logger->log(evt);
|
if (Gpio::logger != nullptr) Gpio::logger->log(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t getMode(pin_type pin) {
|
static uint8_t getMode(pin_type pin) {
|
||||||
@@ -118,8 +118,8 @@ public:
|
|||||||
if (!valid_pin(pin)) return;
|
if (!valid_pin(pin)) return;
|
||||||
pin_map[pin].dir = value;
|
pin_map[pin].dir = value;
|
||||||
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD);
|
GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD);
|
||||||
if (pin_map[pin].cb) pin_map[pin].cb->interrupt(evt);
|
if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt);
|
||||||
if (Gpio::logger) Gpio::logger->log(evt);
|
if (Gpio::logger != nullptr) Gpio::logger->log(evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t getDir(pin_type pin) {
|
static uint8_t getDir(pin_type pin) {
|
||||||
|
@@ -35,9 +35,5 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on LINUX."
|
#error "TMC220x Software Serial is not supported on this platform."
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
#error "POSTMORTEM_DEBUGGING is not yet supported on LINUX."
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -67,14 +67,34 @@ void cli(); // Disable
|
|||||||
void sei(); // Enable
|
void sei(); // Enable
|
||||||
void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode);
|
void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode);
|
||||||
void detachInterrupt(uint32_t pin);
|
void detachInterrupt(uint32_t pin);
|
||||||
|
extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode);
|
||||||
|
extern "C" void GpioDisableInt(uint32_t port, uint32_t pin);
|
||||||
|
|
||||||
extern "C" {
|
// Program Memory
|
||||||
void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode);
|
#define pgm_read_ptr(addr) (*((void**)(addr)))
|
||||||
void GpioDisableInt(uint32_t port, uint32_t pin);
|
#define pgm_read_byte_near(addr) (*((uint8_t*)(addr)))
|
||||||
}
|
#define pgm_read_float_near(addr) (*((float*)(addr)))
|
||||||
|
#define pgm_read_word_near(addr) (*((uint16_t*)(addr)))
|
||||||
|
#define pgm_read_dword_near(addr) (*((uint32_t*)(addr)))
|
||||||
|
#define pgm_read_byte(addr) pgm_read_byte_near(addr)
|
||||||
|
#define pgm_read_float(addr) pgm_read_float_near(addr)
|
||||||
|
#define pgm_read_word(addr) pgm_read_word_near(addr)
|
||||||
|
#define pgm_read_dword(addr) pgm_read_dword_near(addr)
|
||||||
|
|
||||||
|
using std::memcpy;
|
||||||
|
#define memcpy_P memcpy
|
||||||
|
#define sprintf_P sprintf
|
||||||
|
#define strstr_P strstr
|
||||||
|
#define strncpy_P strncpy
|
||||||
|
#define vsnprintf_P vsnprintf
|
||||||
|
#define strcpy_P strcpy
|
||||||
|
#define snprintf_P snprintf
|
||||||
|
#define strlen_P strlen
|
||||||
|
|
||||||
// Time functions
|
// Time functions
|
||||||
extern "C" void delay(const int milis);
|
extern "C" {
|
||||||
|
void delay(const int milis);
|
||||||
|
}
|
||||||
void _delay_ms(const int delay);
|
void _delay_ms(const int delay);
|
||||||
void delayMicroseconds(unsigned long);
|
void delayMicroseconds(unsigned long);
|
||||||
uint32_t millis();
|
uint32_t millis();
|
||||||
|
@@ -25,7 +25,6 @@
|
|||||||
#if ENABLED(EMERGENCY_PARSER)
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
#include "../../../feature/e_parser.h"
|
#include "../../../feature/e_parser.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../../../core/serial_hook.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -74,11 +73,19 @@ private:
|
|||||||
volatile uint32_t index_read;
|
volatile uint32_t index_read;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct HalSerial {
|
class HalSerial {
|
||||||
|
public:
|
||||||
|
|
||||||
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
|
EmergencyParser::State emergency_state;
|
||||||
|
static inline bool emergency_parser_enabled() { return true; }
|
||||||
|
#endif
|
||||||
|
|
||||||
HalSerial() { host_connected = true; }
|
HalSerial() { host_connected = true; }
|
||||||
|
|
||||||
void begin(int32_t) {}
|
void begin(int32_t) {}
|
||||||
void end() {}
|
|
||||||
|
void end() {}
|
||||||
|
|
||||||
int peek() {
|
int peek() {
|
||||||
uint8_t value;
|
uint8_t value;
|
||||||
@@ -93,7 +100,7 @@ struct HalSerial {
|
|||||||
return transmit_buffer.write(c);
|
return transmit_buffer.write(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool connected() { return host_connected; }
|
operator bool() { return host_connected; }
|
||||||
|
|
||||||
uint16_t available() {
|
uint16_t available() {
|
||||||
return (uint16_t)receive_buffer.available();
|
return (uint16_t)receive_buffer.available();
|
||||||
@@ -110,9 +117,92 @@ struct HalSerial {
|
|||||||
while (transmit_buffer.available()) { /* nada */ }
|
while (transmit_buffer.available()) { /* nada */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printf(const char *format, ...) {
|
||||||
|
static char buffer[256];
|
||||||
|
va_list vArgs;
|
||||||
|
va_start(vArgs, format);
|
||||||
|
int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs);
|
||||||
|
va_end(vArgs);
|
||||||
|
if (length > 0 && length < 256) {
|
||||||
|
if (host_connected) {
|
||||||
|
for (int i = 0; i < length;) {
|
||||||
|
if (transmit_buffer.write(buffer[i])) {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DEC 10
|
||||||
|
#define HEX 16
|
||||||
|
#define OCT 8
|
||||||
|
#define BIN 2
|
||||||
|
|
||||||
|
void print_bin(uint32_t value, uint8_t num_digits) {
|
||||||
|
uint32_t mask = 1 << (num_digits -1);
|
||||||
|
for (uint8_t i = 0; i < num_digits; i++) {
|
||||||
|
if (!(i % 4) && i) write(' ');
|
||||||
|
if (!(i % 16) && i) write(' ');
|
||||||
|
if (value & mask) write('1');
|
||||||
|
else write('0');
|
||||||
|
value <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print(const char value[]) { printf("%s" , value); }
|
||||||
|
void print(char value, int nbase = 0) {
|
||||||
|
if (nbase == BIN) print_bin(value, 8);
|
||||||
|
else if (nbase == OCT) printf("%3o", value);
|
||||||
|
else if (nbase == HEX) printf("%2X", value);
|
||||||
|
else if (nbase == DEC ) printf("%d", value);
|
||||||
|
else printf("%c" , value);
|
||||||
|
}
|
||||||
|
void print(unsigned char value, int nbase = 0) {
|
||||||
|
if (nbase == BIN) print_bin(value, 8);
|
||||||
|
else if (nbase == OCT) printf("%3o", value);
|
||||||
|
else if (nbase == HEX) printf("%2X", value);
|
||||||
|
else printf("%u" , value);
|
||||||
|
}
|
||||||
|
void print(int value, int nbase = 0) {
|
||||||
|
if (nbase == BIN) print_bin(value, 16);
|
||||||
|
else if (nbase == OCT) printf("%6o", value);
|
||||||
|
else if (nbase == HEX) printf("%4X", value);
|
||||||
|
else printf("%d", value);
|
||||||
|
}
|
||||||
|
void print(unsigned int value, int nbase = 0) {
|
||||||
|
if (nbase == BIN) print_bin(value, 16);
|
||||||
|
else if (nbase == OCT) printf("%6o", value);
|
||||||
|
else if (nbase == HEX) printf("%4X", value);
|
||||||
|
else printf("%u" , value);
|
||||||
|
}
|
||||||
|
void print(long value, int nbase = 0) {
|
||||||
|
if (nbase == BIN) print_bin(value, 32);
|
||||||
|
else if (nbase == OCT) printf("%11o", value);
|
||||||
|
else if (nbase == HEX) printf("%8X", value);
|
||||||
|
else printf("%ld" , value);
|
||||||
|
}
|
||||||
|
void print(unsigned long value, int nbase = 0) {
|
||||||
|
if (nbase == BIN) print_bin(value, 32);
|
||||||
|
else if (nbase == OCT) printf("%11o", value);
|
||||||
|
else if (nbase == HEX) printf("%8X", value);
|
||||||
|
else printf("%lu" , value);
|
||||||
|
}
|
||||||
|
void print(float value, int round = 6) { printf("%f" , value); }
|
||||||
|
void print(double value, int round = 6) { printf("%f" , value); }
|
||||||
|
|
||||||
|
void println(const char value[]) { printf("%s\n" , value); }
|
||||||
|
void println(char value, int nbase = 0) { print(value, nbase); println(); }
|
||||||
|
void println(unsigned char value, int nbase = 0) { print(value, nbase); println(); }
|
||||||
|
void println(int value, int nbase = 0) { print(value, nbase); println(); }
|
||||||
|
void println(unsigned int value, int nbase = 0) { print(value, nbase); println(); }
|
||||||
|
void println(long value, int nbase = 0) { print(value, nbase); println(); }
|
||||||
|
void println(unsigned long value, int nbase = 0) { print(value, nbase); println(); }
|
||||||
|
void println(float value, int round = 6) { printf("%f\n" , value); }
|
||||||
|
void println(double value, int round = 6) { printf("%f\n" , value); }
|
||||||
|
void println() { print('\n'); }
|
||||||
|
|
||||||
volatile RingBuffer<uint8_t, 128> receive_buffer;
|
volatile RingBuffer<uint8_t, 128> receive_buffer;
|
||||||
volatile RingBuffer<uint8_t, 128> transmit_buffer;
|
volatile RingBuffer<uint8_t, 128> transmit_buffer;
|
||||||
volatile bool host_connected;
|
volatile bool host_connected;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Serial1Class<HalSerial> MSerialT;
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
|
*
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
@@ -18,23 +19,22 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef __PLAT_LINUX__
|
#ifdef __PLAT_LINUX__
|
||||||
|
|
||||||
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
extern void setup();
|
||||||
|
extern void loop();
|
||||||
|
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include "../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
#include "hardware/IOLoggerCSV.h"
|
#include "hardware/IOLoggerCSV.h"
|
||||||
#include "hardware/Heater.h"
|
#include "hardware/Heater.h"
|
||||||
#include "hardware/LinearAxis.h"
|
#include "hardware/LinearAxis.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <thread>
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
extern void setup();
|
|
||||||
extern void loop();
|
|
||||||
|
|
||||||
// simple stdout / stdin implementation for fake serial port
|
// simple stdout / stdin implementation for fake serial port
|
||||||
void write_serial_thread() {
|
void write_serial_thread() {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -64,6 +64,8 @@ void simulation_loop() {
|
|||||||
LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN);
|
LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN);
|
||||||
LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC);
|
LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC);
|
||||||
|
|
||||||
|
//#define GPIO_LOGGING // Full GPIO and Positional Logging
|
||||||
|
|
||||||
#ifdef GPIO_LOGGING
|
#ifdef GPIO_LOGGING
|
||||||
IOLoggerCSV logger("all_gpio_log.csv");
|
IOLoggerCSV logger("all_gpio_log.csv");
|
||||||
Gpio::attachLogger(&logger);
|
Gpio::attachLogger(&logger);
|
||||||
@@ -86,7 +88,7 @@ void simulation_loop() {
|
|||||||
|
|
||||||
#ifdef GPIO_LOGGING
|
#ifdef GPIO_LOGGING
|
||||||
if (x_axis.position != x || y_axis.position != y || z_axis.position != z) {
|
if (x_axis.position != x || y_axis.position != y || z_axis.position != z) {
|
||||||
uint64_t update = _MAX(x_axis.last_update, y_axis.last_update, z_axis.last_update);
|
uint64_t update = MAX3(x_axis.last_update, y_axis.last_update, z_axis.last_update);
|
||||||
position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl;
|
position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl;
|
||||||
position_log.flush();
|
position_log.flush();
|
||||||
x = x_axis.position;
|
x = x_axis.position;
|
||||||
@@ -105,8 +107,8 @@ int main() {
|
|||||||
std::thread write_serial (write_serial_thread);
|
std::thread write_serial (write_serial_thread);
|
||||||
std::thread read_serial (read_serial_thread);
|
std::thread read_serial (read_serial_thread);
|
||||||
|
|
||||||
#ifdef MYSERIAL1
|
#ifdef MYSERIAL0
|
||||||
MYSERIAL1.begin(BAUDRATE);
|
MYSERIAL0.begin(BAUDRATE);
|
||||||
SERIAL_ECHOLNPGM("x86_64 Initialized");
|
SERIAL_ECHOLNPGM("x86_64 Initialized");
|
||||||
SERIAL_FLUSHTX();
|
SERIAL_FLUSHTX();
|
||||||
#endif
|
#endif
|
||||||
|
@@ -26,15 +26,15 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
||||||
#define pwm_details(pin) NOOP // (do nothing)
|
#define pwm_details(pin) pin = pin // do nothing // print PWM details
|
||||||
#define pwm_status(pin) false // Print a pin's PWM status. Return true if it's currently a PWM pin.
|
#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin.
|
||||||
#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0)
|
#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0)
|
||||||
#define digitalRead_mod(p) digitalRead(p)
|
#define digitalRead_mod(p) digitalRead(p)
|
||||||
#define PRINT_PORT(p)
|
#define PRINT_PORT(p)
|
||||||
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
||||||
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
|
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
// active ADC function/mode/code values for PINSEL registers
|
// active ADC function/mode/code values for PINSEL registers
|
||||||
constexpr int8_t ADC_pin_mode(pin_t pin) {
|
constexpr int8_t ADC_pin_mode(pin_t pin) {
|
||||||
|
@@ -24,32 +24,31 @@
|
|||||||
#include "../../core/macros.h"
|
#include "../../core/macros.h"
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_ENABLE == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN)
|
#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
|
||||||
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
|
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
|
||||||
// needed due to the speed and mode required for communicating with each device being different.
|
// needed due to the speed and mode required for communicating with each device being different.
|
||||||
// This requirement can be removed if the SPI access to these devices is updated to use
|
// This requirement can be removed if the SPI access to these devices is updated to use
|
||||||
// spiBeginTransaction.
|
// spiBeginTransaction.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Onboard SD
|
/** onboard SD card */
|
||||||
//#define SD_SCK_PIN P0_07
|
//#define SCK_PIN P0_07
|
||||||
//#define SD_MISO_PIN P0_08
|
//#define MISO_PIN P0_08
|
||||||
//#define SD_MOSI_PIN P0_09
|
//#define MOSI_PIN P0_09
|
||||||
//#define SD_SS_PIN P0_06
|
//#define SS_PIN P0_06
|
||||||
|
/** external */
|
||||||
// External SD
|
#ifndef SCK_PIN
|
||||||
#ifndef SD_SCK_PIN
|
#define SCK_PIN 50
|
||||||
#define SD_SCK_PIN 50
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MISO_PIN
|
#ifndef MISO_PIN
|
||||||
#define SD_MISO_PIN 51
|
#define MISO_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MOSI_PIN
|
#ifndef MOSI_PIN
|
||||||
#define SD_MOSI_PIN 52
|
#define MOSI_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_SS_PIN
|
#ifndef SS_PIN
|
||||||
#define SD_SS_PIN 53
|
#define SS_PIN 53
|
||||||
#endif
|
#endif
|
||||||
#ifndef SDSS
|
#ifndef SDSS
|
||||||
#define SDSS SD_SS_PIN
|
#define SDSS SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
@@ -27,8 +27,6 @@
|
|||||||
|
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
|
|
||||||
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
|
||||||
|
|
||||||
void watchdog_init() {}
|
void watchdog_init() {}
|
||||||
void HAL_watchdog_refresh() {}
|
void HAL_watchdog_refresh() {}
|
||||||
|
|
||||||
|
@@ -21,5 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#define WDT_TIMEOUT 4000000 // 4 second timeout
|
||||||
|
|
||||||
void watchdog_init();
|
void watchdog_init();
|
||||||
void HAL_watchdog_refresh();
|
void HAL_watchdog_refresh();
|
||||||
|
322
Marlin/src/HAL/LPC1768/DebugMonitor.cpp
Normal file
322
Marlin/src/HAL/LPC1768/DebugMonitor.cpp
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef TARGET_LPC1768
|
||||||
|
|
||||||
|
#include "../../core/macros.h"
|
||||||
|
#include "../../core/serial.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "../shared/backtrace/unwinder.h"
|
||||||
|
#include "../shared/backtrace/unwmemaccess.h"
|
||||||
|
#include "watchdog.h"
|
||||||
|
#include <debug_frmwrk.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Debug monitor that dumps to the Programming port all status when
|
||||||
|
// an exception or WDT timeout happens - And then resets the board
|
||||||
|
|
||||||
|
// All the Monitor routines must run with interrupts disabled and
|
||||||
|
// under an ISR execution context. That is why we cannot reuse the
|
||||||
|
// Serial interrupt routines or any C runtime, as we don't know the
|
||||||
|
// state we are when running them
|
||||||
|
|
||||||
|
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
||||||
|
#define sw_barrier() __asm__ volatile("": : :"memory");
|
||||||
|
|
||||||
|
// (re)initialize UART0 as a monitor output to 250000,n,8,1
|
||||||
|
static void TXBegin() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send character through UART with no interrupts
|
||||||
|
static void TX(char c) {
|
||||||
|
_DBC(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send String through UART
|
||||||
|
static void TX(const char* s) {
|
||||||
|
while (*s) TX(*s++);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TXDigit(uint32_t d) {
|
||||||
|
if (d < 10) TX((char)(d+'0'));
|
||||||
|
else if (d < 16) TX((char)(d+'A'-10));
|
||||||
|
else TX('?');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send Hex number thru UART
|
||||||
|
static void TXHex(uint32_t v) {
|
||||||
|
TX("0x");
|
||||||
|
for (uint8_t i = 0; i < 8; i++, v <<= 4)
|
||||||
|
TXDigit((v >> 28) & 0xF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send Decimal number thru UART
|
||||||
|
static void TXDec(uint32_t v) {
|
||||||
|
if (!v) {
|
||||||
|
TX('0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char nbrs[14];
|
||||||
|
char *p = &nbrs[0];
|
||||||
|
while (v != 0) {
|
||||||
|
*p++ = '0' + (v % 10);
|
||||||
|
v /= 10;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
p--;
|
||||||
|
TX(*p);
|
||||||
|
} while (p != &nbrs[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dump a backtrace entry
|
||||||
|
static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
||||||
|
int* p = (int*)ctx;
|
||||||
|
|
||||||
|
(*p)++;
|
||||||
|
TX('#'); TXDec(*p); TX(" : ");
|
||||||
|
TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function);
|
||||||
|
TX('+'); TXDec(bte->address - bte->function);
|
||||||
|
TX(" PC:");TXHex(bte->address); TX('\n');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef UNW_DEBUG
|
||||||
|
void UnwPrintf(const char* format, ...) {
|
||||||
|
char dest[256];
|
||||||
|
va_list argptr;
|
||||||
|
va_start(argptr, format);
|
||||||
|
vsprintf(dest, format, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
TX(&dest[0]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Table of function pointers for passing to the unwinder */
|
||||||
|
static const UnwindCallbacks UnwCallbacks = {
|
||||||
|
UnwReportOut,
|
||||||
|
UnwReadW,
|
||||||
|
UnwReadH,
|
||||||
|
UnwReadB
|
||||||
|
#ifdef UNW_DEBUG
|
||||||
|
,UnwPrintf
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HardFaultHandler_C:
|
||||||
|
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
|
||||||
|
* as the parameter. We can then read the values from the stack and place them
|
||||||
|
* into local variables for ease of reading.
|
||||||
|
* We then read the various Fault Status and Address Registers to help decode
|
||||||
|
* cause of the fault.
|
||||||
|
* The function ends with a BKPT instruction to force control back into the debugger
|
||||||
|
*/
|
||||||
|
extern "C"
|
||||||
|
void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) {
|
||||||
|
|
||||||
|
static const char* causestr[] = {
|
||||||
|
"NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC"
|
||||||
|
};
|
||||||
|
|
||||||
|
UnwindFrame btf;
|
||||||
|
|
||||||
|
// Dump report to the Programming port (interrupts are DISABLED)
|
||||||
|
TXBegin();
|
||||||
|
TX("\n\n## Software Fault detected ##\n");
|
||||||
|
TX("Cause: "); TX(causestr[cause]); TX('\n');
|
||||||
|
|
||||||
|
TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n');
|
||||||
|
TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n');
|
||||||
|
TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n');
|
||||||
|
TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n');
|
||||||
|
TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n');
|
||||||
|
TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n');
|
||||||
|
TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n');
|
||||||
|
TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n');
|
||||||
|
|
||||||
|
// Configurable Fault Status Register
|
||||||
|
// Consists of MMSR, BFSR and UFSR
|
||||||
|
TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n');
|
||||||
|
|
||||||
|
// Hard Fault Status Register
|
||||||
|
TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n');
|
||||||
|
|
||||||
|
// Debug Fault Status Register
|
||||||
|
TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n');
|
||||||
|
|
||||||
|
// Auxiliary Fault Status Register
|
||||||
|
TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n');
|
||||||
|
|
||||||
|
// Read the Fault Address Registers. These may not contain valid values.
|
||||||
|
// Check BFARVALID/MMARVALID to see if they are valid values
|
||||||
|
// MemManage Fault Address Register
|
||||||
|
TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n');
|
||||||
|
|
||||||
|
// Bus Fault Address Register
|
||||||
|
TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n');
|
||||||
|
|
||||||
|
TX("ExcLR: "); TXHex(lr); TX('\n');
|
||||||
|
TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n');
|
||||||
|
|
||||||
|
btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer
|
||||||
|
btf.fp = btf.sp;
|
||||||
|
btf.lr = ((unsigned long)sp[5]);
|
||||||
|
btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it
|
||||||
|
|
||||||
|
// Perform a backtrace
|
||||||
|
TX("\nBacktrace:\n\n");
|
||||||
|
int ctr = 0;
|
||||||
|
UnwindStart(&btf, &UnwCallbacks, &ctr);
|
||||||
|
|
||||||
|
// Disable all NVIC interrupts
|
||||||
|
NVIC->ICER[0] = 0xFFFFFFFF;
|
||||||
|
NVIC->ICER[1] = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
// Relocate VTOR table to default position
|
||||||
|
SCB->VTOR = 0;
|
||||||
|
|
||||||
|
// Clear cause of reset to prevent entering smoothie bootstrap
|
||||||
|
HAL_clear_reset_source();
|
||||||
|
|
||||||
|
// Restart watchdog
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
//WDT_Restart(WDT);
|
||||||
|
watchdog_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset controller
|
||||||
|
NVIC_SystemReset();
|
||||||
|
|
||||||
|
// Nothing below here is compiled because NVIC_SystemReset loops forever
|
||||||
|
|
||||||
|
for (;;) { TERN_(USE_WATCHDOG, watchdog_init()); }
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
__attribute__((naked)) void NMI_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#0")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void HardFault_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#1")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void MemManage_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#2")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void BusFault_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#3")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void UsageFault_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#4")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void DebugMon_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#5")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
|
||||||
|
__attribute__((naked)) void WDT_IRQHandler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#6")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((naked)) void RSTC_Handler() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
".syntax unified" "\n\t"
|
||||||
|
A("tst lr, #4")
|
||||||
|
A("ite eq")
|
||||||
|
A("mrseq r0, msp")
|
||||||
|
A("mrsne r0, psp")
|
||||||
|
A("mov r1,lr")
|
||||||
|
A("mov r2,#7")
|
||||||
|
A("b HardFault_HandlerC")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // TARGET_LPC1768
|
@@ -29,18 +29,21 @@
|
|||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DefaultSerial1 USBSerial(false, UsbSerial);
|
|
||||||
|
|
||||||
uint32_t HAL_adc_reading = 0;
|
uint32_t HAL_adc_reading = 0;
|
||||||
|
|
||||||
// U8glib required functions
|
// U8glib required functions
|
||||||
extern "C" {
|
extern "C" void u8g_xMicroDelay(uint16_t val) {
|
||||||
void u8g_xMicroDelay(uint16_t val) { DELAY_US(val); }
|
DELAY_US(val);
|
||||||
void u8g_MicroDelay() { u8g_xMicroDelay(1); }
|
}
|
||||||
void u8g_10MicroDelay() { u8g_xMicroDelay(10); }
|
extern "C" void u8g_MicroDelay() {
|
||||||
void u8g_Delay(uint16_t val) { delay(val); }
|
u8g_xMicroDelay(1);
|
||||||
|
}
|
||||||
|
extern "C" void u8g_10MicroDelay() {
|
||||||
|
u8g_xMicroDelay(10);
|
||||||
|
}
|
||||||
|
extern "C" void u8g_Delay(uint16_t val) {
|
||||||
|
delay(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
//************************//
|
//************************//
|
||||||
|
|
||||||
// return free heap space
|
// return free heap space
|
||||||
@@ -63,12 +66,7 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) {
|
|||||||
return ind > -1 ? ind : dval;
|
return ind > -1 ? ind : dval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void flashFirmware(const int16_t) {
|
void flashFirmware(const int16_t) { NVIC_SystemReset(); }
|
||||||
delay(500); // Give OS time to disconnect
|
|
||||||
USB_Connect(false); // USB clear connection
|
|
||||||
delay(1000); // Give OS time to notice
|
|
||||||
HAL_reboot();
|
|
||||||
}
|
|
||||||
|
|
||||||
void HAL_clear_reset_source(void) {
|
void HAL_clear_reset_source(void) {
|
||||||
TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag());
|
TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag());
|
||||||
@@ -81,6 +79,4 @@ uint8_t HAL_get_reset_source(void) {
|
|||||||
return RST_POWER_ON;
|
return RST_POWER_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_reboot() { NVIC_SystemReset(); }
|
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
#endif // TARGET_LPC1768
|
||||||
|
@@ -47,6 +47,9 @@ extern "C" volatile uint32_t _millis;
|
|||||||
#include <pinmapping.h>
|
#include <pinmapping.h>
|
||||||
#include <CDCSerial.h>
|
#include <CDCSerial.h>
|
||||||
|
|
||||||
|
// i2c uses 8-bit shifted address
|
||||||
|
#define I2C_ADDRESS(A) uint8_t((A) << 1)
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default graphical display delays
|
// Default graphical display delays
|
||||||
//
|
//
|
||||||
@@ -60,60 +63,35 @@ extern "C" volatile uint32_t _millis;
|
|||||||
#define ST7920_DELAY_3 DELAY_NS(750)
|
#define ST7920_DELAY_3 DELAY_NS(750)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1;
|
|
||||||
extern DefaultSerial1 USBSerial;
|
|
||||||
|
|
||||||
#define _MSERIAL(X) MSerial##X
|
#define _MSERIAL(X) MSerial##X
|
||||||
#define MSERIAL(X) _MSERIAL(X)
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
#define MSerial0 MSerial
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
#define MYSERIAL1 USBSerial
|
#define MYSERIAL0 UsbSerial
|
||||||
#elif WITHIN(SERIAL_PORT, 0, 3)
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
#define MYSERIAL0 MSERIAL(SERIAL_PORT)
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
#define MYSERIAL2 USBSerial
|
#define MYSERIAL1 UsbSerial
|
||||||
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
#define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT_2 must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
|
||||||
#if SERIAL_PORT_3 == -1
|
|
||||||
#define MYSERIAL3 USBSerial
|
|
||||||
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
|
||||||
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
|
||||||
#else
|
|
||||||
#error "SERIAL_PORT_3 must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
|
||||||
#if MMU2_SERIAL_PORT == -1
|
|
||||||
#define MMU2_SERIAL USBSerial
|
|
||||||
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
|
||||||
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
|
||||||
#else
|
|
||||||
#error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if LCD_SERIAL_PORT == -1
|
#if LCD_SERIAL_PORT == -1
|
||||||
#define LCD_SERIAL USBSerial
|
#define LCD_SERIAL UsbSerial
|
||||||
#elif WITHIN(LCD_SERIAL_PORT, 0, 3)
|
#elif WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
#else
|
#else
|
||||||
#error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
|
#error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
||||||
#endif
|
|
||||||
#if HAS_DGUS_LCD
|
|
||||||
#define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available()
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -129,16 +107,10 @@ extern DefaultSerial1 USBSerial;
|
|||||||
//
|
//
|
||||||
// Utility functions
|
// Utility functions
|
||||||
//
|
//
|
||||||
#if GCC_VERSION <= 50000
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int freeMemory();
|
int freeMemory();
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
#if GCC_VERSION <= 50000
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC API
|
// ADC API
|
||||||
@@ -228,4 +200,9 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255,
|
|||||||
void HAL_clear_reset_source(void);
|
void HAL_clear_reset_source(void);
|
||||||
uint8_t HAL_get_reset_source(void);
|
uint8_t HAL_get_reset_source(void);
|
||||||
|
|
||||||
void HAL_reboot();
|
inline void HAL_reboot() {} // reboot the board or restart the bootloader
|
||||||
|
|
||||||
|
// Add strcmp_P if missing
|
||||||
|
#ifndef strcmp_P
|
||||||
|
#define strcmp_P(a, b) strcmp((a), (b))
|
||||||
|
#endif
|
||||||
|
@@ -1,51 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef TARGET_LPC1768
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "HAL.h"
|
|
||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
|
||||||
|
|
||||||
#include "../shared/HAL_MinSerial.h"
|
|
||||||
#include <debug_frmwrk.h>
|
|
||||||
|
|
||||||
static void TX(char c) { _DBC(c); }
|
|
||||||
void install_min_serial() { HAL_min_serial_out = &TX; }
|
|
||||||
|
|
||||||
#if DISABLED(DYNAMIC_VECTORTABLE)
|
|
||||||
extern "C" {
|
|
||||||
__attribute__((naked)) void JumpHandler_ASM() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"b CommonHandler_ASM\n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // POSTMORTEM_DEBUGGING
|
|
||||||
#endif // TARGET_LPC1768
|
|
@@ -55,33 +55,27 @@
|
|||||||
#include <lpc17xx_pinsel.h>
|
#include <lpc17xx_pinsel.h>
|
||||||
#include <lpc17xx_clkpwr.h>
|
#include <lpc17xx_clkpwr.h>
|
||||||
|
|
||||||
#include "../shared/HAL_SPI.h"
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
#if ENABLED(LPC_SOFTWARE_SPI)
|
#if ENABLED(LPC_SOFTWARE_SPI)
|
||||||
|
|
||||||
// Software SPI
|
|
||||||
|
|
||||||
#include <SoftwareSPI.h>
|
#include <SoftwareSPI.h>
|
||||||
|
|
||||||
#ifndef HAL_SPI_SPEED
|
// Software SPI
|
||||||
#define HAL_SPI_SPEED SPI_FULL_SPEED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static uint8_t SPI_speed = HAL_SPI_SPEED;
|
static uint8_t SPI_speed = 0;
|
||||||
|
|
||||||
static uint8_t spiTransfer(uint8_t b) {
|
static uint8_t spiTransfer(uint8_t b) {
|
||||||
return swSpiTransfer(b, SPI_speed, SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
|
return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
swSpiBegin(SD_SCK_PIN, SD_MISO_PIN, SD_MOSI_PIN);
|
swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
SPI_speed = swSpiInit(spiRate, SD_SCK_PIN, SD_MOSI_PIN);
|
SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiRec() { return spiTransfer(0xFF); }
|
uint8_t spiRec() { return spiTransfer(0xFF); }
|
||||||
@@ -93,12 +87,12 @@
|
|||||||
|
|
||||||
void spiSend(uint8_t b) { (void)spiTransfer(b); }
|
void spiSend(uint8_t b) { (void)spiTransfer(b); }
|
||||||
|
|
||||||
void spiSend(const uint8_t *buf, size_t nbyte) {
|
void spiSend(const uint8_t* buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++)
|
for (uint16_t i = 0; i < nbyte; i++)
|
||||||
(void)spiTransfer(buf[i]);
|
(void)spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
(void)spiTransfer(token);
|
(void)spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
(void)spiTransfer(buf[i]);
|
(void)spiTransfer(buf[i]);
|
||||||
@@ -106,20 +100,14 @@
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#ifndef HAL_SPI_SPEED
|
void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0
|
||||||
#ifdef SD_SPI_SPEED
|
spiInit(SPI_SPEED);
|
||||||
#define HAL_SPI_SPEED SD_SPI_SPEED
|
}
|
||||||
#else
|
|
||||||
#define HAL_SPI_SPEED SPI_FULL_SPEED
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void spiBegin() { spiInit(HAL_SPI_SPEED); } // Set up SCK, MOSI & MISO pins for SSP0
|
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
|
#if MISO_PIN == BOARD_SPI1_MISO_PIN
|
||||||
SPI.setModule(1);
|
SPI.setModule(1);
|
||||||
#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
|
#elif MISO_PIN == BOARD_SPI2_MISO_PIN
|
||||||
SPI.setModule(2);
|
SPI.setModule(2);
|
||||||
#endif
|
#endif
|
||||||
SPI.setDataSize(DATA_SIZE_8BIT);
|
SPI.setDataSize(DATA_SIZE_8BIT);
|
||||||
@@ -135,13 +123,15 @@
|
|||||||
|
|
||||||
void spiSend(uint8_t b) { doio(b); }
|
void spiSend(uint8_t b) { doio(b); }
|
||||||
|
|
||||||
void spiSend(const uint8_t *buf, size_t nbyte) {
|
void spiSend(const uint8_t* buf, size_t nbyte) {
|
||||||
for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]);
|
for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiSend(uint32_t chan, byte b) {}
|
void spiSend(uint32_t chan, byte b) {
|
||||||
|
}
|
||||||
|
|
||||||
void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {}
|
void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
|
||||||
|
}
|
||||||
|
|
||||||
// Read single byte from SPI
|
// Read single byte from SPI
|
||||||
uint8_t spiRec() { return doio(0xFF); }
|
uint8_t spiRec() { return doio(0xFF); }
|
||||||
@@ -153,18 +143,21 @@
|
|||||||
for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF);
|
for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiTransfer(uint8_t b) { return doio(b); }
|
uint8_t spiTransfer(uint8_t b) {
|
||||||
|
return doio(b);
|
||||||
|
}
|
||||||
|
|
||||||
// Write from buffer to SPI
|
// Write from buffer to SPI
|
||||||
void spiSendBlock(uint8_t token, const uint8_t *buf) {
|
void spiSendBlock(uint8_t token, const uint8_t* buf) {
|
||||||
(void)spiTransfer(token);
|
(void)spiTransfer(token);
|
||||||
for (uint16_t i = 0; i < 512; i++)
|
for (uint16_t i = 0; i < 512; i++)
|
||||||
(void)spiTransfer(buf[i]);
|
(void)spiTransfer(buf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Begin SPI transaction, set clock, bit order, data mode
|
/** Begin SPI transaction, set clock, bit order, data mode */
|
||||||
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
||||||
// TODO: Implement this method
|
// TODO: to be implemented
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // LPC_SOFTWARE_SPI
|
#endif // LPC_SOFTWARE_SPI
|
||||||
@@ -208,15 +201,6 @@ SPIClass::SPIClass(uint8_t device) {
|
|||||||
GPDMA_Init();
|
GPDMA_Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
SPIClass::SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel) {
|
|
||||||
#if BOARD_NR_SPI >= 1
|
|
||||||
if (mosi == BOARD_SPI1_MOSI_PIN) SPIClass(1);
|
|
||||||
#endif
|
|
||||||
#if BOARD_NR_SPI >= 2
|
|
||||||
if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void SPIClass::begin() {
|
void SPIClass::begin() {
|
||||||
// Init the SPI pins in the first begin call
|
// Init the SPI pins in the first begin call
|
||||||
if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) ||
|
if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) ||
|
||||||
@@ -279,9 +263,8 @@ uint16_t SPIClass::transfer16(const uint16_t data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SPIClass::end() {
|
void SPIClass::end() {
|
||||||
// Neither is needed for Marlin
|
// SSP_Cmd(_currentSetting->spi_d, DISABLE); // stop device or SSP_DeInit?
|
||||||
//SSP_Cmd(_currentSetting->spi_d, DISABLE);
|
SSP_DeInit(_currentSetting->spi_d);
|
||||||
//SSP_DeInit(_currentSetting->spi_d);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPIClass::send(uint8_t data) {
|
void SPIClass::send(uint8_t data) {
|
||||||
@@ -347,15 +330,25 @@ void SPIClass::read(uint8_t *buf, uint32_t len) {
|
|||||||
for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF);
|
for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPIClass::setClock(uint32_t clock) { _currentSetting->clock = clock; }
|
void SPIClass::setClock(uint32_t clock) {
|
||||||
|
_currentSetting->clock = clock;
|
||||||
|
}
|
||||||
|
|
||||||
void SPIClass::setModule(uint8_t device) { _currentSetting = &_settings[device - 1]; } // SPI channels are called 1, 2, and 3 but the array is zero-indexed
|
void SPIClass::setModule(uint8_t device) {
|
||||||
|
_currentSetting = &_settings[device - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed
|
||||||
|
}
|
||||||
|
|
||||||
void SPIClass::setBitOrder(uint8_t bitOrder) { _currentSetting->bitOrder = bitOrder; }
|
void SPIClass::setBitOrder(uint8_t bitOrder) {
|
||||||
|
_currentSetting->bitOrder = bitOrder;
|
||||||
|
}
|
||||||
|
|
||||||
void SPIClass::setDataMode(uint8_t dataMode) { _currentSetting->dataMode = dataMode; }
|
void SPIClass::setDataMode(uint8_t dataMode) {
|
||||||
|
_currentSetting->dataMode = dataMode;
|
||||||
|
}
|
||||||
|
|
||||||
void SPIClass::setDataSize(uint32_t dataSize) { _currentSetting->dataSize = dataSize; }
|
void SPIClass::setDataSize(uint32_t ds) {
|
||||||
|
_currentSetting->dataSize = ds;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up/tear down
|
* Set up/tear down
|
||||||
@@ -363,8 +356,8 @@ void SPIClass::setDataSize(uint32_t dataSize) { _currentSetting->dataSize = data
|
|||||||
void SPIClass::updateSettings() {
|
void SPIClass::updateSettings() {
|
||||||
//SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?!
|
//SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?!
|
||||||
|
|
||||||
// Divide PCLK by 2 for SSP0
|
// divide PCLK by 2 for SSP0
|
||||||
//CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2);
|
CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2);
|
||||||
|
|
||||||
SSP_CFG_Type HW_SPI_init; // data structure to hold init values
|
SSP_CFG_Type HW_SPI_init; // data structure to hold init values
|
||||||
SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode
|
SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode
|
||||||
@@ -403,9 +396,9 @@ void SPIClass::updateSettings() {
|
|||||||
SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers
|
SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SD_MISO_PIN == BOARD_SPI1_MISO_PIN
|
#if MISO_PIN == BOARD_SPI1_MISO_PIN
|
||||||
SPIClass SPI(1);
|
SPIClass SPI(1);
|
||||||
#elif SD_MISO_PIN == BOARD_SPI2_MISO_PIN
|
#elif MISO_PIN == BOARD_SPI2_MISO_PIN
|
||||||
SPIClass SPI(2);
|
SPIClass SPI(2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <SPI.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Marlin currently requires 3 SPI classes:
|
|
||||||
*
|
|
||||||
* SPIClass:
|
|
||||||
* This class is normally provided by frameworks and has a semi-default interface.
|
|
||||||
* This is needed because some libraries reference it globally.
|
|
||||||
*
|
|
||||||
* SPISettings:
|
|
||||||
* Container for SPI configs for SPIClass. As above, libraries may reference it globally.
|
|
||||||
*
|
|
||||||
* These two classes are often provided by frameworks so we cannot extend them to add
|
|
||||||
* useful methods for Marlin.
|
|
||||||
*
|
|
||||||
* MarlinSPI:
|
|
||||||
* Provides the default SPIClass interface plus some Marlin goodies such as a simplified
|
|
||||||
* interface for SPI DMA transfer.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
using MarlinSPI = SPIClass;
|
|
@@ -21,51 +21,35 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef TARGET_LPC1768
|
#ifdef TARGET_LPC1768
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#if USING_SERIAL_0
|
||||||
|
MarlinSerial MSerial(LPC_UART0);
|
||||||
#if USING_HW_SERIAL0
|
extern "C" void UART0_IRQHandler() {
|
||||||
MarlinSerial _MSerial0(LPC_UART0);
|
MSerial.IRQHandler();
|
||||||
MSerialT MSerial0(true, _MSerial0);
|
|
||||||
extern "C" void UART0_IRQHandler() { _MSerial0.IRQHandler(); }
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
MarlinSerial _MSerial1((LPC_UART_TypeDef *) LPC_UART1);
|
|
||||||
MSerialT MSerial1(true, _MSerial1);
|
|
||||||
extern "C" void UART1_IRQHandler() { _MSerial1.IRQHandler(); }
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
MarlinSerial _MSerial2(LPC_UART2);
|
|
||||||
MSerialT MSerial2(true, _MSerial2);
|
|
||||||
extern "C" void UART2_IRQHandler() { _MSerial2.IRQHandler(); }
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
MarlinSerial _MSerial3(LPC_UART3);
|
|
||||||
MSerialT MSerial3(true, _MSerial3);
|
|
||||||
extern "C" void UART3_IRQHandler() { _MSerial3.IRQHandler(); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
|
|
||||||
bool MarlinSerial::recv_callback(const char c) {
|
|
||||||
// Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro)
|
|
||||||
if (false) {}
|
|
||||||
#if USING_HW_SERIAL0
|
|
||||||
else if (this == &_MSerial0) emergency_parser.update(MSerial0.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL1
|
|
||||||
else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL2
|
|
||||||
else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
#if USING_HW_SERIAL3
|
|
||||||
else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c);
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USING_SERIAL_1
|
||||||
|
MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1);
|
||||||
|
extern "C" void UART1_IRQHandler() {
|
||||||
|
MSerial1.IRQHandler();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USING_SERIAL_2
|
||||||
|
MarlinSerial MSerial2(LPC_UART2);
|
||||||
|
extern "C" void UART2_IRQHandler() {
|
||||||
|
MSerial2.IRQHandler();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USING_SERIAL_3
|
||||||
|
MarlinSerial MSerial3(LPC_UART3);
|
||||||
|
extern "C" void UART3_IRQHandler() {
|
||||||
|
MSerial3.IRQHandler();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TARGET_LPC1768
|
#endif // TARGET_LPC1768
|
||||||
|
@@ -28,7 +28,6 @@
|
|||||||
#if ENABLED(EMERGENCY_PARSER)
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
#include "../../feature/e_parser.h"
|
#include "../../feature/e_parser.h"
|
||||||
#endif
|
#endif
|
||||||
#include "../../core/serial_hook.h"
|
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
#ifndef SERIAL_PORT
|
||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
@@ -42,26 +41,27 @@
|
|||||||
|
|
||||||
class MarlinSerial : public HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE> {
|
class MarlinSerial : public HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE> {
|
||||||
public:
|
public:
|
||||||
MarlinSerial(LPC_UART_TypeDef *UARTx) : HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE>(UARTx) { }
|
MarlinSerial(LPC_UART_TypeDef *UARTx) :
|
||||||
|
HardwareSerial<RX_BUFFER_SIZE, TX_BUFFER_SIZE>(UARTx)
|
||||||
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
|
, emergency_state(EmergencyParser::State::EP_RESET)
|
||||||
|
#endif
|
||||||
|
{ }
|
||||||
|
|
||||||
void end() {}
|
void end() {}
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
#if ENABLED(EMERGENCY_PARSER)
|
||||||
bool recv_callback(const char c) override;
|
bool recv_callback(const char c) override {
|
||||||
|
emergency_parser.update(emergency_state, c);
|
||||||
|
return true; // do not discard character
|
||||||
|
}
|
||||||
|
|
||||||
|
EmergencyParser::State emergency_state;
|
||||||
|
static inline bool emergency_parser_enabled() { return true; }
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads
|
extern MarlinSerial MSerial;
|
||||||
// of 'available' and 'read' method are not used in this multiple inheritance scenario.
|
extern MarlinSerial MSerial1;
|
||||||
// Instead, use a ForwardSerial here that adapts the interface.
|
extern MarlinSerial MSerial2;
|
||||||
typedef ForwardSerial1Class<MarlinSerial> MSerialT;
|
extern MarlinSerial MSerial3;
|
||||||
extern MSerialT MSerial0;
|
|
||||||
extern MSerialT MSerial1;
|
|
||||||
extern MSerialT MSerial2;
|
|
||||||
extern MSerialT MSerial3;
|
|
||||||
|
|
||||||
// Consequently, we can't use a RuntimeSerial either. The workaround would be to use
|
|
||||||
// a RuntimeSerial<ForwardSerial<MarlinSerial>> type here. Ignore for now until it's actually required.
|
|
||||||
#if ENABLED(SERIAL_RUNTIME_HOOK)
|
|
||||||
#error "SERIAL_RUNTIME_HOOK is not yet supported for LPC176x."
|
|
||||||
#endif
|
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
* Emulate EEPROM storage using Flash Memory
|
* Emulate EEPROM storage using Flash Memory
|
||||||
*
|
*
|
||||||
* Use a single 32K flash sector to store EEPROM data. To reduce the
|
* Use a single 32K flash sector to store EEPROM data. To reduce the
|
||||||
* number of erase operations a simple "leveling" scheme is used that
|
* number of erase operations a simple "levelling" scheme is used that
|
||||||
* maintains a number of EEPROM "slots" within the larger flash sector.
|
* maintains a number of EEPROM "slots" within the larger flash sector.
|
||||||
* Each slot is used in turn and the entire sector is only erased when all
|
* Each slot is used in turn and the entire sector is only erased when all
|
||||||
* slots have been used.
|
* slots have been used.
|
||||||
@@ -119,7 +119,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return false; // return true for any error
|
return false; // return true for any error
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos];
|
const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos];
|
||||||
if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i];
|
if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i];
|
||||||
crc16(crc, buff, size);
|
crc16(crc, buff, size);
|
||||||
|
@@ -83,16 +83,17 @@ bool PersistentStore::access_finish() {
|
|||||||
static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) {
|
static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) {
|
||||||
PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
|
PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
|
||||||
SERIAL_CHAR(' ');
|
SERIAL_CHAR(' ');
|
||||||
SERIAL_ECHOPGM_P(rw_str);
|
serialprintPGM(rw_str);
|
||||||
SERIAL_ECHOLNPAIR("_data(", pos, ",", value, ",", size, ", ...)");
|
SERIAL_ECHOLNPAIR("_data(", pos, ",", int(value), ",", int(size), ", ...)");
|
||||||
if (total) {
|
if (total) {
|
||||||
SERIAL_ECHOPGM(" f_");
|
SERIAL_ECHOPGM(" f_");
|
||||||
SERIAL_ECHOPGM_P(rw_str);
|
serialprintPGM(rw_str);
|
||||||
SERIAL_ECHOPAIR("()=", s, "\n size=", size, "\n bytes_");
|
SERIAL_ECHOPAIR("()=", int(s), "\n size=", int(size), "\n bytes_");
|
||||||
SERIAL_ECHOLNPAIR_P(write ? PSTR("written=") : PSTR("read="), total);
|
serialprintPGM(write ? PSTR("written=") : PSTR("read="));
|
||||||
|
SERIAL_ECHOLN(total);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
SERIAL_ECHOLNPAIR(" f_lseek()=", s);
|
SERIAL_ECHOLNPAIR(" f_lseek()=", int(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
// File function return codes for type FRESULT. This goes away soon, but
|
// File function return codes for type FRESULT. This goes away soon, but
|
||||||
@@ -142,7 +143,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
return bytes_written != size; // return true for any error
|
return bytes_written != size; // return true for any error
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
if (!eeprom_file_open) return true;
|
if (!eeprom_file_open) return true;
|
||||||
UINT bytes_read = 0;
|
UINT bytes_read = 0;
|
||||||
FRESULT s;
|
FRESULT s;
|
||||||
|
@@ -42,29 +42,33 @@ bool PersistentStore::access_start() { eeprom_init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
|
|
||||||
|
// EEPROM has only ~100,000 write cycles,
|
||||||
|
// so only write bytes that have changed!
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
if (v != eeprom_read_byte(p)) {
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
crc16(crc, &v, 1);
|
crc16(crc, &v, 1);
|
||||||
pos++;
|
pos++;
|
||||||
value++;
|
value++;
|
||||||
}
|
};
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
// Read from external EEPROM
|
// Read from external EEPROM
|
||||||
const uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
const uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
||||||
|
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
crc16(crc, &c, 1);
|
crc16(crc, &c, 1);
|
||||||
pos++;
|
pos++;
|
||||||
|
@@ -46,79 +46,79 @@ void setup_endstop_interrupts() {
|
|||||||
|
|
||||||
#if HAS_X_MAX
|
#if HAS_X_MAX
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN)
|
||||||
#error "X_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "X_MAX_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(X_MAX_PIN);
|
_ATTACH(X_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_X_MIN
|
#if HAS_X_MIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN)
|
||||||
#error "X_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "X_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(X_MIN_PIN);
|
_ATTACH(X_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Y_MAX
|
#if HAS_Y_MAX
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN)
|
||||||
#error "Y_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Y_MAX_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Y_MAX_PIN);
|
_ATTACH(Y_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Y_MIN
|
#if HAS_Y_MIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN)
|
||||||
#error "Y_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Y_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Y_MIN_PIN);
|
_ATTACH(Y_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z_MAX
|
#if HAS_Z_MAX
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN)
|
||||||
#error "Z_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z_MAX_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z_MAX_PIN);
|
_ATTACH(Z_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z_MIN
|
#if HAS_Z_MIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN)
|
||||||
#error "Z_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z_MIN_PIN);
|
_ATTACH(Z_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z2_MAX
|
#if HAS_Z2_MAX
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN)
|
||||||
#error "Z2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z2_MAX_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z2_MAX_PIN);
|
_ATTACH(Z2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z2_MIN
|
#if HAS_Z2_MIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN)
|
||||||
#error "Z2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z2_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z2_MIN_PIN);
|
_ATTACH(Z2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z3_MAX
|
#if HAS_Z3_MAX
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN)
|
||||||
#error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z3_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z3_MAX_PIN);
|
_ATTACH(Z3_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z3_MIN
|
#if HAS_Z3_MIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN)
|
||||||
#error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z3_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z3_MIN_PIN);
|
_ATTACH(Z3_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z4_MAX
|
#if HAS_Z4_MAX
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN)
|
||||||
#error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z4_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z4_MAX_PIN);
|
_ATTACH(Z4_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z4_MIN
|
#if HAS_Z4_MIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN)
|
||||||
#error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z4_MIN_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z4_MIN_PIN);
|
_ATTACH(Z4_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z_MIN_PROBE_PIN
|
#if HAS_Z_MIN_PROBE_PIN
|
||||||
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN)
|
#if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN)
|
||||||
#error "Z_MIN_PROBE_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "Z_MIN_PROBE_PIN is not INTERRUPT-capable."
|
||||||
#endif
|
#endif
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
_ATTACH(Z_MIN_PROBE_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -20,7 +20,3 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if DISABLED(NO_SD_HOST_DRIVE)
|
|
||||||
#define HAS_SD_HOST_DRIVE 1
|
|
||||||
#endif
|
|
||||||
|
@@ -26,9 +26,3 @@
|
|||||||
#elif EITHER(I2C_EEPROM, SPI_EEPROM)
|
#elif EITHER(I2C_EEPROM, SPI_EEPROM)
|
||||||
#define USE_SHARED_EEPROM 1
|
#define USE_SHARED_EEPROM 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785)
|
|
||||||
// TODO: Which other boards are incompatible?
|
|
||||||
#if defined(MCU_LPC1768) && PRINTCOUNTER_SAVE_INTERVAL > 0
|
|
||||||
#define PRINTCOUNTER_SYNC 1
|
|
||||||
#endif
|
|
||||||
|
@@ -24,14 +24,14 @@
|
|||||||
#if PIO_PLATFORM_VERSION < 1001
|
#if PIO_PLATFORM_VERSION < 1001
|
||||||
#error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically."
|
#error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically."
|
||||||
#endif
|
#endif
|
||||||
#if PIO_FRAMEWORK_VERSION < 2006
|
#if PIO_FRAMEWORK_VERSION < 2005
|
||||||
#error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries."
|
#error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect an old pins file by checking for old ADC pins values.
|
* Detect an old pins file by checking for old ADC pins values.
|
||||||
*/
|
*/
|
||||||
#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && !WITHIN(_CAT(P,_PIN), TERN(LPC1768_IS_SKRV1_3, 0, 2), 3) // Include P0_00 and P0_01 for SKR V1.3 board
|
#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && _CAT(P,_PIN) != 2 && _CAT(P,_PIN) != 3
|
||||||
#if _OLD_TEMP_PIN(TEMP_BED)
|
#if _OLD_TEMP_PIN(TEMP_BED)
|
||||||
#error "TEMP_BED_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
#error "TEMP_BED_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)."
|
||||||
#elif _OLD_TEMP_PIN(TEMP_0)
|
#elif _OLD_TEMP_PIN(TEMP_0)
|
||||||
@@ -72,7 +72,7 @@ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are in
|
|||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
#if MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF)
|
#if MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF)
|
||||||
#if IS_RRD_FG_SC && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI)
|
#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI)
|
||||||
#error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI."
|
#error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -92,13 +92,13 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#define ANY_TX(N,V...) DO(IS_TX##N,||,V)
|
#define ANY_TX(N,V...) DO(IS_TX##N,||,V)
|
||||||
#define ANY_RX(N,V...) DO(IS_RX##N,||,V)
|
#define ANY_RX(N,V...) DO(IS_RX##N,||,V)
|
||||||
|
|
||||||
#if USING_HW_SERIAL0
|
#if USING_SERIAL_0
|
||||||
#define IS_TX0(P) (P == P0_02)
|
#define IS_TX0(P) (P == P0_02)
|
||||||
#define IS_RX0(P) (P == P0_03)
|
#define IS_RX0(P) (P == P0_03)
|
||||||
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
|
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
|
||||||
#error "Serial port pins (0) conflict with Trinamic SPI pins!"
|
#error "Serial port pins (0) conflict with Trinamic SPI pins!"
|
||||||
#elif HAS_PRUSA_MMU1 && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN))
|
#elif ENABLED(MK2_MULTIPLEXER) && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN))
|
||||||
#error "Serial port pins (0) conflict with Multi-Material-Unit multiplexer pins!"
|
#error "Serial port pins (0) conflict with MK2 multiplexer pins!"
|
||||||
#elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN))
|
#elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN))
|
||||||
#error "Serial port pins (0) conflict with X/Y axis SPI pins!"
|
#error "Serial port pins (0) conflict with X/Y axis SPI pins!"
|
||||||
#endif
|
#endif
|
||||||
@@ -106,7 +106,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#undef IS_RX0
|
#undef IS_RX0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USING_HW_SERIAL1
|
#if USING_SERIAL_1
|
||||||
#define IS_TX1(P) (P == P0_15)
|
#define IS_TX1(P) (P == P0_15)
|
||||||
#define IS_RX1(P) (P == P0_16)
|
#define IS_RX1(P) (P == P0_16)
|
||||||
#define _IS_TX1_1 IS_TX1
|
#define _IS_TX1_1 IS_TX1
|
||||||
@@ -116,8 +116,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#elif HAS_WIRED_LCD
|
#elif HAS_WIRED_LCD
|
||||||
#if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
|
#if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
|
||||||
#error "Serial port pins (1) conflict with Encoder Buttons!"
|
#error "Serial port pins (1) conflict with Encoder Buttons!"
|
||||||
#elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK_PIN) \
|
#elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \
|
||||||
|| ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
|
|| ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
|
||||||
#error "Serial port pins (1) conflict with LCD pins!"
|
#error "Serial port pins (1) conflict with LCD pins!"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -127,7 +127,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#undef _IS_RX1_1
|
#undef _IS_RX1_1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USING_HW_SERIAL2
|
#if USING_SERIAL_2
|
||||||
#define IS_TX2(P) (P == P0_10)
|
#define IS_TX2(P) (P == P0_10)
|
||||||
#define IS_RX2(P) (P == P0_11)
|
#define IS_RX2(P) (P == P0_11)
|
||||||
#define _IS_TX2_1 IS_TX2
|
#define _IS_TX2_1 IS_TX2
|
||||||
@@ -144,7 +144,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#error "Serial port pins (2) conflict with Z4 pins!"
|
#error "Serial port pins (2) conflict with Z4 pins!"
|
||||||
#elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN)
|
#elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN)
|
||||||
#error "Serial port pins (2) conflict with other pins!"
|
#error "Serial port pins (2) conflict with other pins!"
|
||||||
#elif Y_HOME_TO_MIN && IS_TX2(Y_STOP_PIN)
|
#elif Y_HOME_DIR < 0 && IS_TX2(Y_STOP_PIN)
|
||||||
#error "Serial port pins (2) conflict with Y endstop pin!"
|
#error "Serial port pins (2) conflict with Y endstop pin!"
|
||||||
#elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN)
|
#elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN)
|
||||||
#error "Serial port pins (2) conflict with probe pin!"
|
#error "Serial port pins (2) conflict with probe pin!"
|
||||||
@@ -161,7 +161,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#undef _IS_RX2_1
|
#undef _IS_RX2_1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USING_HW_SERIAL3
|
#if USING_SERIAL_3
|
||||||
#define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00)
|
#define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00)
|
||||||
#define PIN_IS_RX3(P) (P##_PIN == P0_01)
|
#define PIN_IS_RX3(P) (P##_PIN == P0_01)
|
||||||
#if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX)
|
#if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX)
|
||||||
@@ -205,8 +205,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#error "SDA0 overlaps with BEEPER_PIN!"
|
#error "SDA0 overlaps with BEEPER_PIN!"
|
||||||
#elif IS_SCL0(BTN_ENC)
|
#elif IS_SCL0(BTN_ENC)
|
||||||
#error "SCL0 overlaps with Encoder Button!"
|
#error "SCL0 overlaps with Encoder Button!"
|
||||||
#elif IS_SCL0(SD_SS_PIN)
|
#elif IS_SCL0(SS_PIN)
|
||||||
#error "SCL0 overlaps with SD_SS_PIN!"
|
#error "SCL0 overlaps with SS_PIN!"
|
||||||
#elif IS_SCL0(LCD_SDSS)
|
#elif IS_SCL0(LCD_SDSS)
|
||||||
#error "SCL0 overlaps with LCD_SDSS!"
|
#error "SCL0 overlaps with LCD_SDSS!"
|
||||||
#endif
|
#endif
|
||||||
@@ -270,7 +270,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
||||||
#error "SERIAL_STATS_MAX_RX_QUEUED is not supported on LPC176x."
|
#error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform."
|
||||||
#elif ENABLED(SERIAL_STATS_DROPPED_RX)
|
#elif ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
#error "SERIAL_STATS_DROPPED_RX is not supported on LPX176x."
|
#error "SERIAL_STATS_DROPPED_RX is not supported on this platform."
|
||||||
#endif
|
#endif
|
||||||
|
@@ -37,14 +37,13 @@
|
|||||||
#define DATA_SIZE_8BIT SSP_DATABIT_8
|
#define DATA_SIZE_8BIT SSP_DATABIT_8
|
||||||
#define DATA_SIZE_16BIT SSP_DATABIT_16
|
#define DATA_SIZE_16BIT SSP_DATABIT_16
|
||||||
|
|
||||||
#define SPI_CLOCK_MAX_TFT 30000000UL
|
#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
|
||||||
#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED
|
#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED
|
||||||
#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED
|
#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED
|
||||||
#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED
|
#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED
|
||||||
#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED
|
#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5
|
||||||
#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5
|
#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
|
||||||
#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6
|
#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h
|
||||||
#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h
|
|
||||||
|
|
||||||
#define SPI_CLOCK_MAX SPI_CLOCK_DIV2
|
#define SPI_CLOCK_MAX SPI_CLOCK_DIV2
|
||||||
|
|
||||||
@@ -126,11 +125,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
SPIClass(uint8_t spiPortNumber);
|
SPIClass(uint8_t spiPortNumber);
|
||||||
|
|
||||||
/**
|
|
||||||
* Init using pins
|
|
||||||
*/
|
|
||||||
SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel = (pin_t)-1);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select and configure the current selected SPI device to use
|
* Select and configure the current selected SPI device to use
|
||||||
*/
|
*/
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user