Compare commits
2 commits
master
...
sparklemot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e292e59ba0 | ||
|
|
0d9ac1b2b4 |
672 changed files with 7943 additions and 41136 deletions
|
|
@ -1,7 +1,7 @@
|
|||
[codespell]
|
||||
# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check/.codespellrc
|
||||
# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here:
|
||||
ignore-words-list = ba,licence,ot,dout,als,exten,emac
|
||||
ignore-words-list = ba,licence,ot,dout,als,exten
|
||||
skip = ./.git,./.licenses,__pycache__,.clang-format,.codespellrc,.editorconfig,.flake8,.prettierignore,.yamllint.yml,.gitignore,boards.txt,platform.txt,programmers.txt
|
||||
builtin = clear,informal,en-GB_to_en-US
|
||||
check-filenames =
|
||||
|
|
|
|||
81
.github/CODEOWNERS
vendored
81
.github/CODEOWNERS
vendored
|
|
@ -1,81 +0,0 @@
|
|||
# CODEOWNERS for ESP32 Arduino Core
|
||||
|
||||
# This file is used to specify the code owners for the ESP32 Arduino Core.
|
||||
# Read more about CODEOWNERS:
|
||||
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
|
||||
# Note that order matters. The last matching pattern will be used.
|
||||
|
||||
# The default owners are the active developers of the ESP32 Arduino Core.
|
||||
# Refrain from using @espressif/arduino-esp32 to avoid spamming non-developers with review requests.
|
||||
* @espressif/arduino-devs
|
||||
|
||||
# CI
|
||||
/.github/ @lucasssvaz @me-no-dev @P-R-O-C-H-Y
|
||||
/.github/codeql/ @lucasssvaz
|
||||
/.gitlab/ @lucasssvaz
|
||||
/tests/ @lucasssvaz @P-R-O-C-H-Y
|
||||
|
||||
# Tools
|
||||
/tools/ @me-no-dev
|
||||
/tools/pre-commit/ @lucasssvaz
|
||||
/tools/add_lib.sh @P-R-O-C-H-Y
|
||||
|
||||
# Pre-commit
|
||||
/.* @lucasssvaz # Files in root directory that start with a dot.
|
||||
|
||||
# Git Files
|
||||
/.gitignore @espressif/arduino-devs
|
||||
/.gitmodules @espressif/arduino-devs
|
||||
|
||||
# Documentation
|
||||
/docs/ @pedrominatel
|
||||
/.github/ISSUE_TEMPLATE/ @pedrominatel
|
||||
/.github/PULL_REQUEST_TEMPLATE.md @pedrominatel
|
||||
/.readthedocs.yaml @pedrominatel
|
||||
/*.md @pedrominatel
|
||||
|
||||
# Boards
|
||||
/variants/ @P-R-O-C-H-Y
|
||||
/boards.txt @P-R-O-C-H-Y
|
||||
|
||||
# Arduino as Component
|
||||
/idf_component_examples/ @SuGlider
|
||||
/idf_component.yml @SuGlider @me-no-dev
|
||||
/CMakeLists.txt @SuGlider @me-no-dev
|
||||
/Kconfig.projbuild @SuGlider @me-no-dev
|
||||
|
||||
# Build System
|
||||
/package.json @me-no-dev
|
||||
/platform.txt @me-no-dev
|
||||
/programmers.txt @me-no-dev
|
||||
/package/ @me-no-dev
|
||||
|
||||
# Libraries
|
||||
/libraries/ArduinoOTA/ @me-no-dev
|
||||
/libraries/AsyncUDP/ @me-no-dev
|
||||
/libraries/BLE/ @lucasssvaz @SuGlider
|
||||
/libraries/ESP_I2S/ @me-no-dev
|
||||
/libraries/ESP_NOW/ @P-R-O-C-H-Y @lucasssvaz
|
||||
/libraries/ESP_SR/ @me-no-dev
|
||||
/libraries/ESPmDNS/ @me-no-dev
|
||||
/libraries/Ethernet/ @me-no-dev
|
||||
/libraries/Matter/ @SuGlider
|
||||
/libraries/NetBIOS/ @me-no-dev
|
||||
/libraries/Network/ @me-no-dev
|
||||
/libraries/OpenThread/ @SuGlider
|
||||
/libraries/PPP/ @me-no-dev
|
||||
/libraries/SPI/ @me-no-dev
|
||||
/libraries/Update/ @me-no-dev
|
||||
/libraries/USB/ @SuGlider @me-no-dev
|
||||
/libraries/WiFi/ @me-no-dev
|
||||
/libraries/WiFiProv/ @me-no-dev
|
||||
/libraries/Wire/ @me-no-dev
|
||||
/libraries/Zigbee/ @P-R-O-C-H-Y
|
||||
|
||||
# CI JSON
|
||||
# Keep this after other libraries and tests to avoid being overridden.
|
||||
**/ci.json @lucasssvaz
|
||||
|
||||
# The CODEOWNERS file should be owned by the developers of the ESP32 Arduino Core.
|
||||
# Leave this entry as the last one to avoid being overridden.
|
||||
/.github/CODEOWNERS @espressif/arduino-devs
|
||||
1
.github/ISSUE_TEMPLATE/Feature-request.yml
vendored
1
.github/ISSUE_TEMPLATE/Feature-request.yml
vendored
|
|
@ -5,7 +5,6 @@ body:
|
|||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
* Please note that we can only process feature requests reported in English to ensure effective communication and support. Feature requests written in other languages will be closed, with a request to rewrite them in English.
|
||||
* We welcome any ideas or feature requests! It is helpful if you can explain exactly why the feature would be useful.
|
||||
* There are usually some outstanding feature requests in the [existing issues list](https://github.com/espressif/arduino-esp32/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Feature+request%22), feel free to add comments to them.
|
||||
* If you would like to contribute, please read the [contributions guide](https://docs.espressif.com/projects/arduino-esp32/en/latest/contributing.html).
|
||||
|
|
|
|||
21
.github/ISSUE_TEMPLATE/Issue-report.yml
vendored
21
.github/ISSUE_TEMPLATE/Issue-report.yml
vendored
|
|
@ -5,7 +5,6 @@ body:
|
|||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
* Please note that we can only process issues reported in English to ensure effective communication and support. Issues written in other languages will be closed, with a request to rewrite them in English.
|
||||
* Before reporting a new issue please check and search in [List of existing issues](https://github.com/espressif/arduino-esp32/issues?q=is%3Aissue)
|
||||
* Please check [Online Documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/index.html)
|
||||
* Take a look on [Troubleshooting guide](https://docs.espressif.com/projects/arduino-esp32/en/latest/troubleshooting.html)
|
||||
|
|
@ -40,15 +39,8 @@ body:
|
|||
label: Version
|
||||
description: What version of Arduino ESP32 are you running? If possible, consider updating to the latest version.
|
||||
options:
|
||||
- latest stable Release (if not listed below)
|
||||
- latest development Release Candidate (RC-X)
|
||||
- latest master (checkout manually)
|
||||
- v3.3.0
|
||||
- v3.2.1
|
||||
- v3.2.0
|
||||
- v3.1.3
|
||||
- v3.1.2
|
||||
- v3.1.1
|
||||
- latest development Release Candidate (RC-X)
|
||||
- v3.1.0
|
||||
- v3.0.7
|
||||
- v3.0.6
|
||||
|
|
@ -80,17 +72,6 @@ body:
|
|||
- other
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: type
|
||||
attributes:
|
||||
label: Type
|
||||
description: How would you define the type of the issue? Please select from the types below.
|
||||
options:
|
||||
- Task
|
||||
- Bug
|
||||
- Question
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: IDE
|
||||
attributes:
|
||||
|
|
|
|||
9
.github/ISSUE_TEMPLATE/config.yml
vendored
9
.github/ISSUE_TEMPLATE/config.yml
vendored
|
|
@ -1,5 +1,8 @@
|
|||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Arduino Core for Espressif Discord Server
|
||||
url: https://discord.gg/8xY6e9crwv
|
||||
about: Community Discord server for questions and help
|
||||
- name: Arduino ESP32 Gitter Channel
|
||||
url: https://gitter.im/espressif/arduino-esp32
|
||||
about: Community channel for questions and help
|
||||
- name: ESP32 Forum - Arduino
|
||||
url: https://esp32.com/viewforum.php?f=19
|
||||
about: Official Forum for questions
|
||||
|
|
|
|||
26
.github/codeql/codeql-config.yml
vendored
26
.github/codeql/codeql-config.yml
vendored
|
|
@ -1,26 +0,0 @@
|
|||
name: "CodeQL config"
|
||||
|
||||
packs:
|
||||
- trailofbits/cpp-queries
|
||||
- githubsecuritylab/codeql-cpp-queries
|
||||
- githubsecuritylab/codeql-python-queries
|
||||
|
||||
queries:
|
||||
- uses: security-extended
|
||||
- uses: security-and-quality
|
||||
|
||||
query-filters:
|
||||
- exclude:
|
||||
query path:
|
||||
- /^experimental\/.*/
|
||||
- exclude:
|
||||
tags contain:
|
||||
- experimental
|
||||
- exclude:
|
||||
problem.severity:
|
||||
- recommendation
|
||||
- exclude:
|
||||
id: tob/cpp/use-of-legacy-algorithm
|
||||
|
||||
paths-ignore:
|
||||
- tests/**
|
||||
16
.github/scripts/merge_packages.py
vendored
16
.github/scripts/merge_packages.py
vendored
|
|
@ -4,7 +4,6 @@
|
|||
# Usage:
|
||||
# python merge_packages.py package_esp8266com_index.json version/new/package_esp8266com_index.json
|
||||
# Written by Ivan Grokhotkov, 2015
|
||||
# Updated by lucasssvaz to handle Chinese version sorting, 2025
|
||||
#
|
||||
|
||||
from __future__ import print_function
|
||||
|
|
@ -37,19 +36,20 @@ def merge_objects(versions, obj):
|
|||
|
||||
|
||||
# Normalize ESP release version string (x.x.x) by adding '-rc<MAXINT>' (x.x.x-rc9223372036854775807)
|
||||
# to ensure having REL above any RC. CN version will be sorted after the official version if they happen
|
||||
# to be mixed (normally, CN and non-CN versions should not be mixed)
|
||||
# to ensure having REL above any RC
|
||||
# Dummy approach, functional anyway for current ESP package versioning
|
||||
# (unlike NormalizedVersion/LooseVersion/StrictVersion & similar crap)
|
||||
def pkgVersionNormalized(versionString):
|
||||
verStr = str(versionString).replace("-cn", "")
|
||||
|
||||
verStr = str(versionString)
|
||||
verParts = re.split(r"\.|-rc|-alpha", verStr, flags=re.IGNORECASE)
|
||||
|
||||
if len(verParts) == 3:
|
||||
if "-cn" in str(versionString):
|
||||
verStr = verStr + "-rc" + str(sys.maxsize // 2)
|
||||
else:
|
||||
verStr = verStr + "-rc" + str(sys.maxsize)
|
||||
if sys.version_info > (3, 0): # Python 3
|
||||
verStr = str(versionString) + "-rc" + str(sys.maxsize)
|
||||
else: # Python 2
|
||||
verStr = str(versionString) + "-rc" + str(sys.maxint)
|
||||
|
||||
elif len(verParts) != 4:
|
||||
print("pkgVersionNormalized WARNING: unexpected version format: {0})".format(verStr), file=sys.stderr)
|
||||
|
||||
|
|
|
|||
33
.github/scripts/on-push-idf.sh
vendored
33
.github/scripts/on-push-idf.sh
vendored
|
|
@ -1,33 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
CHECK_REQUIREMENTS="./components/arduino-esp32/.github/scripts/sketch_utils.sh check_requirements"
|
||||
|
||||
# Export IDF environment
|
||||
. ${IDF_PATH}/export.sh
|
||||
|
||||
# Find all examples in ./components/arduino-esp32/idf_component_examples
|
||||
idf_component_examples=$(find ./components/arduino-esp32/idf_component_examples -mindepth 1 -maxdepth 1 -type d)
|
||||
|
||||
for example in $idf_component_examples; do
|
||||
if [ -f "$example"/ci.json ]; then
|
||||
# If the target is listed as false, skip the sketch. Otherwise, include it.
|
||||
is_target=$(jq -r --arg target "$IDF_TARGET" '.targets[$target]' "$example"/ci.json)
|
||||
if [[ "$is_target" == "false" ]]; then
|
||||
printf "\n\033[93mSkipping %s for target %s\033[0m\n\n" "$example" "$IDF_TARGET"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
idf.py -C "$example" set-target "$IDF_TARGET"
|
||||
|
||||
has_requirements=$(${CHECK_REQUIREMENTS} "$example" "$example/sdkconfig")
|
||||
if [ "$has_requirements" -eq 0 ]; then
|
||||
printf "\n\033[93m%s does not meet the requirements for %s. Skipping...\033[0m\n\n" "$example" "$IDF_TARGET"
|
||||
continue
|
||||
fi
|
||||
|
||||
printf "\n\033[95mBuilding %s\033[0m\n\n" "$example"
|
||||
idf.py -C "$example" -DEXTRA_COMPONENT_DIRS="$PWD/components" build
|
||||
done
|
||||
1
.github/scripts/on-push.sh
vendored
1
.github/scripts/on-push.sh
vendored
|
|
@ -90,7 +90,6 @@ if [ "$BUILD_LOG" -eq 1 ]; then
|
|||
fi
|
||||
|
||||
#build sketches for different targets
|
||||
build "esp32c5" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}"
|
||||
build "esp32p4" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}"
|
||||
build "esp32s3" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}"
|
||||
build "esp32s2" "$CHUNK_INDEX" "$CHUNKS_CNT" "$BUILD_LOG" "$LOG_LEVEL" "$SKETCHES_FILE" "${SKETCHES_ESP32[@]}"
|
||||
|
|
|
|||
16
.github/scripts/on-release.sh
vendored
16
.github/scripts/on-release.sh
vendored
|
|
@ -35,8 +35,6 @@ PACKAGE_JSON_MERGE="$GITHUB_WORKSPACE/.github/scripts/merge_packages.py"
|
|||
PACKAGE_JSON_TEMPLATE="$GITHUB_WORKSPACE/package/package_esp32_index.template.json"
|
||||
PACKAGE_JSON_DEV="package_esp32_dev_index.json"
|
||||
PACKAGE_JSON_REL="package_esp32_index.json"
|
||||
PACKAGE_JSON_DEV_CN="package_esp32_dev_index_cn.json"
|
||||
PACKAGE_JSON_REL_CN="package_esp32_index_cn.json"
|
||||
|
||||
echo "Event: $GITHUB_EVENT_NAME, Repo: $GITHUB_REPOSITORY, Path: $GITHUB_WORKSPACE, Ref: $GITHUB_REF"
|
||||
echo "Action: $action, Branch: $RELEASE_BRANCH, ID: $RELEASE_ID"
|
||||
|
|
@ -341,15 +339,9 @@ jq_arg=".packages[0].platforms[0].version = \"$RELEASE_TAG\" | \
|
|||
# Generate package JSONs
|
||||
echo "Generating $PACKAGE_JSON_DEV ..."
|
||||
cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV"
|
||||
# On MacOS the sed command won't skip the first match. Use gsed instead.
|
||||
sed '0,/github\.com\//!s|github\.com/|dl.espressif.cn/github_assets/|g' "$OUTPUT_DIR/$PACKAGE_JSON_DEV" > "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN"
|
||||
python "$SCRIPTS_DIR/release_append_cn.py" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN"
|
||||
if [ "$RELEASE_PRE" == "false" ]; then
|
||||
echo "Generating $PACKAGE_JSON_REL ..."
|
||||
cat "$PACKAGE_JSON_TEMPLATE" | jq "$jq_arg" > "$OUTPUT_DIR/$PACKAGE_JSON_REL"
|
||||
# On MacOS the sed command won't skip the first match. Use gsed instead.
|
||||
sed '0,/github\.com\//!s|github\.com/|dl.espressif.cn/github_assets/|g' "$OUTPUT_DIR/$PACKAGE_JSON_REL" > "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN"
|
||||
python "$SCRIPTS_DIR/release_append_cn.py" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN"
|
||||
fi
|
||||
|
||||
# Figure out the last release or pre-release
|
||||
|
|
@ -381,14 +373,12 @@ echo
|
|||
if [ -n "$prev_any_release" ] && [ "$prev_any_release" != "null" ]; then
|
||||
echo "Merging with JSON from $prev_any_release ..."
|
||||
merge_package_json "$prev_any_release/$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV"
|
||||
merge_package_json "$prev_any_release/$PACKAGE_JSON_DEV_CN" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN"
|
||||
fi
|
||||
|
||||
if [ "$RELEASE_PRE" == "false" ]; then
|
||||
if [ -n "$prev_release" ] && [ "$prev_release" != "null" ]; then
|
||||
echo "Merging with JSON from $prev_release ..."
|
||||
merge_package_json "$prev_release/$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL"
|
||||
merge_package_json "$prev_release/$PACKAGE_JSON_REL_CN" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -398,8 +388,6 @@ echo "Installing arduino-cli ..."
|
|||
export PATH="/home/runner/bin:$PATH"
|
||||
source "${SCRIPTS_DIR}/install-arduino-cli.sh"
|
||||
|
||||
# For the Chinese mirror, we can't test the package JSONs as the Chinese mirror might not be updated yet.
|
||||
|
||||
echo "Testing $PACKAGE_JSON_DEV install ..."
|
||||
|
||||
echo "Installing esp32 ..."
|
||||
|
|
@ -457,15 +445,11 @@ fi
|
|||
echo "Uploading $PACKAGE_JSON_DEV ..."
|
||||
echo "Download URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV")"
|
||||
echo "Pages URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_DEV" "$OUTPUT_DIR/$PACKAGE_JSON_DEV")"
|
||||
echo "Download CN URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")"
|
||||
echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_DEV_CN" "$OUTPUT_DIR/$PACKAGE_JSON_DEV_CN")"
|
||||
echo
|
||||
if [ "$RELEASE_PRE" == "false" ]; then
|
||||
echo "Uploading $PACKAGE_JSON_REL ..."
|
||||
echo "Download URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL")"
|
||||
echo "Pages URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_REL" "$OUTPUT_DIR/$PACKAGE_JSON_REL")"
|
||||
echo "Download CN URL: $(git_safe_upload_asset "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")"
|
||||
echo "Pages CN URL: $(git_safe_upload_to_pages "$PACKAGE_JSON_REL_CN" "$OUTPUT_DIR/$PACKAGE_JSON_REL_CN")"
|
||||
echo
|
||||
fi
|
||||
|
||||
|
|
|
|||
57
.github/scripts/release_append_cn.py
vendored
57
.github/scripts/release_append_cn.py
vendored
|
|
@ -1,57 +0,0 @@
|
|||
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Arduino IDE provides by default a package file for the ESP32. This causes version conflicts
|
||||
# when the user tries to use the JSON file with the Chinese mirrors.
|
||||
#
|
||||
# The downside is that the Arduino IDE will always warn the user that updates are available as it
|
||||
# will consider the version from the Chinese mirrors as a pre-release version.
|
||||
#
|
||||
# This script is used to append "-cn" to all versions in the package_esp32_index_cn.json file so that
|
||||
# the user can select the Chinese mirrors without conflicts.
|
||||
#
|
||||
# If Arduino ever stops providing the package_esp32_index.json file by default,
|
||||
# this script can be removed and the tags reverted.
|
||||
|
||||
import json
|
||||
|
||||
def append_cn_to_versions(obj):
|
||||
if isinstance(obj, dict):
|
||||
# Skip tools that are not from the esp32 package
|
||||
packager = obj.get("packager")
|
||||
if packager is not None and packager != "esp32":
|
||||
return
|
||||
|
||||
for key, value in obj.items():
|
||||
if key == "version" and isinstance(value, str):
|
||||
if not value.endswith("-cn"):
|
||||
obj[key] = value + "-cn"
|
||||
else:
|
||||
append_cn_to_versions(value)
|
||||
|
||||
elif isinstance(obj, list):
|
||||
for item in obj:
|
||||
append_cn_to_versions(item)
|
||||
|
||||
def process_json_file(input_path, output_path=None):
|
||||
with open(input_path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
append_cn_to_versions(data)
|
||||
|
||||
if output_path is None:
|
||||
output_path = input_path
|
||||
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
print(f"Updated JSON written to {output_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python release_append_cn.py input.json [output.json]")
|
||||
else:
|
||||
input_file = sys.argv[1]
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else None
|
||||
process_json_file(input_file, output_file)
|
||||
11
.github/scripts/sketch_utils.sh
vendored
11
.github/scripts/sketch_utils.sh
vendored
|
|
@ -16,7 +16,7 @@ function check_requirements { # check_requirements <sketchdir> <sdkconfig_path>
|
|||
local requirements_or
|
||||
|
||||
if [ ! -f "$sdkconfig_path" ] || [ ! -f "$sketchdir/ci.json" ]; then
|
||||
echo "WARNING: sdkconfig or ci.json not found. Assuming requirements are met." 1>&2
|
||||
echo "ERROR: sdkconfig or ci.json not found" 1>&2
|
||||
# Return 1 on error to force the sketch to be built and fail. This way the
|
||||
# CI will fail and the user will know that the sketch has a problem.
|
||||
else
|
||||
|
|
@ -156,7 +156,6 @@ function build_sketch { # build_sketch <ide_path> <user_path> <path-to-ino> [ext
|
|||
esp32c6_opts=$(echo "$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g')
|
||||
esp32h2_opts=$(echo "$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g')
|
||||
esp32p4_opts=$(echo "PSRAM=enabled,USBMode=default,$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g')
|
||||
esp32c5_opts=$(echo "$debug_level,$fqbn_append" | sed 's/^,*//;s/,*$//;s/,\{2,\}/,/g')
|
||||
|
||||
# Select the common part of the FQBN based on the target. The rest will be
|
||||
# appended depending on the passed options.
|
||||
|
|
@ -192,10 +191,6 @@ function build_sketch { # build_sketch <ide_path> <user_path> <path-to-ino> [ext
|
|||
[ -n "${options:-$esp32p4_opts}" ] && opt=":${options:-$esp32p4_opts}"
|
||||
fqbn="espressif:esp32:esp32p4$opt"
|
||||
;;
|
||||
"esp32c5")
|
||||
[ -n "${options:-$esp32c5_opts}" ] && opt=":${options:-$esp32c5_opts}"
|
||||
fqbn="espressif:esp32:esp32c5$opt"
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: Invalid chip: $target"
|
||||
exit 1
|
||||
|
|
@ -249,7 +244,7 @@ function build_sketch { # build_sketch <ide_path> <user_path> <path-to-ino> [ext
|
|||
build_dir="$ARDUINO_BUILD_DIR"
|
||||
elif [ "$len" -eq 1 ]; then
|
||||
# build_dir="$sketchdir/build"
|
||||
build_dir="$HOME/.arduino/tests/$target/$sketchname/build.tmp"
|
||||
build_dir="$HOME/.arduino/tests/$sketchname/build.tmp"
|
||||
fi
|
||||
|
||||
output_file="$HOME/.arduino/cli_compile_output.txt"
|
||||
|
|
@ -259,7 +254,7 @@ function build_sketch { # build_sketch <ide_path> <user_path> <path-to-ino> [ext
|
|||
for i in $(seq 0 $((len - 1))); do
|
||||
if [ "$len" -ne 1 ]; then
|
||||
# build_dir="$sketchdir/build$i"
|
||||
build_dir="$HOME/.arduino/tests/$target/$sketchname/build$i.tmp"
|
||||
build_dir="$HOME/.arduino/tests/$sketchname/build$i.tmp"
|
||||
fi
|
||||
rm -rf "$build_dir"
|
||||
mkdir -p "$build_dir"
|
||||
|
|
|
|||
28
.github/scripts/tests_run.sh
vendored
28
.github/scripts/tests_run.sh
vendored
|
|
@ -11,11 +11,9 @@ function run_test {
|
|||
local error=0
|
||||
local sdkconfig_path
|
||||
local extra_args
|
||||
local test_type
|
||||
|
||||
sketchdir=$(dirname "$sketch")
|
||||
sketchname=$(basename "$sketchdir")
|
||||
test_type=$(basename "$(dirname "$sketchdir")")
|
||||
|
||||
if [ "$options" -eq 0 ] && [ -f "$sketchdir"/ci.json ]; then
|
||||
len=$(jq -r --arg target "$target" '.fqbn[$target] | length' "$sketchdir"/ci.json)
|
||||
|
|
@ -27,9 +25,9 @@ function run_test {
|
|||
fi
|
||||
|
||||
if [ "$len" -eq 1 ]; then
|
||||
sdkconfig_path="$HOME/.arduino/tests/$target/$sketchname/build.tmp/sdkconfig"
|
||||
sdkconfig_path="$HOME/.arduino/tests/$sketchname/build.tmp/sdkconfig"
|
||||
else
|
||||
sdkconfig_path="$HOME/.arduino/tests/$target/$sketchname/build0.tmp/sdkconfig"
|
||||
sdkconfig_path="$HOME/.arduino/tests/$sketchname/build0.tmp/sdkconfig"
|
||||
fi
|
||||
|
||||
if [ -f "$sketchdir"/ci.json ]; then
|
||||
|
|
@ -45,22 +43,22 @@ function run_test {
|
|||
fi
|
||||
|
||||
if [ ! -f "$sdkconfig_path" ]; then
|
||||
printf "\033[93mSketch %s build not found in %s\nMight be due to missing target requirements or build failure\033[0m\n" "$(dirname "$sdkconfig_path")" "$sketchname"
|
||||
printf "\033[93mSketch %s not built\nMight be due to missing target requirements or build failure\033[0m\n" "$sketchname"
|
||||
printf "\n\n\n"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local compiled_target
|
||||
compiled_target=$(grep -E "CONFIG_IDF_TARGET=" "$sdkconfig_path" | cut -d'"' -f2)
|
||||
if [ "$compiled_target" != "$target" ]; then
|
||||
printf "\033[91mError: Sketch %s compiled for %s, expected %s\033[0m\n" "$sketchname" "$compiled_target" "$target"
|
||||
local right_target
|
||||
right_target=$(grep -E "^CONFIG_IDF_TARGET=\"$target\"$" "$sdkconfig_path")
|
||||
if [ -z "$right_target" ]; then
|
||||
printf "\033[91mError: Sketch %s compiled for different target\n\033[0m\n" "$sketchname"
|
||||
printf "\n\n\n"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "$len" -eq 1 ]; then
|
||||
# build_dir="$sketchdir/build"
|
||||
build_dir="$HOME/.arduino/tests/$target/$sketchname/build.tmp"
|
||||
build_dir="$HOME/.arduino/tests/$sketchname/build.tmp"
|
||||
report_file="$sketchdir/$target/$sketchname.xml"
|
||||
fi
|
||||
|
||||
|
|
@ -83,7 +81,7 @@ function run_test {
|
|||
|
||||
if [ "$len" -ne 1 ]; then
|
||||
# build_dir="$sketchdir/build$i"
|
||||
build_dir="$HOME/.arduino/tests/$target/$sketchname/build$i.tmp"
|
||||
build_dir="$HOME/.arduino/tests/$sketchname/build$i.tmp"
|
||||
report_file="$sketchdir/$target/$sketchname$i.xml"
|
||||
fi
|
||||
|
||||
|
|
@ -115,14 +113,14 @@ function run_test {
|
|||
rm "$sketchdir"/diagram.json 2>/dev/null || true
|
||||
|
||||
result=0
|
||||
printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}"
|
||||
bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$?
|
||||
printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "${extra_args[*]@Q}"
|
||||
bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" ${extra_args[*]@Q}; exit \$?" || result=$?
|
||||
printf "\n"
|
||||
if [ $result -ne 0 ]; then
|
||||
result=0
|
||||
printf "\033[95mRetrying test: %s -- Config: %s\033[0m\n" "$sketchname" "$i"
|
||||
printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}"
|
||||
bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$?
|
||||
printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "${extra_args[*]@Q}"
|
||||
bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" ${extra_args[*]@Q}; exit \$?" || result=$?
|
||||
printf "\n"
|
||||
if [ $result -ne 0 ]; then
|
||||
printf "\033[91mFailed test: %s -- Config: %s\033[0m\n\n" "$sketchname" "$i"
|
||||
|
|
|
|||
19
.github/scripts/update-version.sh
vendored
19
.github/scripts/update-version.sh
vendored
|
|
@ -1,5 +1,4 @@
|
|||
#!/bin/bash
|
||||
# Disable shellcheck warning about using 'cat' to read a file.
|
||||
# shellcheck disable=SC2002
|
||||
|
||||
# For reference: add tools for all boards by replacing one line in each board
|
||||
|
|
@ -24,15 +23,7 @@ ESP_ARDUINO_VERSION_MINOR="$2"
|
|||
ESP_ARDUINO_VERSION_PATCH="$3"
|
||||
ESP_ARDUINO_VERSION="$ESP_ARDUINO_VERSION_MAJOR.$ESP_ARDUINO_VERSION_MINOR.$ESP_ARDUINO_VERSION_PATCH"
|
||||
|
||||
# Get ESP-IDF version from push.yml (this way we can ensure that the version is correct even if the local libs are not up to date)
|
||||
ESP_IDF_VERSION=$(grep "idf_ver:" .github/workflows/push.yml | sed 's/.*release-v\([^"]*\).*/\1/')
|
||||
if [ -z "$ESP_IDF_VERSION" ]; then
|
||||
echo "Error: ESP-IDF version not found in push.yml" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "New Arduino Version: $ESP_ARDUINO_VERSION"
|
||||
echo "ESP-IDF Version: $ESP_IDF_VERSION"
|
||||
|
||||
echo "Updating platform.txt..."
|
||||
cat platform.txt | sed "s/version=.*/version=$ESP_ARDUINO_VERSION/g" > __platform.txt && mv __platform.txt platform.txt
|
||||
|
|
@ -40,16 +31,6 @@ cat platform.txt | sed "s/version=.*/version=$ESP_ARDUINO_VERSION/g" > __platfor
|
|||
echo "Updating package.json..."
|
||||
cat package.json | sed "s/.*\"version\":.*/ \"version\": \"$ESP_ARDUINO_VERSION\",/g" > __package.json && mv __package.json package.json
|
||||
|
||||
echo "Updating docs/conf_common.py..."
|
||||
cat docs/conf_common.py | \
|
||||
sed "s/.. |version| replace:: .*/.. |version| replace:: $ESP_ARDUINO_VERSION/g" | \
|
||||
sed "s/.. |idf_version| replace:: .*/.. |idf_version| replace:: $ESP_IDF_VERSION/g" > docs/__conf_common.py && mv docs/__conf_common.py docs/conf_common.py
|
||||
|
||||
echo "Updating .gitlab/workflows/common.yml..."
|
||||
cat .gitlab/workflows/common.yml | \
|
||||
sed "s/ESP_IDF_VERSION:.*/ESP_IDF_VERSION: \"$ESP_IDF_VERSION\"/g" | \
|
||||
sed "s/ESP_ARDUINO_VERSION:.*/ESP_ARDUINO_VERSION: \"$ESP_ARDUINO_VERSION\"/g" > .gitlab/workflows/__common.yml && mv .gitlab/workflows/__common.yml .gitlab/workflows/common.yml
|
||||
|
||||
echo "Updating cores/esp32/esp_arduino_version.h..."
|
||||
cat cores/esp32/esp_arduino_version.h | \
|
||||
sed "s/#define ESP_ARDUINO_VERSION_MAJOR.*/#define ESP_ARDUINO_VERSION_MAJOR $ESP_ARDUINO_VERSION_MAJOR/g" | \
|
||||
|
|
|
|||
236
.github/scripts/update_esptool.py
vendored
236
.github/scripts/update_esptool.py
vendored
|
|
@ -1,236 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# This script is used to re-package the esptool if needed and update the JSON file
|
||||
# for the Arduino ESP32 platform.
|
||||
#
|
||||
# The script has only been tested on macOS.
|
||||
#
|
||||
# For regular esptool releases, the generated packages already contain the correct permissions,
|
||||
# extensions and are uploaded to the GitHub release assets. In this case, the script will only
|
||||
# update the JSON file with the information from the GitHub release.
|
||||
#
|
||||
# The script can be used in two modes:
|
||||
# 1. Local build: The build artifacts must be already downloaded and extracted in the base_folder.
|
||||
# This is useful for esptool versions that are not yet released and that are grabbed from the
|
||||
# GitHub build artifacts.
|
||||
# 2. Release build: The script will get the release information from GitHub and update the JSON file.
|
||||
# This is useful for esptool versions that are already released and that are uploaded to the
|
||||
# GitHub release assets.
|
||||
#
|
||||
# For local build, the artifacts must be already downloaded and extracted in the base_folder
|
||||
# set with the -l option.
|
||||
# For example, a base folder "esptool" should contain the following folders extracted directly
|
||||
# from the GitHub build artifacts:
|
||||
# esptool/esptool-linux-aarch64
|
||||
# esptool/esptool-linux-amd64
|
||||
# esptool/esptool-linux-armv7
|
||||
# esptool/esptool-macos-amd64
|
||||
# esptool/esptool-macos-arm64
|
||||
# esptool/esptool-windows-amd64
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import stat
|
||||
import tarfile
|
||||
import zipfile
|
||||
import hashlib
|
||||
import requests
|
||||
from pathlib import Path
|
||||
|
||||
def compute_sha256(filepath):
|
||||
sha256 = hashlib.sha256()
|
||||
with open(filepath, "rb") as f:
|
||||
for block in iter(lambda: f.read(4096), b""):
|
||||
sha256.update(block)
|
||||
return f"SHA-256:{sha256.hexdigest()}"
|
||||
|
||||
def get_file_size(filepath):
|
||||
return os.path.getsize(filepath)
|
||||
|
||||
def update_json_for_host(tmp_json_path, version, host, url, archiveFileName, checksum, size):
|
||||
with open(tmp_json_path) as f:
|
||||
data = json.load(f)
|
||||
|
||||
for pkg in data.get("packages", []):
|
||||
for tool in pkg.get("tools", []):
|
||||
if tool.get("name") == "esptool_py":
|
||||
tool["version"] = version
|
||||
|
||||
if url is None:
|
||||
# If the URL is not set, we need to find the old URL and update it
|
||||
for system in tool.get("systems", []):
|
||||
if system.get("host") == host:
|
||||
url = system.get("url").replace(system.get("archiveFileName"), archiveFileName)
|
||||
break
|
||||
else:
|
||||
print(f"No old URL found for host {host}. Using empty URL.")
|
||||
url = ""
|
||||
|
||||
# Preserve existing systems order and update or append the new system
|
||||
systems = tool.get("systems", [])
|
||||
system_updated = False
|
||||
for i, system in enumerate(systems):
|
||||
if system.get("host") == host:
|
||||
systems[i] = {
|
||||
"host": host,
|
||||
"url": url,
|
||||
"archiveFileName": archiveFileName,
|
||||
"checksum": checksum,
|
||||
"size": str(size),
|
||||
}
|
||||
system_updated = True
|
||||
break
|
||||
|
||||
if not system_updated:
|
||||
systems.append({
|
||||
"host": host,
|
||||
"url": url,
|
||||
"archiveFileName": archiveFileName,
|
||||
"checksum": checksum,
|
||||
"size": str(size),
|
||||
})
|
||||
tool["systems"] = systems
|
||||
|
||||
with open(tmp_json_path, "w") as f:
|
||||
json.dump(data, f, indent=2, sort_keys=False, ensure_ascii=False)
|
||||
f.write("\n")
|
||||
|
||||
def update_tools_dependencies(tmp_json_path, version):
|
||||
with open(tmp_json_path) as f:
|
||||
data = json.load(f)
|
||||
|
||||
for pkg in data.get("packages", []):
|
||||
for platform in pkg.get("platforms", []):
|
||||
for dep in platform.get("toolsDependencies", []):
|
||||
if dep.get("name") == "esptool_py":
|
||||
dep["version"] = version
|
||||
|
||||
with open(tmp_json_path, "w") as f:
|
||||
json.dump(data, f, indent=2, sort_keys=False, ensure_ascii=False)
|
||||
f.write("\n")
|
||||
|
||||
def create_archives(version, base_folder):
|
||||
archive_files = []
|
||||
|
||||
for dirpath in Path(base_folder).glob("esptool-*"):
|
||||
if not dirpath.is_dir():
|
||||
continue
|
||||
|
||||
base = dirpath.name[len("esptool-"):]
|
||||
|
||||
if "windows" in dirpath.name:
|
||||
zipfile_name = f"esptool-v{version}-{base}.zip"
|
||||
print(f"Creating {zipfile_name} from {dirpath} ...")
|
||||
with zipfile.ZipFile(zipfile_name, "w", zipfile.ZIP_DEFLATED) as zipf:
|
||||
for root, _, files in os.walk(dirpath):
|
||||
for file in files:
|
||||
full_path = os.path.join(root, file)
|
||||
zipf.write(full_path, os.path.relpath(full_path, start=dirpath))
|
||||
archive_files.append(zipfile_name)
|
||||
else:
|
||||
tarfile_name = f"esptool-v{version}-{base}.tar.gz"
|
||||
print(f"Creating {tarfile_name} from {dirpath} ...")
|
||||
for root, dirs, files in os.walk(dirpath):
|
||||
for name in dirs + files:
|
||||
os.chmod(os.path.join(root, name), stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR |
|
||||
stat.S_IRGRP | stat.S_IXGRP |
|
||||
stat.S_IROTH | stat.S_IXOTH)
|
||||
with tarfile.open(tarfile_name, "w:gz") as tar:
|
||||
tar.add(dirpath, arcname=dirpath.name)
|
||||
archive_files.append(tarfile_name)
|
||||
|
||||
return archive_files
|
||||
|
||||
def determine_hosts(archive_name):
|
||||
if "linux-amd64" in archive_name:
|
||||
return ["x86_64-pc-linux-gnu"]
|
||||
elif "linux-armv7" in archive_name:
|
||||
return ["arm-linux-gnueabihf"]
|
||||
elif "linux-aarch64" in archive_name:
|
||||
return ["aarch64-linux-gnu"]
|
||||
elif "macos-amd64" in archive_name:
|
||||
return ["x86_64-apple-darwin"]
|
||||
elif "macos-arm64" in archive_name:
|
||||
return ["arm64-apple-darwin"]
|
||||
elif "windows-amd64" in archive_name:
|
||||
return ["x86_64-mingw32", "i686-mingw32"]
|
||||
else:
|
||||
return []
|
||||
|
||||
def update_json_from_local_build(tmp_json_path, version, base_folder, archive_files):
|
||||
for archive in archive_files:
|
||||
print(f"Processing archive: {archive}")
|
||||
hosts = determine_hosts(archive)
|
||||
if not hosts:
|
||||
print(f"Skipping unknown archive type: {archive}")
|
||||
continue
|
||||
|
||||
archive_path = Path(archive)
|
||||
checksum = compute_sha256(archive_path)
|
||||
size = get_file_size(archive_path)
|
||||
|
||||
for host in hosts:
|
||||
update_json_for_host(tmp_json_path, version, host, None, archive_path.name, checksum, size)
|
||||
|
||||
def update_json_from_release(tmp_json_path, version, release_info):
|
||||
assets = release_info.get("assets", [])
|
||||
for asset in assets:
|
||||
if (asset.get("name").endswith(".tar.gz") or asset.get("name").endswith(".zip")) and "esptool" in asset.get("name"):
|
||||
asset_fname = asset.get("name")
|
||||
print(f"Processing asset: {asset_fname}")
|
||||
hosts = determine_hosts(asset_fname)
|
||||
if not hosts:
|
||||
print(f"Skipping unknown archive type: {asset_fname}")
|
||||
continue
|
||||
|
||||
asset_url = asset.get("browser_download_url")
|
||||
asset_checksum = asset.get("digest").replace("sha256:", "SHA-256:")
|
||||
asset_size = asset.get("size")
|
||||
if asset_checksum is None:
|
||||
asset_checksum = ""
|
||||
print(f"Asset {asset_fname} has no checksum. Please set the checksum in the JSON file.")
|
||||
|
||||
for host in hosts:
|
||||
update_json_for_host(tmp_json_path, version, host, asset_url, asset_fname, asset_checksum, asset_size)
|
||||
|
||||
def get_release_info(version):
|
||||
url = f"https://api.github.com/repos/espressif/esptool/releases/tags/v{version}"
|
||||
response = requests.get(url)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Repack esptool and update JSON metadata.")
|
||||
parser.add_argument("version", help="Version of the esptool (e.g. 5.0.dev1)")
|
||||
parser.add_argument("-l", "--local", dest="base_folder", help="Enable local build mode and set the base folder with unpacked artifacts")
|
||||
args = parser.parse_args()
|
||||
|
||||
script_dir = Path(__file__).resolve().parent
|
||||
json_path = (script_dir / "../../package/package_esp32_index.template.json").resolve()
|
||||
tmp_json_path = Path(str(json_path) + ".tmp")
|
||||
shutil.copy(json_path, tmp_json_path)
|
||||
|
||||
local_build = args.base_folder is not None
|
||||
|
||||
if local_build:
|
||||
os.chdir(args.base_folder)
|
||||
os.environ['COPYFILE_DISABLE'] = 'true' # this disables including resource forks in tar files on macOS
|
||||
# Clear any existing archive files
|
||||
for file in Path(args.base_folder).glob("esptool-*.*"):
|
||||
file.unlink()
|
||||
archive_files = create_archives(args.version, args.base_folder)
|
||||
update_json_from_local_build(tmp_json_path, args.version, args.base_folder, archive_files)
|
||||
else:
|
||||
release_info = get_release_info(args.version)
|
||||
update_json_from_release(tmp_json_path, args.version, release_info)
|
||||
|
||||
print(f"Updating esptool version fields to {args.version}")
|
||||
update_tools_dependencies(tmp_json_path, args.version)
|
||||
|
||||
shutil.move(tmp_json_path, json_path)
|
||||
print(f"Done. JSON updated at {json_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
10
.github/workflows/allboards.yml
vendored
10
.github/workflows/allboards.yml
vendored
|
|
@ -15,7 +15,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.client_payload.branch }}
|
||||
|
||||
|
|
@ -32,13 +32,13 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.client_payload.branch }}
|
||||
|
||||
- run: npm install
|
||||
- name: Setup jq
|
||||
uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1
|
||||
uses: dcarbone/install-jq-action@v1.0.1
|
||||
|
||||
- id: set-test-chunks
|
||||
name: Set Chunks
|
||||
|
|
@ -64,7 +64,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.client_payload.branch }}
|
||||
|
||||
|
|
@ -74,7 +74,7 @@ jobs:
|
|||
FQBN: ${{ toJSON(matrix.chunk) }}
|
||||
|
||||
- name: Compile sketch
|
||||
uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main
|
||||
uses: P-R-O-C-H-Y/compile-sketches@main
|
||||
with:
|
||||
platforms: |
|
||||
${{ env.REPOSITORY }}
|
||||
|
|
|
|||
10
.github/workflows/boards.yml
vendored
10
.github/workflows/boards.yml
vendored
|
|
@ -22,10 +22,10 @@ jobs:
|
|||
steps:
|
||||
# This step makes the contents of the repository available to the workflow
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup jq
|
||||
uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1
|
||||
uses: dcarbone/install-jq-action@v1.0.1
|
||||
|
||||
- name: Get board name
|
||||
run: bash .github/scripts/find_new_boards.sh ${{ github.repository }} ${{github.base_ref}}
|
||||
|
|
@ -47,7 +47,7 @@ jobs:
|
|||
steps:
|
||||
# This step makes the contents of the repository available to the workflow
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Check if build.board is uppercase
|
||||
run: |
|
||||
|
|
@ -60,7 +60,7 @@ jobs:
|
|||
fi
|
||||
|
||||
- name: Get libs cache
|
||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }}
|
||||
path: |
|
||||
|
|
@ -73,7 +73,7 @@ jobs:
|
|||
./tools/xtensa-*
|
||||
|
||||
- name: Compile sketch
|
||||
uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main
|
||||
uses: P-R-O-C-H-Y/compile-sketches@main
|
||||
with:
|
||||
platforms: |
|
||||
${{ env.REPOSITORY }}
|
||||
|
|
|
|||
31
.github/workflows/build_py_tools.yml
vendored
31
.github/workflows/build_py_tools.yml
vendored
|
|
@ -12,13 +12,13 @@ on:
|
|||
jobs:
|
||||
find-changed-tools:
|
||||
name: Check if tools have been changed
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
outputs:
|
||||
any_changed: ${{ steps.verify-changed-files.outputs.any_changed }}
|
||||
all_changed_files: ${{ steps.verify-changed-files.outputs.all_changed_files }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
|
|
@ -30,7 +30,7 @@ jobs:
|
|||
echo "Make sure you are using a branch inside the repository and not a fork."
|
||||
|
||||
- name: Verify Python Tools Changed
|
||||
uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
|
||||
uses: tj-actions/changed-files@v41
|
||||
id: verify-changed-files
|
||||
with:
|
||||
fetch_depth: "2"
|
||||
|
|
@ -40,7 +40,6 @@ jobs:
|
|||
tools/espota.py
|
||||
tools/gen_esp32part.py
|
||||
tools/gen_insights_package.py
|
||||
|
||||
- name: List all changed files
|
||||
shell: bash
|
||||
run: |
|
||||
|
|
@ -56,7 +55,7 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [windows-latest, macos-latest, ubuntu-latest, ubuntu-24.04-arm]
|
||||
os: [windows-latest, macos-latest, ubuntu-20.04, ARM]
|
||||
include:
|
||||
- os: windows-latest
|
||||
TARGET: win64
|
||||
|
|
@ -65,12 +64,14 @@ jobs:
|
|||
- os: macos-latest
|
||||
TARGET: macos
|
||||
SEPARATOR: ":"
|
||||
- os: ubuntu-latest
|
||||
- os: ubuntu-20.04
|
||||
TARGET: linux-amd64
|
||||
SEPARATOR: ":"
|
||||
- os: ubuntu-24.04-arm
|
||||
- os: ARM
|
||||
CONTAINER: python:3.8-bullseye
|
||||
TARGET: arm
|
||||
SEPARATOR: ":"
|
||||
container: ${{ matrix.CONTAINER }} # use python container on ARM
|
||||
env:
|
||||
DISTPATH: pytools-${{ matrix.TARGET }}
|
||||
PIP_EXTRA_INDEX_URL: "https://dl.espressif.com/pypi"
|
||||
|
|
@ -89,30 +90,27 @@ jobs:
|
|||
for tool in ${{ env.CHANGED_TOOLS }}; do
|
||||
echo "tool $tool was changed"
|
||||
done
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.TOOLS_UPLOAD_PAT }}
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
# Skip setting python on ARM because of missing compatibility: https://github.com/actions/setup-python/issues/108
|
||||
if: matrix.os != 'ARM'
|
||||
uses: actions/setup-python@master
|
||||
with:
|
||||
python-version: 3.8
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pyinstaller requests
|
||||
|
||||
- name: Build with PyInstaller
|
||||
shell: bash
|
||||
run: |
|
||||
for tool in ${{ env.CHANGED_TOOLS }}; do
|
||||
pyinstaller --distpath ./${{ env.DISTPATH }} -F --icon=.github/pytools/espressif.ico tools/$tool.py
|
||||
done
|
||||
|
||||
- name: Sign binaries
|
||||
if: matrix.os == 'windows-latest'
|
||||
env:
|
||||
|
|
@ -125,14 +123,12 @@ jobs:
|
|||
{
|
||||
./.github/pytools/Sign-File.ps1 -Path ./${{ env.DISTPATH }}/$node.exe
|
||||
}
|
||||
|
||||
- name: Test binaries
|
||||
shell: bash
|
||||
run: |
|
||||
for tool in ${{ env.CHANGED_TOOLS }}; do
|
||||
./${{ env.DISTPATH }}/$tool${{ matrix.EXTEN }} -h
|
||||
done
|
||||
|
||||
- name: Push binary to tools
|
||||
if: matrix.os == 'windows-latest'
|
||||
env:
|
||||
|
|
@ -143,9 +139,8 @@ jobs:
|
|||
cp -f ./${{ env.DISTPATH }}/$tool.exe tools/$tool.exe
|
||||
done
|
||||
bash .github/scripts/upload_py_tools.sh "${{ env.CHANGED_TOOLS }}"
|
||||
|
||||
- name: Archive artifact
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@master
|
||||
with:
|
||||
name: ${{ env.DISTPATH }}
|
||||
path: ${{ env.DISTPATH }}
|
||||
|
|
|
|||
31
.github/workflows/codeql_actions.yml
vendored
31
.github/workflows/codeql_actions.yml
vendored
|
|
@ -1,31 +0,0 @@
|
|||
name: CodeQL Actions Analysis
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
paths:
|
||||
- ".github/workflows/*.yml"
|
||||
- ".github/workflows/*.yaml"
|
||||
|
||||
jobs:
|
||||
codeql-analysis:
|
||||
name: CodeQL Actions Analysis
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
with:
|
||||
languages: actions
|
||||
config-file: ./.github/codeql/codeql-config.yml
|
||||
|
||||
- name: Run CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
with:
|
||||
category: "Analysis: Actions"
|
||||
30
.github/workflows/codeql_python.yml
vendored
30
.github/workflows/codeql_python.yml
vendored
|
|
@ -1,30 +0,0 @@
|
|||
name: CodeQL Python Analysis
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
paths:
|
||||
- "**/*.py"
|
||||
|
||||
jobs:
|
||||
codeql-analysis:
|
||||
name: CodeQL Python Analysis
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
with:
|
||||
languages: python
|
||||
config-file: ./.github/codeql/codeql-config.yml
|
||||
|
||||
- name: Run CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
with:
|
||||
category: "Analysis: Python"
|
||||
8
.github/workflows/dangerjs.yml
vendored
8
.github/workflows/dangerjs.yml
vendored
|
|
@ -12,17 +12,13 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out PR head
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
|
||||
- name: DangerJS pull request linter
|
||||
uses: espressif/shared-github-dangerjs@fb17367fd3e8ff7412603b8e946d9b19ffdb2d7f # v1
|
||||
uses: espressif/shared-github-dangerjs@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
instructions-cla-link: "https://cla-assistant.io/espressif/arduino-esp32"
|
||||
instructions-contributions-file: "docs/en/contributing.rst"
|
||||
rule-max-commits: "false"
|
||||
rule-target-branch: "false"
|
||||
commit-messages-min-summary-length: "10"
|
||||
|
|
|
|||
9
.github/workflows/docs_build.yml
vendored
9
.github/workflows/docs_build.yml
vendored
|
|
@ -21,16 +21,14 @@ jobs:
|
|||
run:
|
||||
shell: bash
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
cache-dependency-path: docs/requirements.txt
|
||||
cache: "pip"
|
||||
python-version: "3.10"
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
sudo apt update
|
||||
|
|
@ -40,9 +38,8 @@ jobs:
|
|||
cd ./docs
|
||||
PATH=/home/runner/.local/bin:$PATH pip3 install -r requirements.txt --prefer-binary
|
||||
PATH=/home/runner/.local/bin:$PATH SPHINXOPTS="-W" build-docs -l en
|
||||
|
||||
- name: Archive Docs
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: docs
|
||||
path: docs
|
||||
|
|
|
|||
7
.github/workflows/docs_deploy.yml
vendored
7
.github/workflows/docs_deploy.yml
vendored
|
|
@ -26,17 +26,14 @@ jobs:
|
|||
run: |
|
||||
echo "Release workflow failed. Exiting..."
|
||||
exit 1
|
||||
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
cache-dependency-path: docs/requirements.txt
|
||||
cache: "pip"
|
||||
python-version: "3.10"
|
||||
|
||||
- name: Deploy Documentation
|
||||
env:
|
||||
# Deploy to production server
|
||||
|
|
|
|||
4
.github/workflows/gh-pages.yml
vendored
4
.github/workflows/gh-pages.yml
vendored
|
|
@ -15,9 +15,7 @@ jobs:
|
|||
name: Build GitHub Pages
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- name: Copy Files
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
|
|||
41
.github/workflows/lib.json
vendored
41
.github/workflows/lib.json
vendored
|
|
@ -9,8 +9,7 @@
|
|||
{
|
||||
"name": "ArduinoBLE",
|
||||
"exclude_targets": [
|
||||
"esp32s2",
|
||||
"esp32p4"
|
||||
"esp32s2"
|
||||
],
|
||||
"sketch_path": [
|
||||
"~/Arduino/libraries/ArduinoBLE/examples/Central/Scan/Scan.ino"
|
||||
|
|
@ -24,44 +23,16 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"source-url": "https://github.com/ESP32Async/ESPAsyncWebServer.git",
|
||||
"source-url": "https://github.com/me-no-dev/ESPAsyncWebServer.git",
|
||||
"required-libs": [
|
||||
{"source-url": "https://github.com/ESP32Async/AsyncTCP.git"}
|
||||
{"source-url": "https://github.com/me-no-dev/AsyncTCP.git"}
|
||||
],
|
||||
"exclude_targets": [],
|
||||
"sketch_path": [
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Auth/Auth.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/CORS/CORS.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/CaptivePortal/CaptivePortal.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/CatchAllHandler/CatchAllHandler.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/ChunkResponse/ChunkResponse.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/ChunkRetryResponse/ChunkRetryResponse.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/EndBegin/EndBegin.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Filters/Filters.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/FlashResponse/FlashResponse.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/HeaderManipulation/HeaderManipulation.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Headers/Headers.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Json/Json.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Logging/Logging.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/MessagePack/MessagePack.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Middleware/Middleware.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Params/Params.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/PartitionDownloader/PartitionDownloader.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/PerfTests/PerfTests.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/RateLimit/RateLimit.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Redirect/Redirect.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/RequestContinuation/RequestContinuation.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/RequestContinuationComplete/RequestContinuationComplete.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/ResumableDownload/ResumableDownload.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Rewrite/Rewrite.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/ServerSentEvents/ServerSentEvents.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/ServerState/ServerState.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/SkipServerMiddleware/SkipServerMiddleware.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/SlowChunkResponse/SlowChunkResponse.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/StaticFile/StaticFile.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Templates/Templates.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/Upload/Upload.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/WebSocket/WebSocket.ino"
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/regex_patterns/regex_patterns.ino",
|
||||
"~/Arduino/libraries/ESPAsyncWebServer/examples/simple_server/simple_server.ino"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
|
|||
15
.github/workflows/lib.yml
vendored
15
.github/workflows/lib.yml
vendored
|
|
@ -62,10 +62,10 @@ jobs:
|
|||
steps:
|
||||
# This step makes the contents of the repository available to the workflow
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Compile sketch
|
||||
uses: P-R-O-C-H-Y/compile-sketches@a62f069b92dc8f5053da4ac439ea6d1950cf6379 # main
|
||||
uses: P-R-O-C-H-Y/compile-sketches@main
|
||||
with:
|
||||
platforms: |
|
||||
${{ env.REPOSITORY }}
|
||||
|
|
@ -80,7 +80,7 @@ jobs:
|
|||
- --warnings="all"
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-${{ matrix.target }}
|
||||
path: ${{ env.SKETCHES_REPORTS_PATH }}
|
||||
|
|
@ -92,7 +92,7 @@ jobs:
|
|||
steps:
|
||||
# Check out repository
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ env.GITHUB_TOKEN }}
|
||||
fetch-depth: "0"
|
||||
|
|
@ -102,14 +102,14 @@ jobs:
|
|||
|
||||
# This step is needed to get the size data produced by the compile jobs
|
||||
- name: Download sketches reports artifact
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: ${{ env.SKETCHES_REPORTS_ARTIFACT_NAME }}-*
|
||||
merge-multiple: true
|
||||
path: ${{ env.SKETCHES_REPORTS_PATH }}
|
||||
|
||||
- name: Report results
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@4a79caa6dcc3579024293638b97156106edc588e # main
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@main
|
||||
with:
|
||||
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
|
||||
destination-file: ${{ env.RESULT_LIBRARY_TEST_FILE }}
|
||||
|
|
@ -136,9 +136,8 @@ jobs:
|
|||
env:
|
||||
PR_NUM: ${{ github.event.number }}
|
||||
run: echo $PR_NUM > pr_num.txt
|
||||
|
||||
- name: Upload PR number
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: pr_number
|
||||
path: ./pr_num.txt
|
||||
|
|
|
|||
4
.github/workflows/pre-commit-status.yml
vendored
4
.github/workflows/pre-commit-status.yml
vendored
|
|
@ -17,7 +17,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Report success
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = '${{ github.repository_owner }}';
|
||||
|
|
@ -43,7 +43,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Report pending
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = '${{ github.repository_owner }}';
|
||||
|
|
|
|||
12
.github/workflows/pre-commit.yml
vendored
12
.github/workflows/pre-commit.yml
vendored
|
|
@ -23,7 +23,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout latest commit
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ jobs:
|
|||
GH_TOKEN: ${{ github.token }}
|
||||
|
||||
- name: Set up Python 3
|
||||
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
cache-dependency-path: tools/pre-commit/requirements.txt
|
||||
cache: "pip"
|
||||
|
|
@ -46,7 +46,7 @@ jobs:
|
|||
echo "PY_HASH=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
|
||||
|
||||
- name: Restore pre-commit cache
|
||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/restore@v4
|
||||
id: restore-cache
|
||||
with:
|
||||
path: |
|
||||
|
|
@ -58,13 +58,13 @@ jobs:
|
|||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
|
||||
uses: tj-actions/changed-files@v42.0.2
|
||||
|
||||
- name: Run pre-commit hooks in changed files
|
||||
run: pre-commit run --color=always --show-diff-on-failure --files ${{ steps.changed-files.outputs.all_changed_files }}
|
||||
|
||||
- name: Save pre-commit cache
|
||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ always() && steps.restore-cache.outputs.cache-hit != 'true' }}
|
||||
continue-on-error: true
|
||||
with:
|
||||
|
|
@ -73,7 +73,7 @@ jobs:
|
|||
key: ${{ steps.restore-cache.outputs.cache-primary-key }}
|
||||
|
||||
- name: Push changes using pre-commit-ci-lite
|
||||
uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0
|
||||
uses: pre-commit-ci/lite-action@v1.1.0
|
||||
# Only push changes in PRs
|
||||
if: ${{ always() && github.event_name == 'pull_request' }}
|
||||
with:
|
||||
|
|
|
|||
4
.github/workflows/publishlib.yml
vendored
4
.github/workflows/publishlib.yml
vendored
|
|
@ -44,12 +44,12 @@ jobs:
|
|||
|
||||
- name: Read the pr_num file
|
||||
id: pr_num_reader
|
||||
uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7
|
||||
uses: juliangruber/read-file-action@v1
|
||||
with:
|
||||
path: ./artifacts/workflows/pr_num.txt
|
||||
|
||||
- name: Report results
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@256d1f13e4195cd7fd436d2f959e6dc4d5e4b406 # libs
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@libs
|
||||
with:
|
||||
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
|
||||
github-token: ${{ env.GITHUB_TOKEN }}
|
||||
|
|
|
|||
6
.github/workflows/publishsizes-2.x.yml
vendored
6
.github/workflows/publishsizes-2.x.yml
vendored
|
|
@ -14,8 +14,8 @@ jobs:
|
|||
name: Sizes Comparison Results
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout gh-pages branch
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch
|
||||
with:
|
||||
ref: gh-pages
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ jobs:
|
|||
mv v2.x_cli_compile/*.json artifacts/sizes-report/master/
|
||||
|
||||
- name: Report results
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@2043188c68f483a7b50527c4eacf609d05bb67a5 # sizes_v2
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2
|
||||
with:
|
||||
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
|
||||
github-token: ${{ env.GITHUB_TOKEN }}
|
||||
|
|
|
|||
27
.github/workflows/publishsizes.yml
vendored
27
.github/workflows/publishsizes.yml
vendored
|
|
@ -21,8 +21,8 @@ jobs:
|
|||
github.event.workflow_run.conclusion == 'success'
|
||||
|
||||
steps:
|
||||
- name: Checkout gh-pages branch
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4 # This step checks out the repository's code at gh-pages branch
|
||||
with:
|
||||
ref: gh-pages
|
||||
|
||||
|
|
@ -44,29 +44,28 @@ jobs:
|
|||
gh api "$artifacts_url" -q '.artifacts[] | [.name, .archive_download_url] | @tsv' | while read artifact
|
||||
do
|
||||
IFS=$'\t' read name url <<< "$artifact"
|
||||
# Only process pr_number and pr_cli_compile artifacts
|
||||
if [[ "$name" == "pr_number" || "$name" =~ ^pr_cli_compile_[0-9]+$ ]]; then
|
||||
gh api $url > "$name.zip"
|
||||
unzip -o -j "$name.zip" -d "temp_$name"
|
||||
if [[ "$name" == "pr_number" ]]; then
|
||||
mv "temp_$name"/* sizes-report
|
||||
elif [[ "$name" =~ ^pr_cli_compile_[0-9]+$ ]]; then
|
||||
mv "temp_$name"/* sizes-report/pr
|
||||
fi
|
||||
rm -r "temp_$name"
|
||||
gh api $url > "$name.zip"
|
||||
unzip -j "$name.zip" -d "temp_$name"
|
||||
if [[ "$name" == "pr_number" ]]; then
|
||||
mv "temp_$name"/* sizes-report
|
||||
elif [[ "$name" == "pr_cli"* ]]; then
|
||||
mv "temp_$name"/* sizes-report/pr
|
||||
else
|
||||
mv "temp_$name"/* sizes-report
|
||||
fi
|
||||
rm -r "temp_$name"
|
||||
done
|
||||
echo "Contents of parent directory:"
|
||||
ls -R ..
|
||||
|
||||
- name: Read the pr_num file
|
||||
id: pr_num_reader
|
||||
uses: juliangruber/read-file-action@b549046febe0fe86f8cb4f93c24e284433f9ab58 # v1.1.7
|
||||
uses: juliangruber/read-file-action@v1
|
||||
with:
|
||||
path: ./artifacts/sizes-report/pr_num.txt
|
||||
|
||||
- name: Report results
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@bea91d2c99ca80c88a883b39b1c4012f00ec3d09 # sizes_v2
|
||||
uses: P-R-O-C-H-Y/report-size-deltas@sizes_v2
|
||||
with:
|
||||
sketches-reports-source: ${{ env.SKETCHES_REPORTS_PATH }}
|
||||
github-token: ${{ env.GITHUB_TOKEN }}
|
||||
|
|
|
|||
69
.github/workflows/push.yml
vendored
69
.github/workflows/push.yml
vendored
|
|
@ -31,7 +31,6 @@ on:
|
|||
- "!libraries/**.properties"
|
||||
- "!libraries/**.py"
|
||||
- "package/**"
|
||||
- "idf_component_examples/**"
|
||||
- "tools/**.py"
|
||||
- "platform.txt"
|
||||
- "programmers.txt"
|
||||
|
|
@ -46,13 +45,12 @@ on:
|
|||
- "!.github/scripts/tests_*"
|
||||
- "!.github/scripts/upload_*"
|
||||
- "variants/esp32/**/*"
|
||||
- "variants/esp32c3/**/*"
|
||||
- "variants/esp32c5/**/*"
|
||||
- "variants/esp32c6/**/*"
|
||||
- "variants/esp32h2/**/*"
|
||||
- "variants/esp32p4/**/*"
|
||||
- "variants/esp32s2/**/*"
|
||||
- "variants/esp32s3/**/*"
|
||||
- "variants/esp32c2/**/*"
|
||||
- "variants/esp32c3/**/*"
|
||||
- "variants/esp32c6/**/*"
|
||||
- "variants/esp32h2/**/*"
|
||||
|
||||
concurrency:
|
||||
group: build-${{github.event.pull_request.number || github.ref}}
|
||||
|
|
@ -67,7 +65,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
if: ${{ !(github.event_name == 'pull_request' && startsWith(github.head_ref, 'release/')) }}
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@v4
|
||||
- run: bash ./.github/scripts/check-cmakelists.sh
|
||||
|
||||
gen-chunks:
|
||||
|
|
@ -83,13 +81,13 @@ jobs:
|
|||
chunks: ${{ steps.set-chunks.outputs.chunks }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1
|
||||
uses: tj-actions/changed-files@v44
|
||||
with:
|
||||
files_yaml: |
|
||||
core:
|
||||
|
|
@ -100,12 +98,11 @@ jobs:
|
|||
- 'platform.txt'
|
||||
- 'programmers.txt'
|
||||
- "variants/esp32/**/*"
|
||||
- "variants/esp32s2/**/*"
|
||||
- "variants/esp32s3/**/*"
|
||||
- "variants/esp32c3/**/*"
|
||||
- "variants/esp32c6/**/*"
|
||||
- "variants/esp32h2/**/*"
|
||||
- "variants/esp32p4/**/*"
|
||||
- "variants/esp32s2/**/*"
|
||||
- "variants/esp32s3/**/*"
|
||||
libraries:
|
||||
- 'libraries/**/examples/**'
|
||||
- 'libraries/**/src/**'
|
||||
|
|
@ -125,7 +122,7 @@ jobs:
|
|||
- 'idf_component.yml'
|
||||
- 'Kconfig.projbuild'
|
||||
- 'CMakeLists.txt'
|
||||
- "idf_component_examples/**"
|
||||
- "variants/esp32c2/**/*"
|
||||
|
||||
- name: Set chunks
|
||||
id: set-chunks
|
||||
|
|
@ -145,7 +142,7 @@ jobs:
|
|||
|
||||
- name: Upload sketches found
|
||||
if: ${{ steps.set-chunks.outputs.build_all == 'false' && steps.set-chunks.outputs.build_libraries == 'true' }}
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: sketches_found
|
||||
path: sketches_found.txt
|
||||
|
|
@ -164,13 +161,13 @@ jobs:
|
|||
chunk: ${{ fromJson(needs.gen-chunks.outputs.chunks) }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.x"
|
||||
|
||||
- name: Get libs cache
|
||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }}
|
||||
path: |
|
||||
|
|
@ -198,7 +195,7 @@ jobs:
|
|||
|
||||
- name: Download sketches found
|
||||
if: ${{ needs.gen-chunks.outputs.build_all == 'false' && needs.gen-chunks.outputs.build_libraries == 'true' }}
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: sketches_found
|
||||
|
||||
|
|
@ -208,7 +205,7 @@ jobs:
|
|||
|
||||
#Upload cli compile json as artifact
|
||||
- name: Upload cli compile json
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: pr_cli_compile_${{ matrix.chunk }}
|
||||
path: cli_compile_${{ matrix.chunk }}.json
|
||||
|
|
@ -226,8 +223,8 @@ jobs:
|
|||
os: [windows-latest, macOS-latest]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- name: Build Sketches
|
||||
|
|
@ -240,7 +237,7 @@ jobs:
|
|||
needs.gen-chunks.outputs.build_all == 'true' ||
|
||||
needs.gen-chunks.outputs.build_libraries == 'true' ||
|
||||
needs.gen-chunks.outputs.build_idf == 'true'
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
|
|
@ -248,7 +245,7 @@ jobs:
|
|||
# See https://hub.docker.com/r/espressif/idf/tags and
|
||||
# https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-docker-image.html
|
||||
# for details.
|
||||
idf_ver: ["release-v5.3","release-v5.4","release-v5.5"]
|
||||
idf_ver: ["release-v5.3"]
|
||||
idf_target:
|
||||
[
|
||||
"esp32",
|
||||
|
|
@ -263,28 +260,19 @@ jobs:
|
|||
container: espressif/idf:${{ matrix.idf_ver }}
|
||||
steps:
|
||||
- name: Check out arduino-esp32 as a component
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
path: components/arduino-esp32
|
||||
|
||||
- name: Setup jq
|
||||
uses: dcarbone/install-jq-action@e397bd87438d72198f81efd21f876461183d383a # v3.0.1
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
IDF_TARGET: ${{ matrix.idf_target }}
|
||||
shell: bash
|
||||
run: |
|
||||
chmod a+x ./components/arduino-esp32/.github/scripts/*
|
||||
./components/arduino-esp32/.github/scripts/on-push-idf.sh
|
||||
|
||||
- name: Upload generated sdkconfig files for debugging
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
if: always()
|
||||
with:
|
||||
name: sdkconfig-${{ matrix.idf_ver }}-${{ matrix.idf_target }}
|
||||
path: ./components/arduino-esp32/idf_component_examples/**/sdkconfig
|
||||
. ${IDF_PATH}/export.sh
|
||||
idf.py create-project test
|
||||
echo CONFIG_FREERTOS_HZ=1000 > test/sdkconfig.defaults
|
||||
idf.py -C test -DEXTRA_COMPONENT_DIRS=$PWD/components build
|
||||
|
||||
# Save artifacts to gh-pages
|
||||
save-master-artifacts:
|
||||
|
|
@ -295,7 +283,7 @@ jobs:
|
|||
steps:
|
||||
# Check out repository
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{secrets.GITHUB_TOKEN}}
|
||||
fetch-depth: "0"
|
||||
|
|
@ -304,7 +292,7 @@ jobs:
|
|||
run: git checkout remotes/origin/gh-pages
|
||||
|
||||
- name: Download sketches reports artifact
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: pr_cli_compile_*
|
||||
merge-multiple: true
|
||||
|
|
@ -334,9 +322,8 @@ jobs:
|
|||
env:
|
||||
PR_NUM: ${{ github.event.number }}
|
||||
run: echo $PR_NUM > pr_num.txt
|
||||
|
||||
- name: Upload PR number
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: pr_number
|
||||
path: ./pr_num.txt
|
||||
|
|
|
|||
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
|
|
@ -10,22 +10,14 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.x"
|
||||
|
||||
- name: Install packaging
|
||||
run: pip install packaging
|
||||
|
||||
- name: Install pyserial
|
||||
run: pip install pyserial
|
||||
|
||||
- run: pip install packaging
|
||||
- run: pip install pyserial
|
||||
- name: Build Release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
|
|||
6
.github/workflows/tests.yml
vendored
6
.github/workflows/tests.yml
vendored
|
|
@ -43,7 +43,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: event_file
|
||||
path: ${{ github.event_path }}
|
||||
|
|
@ -62,7 +62,7 @@ jobs:
|
|||
PERFORMANCE_ENABLED: ${{ contains(github.event.pull_request.labels.*.name, 'perf_test') }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: .github/scripts/tests_matrix.sh
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ jobs:
|
|||
run: bash .github/scripts/tests_matrix.sh
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: matrix_info
|
||||
path: info/*
|
||||
|
|
|
|||
34
.github/workflows/tests_build.yml
vendored
34
.github/workflows/tests_build.yml
vendored
|
|
@ -22,14 +22,14 @@ jobs:
|
|||
- name: Check if already built
|
||||
id: cache-build-binaries
|
||||
if: github.event.pull_request.number != null
|
||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: tests-${{ env.id }}-bin
|
||||
path: |
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig
|
||||
~/.arduino/tests/**/build*.tmp/*.bin
|
||||
~/.arduino/tests/**/build*.tmp/*.elf
|
||||
~/.arduino/tests/**/build*.tmp/*.json
|
||||
~/.arduino/tests/**/build*.tmp/sdkconfig
|
||||
|
||||
- name: Evaluate if tests should be built
|
||||
id: check-build
|
||||
|
|
@ -46,10 +46,10 @@ jobs:
|
|||
|
||||
- name: Checkout user repository
|
||||
if: ${{ steps.check-build.outputs.enabled == 'true' }}
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Get libs cache
|
||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache@v4
|
||||
if: ${{ steps.check-build.outputs.enabled == 'true' }}
|
||||
with:
|
||||
key: libs-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('package/package_esp32_index.template.json', 'tools/get.py') }}
|
||||
|
|
@ -68,23 +68,23 @@ jobs:
|
|||
bash .github/scripts/tests_build.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }}
|
||||
|
||||
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as cache
|
||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/save@v4
|
||||
if: steps.check-build.outputs.enabled == 'true' && github.event.pull_request.number != null
|
||||
with:
|
||||
key: tests-${{ env.id }}-bin
|
||||
path: |
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig
|
||||
~/.arduino/tests/**/build*.tmp/*.bin
|
||||
~/.arduino/tests/**/build*.tmp/*.elf
|
||||
~/.arduino/tests/**/build*.tmp/*.json
|
||||
~/.arduino/tests/**/build*.tmp/sdkconfig
|
||||
|
||||
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: tests-bin-${{ inputs.chip }}-${{ inputs.type }}
|
||||
overwrite: true
|
||||
path: |
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json
|
||||
~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig
|
||||
~/.arduino/tests/**/build*.tmp/*.bin
|
||||
~/.arduino/tests/**/build*.tmp/*.elf
|
||||
~/.arduino/tests/**/build*.tmp/*.json
|
||||
~/.arduino/tests/**/build*.tmp/sdkconfig
|
||||
|
|
|
|||
28
.github/workflows/tests_hw.yml
vendored
28
.github/workflows/tests_hw.yml
vendored
|
|
@ -22,22 +22,17 @@ defaults:
|
|||
jobs:
|
||||
hardware-test:
|
||||
name: Hardware ${{ inputs.chip }} ${{ inputs.type }} tests
|
||||
runs-on: ["arduino", "${{ inputs.chip }}"]
|
||||
runs-on: [arduino, "${{ inputs.chip }}"]
|
||||
env:
|
||||
id: ${{ github.event.pull_request.number || github.ref }}-${{ github.event.pull_request.head.sha || github.sha }}-${{ inputs.chip }}-${{ inputs.type }}
|
||||
container:
|
||||
image: python:3.10.1-bullseye
|
||||
options: --privileged --device-cgroup-rule="c 188:* rmw" --device-cgroup-rule="c 166:* rmw"
|
||||
options: --privileged
|
||||
steps:
|
||||
- name: Clean workspace
|
||||
run: |
|
||||
rm -rf ./*
|
||||
rm -rf ~/.arduino/tests
|
||||
|
||||
- name: Check if already passed
|
||||
id: cache-results
|
||||
if: github.event.pull_request.number != null
|
||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: tests-${{ env.id }}-results-hw
|
||||
path: |
|
||||
|
|
@ -59,13 +54,13 @@ jobs:
|
|||
|
||||
- name: Checkout user repository
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
*
|
||||
|
||||
# setup-python currently only works on ubuntu images
|
||||
# - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
# - uses: actions/setup-python@v5
|
||||
# if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
# with:
|
||||
# cache-dependency-path: tests/requirements.txt
|
||||
|
|
@ -82,16 +77,11 @@ jobs:
|
|||
|
||||
- name: Get binaries
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: tests-bin-${{ inputs.chip }}-${{ inputs.type }}
|
||||
path: |
|
||||
~/.arduino/tests/${{ inputs.chip }}
|
||||
|
||||
- name: List binaries
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
run: |
|
||||
ls -laR ~/.arduino/tests
|
||||
~/.arduino/tests
|
||||
|
||||
- name: Run Tests
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
|
|
@ -99,7 +89,7 @@ jobs:
|
|||
bash .github/scripts/tests_run.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} -i 0 -m 1 -e
|
||||
|
||||
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as cache
|
||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/save@v4
|
||||
if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null
|
||||
with:
|
||||
key: tests-${{ env.id }}-results-hw
|
||||
|
|
@ -108,7 +98,7 @@ jobs:
|
|||
tests/**/result_*.json
|
||||
|
||||
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} hardware results as artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: tests-results-hw-${{ inputs.chip }}-${{ inputs.type }}
|
||||
|
|
|
|||
20
.github/workflows/tests_qemu.yml
vendored
20
.github/workflows/tests_qemu.yml
vendored
|
|
@ -21,7 +21,7 @@ jobs:
|
|||
- name: Check if already passed
|
||||
id: get-cache-results
|
||||
if: github.event.pull_request.number != null
|
||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: tests-${{ env.id }}-results-qemu
|
||||
path: |
|
||||
|
|
@ -43,7 +43,7 @@ jobs:
|
|||
|
||||
- name: Checkout user repository
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||
persist-credentials: false
|
||||
|
|
@ -60,7 +60,7 @@ jobs:
|
|||
cd .github
|
||||
curl https://codeload.github.com/${{ github.repository }}/tar.gz/master | tar -xz --strip=2 arduino-esp32-master/.github
|
||||
|
||||
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/setup-python@v5
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
with:
|
||||
cache-dependency-path: tests/requirements.txt
|
||||
|
|
@ -74,14 +74,14 @@ jobs:
|
|||
pip install -r tests/requirements.txt --extra-index-url https://dl.espressif.com/pypi
|
||||
|
||||
- name: Install APT dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@5902b33ae29014e6ca012c5d8025d4346556bd40 # v1.4.3
|
||||
uses: awalsh128/cache-apt-pkgs-action@v1.4.2
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
with:
|
||||
packages: libpixman-1-0 libnuma1 libglib2.0-0 libslirp0 libsdl2-2.0-0
|
||||
version: 1.0
|
||||
|
||||
- name: Get QEMU version
|
||||
uses: pozetroninc/github-action-get-latest-release@2a61c339ea7ef0a336d1daa35ef0cb1418e7676c # v0.8.0
|
||||
uses: pozetroninc/github-action-get-latest-release@v0.7.0
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
id: get-qemu-version
|
||||
with:
|
||||
|
|
@ -92,7 +92,7 @@ jobs:
|
|||
|
||||
- name: Cache QEMU
|
||||
id: cache-qemu
|
||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache@v4
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
with:
|
||||
path: |
|
||||
|
|
@ -113,18 +113,18 @@ jobs:
|
|||
|
||||
- name: Get binaries
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: tests-bin-${{ inputs.chip }}-${{ inputs.type }}
|
||||
path: |
|
||||
~/.arduino/tests/${{ inputs.chip }}
|
||||
~/.arduino/tests
|
||||
|
||||
- name: Run Tests
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
run: QEMU_PATH="${{ env.QEMU_INSTALL_PATH }}" bash .github/scripts/tests_run.sh -c -type ${{inputs.type}} -t ${{inputs.chip}} -i 0 -m 1 -Q
|
||||
|
||||
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as cache
|
||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/save@v4
|
||||
if: steps.check-tests.outputs.enabled == 'true' && github.event.pull_request.number != null
|
||||
with:
|
||||
key: tests-${{ env.id }}-results-qemu
|
||||
|
|
@ -133,7 +133,7 @@ jobs:
|
|||
tests/**/result_*.json
|
||||
|
||||
- name: Upload ${{ inputs.chip }} ${{ inputs.type }} QEMU results as artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: tests-results-qemu-${{ inputs.chip }}-${{ inputs.type }}
|
||||
|
|
|
|||
49
.github/workflows/tests_results.yml
vendored
49
.github/workflows/tests_results.yml
vendored
|
|
@ -24,12 +24,12 @@ jobs:
|
|||
pull-requests: write
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: gh-pages
|
||||
|
||||
- name: Download and Extract Artifacts
|
||||
uses: dawidd6/action-download-artifact@07ab29fd4a977ae4d2b275087cf67563dfdf0295 # v9
|
||||
uses: dawidd6/action-download-artifact@v6
|
||||
with:
|
||||
run_id: ${{ github.event.workflow_run.id }}
|
||||
path: ./artifacts
|
||||
|
|
@ -41,7 +41,6 @@ jobs:
|
|||
original_sha=$(cat ./artifacts/parent-artifacts/sha.txt)
|
||||
original_ref=$(cat ./artifacts/parent-artifacts/ref.txt)
|
||||
original_conclusion=$(cat ./artifacts/parent-artifacts/conclusion.txt)
|
||||
original_run_id=$(cat ./artifacts/parent-artifacts/run_id.txt)
|
||||
|
||||
# Sanitize the values to avoid security issues
|
||||
|
||||
|
|
@ -60,30 +59,20 @@ jobs:
|
|||
# Conclusion: Allow alphabetical characters and underscores
|
||||
original_conclusion=$(echo "$original_conclusion" | tr -cd '[:alpha:]_')
|
||||
|
||||
# Run ID: Allow numeric characters
|
||||
original_run_id=$(echo "$original_run_id" | tr -cd '[:digit:]')
|
||||
|
||||
echo "original_event=$original_event" >> $GITHUB_ENV
|
||||
echo "original_action=$original_action" >> $GITHUB_ENV
|
||||
echo "original_sha=$original_sha" >> $GITHUB_ENV
|
||||
echo "original_ref=$original_ref" >> $GITHUB_ENV
|
||||
echo "original_conclusion=$original_conclusion" >> $GITHUB_ENV
|
||||
echo "original_run_id=$original_run_id" >> $GITHUB_ENV
|
||||
|
||||
echo "original_event = $original_event"
|
||||
echo "original_action = $original_action"
|
||||
echo "original_sha = $original_sha"
|
||||
echo "original_ref = $original_ref"
|
||||
echo "original_conclusion = $original_conclusion"
|
||||
echo "original_run_id = $original_run_id"
|
||||
|
||||
- name: Print links to other runs
|
||||
run: |
|
||||
echo "Build, Hardware and QEMU tests: https://github.com/${{ github.repository }}/actions/runs/${{ env.original_run_id }}"
|
||||
echo "Wokwi tests: https://github.com/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}"
|
||||
|
||||
- name: Publish Unit Test Results
|
||||
uses: EnricoMi/publish-unit-test-result-action@170bf24d20d201b842d7a52403b73ed297e6645b # v2.18.0
|
||||
uses: EnricoMi/publish-unit-test-result-action@v2
|
||||
with:
|
||||
commit: ${{ env.original_sha }}
|
||||
event_file: ./artifacts/parent-artifacts/event_file/event.json
|
||||
|
|
@ -91,17 +80,6 @@ jobs:
|
|||
files: ./artifacts/**/*.xml
|
||||
action_fail: true
|
||||
compare_to_earlier_commit: false
|
||||
json_file: ./unity_results.json
|
||||
json_suite_details: true
|
||||
|
||||
- name: Upload JSON
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
if: ${{ always() }}
|
||||
with:
|
||||
name: unity_results
|
||||
overwrite: true
|
||||
path: |
|
||||
./unity_results.json
|
||||
|
||||
- name: Fail if tests failed
|
||||
if: ${{ env.original_conclusion == 'failure' || env.original_conclusion == 'timed_out' || github.event.workflow_run.conclusion == 'failure' || github.event.workflow_run.conclusion == 'timed_out' }}
|
||||
|
|
@ -109,7 +87,7 @@ jobs:
|
|||
|
||||
- name: Clean up caches
|
||||
if: always()
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const ref = process.env.original_ref;
|
||||
|
|
@ -139,7 +117,7 @@ jobs:
|
|||
});
|
||||
|
||||
- name: Report conclusion
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
if: always()
|
||||
with:
|
||||
script: |
|
||||
|
|
@ -160,22 +138,15 @@ jobs:
|
|||
})).data;
|
||||
core.info(`${name} is ${state}`);
|
||||
|
||||
- name: Generate report
|
||||
- name: Create output folder
|
||||
if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled
|
||||
env:
|
||||
REPORT_FILE: ./runtime-tests-results/RUNTIME_TESTS_REPORT.md
|
||||
WOKWI_RUN_ID: ${{ github.event.workflow_run.id }}
|
||||
BUILD_RUN_ID: ${{ env.original_run_id }}
|
||||
IS_FAILING: ${{ env.original_conclusion == 'failure' || env.original_conclusion == 'timed_out' || github.event.workflow_run.conclusion == 'failure' || github.event.workflow_run.conclusion == 'timed_out' || job.status == 'failure' }}
|
||||
run: |
|
||||
rm -rf artifacts $REPORT_FILE
|
||||
mv -f ./unity_results.json ./runtime-tests-results/unity_results.json
|
||||
touch $REPORT_FILE
|
||||
python3 ./runtime-tests-results/table_generator.py ./runtime-tests-results/unity_results.json >> $REPORT_FILE
|
||||
rm -rf artifacts
|
||||
mkdir -p runtime-tests-results
|
||||
|
||||
- name: Generate badge
|
||||
if: ${{ !cancelled() && (env.original_event == 'schedule' || env.original_event == 'workflow_dispatch') }} # codespell:ignore cancelled
|
||||
uses: jaywcjlove/generated-badges@0e078ae4d4bab3777ea4f137de496ab44688f5ad # v1.0.13
|
||||
uses: jaywcjlove/generated-badges@v1.0.13
|
||||
with:
|
||||
label: Runtime Tests
|
||||
status: ${{ job.status == 'success' && 'passing' || 'failing' }}
|
||||
|
|
@ -190,6 +161,6 @@ jobs:
|
|||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
if [[ `git status --porcelain` ]]; then
|
||||
git add --all
|
||||
git commit -m "Updated runtime tests report"
|
||||
git commit -m "Updated runtime tests badge"
|
||||
git push origin HEAD:gh-pages
|
||||
fi
|
||||
|
|
|
|||
38
.github/workflows/tests_wokwi.yml
vendored
38
.github/workflows/tests_wokwi.yml
vendored
|
|
@ -27,7 +27,7 @@ jobs:
|
|||
types: ${{ steps.set-ref.outputs.types }}
|
||||
steps:
|
||||
- name: Report pending
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = '${{ github.repository_owner }}';
|
||||
|
|
@ -47,7 +47,7 @@ jobs:
|
|||
core.info(`${name} is ${state}`);
|
||||
|
||||
- name: Download and extract event file
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
|
|
@ -55,7 +55,7 @@ jobs:
|
|||
path: artifacts/event_file
|
||||
|
||||
- name: Download and extract matrix info
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
|
|
@ -109,10 +109,6 @@ jobs:
|
|||
printf "\nAction = "
|
||||
cat artifacts/action.txt
|
||||
|
||||
printf "${{ github.event.workflow_run.id }}" >> artifacts/run_id.txt
|
||||
printf "\nRun ID = "
|
||||
cat artifacts/run_id.txt
|
||||
|
||||
if [ -z "$ref" ] || [ "$ref" == "null" ]; then
|
||||
echo "Failed to get PR number or ref"
|
||||
exit 1
|
||||
|
|
@ -130,7 +126,7 @@ jobs:
|
|||
echo "ref=$ref" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Download and extract parent hardware results
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
continue-on-error: true
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
@ -140,7 +136,7 @@ jobs:
|
|||
path: artifacts/results/hw
|
||||
|
||||
- name: Download and extract parent QEMU results
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
continue-on-error: true
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
@ -150,14 +146,14 @@ jobs:
|
|||
path: artifacts/results/qemu
|
||||
|
||||
- name: Upload parent artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: parent-artifacts
|
||||
path: artifacts
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Report conclusion
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
if: always()
|
||||
with:
|
||||
script: |
|
||||
|
|
@ -197,7 +193,7 @@ jobs:
|
|||
chip: ${{ fromJson(needs.get-artifacts.outputs.targets) }}
|
||||
steps:
|
||||
- name: Report pending
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const owner = '${{ github.repository_owner }}';
|
||||
|
|
@ -219,7 +215,7 @@ jobs:
|
|||
- name: Check if already passed
|
||||
id: get-cache-results
|
||||
if: needs.get-artifacts.outputs.pr_num
|
||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: tests-${{ env.id }}-results-wokwi
|
||||
path: |
|
||||
|
|
@ -243,11 +239,11 @@ jobs:
|
|||
# DO NOT CHECKOUT THE USER'S REPOSITORY IN THIS WORKFLOW. IT HAS HIGH SECURITY RISKS.
|
||||
- name: Checkout repository
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ needs.get-artifacts.outputs.base || github.ref }}
|
||||
|
||||
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.0.4
|
||||
- uses: actions/setup-python@v5
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
with:
|
||||
cache-dependency-path: tests/requirements.txt
|
||||
|
|
@ -266,17 +262,17 @@ jobs:
|
|||
|
||||
- name: Wokwi CI Server
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: wokwi/wokwi-ci-server-action@a6fabb5a49e080158c7a1d121ea5b789536a82c3 # v1
|
||||
uses: wokwi/wokwi-ci-server-action@v1
|
||||
|
||||
- name: Get binaries
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
name: tests-bin-${{ matrix.chip }}-${{ matrix.type }}
|
||||
path: |
|
||||
~/.arduino/tests/${{ matrix.chip }}
|
||||
~/.arduino/tests
|
||||
|
||||
- name: Run Tests
|
||||
if: ${{ steps.check-tests.outputs.enabled == 'true' }}
|
||||
|
|
@ -286,7 +282,7 @@ jobs:
|
|||
bash .github/scripts/tests_run.sh -c -type ${{ matrix.type }} -t ${{ matrix.chip }} -i 0 -m 1 -W ${{ env.WOKWI_TIMEOUT }}
|
||||
|
||||
- name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as cache
|
||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
uses: actions/cache/save@v4
|
||||
if: steps.check-tests.outputs.enabled == 'true' && needs.get-artifacts.outputs.pr_num
|
||||
with:
|
||||
key: tests-${{ env.id }}-results-wokwi
|
||||
|
|
@ -295,7 +291,7 @@ jobs:
|
|||
tests/**/result_*.json
|
||||
|
||||
- name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: tests-results-wokwi-${{ matrix.chip }}-${{ matrix.type }}
|
||||
|
|
@ -305,7 +301,7 @@ jobs:
|
|||
tests/**/result_*.json
|
||||
|
||||
- name: Report conclusion
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
uses: actions/github-script@v7
|
||||
if: always()
|
||||
with:
|
||||
script: |
|
||||
|
|
|
|||
11
.github/workflows/upload-idf-component.yml
vendored
11
.github/workflows/upload-idf-component.yml
vendored
|
|
@ -4,10 +4,7 @@ on:
|
|||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: 'Version to push to the component registry'
|
||||
required: true
|
||||
git_ref:
|
||||
description: 'Git ref with the source to push to the component registry'
|
||||
description: 'Tag to push to the component registry'
|
||||
required: true
|
||||
workflow_run:
|
||||
workflows: ["ESP32 Arduino Release"]
|
||||
|
|
@ -45,13 +42,13 @@ jobs:
|
|||
echo "Tag: $tag"
|
||||
echo "RELEASE_TAG=$tag" >> $GITHUB_ENV
|
||||
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.git_ref || env.RELEASE_TAG }}
|
||||
ref: ${{ env.RELEASE_TAG }}
|
||||
submodules: "recursive"
|
||||
|
||||
- name: Upload components to the component registry
|
||||
uses: espressif/upload-components-ci-action@b78a19fa5424714997596d3ecffa634aef8ae20b # v1.0.5
|
||||
uses: espressif/upload-components-ci-action@v1
|
||||
with:
|
||||
name: arduino-esp32
|
||||
version: ${{ env.RELEASE_TAG }}
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
workflow:
|
||||
rules:
|
||||
# Disable those non-protected push triggered pipelines
|
||||
- if: '$CI_COMMIT_REF_NAME != "master" && $CI_COMMIT_BRANCH !~ /^release\/v/ && $CI_COMMIT_TAG !~ /^\d+\.\d+(\.\d+)?($|-)/ && $CI_PIPELINE_SOURCE == "push"'
|
||||
when: never
|
||||
# when running merged result pipelines, CI_COMMIT_SHA represents the temp commit it created.
|
||||
# Please use PIPELINE_COMMIT_SHA at all places that require a commit sha of the original commit.
|
||||
- if: $CI_OPEN_MERGE_REQUESTS != null
|
||||
variables:
|
||||
PIPELINE_COMMIT_SHA: $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
|
||||
IS_MR_PIPELINE: 1
|
||||
- if: $CI_OPEN_MERGE_REQUESTS == null
|
||||
variables:
|
||||
PIPELINE_COMMIT_SHA: $CI_COMMIT_SHA
|
||||
IS_MR_PIPELINE: 0
|
||||
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
||||
variables:
|
||||
IS_SCHEDULED_RUN: "true"
|
||||
- when: always
|
||||
|
||||
# Place the default settings in `.gitlab/workflows/common.yml` instead
|
||||
|
||||
include:
|
||||
- ".gitlab/workflows/common.yml"
|
||||
- ".gitlab/workflows/sample.yml"
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
#####################
|
||||
# Default Variables #
|
||||
#####################
|
||||
|
||||
stages:
|
||||
- pre_check
|
||||
- build
|
||||
- test
|
||||
- result
|
||||
|
||||
variables:
|
||||
ESP_IDF_VERSION: "5.5"
|
||||
ESP_ARDUINO_VERSION: "3.3.0"
|
||||
|
||||
#############
|
||||
# `default` #
|
||||
#############
|
||||
|
||||
default:
|
||||
retry:
|
||||
max: 2
|
||||
when:
|
||||
# In case of a runner failure we could hop to another one, or a network error could go away.
|
||||
- runner_system_failure
|
||||
# Job execution timeout may be caused by a network issue.
|
||||
- job_execution_timeout
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
hello-world:
|
||||
stage: test
|
||||
script:
|
||||
- echo "Hello, World from GitLab CI!"
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == "push"
|
||||
|
|
@ -12,7 +12,7 @@ default_language_version:
|
|||
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: "cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b" # v5.0.0
|
||||
rev: "v5.0.0"
|
||||
hooks:
|
||||
# Generic checks
|
||||
- id: check-case-conflict
|
||||
|
|
@ -39,8 +39,15 @@ repos:
|
|||
^package\/.*$
|
||||
)
|
||||
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: "v2.3.0"
|
||||
hooks:
|
||||
# Spell checking
|
||||
- id: codespell
|
||||
exclude: ^.*\.(svd|SVD)$
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-clang-format
|
||||
rev: "f6446549e5e97ec9665b9b03e75b87b445857f9a" # v18.1.3
|
||||
rev: "v18.1.3"
|
||||
hooks:
|
||||
# C/C++ formatting
|
||||
- id: clang-format
|
||||
|
|
@ -48,7 +55,7 @@ repos:
|
|||
exclude: ^.*\/build_opt\.h$
|
||||
|
||||
- repo: https://github.com/psf/black-pre-commit-mirror
|
||||
rev: "a4920527036bb9a3f3e6055d595849d67d0da066" # 25.1.0
|
||||
rev: "24.10.0"
|
||||
hooks:
|
||||
# Python formatting
|
||||
- id: black
|
||||
|
|
@ -56,7 +63,7 @@ repos:
|
|||
args: [--line-length=120] #From the arduino code style. Add as argument rather than creating a new config file.
|
||||
|
||||
- repo: https://github.com/PyCQA/flake8
|
||||
rev: "16f5f28a384f0781bebb37a08aa45e65b9526c50" # 7.2.0
|
||||
rev: "7.1.1"
|
||||
hooks:
|
||||
# Python linting
|
||||
- id: flake8
|
||||
|
|
@ -67,28 +74,21 @@ repos:
|
|||
- flake8-simplify
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||
rev: "ffb6a759a979008c0e6dff86e39f4745a2d9eac4" # v3.1.0
|
||||
rev: "v3.1.0"
|
||||
hooks:
|
||||
# YAML formatting
|
||||
- id: prettier
|
||||
types_or: [yaml]
|
||||
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: "63c8f8312b7559622c0d82815639671ae42132ac" # v2.4.1
|
||||
hooks:
|
||||
# Spell checking
|
||||
- id: codespell
|
||||
exclude: ^.*\.(svd|SVD)$
|
||||
|
||||
- repo: https://github.com/shellcheck-py/shellcheck-py
|
||||
rev: "a23f6b85d0fdd5bb9d564e2579e678033debbdff" # v0.10.0.1
|
||||
rev: "v0.10.0.1"
|
||||
hooks:
|
||||
# Bash linting
|
||||
- id: shellcheck
|
||||
types: [shell]
|
||||
|
||||
- repo: https://github.com/openstack/bashate
|
||||
rev: "fbd7c2534c2701351c603ff700ddf08202430a31" # 2.1.1
|
||||
rev: "2.1.1"
|
||||
hooks:
|
||||
# Bash formatting
|
||||
- id: bashate
|
||||
|
|
@ -96,15 +96,15 @@ repos:
|
|||
args: ["-i", "E006"] # Ignore E006: Line too long
|
||||
|
||||
- repo: https://github.com/errata-ai/vale
|
||||
rev: "dc4c47923788a413fb5677de6e3370d514aecb78" # v3.11.2
|
||||
rev: "v3.9.1"
|
||||
hooks:
|
||||
# Sync vale styles and lint markdown and reStructuredText
|
||||
- id: vale
|
||||
name: vale-sync
|
||||
language_version: "1.23.2"
|
||||
language_version: "1.21.6"
|
||||
pass_filenames: false
|
||||
args: [sync]
|
||||
types_or: [markdown, rst]
|
||||
- id: vale
|
||||
language_version: "1.23.2"
|
||||
language_version: "1.21.6"
|
||||
types_or: [markdown, rst]
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
# idf.py build
|
||||
|
||||
set(min_supported_idf_version "5.3.0")
|
||||
set(max_supported_idf_version "5.5.99")
|
||||
set(max_supported_idf_version "5.3.99")
|
||||
set(idf_version "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}")
|
||||
|
||||
if ("${idf_version}" AND NOT "$ENV{ARDUINO_SKIP_IDF_VERSION_CHECK}")
|
||||
|
|
@ -33,7 +33,6 @@ set(CORE_SRCS
|
|||
cores/esp32/esp32-hal-dac.c
|
||||
cores/esp32/esp32-hal-gpio.c
|
||||
cores/esp32/esp32-hal-i2c.c
|
||||
cores/esp32/esp32-hal-i2c-ng.c
|
||||
cores/esp32/esp32-hal-i2c-slave.c
|
||||
cores/esp32/esp32-hal-ledc.c
|
||||
cores/esp32/esp32-hal-matrix.c
|
||||
|
|
@ -165,7 +164,6 @@ set(ARDUINO_LIBRARY_LittleFS_SRCS libraries/LittleFS/src/LittleFS.cpp)
|
|||
set(ARDUINO_LIBRARY_NetBIOS_SRCS libraries/NetBIOS/src/NetBIOS.cpp)
|
||||
|
||||
set(ARDUINO_LIBRARY_OpenThread_SRCS
|
||||
libraries/OpenThread/src/OThread.cpp
|
||||
libraries/OpenThread/src/OThreadCLI.cpp
|
||||
libraries/OpenThread/src/OThreadCLI_Util.cpp)
|
||||
|
||||
|
|
@ -183,9 +181,7 @@ set(ARDUINO_LIBRARY_Matter_SRCS
|
|||
libraries/Matter/src/MatterEndpoints/MatterPressureSensor.cpp
|
||||
libraries/Matter/src/MatterEndpoints/MatterOccupancySensor.cpp
|
||||
libraries/Matter/src/MatterEndpoints/MatterOnOffPlugin.cpp
|
||||
libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp
|
||||
libraries/Matter/src/Matter.cpp
|
||||
libraries/Matter/src/MatterEndPoint.cpp)
|
||||
libraries/Matter/src/Matter.cpp)
|
||||
|
||||
set(ARDUINO_LIBRARY_PPP_SRCS
|
||||
libraries/PPP/src/PPP.cpp
|
||||
|
|
@ -246,11 +242,7 @@ set(ARDUINO_LIBRARY_USB_SRCS
|
|||
set(ARDUINO_LIBRARY_WebServer_SRCS
|
||||
libraries/WebServer/src/WebServer.cpp
|
||||
libraries/WebServer/src/Parsing.cpp
|
||||
libraries/WebServer/src/detail/mimetable.cpp
|
||||
libraries/WebServer/src/middleware/MiddlewareChain.cpp
|
||||
libraries/WebServer/src/middleware/AuthenticationMiddleware.cpp
|
||||
libraries/WebServer/src/middleware/CorsMiddleware.cpp
|
||||
libraries/WebServer/src/middleware/LoggingMiddleware.cpp)
|
||||
libraries/WebServer/src/detail/mimetable.cpp)
|
||||
|
||||
set(ARDUINO_LIBRARY_NetworkClientSecure_SRCS
|
||||
libraries/NetworkClientSecure/src/ssl_client.cpp
|
||||
|
|
@ -293,20 +285,6 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS
|
|||
libraries/Zigbee/src/ep/ZigbeePressureSensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeOccupancySensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeCarbonDioxideSensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeContactSwitch.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeDoorWindowHandle.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeWindowCovering.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeVibrationSensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeAnalog.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeRangeExtender.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeGateway.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeIlluminanceSensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeePM25Sensor.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeElectricalMeasurement.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeBinary.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeePowerOutlet.cpp
|
||||
libraries/Zigbee/src/ep/ZigbeeFanControl.cpp
|
||||
)
|
||||
|
||||
set(ARDUINO_LIBRARY_BLE_SRCS
|
||||
|
|
@ -362,13 +340,13 @@ endforeach()
|
|||
set(includedirs variants/${CONFIG_ARDUINO_VARIANT}/ cores/esp32/ ${ARDUINO_LIBRARIES_INCLUDEDIRS})
|
||||
set(srcs ${CORE_SRCS} ${ARDUINO_LIBRARIES_SRCS})
|
||||
set(priv_includes cores/esp32/libb64)
|
||||
set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser esp_ringbuf esp_driver_gptimer esp_driver_usb_serial_jtag driver esp_http_client esp_https_ota)
|
||||
set(requires spi_flash esp_partition mbedtls wpa_supplicant esp_adc esp_eth http_parser esp_ringbuf esp_driver_gptimer esp_driver_usb_serial_jtag driver)
|
||||
set(priv_requires fatfs nvs_flash app_update spiffs bootloader_support bt esp_hid usb esp_psram ${ARDUINO_LIBRARIES_REQUIRES})
|
||||
|
||||
if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_OpenThread)
|
||||
#if(CONFIG_SOC_IEEE802154_SUPPORTED) # Does not work!
|
||||
#if(CONFIG_OPENTHREAD_ENABLED) # Does not work!
|
||||
if(IDF_TARGET STREQUAL "esp32c6" OR IDF_TARGET STREQUAL "esp32h2" OR IDF_TARGET STREQUAL "esp32c5") # Sadly only this works
|
||||
if(IDF_TARGET STREQUAL "esp32c6" OR IDF_TARGET STREQUAL "esp32h2") # Sadly only this works
|
||||
list(APPEND requires openthread)
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
|||
17
README.md
17
README.md
|
|
@ -1,13 +1,11 @@
|
|||
# Arduino core for the ESP32, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-P4, ESP32-S2 and ESP32-S3.
|
||||
# Arduino core for the ESP32, ESP32-P4, ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C6 and ESP32-H2
|
||||
|
||||
[](https://github.com/espressif/arduino-esp32/actions/workflows/push.yml?query=branch%3Amaster+event%3Apush)
|
||||
[)](https://github.com/espressif/arduino-esp32/actions/workflows/push.yml?query=branch%3Amaster+event%3Aschedule)
|
||||
[](https://github.com/espressif/arduino-esp32/blob/gh-pages/LIBRARIES_TEST.md)
|
||||
[](https://github.com/espressif/arduino-esp32/blob/gh-pages/runtime-tests-results/RUNTIME_TESTS_REPORT.md)
|
||||
[](https://github.com/espressif/arduino-esp32/actions/workflows/tests_results.yml)
|
||||
|
||||
### Need help or have a question? Join the chat at [Discord](https://discord.gg/8xY6e9crwv) or [open a new Discussion](https://github.com/espressif/arduino-esp32/discussions)
|
||||
|
||||
[](https://discord.gg/8xY6e9crwv)
|
||||
### Need help or have a question? Join the chat at [Gitter](https://gitter.im/espressif/arduino-esp32) or [open a new Discussion](https://github.com/espressif/arduino-esp32/discussions)
|
||||
|
||||
## Contents
|
||||
|
||||
|
|
@ -67,17 +65,16 @@ Here are the ESP32 series supported by the Arduino-ESP32 project:
|
|||
| **SoC** | **Stable** | **Development** | **Datasheet** |
|
||||
|----------|:----------:|:---------------:|:-------------------------------------------------------------------------------------------------:|
|
||||
| ESP32 | Yes | Yes | [ESP32](https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf) |
|
||||
| ESP32-S2 | Yes | Yes | [ESP32-S2](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) |
|
||||
| ESP32-C3 | Yes | Yes | [ESP32-C3](https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf) |
|
||||
| ESP32-S3 | Yes | Yes | [ESP32-S3](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) |
|
||||
| ESP32-C6 | Yes | Yes | [ESP32-C6](https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf) |
|
||||
| ESP32-H2 | Yes | Yes | [ESP32-H2](https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf) |
|
||||
| ESP32-P4 | Yes | Yes | [ESP32-P4](https://www.espressif.com/sites/default/files/documentation/esp32-p4_datasheet_en.pdf) |
|
||||
| ESP32-S2 | Yes | Yes | [ESP32-S2](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) |
|
||||
| ESP32-S3 | Yes | Yes | [ESP32-S3](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) |
|
||||
|
||||
> [!NOTE]
|
||||
> ESP32-C2 is also supported by Arduino-ESP32 but requires using Arduino as an ESP-IDF component or rebuilding the static libraries.
|
||||
> For more information, see the [Arduino as an ESP-IDF component documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/esp-idf_component.html) or the
|
||||
> [Lib Builder documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/lib_builder.html), respectively.
|
||||
> ESP32-C2 is also supported by Arduino-ESP32 but requires rebuilding the static libraries. This is not trivial and requires a good understanding of the ESP-IDF
|
||||
> build system. For more information, see the [Lib Builder documentation](https://docs.espressif.com/projects/arduino-esp32/en/latest/lib_builder.html).
|
||||
|
||||
For more details visit the [supported chips](https://docs.espressif.com/projects/arduino-esp32/en/latest/getting_started.html#supported-soc-s) documentation page.
|
||||
|
||||
|
|
|
|||
3728
boards.txt
3728
boards.txt
File diff suppressed because it is too large
Load diff
|
|
@ -33,6 +33,7 @@
|
|||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "esp32-hal.h"
|
||||
#include "esp8266-compat.h"
|
||||
#include "soc/gpio_reg.h"
|
||||
|
||||
|
|
@ -40,9 +41,6 @@
|
|||
#include "binary.h"
|
||||
#include "extra_attr.h"
|
||||
|
||||
#include "pins_arduino.h"
|
||||
#include "esp32-hal.h"
|
||||
|
||||
#define PI 3.1415926535897932384626433832795
|
||||
#define HALF_PI 1.5707963267948966192313216916398
|
||||
#define TWO_PI 6.283185307179586476925286766559
|
||||
|
|
@ -251,7 +249,7 @@ void noTone(uint8_t _pin);
|
|||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// must be applied last as it overrides some of the above
|
||||
#include "pins_arduino.h"
|
||||
#include "io_pin_remap.h"
|
||||
|
||||
#endif /* _ESP32_CORE_ARDUINO_H_ */
|
||||
|
|
|
|||
|
|
@ -26,7 +26,9 @@
|
|||
class Client : public Stream {
|
||||
public:
|
||||
virtual int connect(IPAddress ip, uint16_t port) = 0;
|
||||
virtual int connect(IPAddress ip, uint16_t port, int32_t timeout) = 0;
|
||||
virtual int connect(const char *host, uint16_t port) = 0;
|
||||
virtual int connect(const char *host, uint16_t port, int32_t timeout) = 0;
|
||||
virtual size_t write(uint8_t) = 0;
|
||||
virtual size_t write(const uint8_t *buf, size_t size) = 0;
|
||||
virtual int available() = 0;
|
||||
|
|
|
|||
|
|
@ -119,10 +119,10 @@ espHsvColor_t espRgbColorToHsvColor(espRgbColor_t rgb) {
|
|||
}
|
||||
|
||||
espRgbColor_t espXYColorToRgbColor(uint8_t Level, espXyColor_t xy) {
|
||||
return espXYToRgbColor(Level, xy.x, xy.y, true);
|
||||
return espXYToRgbColor(Level, xy.x, xy.y);
|
||||
}
|
||||
|
||||
espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y, bool addXYZScaling) {
|
||||
espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y) {
|
||||
// convert xyY color space to RGB
|
||||
|
||||
// https://www.easyrgb.com/en/math.php
|
||||
|
|
@ -156,11 +156,9 @@ espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t curren
|
|||
// X, Y and Z input refer to a D65/2° standard illuminant.
|
||||
// sR, sG and sB (standard RGB) output range = 0 ÷ 255
|
||||
// convert XYZ to RGB - CIE XYZ to sRGB
|
||||
if (addXYZScaling) {
|
||||
X = X / 100.0f;
|
||||
Y = Y / 100.0f;
|
||||
Z = Z / 100.0f;
|
||||
}
|
||||
X = X / 100.0f;
|
||||
Y = Y / 100.0f;
|
||||
Z = Z / 100.0f;
|
||||
|
||||
r = (X * 3.2406f) - (Y * 1.5372f) - (Z * 0.4986f);
|
||||
g = -(X * 0.9689f) + (Y * 1.8758f) + (Z * 0.0415f);
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
@ -50,7 +49,7 @@ typedef struct HsvColor_t espHsvColor_t;
|
|||
typedef struct XyColor_t espXyColor_t;
|
||||
typedef struct CtColor_t espCtColor_t;
|
||||
|
||||
espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y, bool addXYZScaling);
|
||||
espRgbColor_t espXYToRgbColor(uint8_t Level, uint16_t current_X, uint16_t current_Y);
|
||||
espRgbColor_t espXYColorToRgb(uint8_t Level, espXyColor_t xy);
|
||||
espXyColor_t espRgbColorToXYColor(espRgbColor_t rgb);
|
||||
espXyColor_t espRgbToXYColor(uint8_t r, uint8_t g, uint8_t b);
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@
|
|||
#include "Esp.h"
|
||||
#include "esp_sleep.h"
|
||||
#include "spi_flash_mmap.h"
|
||||
#include "esp_idf_version.h"
|
||||
#include <memory>
|
||||
#include <soc/soc.h>
|
||||
#include <esp_partition.h>
|
||||
|
|
@ -64,9 +63,6 @@ extern "C" {
|
|||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#include "esp32p4/rom/spi_flash.h"
|
||||
#define ESP_FLASH_IMAGE_BASE 0x2000 // Esp32p4 is located at 0x2000
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "esp32c5/rom/spi_flash.h"
|
||||
#define ESP_FLASH_IMAGE_BASE 0x2000 // Esp32c5 is located at 0x2000
|
||||
#else
|
||||
#error Target CONFIG_IDF_TARGET is not supported
|
||||
#endif
|
||||
|
|
@ -305,12 +301,7 @@ const char *EspClass::getChipModel(void) {
|
|||
case CHIP_ESP32C6: return "ESP32-C6";
|
||||
case CHIP_ESP32H2: return "ESP32-H2";
|
||||
case CHIP_ESP32P4: return "ESP32-P4";
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
|
||||
case CHIP_ESP32C5: return "ESP32-C5";
|
||||
case CHIP_ESP32C61: return "ESP32-C61";
|
||||
case CHIP_ESP32H21: return "ESP32-H21";
|
||||
#endif
|
||||
default: return "UNKNOWN";
|
||||
default: return "UNKNOWN";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@
|
|||
#include "esp_partition.h"
|
||||
#include "esp_ota_ops.h"
|
||||
#include "esp_image_format.h"
|
||||
#include "pins_arduino.h"
|
||||
#include "esp32-hal.h"
|
||||
#include "pins_arduino.h"
|
||||
#include "firmware_msc_fat.h"
|
||||
#include "spi_flash_mmap.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -603,7 +603,6 @@ void HWCDC::setDebugOutput(bool en) {
|
|||
} else {
|
||||
ets_install_putc2(NULL);
|
||||
}
|
||||
ets_install_putc1(NULL); // closes UART log output
|
||||
}
|
||||
|
||||
#if ARDUINO_USB_MODE && ARDUINO_USB_CDC_ON_BOOT // Hardware JTAG CDC selected
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
#include <inttypes.h>
|
||||
#include "Stream.h"
|
||||
#include <functional>
|
||||
|
||||
class HardwareI2C : public Stream {
|
||||
public:
|
||||
|
|
@ -37,7 +36,6 @@ public:
|
|||
virtual size_t requestFrom(uint8_t address, size_t len, bool stopBit) = 0;
|
||||
virtual size_t requestFrom(uint8_t address, size_t len) = 0;
|
||||
|
||||
// Update base class to use std::function
|
||||
virtual void onReceive(const std::function<void(int)> &) = 0;
|
||||
virtual void onRequest(const std::function<void()> &) = 0;
|
||||
virtual void onReceive(void (*)(int)) = 0;
|
||||
virtual void onRequest(void (*)(void)) = 0;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -11,52 +11,52 @@
|
|||
#include "driver/uart.h"
|
||||
#include "freertos/queue.h"
|
||||
|
||||
#if (SOC_UART_LP_NUM >= 1)
|
||||
#define UART_HW_FIFO_LEN(uart_num) ((uart_num < SOC_UART_HP_NUM) ? SOC_UART_FIFO_LEN : SOC_LP_UART_FIFO_LEN)
|
||||
#else
|
||||
#define UART_HW_FIFO_LEN(uart_num) SOC_UART_FIFO_LEN
|
||||
#ifndef ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE 2048
|
||||
#endif
|
||||
|
||||
#ifndef ARDUINO_SERIAL_EVENT_TASK_PRIORITY
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_PRIORITY (configMAX_PRIORITIES - 1)
|
||||
#endif
|
||||
|
||||
#ifndef ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE -1
|
||||
#endif
|
||||
|
||||
void serialEvent(void) __attribute__((weak));
|
||||
|
||||
#if SOC_UART_NUM > 1
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
void serialEvent1(void) __attribute__((weak));
|
||||
#endif /* SOC_UART_NUM > 1 */
|
||||
#endif /* SOC_UART_HP_NUM > 1 */
|
||||
|
||||
#if SOC_UART_NUM > 2
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
void serialEvent2(void) __attribute__((weak));
|
||||
#endif /* SOC_UART_NUM > 2 */
|
||||
#endif /* SOC_UART_HP_NUM > 2 */
|
||||
|
||||
#if SOC_UART_NUM > 3
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
void serialEvent3(void) __attribute__((weak));
|
||||
#endif /* SOC_UART_NUM > 3 */
|
||||
#endif /* SOC_UART_HP_NUM > 3 */
|
||||
|
||||
#if SOC_UART_NUM > 4
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
void serialEvent4(void) __attribute__((weak));
|
||||
#endif /* SOC_UART_NUM > 4 */
|
||||
|
||||
#if SOC_UART_NUM > 5
|
||||
void serialEvent5(void) __attribute__((weak));
|
||||
#endif /* SOC_UART_NUM > 5 */
|
||||
#endif /* SOC_UART_HP_NUM > 4 */
|
||||
|
||||
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
|
||||
// There is always Seria0 for UART0
|
||||
HardwareSerial Serial0(0);
|
||||
#if SOC_UART_NUM > 1
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
HardwareSerial Serial1(1);
|
||||
#endif
|
||||
#if SOC_UART_NUM > 2
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
HardwareSerial Serial2(2);
|
||||
#endif
|
||||
#if SOC_UART_NUM > 3
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
HardwareSerial Serial3(3);
|
||||
#endif
|
||||
#if SOC_UART_NUM > 4
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
HardwareSerial Serial4(4);
|
||||
#endif
|
||||
#if (SOC_UART_NUM > 5)
|
||||
HardwareSerial Serial5(5);
|
||||
#endif
|
||||
|
||||
#if HWCDC_SERIAL_IS_DEFINED == 1 // Hardware JTAG CDC Event
|
||||
extern void HWCDCSerialEvent(void) __attribute__((weak));
|
||||
#endif
|
||||
|
|
@ -81,31 +81,26 @@ void serialEventRun(void) {
|
|||
if (serialEvent && Serial0.available()) {
|
||||
serialEvent();
|
||||
}
|
||||
#if SOC_UART_NUM > 1
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
if (serialEvent1 && Serial1.available()) {
|
||||
serialEvent1();
|
||||
}
|
||||
#endif
|
||||
#if SOC_UART_NUM > 2
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
if (serialEvent2 && Serial2.available()) {
|
||||
serialEvent2();
|
||||
}
|
||||
#endif
|
||||
#if SOC_UART_NUM > 3
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
if (serialEvent3 && Serial3.available()) {
|
||||
serialEvent3();
|
||||
}
|
||||
#endif
|
||||
#if SOC_UART_NUM > 4
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
if (serialEvent4 && Serial4.available()) {
|
||||
serialEvent4();
|
||||
}
|
||||
#endif
|
||||
#if SOC_UART_NUM > 5
|
||||
if (serialEvent5 && Serial5.available()) {
|
||||
serialEvent5();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -190,8 +185,7 @@ void HardwareSerial::onReceive(OnReceiveCb function, bool onlyOnTimeout) {
|
|||
|
||||
// in case that onReceive() shall work only with RX Timeout, FIFO shall be high
|
||||
// this is a work around for an IDF issue with events and low FIFO Full value (< 3)
|
||||
// Not valid for the LP UART
|
||||
if (_onReceiveTimeout && _uart_nr < SOC_UART_HP_NUM) {
|
||||
if (_onReceiveTimeout) {
|
||||
uartSetRxFIFOFull(_uart, 120);
|
||||
log_w("OnReceive is set to Timeout only, thus FIFO Full is now 120 bytes.");
|
||||
}
|
||||
|
|
@ -213,13 +207,12 @@ bool HardwareSerial::setRxFIFOFull(uint8_t fifoBytes) {
|
|||
HSERIAL_MUTEX_LOCK();
|
||||
// in case that onReceive() shall work only with RX Timeout, FIFO shall be high
|
||||
// this is a work around for an IDF issue with events and low FIFO Full value (< 3)
|
||||
// Not valid for the LP UART
|
||||
if (_onReceiveCB != NULL && _onReceiveTimeout && _uart_nr < SOC_UART_HP_NUM) {
|
||||
if (_onReceiveCB != NULL && _onReceiveTimeout) {
|
||||
fifoBytes = 120;
|
||||
log_w("OnReceive is set to Timeout only, thus FIFO Full is now 120 bytes.");
|
||||
}
|
||||
bool retCode = uartSetRxFIFOFull(_uart, fifoBytes); // Set new timeout
|
||||
if (fifoBytes > 0 && fifoBytes < UART_HW_FIFO_LEN(_uart_nr) - 1) {
|
||||
if (fifoBytes > 0 && fifoBytes < SOC_UART_FIFO_LEN - 1) {
|
||||
_rxFIFOFull = fifoBytes;
|
||||
}
|
||||
HSERIAL_MUTEX_UNLOCK();
|
||||
|
|
@ -305,8 +298,8 @@ void HardwareSerial::_uartEventTask(void *args) {
|
|||
}
|
||||
|
||||
void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd) {
|
||||
if (_uart_nr >= SOC_UART_NUM) {
|
||||
log_e("Serial number is invalid, please use a number from 0 to %u", SOC_UART_NUM - 1);
|
||||
if (_uart_nr >= SOC_UART_HP_NUM) {
|
||||
log_e("Serial number is invalid, please use a number from 0 to %u", SOC_UART_HP_NUM - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -340,7 +333,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||
txPin = _txPin < 0 ? (int8_t)SOC_TX0 : _txPin;
|
||||
}
|
||||
break;
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
#if SOC_UART_HP_NUM > 1 // may save some flash bytes...
|
||||
case UART_NUM_1:
|
||||
if (rxPin < 0 && txPin < 0) {
|
||||
// do not change RX1/TX1 if it has already been set before
|
||||
|
|
@ -348,8 +341,8 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||
txPin = _txPin < 0 ? (int8_t)TX1 : _txPin;
|
||||
}
|
||||
break;
|
||||
#endif // UART_NUM_1
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
#endif
|
||||
#if SOC_UART_HP_NUM > 2 // may save some flash bytes...
|
||||
case UART_NUM_2:
|
||||
if (rxPin < 0 && txPin < 0) {
|
||||
// do not change RX2/TX2 if it has already been set before
|
||||
|
|
@ -361,11 +354,11 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||
#endif
|
||||
}
|
||||
break;
|
||||
#endif // UART_NUM_2
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
#endif
|
||||
#if SOC_UART_HP_NUM > 3 // may save some flash bytes...
|
||||
case UART_NUM_3:
|
||||
if (rxPin < 0 && txPin < 0) {
|
||||
// do not change RX3/TX3 if it has already been set before
|
||||
// do not change RX2/TX2 if it has already been set before
|
||||
#ifdef RX3
|
||||
rxPin = _rxPin < 0 ? (int8_t)RX3 : _rxPin;
|
||||
#endif
|
||||
|
|
@ -374,11 +367,11 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||
#endif
|
||||
}
|
||||
break;
|
||||
#endif // UART_NUM_3
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
#endif
|
||||
#if SOC_UART_HP_NUM > 4 // may save some flash bytes...
|
||||
case UART_NUM_4:
|
||||
if (rxPin < 0 && txPin < 0) {
|
||||
// do not change RX4/TX4 if it has already been set before
|
||||
// do not change RX2/TX2 if it has already been set before
|
||||
#ifdef RX4
|
||||
rxPin = _rxPin < 0 ? (int8_t)RX4 : _rxPin;
|
||||
#endif
|
||||
|
|
@ -387,20 +380,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||
#endif
|
||||
}
|
||||
break;
|
||||
#endif // UART_NUM_4
|
||||
#if (SOC_UART_LP_NUM >= 1)
|
||||
case LP_UART_NUM_0:
|
||||
if (rxPin < 0 && txPin < 0) {
|
||||
// do not change RX0_LP/TX0_LP if it has already been set before
|
||||
#ifdef LP_RX0
|
||||
rxPin = _rxPin < 0 ? (int8_t)LP_RX0 : _rxPin;
|
||||
#endif
|
||||
#ifdef LP_TX0
|
||||
txPin = _txPin < 0 ? (int8_t)LP_TX0 : _txPin;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
#endif // LP_UART_NUM_0
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -465,8 +445,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
|
|||
if (!_rxFIFOFull) { // it has not being changed before calling begin()
|
||||
// set a default FIFO Full value for the IDF driver
|
||||
uint8_t fifoFull = 1;
|
||||
// if baud rate is higher than 57600 or onReceive() is set, it will set FIFO Full to 120 bytes, except for LP UART
|
||||
if (_uart_nr < SOC_UART_HP_NUM && (baud > 57600 || (_onReceiveCB != NULL && _onReceiveTimeout))) {
|
||||
if (baud > 57600 || (_onReceiveCB != NULL && _onReceiveTimeout)) {
|
||||
fifoFull = 120;
|
||||
}
|
||||
uartSetRxFIFOFull(_uart, fifoFull);
|
||||
|
|
@ -498,12 +477,6 @@ void HardwareSerial::setDebugOutput(bool en) {
|
|||
if (_uart == 0) {
|
||||
return;
|
||||
}
|
||||
#if (SOC_UART_LP_NUM >= 1)
|
||||
if (_uart_nr >= SOC_UART_HP_NUM) {
|
||||
log_e("LP UART does not support Debug Output.");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (en) {
|
||||
uartSetDebug(_uart);
|
||||
} else {
|
||||
|
|
@ -607,56 +580,35 @@ bool HardwareSerial::setMode(SerialMode mode) {
|
|||
return uartSetMode(_uart, mode);
|
||||
}
|
||||
|
||||
// Sets the UART Clock Source based on the compatible SoC options
|
||||
// This method must be called before starting UART using begin(), otherwise it won't have any effect.
|
||||
// Clock Source Options are:
|
||||
// UART_CLK_SRC_DEFAULT :: any SoC - it will set whatever IDF defines as the default UART Clock Source
|
||||
// UART_CLK_SRC_APB :: ESP32, ESP32-S2, ESP32-C3 and ESP32-S3
|
||||
// UART_CLK_SRC_PLL :: ESP32-C2, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 and ESP32-P4
|
||||
// UART_CLK_SRC_XTAL :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4
|
||||
// UART_CLK_SRC_RTC :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4
|
||||
// UART_CLK_SRC_REF_TICK :: ESP32 and ESP32-S2
|
||||
// Note: CLK_SRC_PLL Freq depends on the SoC - ESP32-C2 has 40MHz, ESP32-H2 has 48MHz and ESP32-C5, C6, C61 and P4 has 80MHz
|
||||
// Note: ESP32-C6, C61, ESP32-P4 and ESP32-C5 have LP UART that will use only RTC_FAST or XTAL/2 as Clock Source
|
||||
bool HardwareSerial::setClockSource(SerialClkSrc clkSrc) {
|
||||
if (_uart) {
|
||||
log_e("No Clock Source change was done. This function must be called before beginning UART%d.", _uart_nr);
|
||||
return false;
|
||||
}
|
||||
return uartSetClockSource(_uart_nr, (uart_sclk_t)clkSrc);
|
||||
}
|
||||
// minimum total RX Buffer size is the UART FIFO space (128 bytes for most SoC) + 1. IDF imposition.
|
||||
// LP UART has FIFO of 16 bytes
|
||||
size_t HardwareSerial::setRxBufferSize(size_t new_size) {
|
||||
|
||||
if (_uart) {
|
||||
log_e("RX Buffer can't be resized when Serial is already running. Set it before calling begin().");
|
||||
return 0;
|
||||
}
|
||||
uint8_t FIFOLen = UART_HW_FIFO_LEN(_uart_nr);
|
||||
// Valid value is higher than the FIFO length
|
||||
if (new_size <= FIFOLen) {
|
||||
new_size = FIFOLen + 1;
|
||||
log_w("RX Buffer set to minimum value: %d.", new_size);
|
||||
|
||||
if (new_size <= SOC_UART_FIFO_LEN) {
|
||||
log_w("RX Buffer set to minimum value: %d.", SOC_UART_FIFO_LEN + 1); // ESP32, S2, S3 and C3 means higher than 128
|
||||
new_size = SOC_UART_FIFO_LEN + 1;
|
||||
}
|
||||
|
||||
_rxBufferSize = new_size;
|
||||
return _rxBufferSize;
|
||||
}
|
||||
|
||||
// minimum total TX Buffer size is the UART FIFO space (128 bytes for most SoC) + 1.
|
||||
// LP UART has FIFO of 16 bytes
|
||||
// minimum total TX Buffer size is the UART FIFO space (128 bytes for most SoC).
|
||||
size_t HardwareSerial::setTxBufferSize(size_t new_size) {
|
||||
|
||||
if (_uart) {
|
||||
log_e("TX Buffer can't be resized when Serial is already running. Set it before calling begin().");
|
||||
return 0;
|
||||
}
|
||||
uint8_t FIFOLen = UART_HW_FIFO_LEN(_uart_nr);
|
||||
// Valid values are zero or higher than the FIFO length
|
||||
if (new_size > 0 && new_size <= FIFOLen) {
|
||||
new_size = FIFOLen + 1;
|
||||
log_w("TX Buffer set to minimum value: %d.", new_size);
|
||||
|
||||
if (new_size <= SOC_UART_FIFO_LEN) {
|
||||
log_w("TX Buffer set to minimum value: %d.", SOC_UART_FIFO_LEN); // ESP32, S2, S3 and C3 means higher than 128
|
||||
_txBufferSize = 0; // it will use just UART FIFO with SOC_UART_FIFO_LEN bytes (128 for most SoC)
|
||||
return SOC_UART_FIFO_LEN;
|
||||
}
|
||||
// if new_size is higher than SOC_UART_FIFO_LEN, TX Ringbuffer will be active and it will be used to report back "availableToWrite()"
|
||||
_txBufferSize = new_size;
|
||||
|
|
|
|||
|
|
@ -96,51 +96,16 @@ typedef enum {
|
|||
UART_PARITY_ERROR
|
||||
} hardwareSerial_error_t;
|
||||
|
||||
typedef enum {
|
||||
UART_CLK_SRC_DEFAULT = UART_SCLK_DEFAULT,
|
||||
#if SOC_UART_SUPPORT_APB_CLK
|
||||
UART_CLK_SRC_APB = UART_SCLK_APB,
|
||||
#endif
|
||||
#if SOC_UART_SUPPORT_PLL_F40M_CLK
|
||||
UART_CLK_SRC_PLL = UART_SCLK_PLL_F40M,
|
||||
#elif SOC_UART_SUPPORT_PLL_F80M_CLK
|
||||
UART_CLK_SRC_PLL = UART_SCLK_PLL_F80M,
|
||||
#elif CONFIG_IDF_TARGET_ESP32H2
|
||||
UART_CLK_SRC_PLL = UART_SCLK_PLL_F48M,
|
||||
#endif
|
||||
#if SOC_UART_SUPPORT_XTAL_CLK
|
||||
UART_CLK_SRC_XTAL = UART_SCLK_XTAL,
|
||||
#endif
|
||||
#if SOC_UART_SUPPORT_RTC_CLK
|
||||
UART_CLK_SRC_RTC = UART_SCLK_RTC,
|
||||
#endif
|
||||
#if SOC_UART_SUPPORT_REF_TICK
|
||||
UART_CLK_SRC_REF_TICK = UART_SCLK_REF_TICK,
|
||||
#endif
|
||||
} SerialClkSrc;
|
||||
|
||||
#ifndef ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE
|
||||
#ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE 2048
|
||||
#else
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ARDUINO_SERIAL_EVENT_TASK_PRIORITY
|
||||
#ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_PRIORITY (configMAX_PRIORITIES - 1)
|
||||
#else
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_PRIORITY CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE
|
||||
#ifndef CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE -1
|
||||
#else
|
||||
#define ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// UART0 pins are defined by default by the bootloader.
|
||||
|
|
@ -162,8 +127,6 @@ typedef enum {
|
|||
#define SOC_RX0 (gpio_num_t)23
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#define SOC_RX0 (gpio_num_t)38
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#define SOC_RX0 (gpio_num_t)12
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
@ -182,8 +145,6 @@ typedef enum {
|
|||
#define SOC_TX0 (gpio_num_t)24
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#define SOC_TX0 (gpio_num_t)37
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#define SOC_TX0 (gpio_num_t)11
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
@ -207,8 +168,6 @@ typedef enum {
|
|||
#define RX1 (gpio_num_t)0
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#define RX1 (gpio_num_t)11
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#define RX1 (gpio_num_t)4
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
@ -229,8 +188,6 @@ typedef enum {
|
|||
#define TX1 (gpio_num_t)1
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#define TX1 (gpio_num_t)10
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#define TX1 (gpio_num_t)5
|
||||
#endif
|
||||
#endif
|
||||
#endif /* SOC_UART_HP_NUM > 1 */
|
||||
|
|
@ -255,16 +212,6 @@ typedef enum {
|
|||
#endif
|
||||
#endif /* SOC_UART_HP_NUM > 2 */
|
||||
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
#ifndef LP_RX0
|
||||
#define LP_RX0 (gpio_num_t) LP_U0RXD_GPIO_NUM
|
||||
#endif
|
||||
|
||||
#ifndef LP_TX0
|
||||
#define LP_TX0 (gpio_num_t) LP_U0TXD_GPIO_NUM
|
||||
#endif
|
||||
#endif /* SOC_UART_LP_NUM >= 1 */
|
||||
|
||||
typedef std::function<void(void)> OnReceiveCb;
|
||||
typedef std::function<void(hardwareSerial_error_t)> OnReceiveErrorCb;
|
||||
|
||||
|
|
@ -312,7 +259,7 @@ public:
|
|||
// rxfifo_full_thrhd if the UART Flow Control Threshold in the UART FIFO (max 127)
|
||||
void begin(
|
||||
unsigned long baud, uint32_t config = SERIAL_8N1, int8_t rxPin = -1, int8_t txPin = -1, bool invert = false, unsigned long timeout_ms = 20000UL,
|
||||
uint8_t rxfifo_full_thrhd = 120
|
||||
uint8_t rxfifo_full_thrhd = 112
|
||||
);
|
||||
void end(void);
|
||||
void updateBaudRate(unsigned long baud);
|
||||
|
|
@ -375,17 +322,6 @@ public:
|
|||
// UART_MODE_RS485_COLLISION_DETECT = 0x03 mode: RS485 collision detection UART mode (used for test purposes)
|
||||
// UART_MODE_RS485_APP_CTRL = 0x04 mode: application control RS485 UART mode (used for test purposes)
|
||||
bool setMode(SerialMode mode);
|
||||
// Used to set the UART clock source mode. It must be set before calling begin(), otherwise it won't have any effect.
|
||||
// Not all clock source are available to every SoC. The compatible option are listed here:
|
||||
// UART_CLK_SRC_DEFAULT :: any SoC - it will set whatever IDF defines as the default UART Clock Source
|
||||
// UART_CLK_SRC_APB :: ESP32, ESP32-S2, ESP32-C3 and ESP32-S3
|
||||
// UART_CLK_SRC_PLL :: ESP32-C2, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 and ESP32-P4
|
||||
// UART_CLK_SRC_XTAL :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4
|
||||
// UART_CLK_SRC_RTC :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4
|
||||
// UART_CLK_SRC_REF_TICK :: ESP32 and ESP32-S2
|
||||
// Note: CLK_SRC_PLL Freq depends on the SoC - ESP32-C2 has 40MHz, ESP32-H2 has 48MHz and ESP32-C5, C6, C61 and P4 has 80MHz
|
||||
// Note: ESP32-C6, C61, ESP32-P4 and ESP32-C5 have LP UART that will use only RTC_FAST or XTAL/2 as Clock Source
|
||||
bool setClockSource(SerialClkSrc clkSrc);
|
||||
size_t setRxBufferSize(size_t new_size);
|
||||
size_t setTxBufferSize(size_t new_size);
|
||||
|
||||
|
|
@ -429,21 +365,18 @@ extern void serialEventRun(void) __attribute__((weak));
|
|||
#endif // ARDUINO_USB_CDC_ON_BOOT
|
||||
// There is always Seria0 for UART0
|
||||
extern HardwareSerial Serial0;
|
||||
#if SOC_UART_NUM > 1
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
extern HardwareSerial Serial1;
|
||||
#endif
|
||||
#if SOC_UART_NUM > 2
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
extern HardwareSerial Serial2;
|
||||
#endif
|
||||
#if SOC_UART_NUM > 3
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
extern HardwareSerial Serial3;
|
||||
#endif
|
||||
#if SOC_UART_NUM > 4
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
extern HardwareSerial Serial4;
|
||||
#endif
|
||||
#if SOC_UART_NUM > 5
|
||||
extern HardwareSerial Serial5;
|
||||
#endif
|
||||
#endif //!defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
|
||||
|
||||
#endif // HardwareSerial_h
|
||||
|
|
|
|||
|
|
@ -100,7 +100,6 @@ static bool tinyusb_device_suspended = false;
|
|||
void tud_mount_cb(void) {
|
||||
tinyusb_device_mounted = true;
|
||||
arduino_usb_event_data_t p;
|
||||
p.suspend.remote_wakeup_en = 0;
|
||||
arduino_usb_event_post(ARDUINO_USB_EVENTS, ARDUINO_USB_STARTED_EVENT, &p, sizeof(arduino_usb_event_data_t), portMAX_DELAY);
|
||||
}
|
||||
|
||||
|
|
@ -108,7 +107,6 @@ void tud_mount_cb(void) {
|
|||
void tud_umount_cb(void) {
|
||||
tinyusb_device_mounted = false;
|
||||
arduino_usb_event_data_t p;
|
||||
p.suspend.remote_wakeup_en = 0;
|
||||
arduino_usb_event_post(ARDUINO_USB_EVENTS, ARDUINO_USB_STOPPED_EVENT, &p, sizeof(arduino_usb_event_data_t), portMAX_DELAY);
|
||||
}
|
||||
|
||||
|
|
@ -125,7 +123,6 @@ void tud_suspend_cb(bool remote_wakeup_en) {
|
|||
void tud_resume_cb(void) {
|
||||
tinyusb_device_suspended = false;
|
||||
arduino_usb_event_data_t p;
|
||||
p.suspend.remote_wakeup_en = 0;
|
||||
arduino_usb_event_post(ARDUINO_USB_EVENTS, ARDUINO_USB_RESUME_EVENT, &p, sizeof(arduino_usb_event_data_t), portMAX_DELAY);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,8 @@ ESP_EVENT_DEFINE_BASE(ARDUINO_USB_CDC_EVENTS);
|
|||
esp_err_t arduino_usb_event_post(esp_event_base_t event_base, int32_t event_id, void *event_data, size_t event_data_size, TickType_t ticks_to_wait);
|
||||
esp_err_t arduino_usb_event_handler_register_with(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg);
|
||||
|
||||
USBCDC *devices[CFG_TUD_CDC];
|
||||
#define MAX_USB_CDC_DEVICES 2
|
||||
USBCDC *devices[MAX_USB_CDC_DEVICES] = {NULL, NULL};
|
||||
|
||||
static uint16_t load_cdc_descriptor(uint8_t *dst, uint8_t *itf) {
|
||||
uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB CDC");
|
||||
|
|
@ -37,43 +38,23 @@ static uint16_t load_cdc_descriptor(uint8_t *dst, uint8_t *itf) {
|
|||
return TUD_CDC_DESC_LEN;
|
||||
}
|
||||
|
||||
static uint16_t load_cdc_descriptor2(uint8_t *dst, uint8_t *itf) {
|
||||
uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB CDC2");
|
||||
uint8_t ep_ntfy = tinyusb_get_free_in_endpoint();
|
||||
TU_VERIFY(ep_ntfy != 0);
|
||||
uint8_t ep_in = tinyusb_get_free_in_endpoint();
|
||||
TU_VERIFY(ep_in != 0);
|
||||
uint8_t ep_out = tinyusb_get_free_out_endpoint();
|
||||
TU_VERIFY(ep_out != 0);
|
||||
uint8_t descriptor[TUD_CDC_DESC_LEN] = {
|
||||
// Interface number, string index, EP notification address and size, EP data address (out, in) and size.
|
||||
TUD_CDC_DESCRIPTOR(*itf, str_index, (uint8_t)(0x80 | ep_ntfy), CFG_TUD_ENDOINT_SIZE, ep_out, (uint8_t)(0x80 | ep_in), CFG_TUD_ENDOINT_SIZE)
|
||||
};
|
||||
*itf += 2;
|
||||
memcpy(dst, descriptor, TUD_CDC_DESC_LEN);
|
||||
return TUD_CDC_DESC_LEN;
|
||||
}
|
||||
|
||||
// Invoked when line state DTR & RTS are changed via SET_CONTROL_LINE_STATE
|
||||
void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {
|
||||
//log_v("ITF: %u, DTR: %u, RTS: %u", itf, dtr, rts);
|
||||
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
|
||||
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
|
||||
devices[itf]->_onLineState(dtr, rts);
|
||||
}
|
||||
}
|
||||
|
||||
// Invoked when line coding is change via SET_LINE_CODING
|
||||
void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const *p_line_coding) {
|
||||
//log_v("ITF: %u, BITRATE: %lu, STOP_BITS: %u, PARITY: %u, DATA_BITS: %u", itf, p_line_coding->bit_rate, p_line_coding->stop_bits, p_line_coding->parity, p_line_coding->data_bits);
|
||||
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
|
||||
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
|
||||
devices[itf]->_onLineCoding(p_line_coding->bit_rate, p_line_coding->stop_bits, p_line_coding->parity, p_line_coding->data_bits);
|
||||
}
|
||||
}
|
||||
|
||||
// Invoked when received new data
|
||||
void tud_cdc_rx_cb(uint8_t itf) {
|
||||
//log_v("ITF: %u", itf);
|
||||
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
|
||||
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
|
||||
devices[itf]->_onRX();
|
||||
}
|
||||
}
|
||||
|
|
@ -85,13 +66,13 @@ void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms) {
|
|||
|
||||
// Invoked when space becomes available in TX buffer
|
||||
void tud_cdc_tx_complete_cb(uint8_t itf) {
|
||||
if (itf < CFG_TUD_CDC && devices[itf] != NULL) {
|
||||
if (itf < MAX_USB_CDC_DEVICES && devices[itf] != NULL) {
|
||||
devices[itf]->_onTX();
|
||||
}
|
||||
}
|
||||
|
||||
static void ARDUINO_ISR_ATTR cdc0_write_char(char c) {
|
||||
if (CFG_TUD_CDC && devices[0] != NULL) {
|
||||
if (devices[0] != NULL) {
|
||||
tud_cdc_n_write_char(0, c);
|
||||
}
|
||||
}
|
||||
|
|
@ -103,15 +84,9 @@ static void usb_unplugged_cb(void *arg, esp_event_base_t event_base, int32_t eve
|
|||
USBCDC::USBCDC(uint8_t itfn)
|
||||
: itf(itfn), bit_rate(0), stop_bits(0), parity(0), data_bits(0), dtr(false), rts(false), connected(false), reboot_enable(true), rx_queue(NULL), tx_lock(NULL),
|
||||
tx_timeout_ms(250) {
|
||||
if (itf < CFG_TUD_CDC) {
|
||||
if (itf == 0) {
|
||||
tinyusb_enable_interface(USB_INTERFACE_CDC, TUD_CDC_DESC_LEN, load_cdc_descriptor);
|
||||
} else {
|
||||
tinyusb_enable_interface(USB_INTERFACE_CDC2, TUD_CDC_DESC_LEN, load_cdc_descriptor2);
|
||||
}
|
||||
tinyusb_enable_interface(USB_INTERFACE_CDC, TUD_CDC_DESC_LEN, load_cdc_descriptor);
|
||||
if (itf < MAX_USB_CDC_DEVICES) {
|
||||
arduino_usb_event_handler_register_with(ARDUINO_USB_EVENTS, ARDUINO_USB_STOPPED_EVENT, usb_unplugged_cb, this);
|
||||
} else {
|
||||
log_e("Maximum of %u CDC devices are supported", CFG_TUD_CDC);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -167,9 +142,6 @@ size_t USBCDC::setRxBufferSize(size_t rx_queue_len) {
|
|||
}
|
||||
|
||||
void USBCDC::begin(unsigned long baud) {
|
||||
if (itf >= CFG_TUD_CDC) {
|
||||
return;
|
||||
}
|
||||
if (tx_lock == NULL) {
|
||||
tx_lock = xSemaphoreCreateMutex();
|
||||
}
|
||||
|
|
@ -181,9 +153,6 @@ void USBCDC::begin(unsigned long baud) {
|
|||
}
|
||||
|
||||
void USBCDC::end() {
|
||||
if (itf >= CFG_TUD_CDC) {
|
||||
return;
|
||||
}
|
||||
connected = false;
|
||||
devices[itf] = NULL;
|
||||
setRxBufferSize(0);
|
||||
|
|
@ -329,14 +298,14 @@ bool USBCDC::rebootEnabled(void) {
|
|||
}
|
||||
|
||||
int USBCDC::available(void) {
|
||||
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
|
||||
return -1;
|
||||
}
|
||||
return uxQueueMessagesWaiting(rx_queue);
|
||||
}
|
||||
|
||||
int USBCDC::peek(void) {
|
||||
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
|
||||
return -1;
|
||||
}
|
||||
uint8_t c;
|
||||
|
|
@ -347,7 +316,7 @@ int USBCDC::peek(void) {
|
|||
}
|
||||
|
||||
int USBCDC::read(void) {
|
||||
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
|
||||
return -1;
|
||||
}
|
||||
uint8_t c = 0;
|
||||
|
|
@ -358,7 +327,7 @@ int USBCDC::read(void) {
|
|||
}
|
||||
|
||||
size_t USBCDC::read(uint8_t *buffer, size_t size) {
|
||||
if (itf >= CFG_TUD_CDC || rx_queue == NULL) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || rx_queue == NULL) {
|
||||
return -1;
|
||||
}
|
||||
uint8_t c = 0;
|
||||
|
|
@ -370,7 +339,7 @@ size_t USBCDC::read(uint8_t *buffer, size_t size) {
|
|||
}
|
||||
|
||||
void USBCDC::flush(void) {
|
||||
if (itf >= CFG_TUD_CDC || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
|
||||
return;
|
||||
}
|
||||
if (xSemaphoreTake(tx_lock, tx_timeout_ms / portTICK_PERIOD_MS) != pdPASS) {
|
||||
|
|
@ -381,7 +350,7 @@ void USBCDC::flush(void) {
|
|||
}
|
||||
|
||||
int USBCDC::availableForWrite(void) {
|
||||
if (itf >= CFG_TUD_CDC || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || !tud_cdc_n_connected(itf)) {
|
||||
return 0;
|
||||
}
|
||||
if (xSemaphoreTake(tx_lock, tx_timeout_ms / portTICK_PERIOD_MS) != pdPASS) {
|
||||
|
|
@ -393,7 +362,7 @@ int USBCDC::availableForWrite(void) {
|
|||
}
|
||||
|
||||
size_t USBCDC::write(const uint8_t *buffer, size_t size) {
|
||||
if (itf >= CFG_TUD_CDC || tx_lock == NULL || buffer == NULL || size == 0 || !tud_cdc_n_connected(itf)) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES || tx_lock == NULL || buffer == NULL || size == 0 || !tud_cdc_n_connected(itf)) {
|
||||
return 0;
|
||||
}
|
||||
if (xPortInIsrContext()) {
|
||||
|
|
@ -446,20 +415,16 @@ uint32_t USBCDC::baudRate() {
|
|||
}
|
||||
|
||||
void USBCDC::setDebugOutput(bool en) {
|
||||
if (itf) {
|
||||
return;
|
||||
}
|
||||
if (en) {
|
||||
uartSetDebug(NULL);
|
||||
ets_install_putc2((void (*)(char)) & cdc0_write_char);
|
||||
} else {
|
||||
ets_install_putc2(NULL);
|
||||
}
|
||||
ets_install_putc1(NULL); // closes UART log output
|
||||
}
|
||||
|
||||
USBCDC::operator bool() const {
|
||||
if (itf >= CFG_TUD_CDC) {
|
||||
if (itf >= MAX_USB_CDC_DEVICES) {
|
||||
return false;
|
||||
}
|
||||
return connected;
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ bool String::changeBuffer(unsigned int maxStrLen) {
|
|||
if (maxStrLen < sizeof(sso.buff) - 1) {
|
||||
if (isSSO() || !buffer()) {
|
||||
// Already using SSO, nothing to do
|
||||
size_t oldLen = len();
|
||||
uint16_t oldLen = len();
|
||||
setSSO(true);
|
||||
setLen(oldLen);
|
||||
} else { // if bufptr && !isSSO()
|
||||
|
|
@ -188,7 +188,7 @@ bool String::changeBuffer(unsigned int maxStrLen) {
|
|||
char temp[sizeof(sso.buff)];
|
||||
memcpy(temp, buffer(), maxStrLen);
|
||||
free(wbuffer());
|
||||
size_t oldLen = len();
|
||||
uint16_t oldLen = len();
|
||||
setSSO(true);
|
||||
memcpy(wbuffer(), temp, maxStrLen);
|
||||
setLen(oldLen);
|
||||
|
|
@ -201,7 +201,7 @@ bool String::changeBuffer(unsigned int maxStrLen) {
|
|||
if (newSize > CAPACITY_MAX) {
|
||||
return false;
|
||||
}
|
||||
size_t oldLen = len();
|
||||
uint16_t oldLen = len();
|
||||
char *newbuffer = (char *)realloc(isSSO() ? nullptr : wbuffer(), newSize);
|
||||
if (newbuffer) {
|
||||
size_t oldSize = capacity() + 1; // include NULL.
|
||||
|
|
@ -226,11 +226,11 @@ bool String::changeBuffer(unsigned int maxStrLen) {
|
|||
/*********************************************/
|
||||
|
||||
String &String::copy(const char *cstr, unsigned int length) {
|
||||
if (cstr == nullptr || !reserve(length)) {
|
||||
if (!reserve(length)) {
|
||||
invalidate();
|
||||
return *this;
|
||||
}
|
||||
memmove(wbuffer(), cstr, length);
|
||||
memmove(wbuffer(), cstr, length + 1);
|
||||
setLen(length);
|
||||
return *this;
|
||||
}
|
||||
|
|
@ -239,18 +239,15 @@ String &String::copy(const char *cstr, unsigned int length) {
|
|||
void String::move(String &rhs) {
|
||||
if (buffer()) {
|
||||
if (capacity() >= rhs.len()) {
|
||||
// Use case: When 'reserve()' was called and the first
|
||||
// assignment/append is the return value of a function.
|
||||
if (rhs.len() && rhs.buffer()) {
|
||||
memmove(wbuffer(), rhs.buffer(), rhs.length());
|
||||
}
|
||||
memmove(wbuffer(), rhs.buffer(), rhs.length() + 1);
|
||||
setLen(rhs.len());
|
||||
rhs.invalidate();
|
||||
return;
|
||||
}
|
||||
if (!isSSO()) {
|
||||
free(wbuffer());
|
||||
setBuffer(nullptr);
|
||||
} else {
|
||||
if (!isSSO()) {
|
||||
free(wbuffer());
|
||||
setBuffer(nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rhs.isSSO()) {
|
||||
|
|
@ -262,7 +259,10 @@ void String::move(String &rhs) {
|
|||
}
|
||||
setCapacity(rhs.capacity());
|
||||
setLen(rhs.len());
|
||||
rhs.init();
|
||||
rhs.setSSO(false);
|
||||
rhs.setCapacity(0);
|
||||
rhs.setBuffer(nullptr);
|
||||
rhs.setLen(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -270,7 +270,12 @@ String &String::operator=(const String &rhs) {
|
|||
if (this == &rhs) {
|
||||
return *this;
|
||||
}
|
||||
return copy(rhs.buffer(), rhs.len());
|
||||
if (rhs.buffer()) {
|
||||
copy(rhs.buffer(), rhs.len());
|
||||
} else {
|
||||
invalidate();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
|
@ -290,8 +295,12 @@ String &String::operator=(StringSumHelper &&rval) {
|
|||
#endif
|
||||
|
||||
String &String::operator=(const char *cstr) {
|
||||
const uint32_t length = cstr ? strlen(cstr) : 0u;
|
||||
return copy(cstr, length);
|
||||
if (cstr) {
|
||||
copy(cstr, strlen(cstr));
|
||||
} else {
|
||||
invalidate();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
|
|
@ -302,21 +311,23 @@ bool String::concat(const String &s) {
|
|||
// Special case if we're concatting ourself (s += s;) since we may end up
|
||||
// realloc'ing the buffer and moving s.buffer in the method called
|
||||
if (&s == this) {
|
||||
if (s.len() == 0) {
|
||||
return true;
|
||||
}
|
||||
unsigned int newlen = 2 * len();
|
||||
if (!s.buffer()) {
|
||||
return false;
|
||||
}
|
||||
unsigned int newlen = 2 * len();
|
||||
if (s.len() == 0) {
|
||||
return true;
|
||||
}
|
||||
if (!reserve(newlen)) {
|
||||
return false;
|
||||
}
|
||||
memmove(wbuffer() + len(), buffer(), len());
|
||||
setLen(newlen);
|
||||
wbuffer()[len()] = 0;
|
||||
return true;
|
||||
} else {
|
||||
return concat(s.buffer(), s.len());
|
||||
}
|
||||
return concat(s.buffer(), s.len());
|
||||
}
|
||||
|
||||
bool String::concat(const char *cstr, unsigned int length) {
|
||||
|
|
@ -332,10 +343,10 @@ bool String::concat(const char *cstr, unsigned int length) {
|
|||
}
|
||||
if (cstr >= wbuffer() && cstr < wbuffer() + len()) {
|
||||
// compatible with SSO in ram #6155 (case "x += x.c_str()")
|
||||
memmove(wbuffer() + len(), cstr, length);
|
||||
memmove(wbuffer() + len(), cstr, length + 1);
|
||||
} else {
|
||||
// compatible with source in flash #6367
|
||||
memcpy_P(wbuffer() + len(), cstr, length);
|
||||
memcpy_P(wbuffer() + len(), cstr, length + 1);
|
||||
}
|
||||
setLen(newlen);
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -67,10 +67,6 @@ static void printPkgVersion(void) {
|
|||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
uint32_t pkg_ver = REG_GET_FIELD(EFUSE_RD_MAC_SYS_2_REG, EFUSE_PKG_VERSION);
|
||||
chip_report_printf("%lu", pkg_ver);
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
// ToDo: Update this line when EFUSE_PKG_VERSION is available again for ESP32-C5
|
||||
uint32_t pkg_ver = 0; //REG_GET_FIELD(EFUSE_RD_MAC_SYS2_REG, EFUSE_PKG_VERSION);
|
||||
chip_report_printf("%lu", pkg_ver);
|
||||
#else
|
||||
chip_report_printf("Unknown");
|
||||
#endif
|
||||
|
|
@ -92,12 +88,7 @@ static void printChipInfo(void) {
|
|||
case CHIP_ESP32C6: chip_report_printf("ESP32-C6\n"); break;
|
||||
case CHIP_ESP32H2: chip_report_printf("ESP32-H2\n"); break;
|
||||
case CHIP_ESP32P4: chip_report_printf("ESP32-P4\n"); break;
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
|
||||
case CHIP_ESP32C5: chip_report_printf("ESP32-C5\n"); break;
|
||||
case CHIP_ESP32C61: chip_report_printf("ESP32-C61\n"); break;
|
||||
case CHIP_ESP32H21: chip_report_printf("ESP32-H21\n"); break;
|
||||
#endif
|
||||
default: chip_report_printf("Unknown %d\n", info.model); break;
|
||||
default: chip_report_printf("Unknown %d\n", info.model); break;
|
||||
}
|
||||
printPkgVersion();
|
||||
chip_report_printf(" Revision : %.2f\n", (float)(info.revision) / 100.0);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
#include "esp32-hal-bt.h"
|
||||
|
||||
#if SOC_BT_SUPPORTED
|
||||
#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && __has_include("esp_bt.h")
|
||||
#ifdef CONFIG_BT_ENABLED
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
bool btInUse() {
|
||||
|
|
@ -116,7 +116,7 @@ bool btStop() {
|
|||
return false;
|
||||
}
|
||||
|
||||
#else // !__has_include("esp_bt.h") || !(defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED))
|
||||
#else // CONFIG_BT_ENABLED
|
||||
bool btStarted() {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -129,6 +129,6 @@ bool btStop() {
|
|||
return false;
|
||||
}
|
||||
|
||||
#endif /* !__has_include("esp_bt.h") || !(defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) */
|
||||
#endif /* CONFIG_BT_ENABLED */
|
||||
|
||||
#endif /* SOC_BT_SUPPORTED */
|
||||
|
|
|
|||
|
|
@ -19,16 +19,13 @@
|
|||
#include "esp_attr.h"
|
||||
#include "esp_log.h"
|
||||
#include "soc/rtc.h"
|
||||
#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) \
|
||||
&& !defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||
#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||
#include "soc/rtc_cntl_reg.h"
|
||||
#include "soc/syscon_reg.h"
|
||||
#endif
|
||||
#include "soc/efuse_reg.h"
|
||||
#include "esp32-hal.h"
|
||||
#include "esp32-hal-cpu.h"
|
||||
#include "hal/timer_ll.h"
|
||||
#include "esp_private/systimer.h"
|
||||
|
||||
#include "esp_system.h"
|
||||
#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+
|
||||
|
|
@ -51,8 +48,6 @@
|
|||
#include "esp32h2/rom/rtc.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#include "esp32p4/rom/rtc.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "esp32c5/rom/rtc.h"
|
||||
#else
|
||||
#error Target CONFIG_IDF_TARGET is not supported
|
||||
#endif
|
||||
|
|
@ -178,15 +173,13 @@ static uint32_t calculateApb(rtc_cpu_freq_config_t *conf) {
|
|||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_IDF_TARGET_ESP32) && !defined(LACT_MODULE) && !defined(LACT_TICKS_PER_US)
|
||||
void esp_timer_impl_update_apb_freq(uint32_t apb_ticks_per_us); //private in IDF
|
||||
#endif
|
||||
|
||||
bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) {
|
||||
rtc_cpu_freq_config_t conf, cconf;
|
||||
uint32_t capb, apb;
|
||||
//Get XTAL Frequency and calculate min CPU MHz
|
||||
#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5))
|
||||
#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4))
|
||||
rtc_xtal_freq_t xtal = rtc_clk_xtal_freq_get();
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
|
|
@ -202,7 +195,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) {
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5))
|
||||
#if (!defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4))
|
||||
if (cpu_freq_mhz > xtal && cpu_freq_mhz != 240 && cpu_freq_mhz != 160 && cpu_freq_mhz != 120 && cpu_freq_mhz != 80) {
|
||||
if (xtal >= RTC_XTAL_FREQ_40M) {
|
||||
log_e("Bad frequency: %u MHz! Options are: 240, 160, 120, 80, %u, %u and %u MHz", cpu_freq_mhz, xtal, xtal / 2, xtal / 4);
|
||||
|
|
@ -253,13 +246,7 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) {
|
|||
//Update APB Freq REG
|
||||
rtc_clk_apb_freq_update(apb);
|
||||
//Update esp_timer divisor
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
#if defined(LACT_MODULE) && defined(LACT_TICKS_PER_US)
|
||||
timer_ll_set_lact_clock_prescale(TIMER_LL_GET_HW(LACT_MODULE), apb / MHZ / LACT_TICKS_PER_US);
|
||||
#else
|
||||
esp_timer_impl_update_apb_freq(apb / MHZ);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
//Update FreeRTOS Tick Divisor
|
||||
|
|
@ -278,12 +265,6 @@ bool setCpuFrequencyMhz(uint32_t cpu_freq_mhz) {
|
|||
(conf.source == SOC_CPU_CLK_SRC_PLL) ? "PLL" : ((conf.source == SOC_CPU_CLK_SRC_APLL) ? "APLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" : "8M")),
|
||||
conf.source_freq_mhz, conf.div, conf.freq_mhz, apb
|
||||
);
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||
log_d(
|
||||
"%s: %u / %u = %u Mhz, APB: %u Hz",
|
||||
(conf.source == SOC_CPU_CLK_SRC_PLL_F240M || conf.source == SOC_CPU_CLK_SRC_PLL_F160M) ? "PLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" : "8M"),
|
||||
conf.source_freq_mhz, conf.div, conf.freq_mhz, apb
|
||||
);
|
||||
#else
|
||||
log_d(
|
||||
"%s: %u / %u = %u Mhz, APB: %u Hz", (conf.source == SOC_CPU_CLK_SRC_PLL) ? "PLL" : ((conf.source == SOC_CPU_CLK_SRC_XTAL) ? "XTAL" : "17.5M"),
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) {
|
|||
if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) {
|
||||
gpio_set_level((gpio_num_t)pin, val);
|
||||
} else {
|
||||
log_e("IO %i is not set as GPIO. Execute digitalMode(%i, OUTPUT) first.", pin, pin);
|
||||
log_e("IO %i is not set as GPIO.", pin);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -182,12 +182,14 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) {
|
|||
if (pin == RGB_BUILTIN) {
|
||||
return RGB_BUILTIN_storage;
|
||||
}
|
||||
#endif // RGB_BUILTIN
|
||||
// This work when the pin is set as GPIO and in INPUT mode. For all other pin functions, it may return inconsistent response
|
||||
if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) {
|
||||
log_w("IO %i is not set as GPIO. digitalRead() may return an inconsistent value.", pin);
|
||||
#endif
|
||||
|
||||
if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) {
|
||||
return gpio_get_level((gpio_num_t)pin);
|
||||
} else {
|
||||
log_e("IO %i is not set as GPIO.", pin);
|
||||
return 0;
|
||||
}
|
||||
return gpio_get_level((gpio_num_t)pin);
|
||||
}
|
||||
|
||||
static void ARDUINO_ISR_ATTR __onPinInterrupt(void *arg) {
|
||||
|
|
|
|||
|
|
@ -24,9 +24,9 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "pins_arduino.h"
|
||||
#include "esp32-hal.h"
|
||||
#include "soc/soc_caps.h"
|
||||
#include "pins_arduino.h"
|
||||
#include "driver/gpio.h"
|
||||
|
||||
#if (CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3)
|
||||
|
|
|
|||
|
|
@ -1,452 +0,0 @@
|
|||
// Copyright 2015-2025 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "esp32-hal-i2c.h"
|
||||
|
||||
#if SOC_I2C_SUPPORTED
|
||||
#include "esp_idf_version.h"
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
|
||||
#include "esp32-hal.h"
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/semphr.h"
|
||||
#endif
|
||||
#include "esp_attr.h"
|
||||
#include "esp_system.h"
|
||||
#include "soc/soc_caps.h"
|
||||
#include "driver/i2c_master.h"
|
||||
#include "esp32-hal-periman.h"
|
||||
|
||||
typedef volatile struct {
|
||||
bool initialized;
|
||||
uint32_t frequency;
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
SemaphoreHandle_t lock;
|
||||
#endif
|
||||
int8_t scl;
|
||||
int8_t sda;
|
||||
i2c_master_bus_handle_t bus_handle;
|
||||
i2c_master_dev_handle_t dev_handles[128];
|
||||
} i2c_bus_t;
|
||||
|
||||
static i2c_bus_t bus[SOC_I2C_NUM];
|
||||
|
||||
static bool i2cDetachBus(void *bus_i2c_num) {
|
||||
uint8_t i2c_num = (int)bus_i2c_num - 1;
|
||||
if (!bus[i2c_num].initialized) {
|
||||
return true;
|
||||
}
|
||||
esp_err_t err = i2cDeinit(i2c_num);
|
||||
if (err != ESP_OK) {
|
||||
log_e("i2cDeinit failed with error: %d", err);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void *i2cBusHandle(uint8_t i2c_num) {
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return NULL;
|
||||
}
|
||||
return bus[i2c_num].bus_handle;
|
||||
}
|
||||
|
||||
bool i2cIsInit(uint8_t i2c_num) {
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return false;
|
||||
}
|
||||
return bus[i2c_num].initialized;
|
||||
}
|
||||
|
||||
esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency) {
|
||||
esp_err_t ret = ESP_OK;
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
if (bus[i2c_num].lock == NULL) {
|
||||
bus[i2c_num].lock = xSemaphoreCreateMutex();
|
||||
if (bus[i2c_num].lock == NULL) {
|
||||
log_e("xSemaphoreCreateMutex failed");
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
}
|
||||
//acquire lock
|
||||
if (xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) {
|
||||
log_e("could not acquire lock");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
#endif
|
||||
if (bus[i2c_num].initialized) {
|
||||
log_e("bus is already initialized");
|
||||
ret = ESP_FAIL;
|
||||
goto init_fail;
|
||||
}
|
||||
|
||||
if (!frequency) {
|
||||
frequency = 100000UL;
|
||||
} else if (frequency > 1000000UL) {
|
||||
frequency = 1000000UL;
|
||||
}
|
||||
|
||||
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER_SDA, i2cDetachBus);
|
||||
perimanSetBusDeinit(ESP32_BUS_TYPE_I2C_MASTER_SCL, i2cDetachBus);
|
||||
|
||||
if (!perimanClearPinBus(sda) || !perimanClearPinBus(scl)) {
|
||||
ret = ESP_FAIL;
|
||||
goto init_fail;
|
||||
}
|
||||
|
||||
log_i("Initializing I2C Master: num=%u sda=%d scl=%d freq=%lu", i2c_num, sda, scl, frequency);
|
||||
|
||||
i2c_master_bus_handle_t bus_handle = NULL;
|
||||
i2c_master_bus_config_t bus_config;
|
||||
memset(&bus_config, 0, sizeof(i2c_master_bus_config_t));
|
||||
bus_config.i2c_port = (i2c_port_num_t)i2c_num;
|
||||
bus_config.sda_io_num = (gpio_num_t)sda;
|
||||
bus_config.scl_io_num = (gpio_num_t)scl;
|
||||
#if SOC_LP_I2C_SUPPORTED
|
||||
if (i2c_num >= SOC_HP_I2C_NUM) {
|
||||
bus_config.lp_source_clk = LP_I2C_SCLK_DEFAULT;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
bus_config.clk_source = I2C_CLK_SRC_DEFAULT;
|
||||
}
|
||||
bus_config.glitch_ignore_cnt = 7;
|
||||
bus_config.intr_priority = 0; // auto
|
||||
bus_config.trans_queue_depth = 0; // only valid in asynchronous transaction, which Arduino does not use
|
||||
bus_config.flags.enable_internal_pullup = 1;
|
||||
#if SOC_I2C_SUPPORT_SLEEP_RETENTION
|
||||
bus_config.flags.allow_pd = 1; // backup/restore the I2C registers before/after entering/exist sleep mode
|
||||
#endif
|
||||
|
||||
ret = i2c_new_master_bus(&bus_config, &bus_handle);
|
||||
if (ret != ESP_OK) {
|
||||
log_e("i2c_new_master_bus failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
} else {
|
||||
bus[i2c_num].initialized = true;
|
||||
bus[i2c_num].frequency = frequency;
|
||||
bus[i2c_num].scl = scl;
|
||||
bus[i2c_num].sda = sda;
|
||||
bus[i2c_num].bus_handle = bus_handle;
|
||||
for (uint8_t i = 0; i < 128; i++) {
|
||||
bus[i2c_num].dev_handles[i] = NULL;
|
||||
}
|
||||
if (!perimanSetPinBus(sda, ESP32_BUS_TYPE_I2C_MASTER_SDA, (void *)(i2c_num + 1), i2c_num, -1)
|
||||
|| !perimanSetPinBus(scl, ESP32_BUS_TYPE_I2C_MASTER_SCL, (void *)(i2c_num + 1), i2c_num, -1)) {
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock so that i2cDetachBus can execute i2cDeinit
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
i2cDetachBus((void *)(i2c_num + 1));
|
||||
return ESP_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
init_fail:
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t i2cDeinit(uint8_t i2c_num) {
|
||||
esp_err_t err = ESP_FAIL;
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//acquire lock
|
||||
if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) {
|
||||
log_e("could not acquire lock");
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
if (!bus[i2c_num].initialized) {
|
||||
log_e("bus is not initialized");
|
||||
} else {
|
||||
// remove devices from the bus
|
||||
for (uint8_t i = 0; i < 128; i++) {
|
||||
if (bus[i2c_num].dev_handles[i] != NULL) {
|
||||
err = i2c_master_bus_rm_device(bus[i2c_num].dev_handles[i]);
|
||||
bus[i2c_num].dev_handles[i] = NULL;
|
||||
if (err != ESP_OK) {
|
||||
log_e("i2c_master_bus_rm_device failed: [%d] %s", err, esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
}
|
||||
err = i2c_del_master_bus(bus[i2c_num].bus_handle);
|
||||
if (err != ESP_OK) {
|
||||
log_e("i2c_del_master_bus failed: [%d] %s", err, esp_err_to_name(err));
|
||||
} else {
|
||||
bus[i2c_num].initialized = false;
|
||||
perimanClearPinBus(bus[i2c_num].scl);
|
||||
perimanClearPinBus(bus[i2c_num].sda);
|
||||
bus[i2c_num].scl = -1;
|
||||
bus[i2c_num].sda = -1;
|
||||
bus[i2c_num].bus_handle = NULL;
|
||||
}
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
|
||||
static esp_err_t i2cAddDeviceIfNeeded(uint8_t i2c_num, uint16_t address) {
|
||||
esp_err_t ret = ESP_OK;
|
||||
if (bus[i2c_num].dev_handles[address] == NULL) {
|
||||
i2c_master_dev_handle_t dev_handle = NULL;
|
||||
i2c_device_config_t dev_config;
|
||||
memset(&dev_config, 0, sizeof(i2c_device_config_t));
|
||||
dev_config.dev_addr_length = I2C_ADDR_BIT_LEN_7; // Arduino supports only 7bit addresses
|
||||
dev_config.device_address = address;
|
||||
dev_config.scl_speed_hz = bus[i2c_num].frequency;
|
||||
dev_config.scl_wait_us = 0;
|
||||
dev_config.flags.disable_ack_check = 0;
|
||||
|
||||
ret = i2c_master_bus_add_device(bus[i2c_num].bus_handle, &dev_config, &dev_handle);
|
||||
if (ret != ESP_OK) {
|
||||
log_e("i2c_master_bus_add_device failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
} else {
|
||||
bus[i2c_num].dev_handles[address] = dev_handle;
|
||||
log_v("added device: bus=%u addr=0x%x handle=0x%08x", i2c_num, address, dev_handle);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t i2cWrite(uint8_t i2c_num, uint16_t address, const uint8_t *buff, size_t size, uint32_t timeOutMillis) {
|
||||
esp_err_t ret = ESP_FAIL;
|
||||
// i2c_cmd_handle_t cmd = NULL;
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
if (address >= 128) {
|
||||
log_e("Only 7bit I2C addresses are supported");
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//acquire lock
|
||||
if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) {
|
||||
log_e("could not acquire lock");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
if (!bus[i2c_num].initialized) {
|
||||
log_e("bus is not initialized");
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
// Probe device
|
||||
ret = i2c_master_probe(bus[i2c_num].bus_handle, address, timeOutMillis);
|
||||
if (ret != ESP_OK) {
|
||||
log_v("i2c_master_probe failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
}
|
||||
} else {
|
||||
// writing data to device
|
||||
ret = i2cAddDeviceIfNeeded(i2c_num, address);
|
||||
if (ret != ESP_OK) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
log_v("i2c_master_transmit: bus=%u addr=0x%x handle=0x%08x size=%u", i2c_num, address, bus[i2c_num].dev_handles[address], size);
|
||||
ret = i2c_master_transmit(bus[i2c_num].dev_handles[address], buff, size, timeOutMillis);
|
||||
if (ret != ESP_OK) {
|
||||
log_e("i2c_master_transmit failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
goto end;
|
||||
}
|
||||
|
||||
// wait for transactions to finish (is it needed with sync transactions?)
|
||||
// ret = i2c_master_bus_wait_all_done(bus[i2c_num].bus_handle, timeOutMillis);
|
||||
// if (ret != ESP_OK) {
|
||||
// log_e("i2c_master_bus_wait_all_done failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
// goto end;
|
||||
// }
|
||||
}
|
||||
|
||||
end:
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t i2cRead(uint8_t i2c_num, uint16_t address, uint8_t *buff, size_t size, uint32_t timeOutMillis, size_t *readCount) {
|
||||
esp_err_t ret = ESP_FAIL;
|
||||
*readCount = 0;
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//acquire lock
|
||||
if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) {
|
||||
log_e("could not acquire lock");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
if (!bus[i2c_num].initialized) {
|
||||
log_e("bus is not initialized");
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = i2cAddDeviceIfNeeded(i2c_num, address);
|
||||
if (ret != ESP_OK) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
log_v("i2c_master_receive: bus=%u addr=0x%x handle=0x%08x size=%u", i2c_num, address, bus[i2c_num].dev_handles[address], size);
|
||||
ret = i2c_master_receive(bus[i2c_num].dev_handles[address], buff, size, timeOutMillis);
|
||||
if (ret != ESP_OK) {
|
||||
log_e("i2c_master_receive failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
goto end;
|
||||
}
|
||||
|
||||
// wait for transactions to finish (is it needed with sync transactions?)
|
||||
// ret = i2c_master_bus_wait_all_done(bus[i2c_num].bus_handle, timeOutMillis);
|
||||
// if (ret != ESP_OK) {
|
||||
// log_e("i2c_master_bus_wait_all_done failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
// goto end;
|
||||
// }
|
||||
*readCount = size;
|
||||
|
||||
end:
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t i2cWriteReadNonStop(
|
||||
uint8_t i2c_num, uint16_t address, const uint8_t *wbuff, size_t wsize, uint8_t *rbuff, size_t rsize, uint32_t timeOutMillis, size_t *readCount
|
||||
) {
|
||||
esp_err_t ret = ESP_FAIL;
|
||||
*readCount = 0;
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//acquire lock
|
||||
if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) {
|
||||
log_e("could not acquire lock");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
if (!bus[i2c_num].initialized) {
|
||||
log_e("bus is not initialized");
|
||||
goto end;
|
||||
}
|
||||
|
||||
ret = i2cAddDeviceIfNeeded(i2c_num, address);
|
||||
if (ret != ESP_OK) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
log_v("i2c_master_transmit_receive: bus=%u addr=0x%x handle=0x%08x write=%u read=%u", i2c_num, address, bus[i2c_num].dev_handles[address], wsize, rsize);
|
||||
ret = i2c_master_transmit_receive(bus[i2c_num].dev_handles[address], wbuff, wsize, rbuff, rsize, timeOutMillis);
|
||||
if (ret != ESP_OK) {
|
||||
log_e("i2c_master_transmit_receive failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
goto end;
|
||||
}
|
||||
|
||||
// wait for transactions to finish (is it needed with sync transactions?)
|
||||
// ret = i2c_master_bus_wait_all_done(bus[i2c_num].bus_handle, timeOutMillis);
|
||||
// if (ret != ESP_OK) {
|
||||
// log_e("i2c_master_bus_wait_all_done failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
// goto end;
|
||||
// }
|
||||
*readCount = rsize;
|
||||
|
||||
end:
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t i2cSetClock(uint8_t i2c_num, uint32_t frequency) {
|
||||
esp_err_t ret = ESP_FAIL;
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//acquire lock
|
||||
if (bus[i2c_num].lock == NULL || xSemaphoreTake(bus[i2c_num].lock, portMAX_DELAY) != pdTRUE) {
|
||||
log_e("could not acquire lock");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
if (!bus[i2c_num].initialized) {
|
||||
log_e("bus is not initialized");
|
||||
goto end;
|
||||
}
|
||||
if (bus[i2c_num].frequency == frequency) {
|
||||
ret = ESP_OK;
|
||||
goto end;
|
||||
}
|
||||
if (!frequency) {
|
||||
frequency = 100000UL;
|
||||
} else if (frequency > 1000000UL) {
|
||||
frequency = 1000000UL;
|
||||
}
|
||||
|
||||
bus[i2c_num].frequency = frequency;
|
||||
|
||||
// loop through devices, remove them and then re-add them with the new frequency
|
||||
for (uint8_t i = 0; i < 128; i++) {
|
||||
if (bus[i2c_num].dev_handles[i] != NULL) {
|
||||
ret = i2c_master_bus_rm_device(bus[i2c_num].dev_handles[i]);
|
||||
if (ret != ESP_OK) {
|
||||
log_e("i2c_master_bus_rm_device failed: [%d] %s", ret, esp_err_to_name(ret));
|
||||
goto end;
|
||||
} else {
|
||||
bus[i2c_num].dev_handles[i] = NULL;
|
||||
ret = i2cAddDeviceIfNeeded(i2c_num, i);
|
||||
if (ret != ESP_OK) {
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
//release lock
|
||||
xSemaphoreGive(bus[i2c_num].lock);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
esp_err_t i2cGetClock(uint8_t i2c_num, uint32_t *frequency) {
|
||||
if (i2c_num >= SOC_I2C_NUM) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
if (!bus[i2c_num].initialized) {
|
||||
log_e("bus is not initialized");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
*frequency = bus[i2c_num].frequency;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
#endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0) */
|
||||
#endif /* SOC_I2C_SUPPORTED */
|
||||
|
|
@ -43,10 +43,7 @@
|
|||
#include "soc/i2c_struct.h"
|
||||
#include "soc/periph_defs.h"
|
||||
#include "hal/i2c_ll.h"
|
||||
#include "hal/i2c_types.h"
|
||||
#ifndef CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "hal/clk_gate_ll.h"
|
||||
#endif
|
||||
#include "esp32-hal-log.h"
|
||||
#include "esp32-hal-i2c-slave.h"
|
||||
#include "esp32-hal-periman.h"
|
||||
|
|
@ -328,7 +325,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t
|
|||
frequency = 100000L;
|
||||
}
|
||||
frequency = (frequency * 5) / 4;
|
||||
#if !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||
#if !defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||
if (i2c->num == 0) {
|
||||
periph_ll_enable_clk_clear_rst(PERIPH_I2C0_MODULE);
|
||||
#if SOC_HP_I2C_NUM > 1
|
||||
|
|
@ -338,19 +335,8 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t
|
|||
}
|
||||
#endif // !defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||
|
||||
#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)) || (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0)) \
|
||||
|| (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 3) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0))
|
||||
i2c_ll_set_mode(i2c->dev, I2C_BUS_MODE_SLAVE);
|
||||
i2c_ll_enable_pins_open_drain(i2c->dev, true);
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
||||
i2c_ll_enable_fifo_mode(i2c->dev, true);
|
||||
#else
|
||||
i2c_ll_slave_set_fifo_mode(i2c->dev, true);
|
||||
#endif
|
||||
#else
|
||||
i2c_ll_slave_init(i2c->dev);
|
||||
i2c_ll_slave_set_fifo_mode(i2c->dev, true);
|
||||
#endif
|
||||
i2c_ll_set_slave_addr(i2c->dev, slaveID, false);
|
||||
i2c_ll_set_tout(i2c->dev, I2C_LL_MAX_TIMEOUT);
|
||||
i2c_slave_set_frequency(i2c, frequency);
|
||||
|
|
@ -371,11 +357,7 @@ esp_err_t i2cSlaveInit(uint8_t num, int sda, int scl, uint16_t slaveID, uint32_t
|
|||
|
||||
i2c_ll_disable_intr_mask(i2c->dev, I2C_LL_INTR_MASK);
|
||||
i2c_ll_clear_intr_mask(i2c->dev, I2C_LL_INTR_MASK);
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
||||
i2c_ll_enable_fifo_mode(i2c->dev, true);
|
||||
#else
|
||||
i2c_ll_slave_set_fifo_mode(i2c->dev, true);
|
||||
#endif
|
||||
|
||||
if (!i2c->intr_handle) {
|
||||
uint32_t flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED;
|
||||
|
|
@ -566,9 +548,6 @@ static bool i2c_slave_set_frequency(i2c_slave_struct_t *i2c, uint32_t clk_speed)
|
|||
i2c_ll_set_source_clk(i2c->dev, SOC_MOD_CLK_APB); /*!< I2C source clock from APB, 80M*/
|
||||
}
|
||||
#elif SOC_I2C_SUPPORT_XTAL
|
||||
#ifndef XTAL_CLK_FREQ
|
||||
#define XTAL_CLK_FREQ APB_CLK_FREQ
|
||||
#endif
|
||||
i2c_ll_master_cal_bus_clk(XTAL_CLK_FREQ, clk_speed, &clk_cal);
|
||||
I2C_CLOCK_SRC_ATOMIC() {
|
||||
i2c_ll_set_source_clk(i2c->dev, SOC_MOD_CLK_XTAL); /*!< I2C source clock from XTAL, 40M */
|
||||
|
|
|
|||
|
|
@ -15,8 +15,6 @@
|
|||
#include "esp32-hal-i2c.h"
|
||||
|
||||
#if SOC_I2C_SUPPORTED
|
||||
#include "esp_idf_version.h"
|
||||
#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0)
|
||||
#include "esp32-hal.h"
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
#include "freertos/FreeRTOS.h"
|
||||
|
|
@ -431,5 +429,4 @@ esp_err_t i2cGetClock(uint8_t i2c_num, uint32_t *frequency) {
|
|||
return ESP_OK;
|
||||
}
|
||||
|
||||
#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 0) */
|
||||
#endif /* SOC_I2C_SUPPORTED */
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
#include "soc/soc_caps.h"
|
||||
#if SOC_I2C_SUPPORTED
|
||||
#include "esp_idf_version.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
@ -40,10 +39,6 @@ esp_err_t i2cWriteReadNonStop(
|
|||
);
|
||||
bool i2cIsInit(uint8_t i2c_num);
|
||||
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
|
||||
void *i2cBusHandle(uint8_t i2c_num);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,9 +22,6 @@
|
|||
#include "soc/gpio_sig_map.h"
|
||||
#include "esp_rom_gpio.h"
|
||||
#include "hal/ledc_ll.h"
|
||||
#if SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED
|
||||
#include <math.h>
|
||||
#endif
|
||||
|
||||
#ifdef SOC_LEDC_SUPPORT_HS_MODE
|
||||
#define LEDC_CHANNELS (SOC_LEDC_CHANNEL_NUM << 1)
|
||||
|
|
@ -48,96 +45,6 @@ typedef struct {
|
|||
|
||||
ledc_periph_t ledc_handle = {0};
|
||||
|
||||
// Helper function to find a timer with matching frequency and resolution
|
||||
static bool find_matching_timer(uint8_t speed_mode, uint32_t freq, uint8_t resolution, uint8_t *timer_num) {
|
||||
log_d("Searching for timer with freq=%u, resolution=%u", freq, resolution);
|
||||
// Check all channels to find one with matching frequency and resolution
|
||||
for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) {
|
||||
if (!perimanPinIsValid(i)) {
|
||||
continue;
|
||||
}
|
||||
peripheral_bus_type_t type = perimanGetPinBusType(i);
|
||||
if (type == ESP32_BUS_TYPE_LEDC) {
|
||||
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC);
|
||||
if (bus != NULL && (bus->channel / SOC_LEDC_CHANNEL_NUM) == speed_mode && bus->freq_hz == freq && bus->channel_resolution == resolution) {
|
||||
log_d("Found matching timer %u for freq=%u, resolution=%u", bus->timer_num, freq, resolution);
|
||||
*timer_num = bus->timer_num;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
log_d("No matching timer found for freq=%u, resolution=%u", freq, resolution);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Helper function to find an unused timer
|
||||
static bool find_free_timer(uint8_t speed_mode, uint8_t *timer_num) {
|
||||
// Check which timers are in use
|
||||
uint8_t used_timers = 0;
|
||||
for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) {
|
||||
if (!perimanPinIsValid(i)) {
|
||||
continue;
|
||||
}
|
||||
peripheral_bus_type_t type = perimanGetPinBusType(i);
|
||||
if (type == ESP32_BUS_TYPE_LEDC) {
|
||||
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC);
|
||||
if (bus != NULL && (bus->channel / SOC_LEDC_CHANNEL_NUM) == speed_mode) {
|
||||
log_d("Timer %u is in use by channel %u", bus->timer_num, bus->channel);
|
||||
used_timers |= (1 << bus->timer_num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef SOC_LEDC_TIMER_NUM
|
||||
#define SOC_LEDC_TIMER_NUM 4
|
||||
#endif
|
||||
// Find first unused timer
|
||||
for (uint8_t i = 0; i < SOC_LEDC_TIMER_NUM; i++) {
|
||||
if (!(used_timers & (1 << i))) {
|
||||
log_d("Found free timer %u", i);
|
||||
*timer_num = i;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
log_e("No free timers available");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Helper function to remove a channel from a timer and clear timer if no channels are using it
|
||||
static void remove_channel_from_timer(uint8_t speed_mode, uint8_t timer_num, uint8_t channel) {
|
||||
log_d("Removing channel %u from timer %u in speed_mode %u", channel, timer_num, speed_mode);
|
||||
|
||||
// Check if any other channels are using this timer
|
||||
bool timer_in_use = false;
|
||||
for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) {
|
||||
if (!perimanPinIsValid(i)) {
|
||||
continue;
|
||||
}
|
||||
peripheral_bus_type_t type = perimanGetPinBusType(i);
|
||||
if (type == ESP32_BUS_TYPE_LEDC) {
|
||||
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC);
|
||||
if (bus != NULL && (bus->channel / SOC_LEDC_CHANNEL_NUM) == speed_mode && bus->timer_num == timer_num && bus->channel != channel) {
|
||||
log_d("Timer %u is still in use by channel %u", timer_num, bus->channel);
|
||||
timer_in_use = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!timer_in_use) {
|
||||
log_d("No other channels using timer %u, deconfiguring timer", timer_num);
|
||||
// Stop the timer
|
||||
ledc_timer_pause(speed_mode, timer_num);
|
||||
// Deconfigure the timer
|
||||
ledc_timer_config_t ledc_timer;
|
||||
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
|
||||
ledc_timer.speed_mode = speed_mode;
|
||||
ledc_timer.timer_num = timer_num;
|
||||
ledc_timer.deconfigure = true;
|
||||
ledc_timer_config(&ledc_timer);
|
||||
}
|
||||
}
|
||||
|
||||
static bool fade_initialized = false;
|
||||
|
||||
static ledc_clk_cfg_t clock_source = LEDC_DEFAULT_CLK;
|
||||
|
|
@ -174,8 +81,6 @@ static bool ledcDetachBus(void *bus) {
|
|||
}
|
||||
pinMatrixOutDetach(handle->pin, false, false);
|
||||
if (!channel_found) {
|
||||
uint8_t group = (handle->channel / SOC_LEDC_CHANNEL_NUM);
|
||||
remove_channel_from_timer(group, handle->timer_num, handle->channel % SOC_LEDC_CHANNEL_NUM);
|
||||
ledc_handle.used_channels &= ~(1UL << handle->channel);
|
||||
}
|
||||
free(handle);
|
||||
|
|
@ -212,59 +117,32 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c
|
|||
return false;
|
||||
}
|
||||
|
||||
uint8_t group = (channel / SOC_LEDC_CHANNEL_NUM);
|
||||
uint8_t timer = 0;
|
||||
uint8_t group = (channel / 8), timer = ((channel / 2) % 4);
|
||||
bool channel_used = ledc_handle.used_channels & (1UL << channel);
|
||||
|
||||
if (channel_used) {
|
||||
log_i("Channel %u is already set up, given frequency and resolution will be ignored", channel);
|
||||
if (ledc_set_pin(pin, group, channel % SOC_LEDC_CHANNEL_NUM) != ESP_OK) {
|
||||
if (ledc_set_pin(pin, group, channel % 8) != ESP_OK) {
|
||||
log_e("Attaching pin to already used channel failed!");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Find a timer with matching frequency and resolution, or a free timer
|
||||
if (!find_matching_timer(group, freq, resolution, &timer)) {
|
||||
if (!find_free_timer(group, &timer)) {
|
||||
log_w("No free timers available for speed mode %u", group);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Configure the timer if we're using a new one
|
||||
ledc_timer_config_t ledc_timer;
|
||||
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
|
||||
ledc_timer.speed_mode = group;
|
||||
ledc_timer.timer_num = timer;
|
||||
ledc_timer.duty_resolution = resolution;
|
||||
ledc_timer.freq_hz = freq;
|
||||
ledc_timer.clk_cfg = clock_source;
|
||||
|
||||
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
|
||||
log_e("ledc setup failed!");
|
||||
return false;
|
||||
}
|
||||
ledc_timer_config_t ledc_timer = {.speed_mode = group, .timer_num = timer, .duty_resolution = resolution, .freq_hz = freq, .clk_cfg = clock_source};
|
||||
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
|
||||
log_e("ledc setup failed!");
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t duty = ledc_get_duty(group, (channel % SOC_LEDC_CHANNEL_NUM));
|
||||
|
||||
ledc_channel_config_t ledc_channel;
|
||||
memset((void *)&ledc_channel, 0, sizeof(ledc_channel_config_t));
|
||||
ledc_channel.speed_mode = group;
|
||||
ledc_channel.channel = (channel % SOC_LEDC_CHANNEL_NUM);
|
||||
ledc_channel.timer_sel = timer;
|
||||
ledc_channel.intr_type = LEDC_INTR_DISABLE;
|
||||
ledc_channel.gpio_num = pin;
|
||||
ledc_channel.duty = duty;
|
||||
ledc_channel.hpoint = 0;
|
||||
uint32_t duty = ledc_get_duty(group, (channel % 8));
|
||||
|
||||
ledc_channel_config_t ledc_channel = {
|
||||
.speed_mode = group, .channel = (channel % 8), .timer_sel = timer, .intr_type = LEDC_INTR_DISABLE, .gpio_num = pin, .duty = duty, .hpoint = 0
|
||||
};
|
||||
ledc_channel_config(&ledc_channel);
|
||||
}
|
||||
|
||||
ledc_channel_handle_t *handle = (ledc_channel_handle_t *)malloc(sizeof(ledc_channel_handle_t));
|
||||
handle->pin = pin;
|
||||
handle->channel = channel;
|
||||
handle->timer_num = timer;
|
||||
handle->freq_hz = freq;
|
||||
#ifndef SOC_LEDC_SUPPORT_FADE_STOP
|
||||
handle->lock = NULL;
|
||||
#endif
|
||||
|
|
@ -280,7 +158,7 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c
|
|||
ledc_handle.used_channels |= 1UL << channel;
|
||||
}
|
||||
|
||||
if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_LEDC, (void *)handle, channel, timer)) {
|
||||
if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_LEDC, (void *)handle, group, channel)) {
|
||||
ledcDetachBus((void *)handle);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -297,40 +175,14 @@ bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution) {
|
|||
}
|
||||
uint8_t channel = __builtin_ctz(free_channel); // Convert the free_channel bit to channel number
|
||||
|
||||
// Try the first available channel
|
||||
if (ledcAttachChannel(pin, freq, resolution, channel)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef SOC_LEDC_SUPPORT_HS_MODE
|
||||
// If first attempt failed and HS mode is supported, try to find a free channel in group 1
|
||||
if ((channel / SOC_LEDC_CHANNEL_NUM) == 0) { // First attempt was in group 0
|
||||
log_d("LEDC: Group 0 channel %u failed, trying to find a free channel in group 1", channel);
|
||||
// Find free channels specifically in group 1
|
||||
uint32_t group1_mask = ((1UL << SOC_LEDC_CHANNEL_NUM) - 1) << SOC_LEDC_CHANNEL_NUM;
|
||||
int group1_free_channel = (~ledc_handle.used_channels) & group1_mask;
|
||||
if (group1_free_channel != 0) {
|
||||
uint8_t group1_channel = __builtin_ctz(group1_free_channel);
|
||||
if (ledcAttachChannel(pin, freq, resolution, group1_channel)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
log_e(
|
||||
"No free timers available for freq=%u, resolution=%u. To attach a new channel, use the same frequency and resolution as an already attached channel to "
|
||||
"share its timer.",
|
||||
freq, resolution
|
||||
);
|
||||
return false;
|
||||
return ledcAttachChannel(pin, freq, resolution, channel);
|
||||
}
|
||||
|
||||
bool ledcWrite(uint8_t pin, uint32_t duty) {
|
||||
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC);
|
||||
if (bus != NULL) {
|
||||
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM);
|
||||
uint8_t group = (bus->channel / 8), channel = (bus->channel % 8);
|
||||
|
||||
//Fixing if all bits in resolution is set = LEDC FULL ON
|
||||
uint32_t max_duty = (1 << bus->channel_resolution) - 1;
|
||||
|
|
@ -339,14 +191,8 @@ bool ledcWrite(uint8_t pin, uint32_t duty) {
|
|||
duty = max_duty + 1;
|
||||
}
|
||||
|
||||
if (ledc_set_duty(group, channel, duty) != ESP_OK) {
|
||||
log_e("ledc_set_duty failed");
|
||||
return false;
|
||||
}
|
||||
if (ledc_update_duty(group, channel) != ESP_OK) {
|
||||
log_e("ledc_update_duty failed");
|
||||
return false;
|
||||
}
|
||||
ledc_set_duty(group, channel, duty);
|
||||
ledc_update_duty(group, channel);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -359,11 +205,7 @@ bool ledcWriteChannel(uint8_t channel, uint32_t duty) {
|
|||
log_e("Channel %u is not available (maximum %u) or not used!", channel, LEDC_CHANNELS);
|
||||
return false;
|
||||
}
|
||||
uint8_t group = (channel / SOC_LEDC_CHANNEL_NUM);
|
||||
ledc_timer_t timer;
|
||||
|
||||
// Get the actual timer being used by this channel
|
||||
ledc_ll_get_channel_timer(LEDC_LL_GET_HW(), group, (channel % SOC_LEDC_CHANNEL_NUM), &timer);
|
||||
uint8_t group = (channel / 8), timer = ((channel / 2) % 4);
|
||||
|
||||
//Fixing if all bits in resolution is set = LEDC FULL ON
|
||||
uint32_t resolution = 0;
|
||||
|
|
@ -375,14 +217,8 @@ bool ledcWriteChannel(uint8_t channel, uint32_t duty) {
|
|||
duty = max_duty + 1;
|
||||
}
|
||||
|
||||
if (ledc_set_duty(group, channel, duty) != ESP_OK) {
|
||||
log_e("ledc_set_duty failed");
|
||||
return false;
|
||||
}
|
||||
if (ledc_update_duty(group, channel) != ESP_OK) {
|
||||
log_e("ledc_update_duty failed");
|
||||
return false;
|
||||
}
|
||||
ledc_set_duty(group, channel, duty);
|
||||
ledc_update_duty(group, channel);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -391,7 +227,7 @@ uint32_t ledcRead(uint8_t pin) {
|
|||
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC);
|
||||
if (bus != NULL) {
|
||||
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM);
|
||||
uint8_t group = (bus->channel / 8), channel = (bus->channel % 8);
|
||||
return ledc_get_duty(group, channel);
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -403,8 +239,8 @@ uint32_t ledcReadFreq(uint8_t pin) {
|
|||
if (!ledcRead(pin)) {
|
||||
return 0;
|
||||
}
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM);
|
||||
return ledc_get_freq(group, bus->timer_num);
|
||||
uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4);
|
||||
return ledc_get_freq(group, timer);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -418,15 +254,9 @@ uint32_t ledcWriteTone(uint8_t pin, uint32_t freq) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM);
|
||||
uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4);
|
||||
|
||||
ledc_timer_config_t ledc_timer;
|
||||
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
|
||||
ledc_timer.speed_mode = group;
|
||||
ledc_timer.timer_num = bus->timer_num;
|
||||
ledc_timer.duty_resolution = 10;
|
||||
ledc_timer.freq_hz = freq;
|
||||
ledc_timer.clk_cfg = clock_source;
|
||||
ledc_timer_config_t ledc_timer = {.speed_mode = group, .timer_num = timer, .duty_resolution = 10, .freq_hz = freq, .clk_cfg = clock_source};
|
||||
|
||||
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
|
||||
log_e("ledcWriteTone configuration failed!");
|
||||
|
|
@ -434,7 +264,7 @@ uint32_t ledcWriteTone(uint8_t pin, uint32_t freq) {
|
|||
}
|
||||
bus->channel_resolution = 10;
|
||||
|
||||
uint32_t res_freq = ledc_get_freq(group, bus->timer_num);
|
||||
uint32_t res_freq = ledc_get_freq(group, timer);
|
||||
ledcWrite(pin, 0x1FF);
|
||||
return res_freq;
|
||||
}
|
||||
|
|
@ -475,22 +305,16 @@ uint32_t ledcChangeFrequency(uint8_t pin, uint32_t freq, uint8_t resolution) {
|
|||
log_e("LEDC pin %u - resolution is zero or it is too big (maximum %u)", pin, LEDC_MAX_BIT_WIDTH);
|
||||
return 0;
|
||||
}
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM);
|
||||
uint8_t group = (bus->channel / 8), timer = ((bus->channel / 2) % 4);
|
||||
|
||||
ledc_timer_config_t ledc_timer;
|
||||
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
|
||||
ledc_timer.speed_mode = group;
|
||||
ledc_timer.timer_num = bus->timer_num;
|
||||
ledc_timer.duty_resolution = resolution;
|
||||
ledc_timer.freq_hz = freq;
|
||||
ledc_timer.clk_cfg = clock_source;
|
||||
ledc_timer_config_t ledc_timer = {.speed_mode = group, .timer_num = timer, .duty_resolution = resolution, .freq_hz = freq, .clk_cfg = clock_source};
|
||||
|
||||
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
|
||||
log_e("ledcChangeFrequency failed!");
|
||||
return 0;
|
||||
}
|
||||
bus->channel_resolution = resolution;
|
||||
return ledc_get_freq(group, bus->timer_num);
|
||||
return ledc_get_freq(group, timer);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -501,14 +325,12 @@ bool ledcOutputInvert(uint8_t pin, bool out_invert) {
|
|||
gpio_set_level(pin, out_invert);
|
||||
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32P4
|
||||
esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT_PAD_OUT0_IDX + ((bus->channel) % SOC_LEDC_CHANNEL_NUM), out_invert, 0);
|
||||
esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT_PAD_OUT0_IDX + ((bus->channel) % 8), out_invert, 0);
|
||||
#else
|
||||
#ifdef SOC_LEDC_SUPPORT_HS_MODE
|
||||
esp_rom_gpio_connect_out_signal(
|
||||
pin, ((bus->channel / SOC_LEDC_CHANNEL_NUM == 0) ? LEDC_HS_SIG_OUT0_IDX : LEDC_LS_SIG_OUT0_IDX) + ((bus->channel) % SOC_LEDC_CHANNEL_NUM), out_invert, 0
|
||||
);
|
||||
esp_rom_gpio_connect_out_signal(pin, ((bus->channel / 8 == 0) ? LEDC_HS_SIG_OUT0_IDX : LEDC_LS_SIG_OUT0_IDX) + ((bus->channel) % 8), out_invert, 0);
|
||||
#else
|
||||
esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT0_IDX + ((bus->channel) % SOC_LEDC_CHANNEL_NUM), out_invert, 0);
|
||||
esp_rom_gpio_connect_out_signal(pin, LEDC_LS_SIG_OUT0_IDX + ((bus->channel) % 8), out_invert, 0);
|
||||
#endif
|
||||
#endif // ifdef CONFIG_IDF_TARGET_ESP32P4
|
||||
return true;
|
||||
|
|
@ -555,7 +377,7 @@ static bool ledcFadeConfig(uint8_t pin, uint32_t start_duty, uint32_t target_dut
|
|||
}
|
||||
#endif
|
||||
#endif
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM);
|
||||
uint8_t group = (bus->channel / 8), channel = (bus->channel % 8);
|
||||
|
||||
// Initialize fade service.
|
||||
if (!fade_initialized) {
|
||||
|
|
@ -612,161 +434,6 @@ bool ledcFadeWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_
|
|||
return ledcFadeConfig(pin, start_duty, target_duty, max_fade_time_ms, userFunc, arg);
|
||||
}
|
||||
|
||||
#ifdef SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED
|
||||
// Default gamma factor for gamma correction (common value for LEDs)
|
||||
static float ledcGammaFactor = 2.8;
|
||||
// Gamma correction LUT support
|
||||
static const float *ledcGammaLUT = NULL;
|
||||
static uint16_t ledcGammaLUTSize = 0;
|
||||
// Global variable to store current resolution for gamma callback
|
||||
static uint8_t ledcGammaResolution = 13;
|
||||
|
||||
bool ledcSetGammaTable(const float *gamma_table, uint16_t size) {
|
||||
if (gamma_table == NULL || size == 0) {
|
||||
log_e("Invalid gamma table or size");
|
||||
return false;
|
||||
}
|
||||
ledcGammaLUT = gamma_table;
|
||||
ledcGammaLUTSize = size;
|
||||
log_i("Custom gamma LUT set with %u entries", size);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ledcClearGammaTable(void) {
|
||||
ledcGammaLUT = NULL;
|
||||
ledcGammaLUTSize = 0;
|
||||
log_i("Gamma LUT cleared, using mathematical calculation");
|
||||
}
|
||||
|
||||
void ledcSetGammaFactor(float factor) {
|
||||
ledcGammaFactor = factor;
|
||||
}
|
||||
|
||||
// Gamma correction calculator function
|
||||
static uint32_t ledcGammaCorrection(uint32_t duty) {
|
||||
if (duty == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t max_duty = (1U << ledcGammaResolution) - 1;
|
||||
if (duty >= (1U << ledcGammaResolution)) {
|
||||
return max_duty;
|
||||
}
|
||||
|
||||
// Use LUT if provided, otherwise use mathematical calculation
|
||||
if (ledcGammaLUT != NULL && ledcGammaLUTSize > 0) {
|
||||
// LUT-based gamma correction
|
||||
uint32_t lut_index = (duty * (ledcGammaLUTSize - 1)) / max_duty;
|
||||
if (lut_index >= ledcGammaLUTSize) {
|
||||
lut_index = ledcGammaLUTSize - 1;
|
||||
}
|
||||
|
||||
float corrected_normalized = ledcGammaLUT[lut_index];
|
||||
return (uint32_t)(corrected_normalized * max_duty);
|
||||
} else {
|
||||
// Mathematical gamma correction
|
||||
double normalized = (double)duty / (1U << ledcGammaResolution);
|
||||
double corrected = pow(normalized, ledcGammaFactor);
|
||||
return (uint32_t)(corrected * (1U << ledcGammaResolution));
|
||||
}
|
||||
}
|
||||
|
||||
static bool ledcFadeGammaConfig(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg) {
|
||||
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(pin, ESP32_BUS_TYPE_LEDC);
|
||||
if (bus != NULL) {
|
||||
|
||||
#ifndef SOC_LEDC_SUPPORT_FADE_STOP
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
if (bus->lock == NULL) {
|
||||
bus->lock = xSemaphoreCreateBinary();
|
||||
if (bus->lock == NULL) {
|
||||
log_e("xSemaphoreCreateBinary failed");
|
||||
return false;
|
||||
}
|
||||
xSemaphoreGive(bus->lock);
|
||||
}
|
||||
//acquire lock
|
||||
if (xSemaphoreTake(bus->lock, 0) != pdTRUE) {
|
||||
log_e("LEDC Fade is still running on pin %u! SoC does not support stopping fade.", pin);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
uint8_t group = (bus->channel / SOC_LEDC_CHANNEL_NUM), channel = (bus->channel % SOC_LEDC_CHANNEL_NUM);
|
||||
|
||||
// Initialize fade service.
|
||||
if (!fade_initialized) {
|
||||
ledc_fade_func_install(0);
|
||||
fade_initialized = true;
|
||||
}
|
||||
|
||||
bus->fn = (voidFuncPtr)userFunc;
|
||||
bus->arg = arg;
|
||||
|
||||
ledc_cbs_t callbacks = {.fade_cb = ledcFnWrapper};
|
||||
ledc_cb_register(group, channel, &callbacks, (void *)bus);
|
||||
|
||||
// Prepare gamma curve fade parameters
|
||||
ledc_fade_param_config_t fade_params[SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX];
|
||||
uint32_t actual_fade_ranges = 0;
|
||||
|
||||
// Use a moderate number of linear segments for smooth gamma curve
|
||||
const uint32_t linear_fade_segments = 12;
|
||||
|
||||
// Set the global resolution for gamma correction
|
||||
ledcGammaResolution = bus->channel_resolution;
|
||||
|
||||
// Fill multi-fade parameter list using ESP-IDF API
|
||||
esp_err_t err = ledc_fill_multi_fade_param_list(
|
||||
group, channel, start_duty, target_duty, linear_fade_segments, max_fade_time_ms, ledcGammaCorrection, SOC_LEDC_GAMMA_CURVE_FADE_RANGE_MAX, fade_params,
|
||||
&actual_fade_ranges
|
||||
);
|
||||
|
||||
if (err != ESP_OK) {
|
||||
log_e("ledc_fill_multi_fade_param_list failed: %s", esp_err_to_name(err));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Apply the gamma-corrected start duty
|
||||
uint32_t gamma_start_duty = ledcGammaCorrection(start_duty);
|
||||
|
||||
// Set multi-fade parameters
|
||||
err = ledc_set_multi_fade(group, channel, gamma_start_duty, fade_params, actual_fade_ranges);
|
||||
if (err != ESP_OK) {
|
||||
log_e("ledc_set_multi_fade failed: %s", esp_err_to_name(err));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Start the gamma curve fade
|
||||
err = ledc_fade_start(group, channel, LEDC_FADE_NO_WAIT);
|
||||
if (err != ESP_OK) {
|
||||
log_e("ledc_fade_start failed: %s", esp_err_to_name(err));
|
||||
return false;
|
||||
}
|
||||
|
||||
log_d("Gamma curve fade started on pin %u: %u -> %u over %dms", pin, start_duty, target_duty, max_fade_time_ms);
|
||||
|
||||
} else {
|
||||
log_e("Pin %u is not attached to LEDC. Call ledcAttach first!", pin);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ledcFadeGamma(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms) {
|
||||
return ledcFadeGammaConfig(pin, start_duty, target_duty, max_fade_time_ms, NULL, NULL);
|
||||
}
|
||||
|
||||
bool ledcFadeGammaWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, voidFuncPtr userFunc) {
|
||||
return ledcFadeGammaConfig(pin, start_duty, target_duty, max_fade_time_ms, (voidFuncPtrArg)userFunc, NULL);
|
||||
}
|
||||
|
||||
bool ledcFadeGammaWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg) {
|
||||
return ledcFadeGammaConfig(pin, start_duty, target_duty, max_fade_time_ms, userFunc, arg);
|
||||
}
|
||||
|
||||
#endif /* SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED */
|
||||
|
||||
static uint8_t analog_resolution = 8;
|
||||
static int analog_frequency = 1000;
|
||||
void analogWrite(uint8_t pin, int value) {
|
||||
|
|
|
|||
|
|
@ -51,8 +51,6 @@ typedef struct {
|
|||
uint8_t pin; // Pin assigned to channel
|
||||
uint8_t channel; // Channel number
|
||||
uint8_t channel_resolution; // Resolution of channel
|
||||
uint8_t timer_num; // Timer number used by this channel
|
||||
uint32_t freq_hz; // Frequency configured for this channel
|
||||
voidFuncPtr fn;
|
||||
void *arg;
|
||||
#ifndef SOC_LEDC_SUPPORT_FADE_STOP
|
||||
|
|
@ -232,85 +230,6 @@ bool ledcFadeWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_dut
|
|||
*/
|
||||
bool ledcFadeWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg);
|
||||
|
||||
//Gamma Curve Fade functions - only available on supported chips
|
||||
#ifdef SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED
|
||||
|
||||
/**
|
||||
* @brief Set a custom gamma correction lookup table for gamma curve fading.
|
||||
* The LUT should contain normalized values (0.0 to 1.0) representing
|
||||
* the gamma-corrected brightness curve.
|
||||
*
|
||||
* @param gamma_table Pointer to array of float values (0.0 to 1.0)
|
||||
* @param size Number of entries in the lookup table
|
||||
*
|
||||
* @return true if gamma table was successfully set, false otherwise.
|
||||
*
|
||||
* @note The LUT array must remain valid for as long as gamma fading is used.
|
||||
* Larger tables provide smoother transitions but use more memory.
|
||||
*/
|
||||
bool ledcSetGammaTable(const float *gamma_table, uint16_t size);
|
||||
|
||||
/**
|
||||
* @brief Clear the current gamma correction lookup table.
|
||||
* After calling this, gamma correction will use mathematical
|
||||
* calculation with the default gamma factor (2.8).
|
||||
*/
|
||||
void ledcClearGammaTable(void);
|
||||
|
||||
/**
|
||||
* @brief Set the gamma factor for gamma correction.
|
||||
*
|
||||
* @param factor Gamma factor to use for gamma correction.
|
||||
*/
|
||||
void ledcSetGammaFactor(float factor);
|
||||
|
||||
/**
|
||||
* @brief Setup and start a gamma curve fade on a given LEDC pin.
|
||||
* Gamma correction makes LED brightness changes appear more gradual to human eyes.
|
||||
*
|
||||
* @param pin GPIO pin
|
||||
* @param start_duty initial duty cycle of the fade
|
||||
* @param target_duty target duty cycle of the fade
|
||||
* @param max_fade_time_ms maximum fade time in milliseconds
|
||||
*
|
||||
* @return true if gamma fade was successfully set and started, false otherwise.
|
||||
*
|
||||
* @note This function is only available on ESP32 variants that support gamma curve fading.
|
||||
*/
|
||||
bool ledcFadeGamma(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms);
|
||||
|
||||
/**
|
||||
* @brief Setup and start a gamma curve fade on a given LEDC pin with a callback function.
|
||||
*
|
||||
* @param pin GPIO pin
|
||||
* @param start_duty initial duty cycle of the fade
|
||||
* @param target_duty target duty cycle of the fade
|
||||
* @param max_fade_time_ms maximum fade time in milliseconds
|
||||
* @param userFunc callback function to be called after fade is finished
|
||||
*
|
||||
* @return true if gamma fade was successfully set and started, false otherwise.
|
||||
*
|
||||
* @note This function is only available on ESP32 variants that support gamma curve fading.
|
||||
*/
|
||||
bool ledcFadeGammaWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void));
|
||||
|
||||
/**
|
||||
* @brief Setup and start a gamma curve fade on a given LEDC pin with a callback function and argument.
|
||||
*
|
||||
* @param pin GPIO pin
|
||||
* @param start_duty initial duty cycle of the fade
|
||||
* @param target_duty target duty cycle of the fade
|
||||
* @param max_fade_time_ms maximum fade time in milliseconds
|
||||
* @param userFunc callback function to be called after fade is finished
|
||||
* @param arg argument to be passed to the callback function
|
||||
*
|
||||
* @return true if gamma fade was successfully set and started, false otherwise.
|
||||
*
|
||||
* @note This function is only available on ESP32 variants that support gamma curve fading.
|
||||
*/
|
||||
bool ledcFadeGammaWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void *), void *arg);
|
||||
#endif // SOC_LEDC_GAMMA_CURVE_FADE_SUPPORTED
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@
|
|||
#include "esp32h2/rom/gpio.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#include "esp32p4/rom/gpio.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "esp32c5/rom/gpio.h"
|
||||
#else
|
||||
#error Target CONFIG_IDF_TARGET is not supported
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -25,13 +25,12 @@
|
|||
#include "esp_ota_ops.h"
|
||||
#endif //CONFIG_APP_ROLLBACK_ENABLE
|
||||
#include "esp_private/startup_internal.h"
|
||||
#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && SOC_BT_SUPPORTED && __has_include("esp_bt.h")
|
||||
#ifdef CONFIG_BT_ENABLED
|
||||
#include "esp_bt.h"
|
||||
#endif
|
||||
#endif //CONFIG_BT_ENABLED
|
||||
#include <sys/time.h>
|
||||
#include "soc/rtc.h"
|
||||
#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4) \
|
||||
&& !defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||
#if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||
#include "soc/rtc_cntl_reg.h"
|
||||
#include "soc/syscon_reg.h"
|
||||
#endif
|
||||
|
|
@ -57,8 +56,6 @@
|
|||
#include "esp32h2/rom/rtc.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#include "esp32p4/rom/rtc.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "esp32c5/rom/rtc.h"
|
||||
|
||||
#else
|
||||
#error Target CONFIG_IDF_TARGET is not supported
|
||||
|
|
@ -159,13 +156,11 @@ void enableCore0WDT() {
|
|||
}
|
||||
}
|
||||
|
||||
bool disableCore0WDT() {
|
||||
void disableCore0WDT() {
|
||||
TaskHandle_t idle_0 = xTaskGetIdleTaskHandleForCore(0);
|
||||
if (idle_0 == NULL || esp_task_wdt_status(idle_0) || esp_task_wdt_delete(idle_0) != ESP_OK) {
|
||||
if (idle_0 == NULL || esp_task_wdt_delete(idle_0) != ESP_OK) {
|
||||
log_e("Failed to remove Core 0 IDLE task from WDT");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_FREERTOS_UNICORE
|
||||
|
|
@ -176,13 +171,11 @@ void enableCore1WDT() {
|
|||
}
|
||||
}
|
||||
|
||||
bool disableCore1WDT() {
|
||||
void disableCore1WDT() {
|
||||
TaskHandle_t idle_1 = xTaskGetIdleTaskHandleForCore(1);
|
||||
if (idle_1 == NULL || esp_task_wdt_status(idle_1) || esp_task_wdt_delete(idle_1) != ESP_OK) {
|
||||
if (idle_1 == NULL || esp_task_wdt_delete(idle_1) != ESP_OK) {
|
||||
log_e("Failed to remove Core 1 IDLE task from WDT");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -246,7 +239,7 @@ bool verifyRollbackLater() {
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)
|
||||
#ifdef CONFIG_BT_ENABLED
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
//overwritten in esp32-hal-bt.c
|
||||
bool btInUse() __attribute__((weak));
|
||||
|
|
@ -308,7 +301,7 @@ void initArduino() {
|
|||
if (err) {
|
||||
log_e("Failed to initialize NVS! Error: %u", err);
|
||||
}
|
||||
#if (defined(CONFIG_BLUEDROID_ENABLED) || defined(CONFIG_NIMBLE_ENABLED)) && SOC_BT_SUPPORTED
|
||||
#ifdef CONFIG_BT_ENABLED
|
||||
if (!btInUse()) {
|
||||
esp_bt_controller_mem_release(ESP_BT_MODE_BTDM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,8 +29,6 @@
|
|||
#include "esp32s3/rom/cache.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#include "esp32p4/rom/cache.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "esp32c5/rom/cache.h"
|
||||
#else
|
||||
#error Target CONFIG_IDF_TARGET is not supported
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -206,8 +206,7 @@ bool rmtSetCarrier(int pin, bool carrier_en, bool carrier_level, uint32_t freque
|
|||
log_w("GPIO %d - RMT Carrier must be a float percentage from 0 to 1. Setting to 50%.", pin);
|
||||
duty_percent = 0.5;
|
||||
}
|
||||
rmt_carrier_config_t carrier_cfg;
|
||||
memset((void *)&carrier_cfg, 0, sizeof(rmt_carrier_config_t));
|
||||
rmt_carrier_config_t carrier_cfg = {0};
|
||||
carrier_cfg.duty_cycle = duty_percent; // duty cycle
|
||||
carrier_cfg.frequency_hz = carrier_en ? frequency_Hz : 0; // carrier frequency in Hz
|
||||
carrier_cfg.flags.polarity_active_low = carrier_level; // carrier modulation polarity level
|
||||
|
|
@ -314,8 +313,7 @@ static bool _rmtWrite(int pin, rmt_data_t *data, size_t num_rmt_symbols, bool bl
|
|||
return false;
|
||||
}
|
||||
|
||||
rmt_transmit_config_t transmit_cfg; // loop mode disabled
|
||||
memset((void *)&transmit_cfg, 0, sizeof(rmt_transmit_config_t));
|
||||
rmt_transmit_config_t transmit_cfg = {0}; // loop mode disabled
|
||||
bool retCode = true;
|
||||
|
||||
RMT_MUTEX_LOCK(bus);
|
||||
|
|
@ -382,7 +380,6 @@ static bool _rmtRead(int pin, rmt_data_t *data, size_t *num_rmt_symbols, bool wa
|
|||
|
||||
// request reading RMT Channel Data
|
||||
rmt_receive_config_t receive_config;
|
||||
memset((void *)&receive_config, 0, sizeof(rmt_receive_config_t));
|
||||
receive_config.signal_range_min_ns = bus->signal_range_min_ns;
|
||||
receive_config.signal_range_max_ns = bus->signal_range_max_ns;
|
||||
|
||||
|
|
@ -533,7 +530,6 @@ bool rmtInit(int pin, rmt_ch_dir_t channel_direction, rmt_reserve_memsize_t mem_
|
|||
if (channel_direction == RMT_TX_MODE) {
|
||||
// TX Channel
|
||||
rmt_tx_channel_config_t tx_cfg;
|
||||
memset((void *)&tx_cfg, 0, sizeof(rmt_tx_channel_config_t));
|
||||
tx_cfg.gpio_num = pin;
|
||||
// CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F80M for C6 -- CLK_XTAL for H2
|
||||
tx_cfg.clk_src = RMT_CLK_SRC_DEFAULT;
|
||||
|
|
@ -563,7 +559,6 @@ bool rmtInit(int pin, rmt_ch_dir_t channel_direction, rmt_reserve_memsize_t mem_
|
|||
} else {
|
||||
// RX Channel
|
||||
rmt_rx_channel_config_t rx_cfg;
|
||||
memset((void *)&rx_cfg, 0, sizeof(rmt_rx_channel_config_t));
|
||||
rx_cfg.gpio_num = pin;
|
||||
// CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F80M for C6 -- CLK_XTAL for H2
|
||||
rx_cfg.clk_src = RMT_CLK_SRC_DEFAULT;
|
||||
|
|
@ -590,8 +585,7 @@ bool rmtInit(int pin, rmt_ch_dir_t channel_direction, rmt_reserve_memsize_t mem_
|
|||
}
|
||||
|
||||
// allocate memory for the RMT Copy encoder
|
||||
rmt_copy_encoder_config_t copy_encoder_config;
|
||||
memset((void *)©_encoder_config, 0, sizeof(rmt_copy_encoder_config_t));
|
||||
rmt_copy_encoder_config_t copy_encoder_config = {};
|
||||
if (rmt_new_copy_encoder(©_encoder_config, &bus->rmt_copy_encoder_h) != ESP_OK) {
|
||||
log_e("GPIO %d - RMT Encoder Memory Allocation error.", pin);
|
||||
goto Err;
|
||||
|
|
|
|||
|
|
@ -26,9 +26,7 @@
|
|||
#include "soc/io_mux_reg.h"
|
||||
#include "soc/gpio_sig_map.h"
|
||||
#include "soc/rtc.h"
|
||||
#ifndef CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "hal/clk_gate_ll.h"
|
||||
#endif
|
||||
#include "esp32-hal-periman.h"
|
||||
#include "esp_private/periph_ctrl.h"
|
||||
|
||||
|
|
@ -62,10 +60,6 @@
|
|||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#include "esp32p4/rom/ets_sys.h"
|
||||
#include "esp32p4/rom/gpio.h"
|
||||
#include "hal/spi_ll.h"
|
||||
#elif CONFIG_IDF_TARGET_ESP32C5
|
||||
#include "esp32c5/rom/ets_sys.h"
|
||||
#include "esp32c5/rom/gpio.h"
|
||||
#else
|
||||
#error Target CONFIG_IDF_TARGET is not supported
|
||||
#endif
|
||||
|
|
@ -80,20 +74,20 @@ struct spi_struct_t {
|
|||
int8_t miso;
|
||||
int8_t mosi;
|
||||
int8_t ss;
|
||||
bool ss_invert;
|
||||
};
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32S2
|
||||
// ESP32S2
|
||||
#define SPI_COUNT (2)
|
||||
#define SPI_COUNT (3)
|
||||
|
||||
#define SPI_CLK_IDX(p) ((p == 0) ? FSPICLK_OUT_MUX_IDX : ((p == 1) ? SPI3_CLK_OUT_MUX_IDX : 0))
|
||||
#define SPI_MISO_IDX(p) ((p == 0) ? FSPIQ_OUT_IDX : ((p == 1) ? SPI3_Q_OUT_IDX : 0))
|
||||
#define SPI_MOSI_IDX(p) ((p == 0) ? FSPID_IN_IDX : ((p == 1) ? SPI3_D_IN_IDX : 0))
|
||||
#define SPI_CLK_IDX(p) ((p == 0) ? SPICLK_OUT_MUX_IDX : ((p == 1) ? FSPICLK_OUT_MUX_IDX : ((p == 2) ? SPI3_CLK_OUT_MUX_IDX : 0)))
|
||||
#define SPI_MISO_IDX(p) ((p == 0) ? SPIQ_OUT_IDX : ((p == 1) ? FSPIQ_OUT_IDX : ((p == 2) ? SPI3_Q_OUT_IDX : 0)))
|
||||
#define SPI_MOSI_IDX(p) ((p == 0) ? SPID_IN_IDX : ((p == 1) ? FSPID_IN_IDX : ((p == 2) ? SPI3_D_IN_IDX : 0)))
|
||||
|
||||
#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : ((n == 2) ? SPI3_CS2_OUT_IDX : 0)))
|
||||
#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : ((n == 2) ? FSPICS2_OUT_IDX : 0)))
|
||||
#define SPI_SS_IDX(p, n) ((p == 0) ? SPI_FSPI_SS_IDX(n) : ((p == 1) ? SPI_HSPI_SS_IDX(n) : 0))
|
||||
#define SPI_SPI_SS_IDX(n) ((n == 0) ? SPICS0_OUT_IDX : ((n == 1) ? SPICS1_OUT_IDX : 0))
|
||||
#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : ((n == 2) ? SPI3_CS2_OUT_IDX : SPI3_CS0_OUT_IDX)))
|
||||
#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : ((n == 2) ? FSPICS2_OUT_IDX : FSPICS0_OUT_IDX)))
|
||||
#define SPI_SS_IDX(p, n) ((p == 0) ? SPI_SPI_SS_IDX(n) : ((p == 1) ? SPI_SPI_SS_IDX(n) : ((p == 2) ? SPI_HSPI_SS_IDX(n) : 0)))
|
||||
|
||||
#elif CONFIG_IDF_TARGET_ESP32S3
|
||||
// ESP32S3
|
||||
|
|
@ -103,8 +97,8 @@ struct spi_struct_t {
|
|||
#define SPI_MISO_IDX(p) ((p == 0) ? FSPIQ_OUT_IDX : ((p == 1) ? SPI3_Q_OUT_IDX : 0))
|
||||
#define SPI_MOSI_IDX(p) ((p == 0) ? FSPID_IN_IDX : ((p == 1) ? SPI3_D_IN_IDX : 0))
|
||||
|
||||
#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : ((n == 2) ? SPI3_CS2_OUT_IDX : 0)))
|
||||
#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : ((n == 2) ? FSPICS2_OUT_IDX : 0)))
|
||||
#define SPI_HSPI_SS_IDX(n) ((n == 0) ? SPI3_CS0_OUT_IDX : ((n == 1) ? SPI3_CS1_OUT_IDX : 0))
|
||||
#define SPI_FSPI_SS_IDX(n) ((n == 0) ? FSPICS0_OUT_IDX : ((n == 1) ? FSPICS1_OUT_IDX : 0))
|
||||
#define SPI_SS_IDX(p, n) ((p == 0) ? SPI_FSPI_SS_IDX(n) : ((p == 1) ? SPI_HSPI_SS_IDX(n) : 0))
|
||||
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
|
|
@ -125,7 +119,7 @@ struct spi_struct_t {
|
|||
|
||||
#define SPI_SS_IDX(p, n) ((p == 0) ? SPI_FSPI_SS_IDX(n) : ((p == 1) ? SPI_HSPI_SS_IDX(n) : 0))
|
||||
|
||||
#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
||||
// ESP32C3
|
||||
#define SPI_COUNT (1)
|
||||
|
||||
|
|
@ -156,20 +150,24 @@ struct spi_struct_t {
|
|||
#define SPI_MUTEX_UNLOCK()
|
||||
// clang-format off
|
||||
static spi_t _spi_bus_array[] = {
|
||||
#if CONFIG_IDF_TARGET_ESP32S2 ||CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 1, -1, -1, -1, -1, false}
|
||||
#if CONFIG_IDF_TARGET_ESP32S2
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 0, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 1, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 2, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 1, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C2
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false}
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5
|
||||
{(spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1, false}
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
||||
{(spi_dev_t *)(DR_REG_SPI2_BASE), 0, -1, -1, -1, -1}
|
||||
#else
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI0_BASE), 0, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 1, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 2, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 3, -1, -1, -1, -1, false}
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI0_BASE), 0, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI1_BASE), 1, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), 2, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), 3, -1, -1, -1, -1}
|
||||
#endif
|
||||
};
|
||||
// clang-format on
|
||||
|
|
@ -180,19 +178,23 @@ static spi_t _spi_bus_array[] = {
|
|||
#define SPI_MUTEX_UNLOCK() xSemaphoreGive(spi->lock)
|
||||
|
||||
static spi_t _spi_bus_array[] = {
|
||||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false}, {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 1, -1, -1, -1, -1, false}
|
||||
#if CONFIG_IDF_TARGET_ESP32S2
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 0, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 1, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 2, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1}, {(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 1, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C2
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false}
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C5
|
||||
{(spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1, false}
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1}
|
||||
#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
||||
{(spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 0, -1, -1, -1, -1}
|
||||
#else
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI0_BASE), NULL, 0, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 1, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 2, -1, -1, -1, -1, false},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 3, -1, -1, -1, -1, false}
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI0_BASE), NULL, 0, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI1_BASE), NULL, 1, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI2_BASE), NULL, 2, -1, -1, -1, -1},
|
||||
{(volatile spi_dev_t *)(DR_REG_SPI3_BASE), NULL, 3, -1, -1, -1, -1}
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
|
@ -363,7 +365,7 @@ bool spiAttachSS(spi_t *spi, uint8_t ss_num, int8_t ss) {
|
|||
return false;
|
||||
}
|
||||
pinMode(ss, OUTPUT);
|
||||
pinMatrixOutAttach(ss, SPI_SS_IDX(spi->num, ss_num), spi->ss_invert, false);
|
||||
pinMatrixOutAttach(ss, SPI_SS_IDX(spi->num, ss_num), false, false);
|
||||
spiEnableSSPins(spi, (1 << ss_num));
|
||||
spi->ss = ss;
|
||||
if (!perimanSetPinBus(ss, ESP32_BUS_TYPE_SPI_MASTER_SS, (void *)(spi->num + 1), spi->num, -1)) {
|
||||
|
|
@ -433,12 +435,6 @@ void spiSSDisable(spi_t *spi) {
|
|||
SPI_MUTEX_UNLOCK();
|
||||
}
|
||||
|
||||
void spiSSInvert(spi_t *spi, bool invert) {
|
||||
if (spi) {
|
||||
spi->ss_invert = invert;
|
||||
}
|
||||
}
|
||||
|
||||
void spiSSSet(spi_t *spi) {
|
||||
if (!spi) {
|
||||
return;
|
||||
|
|
@ -618,7 +614,6 @@ void spiStopBus(spi_t *spi) {
|
|||
|
||||
spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t bitOrder) {
|
||||
if (spi_num >= SPI_COUNT) {
|
||||
log_e("SPI bus index %d is out of range", spi_num);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -645,6 +640,9 @@ spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t
|
|||
} else if (spi_num == HSPI) {
|
||||
DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI3_CLK_EN);
|
||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI3_RST);
|
||||
} else {
|
||||
DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI01_CLK_EN);
|
||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI01_RST);
|
||||
}
|
||||
#elif CONFIG_IDF_TARGET_ESP32S3
|
||||
if (spi_num == FSPI) {
|
||||
|
|
@ -665,31 +663,6 @@ spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t
|
|||
DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_SPI01_CLK_EN);
|
||||
DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_SPI01_RST);
|
||||
}
|
||||
#elif CONFIG_IDF_TARGET_ESP32P4
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
if (spi_num == FSPI) {
|
||||
PERIPH_RCC_ACQUIRE_ATOMIC(PERIPH_GPSPI2_MODULE, ref_count) {
|
||||
if (ref_count == 0) {
|
||||
PERIPH_RCC_ATOMIC() {
|
||||
spi_ll_enable_bus_clock(SPI2_HOST, true);
|
||||
spi_ll_reset_register(SPI2_HOST);
|
||||
spi_ll_enable_clock(SPI2_HOST, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (spi_num == HSPI) {
|
||||
PERIPH_RCC_ACQUIRE_ATOMIC(PERIPH_GPSPI3_MODULE, ref_count) {
|
||||
if (ref_count == 0) {
|
||||
PERIPH_RCC_ATOMIC() {
|
||||
spi_ll_enable_bus_clock(SPI3_HOST, true);
|
||||
spi_ll_reset_register(SPI3_HOST);
|
||||
spi_ll_enable_clock(SPI3_HOST, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#pragma GCC diagnostic pop
|
||||
#elif defined(__PERIPH_CTRL_ALLOW_LEGACY_API)
|
||||
periph_ll_reset(PERIPH_SPI2_MODULE);
|
||||
periph_ll_enable_clk_clear_rst(PERIPH_SPI2_MODULE);
|
||||
|
|
@ -712,7 +685,7 @@ spi_t *spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_t
|
|||
spi->dev->user.doutdin = 1;
|
||||
int i;
|
||||
for (i = 0; i < 16; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = 0x00000000;
|
||||
#else
|
||||
spi->dev->data_buf[i] = 0x00000000;
|
||||
|
|
@ -760,7 +733,7 @@ void spiWrite(spi_t *spi, const uint32_t *data, uint8_t len) {
|
|||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
for (i = 0; i < len; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = data[i];
|
||||
#else
|
||||
spi->dev->data_buf[i] = data[i];
|
||||
|
|
@ -787,7 +760,7 @@ void spiTransfer(spi_t *spi, uint32_t *data, uint8_t len) {
|
|||
spi->dev->mosi_dlen.usr_mosi_dbitlen = (len * 32) - 1;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = (len * 32) - 1;
|
||||
for (i = 0; i < len; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = data[i];
|
||||
#else
|
||||
spi->dev->data_buf[i] = data[i];
|
||||
|
|
@ -800,7 +773,7 @@ void spiTransfer(spi_t *spi, uint32_t *data, uint8_t len) {
|
|||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
for (i = 0; i < len; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data[i] = spi->dev->data_buf[i].val;
|
||||
#else
|
||||
data[i] = spi->dev->data_buf[i];
|
||||
|
|
@ -818,7 +791,7 @@ void spiWriteByte(spi_t *spi, uint8_t data) {
|
|||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -840,7 +813,7 @@ uint8_t spiTransferByte(spi_t *spi, uint8_t data) {
|
|||
SPI_MUTEX_LOCK();
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = 7;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 7;
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -851,7 +824,7 @@ uint8_t spiTransferByte(spi_t *spi, uint8_t data) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val & 0xFF;
|
||||
#else
|
||||
data = spi->dev->data_buf[0] & 0xFF;
|
||||
|
|
@ -881,7 +854,7 @@ void spiWriteWord(spi_t *spi, uint16_t data) {
|
|||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -905,7 +878,7 @@ uint16_t spiTransferWord(spi_t *spi, uint16_t data) {
|
|||
SPI_MUTEX_LOCK();
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = 15;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 15;
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -916,7 +889,7 @@ uint16_t spiTransferWord(spi_t *spi, uint16_t data) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val;
|
||||
#else
|
||||
data = spi->dev->data_buf[0];
|
||||
|
|
@ -940,7 +913,7 @@ void spiWriteLong(spi_t *spi, uint32_t data) {
|
|||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -964,7 +937,7 @@ uint32_t spiTransferLong(spi_t *spi, uint32_t data) {
|
|||
SPI_MUTEX_LOCK();
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = 31;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 31;
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -975,7 +948,7 @@ uint32_t spiTransferLong(spi_t *spi, uint32_t data) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val;
|
||||
#else
|
||||
data = spi->dev->data_buf[0];
|
||||
|
|
@ -1014,7 +987,7 @@ static void __spiTransferBytes(spi_t *spi, const uint8_t *data, uint8_t *out, ui
|
|||
spi->dev->miso_dlen.usr_miso_dbitlen = ((bytes * 8) - 1);
|
||||
|
||||
for (i = 0; i < words; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = wordsBuf[i]; //copy buffer to spi fifo
|
||||
#else
|
||||
spi->dev->data_buf[i] = wordsBuf[i]; //copy buffer to spi fifo
|
||||
|
|
@ -1031,7 +1004,7 @@ static void __spiTransferBytes(spi_t *spi, const uint8_t *data, uint8_t *out, ui
|
|||
|
||||
if (out) {
|
||||
for (i = 0; i < words; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
wordsBuf[i] = spi->dev->data_buf[i].val; //copy spi fifo to buffer
|
||||
#else
|
||||
wordsBuf[i] = spi->dev->data_buf[i]; //copy spi fifo to buffer
|
||||
|
|
@ -1172,7 +1145,7 @@ void ARDUINO_ISR_ATTR spiWriteByteNL(spi_t *spi, uint8_t data) {
|
|||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1191,7 +1164,7 @@ uint8_t spiTransferByteNL(spi_t *spi, uint8_t data) {
|
|||
}
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = 7;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 7;
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1202,7 +1175,7 @@ uint8_t spiTransferByteNL(spi_t *spi, uint8_t data) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val & 0xFF;
|
||||
#else
|
||||
data = spi->dev->data_buf[0] & 0xFF;
|
||||
|
|
@ -1221,7 +1194,7 @@ void ARDUINO_ISR_ATTR spiWriteShortNL(spi_t *spi, uint16_t data) {
|
|||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1243,7 +1216,7 @@ uint16_t spiTransferShortNL(spi_t *spi, uint16_t data) {
|
|||
}
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = 15;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 15;
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1254,7 +1227,7 @@ uint16_t spiTransferShortNL(spi_t *spi, uint16_t data) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val & 0xFFFF;
|
||||
#else
|
||||
data = spi->dev->data_buf[0] & 0xFFFF;
|
||||
|
|
@ -1276,7 +1249,7 @@ void ARDUINO_ISR_ATTR spiWriteLongNL(spi_t *spi, uint32_t data) {
|
|||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1298,7 +1271,7 @@ uint32_t spiTransferLongNL(spi_t *spi, uint32_t data) {
|
|||
}
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = 31;
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = 31;
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1309,7 +1282,7 @@ uint32_t spiTransferLongNL(spi_t *spi, uint32_t data) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val;
|
||||
#else
|
||||
data = spi->dev->data_buf[0];
|
||||
|
|
@ -1340,7 +1313,7 @@ void spiWriteNL(spi_t *spi, const void *data_in, uint32_t len) {
|
|||
spi->dev->miso_dlen.usr_miso_dbitlen = 0;
|
||||
#endif
|
||||
for (size_t i = 0; i < c_longs; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = data[i];
|
||||
#else
|
||||
spi->dev->data_buf[i] = data[i];
|
||||
|
|
@ -1379,7 +1352,7 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint
|
|||
spi->dev->miso_dlen.usr_miso_dbitlen = (c_len * 8) - 1;
|
||||
if (data) {
|
||||
for (size_t i = 0; i < c_longs; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = data[i];
|
||||
#else
|
||||
spi->dev->data_buf[i] = data[i];
|
||||
|
|
@ -1387,7 +1360,7 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint
|
|||
}
|
||||
} else {
|
||||
for (size_t i = 0; i < c_longs; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = 0xFFFFFFFF;
|
||||
#else
|
||||
spi->dev->data_buf[i] = 0xFFFFFFFF;
|
||||
|
|
@ -1403,13 +1376,13 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint
|
|||
if (result) {
|
||||
if (c_len & 3) {
|
||||
for (size_t i = 0; i < (c_longs - 1); i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
result[i] = spi->dev->data_buf[i].val;
|
||||
#else
|
||||
result[i] = spi->dev->data_buf[i];
|
||||
#endif
|
||||
}
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
uint32_t last_data = spi->dev->data_buf[c_longs - 1].val;
|
||||
#else
|
||||
uint32_t last_data = spi->dev->data_buf[c_longs - 1];
|
||||
|
|
@ -1421,7 +1394,7 @@ void spiTransferBytesNL(spi_t *spi, const void *data_in, uint8_t *data_out, uint
|
|||
}
|
||||
} else {
|
||||
for (size_t i = 0; i < c_longs; i++) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
result[i] = spi->dev->data_buf[i].val;
|
||||
#else
|
||||
result[i] = spi->dev->data_buf[i];
|
||||
|
|
@ -1463,7 +1436,7 @@ void spiTransferBitsNL(spi_t *spi, uint32_t data, uint32_t *out, uint8_t bits) {
|
|||
|
||||
spi->dev->mosi_dlen.usr_mosi_dbitlen = (bits - 1);
|
||||
spi->dev->miso_dlen.usr_miso_dbitlen = (bits - 1);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[0].val = data;
|
||||
#else
|
||||
spi->dev->data_buf[0] = data;
|
||||
|
|
@ -1474,7 +1447,7 @@ void spiTransferBitsNL(spi_t *spi, uint32_t data, uint32_t *out, uint8_t bits) {
|
|||
#endif
|
||||
spi->dev->cmd.usr = 1;
|
||||
while (spi->dev->cmd.usr);
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
data = spi->dev->data_buf[0].val;
|
||||
#else
|
||||
data = spi->dev->data_buf[0];
|
||||
|
|
@ -1515,27 +1488,27 @@ void ARDUINO_ISR_ATTR spiWritePixelsNL(spi_t *spi, const void *data_in, uint32_t
|
|||
if (msb) {
|
||||
if (l_bytes && i == (c_longs - 1)) {
|
||||
if (l_bytes == 2) {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
MSB_16_SET(spi->dev->data_buf[i].val, data[i]);
|
||||
#else
|
||||
MSB_16_SET(spi->dev->data_buf[i], data[i]);
|
||||
#endif
|
||||
} else {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = data[i] & 0xFF;
|
||||
#else
|
||||
spi->dev->data_buf[i] = data[i] & 0xFF;
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
MSB_PIX_SET(spi->dev->data_buf[i].val, data[i]);
|
||||
#else
|
||||
MSB_PIX_SET(spi->dev->data_buf[i], data[i]);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
spi->dev->data_buf[i].val = data[i];
|
||||
#else
|
||||
spi->dev->data_buf[i] = data[i];
|
||||
|
|
|
|||
|
|
@ -27,13 +27,19 @@ extern "C" {
|
|||
#include <stdbool.h>
|
||||
|
||||
#define SPI_HAS_TRANSACTION
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32
|
||||
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32S2
|
||||
#define FSPI 1 //SPI 1 bus. ESP32S2: for external memory only (can use the same data lines but different SS)
|
||||
#define HSPI 2 //SPI 2 bus. ESP32S2: external memory or device - it can be matrixed to any pins
|
||||
#define SPI2 2 // Another name for ESP32S2 SPI 2
|
||||
#define SPI3 3 //SPI 3 bus. ESP32S2: device only - it can be matrixed to any pins
|
||||
#elif CONFIG_IDF_TARGET_ESP32
|
||||
#define FSPI 1 //SPI 1 bus attached to the flash (can use the same data lines but different SS)
|
||||
#define HSPI 2 //SPI 2 bus normally mapped to pins 12 - 15, but can be matrixed to any pins
|
||||
#define VSPI 3 //SPI 3 bus normally attached to pins 5, 18, 19 and 23, but can be matrixed to any pins
|
||||
#else
|
||||
#define FSPI 0 // ESP32C2, C3, C6, H2, S2, S3, P4 - SPI 2 bus
|
||||
#define HSPI 1 // ESP32S2, S3, P4 - SPI 3 bus
|
||||
#define FSPI 0
|
||||
#define HSPI 1
|
||||
#endif
|
||||
|
||||
// This defines are not representing the real Divider of the ESP32
|
||||
|
|
@ -91,8 +97,6 @@ void spiSSSet(spi_t *spi);
|
|||
void spiSSClear(spi_t *spi);
|
||||
|
||||
void spiWaitReady(spi_t *spi);
|
||||
//invert hardware SS
|
||||
void spiSSInvert(spi_t *spi, bool invert);
|
||||
|
||||
uint32_t spiGetClockDiv(spi_t *spi);
|
||||
uint8_t spiGetDataMode(spi_t *spi);
|
||||
|
|
|
|||
|
|
@ -22,12 +22,6 @@
|
|||
#include "esp_clk_tree.h"
|
||||
#endif
|
||||
|
||||
#if CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
#define TIMER_IRAM IRAM_ATTR
|
||||
#else
|
||||
#define TIMER_IRAM
|
||||
#endif
|
||||
|
||||
typedef void (*voidFuncPtr)(void);
|
||||
typedef void (*voidFuncPtrArg)(void *);
|
||||
|
||||
|
|
@ -42,11 +36,9 @@ struct timer_struct_t {
|
|||
bool timer_started;
|
||||
};
|
||||
|
||||
inline TIMER_IRAM uint64_t timerRead(hw_timer_t *timer) {
|
||||
inline uint64_t timerRead(hw_timer_t *timer) {
|
||||
if (timer == NULL) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer handle is NULL");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
uint64_t value;
|
||||
|
|
@ -54,21 +46,17 @@ inline TIMER_IRAM uint64_t timerRead(hw_timer_t *timer) {
|
|||
return value;
|
||||
}
|
||||
|
||||
void TIMER_IRAM timerWrite(hw_timer_t *timer, uint64_t val) {
|
||||
void timerWrite(hw_timer_t *timer, uint64_t val) {
|
||||
if (timer == NULL) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer handle is NULL");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
gptimer_set_raw_count(timer->timer_handle, val);
|
||||
}
|
||||
|
||||
void TIMER_IRAM timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) {
|
||||
void timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count) {
|
||||
if (timer == NULL) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer handle is NULL");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
esp_err_t err = ESP_OK;
|
||||
|
|
@ -79,9 +67,7 @@ void TIMER_IRAM timerAlarm(hw_timer_t *timer, uint64_t alarm_value, bool autorel
|
|||
};
|
||||
err = gptimer_set_alarm_action(timer->timer_handle, &alarm_cfg);
|
||||
if (err != ESP_OK) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer Alarm Write failed, error num=%d", err);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -94,33 +80,27 @@ uint32_t timerGetFrequency(hw_timer_t *timer) {
|
|||
return frequency;
|
||||
}
|
||||
|
||||
void TIMER_IRAM timerStart(hw_timer_t *timer) {
|
||||
void timerStart(hw_timer_t *timer) {
|
||||
if (timer == NULL) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer handle is NULL");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
gptimer_start(timer->timer_handle);
|
||||
timer->timer_started = true;
|
||||
}
|
||||
|
||||
void TIMER_IRAM timerStop(hw_timer_t *timer) {
|
||||
void timerStop(hw_timer_t *timer) {
|
||||
if (timer == NULL) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer handle is NULL");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
gptimer_stop(timer->timer_handle);
|
||||
timer->timer_started = false;
|
||||
}
|
||||
|
||||
void TIMER_IRAM timerRestart(hw_timer_t *timer) {
|
||||
void timerRestart(hw_timer_t *timer) {
|
||||
if (timer == NULL) {
|
||||
#ifndef CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM
|
||||
log_e("Timer handle is NULL");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
gptimer_set_raw_count(timer->timer_handle, 0);
|
||||
|
|
|
|||
|
|
@ -466,6 +466,9 @@ __attribute__((weak)) int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint
|
|||
__attribute__((weak)) int32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize) {
|
||||
return -1;
|
||||
}
|
||||
__attribute__((weak)) bool tud_msc_is_writable_cb(uint8_t lun) {
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
#if CFG_TUD_NCM
|
||||
__attribute__((weak)) bool tud_network_recv_cb(const uint8_t *src, uint16_t size) {
|
||||
|
|
@ -613,7 +616,7 @@ void usb_persist_restart(restart_type_t mode) {
|
|||
}
|
||||
|
||||
static bool tinyusb_reserve_in_endpoint(uint8_t endpoint) {
|
||||
if (endpoint > CFG_TUD_NUM_EPS || (tinyusb_endpoints.in & BIT(endpoint)) != 0) {
|
||||
if (endpoint > 6 || (tinyusb_endpoints.in & BIT(endpoint)) != 0) {
|
||||
return false;
|
||||
}
|
||||
tinyusb_endpoints.in |= BIT(endpoint);
|
||||
|
|
@ -621,7 +624,7 @@ static bool tinyusb_reserve_in_endpoint(uint8_t endpoint) {
|
|||
}
|
||||
|
||||
static bool tinyusb_reserve_out_endpoint(uint8_t endpoint) {
|
||||
if (endpoint > CFG_TUD_NUM_EPS || (tinyusb_endpoints.out & BIT(endpoint)) != 0) {
|
||||
if (endpoint > 6 || (tinyusb_endpoints.out & BIT(endpoint)) != 0) {
|
||||
return false;
|
||||
}
|
||||
tinyusb_endpoints.out |= BIT(endpoint);
|
||||
|
|
@ -629,13 +632,11 @@ static bool tinyusb_reserve_out_endpoint(uint8_t endpoint) {
|
|||
}
|
||||
|
||||
static bool tinyusb_has_available_fifos(void) {
|
||||
uint8_t max_endpoints = CFG_TUD_NUM_IN_EPS - 1, active_endpoints = 0;
|
||||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
||||
uint8_t max_endpoints = 4, active_endpoints = 0;
|
||||
if (tinyusb_loaded_interfaces_mask & BIT(USB_INTERFACE_CDC)) {
|
||||
max_endpoints = CFG_TUD_NUM_IN_EPS; //CDC endpoint 0x85 is actually not linked to FIFO and not used
|
||||
max_endpoints = 5; //CDC endpoint 0x85 is actually not linked to FIFO and not used
|
||||
}
|
||||
#endif
|
||||
for (uint8_t i = 1; i <= CFG_TUD_NUM_EPS; i++) {
|
||||
for (uint8_t i = 1; i < 7; i++) {
|
||||
if ((tinyusb_endpoints.in & BIT(i)) != 0) {
|
||||
active_endpoints++;
|
||||
}
|
||||
|
|
@ -770,7 +771,7 @@ static void usb_device_task(void *param) {
|
|||
* PUBLIC API
|
||||
* */
|
||||
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR
|
||||
const char *tinyusb_interface_names[USB_INTERFACE_MAX] = {"MSC", "DFU", "HID", "VENDOR", "CDC", "CDC2", "MIDI", "CUSTOM"};
|
||||
const char *tinyusb_interface_names[USB_INTERFACE_MAX] = {"MSC", "DFU", "HID", "VENDOR", "CDC", "MIDI", "CUSTOM"};
|
||||
#endif
|
||||
static bool tinyusb_is_initialized = false;
|
||||
|
||||
|
|
@ -861,7 +862,7 @@ uint8_t tinyusb_get_free_duplex_endpoint(void) {
|
|||
log_e("No available IN endpoints");
|
||||
return 0;
|
||||
}
|
||||
for (uint8_t i = 1; i <= CFG_TUD_NUM_IN_EPS; i++) {
|
||||
for (uint8_t i = 1; i < 7; i++) {
|
||||
if ((tinyusb_endpoints.in & BIT(i)) == 0 && (tinyusb_endpoints.out & BIT(i)) == 0) {
|
||||
tinyusb_endpoints.in |= BIT(i);
|
||||
tinyusb_endpoints.out |= BIT(i);
|
||||
|
|
@ -877,13 +878,13 @@ uint8_t tinyusb_get_free_in_endpoint(void) {
|
|||
log_e("No available IN endpoints");
|
||||
return 0;
|
||||
}
|
||||
for (uint8_t i = 1; i <= CFG_TUD_NUM_IN_EPS; i++) {
|
||||
for (uint8_t i = 1; i < 7; i++) {
|
||||
if ((tinyusb_endpoints.in & BIT(i)) == 0 && (tinyusb_endpoints.out & BIT(i)) != 0) {
|
||||
tinyusb_endpoints.in |= BIT(i);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
for (uint8_t i = 1; i <= CFG_TUD_NUM_IN_EPS; i++) {
|
||||
for (uint8_t i = 1; i < 7; i++) {
|
||||
if ((tinyusb_endpoints.in & BIT(i)) == 0) {
|
||||
tinyusb_endpoints.in |= BIT(i);
|
||||
return i;
|
||||
|
|
@ -893,13 +894,13 @@ uint8_t tinyusb_get_free_in_endpoint(void) {
|
|||
}
|
||||
|
||||
uint8_t tinyusb_get_free_out_endpoint(void) {
|
||||
for (uint8_t i = 1; i <= CFG_TUD_NUM_EPS; i++) {
|
||||
for (uint8_t i = 1; i < 7; i++) {
|
||||
if ((tinyusb_endpoints.out & BIT(i)) == 0 && (tinyusb_endpoints.in & BIT(i)) != 0) {
|
||||
tinyusb_endpoints.out |= BIT(i);
|
||||
return i;
|
||||
}
|
||||
}
|
||||
for (uint8_t i = 1; i <= CFG_TUD_NUM_EPS; i++) {
|
||||
for (uint8_t i = 1; i < 7; i++) {
|
||||
if ((tinyusb_endpoints.out & BIT(i)) == 0) {
|
||||
tinyusb_endpoints.out |= BIT(i);
|
||||
return i;
|
||||
|
|
|
|||
|
|
@ -38,13 +38,6 @@ extern "C" {
|
|||
#define CFG_TUD_ENDOINT_SIZE 64
|
||||
#endif
|
||||
#endif
|
||||
#if CONFIG_IDF_TARGET_ESP32P4
|
||||
#define CFG_TUD_NUM_EPS 15
|
||||
#define CFG_TUD_NUM_IN_EPS 8
|
||||
#else
|
||||
#define CFG_TUD_NUM_EPS 6
|
||||
#define CFG_TUD_NUM_IN_EPS 5
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
uint16_t vid;
|
||||
|
|
@ -95,7 +88,6 @@ typedef enum {
|
|||
USB_INTERFACE_HID,
|
||||
USB_INTERFACE_VENDOR,
|
||||
USB_INTERFACE_CDC,
|
||||
USB_INTERFACE_CDC2,
|
||||
USB_INTERFACE_MIDI,
|
||||
USB_INTERFACE_CUSTOM,
|
||||
USB_INTERFACE_MAX
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright 2015-2025 Espressif Systems (Shanghai) PTE LTD
|
||||
// Copyright 2015-2024 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
|
|
@ -32,12 +32,6 @@
|
|||
#include "driver/gpio.h"
|
||||
#include "hal/gpio_hal.h"
|
||||
#include "esp_rom_gpio.h"
|
||||
#include "esp_private/gpio.h"
|
||||
|
||||
#include "driver/rtc_io.h"
|
||||
#include "driver/lp_io.h"
|
||||
#include "soc/uart_pins.h"
|
||||
#include "esp_private/uart_share_hw_ctrl.h"
|
||||
|
||||
static int s_uart_debug_nr = 0; // UART number for debug output
|
||||
#define REF_TICK_BAUDRATE_LIMIT 250000 // this is maximum UART badrate using REF_TICK as clock
|
||||
|
|
@ -59,7 +53,6 @@ struct uart_struct_t {
|
|||
uint16_t _rx_buffer_size, _tx_buffer_size; // UART RX and TX buffer sizes
|
||||
bool _inverted; // UART inverted signal
|
||||
uint8_t _rxfifo_full_thrhd; // UART RX FIFO full threshold
|
||||
int8_t _uart_clock_source; // UART Clock Source used when it is started using uartBegin()
|
||||
};
|
||||
|
||||
#if CONFIG_DISABLE_HAL_LOCKS
|
||||
|
|
@ -68,21 +61,18 @@ struct uart_struct_t {
|
|||
#define UART_MUTEX_UNLOCK()
|
||||
|
||||
static uart_t _uart_bus_array[] = {
|
||||
{0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_NUM > 1
|
||||
{1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
{0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
{1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 2
|
||||
{2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
{2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 3
|
||||
{3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
{3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 4
|
||||
{4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 5
|
||||
{5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
{4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -97,130 +87,28 @@ static uart_t _uart_bus_array[] = {
|
|||
xSemaphoreGive(uart->lock)
|
||||
|
||||
static uart_t _uart_bus_array[] = {
|
||||
{NULL, 0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_NUM > 1
|
||||
{NULL, 1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
{NULL, 0, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#if SOC_UART_HP_NUM > 1
|
||||
{NULL, 1, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 2
|
||||
{NULL, 2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
{NULL, 2, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 3
|
||||
{NULL, 3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_HP_NUM > 3
|
||||
{NULL, 3, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 4
|
||||
{NULL, 4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#endif
|
||||
#if SOC_UART_NUM > 5
|
||||
{NULL, 5, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0, -1},
|
||||
#if SOC_UART_HP_NUM > 4
|
||||
{NULL, 4, false, 0, NULL, -1, -1, -1, -1, 0, 0, 0, 0, false, 0},
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
// LP UART enable pins routine
|
||||
static bool lp_uart_config_io(uint8_t uart_num, int8_t pin, rtc_gpio_mode_t direction, uint32_t idx) {
|
||||
/* Skip configuration if the LP_IO is -1 */
|
||||
if (pin < 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Initialize LP_IO
|
||||
if (rtc_gpio_init(pin) != ESP_OK) {
|
||||
log_e("Failed to initialize LP_IO %d", pin);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set LP_IO direction
|
||||
if (rtc_gpio_set_direction(pin, direction) != ESP_OK) {
|
||||
log_e("Failed to set LP_IO %d direction", pin);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Connect pins
|
||||
const uart_periph_sig_t *upin = &uart_periph_signal[uart_num].pins[idx];
|
||||
#if !SOC_LP_GPIO_MATRIX_SUPPORTED // ESP32-C6/C61/C5
|
||||
// When LP_IO Matrix is not support, LP_IO Mux must be connected to the pins
|
||||
if (rtc_gpio_iomux_func_sel(pin, upin->iomux_func) != ESP_OK) {
|
||||
log_e("Failed to set LP_IO pin %d into Mux function", pin);
|
||||
return false;
|
||||
}
|
||||
#else // So far, only ESP32-P4
|
||||
// If the configured pin is the default LP_IO Mux pin for LP UART, then set the LP_IO MUX function
|
||||
if (upin->default_gpio == pin) {
|
||||
if (rtc_gpio_iomux_func_sel(pin, upin->iomux_func) != ESP_OK) {
|
||||
log_e("Failed to set LP_IO pin %d into Mux function", pin);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Otherwise, set the LP_IO Matrix and select FUNC1
|
||||
if (rtc_gpio_iomux_func_sel(pin, 1) != ESP_OK) {
|
||||
log_e("Failed to set LP_IO pin %d into Mux function GPIO", pin);
|
||||
return false;
|
||||
}
|
||||
// Connect the LP_IO to the LP UART peripheral signal
|
||||
esp_err_t ret;
|
||||
if (direction == RTC_GPIO_MODE_OUTPUT_ONLY) {
|
||||
ret = lp_gpio_connect_out_signal(pin, UART_PERIPH_SIGNAL(uart_num, idx), 0, 0);
|
||||
} else {
|
||||
ret = lp_gpio_connect_in_signal(pin, UART_PERIPH_SIGNAL(uart_num, idx), 0);
|
||||
}
|
||||
if (ret != ESP_OK) {
|
||||
log_e("Failed to connect LP_IO pin %d to UART%d signal", pin, uart_num);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif // SOC_LP_GPIO_MATRIX_SUPPORTED
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// When LP UART needs the RTC IO MUX to set the pin, it will always have fixed pins for RX, TX, CTS and RTS
|
||||
static bool lpuartCheckPins(int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin, uint8_t uart_nr) {
|
||||
// check if LP UART is being used and if the pins are valid
|
||||
#if !SOC_LP_GPIO_MATRIX_SUPPORTED // ESP32-C6/C61/C5
|
||||
uint16_t lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_RX_PIN_IDX].default_gpio;
|
||||
if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
if (rxPin > 0 && rxPin != lp_uart_fixed_pin) {
|
||||
log_e("UART%d LP UART requires RX pin to be set to %d.", uart_nr, lp_uart_fixed_pin);
|
||||
return false;
|
||||
}
|
||||
lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_TX_PIN_IDX].default_gpio;
|
||||
if (txPin > 0 && txPin != lp_uart_fixed_pin) {
|
||||
log_e("UART%d LP UART requires TX pin to be set to %d.", uart_nr, lp_uart_fixed_pin);
|
||||
return false;
|
||||
}
|
||||
lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_CTS_PIN_IDX].default_gpio;
|
||||
if (ctsPin > 0 && ctsPin != lp_uart_fixed_pin) {
|
||||
log_e("UART%d LP UART requires CTS pin to be set to %d.", uart_nr, lp_uart_fixed_pin);
|
||||
return false;
|
||||
}
|
||||
lp_uart_fixed_pin = uart_periph_signal[uart_nr].pins[SOC_UART_RTS_PIN_IDX].default_gpio;
|
||||
if (rtsPin > 0 && rtsPin != lp_uart_fixed_pin) {
|
||||
log_e("UART%d LP UART requires RTS pin to be set to %d.", uart_nr, lp_uart_fixed_pin);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
#else // ESP32-P4 can set any pin for LP UART
|
||||
return true;
|
||||
#endif // SOC_LP_GPIO_MATRIX_SUPPORTED
|
||||
}
|
||||
#endif // SOC_UART_LP_NUM >= 1
|
||||
|
||||
#ifndef GPIO_FUNC_IN_LOW
|
||||
#define GPIO_FUNC_IN_LOW GPIO_MATRIX_CONST_ZERO_INPUT
|
||||
#endif
|
||||
|
||||
#ifndef GPIO_FUNC_IN_HIGH
|
||||
#define GPIO_FUNC_IN_HIGH GPIO_MATRIX_CONST_ONE_INPUT
|
||||
#endif
|
||||
|
||||
// Negative Pin Number will keep it unmodified, thus this function can detach individual pins
|
||||
// This function will also unset the pins in the Peripheral Manager and set the pin to -1 after detaching
|
||||
static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) {
|
||||
if (uart_num >= SOC_UART_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1);
|
||||
if (uart_num >= SOC_UART_HP_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1);
|
||||
return false;
|
||||
}
|
||||
// get UART information
|
||||
|
|
@ -229,10 +117,9 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
//log_v("detaching UART%d pins: prev,pin RX(%d,%d) TX(%d,%d) CTS(%d,%d) RTS(%d,%d)", uart_num,
|
||||
// uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10);
|
||||
|
||||
// detaches HP and LP pins and sets Peripheral Manager and UART information
|
||||
// detaches pins and sets Peripheral Manager and UART information
|
||||
if (rxPin >= 0 && uart->_rxPin == rxPin && perimanGetPinBusType(rxPin) == ESP32_BUS_TYPE_UART_RX) {
|
||||
//gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rxPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_pad_select_gpio(rxPin);
|
||||
gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rxPin], PIN_FUNC_GPIO);
|
||||
// avoids causing BREAK in the UART line
|
||||
if (uart->_inverted) {
|
||||
esp_rom_gpio_connect_in_signal(GPIO_FUNC_IN_LOW, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), false);
|
||||
|
|
@ -246,8 +133,7 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
}
|
||||
}
|
||||
if (txPin >= 0 && uart->_txPin == txPin && perimanGetPinBusType(txPin) == ESP32_BUS_TYPE_UART_TX) {
|
||||
//gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[txPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_pad_select_gpio(txPin);
|
||||
gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[txPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_connect_out_signal(txPin, SIG_GPIO_OUT_IDX, false, false);
|
||||
uart->_txPin = -1; // -1 means unassigned/detached
|
||||
if (!perimanClearPinBus(txPin)) {
|
||||
|
|
@ -256,8 +142,7 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
}
|
||||
}
|
||||
if (ctsPin >= 0 && uart->_ctsPin == ctsPin && perimanGetPinBusType(ctsPin) == ESP32_BUS_TYPE_UART_CTS) {
|
||||
//gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[ctsPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_pad_select_gpio(ctsPin);
|
||||
gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[ctsPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_connect_in_signal(GPIO_FUNC_IN_LOW, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), false);
|
||||
uart->_ctsPin = -1; // -1 means unassigned/detached
|
||||
if (!perimanClearPinBus(ctsPin)) {
|
||||
|
|
@ -266,8 +151,7 @@ static bool _uartDetachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
}
|
||||
}
|
||||
if (rtsPin >= 0 && uart->_rtsPin == rtsPin && perimanGetPinBusType(rtsPin) == ESP32_BUS_TYPE_UART_RTS) {
|
||||
//gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rtsPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_pad_select_gpio(rtsPin);
|
||||
gpio_hal_iomux_func_sel(GPIO_PIN_MUX_REG[rtsPin], PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_connect_out_signal(rtsPin, SIG_GPIO_OUT_IDX, false, false);
|
||||
uart->_rtsPin = -1; // -1 means unassigned/detached
|
||||
if (!perimanClearPinBus(rtsPin)) {
|
||||
|
|
@ -307,152 +191,11 @@ static bool _uartDetachBus_RTS(void *busptr) {
|
|||
return _uartDetachPins(bus->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, bus->_rtsPin);
|
||||
}
|
||||
|
||||
static bool _uartTrySetIomuxPin(uart_port_t uart_num, int io_num, uint32_t idx) {
|
||||
// Store a pointer to the default pin, to optimize access to its fields.
|
||||
const uart_periph_sig_t *upin = &uart_periph_signal[uart_num].pins[idx];
|
||||
|
||||
// In theory, if default_gpio is -1, iomux_func should also be -1, but let's be safe and test both.
|
||||
if (upin->iomux_func == -1 || upin->default_gpio == -1 || upin->default_gpio != io_num) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Assign the correct function to the GPIO.
|
||||
if (upin->iomux_func == -1) {
|
||||
log_e("IO#%d has bad IOMUX internal information. Switching to GPIO Matrix UART function.", io_num);
|
||||
return false;
|
||||
}
|
||||
if (uart_num < SOC_UART_HP_NUM) {
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0)
|
||||
if (upin->input) {
|
||||
gpio_iomux_input(io_num, upin->iomux_func, upin->signal);
|
||||
} else {
|
||||
gpio_iomux_output(io_num, upin->iomux_func);
|
||||
}
|
||||
#else
|
||||
gpio_iomux_out(io_num, upin->iomux_func, false);
|
||||
// If the pin is input, we also have to redirect the signal, in order to bypass the GPIO matrix.
|
||||
if (upin->input) {
|
||||
gpio_iomux_in(io_num, upin->signal);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#if (SOC_UART_LP_NUM >= 1) && (SOC_RTCIO_PIN_COUNT >= 1)
|
||||
else {
|
||||
if (upin->input) {
|
||||
rtc_gpio_set_direction(io_num, RTC_GPIO_MODE_INPUT_ONLY);
|
||||
} else {
|
||||
rtc_gpio_set_direction(io_num, RTC_GPIO_MODE_OUTPUT_ONLY);
|
||||
}
|
||||
rtc_gpio_init(io_num);
|
||||
rtc_gpio_iomux_func_sel(io_num, upin->iomux_func);
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
static esp_err_t _uartInternalSetPin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num) {
|
||||
// Since an IO cannot route peripheral signals via IOMUX and GPIO matrix at the same time,
|
||||
// if tx and rx share the same IO, both signals need to be routed to IOs through GPIO matrix
|
||||
bool tx_rx_same_io = (tx_io_num == rx_io_num);
|
||||
|
||||
// In the following statements, if the io_num is negative, no need to configure anything.
|
||||
if (tx_io_num >= 0) {
|
||||
#if CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND || CONFIG_PM_SLP_DISABLE_GPIO
|
||||
// In such case, IOs are going to switch to sleep configuration (isolate) when entering sleep for power saving reason
|
||||
// But TX IO in isolate state could write garbled data to the other end
|
||||
// Therefore, we should disable the switch of the TX pin to sleep configuration
|
||||
gpio_sleep_sel_dis(tx_io_num);
|
||||
#endif
|
||||
if (tx_rx_same_io || !_uartTrySetIomuxPin(uart_num, tx_io_num, SOC_UART_TX_PIN_IDX)) {
|
||||
if (uart_num < SOC_UART_HP_NUM) {
|
||||
gpio_func_sel(tx_io_num, PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_connect_out_signal(tx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX), 0, 0);
|
||||
// output enable is set inside esp_rom_gpio_connect_out_signal func after the signal is connected
|
||||
// (output enabled too early may cause unnecessary level change at the pad)
|
||||
}
|
||||
#if SOC_LP_GPIO_MATRIX_SUPPORTED
|
||||
else {
|
||||
rtc_gpio_init(tx_io_num); // set as a LP_GPIO pin
|
||||
lp_gpio_connect_out_signal(tx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_TX_PIN_IDX), 0, 0);
|
||||
// output enable is set inside lp_gpio_connect_out_signal func after the signal is connected
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (rx_io_num >= 0) {
|
||||
#if CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND || CONFIG_PM_SLP_DISABLE_GPIO
|
||||
// In such case, IOs are going to switch to sleep configuration (isolate) when entering sleep for power saving reason
|
||||
// But RX IO in isolate state could receive garbled data into FIFO, which is not desired
|
||||
// Therefore, we should disable the switch of the RX pin to sleep configuration
|
||||
gpio_sleep_sel_dis(rx_io_num);
|
||||
#endif
|
||||
if (tx_rx_same_io || !_uartTrySetIomuxPin(uart_num, rx_io_num, SOC_UART_RX_PIN_IDX)) {
|
||||
if (uart_num < SOC_UART_HP_NUM) {
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
|
||||
gpio_input_enable(rx_io_num);
|
||||
#else
|
||||
gpio_func_sel(rx_io_num, PIN_FUNC_GPIO);
|
||||
gpio_ll_input_enable(&GPIO, rx_io_num);
|
||||
#endif
|
||||
esp_rom_gpio_connect_in_signal(rx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), 0);
|
||||
}
|
||||
#if SOC_LP_GPIO_MATRIX_SUPPORTED
|
||||
else {
|
||||
rtc_gpio_mode_t mode = (tx_rx_same_io ? RTC_GPIO_MODE_INPUT_OUTPUT : RTC_GPIO_MODE_INPUT_ONLY);
|
||||
rtc_gpio_set_direction(rx_io_num, mode);
|
||||
if (!tx_rx_same_io) { // set the same pin again as a LP_GPIO will overwrite connected out_signal, not desired, so skip
|
||||
rtc_gpio_init(rx_io_num); // set as a LP_GPIO pin
|
||||
}
|
||||
lp_gpio_connect_in_signal(rx_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RX_PIN_IDX), 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (rts_io_num >= 0 && !_uartTrySetIomuxPin(uart_num, rts_io_num, SOC_UART_RTS_PIN_IDX)) {
|
||||
if (uart_num < SOC_UART_HP_NUM) {
|
||||
gpio_func_sel(rts_io_num, PIN_FUNC_GPIO);
|
||||
esp_rom_gpio_connect_out_signal(rts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0);
|
||||
// output enable is set inside esp_rom_gpio_connect_out_signal func after the signal is connected
|
||||
}
|
||||
#if SOC_LP_GPIO_MATRIX_SUPPORTED
|
||||
else {
|
||||
rtc_gpio_init(rts_io_num); // set as a LP_GPIO pin
|
||||
lp_gpio_connect_out_signal(rts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_RTS_PIN_IDX), 0, 0);
|
||||
// output enable is set inside lp_gpio_connect_out_signal func after the signal is connected
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (cts_io_num >= 0 && !_uartTrySetIomuxPin(uart_num, cts_io_num, SOC_UART_CTS_PIN_IDX)) {
|
||||
if (uart_num < SOC_UART_HP_NUM) {
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
|
||||
gpio_pullup_en(cts_io_num);
|
||||
gpio_input_enable(cts_io_num);
|
||||
#else
|
||||
gpio_func_sel(cts_io_num, PIN_FUNC_GPIO);
|
||||
gpio_set_pull_mode(cts_io_num, GPIO_PULLUP_ONLY);
|
||||
gpio_set_direction(cts_io_num, GPIO_MODE_INPUT);
|
||||
#endif
|
||||
esp_rom_gpio_connect_in_signal(cts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), 0);
|
||||
}
|
||||
#if SOC_LP_GPIO_MATRIX_SUPPORTED
|
||||
else {
|
||||
rtc_gpio_set_direction(cts_io_num, RTC_GPIO_MODE_INPUT_ONLY);
|
||||
rtc_gpio_init(cts_io_num); // set as a LP_GPIO pin
|
||||
lp_gpio_connect_in_signal(cts_io_num, UART_PERIPH_SIGNAL(uart_num, SOC_UART_CTS_PIN_IDX), 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Attach function for UART
|
||||
// connects the IO Pad, set Paripheral Manager and internal UART structure data
|
||||
static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) {
|
||||
if (uart_num >= SOC_UART_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1);
|
||||
if (uart_num >= SOC_UART_HP_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1);
|
||||
return false;
|
||||
}
|
||||
// get UART information
|
||||
|
|
@ -460,8 +203,6 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
//log_v("attaching UART%d pins: prev,new RX(%d,%d) TX(%d,%d) CTS(%d,%d) RTS(%d,%d)", uart_num,
|
||||
// uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10);
|
||||
|
||||
// IDF _uartInternalSetPin() checks if the pin is used within LP UART and if it is a valid RTC IO pin
|
||||
// No need for Arduino Layer to check it again
|
||||
bool retCode = true;
|
||||
if (rxPin >= 0) {
|
||||
// forces a clean detaching from a previous peripheral
|
||||
|
|
@ -469,12 +210,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
perimanClearPinBus(rxPin);
|
||||
}
|
||||
// connect RX Pad
|
||||
bool ret = ESP_OK == _uartInternalSetPin(uart->num, UART_PIN_NO_CHANGE, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
ret &= lp_uart_config_io(uart->num, rxPin, RTC_GPIO_MODE_INPUT_ONLY, SOC_UART_RX_PIN_IDX);
|
||||
}
|
||||
#endif
|
||||
bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, rxPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
||||
if (ret) {
|
||||
ret &= perimanSetPinBus(rxPin, ESP32_BUS_TYPE_UART_RX, (void *)uart, uart_num, -1);
|
||||
if (ret) {
|
||||
|
|
@ -492,12 +228,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
perimanClearPinBus(txPin);
|
||||
}
|
||||
// connect TX Pad
|
||||
bool ret = ESP_OK == _uartInternalSetPin(uart->num, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
ret &= lp_uart_config_io(uart->num, txPin, RTC_GPIO_MODE_OUTPUT_ONLY, SOC_UART_TX_PIN_IDX);
|
||||
}
|
||||
#endif
|
||||
bool ret = ESP_OK == uart_set_pin(uart->num, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
||||
if (ret) {
|
||||
ret &= perimanSetPinBus(txPin, ESP32_BUS_TYPE_UART_TX, (void *)uart, uart_num, -1);
|
||||
if (ret) {
|
||||
|
|
@ -515,12 +246,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
perimanClearPinBus(ctsPin);
|
||||
}
|
||||
// connect CTS Pad
|
||||
bool ret = ESP_OK == _uartInternalSetPin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, ctsPin);
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
ret &= lp_uart_config_io(uart->num, ctsPin, RTC_GPIO_MODE_INPUT_ONLY, SOC_UART_CTS_PIN_IDX);
|
||||
}
|
||||
#endif
|
||||
bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, ctsPin);
|
||||
if (ret) {
|
||||
ret &= perimanSetPinBus(ctsPin, ESP32_BUS_TYPE_UART_CTS, (void *)uart, uart_num, -1);
|
||||
if (ret) {
|
||||
|
|
@ -538,12 +264,7 @@ static bool _uartAttachPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t
|
|||
perimanClearPinBus(rtsPin);
|
||||
}
|
||||
// connect RTS Pad
|
||||
bool ret = ESP_OK == _uartInternalSetPin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, rtsPin, UART_PIN_NO_CHANGE);
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (ret && uart_num >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
ret &= lp_uart_config_io(uart->num, rtsPin, RTC_GPIO_MODE_OUTPUT_ONLY, SOC_UART_RTS_PIN_IDX);
|
||||
}
|
||||
#endif
|
||||
bool ret = ESP_OK == uart_set_pin(uart->num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, rtsPin, UART_PIN_NO_CHANGE);
|
||||
if (ret) {
|
||||
ret &= perimanSetPinBus(rtsPin, ESP32_BUS_TYPE_UART_RTS, (void *)uart, uart_num, -1);
|
||||
if (ret) {
|
||||
|
|
@ -600,20 +321,13 @@ bool uartIsDriverInstalled(uart_t *uart) {
|
|||
// Negative Pin Number will keep it unmodified, thus this function can set individual pins
|
||||
// When pins are changed, it will detach the previous one
|
||||
bool uartSetPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin) {
|
||||
if (uart_num >= SOC_UART_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1);
|
||||
if (uart_num >= SOC_UART_HP_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1);
|
||||
return false;
|
||||
}
|
||||
// get UART information
|
||||
uart_t *uart = &_uart_bus_array[uart_num];
|
||||
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
// check if LP UART is being used and if the pins are valid
|
||||
if (!lpuartCheckPins(rxPin, txPin, ctsPin, rtsPin, uart_num)) {
|
||||
return false; // failed to set pins
|
||||
}
|
||||
#endif
|
||||
|
||||
bool retCode = true;
|
||||
UART_MUTEX_LOCK();
|
||||
|
||||
|
|
@ -677,7 +391,7 @@ bool _testUartBegin(
|
|||
uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint32_t rx_buffer_size, uint32_t tx_buffer_size, bool inverted,
|
||||
uint8_t rxfifo_full_thrhd
|
||||
) {
|
||||
if (uart_nr >= SOC_UART_NUM) {
|
||||
if (uart_nr >= SOC_UART_HP_NUM) {
|
||||
return false; // no new driver has to be installed
|
||||
}
|
||||
uart_t *uart = &_uart_bus_array[uart_nr];
|
||||
|
|
@ -699,24 +413,13 @@ uart_t *uartBegin(
|
|||
uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rxPin, int8_t txPin, uint32_t rx_buffer_size, uint32_t tx_buffer_size, bool inverted,
|
||||
uint8_t rxfifo_full_thrhd
|
||||
) {
|
||||
if (uart_nr >= SOC_UART_NUM) {
|
||||
log_e("UART number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1);
|
||||
if (uart_nr >= SOC_UART_HP_NUM) {
|
||||
log_e("UART number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1);
|
||||
return NULL; // no new driver was installed
|
||||
}
|
||||
uart_t *uart = &_uart_bus_array[uart_nr];
|
||||
log_v("UART%d baud(%ld) Mode(%x) rxPin(%d) txPin(%d)", uart_nr, baudrate, config, rxPin, txPin);
|
||||
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
// check if LP UART is being used and if the pins are valid
|
||||
if (!lpuartCheckPins(rxPin, txPin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, uart_nr)) {
|
||||
if (uart_is_driver_installed(uart_nr)) {
|
||||
return uart; // keep the same installed driver
|
||||
} else {
|
||||
return NULL; // no new driver was installed
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
if (uart->lock == NULL) {
|
||||
uart->lock = xSemaphoreCreateMutex();
|
||||
|
|
@ -733,18 +436,20 @@ uart_t *uartBegin(
|
|||
if (uart->_rx_buffer_size != rx_buffer_size || uart->_tx_buffer_size != tx_buffer_size || uart->_inverted != inverted
|
||||
|| uart->_rxfifo_full_thrhd != rxfifo_full_thrhd) {
|
||||
log_v("UART%d changing buffer sizes or inverted signal or rxfifo_full_thrhd. IDF driver will be restarted", uart_nr);
|
||||
log_v("RX buffer size: %d -> %d", uart->_rx_buffer_size, rx_buffer_size);
|
||||
log_v("TX buffer size: %d -> %d", uart->_tx_buffer_size, tx_buffer_size);
|
||||
log_v("Inverted signal: %s -> %s", uart->_inverted ? "true" : "false", inverted ? "true" : "false");
|
||||
log_v("RX FIFO full threshold: %d -> %d", uart->_rxfifo_full_thrhd, rxfifo_full_thrhd);
|
||||
uartEnd(uart_nr);
|
||||
} else {
|
||||
bool retCode = true;
|
||||
UART_MUTEX_LOCK();
|
||||
//User may just want to change some parameters, such as baudrate, data length, parity, stop bits or pins
|
||||
if (uart->_baudrate != baudrate) {
|
||||
retCode = uartSetBaudRate(uart, baudrate);
|
||||
if (ESP_OK != uart_set_baudrate(uart_nr, baudrate)) {
|
||||
log_e("UART%d changing baudrate failed.", uart_nr);
|
||||
retCode = false;
|
||||
} else {
|
||||
log_v("UART%d changed baudrate to %d", uart_nr, baudrate);
|
||||
uart->_baudrate = baudrate;
|
||||
}
|
||||
}
|
||||
UART_MUTEX_LOCK();
|
||||
uart_word_length_t data_bits = (config & 0xc) >> 2;
|
||||
uart_parity_t parity = config & 0x3;
|
||||
uart_stop_bits_t stop_bits = (config & 0x30) >> 4;
|
||||
|
|
@ -795,7 +500,7 @@ uart_t *uartBegin(
|
|||
}
|
||||
UART_MUTEX_UNLOCK();
|
||||
if (retCode) {
|
||||
// UART driver was already working, just return the uart_t structure, saying that no new driver was installed
|
||||
// UART driver was already working, just return the uart_t structure, syaing that no new driver was installed
|
||||
return uart;
|
||||
}
|
||||
// if we reach this point, it means that we need to restart the UART driver
|
||||
|
|
@ -811,49 +516,22 @@ uart_t *uartBegin(
|
|||
uart_config.parity = (config & 0x3);
|
||||
uart_config.stop_bits = (config & 0x30) >> 4;
|
||||
uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
|
||||
uart_config.rx_flow_ctrl_thresh = rxfifo_full_thrhd >= UART_HW_FIFO_LEN(uart_nr) ? UART_HW_FIFO_LEN(uart_nr) - 6 : rxfifo_full_thrhd;
|
||||
log_v(
|
||||
"UART%d RX FIFO full threshold set to %d (value requested: %d || FIFO Max = %d)", uart_nr, uart_config.rx_flow_ctrl_thresh, rxfifo_full_thrhd,
|
||||
UART_HW_FIFO_LEN(uart_nr)
|
||||
);
|
||||
rxfifo_full_thrhd = uart_config.rx_flow_ctrl_thresh; // makes sure that it will be set correctly in the struct
|
||||
uart_config.rx_flow_ctrl_thresh = rxfifo_full_thrhd;
|
||||
uart_config.baud_rate = baudrate;
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (uart_nr >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
if (uart->_uart_clock_source > 0) {
|
||||
uart_config.lp_source_clk = (soc_periph_lp_uart_clk_src_t)uart->_uart_clock_source; // use user defined LP UART clock
|
||||
log_v("Setting UART%d to user defined LP clock source (%d) ", uart_nr, uart->_uart_clock_source);
|
||||
} else {
|
||||
uart_config.lp_source_clk = LP_UART_SCLK_DEFAULT; // use default LP clock
|
||||
log_v("Setting UART%d to Default LP clock source", uart_nr);
|
||||
}
|
||||
} else
|
||||
#endif // SOC_UART_LP_NUM >= 1
|
||||
{
|
||||
if (uart->_uart_clock_source >= 0) {
|
||||
uart_config.source_clk = (soc_module_clk_t)uart->_uart_clock_source; // use user defined HP UART clock
|
||||
log_v("Setting UART%d to user defined HP clock source (%d) ", uart_nr, uart->_uart_clock_source);
|
||||
} else {
|
||||
// there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored
|
||||
// therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue.
|
||||
// there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored
|
||||
// therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue.
|
||||
#if SOC_UART_SUPPORT_XTAL_CLK
|
||||
uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4
|
||||
log_v("Setting UART%d to use XTAL clock", uart_nr);
|
||||
uart_config.source_clk = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4
|
||||
#elif SOC_UART_SUPPORT_REF_TICK
|
||||
if (baudrate <= REF_TICK_BAUDRATE_LIMIT) {
|
||||
uart_config.source_clk = UART_SCLK_REF_TICK; // valid for ESP32, S2 - MAX supported baud rate is 250 Kbps
|
||||
log_v("Setting UART%d to use REF_TICK clock", uart_nr);
|
||||
} else {
|
||||
uart_config.source_clk = UART_SCLK_APB; // baudrate may change with the APB Frequency!
|
||||
log_v("Setting UART%d to use APB clock", uart_nr);
|
||||
}
|
||||
#else
|
||||
// Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6|P4
|
||||
uart_config.source_clk = UART_SCLK_DEFAULT; // baudrate may change with the APB Frequency!
|
||||
log_v("Setting UART%d to use DEFAULT clock", uart_nr);
|
||||
#endif // SOC_UART_SUPPORT_XTAL_CLK
|
||||
}
|
||||
if (baudrate <= REF_TICK_BAUDRATE_LIMIT) {
|
||||
uart_config.source_clk = UART_SCLK_REF_TICK; // valid for ESP32, S2 - MAX supported baud rate is 250 Kbps
|
||||
} else {
|
||||
uart_config.source_clk = UART_SCLK_APB; // baudrate may change with the APB Frequency!
|
||||
}
|
||||
#else
|
||||
// Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6
|
||||
uart_config.source_clk = UART_SCLK_DEFAULT; // baudrate may change with the APB Frequency!
|
||||
#endif
|
||||
|
||||
UART_MUTEX_LOCK();
|
||||
bool retCode = ESP_OK == uart_driver_install(uart_nr, rx_buffer_size, tx_buffer_size, 20, &(uart->uart_event_queue), 0);
|
||||
|
|
@ -881,14 +559,6 @@ uart_t *uartBegin(
|
|||
uart->_tx_buffer_size = tx_buffer_size;
|
||||
uart->has_peek = false;
|
||||
uart->peek_byte = 0;
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (uart_nr >= SOC_UART_HP_NUM) {
|
||||
uart->_uart_clock_source = uart_config.lp_source_clk;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
uart->_uart_clock_source = uart_config.source_clk;
|
||||
}
|
||||
}
|
||||
UART_MUTEX_UNLOCK();
|
||||
|
||||
|
|
@ -930,11 +600,7 @@ bool uartSetRxTimeout(uart_t *uart, uint8_t numSymbTimeout) {
|
|||
if (uart == NULL) {
|
||||
return false;
|
||||
}
|
||||
uint16_t maxRXTimeout = uart_get_max_rx_timeout(uart->num);
|
||||
if (numSymbTimeout > maxRXTimeout) {
|
||||
log_e("Invalid RX Timeout value, its limit is %d", maxRXTimeout);
|
||||
return false;
|
||||
}
|
||||
|
||||
UART_MUTEX_LOCK();
|
||||
bool retCode = (ESP_OK == uart_set_rx_timeout(uart->num, numSymbTimeout));
|
||||
UART_MUTEX_UNLOCK();
|
||||
|
|
@ -945,25 +611,16 @@ bool uartSetRxFIFOFull(uart_t *uart, uint8_t numBytesFIFOFull) {
|
|||
if (uart == NULL) {
|
||||
return false;
|
||||
}
|
||||
uint8_t rxfifo_full_thrhd = numBytesFIFOFull >= UART_HW_FIFO_LEN(uart->num) ? UART_HW_FIFO_LEN(uart->num) - 6 : numBytesFIFOFull;
|
||||
|
||||
UART_MUTEX_LOCK();
|
||||
bool retCode = (ESP_OK == uart_set_rx_full_threshold(uart->num, rxfifo_full_thrhd));
|
||||
if (retCode) {
|
||||
uart->_rxfifo_full_thrhd = rxfifo_full_thrhd;
|
||||
if (rxfifo_full_thrhd != numBytesFIFOFull) {
|
||||
log_w("The RX FIFO Full value for UART%d was set to %d instead of %d", uart->num, rxfifo_full_thrhd, numBytesFIFOFull);
|
||||
}
|
||||
log_v("UART%d RX FIFO Full value set to %d from a requested value of %d", uart->num, rxfifo_full_thrhd, numBytesFIFOFull);
|
||||
} else {
|
||||
log_e("UART%d failed to set RX FIFO Full value to %d", uart->num, numBytesFIFOFull);
|
||||
}
|
||||
bool retCode = (ESP_OK == uart_set_rx_full_threshold(uart->num, numBytesFIFOFull));
|
||||
UART_MUTEX_UNLOCK();
|
||||
return retCode;
|
||||
}
|
||||
|
||||
void uartEnd(uint8_t uart_num) {
|
||||
if (uart_num >= SOC_UART_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_NUM - 1);
|
||||
if (uart_num >= SOC_UART_HP_NUM) {
|
||||
log_e("Serial number is invalid, please use number from 0 to %u", SOC_UART_HP_NUM - 1);
|
||||
return;
|
||||
}
|
||||
// get UART information
|
||||
|
|
@ -981,14 +638,14 @@ void uartSetRxInvert(uart_t *uart, bool invert) {
|
|||
if (uart == NULL) {
|
||||
return;
|
||||
}
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4 || CONFIG_IDF_TARGET_ESP32C5
|
||||
#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32P4
|
||||
// POTENTIAL ISSUE :: original code only set/reset rxd_inv bit
|
||||
// IDF or LL set/reset the whole inv_mask!
|
||||
// if (invert)
|
||||
// ESP_ERROR_CHECK(uart_set_line_inverse(uart->num, UART_SIGNAL_RXD_INV));
|
||||
// else
|
||||
// ESP_ERROR_CHECK(uart_set_line_inverse(uart->num, UART_SIGNAL_INV_DISABLE));
|
||||
log_e("uartSetRxInvert is not supported in ESP32C6, ESP32H2 and ESP32P4");
|
||||
|
||||
#else
|
||||
// this implementation is better over IDF API because it only affects RXD
|
||||
// this is supported in ESP32, ESP32-S2 and ESP32-C3
|
||||
|
|
@ -1143,66 +800,21 @@ void uartFlushTxOnly(uart_t *uart, bool txOnly) {
|
|||
UART_MUTEX_UNLOCK();
|
||||
}
|
||||
|
||||
bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate) {
|
||||
void uartSetBaudRate(uart_t *uart, uint32_t baud_rate) {
|
||||
if (uart == NULL) {
|
||||
return false;
|
||||
}
|
||||
bool retCode = true;
|
||||
soc_module_clk_t newClkSrc = UART_SCLK_DEFAULT;
|
||||
int8_t previousClkSrc = uart->_uart_clock_source;
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (uart->num >= SOC_UART_HP_NUM) { // it is a LP UART NUM
|
||||
if (uart->_uart_clock_source > 0) {
|
||||
newClkSrc = (soc_periph_lp_uart_clk_src_t)uart->_uart_clock_source; // use user defined LP UART clock
|
||||
log_v("Setting UART%d to user defined LP clock source (%d) ", uart->num, newClkSrc);
|
||||
} else {
|
||||
newClkSrc = LP_UART_SCLK_DEFAULT; // use default LP clock
|
||||
log_v("Setting UART%d to Default LP clock source", uart->num);
|
||||
}
|
||||
} else
|
||||
#endif // SOC_UART_LP_NUM >= 1
|
||||
{
|
||||
if (uart->_uart_clock_source >= 0) {
|
||||
newClkSrc = (soc_module_clk_t)uart->_uart_clock_source; // use user defined HP UART clock
|
||||
log_v("Setting UART%d to use HP clock source (%d) ", uart->num, newClkSrc);
|
||||
} else {
|
||||
// there is an issue when returning from light sleep with the C6 and H2: the uart baud rate is not restored
|
||||
// therefore, uart clock source will set to XTAL for all SoC that support it. This fix solves the C6|H2 issue.
|
||||
#if SOC_UART_SUPPORT_XTAL_CLK
|
||||
newClkSrc = UART_SCLK_XTAL; // valid for C2, S3, C3, C6, H2 and P4
|
||||
log_v("Setting UART%d to use XTAL clock", uart->num);
|
||||
#elif SOC_UART_SUPPORT_REF_TICK
|
||||
if (baud_rate <= REF_TICK_BAUDRATE_LIMIT) {
|
||||
newClkSrc = UART_SCLK_REF_TICK; // valid for ESP32, S2 - MAX supported baud rate is 250 Kbps
|
||||
log_v("Setting UART%d to use REF_TICK clock", uart->num);
|
||||
} else {
|
||||
newClkSrc = UART_SCLK_APB; // baudrate may change with the APB Frequency!
|
||||
log_v("Setting UART%d to use APB clock", uart->num);
|
||||
}
|
||||
#else
|
||||
// Default CLK Source: CLK_APB for ESP32|S2|S3|C3 -- CLK_PLL_F40M for C2 -- CLK_PLL_F48M for H2 -- CLK_PLL_F80M for C6|P4
|
||||
// using newClkSrc = UART_SCLK_DEFAULT as defined in the variable declaration
|
||||
log_v("Setting UART%d to use DEFAULT clock", uart->num);
|
||||
#endif // SOC_UART_SUPPORT_XTAL_CLK
|
||||
}
|
||||
return;
|
||||
}
|
||||
UART_MUTEX_LOCK();
|
||||
// if necessary, set the correct UART Clock Source before changing the baudrate
|
||||
if (previousClkSrc < 0 || previousClkSrc != newClkSrc) {
|
||||
HP_UART_SRC_CLK_ATOMIC() {
|
||||
uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc);
|
||||
}
|
||||
uart->_uart_clock_source = newClkSrc;
|
||||
}
|
||||
#if !SOC_UART_SUPPORT_XTAL_CLK
|
||||
soc_module_clk_t newClkSrc = baud_rate <= REF_TICK_BAUDRATE_LIMIT ? SOC_MOD_CLK_REF_TICK : SOC_MOD_CLK_APB;
|
||||
uart_ll_set_sclk(UART_LL_GET_HW(uart->num), newClkSrc);
|
||||
#endif
|
||||
if (uart_set_baudrate(uart->num, baud_rate) == ESP_OK) {
|
||||
log_v("Setting UART%d baud rate to %ld.", uart->num, baud_rate);
|
||||
uart->_baudrate = baud_rate;
|
||||
} else {
|
||||
retCode = false;
|
||||
log_e("Setting UART%d baud rate to %ld has failed.", uart->num, baud_rate);
|
||||
log_e("Setting UART%d baud rate to %d has failed.", uart->num, baud_rate);
|
||||
}
|
||||
UART_MUTEX_UNLOCK();
|
||||
return retCode;
|
||||
}
|
||||
|
||||
uint32_t uartGetBaudRate(uart_t *uart) {
|
||||
|
|
@ -1277,7 +889,7 @@ void uart_install_putc() {
|
|||
// Routines that take care of UART mode in the HardwareSerial Class code
|
||||
// used to set UART_MODE_RS485_HALF_DUPLEX auto RTS for TXD for ESP32 chips
|
||||
bool uartSetMode(uart_t *uart, uart_mode_t mode) {
|
||||
if (uart == NULL || uart->num >= SOC_UART_NUM) {
|
||||
if (uart == NULL || uart->num >= SOC_UART_HP_NUM) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1287,37 +899,7 @@ bool uartSetMode(uart_t *uart, uart_mode_t mode) {
|
|||
return retCode;
|
||||
}
|
||||
|
||||
// this function will set the uart clock source
|
||||
// it must be called before uartBegin(), otherwise it won't change any thing.
|
||||
bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc) {
|
||||
if (uartNum >= SOC_UART_NUM) {
|
||||
log_e("UART%d is invalid. This device has %d UARTs, from 0 to %d.", uartNum, SOC_UART_NUM, SOC_UART_NUM - 1);
|
||||
return false;
|
||||
}
|
||||
uart_t *uart = &_uart_bus_array[uartNum];
|
||||
#if SOC_UART_LP_NUM >= 1
|
||||
if (uart->num >= SOC_UART_HP_NUM) {
|
||||
switch (clkSrc) {
|
||||
case UART_SCLK_XTAL: uart->_uart_clock_source = LP_UART_SCLK_XTAL_D2; break;
|
||||
#if CONFIG_IDF_TARGET_ESP32C5
|
||||
case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_RC_FAST; break;
|
||||
#else
|
||||
case UART_SCLK_RTC: uart->_uart_clock_source = LP_UART_SCLK_LP_FAST; break;
|
||||
#endif
|
||||
case UART_SCLK_DEFAULT:
|
||||
default: uart->_uart_clock_source = LP_UART_SCLK_DEFAULT;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
uart->_uart_clock_source = clkSrc;
|
||||
}
|
||||
//log_i("UART%d set clock source to %d", uart->num, uart->_uart_clock_source);
|
||||
return true;
|
||||
}
|
||||
|
||||
void uartSetDebug(uart_t *uart) {
|
||||
// LP UART is not supported for debug
|
||||
if (uart == NULL || uart->num >= SOC_UART_HP_NUM) {
|
||||
s_uart_debug_nr = -1;
|
||||
} else {
|
||||
|
|
@ -1344,7 +926,7 @@ int log_printfv(const char *format, va_list arg) {
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
/*
|
||||
// This causes dead locks with logging in specific cases and also with C++ constructors that may send logs
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
if(s_uart_debug_nr != -1 && _uart_bus_array[s_uart_debug_nr].lock){
|
||||
|
|
@ -1352,8 +934,16 @@ int log_printfv(const char *format, va_list arg) {
|
|||
}
|
||||
#endif
|
||||
*/
|
||||
#if (ARDUINO_USB_CDC_ON_BOOT == 1 && ARDUINO_USB_MODE == 0) || CONFIG_IDF_TARGET_ESP32C3 \
|
||||
|| ((CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4) && ARDUINO_USB_CDC_ON_BOOT == 1)
|
||||
vsnprintf(temp, len + 1, format, arg);
|
||||
ets_printf("%s", temp);
|
||||
#else
|
||||
int wlen = vsnprintf(temp, len + 1, format, arg);
|
||||
for (int i = 0; i < wlen; i++) {
|
||||
ets_write_char_uart(temp[i]);
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
// This causes dead locks with logging and also with constructors that may send logs
|
||||
#if !CONFIG_DISABLE_HAL_LOCKS
|
||||
|
|
@ -1541,28 +1131,49 @@ unsigned long uartDetectBaudrate(uart_t *uart) {
|
|||
}
|
||||
|
||||
/*
|
||||
* These functions are for testing purposes only and can be used in Arduino Sketches.
|
||||
* They are utilized in the UART examples and CI.
|
||||
*/
|
||||
These functions are for testing purpose only and can be used in Arduino Sketches
|
||||
Those are used in the UART examples
|
||||
*/
|
||||
|
||||
/*
|
||||
This is intended to make an internal loopback connection using IOMUX
|
||||
The function uart_internal_loopback() shall be used right after Arduino Serial.begin(...)
|
||||
This code "replaces" the physical wiring for connecting TX <--> RX in a loopback
|
||||
*/
|
||||
|
||||
// gets the right TX or RX SIGNAL, based on the UART number from gpio_sig_map.h
|
||||
#ifdef CONFIG_IDF_TARGET_ESP32P4
|
||||
#define UART_TX_SIGNAL(uartNumber) \
|
||||
(uartNumber == UART_NUM_0 \
|
||||
? UART0_TXD_PAD_OUT_IDX \
|
||||
: (uartNumber == UART_NUM_1 \
|
||||
? UART1_TXD_PAD_OUT_IDX \
|
||||
: (uartNumber == UART_NUM_2 ? UART2_TXD_PAD_OUT_IDX : (uartNumber == UART_NUM_3 ? UART3_TXD_PAD_OUT_IDX : UART4_TXD_PAD_OUT_IDX))))
|
||||
#define UART_RX_SIGNAL(uartNumber) \
|
||||
(uartNumber == UART_NUM_0 \
|
||||
? UART0_RXD_PAD_IN_IDX \
|
||||
: (uartNumber == UART_NUM_1 \
|
||||
? UART1_RXD_PAD_IN_IDX \
|
||||
: (uartNumber == UART_NUM_2 ? UART2_RXD_PAD_IN_IDX : (uartNumber == UART_NUM_3 ? UART3_RXD_PAD_IN_IDX : UART4_RXD_PAD_IN_IDX))))
|
||||
#else
|
||||
#if SOC_UART_HP_NUM > 2
|
||||
#define UART_TX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0TXD_OUT_IDX : (uartNumber == UART_NUM_1 ? U1TXD_OUT_IDX : U2TXD_OUT_IDX))
|
||||
#define UART_RX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0RXD_IN_IDX : (uartNumber == UART_NUM_1 ? U1RXD_IN_IDX : U2RXD_IN_IDX))
|
||||
#else
|
||||
#define UART_TX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0TXD_OUT_IDX : U1TXD_OUT_IDX)
|
||||
#define UART_RX_SIGNAL(uartNumber) (uartNumber == UART_NUM_0 ? U0RXD_IN_IDX : U1RXD_IN_IDX)
|
||||
#endif
|
||||
#endif // ifdef CONFIG_IDF_TARGET_ESP32P4
|
||||
|
||||
/*
|
||||
This function internally binds defined UARTs TX signal with defined RX pin of any UART (same or different).
|
||||
This creates a loop that lets us receive anything we send on the UART without external wires.
|
||||
*/
|
||||
void uart_internal_loopback(uint8_t uartNum, int8_t rxPin) {
|
||||
// LP UART is not supported for loopback
|
||||
if (uartNum >= SOC_UART_HP_NUM || !GPIO_IS_VALID_GPIO(rxPin)) {
|
||||
log_e("UART%d is not supported for loopback or RX pin %d is invalid.", uartNum, rxPin);
|
||||
if (uartNum > SOC_UART_HP_NUM - 1 || !GPIO_IS_VALID_GPIO(rxPin)) {
|
||||
return;
|
||||
}
|
||||
#if 0 // leave this code here for future reference and need
|
||||
// forces rxPin to use GPIO Matrix and setup the pin to receive UART TX Signal - IDF 5.4.1 Change with uart_release_pin()
|
||||
gpio_func_sel((gpio_num_t)rxPin, PIN_FUNC_GPIO);
|
||||
gpio_pullup_en((gpio_num_t)rxPin);
|
||||
gpio_input_enable((gpio_num_t)rxPin);
|
||||
esp_rom_gpio_connect_in_signal(rxPin, uart_periph_signal[uartNum].pins[SOC_UART_RX_PIN_IDX].signal, false);
|
||||
#endif
|
||||
esp_rom_gpio_connect_out_signal(rxPin, uart_periph_signal[uartNum].pins[SOC_UART_TX_PIN_IDX].signal, false, false);
|
||||
esp_rom_gpio_connect_out_signal(rxPin, UART_TX_SIGNAL(uartNum), false, false);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1587,24 +1198,4 @@ int uart_send_msg_with_break(uint8_t uartNum, uint8_t *msg, size_t msgSize) {
|
|||
return uart_write_bytes_with_break(uartNum, (const void *)msg, msgSize, 12);
|
||||
}
|
||||
|
||||
// returns the maximum valid uart RX Timeout based on the UART Source Clock and Baudrate
|
||||
uint16_t uart_get_max_rx_timeout(uint8_t uartNum) {
|
||||
if (uartNum >= SOC_UART_NUM) {
|
||||
log_e("UART%d is invalid. This device has %d UARTs, from 0 to %d.", uartNum, SOC_UART_NUM, SOC_UART_NUM - 1);
|
||||
return (uint16_t)-1;
|
||||
}
|
||||
uint16_t tout_max_thresh = uart_ll_max_tout_thrd(UART_LL_GET_HW(uartNum));
|
||||
uint8_t symbol_len = 1; // number of bits per symbol including start
|
||||
uart_parity_t parity_mode;
|
||||
uart_stop_bits_t stop_bit;
|
||||
uart_word_length_t data_bit;
|
||||
uart_ll_get_data_bit_num(UART_LL_GET_HW(uartNum), &data_bit);
|
||||
uart_ll_get_stop_bits(UART_LL_GET_HW(uartNum), &stop_bit);
|
||||
uart_ll_get_parity(UART_LL_GET_HW(uartNum), &parity_mode);
|
||||
symbol_len += (data_bit < UART_DATA_BITS_MAX) ? (uint8_t)data_bit + 5 : 8;
|
||||
symbol_len += (stop_bit > UART_STOP_BITS_1) ? 2 : 1;
|
||||
symbol_len += (parity_mode > UART_PARITY_DISABLE) ? 1 : 0;
|
||||
return (uint16_t)(tout_max_thresh / symbol_len);
|
||||
}
|
||||
|
||||
#endif /* SOC_UART_SUPPORTED */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright 2015-2025 Espressif Systems (Shanghai) PTE LTD
|
||||
// Copyright 2015-2023 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
#include "soc/soc_caps.h"
|
||||
#if SOC_UART_SUPPORTED
|
||||
#include "soc/uart_pins.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
@ -58,7 +57,7 @@ void uartWriteBuf(uart_t *uart, const uint8_t *data, size_t len);
|
|||
void uartFlush(uart_t *uart);
|
||||
void uartFlushTxOnly(uart_t *uart, bool txOnly);
|
||||
|
||||
bool uartSetBaudRate(uart_t *uart, uint32_t baud_rate);
|
||||
void uartSetBaudRate(uart_t *uart, uint32_t baud_rate);
|
||||
uint32_t uartGetBaudRate(uart_t *uart);
|
||||
|
||||
void uartSetRxInvert(uart_t *uart, bool invert);
|
||||
|
|
@ -97,19 +96,6 @@ bool uartSetHwFlowCtrlMode(uart_t *uart, uart_hw_flowcontrol_t mode, uint8_t thr
|
|||
// UART_MODE_RS485_APP_CTRL = 0x04 mode: application control RS485 UART mode (used for test purposes)
|
||||
bool uartSetMode(uart_t *uart, uart_mode_t mode);
|
||||
|
||||
// Used to set the UART clock source mode. It must be set before calling uartBegin(), otherwise it won't have any effect.
|
||||
// Not all clock source are available to every SoC. The compatible option are listed here:
|
||||
// UART_SCLK_DEFAULT :: any SoC - it will set whatever IDF defines as the default UART Clock Source
|
||||
// UART_SCLK_APB :: ESP32, ESP32-S2, ESP32-C3 and ESP32-S3
|
||||
// UART_SCLK_PLL_F80M :: ESP32-C5, ESP32-C6, ESP32-C61 and ESP32-P4
|
||||
// UART_SCLK_PLL_F40M :: ESP32-C2
|
||||
// UART_SCLK_PLL_F48M :: ESP32-H2
|
||||
// UART_SCLK_XTAL :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4
|
||||
// UART_SCLK_RTC :: ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2, ESP32-S3 and ESP32-P4
|
||||
// UART_SCLK_REF_TICK :: ESP32 and ESP32-S2
|
||||
// Note: ESP32-C6, C61, ESP32-P4 and ESP32-C5 have LP UART that will use only LP_UART_SCLK_LP_FAST (RTC_FAST) or LP_UART_SCLK_XTAL_D2 (XTAL/2) as Clock Source
|
||||
bool uartSetClockSource(uint8_t uartNum, uart_sclk_t clkSrc);
|
||||
|
||||
void uartStartDetectBaudrate(uart_t *uart);
|
||||
unsigned long uartDetectBaudrate(uart_t *uart);
|
||||
|
||||
|
|
@ -129,10 +115,6 @@ void uart_send_break(uint8_t uartNum);
|
|||
// Sends a buffer and at the end of the stream, it generates BREAK in the line
|
||||
int uart_send_msg_with_break(uint8_t uartNum, uint8_t *msg, size_t msgSize);
|
||||
|
||||
// UART RX Timeout (in UART Symbols) depends on the UART Clock Source and the SoC that is used
|
||||
// This is a helper function that calculates what is the maximum RX Timeout that a running UART IDF driver allows.
|
||||
uint16_t uart_get_max_rx_timeout(uint8_t uartNum);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -121,11 +121,11 @@ void feedLoopWDT();
|
|||
|
||||
//enable/disable WDT for the IDLE task on Core 0 (SYSTEM)
|
||||
void enableCore0WDT();
|
||||
bool disableCore0WDT();
|
||||
void disableCore0WDT();
|
||||
#ifndef CONFIG_FREERTOS_UNICORE
|
||||
//enable/disable WDT for the IDLE task on Core 1 (Arduino)
|
||||
void enableCore1WDT();
|
||||
bool disableCore1WDT();
|
||||
void disableCore1WDT();
|
||||
#endif
|
||||
|
||||
//if xCoreID < 0 or CPU is unicore, it will use xTaskCreate, else xTaskCreatePinnedToCore
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ extern "C" {
|
|||
/** Major version number (X.x.x) */
|
||||
#define ESP_ARDUINO_VERSION_MAJOR 3
|
||||
/** Minor version number (x.X.x) */
|
||||
#define ESP_ARDUINO_VERSION_MINOR 3
|
||||
#define ESP_ARDUINO_VERSION_MINOR 1
|
||||
/** Patch version number (x.x.X) */
|
||||
#define ESP_ARDUINO_VERSION_PATCH 0
|
||||
|
||||
|
|
|
|||
|
|
@ -31,8 +31,7 @@ void printRunningTasks(Print &printer) {
|
|||
#endif
|
||||
configRUN_TIME_COUNTER_TYPE ulTotalRunTime = 0;
|
||||
TaskStatus_t *pxTaskStatusArray = NULL;
|
||||
volatile UBaseType_t uxArraySize = 0;
|
||||
uint32_t x = 0;
|
||||
volatile UBaseType_t uxArraySize = 0, x = 0;
|
||||
const char *taskStates[] = {"Running", "Ready", "Blocked", "Suspended", "Deleted", "Invalid"};
|
||||
|
||||
// Take a snapshot of the number of tasks in case it changes while this function is executing.
|
||||
|
|
|
|||
|
|
@ -2,12 +2,6 @@
|
|||
|
||||
from esp_docs.conf_docs import * # noqa: F403,F401
|
||||
|
||||
# Used for substituting variables in the documentation
|
||||
rst_prolog = """
|
||||
.. |version| replace:: 3.3.0
|
||||
.. |idf_version| replace:: 5.5
|
||||
"""
|
||||
|
||||
languages = ["en"]
|
||||
|
||||
# idf_targets = [
|
||||
|
|
@ -33,7 +27,6 @@ html_static_path = ["../_static"]
|
|||
extensions += [ # noqa: F405
|
||||
"sphinx_copybutton",
|
||||
"sphinx_tabs.tabs",
|
||||
"sphinx_substitution_extensions", # For allowing substitutions inside code blocks
|
||||
"esp_docs.esp_extensions.dummy_build_system",
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -347,147 +347,20 @@ This function will return ``true`` if the peripheral was initialized correctly.
|
|||
onReceive
|
||||
^^^^^^^^^
|
||||
|
||||
The ``onReceive`` function is used to define the callback for data received from the master device.
|
||||
The ``onReceive`` function is used to define the callback for the data received from the master.
|
||||
|
||||
.. code-block:: arduino
|
||||
|
||||
void onReceive(const std::function<void(int)>& callback);
|
||||
|
||||
**Function Signature:**
|
||||
|
||||
The callback function must have the signature ``void(int numBytes)`` where ``numBytes`` indicates how many bytes were received from the master.
|
||||
|
||||
**Usage Examples:**
|
||||
|
||||
.. code-block:: arduino
|
||||
|
||||
// Method 1: Regular function
|
||||
void handleReceive(int numBytes) {
|
||||
Serial.printf("Received %d bytes: ", numBytes);
|
||||
while (Wire.available()) {
|
||||
char c = Wire.read();
|
||||
Serial.print(c);
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
Wire.onReceive(handleReceive);
|
||||
|
||||
// Method 2: Lambda function
|
||||
Wire.onReceive([](int numBytes) {
|
||||
Serial.printf("Master sent %d bytes\n", numBytes);
|
||||
while (Wire.available()) {
|
||||
uint8_t data = Wire.read();
|
||||
// Process received data
|
||||
Serial.printf("Data: 0x%02X\n", data);
|
||||
}
|
||||
});
|
||||
|
||||
// Method 3: Lambda with capture (for accessing variables)
|
||||
int deviceId = 42;
|
||||
Wire.onReceive([deviceId](int numBytes) {
|
||||
Serial.printf("Device %d received %d bytes\n", deviceId, numBytes);
|
||||
// Process data...
|
||||
});
|
||||
|
||||
// Method 4: Using std::function variable
|
||||
std::function<void(int)> receiveHandler = [](int bytes) {
|
||||
Serial.printf("Handling %d received bytes\n", bytes);
|
||||
};
|
||||
Wire.onReceive(receiveHandler);
|
||||
|
||||
// Method 5: Class member function (using lambda wrapper)
|
||||
class I2CDevice {
|
||||
private:
|
||||
int deviceAddress;
|
||||
public:
|
||||
I2CDevice(int addr) : deviceAddress(addr) {}
|
||||
|
||||
void handleReceive(int numBytes) {
|
||||
Serial.printf("Device 0x%02X received %d bytes\n", deviceAddress, numBytes);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Wire.onReceive([this](int bytes) {
|
||||
this->handleReceive(bytes);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
.. note::
|
||||
The ``onReceive`` callback is triggered when the I2C master sends data to this slave device.
|
||||
Use ``Wire.available()`` and ``Wire.read()`` inside the callback to retrieve the received data.
|
||||
void onReceive( void (*)(int) );
|
||||
|
||||
onRequest
|
||||
^^^^^^^^^
|
||||
|
||||
The ``onRequest`` function is used to define the callback for responding to master read requests.
|
||||
The ``onRequest`` function is used to define the callback for the data to be send to the master.
|
||||
|
||||
.. code-block:: arduino
|
||||
|
||||
void onRequest(const std::function<void()>& callback);
|
||||
|
||||
**Function Signature:**
|
||||
|
||||
The callback function must have the signature ``void()`` with no parameters. This callback is triggered when the master requests data from this slave device.
|
||||
|
||||
**Usage Examples:**
|
||||
|
||||
.. code-block:: arduino
|
||||
|
||||
// Method 1: Regular function
|
||||
void handleRequest() {
|
||||
static int counter = 0;
|
||||
Wire.printf("Response #%d", counter++);
|
||||
}
|
||||
Wire.onRequest(handleRequest);
|
||||
|
||||
// Method 2: Lambda function
|
||||
Wire.onRequest([]() {
|
||||
// Send sensor data to master
|
||||
int sensorValue = analogRead(A0);
|
||||
Wire.write(sensorValue >> 8); // High byte
|
||||
Wire.write(sensorValue & 0xFF); // Low byte
|
||||
});
|
||||
|
||||
// Method 3: Lambda with capture (for accessing variables)
|
||||
int deviceStatus = 1;
|
||||
String deviceName = "Sensor1";
|
||||
Wire.onRequest([&deviceStatus, &deviceName]() {
|
||||
Wire.write(deviceStatus);
|
||||
Wire.write(deviceName.c_str(), deviceName.length());
|
||||
});
|
||||
|
||||
// Method 4: Using std::function variable
|
||||
std::function<void()> requestHandler = []() {
|
||||
Wire.write("Hello Master!");
|
||||
};
|
||||
Wire.onRequest(requestHandler);
|
||||
|
||||
// Method 5: Class member function (using lambda wrapper)
|
||||
class TemperatureSensor {
|
||||
private:
|
||||
float temperature;
|
||||
public:
|
||||
void updateTemperature() {
|
||||
temperature = 25.5; // Read from actual sensor
|
||||
}
|
||||
|
||||
void sendTemperature() {
|
||||
// Convert float to bytes and send
|
||||
uint8_t* tempBytes = (uint8_t*)&temperature;
|
||||
Wire.write(tempBytes, sizeof(float));
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Wire.onRequest([this]() {
|
||||
this->sendTemperature();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
.. note::
|
||||
The ``onRequest`` callback is triggered when the I2C master requests data from this slave device.
|
||||
Use ``Wire.write()`` inside the callback to send response data back to the master.
|
||||
void onRequest( void (*)(void) );
|
||||
|
||||
slaveWrite
|
||||
^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -18,18 +18,16 @@ The ESP32 is divided by family:
|
|||
|
||||
* ESP32
|
||||
* Wi-Fi, BT and BLE 4
|
||||
* ESP32-S2
|
||||
* Wi-Fi only
|
||||
* ESP32-S3
|
||||
* Wi-Fi and BLE 5
|
||||
* ESP32-C3
|
||||
* Wi-Fi and BLE 5
|
||||
* ESP32-C6
|
||||
* Wi-Fi, BLE 5 and IEEE 802.15.4
|
||||
* ESP32-H2
|
||||
* BLE 5 and IEEE 802.15.4
|
||||
* ESP32-P4
|
||||
* 400 MHz Dual Core RISC-V CPU, 40 MHz ULP Co-processor, single-precision FPU and AI extensions.
|
||||
* ESP32-S2
|
||||
* Wi-Fi only
|
||||
* ESP32-S3
|
||||
* Wi-Fi and BLE 5
|
||||
|
||||
For each family, we have SoC variants with some differentiation. The differences are more about the embedded flash and its size and the number of the cores (dual or single).
|
||||
|
||||
|
|
|
|||
|
|
@ -2,20 +2,16 @@ Datasheet
|
|||
---------
|
||||
|
||||
* `ESP32`_ (Datasheet)
|
||||
* `ESP32-C2`_ (Datasheet)
|
||||
* `ESP32-S2`_ (Datasheet)
|
||||
* `ESP32-C3`_ (Datasheet)
|
||||
* `ESP32-S3`_ (Datasheet)
|
||||
* `ESP32-C6`_ (Datasheet)
|
||||
* `ESP32-H2`_ (Datasheet)
|
||||
* `ESP32-P4`_ (Datasheet)
|
||||
* `ESP32-S2`_ (Datasheet)
|
||||
* `ESP32-S3`_ (Datasheet)
|
||||
|
||||
.. _Espressif Product Selector: https://products.espressif.com/
|
||||
.. _ESP32: https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
|
||||
.. _ESP32-C2: https://www.espressif.com/sites/default/files/documentation/esp8684_datasheet_en.pdf
|
||||
.. _ESP32-S2: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf
|
||||
.. _ESP32-C3: https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf
|
||||
.. _ESP32-S3: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf
|
||||
.. _ESP32-C6: https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf
|
||||
.. _ESP32-H2: https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf
|
||||
.. _ESP32-P4: https://www.espressif.com/sites/default/files/documentation/esp32-p4_datasheet_en.pdf
|
||||
.. _ESP32-S2: https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf
|
||||
.. _ESP32-S3: https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf
|
||||
|
|
|
|||
|
|
@ -15,9 +15,6 @@ Before Contributing
|
|||
|
||||
Before sending us a Pull Request, please consider this:
|
||||
|
||||
* All contributions must be written in English to ensure effective communication and support.
|
||||
Pull Requests written in other languages will be closed, with a request to rewrite them in English.
|
||||
|
||||
* Is the contribution entirely your own work, or is it already licensed under an LGPL 2.1 compatible Open Source License?
|
||||
If not, cannot accept it.
|
||||
|
||||
|
|
@ -222,7 +219,7 @@ Documentation
|
|||
-------------
|
||||
|
||||
If you are contributing to the documentation, please follow the instructions described in the
|
||||
`documentation guidelines <guides/docs_contributing.html>`_ to properly format and test your changes.
|
||||
`documentation guidelines <guides/docs_contributing>`_ to properly format and test your changes.
|
||||
|
||||
Testing and CI
|
||||
--------------
|
||||
|
|
@ -321,7 +318,7 @@ ESP32-C3 target, you would run:
|
|||
|
||||
./.github/scripts/tests_build.sh -s uart -t esp32c3
|
||||
|
||||
You should see the output of the build process and the test binary should be generated in the ``~/.arduino/tests/<target_chip>/<test_name>/build.tmp`` folder.
|
||||
You should see the output of the build process and the test binary should be generated in the ``~/.arduino/tests/<test_name>/build.tmp`` folder.
|
||||
|
||||
Now that the test is built, you can run it in the target board. Connect the target board to your computer and run:
|
||||
|
||||
|
|
@ -342,7 +339,7 @@ The test will run on the target board and you should see the output of the test
|
|||
lucassvaz@Lucas--MacBook-Pro esp32 % ./.github/scripts/tests_run.sh -s uart -t esp32c3
|
||||
Sketch uart test type: validation
|
||||
Running test: uart -- Config: Default
|
||||
pytest tests --build-dir /Users/lucassvaz/.arduino/tests/esp32c3/uart/build.tmp -k test_uart --junit-xml=/Users/lucassvaz/Espressif/Arduino/hardware/espressif/esp32/tests/validation/uart/esp32c3/uart.xml --embedded-services esp,arduino
|
||||
pytest tests --build-dir /Users/lucassvaz/.arduino/tests/uart/build.tmp -k test_uart --junit-xml=/Users/lucassvaz/Espressif/Arduino/hardware/espressif/esp32/tests/validation/uart/esp32c3/uart.xml --embedded-services esp,arduino
|
||||
=============================================================================================== test session starts ================================================================================================
|
||||
platform darwin -- Python 3.12.3, pytest-8.2.2, pluggy-1.5.0
|
||||
rootdir: /Users/lucassvaz/Espressif/Arduino/hardware/espressif/esp32/tests
|
||||
|
|
@ -435,7 +432,7 @@ Documentation Checks
|
|||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The CI also checks the documentation for any compilation errors. This is important to ensure that the documentation layout is not broken.
|
||||
To build the documentation locally, please refer to the `documentation guidelines <guides/docs_contributing.html>`_.
|
||||
To build the documentation locally, please refer to the `documentation guidelines <guides/docs_contributing>`_.
|
||||
|
||||
Code Style Checks
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -14,9 +14,9 @@ For a simplified method, see `Installing using Boards Manager <https://docs.espr
|
|||
If you plan to use these modified settings multiple times, for different projects and targets, you can recompile the Arduino core with the new settings using the Arduino Static Library Builder.
|
||||
For more information, see the `Lib Builder documentation <lib_builder.html>`_.
|
||||
|
||||
.. note:: Latest Arduino Core ESP32 version (|version|) is now compatible with ESP-IDF v\ |idf_version|\ . Please consider this compatibility when using Arduino as a component in ESP-IDF.
|
||||
.. note:: Latest Arduino Core ESP32 version (3.0.X) is now compatible with `ESP-IDF v5.1 <https://github.com/espressif/esp-idf/tree/release/v5.1>`_. Please consider this compatibility when using Arduino as a component in ESP-IDF.
|
||||
|
||||
For easiest use of Arduino framework as a ESP-IDF component, you can use the `IDF Component Manager <https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html>`_ to add the Arduino component to your project.
|
||||
For easiest use of Arduino framework as a ESP-IDF component, you can use the `IDF Component Manager <https://docs.espressif.com/projects/esp-idf/en/v5.1.4/esp32/api-guides/tools/idf-component-manager.html>`_ to add the Arduino component to your project.
|
||||
This will automatically clone the repository and its submodules. You can find the Arduino component in the `ESP Registry <https://components.espressif.com/components/espressif/arduino-esp32>`_ together with dependencies list and examples.
|
||||
|
||||
Installation
|
||||
|
|
@ -32,16 +32,14 @@ Installing using IDF Component Manager
|
|||
To add the Arduino component to your project using the IDF Component Manager, run the following command in your project directory:
|
||||
|
||||
.. code-block:: bash
|
||||
:substitutions:
|
||||
|
||||
idf.py add-dependency "espressif/arduino-esp32^|version|"
|
||||
idf.py add-dependency "espressif/arduino-esp32^3.0.2"
|
||||
|
||||
Or you can start a new project from a template with the Arduino component:
|
||||
|
||||
.. code-block:: bash
|
||||
:substitutions:
|
||||
|
||||
idf.py create-project-from-example "espressif/arduino-esp32^|version|:hello_world"
|
||||
idf.py create-project-from-example "espressif/arduino-esp32^3.0.2:hello_world"
|
||||
|
||||
Manual installation of Arduino framework
|
||||
****************************************
|
||||
|
|
|
|||
|
|
@ -38,18 +38,17 @@ Here are the ESP32 series supported by the Arduino-ESP32 project:
|
|||
SoC Stable Development Datasheet
|
||||
========== ====== =========== =================================
|
||||
ESP32 Yes Yes `ESP32`_
|
||||
ESP32-S2 Yes Yes `ESP32-S2`_
|
||||
ESP32-C3 Yes Yes `ESP32-C3`_
|
||||
ESP32-S3 Yes Yes `ESP32-S3`_
|
||||
ESP32-C6 Yes Yes `ESP32-C6`_
|
||||
ESP32-H2 Yes Yes `ESP32-H2`_
|
||||
ESP32-P4 Yes Yes `ESP32-P4`_
|
||||
ESP32-S2 Yes Yes `ESP32-S2`_
|
||||
ESP32-S3 Yes Yes `ESP32-S3`_
|
||||
========== ====== =========== =================================
|
||||
|
||||
.. note::
|
||||
ESP32-C2 is also supported by Arduino-ESP32 but requires using Arduino as an ESP-IDF component or rebuilding the static libraries.
|
||||
For more information, see the `Arduino as an ESP-IDF component documentation <esp-idf_component.html>`_ or the
|
||||
`Lib Builder documentation <lib_builder.html>`_, respectively.
|
||||
ESP32-C2 is also supported by Arduino-ESP32 but requires rebuilding the static libraries.
|
||||
This is not trivial and requires a good understanding of the ESP-IDF build system.
|
||||
For more information, see the `Lib Builder documentation <lib_builder.html>`_.
|
||||
|
||||
See `Boards <boards/boards.html>`_ for more details about ESP32 development boards.
|
||||
|
||||
|
|
@ -103,8 +102,7 @@ Here are some community channels where you may find information and ask for some
|
|||
- `ESP32 Forum`_: Official Espressif Forum.
|
||||
- `ESP32 Forum - Arduino`_: Official Espressif Forum for Arduino related discussions.
|
||||
- `ESP32 Forum - Hardware`_: Official Espressif Forum for Hardware related discussions.
|
||||
- `Espressif Developer Portal`_: Official Espressif Developer Portal with tutorials, examples, workshops, and more.
|
||||
- `Arduino Core for Espressif (Discord)`_: Official Espressif Discord channel for the Arduino Core.
|
||||
- `Gitter`_
|
||||
- `Espressif MCUs (Discord)`_
|
||||
- `ESP32 on Reddit`_
|
||||
|
||||
|
|
@ -150,13 +148,12 @@ Resources
|
|||
|
||||
.. _Espressif Systems: https://www.espressif.com
|
||||
.. _Espressif Product Selector: https://products.espressif.com/
|
||||
.. _Espressif Developer Portal: https://developer.espressif.com/
|
||||
.. _Arduino.cc: https://www.arduino.cc/en/Main/Software
|
||||
.. _Arduino Reference: https://www.arduino.cc/reference/en/
|
||||
.. _ESP32 Forum: https://esp32.com
|
||||
.. _ESP32 Forum - Arduino: https://esp32.com/viewforum.php?f=19
|
||||
.. _ESP32 Forum - Hardware: https://esp32.com/viewforum.php?f=12
|
||||
.. _Arduino Core for Espressif (Discord): https://discord.gg/8xY6e9crwv
|
||||
.. _Gitter: https://gitter.im/espressif/arduino-esp32
|
||||
.. _Adafruit (Discord): https://discord.gg/adafruit
|
||||
.. _Espressif MCUs (Discord): https://discord.com/invite/XqnZPbF
|
||||
.. _Espressif MCUs (Discord): https://discord.gg/nKxMTnkD
|
||||
.. _ESP32 on Reddit: https://www.reddit.com/r/esp32
|
||||
|
|
|
|||
|
|
@ -9,28 +9,28 @@ Welcome to the compatibility guide for library developers aiming to support mult
|
|||
Code Adaptations
|
||||
----------------
|
||||
|
||||
To ensure compatibility with both versions of the ESP32 Arduino core, developers should utilize conditional compilation directives in their code. Below is an example of how to conditionally include code based on the ESP32 Arduino core version:
|
||||
To ensure compatibility with both versions of the ESP32 Arduino core, developers should utilize conditional compilation directives in their code. Below is an example of how to conditionally include code based on the ESP32 Arduino core version::
|
||||
|
||||
.. code-block:: cpp
|
||||
.. code-block:: cpp
|
||||
|
||||
#ifdef ESP_ARDUINO_VERSION_MAJOR
|
||||
#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0)
|
||||
// Code for version 3.x
|
||||
#else
|
||||
// Code for version 2.x
|
||||
#endif
|
||||
#else
|
||||
// Code for version 1.x
|
||||
#endif
|
||||
#ifdef ESP_ARDUINO_VERSION_MAJOR
|
||||
#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0)
|
||||
// Code for version 3.x
|
||||
#else
|
||||
// Code for version 2.x
|
||||
#endif
|
||||
#else
|
||||
// Code for version 1.x
|
||||
#endif
|
||||
|
||||
Version Print
|
||||
-------------
|
||||
|
||||
To easily print the ESP32 Arduino core version at runtime, developers can use the `ESP_ARDUINO_VERSION_STR` macro. Below is an example of how to print the ESP32 Arduino core version:
|
||||
To easily print the ESP32 Arduino core version at runtime, developers can use the `ESP_ARDUINO_VERSION_STR` macro. Below is an example of how to print the ESP32 Arduino core version::
|
||||
|
||||
.. code-block:: cpp
|
||||
.. code-block:: cpp
|
||||
|
||||
Serial.printf(" ESP32 Arduino core version: %s\n", ESP_ARDUINO_VERSION_STR);
|
||||
Serial.printf(" ESP32 Arduino core version: %s\n", ESP_ARDUINO_VERSION_STR);
|
||||
|
||||
API Differences
|
||||
---------------
|
||||
|
|
|
|||
|
|
@ -49,11 +49,11 @@ Before starting your collaboration, you need to get the documentation source cod
|
|||
Requirements
|
||||
************
|
||||
|
||||
To build the documentation properly, you need to install some packages in your system. Note that depending on
|
||||
your system, you may need to use a virtual environment to install the packages.
|
||||
To properly work with the documentation, you need to install some packages in your system.
|
||||
|
||||
.. code-block::
|
||||
|
||||
pip install -U Sphinx
|
||||
pip install -r requirements.txt
|
||||
|
||||
The requirements file is under the ``docs`` folder.
|
||||
|
|
@ -62,14 +62,17 @@ Using Visual Studio Code
|
|||
************************
|
||||
|
||||
If you are using the Visual Studio Code, you can install some extensions to help you while writing documentation.
|
||||
For reStructuredText, you can install the `reStructuredText Pack <https://marketplace.visualstudio.com/items?itemName=lextudio.restructuredtext-pack>`_ extension.
|
||||
|
||||
We also recommend you to install some grammar check extension to help you to review English grammar.
|
||||
`reStructuredText Pack <https://marketplace.visualstudio.com/items?itemName=lextudio.restructuredtext-pack>`_
|
||||
|
||||
We also recommend you install to grammar check extension to help you to review English grammar.
|
||||
|
||||
`Grammarly <https://marketplace.visualstudio.com/items?itemName=znck.grammarly>`_
|
||||
|
||||
Building
|
||||
********
|
||||
|
||||
To build the documentation and generate the HTML files, you can use the following command inside the ``docs`` folder. After a successful build, you can check the files inside the ``_build/en/generic/html`` folder.
|
||||
To build the documentation and generate the HTML files, you can use the following command inside the ``docs`` folder. After a successful build, you can check the files inside the `_build/en/generic/html` folder.
|
||||
|
||||
.. code-block::
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ Welcome to ESP32 Arduino Core's documentation
|
|||
#############################################
|
||||
|
||||
Here you will find all the relevant information about the project.
|
||||
This documentation is valid for the Arduino Core for ESP32 version |version| based on ESP-IDF |idf_version|.
|
||||
|
||||
.. note::
|
||||
This is a work in progress documentation and we will appreciate your help! We are looking for contributors!
|
||||
|
|
@ -17,7 +16,6 @@ This documentation is valid for the Arduino Core for ESP32 version |version| bas
|
|||
Guides <guides/guides>
|
||||
Tutorials <tutorials/tutorials>
|
||||
Advanced Utilities <advanced_utils>
|
||||
Third Party Tools <third_party_tools>
|
||||
Migration Guides <migration_guides/migration_guides>
|
||||
FAQ <faq>
|
||||
Troubleshooting <troubleshooting>
|
||||
|
|
|
|||
|
|
@ -10,11 +10,6 @@ Before Installing
|
|||
We recommend you install the support using your favorite IDE, but other options are available depending on your operating system.
|
||||
To install Arduino-ESP32 support, you can use one of the following options.
|
||||
|
||||
.. note::
|
||||
Users in China might have troubles with connection and download speeds using GitHub. Please use our Jihulab mirror as the repository source:
|
||||
|
||||
``https://jihulab.com/esp-mirror/espressif/arduino-esp32.git``
|
||||
|
||||
Installing using Arduino IDE
|
||||
----------------------------
|
||||
|
||||
|
|
@ -37,16 +32,6 @@ This is the way to install Arduino-ESP32 directly from the Arduino IDE.
|
|||
https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json
|
||||
|
||||
|
||||
Users in China might have troubles with connection and download speeds using the links above. Please use our Jihulab mirror:
|
||||
|
||||
- Stable release link::
|
||||
|
||||
https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_index_cn.json
|
||||
|
||||
- Development release link::
|
||||
|
||||
https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_dev_index_cn.json
|
||||
|
||||
.. note::
|
||||
Starting with the Arduino IDE version 1.6.4, Arduino allows installation of third-party platform
|
||||
packages using Boards Manager. We have packages available for Windows, macOS, and Linux.
|
||||
|
|
@ -70,8 +55,6 @@ To start the installation process using the Boards Manager, follow these steps:
|
|||
:figclass: align-center
|
||||
|
||||
- Open Boards Manager from Tools > Board menu and install *esp32* platform (and do not forget to select your ESP32 board from Tools > Board menu after installation).
|
||||
Users in China must select the package version with the "-cn" suffix and perform updates manually.
|
||||
Automatic updates are not supported in this region, as they target the default package without the "-cn" suffix, resulting in download failures.
|
||||
|
||||
.. figure:: ../_static/install_guide_boards_manager_esp32.png
|
||||
:align: center
|
||||
|
|
|
|||
|
|
@ -151,13 +151,13 @@ Set the build target(chip). ex. 'esp32s3'
|
|||
This build command will build for the ESP32-S3 target. You can specify other targets.
|
||||
|
||||
* esp32
|
||||
* esp32s2
|
||||
* esp32s3
|
||||
* esp32c2
|
||||
* esp32c3
|
||||
* esp32c6
|
||||
* esp32h2
|
||||
* esp32p4
|
||||
* esp32s2
|
||||
* esp32s3
|
||||
|
||||
Set Build Type
|
||||
^^^^^^^^^^^^^^
|
||||
|
|
@ -293,9 +293,8 @@ You have two options to run the Docker image to build the libraries. Manually or
|
|||
To run the Docker image manually, use the following command from the root of the ``arduino-esp32`` repository:
|
||||
|
||||
.. code-block:: bash
|
||||
:substitutions:
|
||||
|
||||
docker run --rm -it -v $PWD:/arduino-esp32 -e TERM=xterm-256color espressif/esp32-arduino-lib-builder:release-v|idf_version|
|
||||
docker run --rm -it -v $PWD:/arduino-esp32 -e TERM=xterm-256color espressif/esp32-arduino-lib-builder:release-v5.1
|
||||
|
||||
This will start the Lib Builder UI for compiling the libraries. The above command explained:
|
||||
|
||||
|
|
@ -305,7 +304,7 @@ This will start the Lib Builder UI for compiling the libraries. The above comman
|
|||
- ``-t`` Allocate a pseudo-TTY;
|
||||
- ``-e TERM=xterm-256color``: Optional. Sets the terminal type to ``xterm-256color`` to display colors correctly;
|
||||
- ``-v $PWD:/arduino-esp32``: Optional. Mounts the current folder at ``/arduino-esp32`` inside the container. If not provided, the container will not copy the compiled libraries to the host machine;
|
||||
- :substitution-code:`espressif/esp32-arduino-lib-builder:release-v|idf_version|`: uses Docker image ``espressif/esp32-arduino-lib-builder`` with tag :substitution-code:`release-v|idf_version|`.
|
||||
- ``espressif/esp32-arduino-lib-builder:release-v5.1``: uses Docker image ``espressif/esp32-arduino-lib-builder`` with tag ``release-v5.1``.
|
||||
The ``latest`` tag is implicitly added by Docker when no tag is specified. It is recommended to use a specific version tag to ensure reproducibility of the build process.
|
||||
|
||||
.. warning::
|
||||
|
|
@ -325,27 +324,24 @@ By default the docker container will run the user interface script. If you want
|
|||
For example, to run a terminal inside the container, you can run:
|
||||
|
||||
.. code-block:: bash
|
||||
:substitutions:
|
||||
|
||||
docker run -it espressif/esp32-arduino-lib-builder:release-v|idf_version| /bin/bash
|
||||
docker run -it espressif/esp32-arduino-lib-builder:release-v5.1 /bin/bash
|
||||
|
||||
Running the Docker image using the provided run script will depend on the host OS.
|
||||
Use the following command from the root of the ``arduino-esp32`` repository to execute the image in a Linux or macOS environment for
|
||||
the :substitution-code:`release-v|idf_version|` tag:
|
||||
the ``release-v5.1`` tag:
|
||||
|
||||
.. code-block:: bash
|
||||
:substitutions:
|
||||
|
||||
curl -LJO https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v|idf_version|/tools/docker/run.sh
|
||||
curl -LJO https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v5.1/tools/docker/run.sh
|
||||
chmod +x run.sh
|
||||
./run.sh $PWD
|
||||
|
||||
For Windows, use the following command in PowerShell from the root of the ``arduino-esp32`` repository:
|
||||
|
||||
.. code-block:: powershell
|
||||
:substitutions:
|
||||
|
||||
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v|idf_version|/tools/docker/run.ps1" -OutFile "run.ps1"
|
||||
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/espressif/esp32-arduino-lib-builder/refs/heads/release/v5.1/tools/docker/run.ps1" -OutFile "run.ps1"
|
||||
.\run.ps1 $pwd
|
||||
|
||||
As the script is unsigned, you may need to change the execution policy of the current session before running the script.
|
||||
|
|
|
|||
|
|
@ -9,68 +9,60 @@ Supported Peripherals
|
|||
|
||||
Currently, the Arduino ESP32 supports the following peripherals with Arduino APIs.
|
||||
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Peripheral | ESP32 | C3 | C6 | H2 | P4 | S2 | S3 | Notes |
|
||||
+===============+=======+=======+=======+=======+=======+=======+=======+=======+
|
||||
| ADC | Yes | Yes | Yes | Yes | Yes | Yes | Yes | (1) |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| BT Classic | Yes | N/A | N/A | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| BLE | Yes | Yes | Yes | Yes | No | N/A | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| DAC | Yes | N/A | N/A | N/A | Yes | Yes | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Ethernet | Yes | N/A | N/A | N/A | Yes | N/A | N/A | (2) |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| GPIO | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Hall Sensor | N/A | N/A | N/A | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| I2C | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| I2S | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| LEDC | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| MIPI | N/A | N/A | N/A | N/A | No | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Motor PWM | No | N/A | N/A | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| MSPI | N/A | N/A | N/A | N/A | No | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Pulse Counter | No | No | No | No | No | No | No | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| RMT | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| SDIO | No | No | No | No | No | No | No | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| SDMMC | Yes | N/A | N/A | N/A | N/A | N/A | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Timer | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Temp. Sensor | N/A | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Touch | Yes | N/A | N/A | N/A | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| TWAI | No | No | No | No | No | No | No | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| UART | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| USB | N/A | Yes | Yes | Yes | Yes | Yes | Yes | (3) |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Wi-Fi | Yes | Yes | Yes | N/A | Yes | Yes | Yes | (4) |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Peripheral | ESP32 | S2 | C3 | S3 | C6 | H2 | Notes |
|
||||
+===============+=======+=======+=======+=======+=======+=======+=======+
|
||||
| ADC | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| BT Classic | Yes | N/A | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| BLE | Yes | N/A | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| DAC | Yes | Yes | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Ethernet | Yes | N/A | N/A | N/A | N/A | N/A | (*) |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| GPIO | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Hall Sensor | N/A | N/A | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| I2C | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| I2S | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| LEDC | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Motor PWM | No | N/A | N/A | N/A | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Pulse Counter | No | No | No | No | No | No | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| RMT | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| SDIO | No | No | No | No | No | No | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| SDMMC | Yes | N/A | N/A | Yes | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Timer | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Temp. Sensor | N/A | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Touch | Yes | Yes | N/A | Yes | N/A | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| TWAI | No | No | No | No | No | No | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| UART | Yes | Yes | Yes | Yes | Yes | Yes | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| USB | N/A | Yes | Yes | Yes | Yes | Yes | (**) |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
| Wi-Fi | Yes | Yes | Yes | Yes | Yes | N/A | |
|
||||
+---------------+-------+-------+-------+-------+-------+-------+-------+
|
||||
|
||||
Notes
|
||||
^^^^^
|
||||
|
||||
(1) ESP32-P4 calibration schemes not supported yet in IDF and ADC Continuous also lacks IDF support.
|
||||
(*) SPI Ethernet is supported by all ESP32 families and RMII only for ESP32.
|
||||
|
||||
(2) SPI Ethernet is supported by all ESP32 families and RMII only for ESP32 and ESP32-P4.
|
||||
|
||||
(3) ESP32-C3, C6, H2 only support USB CDC/JTAG
|
||||
|
||||
(4) ESP32-P4 only supports Wi-Fi through another SoC by using ``esp_hosted``.
|
||||
(**) ESP32-C3, C6, H2 only support USB CDC/JTAG
|
||||
|
||||
.. note:: Some peripherals are not available for all ESP32 families. To see more details about it, see the corresponding SoC at `Product Selector <https://products.espressif.com>`_ page.
|
||||
|
||||
|
|
@ -91,15 +83,3 @@ The Arduino ESP32 offers some unique APIs, described in this section:
|
|||
:glob:
|
||||
|
||||
api/*
|
||||
|
||||
Zigbee APIs
|
||||
-----------
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
zigbee/zigbee
|
||||
zigbee/zigbee_core
|
||||
zigbee/zigbee_ep
|
||||
zigbee/ep_*
|
||||
|
|
|
|||
14
docs/en/third_party/pioarduino.rst
vendored
14
docs/en/third_party/pioarduino.rst
vendored
|
|
@ -1,14 +0,0 @@
|
|||
#######################################################
|
||||
pioarduino - (p)eople (i)nitiated (o)ptimized (arduino)
|
||||
#######################################################
|
||||
|
||||
.. warning::
|
||||
This tool is **not maintained by the ESP32 Arduino Core team**, so we cannot provide support or guarantee that it will work as expected.
|
||||
|
||||
.. note::
|
||||
This is a work in progress documentation and we will appreciate your help! We are looking for contributors!
|
||||
|
||||
About
|
||||
-----
|
||||
|
||||
For more information, please refer to the `official documentation <https://github.com/pioarduino/platform-espressif32>`_.
|
||||
42
docs/en/third_party/wokwi.rst
vendored
42
docs/en/third_party/wokwi.rst
vendored
|
|
@ -1,42 +0,0 @@
|
|||
#####
|
||||
Wokwi
|
||||
#####
|
||||
|
||||
.. warning::
|
||||
This tool is **not maintained by the ESP32 Arduino Core team**, so we cannot provide support or guarantee that it will work as expected.
|
||||
|
||||
.. note::
|
||||
This is a work in progress documentation and we will appreciate your help! We are looking for contributors!
|
||||
|
||||
About
|
||||
-----
|
||||
|
||||
Wokwi is an online Electronics simulator. You can use it to simulate Arduino, ESP32, and many other popular boards, parts and sensors.
|
||||
|
||||
The advantages of using Wokwi include:
|
||||
|
||||
- Immediate start: No need to wait for components or download large software. Everything required is available in your browser, enabling you to begin coding your IoT project within seconds.
|
||||
- Safe experimentation: Virtual hardware cannot be damaged, allowing users to experiment freely without the risk of destroying components. Mistakes can be easily undone.
|
||||
- Easy collaboration: Sharing a link to your Wokwi project facilitates obtaining help and feedback from others.
|
||||
- Code reliability: Helps in distinguishing between hardware and software issues, thereby increasing confidence in your code.
|
||||
- Unlimited resources: Access to an unlimited number of parts without concerns about cost or availability.
|
||||
- Supportive community: A maker-friendly environment where users can share projects, seek assistance, and find inspiration.
|
||||
|
||||
Unique features provided by Wokwi:
|
||||
|
||||
- Wi-Fi simulation - Connect your simulated project to the internet. You can use MQTT, HTTP, NTP, and many other network protocols.
|
||||
- Virtual Logic Analyzer - Capture digital signals in your simulation (e.g. UART, I2C, SPI) and analyze them on your computer.
|
||||
- Advanced debugging with GDB - Powerful Arduino debugger for advanced users.
|
||||
- SD card simulation - Store and retrieve files and directories from your code. Paying users can also upload binary files (such as images)
|
||||
- Chips API - Create your own custom chips and parts, and share them with the community.
|
||||
- Visual Studio Code integration - Simulate your embedded projects directly from VS Code.
|
||||
|
||||
Pricing
|
||||
-------
|
||||
|
||||
Wokwi is free for personal use. For commercial users and professionals, please check out the paid plans in the `pricing page <https://wokwi.com/pricing>`_.
|
||||
|
||||
Learn more
|
||||
----------
|
||||
|
||||
For more information, please refer to the `official Wokwi website <https://wokwi.com>`_ and the `Wokwi documentation <https://docs.wokwi.com>`_.
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue