Setup basic esp32c3 embassy
This commit is contained in:
commit
c1b98bb7d0
11 changed files with 1990 additions and 0 deletions
17
.cargo/config.toml
Normal file
17
.cargo/config.toml
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
[target.riscv32imc-unknown-none-elf]
|
||||||
|
runner = "espflash flash --monitor --chip esp32c3"
|
||||||
|
|
||||||
|
[env]
|
||||||
|
ESP_LOG="info"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
rustflags = [
|
||||||
|
# Required to obtain backtraces (e.g. when using the "esp-backtrace" crate.)
|
||||||
|
# NOTE: May negatively impact performance of produced code
|
||||||
|
"-C", "force-frame-pointers",
|
||||||
|
]
|
||||||
|
|
||||||
|
target = "riscv32imc-unknown-none-elf"
|
||||||
|
|
||||||
|
[unstable]
|
||||||
|
build-std = ["alloc", "core"]
|
||||||
14
.envrc
Normal file
14
.envrc
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
if ! has nix_direnv_version || ! nix_direnv_version 3.0.6; then
|
||||||
|
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.6/direnvrc" "sha256-RYcUJaRMf8oF5LznDrlCXbkOQrywm0HDv1VjYGaJGdM="
|
||||||
|
fi
|
||||||
|
|
||||||
|
watch_file flake.nix
|
||||||
|
watch_file flake.lock
|
||||||
|
|
||||||
|
mkdir -p "$PWD/.devenv"
|
||||||
|
DEVENV_ROOT_FILE="$PWD/.devenv/root"
|
||||||
|
printf %s "$PWD" > "$DEVENV_ROOT_FILE"
|
||||||
|
if ! use flake . --override-input devenv-root "file+file://$DEVENV_ROOT_FILE"
|
||||||
|
then
|
||||||
|
echo "devenv could not be built. The devenv environment was not loaded. Make the necessary changes to devenv.nix and hit enter to try again." >&2
|
||||||
|
fi
|
||||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
/target
|
||||||
|
.devenv/
|
||||||
|
.direnv/
|
||||||
1543
Cargo.lock
generated
Normal file
1543
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
68
Cargo.toml
Normal file
68
Cargo.toml
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
[package]
|
||||||
|
name = "m5stamp-c3-ws2812"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "uwu"
|
||||||
|
path = "./src/bin/main.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
embassy-net = { version = "0.6.0", features = [
|
||||||
|
"dhcpv4",
|
||||||
|
"medium-ethernet",
|
||||||
|
"tcp",
|
||||||
|
"udp",
|
||||||
|
] }
|
||||||
|
embedded-io = "0.6.1"
|
||||||
|
embedded-io-async = "0.6.1"
|
||||||
|
esp-alloc = "0.7.0"
|
||||||
|
esp-hal = { version = "1.0.0-beta.0", features = ["esp32c3", "unstable"] }
|
||||||
|
esp-println = { version = "0.13.0", features = ["esp32c3", "log"] }
|
||||||
|
log = { version = "0.4.21" }
|
||||||
|
smoltcp = { version = "0.12.0", default-features = false, features = [
|
||||||
|
"medium-ethernet",
|
||||||
|
"multicast",
|
||||||
|
"proto-dhcpv4",
|
||||||
|
"proto-dns",
|
||||||
|
"proto-ipv4",
|
||||||
|
"socket-dns",
|
||||||
|
"socket-icmp",
|
||||||
|
"socket-raw",
|
||||||
|
"socket-tcp",
|
||||||
|
"socket-udp",
|
||||||
|
] }
|
||||||
|
# for more networking protocol support see https://crates.io/crates/edge-net
|
||||||
|
bleps = { git = "https://github.com/bjoernQ/bleps", package = "bleps", rev = "a5148d8ae679e021b78f53fd33afb8bb35d0b62e", features = [
|
||||||
|
"async",
|
||||||
|
"macros",
|
||||||
|
] }
|
||||||
|
critical-section = "1.2.0"
|
||||||
|
embassy-executor = { version = "0.7.0", features = ["task-arena-size-20480"] }
|
||||||
|
embassy-time = { version = "0.4.0", features = ["generic-queue-8"] }
|
||||||
|
esp-hal-embassy = { version = "0.7.0", features = ["esp32c3"] }
|
||||||
|
esp-wifi = { version = "0.13.0", features = [
|
||||||
|
"ble",
|
||||||
|
"builtin-scheduler",
|
||||||
|
"coex",
|
||||||
|
"esp-alloc",
|
||||||
|
"esp32c3",
|
||||||
|
"log",
|
||||||
|
"wifi",
|
||||||
|
] }
|
||||||
|
heapless = { version = "0.8.0", default-features = false }
|
||||||
|
static_cell = { version = "2.1.0", features = ["nightly"] }
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
# Rust debug is too slow.
|
||||||
|
# For debug builds always builds with some optimization
|
||||||
|
opt-level = "s"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
codegen-units = 1 # LLVM can perform better optimizations using a single thread
|
||||||
|
debug = 2
|
||||||
|
debug-assertions = false
|
||||||
|
incremental = false
|
||||||
|
lto = 'fat'
|
||||||
|
opt-level = 's'
|
||||||
|
overflow-checks = false
|
||||||
40
build.rs
Normal file
40
build.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
fn main() {
|
||||||
|
linker_be_nice();
|
||||||
|
// make sure linkall.x is the last linker script (otherwise might cause problems with flip-link)
|
||||||
|
println!("cargo:rustc-link-arg=-Tlinkall.x");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn linker_be_nice() {
|
||||||
|
let args: Vec<String> = std::env::args().collect();
|
||||||
|
if args.len() > 1 {
|
||||||
|
let kind = &args[1];
|
||||||
|
let what = &args[2];
|
||||||
|
|
||||||
|
match kind.as_str() {
|
||||||
|
"undefined-symbol" => match what.as_str() {
|
||||||
|
"_defmt_timestamp" => {
|
||||||
|
eprintln!();
|
||||||
|
eprintln!("💡 `defmt` not found - make sure `defmt.x` is added as a linker script and you have included `use defmt_rtt as _;`");
|
||||||
|
eprintln!();
|
||||||
|
}
|
||||||
|
"_stack_start" => {
|
||||||
|
eprintln!();
|
||||||
|
eprintln!("💡 Is the linker script `linkall.x` missing?");
|
||||||
|
eprintln!();
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
},
|
||||||
|
// we don't have anything helpful for "missing-lib" yet
|
||||||
|
_ => {
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::process::exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"cargo:rustc-link-arg=--error-handling-script={}",
|
||||||
|
std::env::current_exe().unwrap().display()
|
||||||
|
);
|
||||||
|
}
|
||||||
100
flake.nix
Normal file
100
flake.nix
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
{
|
||||||
|
description = "Description for the project";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
devenv-root = {
|
||||||
|
url = "file+file:///dev/null";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
devenv.url = "github:cachix/devenv";
|
||||||
|
nix2container.url = "github:nlewo/nix2container";
|
||||||
|
nix2container.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
devenv.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
mk-shell-bin.url = "github:rrbutani/nix-mk-shell-bin";
|
||||||
|
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
||||||
|
# crane = {
|
||||||
|
# url = "github:ipetkov/crane";
|
||||||
|
# inputs.nixpkgs.follows = "nixpkgs-old";
|
||||||
|
# };
|
||||||
|
fenix.url = "github:nix-community/fenix/monthly";
|
||||||
|
fenix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
crane.url = "github:ipetkov/crane";
|
||||||
|
};
|
||||||
|
|
||||||
|
nixConfig = {
|
||||||
|
extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=";
|
||||||
|
extra-substituters = "https://devenv.cachix.org";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
inputs@{
|
||||||
|
flake-parts,
|
||||||
|
devenv-root,
|
||||||
|
nixpkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
|
imports = [
|
||||||
|
inputs.devenv.flakeModule
|
||||||
|
];
|
||||||
|
systems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"i686-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"aarch64-linux"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
|
||||||
|
perSystem =
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
self',
|
||||||
|
inputs',
|
||||||
|
pkgs,
|
||||||
|
system,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
devenv.shells.default =
|
||||||
|
let
|
||||||
|
fnx = inputs'.fenix.packages;
|
||||||
|
rustToolchain = fnx.combine [
|
||||||
|
fnx.complete.cargo
|
||||||
|
fnx.complete.clippy
|
||||||
|
fnx.complete.rust-src
|
||||||
|
fnx.complete.rustc
|
||||||
|
fnx.complete.rustfmt
|
||||||
|
fnx.targets.riscv32imc-unknown-none-elf.latest.rust-std
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = "my-project";
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
pkgs.dioxus-cli
|
||||||
|
pkgs.espflash
|
||||||
|
pkgs.cargo-espflash
|
||||||
|
pkgs.cargo-expand
|
||||||
|
|
||||||
|
# Required for rust-src
|
||||||
|
rustToolchain
|
||||||
|
#pkgs.rust-rust-analyzer
|
||||||
|
inputs'.fenix.packages.rust-analyzer
|
||||||
|
#rustToolchain.rust-src
|
||||||
|
|
||||||
|
pkgs.slsnif
|
||||||
|
];
|
||||||
|
|
||||||
|
# DO NOT ENABLE RUST because devenv messes up the ability
|
||||||
|
# to build rust-src
|
||||||
|
# languages.rust = {};
|
||||||
|
|
||||||
|
scripts.serial-sniff.exec = ''
|
||||||
|
slsnif -u -n -s 115200 /dev/ttyACM0
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
4
rust-toolchain.toml
Normal file
4
rust-toolchain.toml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
[toolchain]
|
||||||
|
channel = "stable"
|
||||||
|
components = ["rust-src"]
|
||||||
|
targets = ["riscv32imc-unknown-none-elf"]
|
||||||
51
src/bin/main.rs
Normal file
51
src/bin/main.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use embassy_executor::Spawner;
|
||||||
|
use embassy_time::{Duration, Timer};
|
||||||
|
use esp_hal::clock::CpuClock;
|
||||||
|
use esp_hal::timer::systimer::SystemTimer;
|
||||||
|
use esp_hal::timer::timg::TimerGroup;
|
||||||
|
use log::info;
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
fn panic(_: &core::panic::PanicInfo) -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
|
#[esp_hal_embassy::main]
|
||||||
|
async fn main(spawner: Spawner) {
|
||||||
|
// generator version: 0.3.1
|
||||||
|
|
||||||
|
esp_println::logger::init_logger_from_env();
|
||||||
|
|
||||||
|
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
||||||
|
let peripherals = esp_hal::init(config);
|
||||||
|
|
||||||
|
esp_alloc::heap_allocator!(size: 72 * 1024);
|
||||||
|
|
||||||
|
let timer0 = SystemTimer::new(peripherals.SYSTIMER);
|
||||||
|
esp_hal_embassy::init(timer0.alarm0);
|
||||||
|
|
||||||
|
info!("Embassy initialized!");
|
||||||
|
|
||||||
|
let timer1 = TimerGroup::new(peripherals.TIMG0);
|
||||||
|
let _init = esp_wifi::init(
|
||||||
|
timer1.timer0,
|
||||||
|
esp_hal::rng::Rng::new(peripherals.RNG),
|
||||||
|
peripherals.RADIO_CLK,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// TODO: Spawn some tasks
|
||||||
|
let _ = spawner;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
info!("Hello world!");
|
||||||
|
Timer::after(Duration::from_secs(1)).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for inspiration have a look at the examples at https://github.com/esp-rs/esp-hal/tree/esp-hal-v1.0.0-beta.0/examples/src/bin
|
||||||
|
}
|
||||||
1
src/lib.rs
Normal file
1
src/lib.rs
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
#![no_std]
|
||||||
149
template.yaml
Normal file
149
template.yaml
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
options:
|
||||||
|
- !Option
|
||||||
|
name: unstable-hal
|
||||||
|
display_name: Enable unstable HAL features.
|
||||||
|
help: "This configuration enables unstable esp-hal features.
|
||||||
|
These come with no stability guarantees, and could be changed or removed at any time."
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: alloc
|
||||||
|
display_name: Enable allocations via the esp-alloc crate.
|
||||||
|
help: esp-alloc comes with no stability guarantees at this time.
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: wifi
|
||||||
|
display_name: Enable Wi-Fi via the esp-wifi crate.
|
||||||
|
help: esp-wifi comes with no stability guarantees at this time.
|
||||||
|
requires:
|
||||||
|
- alloc
|
||||||
|
- unstable-hal
|
||||||
|
chips:
|
||||||
|
- esp32
|
||||||
|
- esp32c2
|
||||||
|
- esp32c3
|
||||||
|
- esp32c6
|
||||||
|
- esp32s2
|
||||||
|
- esp32s3
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: ble
|
||||||
|
display_name: Enable BLE via the esp-wifi crate.
|
||||||
|
help: esp-wifi comes with no stability guarantees at this time.
|
||||||
|
requires:
|
||||||
|
- alloc
|
||||||
|
- unstable-hal
|
||||||
|
chips:
|
||||||
|
- esp32
|
||||||
|
- esp32c2
|
||||||
|
- esp32c3
|
||||||
|
- esp32c6
|
||||||
|
- esp32h2
|
||||||
|
- esp32s3
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: embassy
|
||||||
|
display_name: Add embassy framework support.
|
||||||
|
help: esp-hal-embassy comes with no stability guarantees at this time.
|
||||||
|
requires:
|
||||||
|
- unstable-hal
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: probe-rs
|
||||||
|
display_name: Use probe-rs to flash and monitor instead of espflash.
|
||||||
|
help: probe-rs is a debugger that connects to the chips over JTAG. It can be used to flash and
|
||||||
|
monitor, and it can also be used to interactively debug an application, or run tests on the
|
||||||
|
hardware. Semihosting or RTT-based technologies like defmt-rtt require probe-rs.
|
||||||
|
chips:
|
||||||
|
- esp32c6
|
||||||
|
- esp32h2
|
||||||
|
- esp32s3
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: probe-rs
|
||||||
|
display_name: Use probe-rs to flash and monitor instead of espflash.
|
||||||
|
help: probe-rs is a debugger that connects to the chips over JTAG. It can be used to flash and
|
||||||
|
monitor, and it can also be used to interactively debug an application, or run tests on the
|
||||||
|
hardware. Semihosting or RTT-based technologies like defmt-rtt require probe-rs.
|
||||||
|
|
||||||
|
probe-rs requires a debug probe like esp-prog, and will not work with USB-UART adapters that
|
||||||
|
often come on development boards.
|
||||||
|
chips:
|
||||||
|
- esp32
|
||||||
|
- esp32s2
|
||||||
|
- esp32c2
|
||||||
|
- esp32c3
|
||||||
|
|
||||||
|
- !Category
|
||||||
|
name: flashing-probe-rs
|
||||||
|
display_name: Flashing, logging and debugging (probe-rs)
|
||||||
|
requires:
|
||||||
|
- probe-rs
|
||||||
|
options:
|
||||||
|
- !Option
|
||||||
|
name: defmt
|
||||||
|
display_name: Use defmt to print messages.
|
||||||
|
selection_group: log-frontend
|
||||||
|
- !Option
|
||||||
|
name: panic-rtt-target
|
||||||
|
display_name: Use panic-rtt-target as the panic handler.
|
||||||
|
selection_group: panic-handler
|
||||||
|
requires:
|
||||||
|
- probe-rs
|
||||||
|
|
||||||
|
- !Category
|
||||||
|
name: flashing-espflash
|
||||||
|
display_name: Flashing, logging and debugging (espflash)
|
||||||
|
requires:
|
||||||
|
- "!probe-rs"
|
||||||
|
options:
|
||||||
|
- !Option
|
||||||
|
name: log
|
||||||
|
display_name: Use the log crate to print messages.
|
||||||
|
selection_group: log-frontend
|
||||||
|
requires:
|
||||||
|
- "!probe-rs"
|
||||||
|
- !Option
|
||||||
|
name: defmt
|
||||||
|
display_name: Use defmt to print messages.
|
||||||
|
selection_group: log-frontend
|
||||||
|
- !Option
|
||||||
|
name: esp-backtrace
|
||||||
|
display_name: Use esp-backtrace as the panic handler.
|
||||||
|
selection_group: panic-handler
|
||||||
|
requires:
|
||||||
|
- "!probe-rs"
|
||||||
|
|
||||||
|
- !Category
|
||||||
|
name: optional
|
||||||
|
display_name: Options
|
||||||
|
options:
|
||||||
|
- !Option
|
||||||
|
name: wokwi
|
||||||
|
display_name: Add support for Wokwi simulation using VS Code Wokwi extension.
|
||||||
|
chips:
|
||||||
|
- esp32
|
||||||
|
- esp32c3
|
||||||
|
- esp32c6
|
||||||
|
- esp32h2
|
||||||
|
- esp32s2
|
||||||
|
- esp32s3
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: dev-container
|
||||||
|
display_name: Add support for VS Code Dev Containers and GitHub Codespaces.
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: ci
|
||||||
|
display_name: Add GitHub Actions support with some basic checks.
|
||||||
|
|
||||||
|
- !Category
|
||||||
|
name: editor
|
||||||
|
display_name: Optional editor config files for rust-analyzer
|
||||||
|
options:
|
||||||
|
- !Option
|
||||||
|
name: helix
|
||||||
|
display_name: Add rust-analyzer settings for Helix Editor
|
||||||
|
|
||||||
|
- !Option
|
||||||
|
name: vscode
|
||||||
|
display_name: Add rust-analyzer settings for Visual Studio Code
|
||||||
Loading…
Add table
Add a link
Reference in a new issue