diff --git a/esp32/Cargo.lock b/esp32/Cargo.lock index 5a69db9..3bb3b51 100644 --- a/esp32/Cargo.lock +++ b/esp32/Cargo.lock @@ -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" diff --git a/esp32/Cargo.toml b/esp32/Cargo.toml index 7d850c9..eb11b7c 100644 --- a/esp32/Cargo.toml +++ b/esp32/Cargo.toml @@ -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" diff --git a/esp32/src/bin/scan.rs b/esp32/src/bin/scan.rs index d9917a3..1377a1f 100644 --- a/esp32/src/bin/scan.rs +++ b/esp32/src/bin/scan.rs @@ -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; - USBCTRL_IRQ => usb::InterruptHandler; - DMA_IRQ_0 => dma::InterruptHandler; -}); +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, 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 = 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; }