Compare commits
50 Commits
apidoc-emb
...
main
Author | SHA1 | Date | |
---|---|---|---|
a2ebede411 | |||
4695e46a59 | |||
595ad10769 | |||
bde8d435ce | |||
46fca02b82 | |||
48c802859f | |||
5a6eaa5f74 | |||
189fb06ff7 | |||
cfa7f7aa02 | |||
ecb018f51c | |||
97e73210c6 | |||
96acde1096 | |||
25aba4bb68 | |||
343d6b99d4 | |||
ab18ba6d90 | |||
|
87c03037e3 | ||
|
8b36a32ed5 | ||
|
90aebb5828 | ||
|
cf0e5e32ad | ||
|
530ead5fde | ||
|
8442e72589 | ||
|
0acf7b09c3 | ||
|
745d618ab7 | ||
|
d832d45c0b | ||
|
03dc624fb1 | ||
|
d6fda686bc | ||
|
896690c415 | ||
|
76c600365d | ||
|
18dac099cb | ||
|
49005e955d | ||
|
70ea805af3 | ||
|
93bb34d8d1 | ||
|
51a67cb69a | ||
|
c8eb128a56 | ||
|
22ee868f04 | ||
|
1c3cf347cb | ||
|
b8777eaea2 | ||
|
13c107e815 | ||
|
b0583b17cb | ||
|
246c49621c | ||
|
c3b827d8cd | ||
|
4dfae9328e | ||
|
73f8cd7ade | ||
|
4a2dd7b944 | ||
|
afb01e3fc5 | ||
|
89cfdcb9f5 | ||
|
abea4dde3d | ||
|
52a801fdb7 | ||
|
fc6e70caa5 | ||
|
f9d0daad80 |
@ -7,6 +7,7 @@ set -euo pipefail
|
|||||||
export RUSTUP_HOME=/ci/cache/rustup
|
export RUSTUP_HOME=/ci/cache/rustup
|
||||||
export CARGO_HOME=/ci/cache/cargo
|
export CARGO_HOME=/ci/cache/cargo
|
||||||
export CARGO_TARGET_DIR=/ci/cache/target
|
export CARGO_TARGET_DIR=/ci/cache/target
|
||||||
|
mv rust-toolchain-nightly.toml rust-toolchain.toml
|
||||||
|
|
||||||
# needed for "dumb HTTP" transport support
|
# needed for "dumb HTTP" transport support
|
||||||
# used when pointing stm32-metapac to a CI-built one.
|
# used when pointing stm32-metapac to a CI-built one.
|
||||||
@ -21,9 +22,7 @@ fi
|
|||||||
hashtime restore /ci/cache/filetime.json || true
|
hashtime restore /ci/cache/filetime.json || true
|
||||||
hashtime save /ci/cache/filetime.json
|
hashtime save /ci/cache/filetime.json
|
||||||
|
|
||||||
sed -i 's/channel.*/channel = "beta"/g' rust-toolchain.toml
|
./ci-nightly.sh
|
||||||
|
|
||||||
./ci_stable.sh
|
|
||||||
|
|
||||||
# Save lockfiles
|
# Save lockfiles
|
||||||
echo Saving lockfiles...
|
echo Saving lockfiles...
|
12
.github/ci/rustfmt.sh
vendored
Executable file
12
.github/ci/rustfmt.sh
vendored
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
## on push branch~=gh-readonly-queue/main/.*
|
||||||
|
## on pull_request
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
export RUSTUP_HOME=/ci/cache/rustup
|
||||||
|
export CARGO_HOME=/ci/cache/cargo
|
||||||
|
export CARGO_TARGET_DIR=/ci/cache/target
|
||||||
|
mv rust-toolchain-nightly.toml rust-toolchain.toml
|
||||||
|
|
||||||
|
find . -name '*.rs' -not -path '*target*' | xargs rustfmt --check --skip-children --unstable-features --edition 2021
|
13
.github/ci/test-nightly.sh
vendored
Executable file
13
.github/ci/test-nightly.sh
vendored
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
## on push branch~=gh-readonly-queue/main/.*
|
||||||
|
## on pull_request
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
export RUSTUP_HOME=/ci/cache/rustup
|
||||||
|
export CARGO_HOME=/ci/cache/cargo
|
||||||
|
export CARGO_TARGET_DIR=/ci/cache/target
|
||||||
|
mv rust-toolchain-nightly.toml rust-toolchain.toml
|
||||||
|
|
||||||
|
MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml
|
||||||
|
MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml --features nightly
|
3
.github/ci/test.sh
vendored
3
.github/ci/test.sh
vendored
@ -8,9 +8,6 @@ export RUSTUP_HOME=/ci/cache/rustup
|
|||||||
export CARGO_HOME=/ci/cache/cargo
|
export CARGO_HOME=/ci/cache/cargo
|
||||||
export CARGO_TARGET_DIR=/ci/cache/target
|
export CARGO_TARGET_DIR=/ci/cache/target
|
||||||
|
|
||||||
MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml
|
|
||||||
MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml --features nightly
|
|
||||||
|
|
||||||
cargo test --manifest-path ./embassy-sync/Cargo.toml
|
cargo test --manifest-path ./embassy-sync/Cargo.toml
|
||||||
cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml
|
cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml
|
||||||
cargo test --manifest-path ./embassy-hal-internal/Cargo.toml
|
cargo test --manifest-path ./embassy-hal-internal/Cargo.toml
|
||||||
|
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
@ -15,14 +15,10 @@
|
|||||||
//"rust-analyzer.cargo.target": "thumbv7m-none-eabi",
|
//"rust-analyzer.cargo.target": "thumbv7m-none-eabi",
|
||||||
"rust-analyzer.cargo.target": "thumbv7em-none-eabi",
|
"rust-analyzer.cargo.target": "thumbv7em-none-eabi",
|
||||||
//"rust-analyzer.cargo.target": "thumbv8m.main-none-eabihf",
|
//"rust-analyzer.cargo.target": "thumbv8m.main-none-eabihf",
|
||||||
"rust-analyzer.cargo.features": [
|
|
||||||
// Uncomment if the example has a "nightly" feature.
|
|
||||||
"nightly",
|
|
||||||
],
|
|
||||||
"rust-analyzer.linkedProjects": [
|
"rust-analyzer.linkedProjects": [
|
||||||
// Uncomment ONE line for the chip you want to work on.
|
// Uncomment ONE line for the chip you want to work on.
|
||||||
// This makes rust-analyzer work on the example crate and all its dependencies.
|
// This makes rust-analyzer work on the example crate and all its dependencies.
|
||||||
"examples/nrf52840/Cargo.toml",
|
"examples/stm32l4/Cargo.toml",
|
||||||
// "examples/nrf52840-rtic/Cargo.toml",
|
// "examples/nrf52840-rtic/Cargo.toml",
|
||||||
// "examples/nrf5340/Cargo.toml",
|
// "examples/nrf5340/Cargo.toml",
|
||||||
// "examples/nrf-rtos-trace/Cargo.toml",
|
// "examples/nrf-rtos-trace/Cargo.toml",
|
||||||
@ -49,4 +45,4 @@
|
|||||||
// "examples/stm32wl/Cargo.toml",
|
// "examples/stm32wl/Cargo.toml",
|
||||||
// "examples/wasm/Cargo.toml",
|
// "examples/wasm/Cargo.toml",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
30
ci-nightly.sh
Executable file
30
ci-nightly.sh
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eo pipefail
|
||||||
|
|
||||||
|
export RUSTFLAGS=-Dwarnings
|
||||||
|
export DEFMT_LOG=trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info
|
||||||
|
if [[ -z "${CARGO_TARGET_DIR}" ]]; then
|
||||||
|
export CARGO_TARGET_DIR=target_ci
|
||||||
|
fi
|
||||||
|
|
||||||
|
cargo batch \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,log \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,defmt \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,integrated-timers \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,integrated-timers \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-interrupt \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-interrupt,integrated-timers \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,executor-interrupt \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32 \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,integrated-timers \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,executor-thread \
|
||||||
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,executor-thread,integrated-timers \
|
||||||
|
--- build --release --manifest-path examples/nrf52840-rtic/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840-rtic \
|
||||||
|
|
41
ci.sh
41
ci.sh
@ -15,26 +15,24 @@ if [ $TARGET = "x86_64-unknown-linux-gnu" ]; then
|
|||||||
BUILD_EXTRA="--- build --release --manifest-path examples/std/Cargo.toml --target $TARGET --out-dir out/examples/std"
|
BUILD_EXTRA="--- build --release --manifest-path examples/std/Cargo.toml --target $TARGET --out-dir out/examples/std"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find . -name '*.rs' -not -path '*target*' | xargs rustfmt --check --skip-children --unstable-features --edition 2021
|
|
||||||
|
|
||||||
cargo batch \
|
cargo batch \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,log \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features log \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,defmt \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features defmt \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features nightly,defmt,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-interrupt \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-interrupt,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-interrupt,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,executor-interrupt \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features nightly,arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features arch-cortex-m,executor-thread,executor-interrupt,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32 \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32 \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,executor-thread \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32,executor-thread \
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features nightly,arch-riscv32,executor-thread,integrated-timers \
|
--- build --release --manifest-path embassy-executor/Cargo.toml --target riscv32imac-unknown-none-elf --features arch-riscv32,executor-thread,integrated-timers \
|
||||||
--- build --release --manifest-path embassy-sync/Cargo.toml --target thumbv6m-none-eabi --features defmt \
|
--- build --release --manifest-path embassy-sync/Cargo.toml --target thumbv6m-none-eabi --features defmt \
|
||||||
--- build --release --manifest-path embassy-time/Cargo.toml --target thumbv6m-none-eabi --features defmt,defmt-timestamp-uptime,tick-hz-32_768,generic-queue-8 \
|
--- build --release --manifest-path embassy-time/Cargo.toml --target thumbv6m-none-eabi --features defmt,defmt-timestamp-uptime,tick-hz-32_768,generic-queue-8 \
|
||||||
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,medium-ethernet \
|
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,medium-ethernet \
|
||||||
@ -91,12 +89,12 @@ cargo batch \
|
|||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f417zg,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f417zg,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f423zh,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f423zh,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f427zi,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f427zi,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any,embedded-sdmmc,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f437zi,log,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f437zi,log,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f439zi,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f439zi,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f446ze,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f446ze,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f469zi,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f469zi,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f479zi,defmt,exti,time-driver-any,embedded-sdmmc,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f479zi,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f730i8,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f730i8,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h753zi,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h753zi,defmt,exti,time-driver-any,time \
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h735zg,defmt,exti,time-driver-any,time \
|
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h735zg,defmt,exti,time-driver-any,time \
|
||||||
@ -140,7 +138,6 @@ cargo batch \
|
|||||||
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-irq/Cargo.toml --target thumbv7em-none-eabi \
|
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-irq/Cargo.toml --target thumbv7em-none-eabi \
|
||||||
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-async/Cargo.toml --target thumbv7em-none-eabi \
|
--- build --release --manifest-path docs/modules/ROOT/examples/layer-by-layer/blinky-async/Cargo.toml --target thumbv7em-none-eabi \
|
||||||
--- build --release --manifest-path examples/nrf52840/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840 \
|
--- build --release --manifest-path examples/nrf52840/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840 \
|
||||||
--- build --release --manifest-path examples/nrf52840-rtic/Cargo.toml --target thumbv7em-none-eabi --out-dir out/examples/nrf52840-rtic \
|
|
||||||
--- build --release --manifest-path examples/nrf5340/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/nrf5340 \
|
--- build --release --manifest-path examples/nrf5340/Cargo.toml --target thumbv8m.main-none-eabihf --out-dir out/examples/nrf5340 \
|
||||||
--- build --release --manifest-path examples/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/rp \
|
--- build --release --manifest-path examples/rp/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/rp \
|
||||||
--- build --release --manifest-path examples/stm32f0/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/stm32f0 \
|
--- build --release --manifest-path examples/stm32f0/Cargo.toml --target thumbv6m-none-eabi --out-dir out/examples/stm32f0 \
|
||||||
|
77
ci_stable.sh
77
ci_stable.sh
@ -1,77 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
export RUSTFLAGS=-Dwarnings
|
|
||||||
export DEFMT_LOG=trace
|
|
||||||
|
|
||||||
cargo batch \
|
|
||||||
--- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv7em-none-eabi --features embassy-nrf/nrf52840 \
|
|
||||||
--- build --release --manifest-path embassy-boot/nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features embassy-nrf/nrf9160-ns \
|
|
||||||
--- build --release --manifest-path embassy-boot/rp/Cargo.toml --target thumbv6m-none-eabi \
|
|
||||||
--- build --release --manifest-path embassy-boot/stm32/Cargo.toml --target thumbv7em-none-eabi --features embassy-stm32/stm32wl55jc-cm4 \
|
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi \
|
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features log \
|
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv7em-none-eabi --features defmt \
|
|
||||||
--- build --release --manifest-path embassy-executor/Cargo.toml --target thumbv6m-none-eabi --features defmt \
|
|
||||||
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv4,medium-ethernet \
|
|
||||||
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,dhcpv4,medium-ethernet \
|
|
||||||
--- build --release --manifest-path embassy-net/Cargo.toml --target thumbv7em-none-eabi --features defmt,tcp,udp,dns,proto-ipv6,medium-ethernet \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52805,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52810,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52811,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52820,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52832,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52833,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf9160-s,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf9160-ns,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-app-s,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-app-ns,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv8m.main-none-eabihf --features nrf5340-net,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,log,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-nrf/Cargo.toml --target thumbv7em-none-eabi --features nrf52840,defmt,gpiote,time-driver-rtc1 \
|
|
||||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features defmt \
|
|
||||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features log \
|
|
||||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi \
|
|
||||||
--- build --release --manifest-path embassy-rp/Cargo.toml --target thumbv6m-none-eabi --features qspi-as-gpio \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g473cc,defmt,exti,time-driver-any \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g491re,defmt,exti,time-driver-any \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585zi,defmt,exti,time-driver-any \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55vy,defmt,exti,time-driver-any \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wl55cc-cm4,defmt,exti,time-driver-any \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g473cc,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32g491re,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32u585zi,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wb55vy,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32wl55cc-cm4,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l4r9zi,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f303vc,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f411ce,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f411ce,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f410tb,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f410tb,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32f429zi,log,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32h755zi-cm7,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7em-none-eabi --features stm32l476vg,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv6m-none-eabi --features stm32l072cz,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32l151cb-a,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f217zg,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path embassy-stm32/Cargo.toml --target thumbv7m-none-eabi --features stm32f217zg,defmt,exti,time-driver-any,time \
|
|
||||||
--- build --release --manifest-path examples/nrf52840/Cargo.toml --target thumbv7em-none-eabi --no-default-features --out-dir out/examples/nrf52840 --bin raw_spawn \
|
|
||||||
--- build --release --manifest-path examples/stm32l0/Cargo.toml --target thumbv6m-none-eabi --no-default-features --out-dir out/examples/stm32l0 --bin raw_spawn \
|
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
cortex-m = "0.7"
|
cortex-m = "0.7"
|
||||||
cortex-m-rt = "0.7"
|
cortex-m-rt = "0.7"
|
||||||
embassy-stm32 = { version = "0.1.0", features = ["stm32l475vg", "memory-x", "exti"] }
|
embassy-stm32 = { version = "0.1.0", features = ["stm32l475vg", "memory-x", "exti"] }
|
||||||
embassy-executor = { version = "0.4.0", features = ["nightly", "arch-cortex-m", "executor-thread"] }
|
embassy-executor = { version = "0.4.0", features = ["arch-cortex-m", "executor-thread"] }
|
||||||
|
|
||||||
defmt = "0.3.0"
|
defmt = "0.3.0"
|
||||||
defmt-rtt = "0.3.0"
|
defmt-rtt = "0.3.0"
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_stm32::exti::ExtiInput;
|
use embassy_stm32::exti::ExtiInput;
|
||||||
|
@ -35,7 +35,7 @@ For Cortex-M targets, consider making sure that ALL of the following features ar
|
|||||||
* `executor-thread`
|
* `executor-thread`
|
||||||
* `nightly`
|
* `nightly`
|
||||||
|
|
||||||
For Xtensa ESP32, consider using the executors and `#[main]` macro provided by your appropriate link:https://crates.io/crates/esp-hal-common[HAL crate].
|
For ESP32, consider using the executors and `#[main]` macro provided by your appropriate link:https://crates.io/crates/esp-hal-common[HAL crate].
|
||||||
|
|
||||||
== Why is my binary so big?
|
== Why is my binary so big?
|
||||||
|
|
||||||
|
@ -184,10 +184,12 @@ impl<'d, DFU: NorFlash, STATE: NorFlash> BlockingFirmwareUpdater<'d, DFU, STATE>
|
|||||||
///
|
///
|
||||||
/// Failing to meet alignment and size requirements may result in a panic.
|
/// Failing to meet alignment and size requirements may result in a panic.
|
||||||
pub fn write_firmware(&mut self, offset: usize, data: &[u8]) -> Result<(), FirmwareUpdaterError> {
|
pub fn write_firmware(&mut self, offset: usize, data: &[u8]) -> Result<(), FirmwareUpdaterError> {
|
||||||
assert!(data.len() >= DFU::ERASE_SIZE);
|
//assert!(data.len() >= DFU::ERASE_SIZE);
|
||||||
self.state.verify_booted()?;
|
self.state.verify_booted()?;
|
||||||
|
|
||||||
self.dfu.erase(offset as u32, (offset + data.len()) as u32)?;
|
if offset == 0 {
|
||||||
|
self.dfu.erase(0, self.dfu.capacity() as u32)?;
|
||||||
|
}
|
||||||
|
|
||||||
self.dfu.write(offset as u32, data)?;
|
self.dfu.write(offset as u32, data)?;
|
||||||
|
|
||||||
|
@ -4,6 +4,12 @@ name = "embassy-boot-nrf"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = "Bootloader lib for nRF chips"
|
description = "Bootloader lib for nRF chips"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
|
categories = [
|
||||||
|
"embedded",
|
||||||
|
"no-std",
|
||||||
|
"asynchronous",
|
||||||
|
]
|
||||||
|
|
||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/nrf/src/"
|
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/nrf/src/"
|
||||||
@ -25,7 +31,7 @@ embedded-storage = "0.3.1"
|
|||||||
embedded-storage-async = { version = "0.4.1" }
|
embedded-storage-async = { version = "0.4.1" }
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
|
|
||||||
nrf-softdevice-mbr = { version = "0.1.0", git = "https://github.com/embassy-rs/nrf-softdevice.git", branch = "master", optional = true }
|
nrf-softdevice-mbr = { version = "0.2.0", optional = true }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
defmt = [
|
defmt = [
|
||||||
|
@ -4,6 +4,12 @@ name = "embassy-boot-rp"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = "Bootloader lib for RP2040 chips"
|
description = "Bootloader lib for RP2040 chips"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
|
categories = [
|
||||||
|
"embedded",
|
||||||
|
"no-std",
|
||||||
|
"asynchronous",
|
||||||
|
]
|
||||||
|
|
||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-rp-v$VERSION/src/"
|
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-rp-v$VERSION/src/"
|
||||||
|
@ -4,6 +4,12 @@ name = "embassy-boot-stm32"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = "Bootloader lib for STM32 chips"
|
description = "Bootloader lib for STM32 chips"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
|
categories = [
|
||||||
|
"embedded",
|
||||||
|
"no-std",
|
||||||
|
"asynchronous",
|
||||||
|
]
|
||||||
|
|
||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/stm32/src/"
|
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-boot-nrf-v$VERSION/embassy-boot/stm32/src/"
|
||||||
|
@ -14,7 +14,7 @@ categories = [
|
|||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-executor-v$VERSION/embassy-executor/src/"
|
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-executor-v$VERSION/embassy-executor/src/"
|
||||||
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-executor/src/"
|
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-executor/src/"
|
||||||
features = ["nightly", "defmt"]
|
features = ["defmt"]
|
||||||
flavors = [
|
flavors = [
|
||||||
{ name = "std", target = "x86_64-unknown-linux-gnu", features = ["arch-std", "executor-thread"] },
|
{ name = "std", target = "x86_64-unknown-linux-gnu", features = ["arch-std", "executor-thread"] },
|
||||||
{ name = "wasm", target = "wasm32-unknown-unknown", features = ["arch-wasm", "executor-thread"] },
|
{ name = "wasm", target = "wasm32-unknown-unknown", features = ["arch-wasm", "executor-thread"] },
|
||||||
@ -25,7 +25,7 @@ flavors = [
|
|||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
default-target = "thumbv7em-none-eabi"
|
default-target = "thumbv7em-none-eabi"
|
||||||
targets = ["thumbv7em-none-eabi"]
|
targets = ["thumbv7em-none-eabi"]
|
||||||
features = ["nightly", "defmt", "arch-cortex-m", "executor-thread", "executor-interrupt"]
|
features = ["defmt", "arch-cortex-m", "executor-thread", "executor-interrupt"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
|
@ -6,8 +6,7 @@ keywords = ["embedded", "ADIN1110", "embassy-net", "embedded-hal-async", "ethern
|
|||||||
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
heapless = "0.8"
|
heapless = "0.8"
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
/// CRC32 lookup table.
|
||||||
pub const CRC32R_LOOKUP_TABLE: [u32; 256] = [
|
pub const CRC32R_LOOKUP_TABLE: [u32; 256] = [
|
||||||
0x0000_0000,
|
0x0000_0000,
|
||||||
0x7707_3096,
|
0x7707_3096,
|
||||||
@ -263,8 +264,9 @@ pub const CRC32R_LOOKUP_TABLE: [u32; 256] = [
|
|||||||
pub struct ETH_FCS(pub u32);
|
pub struct ETH_FCS(pub u32);
|
||||||
|
|
||||||
impl ETH_FCS {
|
impl ETH_FCS {
|
||||||
pub const CRC32_OK: u32 = 0x2144_df1c;
|
const CRC32_OK: u32 = 0x2144_df1c;
|
||||||
|
|
||||||
|
/// Create a new frame check sequence from `data`.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(data: &[u8]) -> Self {
|
pub fn new(data: &[u8]) -> Self {
|
||||||
let fcs = data.iter().fold(u32::MAX, |crc, byte| {
|
let fcs = data.iter().fold(u32::MAX, |crc, byte| {
|
||||||
@ -274,6 +276,7 @@ impl ETH_FCS {
|
|||||||
Self(fcs)
|
Self(fcs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Update the frame check sequence with `data`.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn update(self, data: &[u8]) -> Self {
|
pub fn update(self, data: &[u8]) -> Self {
|
||||||
let fcs = data.iter().fold(self.0 ^ u32::MAX, |crc, byte| {
|
let fcs = data.iter().fold(self.0 ^ u32::MAX, |crc, byte| {
|
||||||
@ -283,16 +286,19 @@ impl ETH_FCS {
|
|||||||
Self(fcs)
|
Self(fcs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if the frame check sequence is correct.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn crc_ok(&self) -> bool {
|
pub fn crc_ok(&self) -> bool {
|
||||||
self.0 == Self::CRC32_OK
|
self.0 == Self::CRC32_OK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Switch byte order.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn hton_bytes(&self) -> [u8; 4] {
|
pub fn hton_bytes(&self) -> [u8; 4] {
|
||||||
self.0.to_le_bytes()
|
self.0.to_le_bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Switch byte order as a u32.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn hton(&self) -> u32 {
|
pub fn hton(&self) -> u32 {
|
||||||
self.0.to_le()
|
self.0.to_le()
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#![allow(clippy::missing_errors_doc)]
|
#![allow(clippy::missing_errors_doc)]
|
||||||
#![allow(clippy::missing_panics_doc)]
|
#![allow(clippy::missing_panics_doc)]
|
||||||
#![doc = include_str!("../README.md")]
|
#![doc = include_str!("../README.md")]
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
// must go first!
|
// must go first!
|
||||||
mod fmt;
|
mod fmt;
|
||||||
@ -26,8 +27,9 @@ use embedded_hal_async::digital::Wait;
|
|||||||
use embedded_hal_async::spi::{Error, Operation, SpiDevice};
|
use embedded_hal_async::spi::{Error, Operation, SpiDevice};
|
||||||
use heapless::Vec;
|
use heapless::Vec;
|
||||||
pub use mdio::MdioBus;
|
pub use mdio::MdioBus;
|
||||||
pub use phy::{Phy10BaseT1x, RegsC22, RegsC45};
|
pub use phy::Phy10BaseT1x;
|
||||||
pub use regs::{Config0, Config2, SpiRegisters as sr, Status0, Status1};
|
use phy::{RegsC22, RegsC45};
|
||||||
|
use regs::{Config0, Config2, SpiRegisters as sr, Status0, Status1};
|
||||||
|
|
||||||
use crate::fmt::Bytes;
|
use crate::fmt::Bytes;
|
||||||
use crate::regs::{LedCntrl, LedFunc, LedPol, LedPolarity, SpiHeader};
|
use crate::regs::{LedCntrl, LedFunc, LedPol, LedPolarity, SpiHeader};
|
||||||
@ -446,6 +448,7 @@ pub struct Runner<'d, SPI, INT, RST> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, SPI, INT, RST> {
|
impl<'d, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, SPI, INT, RST> {
|
||||||
|
/// Run the driver.
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub async fn run(mut self) -> ! {
|
pub async fn run(mut self) -> ! {
|
||||||
loop {
|
loop {
|
||||||
|
@ -39,6 +39,7 @@ enum Reg13Op {
|
|||||||
///
|
///
|
||||||
/// Clause 45 methodes are bases on <https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf>
|
/// Clause 45 methodes are bases on <https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf>
|
||||||
pub trait MdioBus {
|
pub trait MdioBus {
|
||||||
|
/// Error type.
|
||||||
type Error;
|
type Error;
|
||||||
|
|
||||||
/// Read, Clause 22
|
/// Read, Clause 22
|
||||||
|
@ -2,6 +2,7 @@ use core::fmt::{Debug, Display};
|
|||||||
|
|
||||||
use bitfield::{bitfield, bitfield_bitrange, bitfield_fields};
|
use bitfield::{bitfield, bitfield_bitrange, bitfield_fields};
|
||||||
|
|
||||||
|
#[allow(missing_docs)]
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![doc = include_str!("../README.md")]
|
#![doc = include_str!("../README.md")]
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
// must go first!
|
// must go first!
|
||||||
mod fmt;
|
mod fmt;
|
||||||
@ -15,6 +16,9 @@ use embassy_sync::blocking_mutex::Mutex;
|
|||||||
use embassy_sync::waitqueue::WakerRegistration;
|
use embassy_sync::waitqueue::WakerRegistration;
|
||||||
use embassy_sync::zerocopy_channel;
|
use embassy_sync::zerocopy_channel;
|
||||||
|
|
||||||
|
/// Channel state.
|
||||||
|
///
|
||||||
|
/// Holds a buffer of packets with size MTU, for both TX and RX.
|
||||||
pub struct State<const MTU: usize, const N_RX: usize, const N_TX: usize> {
|
pub struct State<const MTU: usize, const N_RX: usize, const N_TX: usize> {
|
||||||
rx: [PacketBuf<MTU>; N_RX],
|
rx: [PacketBuf<MTU>; N_RX],
|
||||||
tx: [PacketBuf<MTU>; N_TX],
|
tx: [PacketBuf<MTU>; N_TX],
|
||||||
@ -24,6 +28,7 @@ pub struct State<const MTU: usize, const N_RX: usize, const N_TX: usize> {
|
|||||||
impl<const MTU: usize, const N_RX: usize, const N_TX: usize> State<MTU, N_RX, N_TX> {
|
impl<const MTU: usize, const N_RX: usize, const N_TX: usize> State<MTU, N_RX, N_TX> {
|
||||||
const NEW_PACKET: PacketBuf<MTU> = PacketBuf::new();
|
const NEW_PACKET: PacketBuf<MTU> = PacketBuf::new();
|
||||||
|
|
||||||
|
/// Create a new channel state.
|
||||||
pub const fn new() -> Self {
|
pub const fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
rx: [Self::NEW_PACKET; N_RX],
|
rx: [Self::NEW_PACKET; N_RX],
|
||||||
@ -39,33 +44,45 @@ struct StateInner<'d, const MTU: usize> {
|
|||||||
shared: Mutex<NoopRawMutex, RefCell<Shared>>,
|
shared: Mutex<NoopRawMutex, RefCell<Shared>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// State of the LinkState
|
|
||||||
struct Shared {
|
struct Shared {
|
||||||
link_state: LinkState,
|
link_state: LinkState,
|
||||||
waker: WakerRegistration,
|
waker: WakerRegistration,
|
||||||
hardware_address: driver::HardwareAddress,
|
hardware_address: driver::HardwareAddress,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Channel runner.
|
||||||
|
///
|
||||||
|
/// Holds the shared state and the lower end of channels for inbound and outbound packets.
|
||||||
pub struct Runner<'d, const MTU: usize> {
|
pub struct Runner<'d, const MTU: usize> {
|
||||||
tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>,
|
tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
|
rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
|
shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// State runner.
|
||||||
|
///
|
||||||
|
/// Holds the shared state of the channel such as link state.
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
pub struct StateRunner<'d> {
|
pub struct StateRunner<'d> {
|
||||||
shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
|
shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// RX runner.
|
||||||
|
///
|
||||||
|
/// Holds the lower end of the channel for passing inbound packets up the stack.
|
||||||
pub struct RxRunner<'d, const MTU: usize> {
|
pub struct RxRunner<'d, const MTU: usize> {
|
||||||
rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
|
rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// TX runner.
|
||||||
|
///
|
||||||
|
/// Holds the lower end of the channel for passing outbound packets down the stack.
|
||||||
pub struct TxRunner<'d, const MTU: usize> {
|
pub struct TxRunner<'d, const MTU: usize> {
|
||||||
tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>,
|
tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, const MTU: usize> Runner<'d, MTU> {
|
impl<'d, const MTU: usize> Runner<'d, MTU> {
|
||||||
|
/// Split the runner into separate runners for controlling state, rx and tx.
|
||||||
pub fn split(self) -> (StateRunner<'d>, RxRunner<'d, MTU>, TxRunner<'d, MTU>) {
|
pub fn split(self) -> (StateRunner<'d>, RxRunner<'d, MTU>, TxRunner<'d, MTU>) {
|
||||||
(
|
(
|
||||||
StateRunner { shared: self.shared },
|
StateRunner { shared: self.shared },
|
||||||
@ -74,6 +91,7 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Split the runner into separate runners for controlling state, rx and tx borrowing the underlying state.
|
||||||
pub fn borrow_split(&mut self) -> (StateRunner<'_>, RxRunner<'_, MTU>, TxRunner<'_, MTU>) {
|
pub fn borrow_split(&mut self) -> (StateRunner<'_>, RxRunner<'_, MTU>, TxRunner<'_, MTU>) {
|
||||||
(
|
(
|
||||||
StateRunner { shared: self.shared },
|
StateRunner { shared: self.shared },
|
||||||
@ -86,10 +104,12 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a state runner sharing the state channel.
|
||||||
pub fn state_runner(&self) -> StateRunner<'d> {
|
pub fn state_runner(&self) -> StateRunner<'d> {
|
||||||
StateRunner { shared: self.shared }
|
StateRunner { shared: self.shared }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the link state.
|
||||||
pub fn set_link_state(&mut self, state: LinkState) {
|
pub fn set_link_state(&mut self, state: LinkState) {
|
||||||
self.shared.lock(|s| {
|
self.shared.lock(|s| {
|
||||||
let s = &mut *s.borrow_mut();
|
let s = &mut *s.borrow_mut();
|
||||||
@ -98,6 +118,7 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the hardware address.
|
||||||
pub fn set_hardware_address(&mut self, address: driver::HardwareAddress) {
|
pub fn set_hardware_address(&mut self, address: driver::HardwareAddress) {
|
||||||
self.shared.lock(|s| {
|
self.shared.lock(|s| {
|
||||||
let s = &mut *s.borrow_mut();
|
let s = &mut *s.borrow_mut();
|
||||||
@ -106,16 +127,19 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wait until there is space for more inbound packets and return a slice they can be copied into.
|
||||||
pub async fn rx_buf(&mut self) -> &mut [u8] {
|
pub async fn rx_buf(&mut self) -> &mut [u8] {
|
||||||
let p = self.rx_chan.send().await;
|
let p = self.rx_chan.send().await;
|
||||||
&mut p.buf
|
&mut p.buf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if there is space for more inbound packets right now.
|
||||||
pub fn try_rx_buf(&mut self) -> Option<&mut [u8]> {
|
pub fn try_rx_buf(&mut self) -> Option<&mut [u8]> {
|
||||||
let p = self.rx_chan.try_send()?;
|
let p = self.rx_chan.try_send()?;
|
||||||
Some(&mut p.buf)
|
Some(&mut p.buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Polling the inbound channel if there is space for packets.
|
||||||
pub fn poll_rx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
pub fn poll_rx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
||||||
match self.rx_chan.poll_send(cx) {
|
match self.rx_chan.poll_send(cx) {
|
||||||
Poll::Ready(p) => Poll::Ready(&mut p.buf),
|
Poll::Ready(p) => Poll::Ready(&mut p.buf),
|
||||||
@ -123,22 +147,26 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mark packet of len bytes as pushed to the inbound channel.
|
||||||
pub fn rx_done(&mut self, len: usize) {
|
pub fn rx_done(&mut self, len: usize) {
|
||||||
let p = self.rx_chan.try_send().unwrap();
|
let p = self.rx_chan.try_send().unwrap();
|
||||||
p.len = len;
|
p.len = len;
|
||||||
self.rx_chan.send_done();
|
self.rx_chan.send_done();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wait until there is space for more outbound packets and return a slice they can be copied into.
|
||||||
pub async fn tx_buf(&mut self) -> &mut [u8] {
|
pub async fn tx_buf(&mut self) -> &mut [u8] {
|
||||||
let p = self.tx_chan.receive().await;
|
let p = self.tx_chan.receive().await;
|
||||||
&mut p.buf[..p.len]
|
&mut p.buf[..p.len]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if there is space for more outbound packets right now.
|
||||||
pub fn try_tx_buf(&mut self) -> Option<&mut [u8]> {
|
pub fn try_tx_buf(&mut self) -> Option<&mut [u8]> {
|
||||||
let p = self.tx_chan.try_receive()?;
|
let p = self.tx_chan.try_receive()?;
|
||||||
Some(&mut p.buf[..p.len])
|
Some(&mut p.buf[..p.len])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Polling the outbound channel if there is space for packets.
|
||||||
pub fn poll_tx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
pub fn poll_tx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
||||||
match self.tx_chan.poll_receive(cx) {
|
match self.tx_chan.poll_receive(cx) {
|
||||||
Poll::Ready(p) => Poll::Ready(&mut p.buf[..p.len]),
|
Poll::Ready(p) => Poll::Ready(&mut p.buf[..p.len]),
|
||||||
@ -146,12 +174,14 @@ impl<'d, const MTU: usize> Runner<'d, MTU> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mark outbound packet as copied.
|
||||||
pub fn tx_done(&mut self) {
|
pub fn tx_done(&mut self) {
|
||||||
self.tx_chan.receive_done();
|
self.tx_chan.receive_done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d> StateRunner<'d> {
|
impl<'d> StateRunner<'d> {
|
||||||
|
/// Set link state.
|
||||||
pub fn set_link_state(&self, state: LinkState) {
|
pub fn set_link_state(&self, state: LinkState) {
|
||||||
self.shared.lock(|s| {
|
self.shared.lock(|s| {
|
||||||
let s = &mut *s.borrow_mut();
|
let s = &mut *s.borrow_mut();
|
||||||
@ -160,6 +190,7 @@ impl<'d> StateRunner<'d> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the hardware address.
|
||||||
pub fn set_hardware_address(&self, address: driver::HardwareAddress) {
|
pub fn set_hardware_address(&self, address: driver::HardwareAddress) {
|
||||||
self.shared.lock(|s| {
|
self.shared.lock(|s| {
|
||||||
let s = &mut *s.borrow_mut();
|
let s = &mut *s.borrow_mut();
|
||||||
@ -170,16 +201,19 @@ impl<'d> StateRunner<'d> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, const MTU: usize> RxRunner<'d, MTU> {
|
impl<'d, const MTU: usize> RxRunner<'d, MTU> {
|
||||||
|
/// Wait until there is space for more inbound packets and return a slice they can be copied into.
|
||||||
pub async fn rx_buf(&mut self) -> &mut [u8] {
|
pub async fn rx_buf(&mut self) -> &mut [u8] {
|
||||||
let p = self.rx_chan.send().await;
|
let p = self.rx_chan.send().await;
|
||||||
&mut p.buf
|
&mut p.buf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if there is space for more inbound packets right now.
|
||||||
pub fn try_rx_buf(&mut self) -> Option<&mut [u8]> {
|
pub fn try_rx_buf(&mut self) -> Option<&mut [u8]> {
|
||||||
let p = self.rx_chan.try_send()?;
|
let p = self.rx_chan.try_send()?;
|
||||||
Some(&mut p.buf)
|
Some(&mut p.buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Polling the inbound channel if there is space for packets.
|
||||||
pub fn poll_rx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
pub fn poll_rx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
||||||
match self.rx_chan.poll_send(cx) {
|
match self.rx_chan.poll_send(cx) {
|
||||||
Poll::Ready(p) => Poll::Ready(&mut p.buf),
|
Poll::Ready(p) => Poll::Ready(&mut p.buf),
|
||||||
@ -187,6 +221,7 @@ impl<'d, const MTU: usize> RxRunner<'d, MTU> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mark packet of len bytes as pushed to the inbound channel.
|
||||||
pub fn rx_done(&mut self, len: usize) {
|
pub fn rx_done(&mut self, len: usize) {
|
||||||
let p = self.rx_chan.try_send().unwrap();
|
let p = self.rx_chan.try_send().unwrap();
|
||||||
p.len = len;
|
p.len = len;
|
||||||
@ -195,16 +230,19 @@ impl<'d, const MTU: usize> RxRunner<'d, MTU> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, const MTU: usize> TxRunner<'d, MTU> {
|
impl<'d, const MTU: usize> TxRunner<'d, MTU> {
|
||||||
|
/// Wait until there is space for more outbound packets and return a slice they can be copied into.
|
||||||
pub async fn tx_buf(&mut self) -> &mut [u8] {
|
pub async fn tx_buf(&mut self) -> &mut [u8] {
|
||||||
let p = self.tx_chan.receive().await;
|
let p = self.tx_chan.receive().await;
|
||||||
&mut p.buf[..p.len]
|
&mut p.buf[..p.len]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if there is space for more outbound packets right now.
|
||||||
pub fn try_tx_buf(&mut self) -> Option<&mut [u8]> {
|
pub fn try_tx_buf(&mut self) -> Option<&mut [u8]> {
|
||||||
let p = self.tx_chan.try_receive()?;
|
let p = self.tx_chan.try_receive()?;
|
||||||
Some(&mut p.buf[..p.len])
|
Some(&mut p.buf[..p.len])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Polling the outbound channel if there is space for packets.
|
||||||
pub fn poll_tx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
pub fn poll_tx_buf(&mut self, cx: &mut Context) -> Poll<&mut [u8]> {
|
||||||
match self.tx_chan.poll_receive(cx) {
|
match self.tx_chan.poll_receive(cx) {
|
||||||
Poll::Ready(p) => Poll::Ready(&mut p.buf[..p.len]),
|
Poll::Ready(p) => Poll::Ready(&mut p.buf[..p.len]),
|
||||||
@ -212,11 +250,18 @@ impl<'d, const MTU: usize> TxRunner<'d, MTU> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mark outbound packet as copied.
|
||||||
pub fn tx_done(&mut self) {
|
pub fn tx_done(&mut self) {
|
||||||
self.tx_chan.receive_done();
|
self.tx_chan.receive_done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a channel.
|
||||||
|
///
|
||||||
|
/// Returns a pair of handles for interfacing with the peripheral and the networking stack.
|
||||||
|
///
|
||||||
|
/// The runner is interfacing with the peripheral at the lower part of the stack.
|
||||||
|
/// The device is interfacing with the networking stack on the layer above.
|
||||||
pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
|
pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
|
||||||
state: &'d mut State<MTU, N_RX, N_TX>,
|
state: &'d mut State<MTU, N_RX, N_TX>,
|
||||||
hardware_address: driver::HardwareAddress,
|
hardware_address: driver::HardwareAddress,
|
||||||
@ -257,17 +302,22 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents a packet of size MTU.
|
||||||
pub struct PacketBuf<const MTU: usize> {
|
pub struct PacketBuf<const MTU: usize> {
|
||||||
len: usize,
|
len: usize,
|
||||||
buf: [u8; MTU],
|
buf: [u8; MTU],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<const MTU: usize> PacketBuf<MTU> {
|
impl<const MTU: usize> PacketBuf<MTU> {
|
||||||
|
/// Create a new packet buffer.
|
||||||
pub const fn new() -> Self {
|
pub const fn new() -> Self {
|
||||||
Self { len: 0, buf: [0; MTU] }
|
Self { len: 0, buf: [0; MTU] }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Channel device.
|
||||||
|
///
|
||||||
|
/// Holds the shared state and upper end of channels for inbound and outbound packets.
|
||||||
pub struct Device<'d, const MTU: usize> {
|
pub struct Device<'d, const MTU: usize> {
|
||||||
rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>,
|
rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
|
tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
@ -314,6 +364,9 @@ impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A rx token.
|
||||||
|
///
|
||||||
|
/// Holds inbound receive channel and interfaces with embassy-net-driver.
|
||||||
pub struct RxToken<'a, const MTU: usize> {
|
pub struct RxToken<'a, const MTU: usize> {
|
||||||
rx: zerocopy_channel::Receiver<'a, NoopRawMutex, PacketBuf<MTU>>,
|
rx: zerocopy_channel::Receiver<'a, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
}
|
}
|
||||||
@ -331,6 +384,9 @@ impl<'a, const MTU: usize> embassy_net_driver::RxToken for RxToken<'a, MTU> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A tx token.
|
||||||
|
///
|
||||||
|
/// Holds outbound transmit channel and interfaces with embassy-net-driver.
|
||||||
pub struct TxToken<'a, const MTU: usize> {
|
pub struct TxToken<'a, const MTU: usize> {
|
||||||
tx: zerocopy_channel::Sender<'a, NoopRawMutex, PacketBuf<MTU>>,
|
tx: zerocopy_channel::Sender<'a, NoopRawMutex, PacketBuf<MTU>>,
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
name = "embassy-net-esp-hosted"
|
name = "embassy-net-esp-hosted"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
description = "embassy-net driver for ESP-Hosted"
|
||||||
|
keywords = ["embedded", "esp-hosted", "embassy-net", "embedded-hal-async", "wifi", "async"]
|
||||||
|
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
@ -15,8 +19,7 @@ embassy-net-driver-channel = { version = "0.2.0", path = "../embassy-net-driver-
|
|||||||
embedded-hal = { version = "1.0.0-rc.3" }
|
embedded-hal = { version = "1.0.0-rc.3" }
|
||||||
embedded-hal-async = { version = "=1.0.0-rc.3" }
|
embedded-hal-async = { version = "=1.0.0-rc.3" }
|
||||||
|
|
||||||
noproto = { git="https://github.com/embassy-rs/noproto", rev = "f5e6d1f325b6ad4e344f60452b09576e24671f62", default-features = false, features = ["derive"] }
|
noproto = "0.1.0"
|
||||||
#noproto = { version = "0.1", path = "/home/dirbaio/noproto", default-features = false, features = ["derive"] }
|
|
||||||
heapless = "0.8"
|
heapless = "0.8"
|
||||||
|
|
||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
|
27
embassy-net-esp-hosted/README.md
Normal file
27
embassy-net-esp-hosted/README.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# ESP-Hosted `embassy-net` integration
|
||||||
|
|
||||||
|
[`embassy-net`](https://crates.io/crates/embassy-net) integration for Espressif SoCs running the the ESP-Hosted stack.
|
||||||
|
|
||||||
|
See [`examples`](https://github.com/embassy-rs/embassy/tree/main/examples/nrf52840) directory for usage examples with the nRF52840.
|
||||||
|
|
||||||
|
## Supported chips
|
||||||
|
|
||||||
|
- W5500
|
||||||
|
- W5100S
|
||||||
|
|
||||||
|
## Interoperability
|
||||||
|
|
||||||
|
This crate can run on any executor.
|
||||||
|
|
||||||
|
It supports any SPI driver implementing [`embedded-hal-async`](https://crates.io/crates/embedded-hal-async).
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This work is licensed under either of
|
||||||
|
|
||||||
|
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0)
|
||||||
|
- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
at your option.
|
@ -5,38 +5,54 @@ use heapless::String;
|
|||||||
use crate::ioctl::Shared;
|
use crate::ioctl::Shared;
|
||||||
use crate::proto::{self, CtrlMsg};
|
use crate::proto::{self, CtrlMsg};
|
||||||
|
|
||||||
|
/// Errors reported by control.
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
|
/// The operation failed with the given error code.
|
||||||
Failed(u32),
|
Failed(u32),
|
||||||
|
/// The operation timed out.
|
||||||
Timeout,
|
Timeout,
|
||||||
|
/// Internal error.
|
||||||
Internal,
|
Internal,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Handle for managing the network and WiFI state.
|
||||||
pub struct Control<'a> {
|
pub struct Control<'a> {
|
||||||
state_ch: ch::StateRunner<'a>,
|
state_ch: ch::StateRunner<'a>,
|
||||||
shared: &'a Shared,
|
shared: &'a Shared,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// WiFi mode.
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
enum WifiMode {
|
enum WifiMode {
|
||||||
|
/// No mode.
|
||||||
None = 0,
|
None = 0,
|
||||||
|
/// Client station.
|
||||||
Sta = 1,
|
Sta = 1,
|
||||||
|
/// Access point mode.
|
||||||
Ap = 2,
|
Ap = 2,
|
||||||
|
/// Repeater mode.
|
||||||
ApSta = 3,
|
ApSta = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use proto::CtrlWifiSecProt as Security;
|
pub use proto::CtrlWifiSecProt as Security;
|
||||||
|
|
||||||
|
/// WiFi status.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct Status {
|
pub struct Status {
|
||||||
|
/// Service Set Identifier.
|
||||||
pub ssid: String<32>,
|
pub ssid: String<32>,
|
||||||
|
/// Basic Service Set Identifier.
|
||||||
pub bssid: [u8; 6],
|
pub bssid: [u8; 6],
|
||||||
|
/// Received Signal Strength Indicator.
|
||||||
pub rssi: i32,
|
pub rssi: i32,
|
||||||
|
/// WiFi channel.
|
||||||
pub channel: u32,
|
pub channel: u32,
|
||||||
|
/// Security mode.
|
||||||
pub security: Security,
|
pub security: Security,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +81,7 @@ impl<'a> Control<'a> {
|
|||||||
Self { state_ch, shared }
|
Self { state_ch, shared }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Initialize device.
|
||||||
pub async fn init(&mut self) -> Result<(), Error> {
|
pub async fn init(&mut self) -> Result<(), Error> {
|
||||||
debug!("wait for init event...");
|
debug!("wait for init event...");
|
||||||
self.shared.init_wait().await;
|
self.shared.init_wait().await;
|
||||||
@ -82,6 +99,7 @@ impl<'a> Control<'a> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the current status.
|
||||||
pub async fn get_status(&mut self) -> Result<Status, Error> {
|
pub async fn get_status(&mut self) -> Result<Status, Error> {
|
||||||
let req = proto::CtrlMsgReqGetApConfig {};
|
let req = proto::CtrlMsgReqGetApConfig {};
|
||||||
ioctl!(self, ReqGetApConfig, RespGetApConfig, req, resp);
|
ioctl!(self, ReqGetApConfig, RespGetApConfig, req, resp);
|
||||||
@ -95,6 +113,7 @@ impl<'a> Control<'a> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Connect to the network identified by ssid using the provided password.
|
||||||
pub async fn connect(&mut self, ssid: &str, password: &str) -> Result<(), Error> {
|
pub async fn connect(&mut self, ssid: &str, password: &str) -> Result<(), Error> {
|
||||||
let req = proto::CtrlMsgReqConnectAp {
|
let req = proto::CtrlMsgReqConnectAp {
|
||||||
ssid: unwrap!(String::try_from(ssid)),
|
ssid: unwrap!(String::try_from(ssid)),
|
||||||
@ -108,6 +127,7 @@ impl<'a> Control<'a> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Disconnect from any currently connected network.
|
||||||
pub async fn disconnect(&mut self) -> Result<(), Error> {
|
pub async fn disconnect(&mut self) -> Result<(), Error> {
|
||||||
let req = proto::CtrlMsgReqGetStatus {};
|
let req = proto::CtrlMsgReqGetStatus {};
|
||||||
ioctl!(self, ReqDisconnectAp, RespDisconnectAp, req, resp);
|
ioctl!(self, ReqDisconnectAp, RespDisconnectAp, req, resp);
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
|
#![doc = include_str!("../README.md")]
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
use embassy_futures::select::{select4, Either4};
|
use embassy_futures::select::{select4, Either4};
|
||||||
use embassy_net_driver_channel as ch;
|
use embassy_net_driver_channel as ch;
|
||||||
@ -97,12 +99,14 @@ enum InterfaceType {
|
|||||||
const MAX_SPI_BUFFER_SIZE: usize = 1600;
|
const MAX_SPI_BUFFER_SIZE: usize = 1600;
|
||||||
const HEARTBEAT_MAX_GAP: Duration = Duration::from_secs(20);
|
const HEARTBEAT_MAX_GAP: Duration = Duration::from_secs(20);
|
||||||
|
|
||||||
|
/// State for the esp-hosted driver.
|
||||||
pub struct State {
|
pub struct State {
|
||||||
shared: Shared,
|
shared: Shared,
|
||||||
ch: ch::State<MTU, 4, 4>,
|
ch: ch::State<MTU, 4, 4>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
/// Create a new state.
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
shared: Shared::new(),
|
shared: Shared::new(),
|
||||||
@ -111,8 +115,13 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Type alias for network driver.
|
||||||
pub type NetDriver<'a> = ch::Device<'a, MTU>;
|
pub type NetDriver<'a> = ch::Device<'a, MTU>;
|
||||||
|
|
||||||
|
/// Create a new esp-hosted driver using the provided state, SPI peripheral and pins.
|
||||||
|
///
|
||||||
|
/// Returns a device handle for interfacing with embassy-net, a control handle for
|
||||||
|
/// interacting with the driver, and a runner for communicating with the WiFi device.
|
||||||
pub async fn new<'a, SPI, IN, OUT>(
|
pub async fn new<'a, SPI, IN, OUT>(
|
||||||
state: &'a mut State,
|
state: &'a mut State,
|
||||||
spi: SPI,
|
spi: SPI,
|
||||||
@ -144,6 +153,7 @@ where
|
|||||||
(device, Control::new(state_ch, &state.shared), runner)
|
(device, Control::new(state_ch, &state.shared), runner)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Runner for communicating with the WiFi device.
|
||||||
pub struct Runner<'a, SPI, IN, OUT> {
|
pub struct Runner<'a, SPI, IN, OUT> {
|
||||||
ch: ch::Runner<'a, MTU>,
|
ch: ch::Runner<'a, MTU>,
|
||||||
state_ch: ch::StateRunner<'a>,
|
state_ch: ch::StateRunner<'a>,
|
||||||
@ -166,6 +176,7 @@ where
|
|||||||
{
|
{
|
||||||
async fn init(&mut self) {}
|
async fn init(&mut self) {}
|
||||||
|
|
||||||
|
/// Run the packet processing.
|
||||||
pub async fn run(mut self) -> ! {
|
pub async fn run(mut self) -> ! {
|
||||||
debug!("resetting...");
|
debug!("resetting...");
|
||||||
self.reset.set_low().unwrap();
|
self.reset.set_low().unwrap();
|
||||||
|
@ -4,7 +4,7 @@ use heapless::{String, Vec};
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct ScanResult {
|
pub(crate) struct ScanResult {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub ssid: String<32>,
|
pub ssid: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -19,7 +19,7 @@ pub struct ScanResult {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct ConnectedStaList {
|
pub(crate) struct ConnectedStaList {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub mac: String<32>,
|
pub mac: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -29,14 +29,14 @@ pub struct ConnectedStaList {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqGetMacAddress {
|
pub(crate) struct CtrlMsgReqGetMacAddress {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub mode: u32,
|
pub mode: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespGetMacAddress {
|
pub(crate) struct CtrlMsgRespGetMacAddress {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub mac: String<32>,
|
pub mac: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -45,11 +45,11 @@ pub struct CtrlMsgRespGetMacAddress {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqGetMode {}
|
pub(crate) struct CtrlMsgReqGetMode {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespGetMode {
|
pub(crate) struct CtrlMsgRespGetMode {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub mode: u32,
|
pub mode: u32,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -58,32 +58,32 @@ pub struct CtrlMsgRespGetMode {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqSetMode {
|
pub(crate) struct CtrlMsgReqSetMode {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub mode: u32,
|
pub mode: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespSetMode {
|
pub(crate) struct CtrlMsgRespSetMode {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqGetStatus {}
|
pub(crate) struct CtrlMsgReqGetStatus {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespGetStatus {
|
pub(crate) struct CtrlMsgRespGetStatus {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqSetMacAddress {
|
pub(crate) struct CtrlMsgReqSetMacAddress {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub mac: String<32>,
|
pub mac: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -92,18 +92,18 @@ pub struct CtrlMsgReqSetMacAddress {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespSetMacAddress {
|
pub(crate) struct CtrlMsgRespSetMacAddress {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqGetApConfig {}
|
pub(crate) struct CtrlMsgReqGetApConfig {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespGetApConfig {
|
pub(crate) struct CtrlMsgRespGetApConfig {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub ssid: String<32>,
|
pub ssid: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -120,7 +120,7 @@ pub struct CtrlMsgRespGetApConfig {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqConnectAp {
|
pub(crate) struct CtrlMsgReqConnectAp {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub ssid: String<32>,
|
pub ssid: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -135,7 +135,7 @@ pub struct CtrlMsgReqConnectAp {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespConnectAp {
|
pub(crate) struct CtrlMsgRespConnectAp {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -144,11 +144,11 @@ pub struct CtrlMsgRespConnectAp {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqGetSoftApConfig {}
|
pub(crate) struct CtrlMsgReqGetSoftApConfig {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespGetSoftApConfig {
|
pub(crate) struct CtrlMsgRespGetSoftApConfig {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub ssid: String<32>,
|
pub ssid: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -169,7 +169,7 @@ pub struct CtrlMsgRespGetSoftApConfig {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqStartSoftAp {
|
pub(crate) struct CtrlMsgReqStartSoftAp {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub ssid: String<32>,
|
pub ssid: String<32>,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -188,7 +188,7 @@ pub struct CtrlMsgReqStartSoftAp {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespStartSoftAp {
|
pub(crate) struct CtrlMsgRespStartSoftAp {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -197,11 +197,11 @@ pub struct CtrlMsgRespStartSoftAp {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqScanResult {}
|
pub(crate) struct CtrlMsgReqScanResult {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespScanResult {
|
pub(crate) struct CtrlMsgRespScanResult {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub count: u32,
|
pub count: u32,
|
||||||
#[noproto(repeated, tag = "2")]
|
#[noproto(repeated, tag = "2")]
|
||||||
@ -212,11 +212,11 @@ pub struct CtrlMsgRespScanResult {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqSoftApConnectedSta {}
|
pub(crate) struct CtrlMsgReqSoftApConnectedSta {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespSoftApConnectedSta {
|
pub(crate) struct CtrlMsgRespSoftApConnectedSta {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub num: u32,
|
pub num: u32,
|
||||||
#[noproto(repeated, tag = "2")]
|
#[noproto(repeated, tag = "2")]
|
||||||
@ -227,43 +227,43 @@ pub struct CtrlMsgRespSoftApConnectedSta {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqOtaBegin {}
|
pub(crate) struct CtrlMsgReqOtaBegin {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespOtaBegin {
|
pub(crate) struct CtrlMsgRespOtaBegin {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqOtaWrite {
|
pub(crate) struct CtrlMsgReqOtaWrite {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub ota_data: Vec<u8, 1024>,
|
pub ota_data: Vec<u8, 1024>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespOtaWrite {
|
pub(crate) struct CtrlMsgRespOtaWrite {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqOtaEnd {}
|
pub(crate) struct CtrlMsgReqOtaEnd {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespOtaEnd {
|
pub(crate) struct CtrlMsgRespOtaEnd {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqVendorIeData {
|
pub(crate) struct CtrlMsgReqVendorIeData {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub element_id: u32,
|
pub element_id: u32,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -278,7 +278,7 @@ pub struct CtrlMsgReqVendorIeData {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqSetSoftApVendorSpecificIe {
|
pub(crate) struct CtrlMsgReqSetSoftApVendorSpecificIe {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -291,32 +291,32 @@ pub struct CtrlMsgReqSetSoftApVendorSpecificIe {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespSetSoftApVendorSpecificIe {
|
pub(crate) struct CtrlMsgRespSetSoftApVendorSpecificIe {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqSetWifiMaxTxPower {
|
pub(crate) struct CtrlMsgReqSetWifiMaxTxPower {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub wifi_max_tx_power: u32,
|
pub wifi_max_tx_power: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespSetWifiMaxTxPower {
|
pub(crate) struct CtrlMsgRespSetWifiMaxTxPower {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqGetWifiCurrTxPower {}
|
pub(crate) struct CtrlMsgReqGetWifiCurrTxPower {}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespGetWifiCurrTxPower {
|
pub(crate) struct CtrlMsgRespGetWifiCurrTxPower {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub wifi_curr_tx_power: u32,
|
pub wifi_curr_tx_power: u32,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -325,7 +325,7 @@ pub struct CtrlMsgRespGetWifiCurrTxPower {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgReqConfigHeartbeat {
|
pub(crate) struct CtrlMsgReqConfigHeartbeat {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -334,7 +334,7 @@ pub struct CtrlMsgReqConfigHeartbeat {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgRespConfigHeartbeat {
|
pub(crate) struct CtrlMsgRespConfigHeartbeat {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
@ -342,28 +342,28 @@ pub struct CtrlMsgRespConfigHeartbeat {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgEventEspInit {
|
pub(crate) struct CtrlMsgEventEspInit {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub init_data: Vec<u8, 64>,
|
pub init_data: Vec<u8, 64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgEventHeartbeat {
|
pub(crate) struct CtrlMsgEventHeartbeat {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub hb_num: u32,
|
pub hb_num: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgEventStationDisconnectFromAp {
|
pub(crate) struct CtrlMsgEventStationDisconnectFromAp {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsgEventStationDisconnectFromEspSoftAp {
|
pub(crate) struct CtrlMsgEventStationDisconnectFromEspSoftAp {
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub resp: u32,
|
pub resp: u32,
|
||||||
#[noproto(tag = "2")]
|
#[noproto(tag = "2")]
|
||||||
@ -372,7 +372,7 @@ pub struct CtrlMsgEventStationDisconnectFromEspSoftAp {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
#[derive(Debug, Default, Clone, Eq, PartialEq, noproto::Message)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub struct CtrlMsg {
|
pub(crate) struct CtrlMsg {
|
||||||
/// msg_type could be req, resp or Event
|
/// msg_type could be req, resp or Event
|
||||||
#[noproto(tag = "1")]
|
#[noproto(tag = "1")]
|
||||||
pub msg_type: CtrlMsgType,
|
pub msg_type: CtrlMsgType,
|
||||||
@ -390,7 +390,7 @@ pub struct CtrlMsg {
|
|||||||
/// union of all msg ids
|
/// union of all msg ids
|
||||||
#[derive(Debug, Clone, Eq, PartialEq, noproto::Oneof)]
|
#[derive(Debug, Clone, Eq, PartialEq, noproto::Oneof)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlMsgPayload {
|
pub(crate) enum CtrlMsgPayload {
|
||||||
/// * Requests *
|
/// * Requests *
|
||||||
#[noproto(tag = "101")]
|
#[noproto(tag = "101")]
|
||||||
ReqGetMacAddress(CtrlMsgReqGetMacAddress),
|
ReqGetMacAddress(CtrlMsgReqGetMacAddress),
|
||||||
@ -492,7 +492,7 @@ pub enum CtrlMsgPayload {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlVendorIeType {
|
pub(crate) enum CtrlVendorIeType {
|
||||||
#[default]
|
#[default]
|
||||||
Beacon = 0,
|
Beacon = 0,
|
||||||
ProbeReq = 1,
|
ProbeReq = 1,
|
||||||
@ -504,7 +504,7 @@ pub enum CtrlVendorIeType {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlVendorIeid {
|
pub(crate) enum CtrlVendorIeid {
|
||||||
#[default]
|
#[default]
|
||||||
Id0 = 0,
|
Id0 = 0,
|
||||||
Id1 = 1,
|
Id1 = 1,
|
||||||
@ -513,7 +513,7 @@ pub enum CtrlVendorIeid {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlWifiMode {
|
pub(crate) enum CtrlWifiMode {
|
||||||
#[default]
|
#[default]
|
||||||
None = 0,
|
None = 0,
|
||||||
Sta = 1,
|
Sta = 1,
|
||||||
@ -524,7 +524,7 @@ pub enum CtrlWifiMode {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlWifiBw {
|
pub(crate) enum CtrlWifiBw {
|
||||||
#[default]
|
#[default]
|
||||||
BwInvalid = 0,
|
BwInvalid = 0,
|
||||||
Ht20 = 1,
|
Ht20 = 1,
|
||||||
@ -534,13 +534,15 @@ pub enum CtrlWifiBw {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlWifiPowerSave {
|
pub(crate) enum CtrlWifiPowerSave {
|
||||||
#[default]
|
#[default]
|
||||||
PsInvalid = 0,
|
PsInvalid = 0,
|
||||||
MinModem = 1,
|
MinModem = 1,
|
||||||
MaxModem = 2,
|
MaxModem = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wifi Security Settings
|
||||||
|
#[allow(missing_docs)]
|
||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
@ -560,7 +562,7 @@ pub enum CtrlWifiSecProt {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlStatus {
|
pub(crate) enum CtrlStatus {
|
||||||
#[default]
|
#[default]
|
||||||
Connected = 0,
|
Connected = 0,
|
||||||
NotConnected = 1,
|
NotConnected = 1,
|
||||||
@ -573,7 +575,7 @@ pub enum CtrlStatus {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlMsgType {
|
pub(crate) enum CtrlMsgType {
|
||||||
#[default]
|
#[default]
|
||||||
MsgTypeInvalid = 0,
|
MsgTypeInvalid = 0,
|
||||||
Req = 1,
|
Req = 1,
|
||||||
@ -585,7 +587,7 @@ pub enum CtrlMsgType {
|
|||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, PartialOrd, Ord, noproto::Enumeration)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
pub enum CtrlMsgId {
|
pub(crate) enum CtrlMsgId {
|
||||||
#[default]
|
#[default]
|
||||||
MsgIdInvalid = 0,
|
MsgIdInvalid = 0,
|
||||||
/// * Request Msgs *
|
/// * Request Msgs *
|
||||||
|
@ -6,6 +6,7 @@ keywords = ["embedded", "tuntap", "embassy-net", "embedded-hal-async", "ethernet
|
|||||||
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-net-driver = { version = "0.2.0", path = "../embassy-net-driver" }
|
embassy-net-driver = { version = "0.2.0", path = "../embassy-net-driver" }
|
||||||
@ -16,4 +17,4 @@ libc = "0.2.101"
|
|||||||
[package.metadata.embassy_docs]
|
[package.metadata.embassy_docs]
|
||||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-net-tuntap-v$VERSION/embassy-net-tuntap/src/"
|
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-net-tuntap-v$VERSION/embassy-net-tuntap/src/"
|
||||||
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-net-tuntap/src/"
|
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-net-tuntap/src/"
|
||||||
target = "thumbv7em-none-eabi"
|
target = "thumbv7em-none-eabi"
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#![warn(missing_docs)]
|
||||||
|
#![doc = include_str!("../README.md")]
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::os::unix::io::{AsRawFd, RawFd};
|
use std::os::unix::io::{AsRawFd, RawFd};
|
||||||
@ -7,12 +9,19 @@ use async_io::Async;
|
|||||||
use embassy_net_driver::{self, Capabilities, Driver, HardwareAddress, LinkState};
|
use embassy_net_driver::{self, Capabilities, Driver, HardwareAddress, LinkState};
|
||||||
use log::*;
|
use log::*;
|
||||||
|
|
||||||
|
/// Get the MTU of the given interface.
|
||||||
pub const SIOCGIFMTU: libc::c_ulong = 0x8921;
|
pub const SIOCGIFMTU: libc::c_ulong = 0x8921;
|
||||||
|
/// Get the index of the given interface.
|
||||||
pub const _SIOCGIFINDEX: libc::c_ulong = 0x8933;
|
pub const _SIOCGIFINDEX: libc::c_ulong = 0x8933;
|
||||||
|
/// Capture all packages.
|
||||||
pub const _ETH_P_ALL: libc::c_short = 0x0003;
|
pub const _ETH_P_ALL: libc::c_short = 0x0003;
|
||||||
|
/// Set the interface flags.
|
||||||
pub const TUNSETIFF: libc::c_ulong = 0x400454CA;
|
pub const TUNSETIFF: libc::c_ulong = 0x400454CA;
|
||||||
|
/// TUN device.
|
||||||
pub const _IFF_TUN: libc::c_int = 0x0001;
|
pub const _IFF_TUN: libc::c_int = 0x0001;
|
||||||
|
/// TAP device.
|
||||||
pub const IFF_TAP: libc::c_int = 0x0002;
|
pub const IFF_TAP: libc::c_int = 0x0002;
|
||||||
|
/// No packet information.
|
||||||
pub const IFF_NO_PI: libc::c_int = 0x1000;
|
pub const IFF_NO_PI: libc::c_int = 0x1000;
|
||||||
|
|
||||||
const ETHERNET_HEADER_LEN: usize = 14;
|
const ETHERNET_HEADER_LEN: usize = 14;
|
||||||
@ -47,6 +56,7 @@ fn ifreq_ioctl(lower: libc::c_int, ifreq: &mut ifreq, cmd: libc::c_ulong) -> io:
|
|||||||
Ok(ifreq.ifr_data)
|
Ok(ifreq.ifr_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A TUN/TAP device.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct TunTap {
|
pub struct TunTap {
|
||||||
fd: libc::c_int,
|
fd: libc::c_int,
|
||||||
@ -60,6 +70,7 @@ impl AsRawFd for TunTap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl TunTap {
|
impl TunTap {
|
||||||
|
/// Create a new TUN/TAP device.
|
||||||
pub fn new(name: &str) -> io::Result<TunTap> {
|
pub fn new(name: &str) -> io::Result<TunTap> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let fd = libc::open(
|
let fd = libc::open(
|
||||||
@ -126,11 +137,13 @@ impl io::Write for TunTap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A TUN/TAP device, wrapped in an async interface.
|
||||||
pub struct TunTapDevice {
|
pub struct TunTapDevice {
|
||||||
device: Async<TunTap>,
|
device: Async<TunTap>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TunTapDevice {
|
impl TunTapDevice {
|
||||||
|
/// Create a new TUN/TAP device.
|
||||||
pub fn new(name: &str) -> io::Result<TunTapDevice> {
|
pub fn new(name: &str) -> io::Result<TunTapDevice> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
device: Async::new(TunTap::new(name)?)?,
|
device: Async::new(TunTap::new(name)?)?,
|
||||||
|
@ -6,6 +6,7 @@ keywords = ["embedded", "wiznet", "embassy-net", "embedded-hal-async", "ethernet
|
|||||||
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embedded-hal = { version = "1.0.0-rc.3" }
|
embedded-hal = { version = "1.0.0-rc.3" }
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//! Wiznet W5100s and W5500 family driver.
|
||||||
mod w5500;
|
mod w5500;
|
||||||
pub use w5500::W5500;
|
pub use w5500::W5500;
|
||||||
mod w5100s;
|
mod w5100s;
|
||||||
@ -45,4 +46,5 @@ pub(crate) mod sealed {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait for Wiznet chips.
|
||||||
pub trait Chip: sealed::Chip {}
|
pub trait Chip: sealed::Chip {}
|
||||||
|
@ -4,6 +4,7 @@ const SOCKET_BASE: u16 = 0x400;
|
|||||||
const TX_BASE: u16 = 0x4000;
|
const TX_BASE: u16 = 0x4000;
|
||||||
const RX_BASE: u16 = 0x6000;
|
const RX_BASE: u16 = 0x6000;
|
||||||
|
|
||||||
|
/// Wizard W5100S chip.
|
||||||
pub enum W5100S {}
|
pub enum W5100S {}
|
||||||
|
|
||||||
impl super::Chip for W5100S {}
|
impl super::Chip for W5100S {}
|
||||||
|
@ -8,6 +8,7 @@ pub enum RegisterBlock {
|
|||||||
RxBuf = 0x03,
|
RxBuf = 0x03,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wiznet W5500 chip.
|
||||||
pub enum W5500 {}
|
pub enum W5500 {}
|
||||||
|
|
||||||
impl super::Chip for W5500 {}
|
impl super::Chip for W5500 {}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![allow(async_fn_in_trait)]
|
#![allow(async_fn_in_trait)]
|
||||||
#![doc = include_str!("../README.md")]
|
#![doc = include_str!("../README.md")]
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
pub mod chip;
|
pub mod chip;
|
||||||
mod device;
|
mod device;
|
||||||
@ -47,6 +48,7 @@ pub struct Runner<'d, C: Chip, SPI: SpiDevice, INT: Wait, RST: OutputPin> {
|
|||||||
|
|
||||||
/// You must call this in a background task for the driver to operate.
|
/// You must call this in a background task for the driver to operate.
|
||||||
impl<'d, C: Chip, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, C, SPI, INT, RST> {
|
impl<'d, C: Chip, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, C, SPI, INT, RST> {
|
||||||
|
/// Run the driver.
|
||||||
pub async fn run(mut self) -> ! {
|
pub async fn run(mut self) -> ! {
|
||||||
let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split();
|
let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split();
|
||||||
let mut tick = Ticker::every(Duration::from_millis(500));
|
let mut tick = Ticker::every(Duration::from_millis(500));
|
||||||
|
@ -411,10 +411,12 @@ impl<D: Driver> Stack<D> {
|
|||||||
/// ```ignore
|
/// ```ignore
|
||||||
/// let config = embassy_net::Config::dhcpv4(Default::default());
|
/// let config = embassy_net::Config::dhcpv4(Default::default());
|
||||||
///// Init network stack
|
///// Init network stack
|
||||||
/// let stack = &*make_static!(embassy_net::Stack::new(
|
/// static RESOURCES: StaticCell<embassy_net::StackResources<2> = StaticCell::new();
|
||||||
|
/// static STACK: StaticCell<embassy_net::Stack> = StaticCell::new();
|
||||||
|
/// let stack = &*STACK.init(embassy_net::Stack::new(
|
||||||
/// device,
|
/// device,
|
||||||
/// config,
|
/// config,
|
||||||
/// make_static!(embassy_net::StackResources::<2>::new()),
|
/// RESOURCES.init(embassy_net::StackResources::new()),
|
||||||
/// seed
|
/// seed
|
||||||
/// ));
|
/// ));
|
||||||
/// // Launch network task that runs `stack.run().await`
|
/// // Launch network task that runs `stack.run().await`
|
||||||
|
@ -87,5 +87,5 @@ pio = {version= "0.2.1" }
|
|||||||
rp2040-boot2 = "0.3"
|
rp2040-boot2 = "0.3"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
embassy-executor = { version = "0.4.0", path = "../embassy-executor", features = ["nightly", "arch-std", "executor-thread"] }
|
embassy-executor = { version = "0.4.0", path = "../embassy-executor", features = ["arch-std", "executor-thread"] }
|
||||||
static_cell = { version = "2" }
|
static_cell = { version = "2" }
|
||||||
|
@ -247,7 +247,6 @@ select_bootloader! {
|
|||||||
/// # Usage
|
/// # Usage
|
||||||
///
|
///
|
||||||
/// ```no_run
|
/// ```no_run
|
||||||
/// #![feature(type_alias_impl_trait)]
|
|
||||||
/// use embassy_rp::install_core0_stack_guard;
|
/// use embassy_rp::install_core0_stack_guard;
|
||||||
/// use embassy_executor::{Executor, Spawner};
|
/// use embassy_executor::{Executor, Spawner};
|
||||||
///
|
///
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
//! # Usage
|
//! # Usage
|
||||||
//!
|
//!
|
||||||
//! ```no_run
|
//! ```no_run
|
||||||
//! # #![feature(type_alias_impl_trait)]
|
|
||||||
//! use embassy_rp::multicore::Stack;
|
//! use embassy_rp::multicore::Stack;
|
||||||
//! use static_cell::StaticCell;
|
//! use static_cell::StaticCell;
|
||||||
//! use embassy_executor::Executor;
|
//! use embassy_executor::Executor;
|
||||||
|
@ -26,7 +26,7 @@ aligned = "0.4.1"
|
|||||||
|
|
||||||
bit_field = "0.10.2"
|
bit_field = "0.10.2"
|
||||||
stm32-device-signature = { version = "0.3.3", features = ["stm32wb5x"] }
|
stm32-device-signature = { version = "0.3.3", features = ["stm32wb5x"] }
|
||||||
stm32wb-hci = { version = "0.1.4", optional = true }
|
stm32wb-hci = { git = "https://github.com/Dirbaio/stm32wb-hci", rev = "0aff47e009c30c5fc5d520672625173d75f7505c", optional = true }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
bitflags = { version = "2.3.3", optional = true }
|
bitflags = { version = "2.3.3", optional = true }
|
||||||
|
|
||||||
|
@ -56,7 +56,6 @@ cortex-m = "0.7.6"
|
|||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
rand_core = "0.6.3"
|
rand_core = "0.6.3"
|
||||||
sdio-host = "0.5.0"
|
sdio-host = "0.5.0"
|
||||||
embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true }
|
|
||||||
critical-section = "1.1"
|
critical-section = "1.1"
|
||||||
stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-2234f380f51d16d0398b8e547088b33ea623cc7c" }
|
stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-2234f380f51d16d0398b8e547088b33ea623cc7c" }
|
||||||
vcell = "0.1.3"
|
vcell = "0.1.3"
|
||||||
|
@ -23,6 +23,10 @@ use crate::pac::bdma::{regs, vals};
|
|||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub struct TransferOptions {
|
pub struct TransferOptions {
|
||||||
/// Enable circular DMA
|
/// Enable circular DMA
|
||||||
|
///
|
||||||
|
/// Note:
|
||||||
|
/// If you enable circular mode manually, you may want to build and `.await` the `Transfer` in a separate task.
|
||||||
|
/// Since DMA in circular mode need manually stop, `.await` in current task would block the task forever.
|
||||||
pub circular: bool,
|
pub circular: bool,
|
||||||
/// Enable half transfer interrupt
|
/// Enable half transfer interrupt
|
||||||
pub half_transfer_ir: bool,
|
pub half_transfer_ir: bool,
|
||||||
|
@ -30,6 +30,10 @@ pub struct TransferOptions {
|
|||||||
/// FIFO threshold for DMA FIFO mode. If none, direct mode is used.
|
/// FIFO threshold for DMA FIFO mode. If none, direct mode is used.
|
||||||
pub fifo_threshold: Option<FifoThreshold>,
|
pub fifo_threshold: Option<FifoThreshold>,
|
||||||
/// Enable circular DMA
|
/// Enable circular DMA
|
||||||
|
///
|
||||||
|
/// Note:
|
||||||
|
/// If you enable circular mode manually, you may want to build and `.await` the `Transfer` in a separate task.
|
||||||
|
/// Since DMA in circular mode need manually stop, `.await` in current task would block the task forever.
|
||||||
pub circular: bool,
|
pub circular: bool,
|
||||||
/// Enable half transfer interrupt
|
/// Enable half transfer interrupt
|
||||||
pub half_transfer_ir: bool,
|
pub half_transfer_ir: bool,
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
//! use embassy_executor::Spawner;
|
//! use embassy_executor::Spawner;
|
||||||
//! use embassy_stm32::low_power::Executor;
|
//! use embassy_stm32::low_power::Executor;
|
||||||
//! use embassy_stm32::rtc::{Rtc, RtcConfig};
|
//! use embassy_stm32::rtc::{Rtc, RtcConfig};
|
||||||
//! use static_cell::make_static;
|
//! use static_cell::StaticCell;
|
||||||
//!
|
//!
|
||||||
//! #[cortex_m_rt::entry]
|
//! #[cortex_m_rt::entry]
|
||||||
//! fn main() -> ! {
|
//! fn main() -> ! {
|
||||||
@ -41,7 +41,8 @@
|
|||||||
//!
|
//!
|
||||||
//! // give the RTC to the executor...
|
//! // give the RTC to the executor...
|
||||||
//! let mut rtc = Rtc::new(p.RTC, RtcConfig::default());
|
//! let mut rtc = Rtc::new(p.RTC, RtcConfig::default());
|
||||||
//! let rtc = make_static!(rtc);
|
//! static RTC: StaticCell<Rtc> = StaticCell::new();
|
||||||
|
//! let rtc = RTC.init(rtc);
|
||||||
//! embassy_stm32::low_power::stop_with_rtc(rtc);
|
//! embassy_stm32::low_power::stop_with_rtc(rtc);
|
||||||
//!
|
//!
|
||||||
//! // your application here...
|
//! // your application here...
|
||||||
|
@ -1538,53 +1538,3 @@ foreach_peripheral!(
|
|||||||
impl Instance for peripherals::$inst {}
|
impl Instance for peripherals::$inst {}
|
||||||
};
|
};
|
||||||
);
|
);
|
||||||
|
|
||||||
#[cfg(feature = "embedded-sdmmc")]
|
|
||||||
mod sdmmc_rs {
|
|
||||||
use embedded_sdmmc::{Block, BlockCount, BlockDevice, BlockIdx};
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
impl<'d, T: Instance, Dma: SdmmcDma<T>> BlockDevice for Sdmmc<'d, T, Dma> {
|
|
||||||
type Error = Error;
|
|
||||||
|
|
||||||
async fn read(
|
|
||||||
&mut self,
|
|
||||||
blocks: &mut [Block],
|
|
||||||
start_block_idx: BlockIdx,
|
|
||||||
_reason: &str,
|
|
||||||
) -> Result<(), Self::Error> {
|
|
||||||
let mut address = start_block_idx.0;
|
|
||||||
|
|
||||||
for block in blocks.iter_mut() {
|
|
||||||
let block: &mut [u8; 512] = &mut block.contents;
|
|
||||||
|
|
||||||
// NOTE(unsafe) Block uses align(4)
|
|
||||||
let block = unsafe { &mut *(block as *mut _ as *mut DataBlock) };
|
|
||||||
self.read_block(address, block).await?;
|
|
||||||
address += 1;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn write(&mut self, blocks: &[Block], start_block_idx: BlockIdx) -> Result<(), Self::Error> {
|
|
||||||
let mut address = start_block_idx.0;
|
|
||||||
|
|
||||||
for block in blocks.iter() {
|
|
||||||
let block: &[u8; 512] = &block.contents;
|
|
||||||
|
|
||||||
// NOTE(unsafe) DataBlock uses align 4
|
|
||||||
let block = unsafe { &*(block as *const _ as *const DataBlock) };
|
|
||||||
self.write_block(address, block).await?;
|
|
||||||
address += 1;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn num_blocks(&self) -> Result<BlockCount, Self::Error> {
|
|
||||||
let card = self.card()?;
|
|
||||||
let count = card.csd.block_count();
|
|
||||||
Ok(BlockCount(count))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -161,6 +161,10 @@ pub struct Config {
|
|||||||
/// Set this to true to invert RX pin signal values (V<sub>DD</sub> =0/mark, Gnd = 1/idle).
|
/// Set this to true to invert RX pin signal values (V<sub>DD</sub> =0/mark, Gnd = 1/idle).
|
||||||
#[cfg(any(usart_v3, usart_v4))]
|
#[cfg(any(usart_v3, usart_v4))]
|
||||||
pub invert_rx: bool,
|
pub invert_rx: bool,
|
||||||
|
|
||||||
|
/// enable single wire half duplex communication. Only the tx pin is used. Needs an external
|
||||||
|
/// pull up
|
||||||
|
pub half_duplex: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Config {
|
impl Default for Config {
|
||||||
@ -180,6 +184,7 @@ impl Default for Config {
|
|||||||
invert_tx: false,
|
invert_tx: false,
|
||||||
#[cfg(any(usart_v3, usart_v4))]
|
#[cfg(any(usart_v3, usart_v4))]
|
||||||
invert_rx: false,
|
invert_rx: false,
|
||||||
|
half_duplex: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -811,19 +816,27 @@ impl<'d, T: BasicInstance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> {
|
|||||||
let r = T::regs();
|
let r = T::regs();
|
||||||
|
|
||||||
// Some chips do not have swap_rx_tx bit
|
// Some chips do not have swap_rx_tx bit
|
||||||
cfg_if::cfg_if! {
|
if config.half_duplex {
|
||||||
if #[cfg(any(usart_v3, usart_v4))] {
|
if config.swap_rx_tx {
|
||||||
if config.swap_rx_tx {
|
rx.set_as_af(rx.af_num(), AFType::OutputOpenDrain);
|
||||||
let (rx, tx) = (tx, rx);
|
} else {
|
||||||
rx.set_as_af(rx.af_num(), AFType::Input);
|
tx.set_as_af(tx.af_num(), AFType::OutputOpenDrain);
|
||||||
tx.set_as_af(tx.af_num(), AFType::OutputPushPull);
|
}
|
||||||
|
} else {
|
||||||
|
cfg_if::cfg_if! {
|
||||||
|
if #[cfg(any(usart_v3, usart_v4))] {
|
||||||
|
if config.swap_rx_tx {
|
||||||
|
let (rx, tx) = (tx, rx);
|
||||||
|
rx.set_as_af(rx.af_num(), AFType::Input);
|
||||||
|
tx.set_as_af(tx.af_num(), AFType::OutputPushPull);
|
||||||
|
} else {
|
||||||
|
rx.set_as_af(rx.af_num(), AFType::Input);
|
||||||
|
tx.set_as_af(tx.af_num(), AFType::OutputPushPull);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
rx.set_as_af(rx.af_num(), AFType::Input);
|
rx.set_as_af(rx.af_num(), AFType::Input);
|
||||||
tx.set_as_af(tx.af_num(), AFType::OutputPushPull);
|
tx.set_as_af(tx.af_num(), AFType::OutputPushPull);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
rx.set_as_af(rx.af_num(), AFType::Input);
|
|
||||||
tx.set_as_af(tx.af_num(), AFType::OutputPushPull);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1039,6 +1052,7 @@ fn configure(
|
|||||||
#[cfg(not(usart_v1))]
|
#[cfg(not(usart_v1))]
|
||||||
r.cr3().modify(|w| {
|
r.cr3().modify(|w| {
|
||||||
w.set_onebit(config.assume_noise_free);
|
w.set_onebit(config.assume_noise_free);
|
||||||
|
w.set_hdsel(config.half_duplex);
|
||||||
});
|
});
|
||||||
|
|
||||||
r.cr1().write(|w| {
|
r.cr1().write(|w| {
|
||||||
|
@ -111,6 +111,20 @@ where
|
|||||||
poll_fn(move |cx| self.poll_wait(cx))
|
poll_fn(move |cx| self.poll_wait(cx))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// non-blocking method to try and take the signal value.
|
||||||
|
pub fn try_take(&self) -> Option<T> {
|
||||||
|
self.state.lock(|cell| {
|
||||||
|
let state = cell.replace(State::None);
|
||||||
|
match state {
|
||||||
|
State::Signaled(res) => Some(res),
|
||||||
|
state => {
|
||||||
|
cell.set(state);
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// non-blocking method to check whether this signal has been signaled.
|
/// non-blocking method to check whether this signal has been signaled.
|
||||||
pub fn signaled(&self) -> bool {
|
pub fn signaled(&self) -> bool {
|
||||||
self.state.lock(|cell| {
|
self.state.lock(|cell| {
|
||||||
|
@ -47,9 +47,6 @@ impl Timer {
|
|||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ``` no_run
|
/// ``` no_run
|
||||||
/// # #![feature(type_alias_impl_trait)]
|
|
||||||
/// #
|
|
||||||
/// # fn foo() {}
|
|
||||||
/// use embassy_time::{Duration, Timer};
|
/// use embassy_time::{Duration, Timer};
|
||||||
///
|
///
|
||||||
/// #[embassy_executor::task]
|
/// #[embassy_executor::task]
|
||||||
@ -132,8 +129,6 @@ impl Future for Timer {
|
|||||||
///
|
///
|
||||||
/// For instance, consider the following code fragment.
|
/// For instance, consider the following code fragment.
|
||||||
/// ``` no_run
|
/// ``` no_run
|
||||||
/// # #![feature(type_alias_impl_trait)]
|
|
||||||
/// #
|
|
||||||
/// use embassy_time::{Duration, Timer};
|
/// use embassy_time::{Duration, Timer};
|
||||||
/// # fn foo() {}
|
/// # fn foo() {}
|
||||||
///
|
///
|
||||||
@ -152,8 +147,6 @@ impl Future for Timer {
|
|||||||
/// Example using ticker, which will consistently call `foo` once a second.
|
/// Example using ticker, which will consistently call `foo` once a second.
|
||||||
///
|
///
|
||||||
/// ``` no_run
|
/// ``` no_run
|
||||||
/// # #![feature(type_alias_impl_trait)]
|
|
||||||
/// #
|
|
||||||
/// use embassy_time::{Duration, Ticker};
|
/// use embassy_time::{Duration, Ticker};
|
||||||
/// # fn foo(){}
|
/// # fn foo(){}
|
||||||
///
|
///
|
||||||
|
@ -73,6 +73,8 @@ impl<'d, STATE: NorFlash, RST: Reset> Handler for Control<'d, STATE, RST> {
|
|||||||
self.detach_start = Some(Instant::now());
|
self.detach_start = Some(Instant::now());
|
||||||
self.timeout = Some(Duration::from_millis(req.value as u64));
|
self.timeout = Some(Duration::from_millis(req.value as u64));
|
||||||
self.state = State::AppDetach;
|
self.state = State::AppDetach;
|
||||||
|
// hack to make it work together with usb serial logging
|
||||||
|
self.reset();
|
||||||
Some(OutResponse::Accepted)
|
Some(OutResponse::Accepted)
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers", "arch-cortex-m", "executor-thread"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers", "arch-cortex-m", "executor-thread"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [] }
|
||||||
embassy-nrf = { version = "0.1.0", path = "../../../../embassy-nrf", features = ["time-driver-rtc1", "gpiote", ] }
|
embassy-nrf = { version = "0.1.0", path = "../../../../embassy-nrf", features = ["time-driver-rtc1", "gpiote", ] }
|
||||||
embassy-boot = { version = "0.1.0", path = "../../../../embassy-boot/boot", features = [] }
|
embassy-boot = { version = "0.1.0", path = "../../../../embassy-boot/boot", features = [] }
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![macro_use]
|
#![macro_use]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use embassy_boot_nrf::{FirmwareUpdater, FirmwareUpdaterConfig};
|
use embassy_boot_nrf::{FirmwareUpdater, FirmwareUpdaterConfig};
|
||||||
use embassy_embedded_hal::adapter::BlockingAsync;
|
use embassy_embedded_hal::adapter::BlockingAsync;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![macro_use]
|
#![macro_use]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_nrf::gpio::{Level, Output, OutputDrive};
|
use embassy_nrf::gpio::{Level, Output, OutputDrive};
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers", "arch-cortex-m", "executor-thread"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers", "arch-cortex-m", "executor-thread"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [] }
|
||||||
embassy-rp = { version = "0.1.0", path = "../../../../embassy-rp", features = ["time-driver", ] }
|
embassy-rp = { version = "0.1.0", path = "../../../../embassy-rp", features = ["time-driver", ] }
|
||||||
embassy-boot-rp = { version = "0.1.0", path = "../../../../embassy-boot/rp", features = [] }
|
embassy-boot-rp = { version = "0.1.0", path = "../../../../embassy-boot/rp", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_rp::gpio;
|
use embassy_rp::gpio;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32f303re", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32f303re", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32" }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32" }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32f767zi", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32f767zi", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32h743zi", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32h743zi", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32l072cz", "time-driver-any", "exti", "memory-x"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32l072cz", "time-driver-any", "exti", "memory-x"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32l151cb-a", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32l151cb-a", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32l475vg", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32l475vg", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32wb55rg", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32wb55rg", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ license = "MIT OR Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
embassy-sync = { version = "0.5.0", path = "../../../../embassy-sync" }
|
||||||
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "nightly", "integrated-timers"] }
|
embassy-executor = { version = "0.4.0", path = "../../../../embassy-executor", features = ["arch-cortex-m", "executor-thread", "integrated-timers"] }
|
||||||
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
embassy-time = { version = "0.2", path = "../../../../embassy-time", features = [ "tick-hz-32_768"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32wl55jc-cm4", "time-driver-any", "exti"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../../../embassy-stm32", features = ["stm32wl55jc-cm4", "time-driver-any", "exti"] }
|
||||||
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
embassy-boot-stm32 = { version = "0.1.0", path = "../../../../embassy-boot/stm32", features = [] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
#[cfg(feature = "defmt-rtt")]
|
#[cfg(feature = "defmt-rtt")]
|
||||||
use defmt_rtt::*;
|
use defmt_rtt::*;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::future::poll_fn;
|
use core::future::poll_fn;
|
||||||
use core::task::Poll;
|
use core::task::Poll;
|
||||||
|
@ -4,12 +4,6 @@ name = "embassy-nrf52840-examples"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["nightly"]
|
|
||||||
nightly = [
|
|
||||||
"static_cell/nightly",
|
|
||||||
]
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy-futures = { version = "0.1.0", path = "../../embassy-futures" }
|
embassy-futures = { version = "0.1.0", path = "../../embassy-futures" }
|
||||||
embassy-sync = { version = "0.5.0", path = "../../embassy-sync", features = ["defmt"] }
|
embassy-sync = { version = "0.5.0", path = "../../embassy-sync", features = ["defmt"] }
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_nrf::gpio::{Level, Output, OutputDrive};
|
use embassy_nrf::gpio::{Level, Output, OutputDrive};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::unwrap;
|
use defmt::unwrap;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::unwrap;
|
use defmt::unwrap;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
@ -14,7 +13,7 @@ use embassy_nrf::{bind_interrupts, peripherals, spim};
|
|||||||
use embassy_time::Delay;
|
use embassy_time::Delay;
|
||||||
use embedded_hal_bus::spi::ExclusiveDevice;
|
use embedded_hal_bus::spi::ExclusiveDevice;
|
||||||
use embedded_io_async::Write;
|
use embedded_io_async::Write;
|
||||||
use static_cell::make_static;
|
use static_cell::StaticCell;
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
|
|
||||||
bind_interrupts!(struct Irqs {
|
bind_interrupts!(struct Irqs {
|
||||||
@ -70,11 +69,20 @@ async fn main(spawner: Spawner) {
|
|||||||
let seed = u64::from_le_bytes(seed);
|
let seed = u64::from_le_bytes(seed);
|
||||||
|
|
||||||
// Init network stack
|
// Init network stack
|
||||||
let stack = &*make_static!(Stack::new(
|
static RESOURCES: StaticCell<StackResources<2>> = StaticCell::new();
|
||||||
|
static STACK: StaticCell<
|
||||||
|
Stack<
|
||||||
|
Enc28j60<
|
||||||
|
ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static, peripherals::P0_15>, Delay>,
|
||||||
|
Output<'static, peripherals::P0_13>,
|
||||||
|
>,
|
||||||
|
>,
|
||||||
|
> = StaticCell::new();
|
||||||
|
let stack = STACK.init(Stack::new(
|
||||||
device,
|
device,
|
||||||
config,
|
config,
|
||||||
make_static!(StackResources::<2>::new()),
|
RESOURCES.init(StackResources::<2>::new()),
|
||||||
seed
|
seed,
|
||||||
));
|
));
|
||||||
|
|
||||||
unwrap!(spawner.spawn(net_task(stack)));
|
unwrap!(spawner.spawn(net_task(stack)));
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::future::poll_fn;
|
use core::future::poll_fn;
|
||||||
use core::task::Poll;
|
use core::task::Poll;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::info;
|
use defmt::info;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::{info, unwrap};
|
use defmt::{info, unwrap};
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::f32::consts::PI;
|
use core::f32::consts::PI;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::{debug, error, info};
|
use defmt::{debug, error, info};
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::f32::consts::PI;
|
use core::f32::consts::PI;
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use cortex_m_rt::entry;
|
use cortex_m_rt::entry;
|
||||||
use defmt::{info, unwrap};
|
use defmt::{info, unwrap};
|
||||||
|
@ -55,7 +55,6 @@
|
|||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use cortex_m_rt::entry;
|
use cortex_m_rt::entry;
|
||||||
use defmt::{info, unwrap};
|
use defmt::{info, unwrap};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::{info, unwrap};
|
use defmt::{info, unwrap};
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::{info, unwrap};
|
use defmt::{info, unwrap};
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::info;
|
use defmt::info;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::cmp::Ordering;
|
use core::cmp::Ordering;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use core::future::pending;
|
use core::future::pending;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::unwrap;
|
use defmt::unwrap;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user