working scan

This commit is contained in:
Daniel Bulant 2026-05-11 18:58:41 +02:00
parent 1651c68771
commit 406c6a4235
No known key found for this signature in database
3 changed files with 383 additions and 82 deletions

334
esp32/Cargo.lock generated
View file

@ -22,6 +22,12 @@ dependencies = [
"memchr",
]
[[package]]
name = "allocator-api2"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c583acf993cf4245c4acb0a2cc2ab1f9cc097de73411bb6d3647ff6af2b1013d"
[[package]]
name = "arrayvec"
version = "0.7.6"
@ -54,6 +60,12 @@ dependencies = [
"rustc_version",
]
[[package]]
name = "base64"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "bitfield"
version = "0.13.2"
@ -129,6 +141,12 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "const-default"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b396d1f76d455557e1218ec8066ae14bba60b4b36ecd55577ba979f5db7ecaa"
[[package]]
name = "cordyceps"
version = "0.3.4"
@ -351,6 +369,26 @@ dependencies = [
"crypto-common",
]
[[package]]
name = "docsplay"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8547ea80db62c5bb9d7796fcce5e6e07d1136bdc1a02269095061e806758fab4"
dependencies = [
"docsplay-macros",
]
[[package]]
name = "docsplay-macros"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11772ed3eb3db124d826f3abeadf5a791a557f62c19b123e3f07288158a71fdd"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.117",
]
[[package]]
name = "document-features"
version = "0.2.12"
@ -360,6 +398,23 @@ dependencies = [
"litrs",
]
[[package]]
name = "embassy-embedded-hal"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0641612053b2f34fc250bb63f6630ae75de46e02ade7f457268447081d709ce"
dependencies = [
"embassy-futures",
"embassy-hal-internal",
"embassy-sync 0.8.0",
"embedded-hal 0.2.7",
"embedded-hal 1.0.0",
"embedded-hal-async",
"embedded-storage",
"embedded-storage-async",
"nb 1.1.0",
]
[[package]]
name = "embassy-executor"
version = "0.10.0"
@ -399,6 +454,15 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01"
[[package]]
name = "embassy-hal-internal"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f10ce10a4dfdf6402d8e9bd63128986b96a736b1a0a6680547ed2ac55d55dba"
dependencies = [
"num-traits",
]
[[package]]
name = "embassy-net"
version = "0.9.1"
@ -494,6 +558,25 @@ dependencies = [
"document-features",
]
[[package]]
name = "embassy-time-queue-utils"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "168297bf80aaf114b3c9ad589bf38b01b3009b9af7f97cd18086c5bbf96f5693"
dependencies = [
"embassy-executor-timer-queue",
"heapless 0.9.2",
]
[[package]]
name = "embedded-can"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e9d2e857f87ac832df68fa498d18ddc679175cf3d2e4aa893988e5601baf9438"
dependencies = [
"nb 1.1.0",
]
[[package]]
name = "embedded-hal"
version = "0.2.7"
@ -585,6 +668,15 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032"
[[package]]
name = "embedded-storage-async"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc"
dependencies = [
"embedded-storage",
]
[[package]]
name = "enumset"
version = "1.1.12"
@ -612,6 +704,39 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "esp-alloc"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46ced060d4085858283df950b80a4da2348e1707d7d07b1e966308582dae79f5"
dependencies = [
"allocator-api2",
"cfg-if",
"document-features",
"enumset",
"esp-config",
"esp-sync",
"linked_list_allocator",
"rlsf",
]
[[package]]
name = "esp-backtrace"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37950e24b2dfd98f1581102d1798281d4d9547af881e6bffc2c2b534c026ec8f"
dependencies = [
"cfg-if",
"document-features",
"esp-config",
"esp-metadata-generated",
"esp-println",
"heapless 0.9.2",
"riscv",
"semihosting",
"xtensa-lx",
]
[[package]]
name = "esp-bootloader-esp-idf"
version = "0.5.0"
@ -654,11 +779,18 @@ dependencies = [
"cfg-if",
"critical-section",
"delegate",
"digest",
"document-features",
"embassy-embedded-hal",
"embassy-futures",
"embassy-sync 0.8.0",
"embedded-can",
"embedded-hal 1.0.0",
"embedded-hal-async",
"embedded-io 0.6.1",
"embedded-io 0.7.1",
"embedded-io-async 0.6.1",
"embedded-io-async 0.7.0",
"enumset",
"esp-config",
"esp-hal-procmacros",
@ -675,12 +807,17 @@ dependencies = [
"esp32s3",
"fugit",
"instability",
"nb 1.1.0",
"paste",
"portable-atomic",
"rand_core 0.10.1",
"rand_core 0.6.4",
"rand_core 0.9.5",
"riscv",
"sha1",
"sha2",
"strum",
"ufmt-write",
"xtensa-lx",
"xtensa-lx-rt",
]
@ -705,6 +842,83 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42c2ee95b945a4780796e4359e72c033aed3b45073880e8029458f538532db8a"
[[package]]
name = "esp-phy"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7c0a29815cd105ae1a02f3d0c6e7aafda9504a41effae17fac4c3f827719228"
dependencies = [
"cfg-if",
"document-features",
"embassy-sync 0.8.0",
"esp-config",
"esp-hal",
"esp-metadata-generated",
"esp-sync",
"esp-wifi-sys-esp32",
"esp32 0.40.2",
]
[[package]]
name = "esp-println"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42dee1e9ac7c3539bf6464db1707b0edd7557168f98278cf3c84fe70e63c6ce6"
dependencies = [
"document-features",
"esp-metadata-generated",
"esp-sync",
"log",
"portable-atomic",
]
[[package]]
name = "esp-radio"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23fbff98b06a96b6ce3791ecec5c668524052a068e23aacd23afe17ddba844ce"
dependencies = [
"allocator-api2",
"cfg-if",
"docsplay",
"document-features",
"embassy-net-driver",
"embassy-sync 0.8.0",
"embedded-io 0.6.1",
"embedded-io 0.7.1",
"embedded-io-async 0.6.1",
"embedded-io-async 0.7.0",
"enumset",
"esp-alloc",
"esp-config",
"esp-hal",
"esp-hal-procmacros",
"esp-metadata-generated",
"esp-phy",
"esp-radio-rtos-driver",
"esp-sync",
"esp-wifi-sys-esp32",
"esp32 0.40.2",
"heapless 0.9.2",
"instability",
"num-derive",
"num-traits",
"portable-atomic",
"portable_atomic_enum",
"xtensa-lx-rt",
]
[[package]]
name = "esp-radio-rtos-driver"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bd75cd9073a90ffaa53db0bf17df7dc14164f2407a6ff36c725d2d1f78ff494"
dependencies = [
"cfg-if",
"esp-sync",
"portable-atomic",
]
[[package]]
name = "esp-riscv-rt"
version = "0.14.0"
@ -728,6 +942,32 @@ dependencies = [
"esp32 0.40.2",
]
[[package]]
name = "esp-rtos"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "551f90766e1527edaa0c91e8d559e9e2a60397b545e93357ac61fb31845e5712"
dependencies = [
"allocator-api2",
"cfg-if",
"document-features",
"embassy-executor",
"embassy-sync 0.8.0",
"embassy-time-driver",
"embassy-time-queue-utils",
"esp-alloc",
"esp-config",
"esp-hal",
"esp-hal-procmacros",
"esp-metadata-generated",
"esp-radio-rtos-driver",
"esp-rom-sys",
"esp-sync",
"portable-atomic",
"riscv",
"xtensa-lx",
]
[[package]]
name = "esp-sync"
version = "0.2.1"
@ -744,6 +984,12 @@ dependencies = [
"xtensa-lx",
]
[[package]]
name = "esp-wifi-sys-esp32"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2556f38f5292d9735d4e156e276815fc001c9a0a2be0544a575c5fb867129d24"
[[package]]
name = "esp32"
version = "0.1.0"
@ -762,8 +1008,13 @@ dependencies = [
"embedded-hal-compat",
"embedded-io 0.7.1",
"embedded-io-async 0.7.0",
"esp-alloc",
"esp-backtrace",
"esp-bootloader-esp-idf",
"esp-hal",
"esp-println",
"esp-radio",
"esp-rtos",
"log",
"owned_str",
"panic-probe",
@ -1038,6 +1289,12 @@ version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "linked_list_allocator"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b23ac50abb8261cb38c6e2a7192d3302e0836dac1628f6a93b82b4fad185897"
[[package]]
name = "litrs"
version = "1.0.0"
@ -1180,6 +1437,27 @@ dependencies = [
"portable-atomic",
]
[[package]]
name = "portable_atomic_enum"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d48f60c43e0120bb2bb48589a16d4bed2f4b911be41e299f2d0fc0e0e20885"
dependencies = [
"portable-atomic",
"portable_atomic_enum_macros",
]
[[package]]
name = "portable_atomic_enum_macros"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a33fa6ec7f2047f572d49317cca19c87195de99c6e5b6ee492da701cfe02b053"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.117",
]
[[package]]
name = "proc-macro-crate"
version = "3.5.0"
@ -1235,6 +1513,24 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
[[package]]
name = "rand_core"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
[[package]]
name = "rand_core"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
[[package]]
name = "regex-automata"
version = "0.4.14"
@ -1311,6 +1607,19 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1376b15f3ff160e9b1e8ea564ce427f2f6fcf77528cc0a8bf405cb476f9cea7"
[[package]]
name = "rlsf"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1646a59a9734b8b7a0ac51689388a60fe1625d4b956348e9de07591a1478457a"
dependencies = [
"cfg-if",
"const-default",
"libc",
"rustversion",
"svgbobdoc",
]
[[package]]
name = "rustc_version"
version = "0.2.3"
@ -1338,6 +1647,12 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
[[package]]
name = "semihosting"
version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8e4abf97879f4e80db69a9fba7bd64998e9bdad25f58ef045a778e191172fd4"
[[package]]
name = "semver"
version = "0.9.0"
@ -1520,6 +1835,19 @@ dependencies = [
"syn 2.0.117",
]
[[package]]
name = "svgbobdoc"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2c04b93fc15d79b39c63218f15e3fdffaa4c227830686e3b7c5f41244eb3e50"
dependencies = [
"base64",
"proc-macro2",
"quote",
"syn 1.0.109",
"unicode-width",
]
[[package]]
name = "syn"
version = "1.0.109"
@ -1733,6 +2061,12 @@ version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "unicode-width"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
name = "unsafe-libyaml"
version = "0.2.11"

View file

@ -15,7 +15,19 @@ codegen-units = 1
arrayvec = { version = "0.7.6", default-features = false }
embedded-io = "0.7.1"
esp-bootloader-esp-idf = { version = "0.5.0", features = ["esp32"] }
esp-hal = { version = "1.0.0", features = ["esp32", "rt"] }
esp-hal = { version = "1.1.1", features = ["esp32", "rt", "unstable"] }
esp-alloc = { version = "0.10.0", features = ["esp32"] }
esp-println = { version = "0.17.0", features = ["esp32"] }
esp-radio = { version = "0.18.0", features = ["esp32", "wifi", "esp-alloc", "unstable"] }
esp-rtos = { version = "0.3.0", features = ["esp32", "embassy", "esp-alloc", "esp-radio"] }
embassy-executor = { version = "0.10.0", default-features = false }
embassy-time = { version = "0.5.1", features = [
"defmt",
"defmt-timestamp-uptime",
] }
esp-backtrace = { version = "0.19.0", features = ["esp32", "println"] }
static_cell = "2.1.1"
log = "0.4"
[target.'cfg(target_arch = "arm")'.dependencies]
embedded-hal-compat = "0.13.0"

View file

@ -1,100 +1,55 @@
//! This example uses the RP Pico W board Wifi chip (cyw43).
//! Scans Wifi for ssid names.
#![no_std]
#![no_main]
#![allow(async_fn_in_trait)]
use core::str;
use cyw43::aligned_bytes;
use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi};
use defmt::*;
use embassy_executor::Spawner;
use embassy_rp::gpio::{Level, Output};
use embassy_rp::peripherals::{DMA_CH0, PIO0, USB};
use embassy_rp::pio::{InterruptHandler, Pio};
use embassy_rp::{bind_interrupts, dma, usb};
use embassy_time::Timer;
use static_cell::StaticCell;
use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs {
PIO0_IRQ_0 => InterruptHandler<PIO0>;
USBCTRL_IRQ => usb::InterruptHandler<USB>;
DMA_IRQ_0 => dma::InterruptHandler<DMA_CH0>;
});
use esp_alloc as _;
use esp_backtrace as _;
use esp_hal::{
clock::CpuClock, interrupt::software::SoftwareInterruptControl, timer::timg::TimerGroup,
};
use esp_println::println;
use esp_radio::wifi::sta::StationConfig;
use esp_radio::wifi::{Config, ControllerConfig, scan::ScanConfig};
#[embassy_executor::task]
async fn cyw43_task(
runner: cyw43::Runner<'static, cyw43::SpiBus<Output<'static>, PioSpi<'static, PIO0, 0>>>,
) -> ! {
runner.run().await
#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
loop {}
}
#[embassy_executor::task]
async fn logger_task(usb: embassy_rp::Peri<'static, embassy_rp::peripherals::USB>) {
let driver = embassy_rp::usb::Driver::new(usb, Irqs);
esp_bootloader_esp_idf::esp_app_desc!();
embassy_usb_logger::run!(1024, log::LevelFilter::Info, driver);
}
#[embassy_executor::task]
async fn periodic_log() {
loop {
info!("periodic log");
Timer::after_millis(1000).await;
}
}
#[esp_rtos::main]
async fn main(_spawner: Spawner) -> ! {
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
let peripherals = esp_hal::init(config);
#[embassy_executor::main]
async fn main(spawner: Spawner) {
let p = embassy_rp::init(Default::default());
spawner.spawn(unwrap!(logger_task(p.USB)));
spawner.spawn(unwrap!(periodic_log()));
esp_alloc::heap_allocator!(size: 64 * 1024);
info!("Hello World!");
let timg0 = TimerGroup::new(peripherals.TIMG0);
let sw_int = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
esp_rtos::start(timg0.timer0, sw_int.software_interrupt0);
let fw = aligned_bytes!("../../firmware/43439A0.bin");
let clm = aligned_bytes!("../../firmware/43439A0_clm.bin");
let nvram = aligned_bytes!("../../firmware/nvram_rp2040.bin");
// To make flashing faster for development, you may want to flash the firmwares independently
// at hardcoded addresses, instead of baking them into the program with `include_bytes!`:
// probe-rs download 43439A0.bin --binary-format bin --chip RP2040 --base-address 0x10100000
// probe-rs download 43439A0_clm.bin --binary-format bin --chip RP2040 --base-address 0x10140000
//let fw = unsafe { core::slice::from_raw_parts(0x10100000 as *const u8, 230321) };
//let clm = unsafe { core::slice::from_raw_parts(0x10140000 as *const u8, 4752) };
let pwr = Output::new(p.PIN_23, Level::Low);
let cs = Output::new(p.PIN_25, Level::High);
let mut pio = Pio::new(p.PIO0, Irqs);
let spi = PioSpi::new(
&mut pio.common,
pio.sm0,
DEFAULT_CLOCK_DIVIDER,
pio.irq0,
cs,
p.PIN_24,
p.PIN_29,
dma::Channel::new(p.DMA_CH0, Irqs),
let station_config = Config::Station(
StationConfig::default()
.with_ssid("ssid")
.with_password("password".into()),
);
static STATE: StaticCell<cyw43::State> = StaticCell::new();
let state = STATE.init(cyw43::State::new());
let (_net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw, nvram).await;
spawner.spawn(unwrap!(cyw43_task(runner)));
control.init(clm).await;
control
.set_power_management(cyw43::PowerManagementMode::PowerSave)
.await;
println!("Starting wifi");
let (mut controller, _interfaces) = esp_radio::wifi::new(
peripherals.WIFI,
ControllerConfig::default().with_initial_config(station_config),
)
.unwrap();
println!("Wifi configured and started!");
loop {
info!("scan loop");
let mut scanner = control.scan(Default::default()).await;
while let Some(bss) = scanner.next().await {
if let Ok(ssid_str) = str::from_utf8(&bss.ssid) {
info!("scanned {} == {:x}", ssid_str, bss.bssid);
}
println!("Scan");
let scan_config = ScanConfig::default().with_max(10);
let result = controller.scan_async(&scan_config).await.unwrap();
for ap in result {
println!("{:?}", ap);
}
Timer::after_millis(1000).await;
}