Initial commit
Signed-off-by: Thomas Klaehn <thomas.klaehn@perinet.io>
This commit is contained in:
commit
03a3c8732f
11
.cargo/config.toml
Normal file
11
.cargo/config.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[alias]
|
||||||
|
esp32c6 = "build --release --features=esp32c6 --target riscv32imac-unknown-none-elf"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
target = "riscv32imac-unknown-none-elf"
|
||||||
|
|
||||||
|
[target.'cfg(target_arch = "riscv32")']
|
||||||
|
runner = "espflash flash --monitor"
|
||||||
|
|
||||||
|
[unstable]
|
||||||
|
build-std = ["core"]
|
79
.devcontainer/Dockerfile
Normal file
79
.devcontainer/Dockerfile
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# Base image
|
||||||
|
FROM debian:bookworm-slim
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV LC_ALL=C.UTF-8
|
||||||
|
ENV LANG=C.UTF-8
|
||||||
|
|
||||||
|
# Arguments
|
||||||
|
ARG CONTAINER_USER=esp
|
||||||
|
ARG CONTAINER_GROUP=esp
|
||||||
|
ARG NIGHTLY_VERSION=nightly-2024-06-30
|
||||||
|
ARG ESP_IDF_VERSION=v5.2.2
|
||||||
|
ARG ESP_BOARD=esp32c6
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y git wget flex bison gperf python3 python3-pip python3-venv \
|
||||||
|
cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 \
|
||||||
|
llvm-dev libclang-dev clang pkg-config unzip libusb-1.0-0 \
|
||||||
|
libpython3-all-dev python3-virtualenv curl \
|
||||||
|
&& apt-get clean -y \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* /tmp/library-scripts
|
||||||
|
|
||||||
|
# Set users
|
||||||
|
RUN adduser --disabled-password --gecos "" ${CONTAINER_USER}
|
||||||
|
RUN adduser ${CONTAINER_USER} root
|
||||||
|
USER ${CONTAINER_USER}
|
||||||
|
WORKDIR /home/${CONTAINER_USER}
|
||||||
|
|
||||||
|
# Install rustup
|
||||||
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \
|
||||||
|
--default-toolchain ${NIGHTLY_VERSION} -y --profile minimal \
|
||||||
|
--component rust-src,clippy,rustfmt
|
||||||
|
|
||||||
|
# Update envs
|
||||||
|
ENV PATH=${PATH}:$HOME/.cargo/bin
|
||||||
|
|
||||||
|
# Install extra crates
|
||||||
|
RUN ARCH=$($HOME/.cargo/bin/rustup show | grep "Default host" | sed -e 's/.* //') && \
|
||||||
|
curl -L "https://github.com/esp-rs/espflash/releases/latest/download/cargo-espflash-${ARCH}.zip" -o "${HOME}/.cargo/bin/cargo-espflash.zip" && \
|
||||||
|
unzip "${HOME}/.cargo/bin/cargo-espflash.zip" -d "${HOME}/.cargo/bin/" && \
|
||||||
|
rm "${HOME}/.cargo/bin/cargo-espflash.zip" && \
|
||||||
|
chmod u+x "${HOME}/.cargo/bin/cargo-espflash" && \
|
||||||
|
curl -L "https://github.com/esp-rs/espflash/releases/latest/download/espflash-${ARCH}.zip" -o "${HOME}/.cargo/bin/espflash.zip" && \
|
||||||
|
unzip "${HOME}/.cargo/bin/espflash.zip" -d "${HOME}/.cargo/bin/" && \
|
||||||
|
rm "${HOME}/.cargo/bin/espflash.zip" && \
|
||||||
|
chmod u+x "${HOME}/.cargo/bin/espflash" && \
|
||||||
|
curl -L "https://github.com/esp-rs/esp-web-flash-server/releases/latest/download/web-flash-${ARCH}.zip" -o "${HOME}/.cargo/bin/web-flash.zip" && \
|
||||||
|
unzip "${HOME}/.cargo/bin/web-flash.zip" -d "${HOME}/.cargo/bin/" && \
|
||||||
|
rm "${HOME}/.cargo/bin/web-flash.zip" && \
|
||||||
|
chmod u+x "${HOME}/.cargo/bin/web-flash" && \
|
||||||
|
curl -L "https://github.com/esp-rs/embuild/releases/latest/download/ldproxy-${ARCH}.zip" -o "${HOME}/.cargo/bin/ldproxy.zip" && \
|
||||||
|
unzip "${HOME}/.cargo/bin/ldproxy.zip" -d "${HOME}/.cargo/bin/" && \
|
||||||
|
rm "${HOME}/.cargo/bin/ldproxy.zip" && \
|
||||||
|
chmod u+x "${HOME}/.cargo/bin/ldproxy" && \
|
||||||
|
GENERATE_VERSION=$(git ls-remote --refs --sort="version:refname" --tags "https://github.com/cargo-generate/cargo-generate" | cut -d/ -f3- | tail -n1) && \
|
||||||
|
GENERATE_URL="https://github.com/cargo-generate/cargo-generate/releases/latest/download/cargo-generate-${GENERATE_VERSION}-${ARCH}.tar.gz" && \
|
||||||
|
curl -L "${GENERATE_URL}" -o "${HOME}/.cargo/bin/cargo-generate.tar.gz" && \
|
||||||
|
tar xf "${HOME}/.cargo/bin/cargo-generate.tar.gz" -C "${HOME}/.cargo/bin/" && \
|
||||||
|
rm "${HOME}/.cargo/bin/cargo-generate.tar.gz" && \
|
||||||
|
chmod u+x "${HOME}/.cargo/bin/cargo-generate"
|
||||||
|
|
||||||
|
# Install esp-idf
|
||||||
|
RUN mkdir -p ${HOME}/.espressif/frameworks/ \
|
||||||
|
&& git clone --branch ${ESP_IDF_VERSION} -q --depth 1 --shallow-submodules \
|
||||||
|
--recursive https://github.com/espressif/esp-idf.git \
|
||||||
|
${HOME}/.espressif/frameworks/esp-idf \
|
||||||
|
&& python3 ${HOME}/.espressif/frameworks/esp-idf/tools/idf_tools.py install cmake \
|
||||||
|
&& ${HOME}/.espressif/frameworks/esp-idf/install.sh ${ESP_BOARD} \
|
||||||
|
&& rm -rf .espressif/dist \
|
||||||
|
&& rm -rf .espressif/frameworks/esp-idf/docs \
|
||||||
|
&& rm -rf .espressif/frameworks/esp-idf/examples \
|
||||||
|
&& rm -rf .espressif/frameworks/esp-idf/tools/esp_app_trace \
|
||||||
|
&& rm -rf .espressif/frameworks/esp-idf/tools/test_idf_size
|
||||||
|
|
||||||
|
# Activate ESP environment
|
||||||
|
ENV IDF_TOOLS_PATH=${HOME}/.espressif
|
||||||
|
RUN echo "source ${HOME}/.espressif/frameworks/esp-idf/export.sh > /dev/null 2>&1" >> ~/.bashrc
|
||||||
|
|
||||||
|
CMD "/bin/bash"
|
46
.devcontainer/devcontainer.json
Executable file
46
.devcontainer/devcontainer.json
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"name": "esp32-dev",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"args": {
|
||||||
|
"NIGHTLY_VERSION": "nightly-2025-01-01"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Privileged container in order to access /dev
|
||||||
|
"privileged": true,
|
||||||
|
// Mount USB devices (debug probes, UART interfaces, ...)
|
||||||
|
"mounts": [
|
||||||
|
"source=/dev/bus/usb/,target=/dev/bus/usb/,type=bind"
|
||||||
|
],
|
||||||
|
"runArgs": [
|
||||||
|
"--device=/dev/ttyACM0"
|
||||||
|
],
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"settings": {
|
||||||
|
"editor.formatOnPaste": true,
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"editor.formatOnSaveMode": "modifications",
|
||||||
|
"editor.formatOnType": true,
|
||||||
|
"lldb.executable": "/usr/bin/lldb",
|
||||||
|
"files.watcherExclude": {
|
||||||
|
"**/target/**": true
|
||||||
|
},
|
||||||
|
"rust-analyzer.checkOnSave.command": "clippy",
|
||||||
|
"[rust]": {
|
||||||
|
"editor.defaultFormatter": "rust-lang.rust-analyzer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extensions": [
|
||||||
|
"rust-lang.rust-analyzer",
|
||||||
|
"tamasfe.even-better-toml",
|
||||||
|
"vadimcn.vscode-lldb",
|
||||||
|
"mutantdino.resourcemonitor",
|
||||||
|
"yzhang.markdown-all-in-one"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteUser": "esp",
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
|
||||||
|
"workspaceFolder": "/workspace"
|
||||||
|
}
|
50
.devcontainer/test.sh
Normal file
50
.devcontainer/test.sh
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ef
|
||||||
|
|
||||||
|
echo "Compiling $1"
|
||||||
|
|
||||||
|
cd /home/esp/workspace/$1
|
||||||
|
|
||||||
|
if [ -f cfg.toml.example ]; then
|
||||||
|
# Rename file to cfg.toml
|
||||||
|
cp cfg.toml.example cfg.toml
|
||||||
|
# Replace defaults
|
||||||
|
sed -i 's/wifi_ssid = "FBI Surveillance Van"/wifi_ssid = "Wokwi-GUEST"/g' cfg.toml
|
||||||
|
sed -i 's/wifi_psk = "hunter2"/wifi_psk = ""/g' cfg.toml
|
||||||
|
sed -i 's/mqtt_user = "horse"/mqtt_user = "user"/g' cfg.toml
|
||||||
|
sed -i 's/mqtt_pass = "CorrectHorseBatteryStaple"/mqtt_pass = "pass"/g' cfg.toml
|
||||||
|
sed -i 's/mqtt_host = "yourpc.local"/mqtt_host = "host"/g' cfg.toml
|
||||||
|
fi
|
||||||
|
|
||||||
|
$HOME/.cargo/bin/cargo clean
|
||||||
|
$HOME/.cargo/bin/cargo build
|
||||||
|
|
||||||
|
# Check examples
|
||||||
|
if [[ "$1" == advanced/button-interrupt ]]; then
|
||||||
|
$HOME/.cargo/bin/cargo build --example solution
|
||||||
|
$HOME/.cargo/bin/cargo build --example solution_led
|
||||||
|
# Simulate with Wokwi
|
||||||
|
sed -i 's/^[[:space:]]*firmware[[:space:]]*=[[:space:]]*["'"'"']\([^"'"'"']*\)["'"'"']\([[:space:]]*\)$/\nfirmware = "target\/riscv32imc-esp-espidf\/debug\/examples\/solution"/' wokwi.toml
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$1" == advanced/i2c-sensor-reading ]]; then
|
||||||
|
$HOME/.cargo/bin/cargo build --example part_1
|
||||||
|
$HOME/.cargo/bin/cargo build --example part_2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$1" == intro/http-client ]]; then
|
||||||
|
$HOME/.cargo/bin/cargo build --example http_client
|
||||||
|
$HOME/.cargo/bin/cargo build --example https_client
|
||||||
|
# Simulate with Wokwi
|
||||||
|
sed -i 's/^[[:space:]]*firmware[[:space:]]*=[[:space:]]*["'"'"']\([^"'"'"']*\)["'"'"']\([[:space:]]*\)$/\nfirmware = "target\/riscv32imc-esp-espidf\/debug\/examples\/http_client"/' wokwi.toml
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$1" == intro/http-server ]]; then
|
||||||
|
$HOME/.cargo/bin/cargo build --example http_server
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$1" == intro/mqtt/exercise ]]; then
|
||||||
|
$HOME/.cargo/bin/cargo build --example solution_publ_rcv
|
||||||
|
$HOME/.cargo/bin/cargo build --example solution_publ
|
||||||
|
fi
|
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Cargo
|
||||||
|
# will have compiled files and executables
|
||||||
|
debug/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# These are backup files generated by rustfmt
|
||||||
|
**/*.rs.bk
|
||||||
|
|
||||||
|
# MSVC Windows builds of rustc generate these, which store debugging information
|
||||||
|
*.pdb
|
||||||
|
|
||||||
|
# RustRover
|
||||||
|
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||||
|
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||||
|
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||||
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
|
#.idea/
|
22
.vscode/launch.json
vendored
Normal file
22
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Cortex Debug",
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"executable": "./std-training/intro/hardware-check/target/riscv32imc-esp-espidf/debug/",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "cortex-debug",
|
||||||
|
"runToEntryPoint": "main",
|
||||||
|
"gdbPath": "gdb-multiarch",
|
||||||
|
"servertype": "openocd",
|
||||||
|
"configFiles": [
|
||||||
|
"interface/stlink.cfg",
|
||||||
|
"target/stm32g0x.cfg"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"rust-analyzer.cargo.allTargets": false,
|
||||||
|
"rust-analyzer.cargo.target": "riscv32imac-unknown-none-elf",
|
||||||
|
}
|
48
.vscode/tasks.json
vendored
Normal file
48
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "cargo",
|
||||||
|
"command": "build",
|
||||||
|
"args": [
|
||||||
|
"-p",
|
||||||
|
"lp-core",
|
||||||
|
"--release"
|
||||||
|
],
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build"
|
||||||
|
},
|
||||||
|
"label": "rust: cargo build lp-core"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cargo",
|
||||||
|
"command": "check",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
"group": "build",
|
||||||
|
"label": "rust: cargo check"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cargo",
|
||||||
|
"command": "clean",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
"group": "build",
|
||||||
|
"label": "rust: cargo clean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cargo",
|
||||||
|
"command": "run",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
"group": "build",
|
||||||
|
"label": "rust: cargo run"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
2282
Cargo.lock
generated
Normal file
2282
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
5
Cargo.toml
Normal file
5
Cargo.toml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
cargo-features = ["profile-rustflags"]
|
||||||
|
|
||||||
|
[workspace]
|
||||||
|
members = ["hp-core", "lp-core"]
|
||||||
|
resolver = "2"
|
41
Readme.md
Normal file
41
Readme.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# ESP32-C6
|
||||||
|
|
||||||
|
Template firmware for both, low-performance and high performance core of the
|
||||||
|
esp32-c6 riscv processor.
|
||||||
|
|
||||||
|
## hp-core
|
||||||
|
|
||||||
|
Firmware for the high performance core.
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cargo build --package hp-core --release
|
||||||
|
```
|
||||||
|
|
||||||
|
## lp-core
|
||||||
|
|
||||||
|
Firmware for the low performance core.
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cargo build --package lp-core --release
|
||||||
|
```
|
||||||
|
|
||||||
|
## Execution
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cargo run --package hp-core --release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Preconditions
|
||||||
|
|
||||||
|
In order to execute/flash the project some conditions must be fulfilled:
|
||||||
|
|
||||||
|
* hardware target is connected with USB before the devcontainer is launched
|
||||||
|
* the belonging tty device is named `ttyACM0` (otherwise rename it in
|
||||||
|
`.devcontainer/devcontainer.json`)
|
||||||
|
* the belonging tty device (`ttyACM0`) is member of the `root` group because
|
||||||
|
the devcontainer user (`esp`) is in this group too. If this changes it must
|
||||||
|
be adoptet in `.devcontainer/Dockerfile`
|
79
hp-core/Cargo.toml
Normal file
79
hp-core/Cargo.toml
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
[package]
|
||||||
|
name = "hp-core"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
aligned = { version = "0.4.2", optional = true }
|
||||||
|
bleps = { git = "https://github.com/bjoernQ/bleps", package = "bleps", rev = "a5148d8ae679e021b78f53fd33afb8bb35d0b62e", features = [ "macros", "async"] }
|
||||||
|
blocking-network-stack = { git = "https://github.com/bjoernQ/blocking-network-stack.git", rev = "b3ecefc222d8806edd221f266999ca339c52d34e" }
|
||||||
|
bt-hci = "0.2.0"
|
||||||
|
cfg-if = "1.0.0"
|
||||||
|
critical-section = "1.1.3"
|
||||||
|
embassy-executor = { version = "0.7.0", features = ["task-arena-size-20480"] }
|
||||||
|
embassy-futures = "0.1.1"
|
||||||
|
embassy-net = { version = "0.6.0", features = [ "tcp", "udp", "dhcpv4", "medium-ethernet"] }
|
||||||
|
embassy-sync = "0.6.0"
|
||||||
|
embassy-time = "0.4.0"
|
||||||
|
embassy-usb = { version = "0.2.0", default-features = false }
|
||||||
|
embedded-can = "0.4.1"
|
||||||
|
embedded-hal-async = "1.0.0"
|
||||||
|
embedded-io = { version = "0.6.1", default-features = false }
|
||||||
|
embedded-io-async = "0.6.1"
|
||||||
|
embedded-storage = "0.3.1"
|
||||||
|
esp-alloc = "0.6.0"
|
||||||
|
esp-backtrace = { version = "0.15.0", features = ["esp32c6", "exception-handler", "panic-handler", "println"] }
|
||||||
|
esp-hal = { version = "0.23.1", features = ["log"] }
|
||||||
|
esp-hal-embassy = { version = "0.6.0", optional = true }
|
||||||
|
esp-ieee802154 = { version = "0.5.0", optional = true }
|
||||||
|
esp-println = { version = "0.13.0", features = ["log"] }
|
||||||
|
esp-storage = { version = "0.4.0", optional = true }
|
||||||
|
esp-wifi = { version = "0.12.0", features = ["log"], optional = true }
|
||||||
|
heapless = "0.8.0"
|
||||||
|
hmac = { version = "0.12.1", default-features = false }
|
||||||
|
ieee80211 = { version = "0.4.0", default-features = false }
|
||||||
|
ieee802154 = "0.6.1"
|
||||||
|
log = "0.4.22"
|
||||||
|
nb = "1.1.0"
|
||||||
|
portable-atomic = { version = "1.9.0", default-features = false }
|
||||||
|
sha2 = { version = "0.10.8", default-features = false }
|
||||||
|
smoltcp = { version = "0.12.0", default-features = false, features = [ "medium-ethernet", "socket-raw"] }
|
||||||
|
embedded-time = "=0.12.1"
|
||||||
|
static_cell = { version = "2.1.0", features = ["nightly"] }
|
||||||
|
usb-device = "0.3.2"
|
||||||
|
usbd-serial = "0.2.2"
|
||||||
|
edge-dhcp = { version = "0.5.0" }
|
||||||
|
edge-raw = { version = "0.5.0" }
|
||||||
|
edge-nal = { version = "0.5.0" }
|
||||||
|
edge-nal-embassy = { version = "0.5.0" }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default=["esp32c6"]
|
||||||
|
|
||||||
|
esp32 = ["esp-hal/esp32", "esp-backtrace/esp32", "esp-hal-embassy?/esp32", "esp-println/esp32", "esp-storage?/esp32", "esp-wifi?/esp32"]
|
||||||
|
esp32c2 = ["esp-hal/esp32c2", "esp-backtrace/esp32c2", "esp-hal-embassy?/esp32c2", "esp-println/esp32c2", "esp-storage?/esp32c2", "esp-wifi?/esp32c2", ]
|
||||||
|
esp32c3 = ["esp-hal/esp32c3", "esp-backtrace/esp32c3", "esp-hal-embassy?/esp32c3", "esp-println/esp32c3", "esp-storage?/esp32c3", "esp-wifi?/esp32c3"]
|
||||||
|
esp32c6 = ["esp-hal/esp32c6", "esp-backtrace/esp32c6", "esp-hal-embassy?/esp32c6", "esp-println/esp32c6", "esp-storage?/esp32c6", "esp-wifi?/esp32c6", "esp-ieee802154?/esp32c6"]
|
||||||
|
esp32h2 = ["esp-hal/esp32h2", "esp-backtrace/esp32h2", "esp-hal-embassy?/esp32h2", "esp-println/esp32h2", "esp-storage?/esp32h2", "esp-wifi?/esp32h2", "esp-ieee802154?/esp32h2"]
|
||||||
|
esp32s2 = ["esp-hal/esp32s2", "esp-backtrace/esp32s2", "esp-hal-embassy?/esp32s2", "esp-println/esp32s2", "esp-storage?/esp32s2", "esp-wifi?/esp32s2"]
|
||||||
|
esp32s3 = ["esp-hal/esp32s3", "esp-backtrace/esp32s3", "esp-hal-embassy?/esp32s3", "esp-println/esp32s3", "esp-storage?/esp32s3", "esp-wifi?/esp32s3"]
|
||||||
|
|
||||||
|
esp-wifi = ["dep:esp-wifi"]
|
||||||
|
|
||||||
|
embassy = ["dep:esp-hal-embassy"]
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
codegen-units = 1
|
||||||
|
debug = 2
|
||||||
|
debug-assertions = true
|
||||||
|
incremental = false
|
||||||
|
opt-level = 3
|
||||||
|
lto = 'fat'
|
||||||
|
overflow-checks = false
|
||||||
|
|
||||||
|
[build]
|
||||||
|
rustflags = [
|
||||||
|
"-C", "force-frame-pointers",
|
||||||
|
]
|
19
hp-core/build.rs
Normal file
19
hp-core/build.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
// use esp_build::assert_unique_used_features;
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
// assert_unique_used_features!("esp32c6");
|
||||||
|
|
||||||
|
// NOTE: update when adding new device support!
|
||||||
|
// Determine the name of the configured device:
|
||||||
|
let device_name = "esp32c6";
|
||||||
|
|
||||||
|
// Define all necessary configuration symbols for the configured device:
|
||||||
|
println!("cargo:rustc-cfg={}", device_name);
|
||||||
|
|
||||||
|
println!("cargo:rustc-link-arg=-Tlinkall.x");
|
||||||
|
|
||||||
|
// // Done!
|
||||||
|
Ok(())
|
||||||
|
}
|
52
hp-core/src/main.rs
Normal file
52
hp-core/src/main.rs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
//! This shows a very basic example of running code on the LP core.
|
||||||
|
//!
|
||||||
|
//! Code on LP core increments a counter and continuously toggles LED. The
|
||||||
|
//! current value is printed by the HP core.
|
||||||
|
//!
|
||||||
|
//! Make sure to first compile the `esp-lp-hal/examples/blinky.rs` example
|
||||||
|
//!
|
||||||
|
//! The following wiring is assumed:
|
||||||
|
//! - LED => GPIO1
|
||||||
|
|
||||||
|
//% CHIPS: esp32c6
|
||||||
|
//% FEATURES: esp-hal/unstable
|
||||||
|
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use esp_backtrace as _;
|
||||||
|
use esp_hal::{
|
||||||
|
gpio::lp_io::LowPowerOutput,
|
||||||
|
load_lp_code,
|
||||||
|
lp_core::{LpCore, LpCoreWakeupSource},
|
||||||
|
main,
|
||||||
|
};
|
||||||
|
use esp_println::{print, println};
|
||||||
|
|
||||||
|
#[main]
|
||||||
|
fn main() -> ! {
|
||||||
|
let peripherals = esp_hal::init(esp_hal::Config::default());
|
||||||
|
|
||||||
|
// configure GPIO 1 as LP output pin
|
||||||
|
|
||||||
|
let lp_pin = LowPowerOutput::new(peripherals.GPIO1);
|
||||||
|
|
||||||
|
let mut lp_core = LpCore::new(peripherals.LP_CORE);
|
||||||
|
lp_core.stop();
|
||||||
|
println!("lp core stopped");
|
||||||
|
|
||||||
|
// load code to LP core
|
||||||
|
let lp_core_code =
|
||||||
|
load_lp_code!("./target/riscv32imac-unknown-none-elf/release/lp-core");
|
||||||
|
|
||||||
|
// start LP core
|
||||||
|
lp_core_code.run(&mut lp_core, LpCoreWakeupSource::HpCpu, lp_pin);
|
||||||
|
println!("lpcore run");
|
||||||
|
|
||||||
|
let data = (0x5000_2000) as *mut u32;
|
||||||
|
loop {
|
||||||
|
print!("Current {:x} \u{000d}", unsafe {
|
||||||
|
data.read_volatile()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
45
lp-core/Cargo.toml
Normal file
45
lp-core/Cargo.toml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
[package]
|
||||||
|
name = "lp-core"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
rust-version = "1.84.0"
|
||||||
|
description = "Firmware for esp32-c6's low power core"
|
||||||
|
keywords = ["embedded", "embedded-hal", "esp32", "espressif", "hal"]
|
||||||
|
categories = ["embedded", "hardware-support", "no-std"]
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cfg-if = "1.0.0"
|
||||||
|
document-features = "0.2.10"
|
||||||
|
esp-lp-hal = { version = "0.1.0", features = ["esp32c6"] }
|
||||||
|
embedded-hal = { version = "1.0.0" }
|
||||||
|
embedded-hal-nb = { version = "1.0.0", optional = true }
|
||||||
|
embedded-io = { version = "0.6.1", optional = true }
|
||||||
|
esp32c6-lp = { version = "0.3.0", features = ["critical-section"], optional = true }
|
||||||
|
nb = { version = "1.1.0", optional = true }
|
||||||
|
procmacros = { version = "0.16.0", package = "esp-hal-procmacros" }
|
||||||
|
riscv = { version = "0.11.1", features = ["critical-section-single-hart"] }
|
||||||
|
panic-halt = "0.2.0"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
esp-build = { version = "0.2.0" }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["esp32c6"]
|
||||||
|
|
||||||
|
## Enable debug features in the HAL (used for development).
|
||||||
|
debug = [
|
||||||
|
"esp32c6-lp?/impl-register-debug",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Chip Support Feature Flags
|
||||||
|
# Target the ESP32-C6.
|
||||||
|
esp32c6 = ["dep:esp32c6-lp", "procmacros/is-lp-core", "dep:nb"]
|
||||||
|
# embedded-hal = ["dep:embedded-hal"]
|
||||||
|
|
||||||
|
#! ### Trait Implementation Feature Flags
|
||||||
|
## Implement the traits defined in the `1.0.0` releases of `embedded-hal` and
|
||||||
|
## `embedded-hal-nb` for the relevant peripherals.
|
||||||
|
# embedded-hal = ["dep:embedded-hal", "dep:embedded-hal-nb"]
|
||||||
|
## Implement the traits defined in `embedded-io` for the relevant peripherals.
|
||||||
|
# embedded-io = ["dep:embedded-io"]
|
27
lp-core/build.rs
Normal file
27
lp-core/build.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
use esp_build::assert_unique_used_features;
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
assert_unique_used_features!("esp32c6");
|
||||||
|
|
||||||
|
// NOTE: update when adding new device support!
|
||||||
|
// Determine the name of the configured device:
|
||||||
|
let device_name = "esp32c6";
|
||||||
|
|
||||||
|
// Define all necessary configuration symbols for the configured device:
|
||||||
|
println!("cargo:rustc-cfg={}", device_name);
|
||||||
|
|
||||||
|
// Put the linker script somewhere the linker can find it:
|
||||||
|
// let out = PathBuf::from(env::var_os("OUT_DIR").unwrap());
|
||||||
|
// println!("cargo:rustc-link-search={}", out.display());
|
||||||
|
|
||||||
|
// Copy the required linker script to the `out` directory:
|
||||||
|
// fs::copy("lp-core/ld/link.x", out.join("link.x"))?;
|
||||||
|
// println!("cargo:rerun-if-changed=lp-core/ld/link.x");
|
||||||
|
|
||||||
|
println!("cargo:rustc-link-arg=-Tlp-core/ld/link.x");
|
||||||
|
|
||||||
|
// // Done!
|
||||||
|
Ok(())
|
||||||
|
}
|
67
lp-core/ld/link.x
Normal file
67
lp-core/ld/link.x
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
ENTRY(reset_vector)
|
||||||
|
|
||||||
|
VECTOR_TABLE_LENGTH = 0x80;
|
||||||
|
CONFIG_ULP_COPROC_RESERVE_MEM = 1024 * 16;
|
||||||
|
CONFIG_ULP_SHARED_MEM = 0;
|
||||||
|
RAM_LENGTH = CONFIG_ULP_COPROC_RESERVE_MEM - VECTOR_TABLE_LENGTH - CONFIG_ULP_SHARED_MEM;
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
/*first 128byte for exception/interrupt vectors*/
|
||||||
|
vector_table(RX) : ORIGIN = 0x50000000, LENGTH = VECTOR_TABLE_LENGTH
|
||||||
|
ram(RWX) : ORIGIN = 0x50000080, LENGTH = RAM_LENGTH
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.vector.text :
|
||||||
|
{
|
||||||
|
/* Exception/interrupt vectors */
|
||||||
|
__mtvec_base = .;
|
||||||
|
KEEP (*(.init.vector))
|
||||||
|
__mtvec_end = .;
|
||||||
|
} > vector_table
|
||||||
|
|
||||||
|
. = ORIGIN(ram);
|
||||||
|
|
||||||
|
.text ALIGN(4):
|
||||||
|
{
|
||||||
|
*(.text.vectors) /* Default reset vector must link to offset 0x80 */
|
||||||
|
|
||||||
|
KEEP(*(.init));
|
||||||
|
KEEP(*(.init.rust));
|
||||||
|
*(.text)
|
||||||
|
*(.text*)
|
||||||
|
} > ram
|
||||||
|
|
||||||
|
.rodata ALIGN(4):
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
*(.rodata*)
|
||||||
|
} > ram
|
||||||
|
|
||||||
|
.data ALIGN(4):
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
*(.data*)
|
||||||
|
*(.sdata)
|
||||||
|
*(.sdata*)
|
||||||
|
} > ram
|
||||||
|
|
||||||
|
.bss ALIGN(4) :
|
||||||
|
{
|
||||||
|
*(.bss)
|
||||||
|
*(.bss*)
|
||||||
|
*(.sbss)
|
||||||
|
*(.sbss*)
|
||||||
|
PROVIDE(end = .);
|
||||||
|
} > ram
|
||||||
|
|
||||||
|
__stack_top = ORIGIN(ram) + LENGTH(ram);
|
||||||
|
}
|
35
lp-core/src/main.rs
Normal file
35
lp-core/src/main.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
//! Counts a 32 bit value at a known point in memory, and blink GPIO1.
|
||||||
|
//!
|
||||||
|
//! When using the ESP32-C6's LP core, this address in memory is `0x5000_2000`.
|
||||||
|
//!
|
||||||
|
//! Make sure the LP RAM is cleared before loading the code.
|
||||||
|
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use embedded_hal::{delay::DelayNs, digital::OutputPin};
|
||||||
|
use esp_lp_hal::{delay::Delay, gpio::Output, prelude::*};
|
||||||
|
use panic_halt as _;
|
||||||
|
|
||||||
|
const ADDRESS: u32 = 0x5000_2000;
|
||||||
|
|
||||||
|
|
||||||
|
#[entry]
|
||||||
|
fn main(mut gpio1: Output<1>) -> ! {
|
||||||
|
let mut i: u32 = 0;
|
||||||
|
|
||||||
|
let ptr = ADDRESS as *mut u32;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
i = i.wrapping_add(1u32);
|
||||||
|
unsafe {
|
||||||
|
ptr.write_volatile(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpio1.set_high().unwrap();
|
||||||
|
Delay.delay_ms(500);
|
||||||
|
|
||||||
|
gpio1.set_low().unwrap();
|
||||||
|
Delay.delay_ms(500);
|
||||||
|
}
|
||||||
|
}
|
12
workspace.code-workspace
Normal file
12
workspace.code-workspace
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": ".",
|
||||||
|
"name": "ESP32-C6"
|
||||||
|
},
|
||||||
|
// { "path": "/usr/src/libperiCORE", "name":"libperiCORE" },
|
||||||
|
// { "path": "/usr/src/seve", "name":"sève" },
|
||||||
|
// { "path": "/usr/src/periCORE-buildsystem", "name":"periCORE-buildsystem" },
|
||||||
|
// { "path": "/usr/src/", "name": "/usr/src" }
|
||||||
|
]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user