From 4e017f989dfaa214ddcfcf5d662a34e1c8dcdb75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Mich=C3=A1lek?= Date: Mon, 14 Jul 2025 08:11:42 +0200 Subject: [PATCH] wip: add async-wifi support to S3-BOX --- examples/mcu-board-support/Cargo.toml | 16 ++++++++++ examples/mcu-board-support/esp32_s3_box_3.rs | 32 +++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/examples/mcu-board-support/Cargo.toml b/examples/mcu-board-support/Cargo.toml index 04518a2b7..7c48fb232 100644 --- a/examples/mcu-board-support/Cargo.toml +++ b/examples/mcu-board-support/Cargo.toml @@ -75,6 +75,9 @@ esp32-s3-box-3 = [ "esp-hal/esp32s3", "esp-hal/unstable", # required for PSRAM support "esp-hal/psram", + "esp-wifi/esp32s3", + "static_cell", + "embassy-net", "embedded-hal", "embedded-hal-bus", "esp-alloc", @@ -155,6 +158,19 @@ esp-hal = { version = "1.0.0-beta.0", optional = true } esp-alloc = { version = "0.7", optional = true } esp-println = { version = "0.14.0", features = ["log-04"], optional = true } esp-backtrace = { version = "0.16.0", optional = true, features = ["panic-handler", "println"] } +esp-wifi = { version = "0.14.1", optional = true, features = [ + "builtin-scheduler", + "esp-alloc", + "smoltcp", + "wifi", +] } +static_cell = { version = "2.1.0", optional = true, features = ["nightly"] } +embassy-net = { version = "0.7.0", optional = true, features = [ + "dhcpv4", + "medium-ethernet", + "tcp", + "udp", +] } mipidsi = { version = "0.9.0", optional = true } embedded-graphics-core = { version = "0.4", optional = true } diff --git a/examples/mcu-board-support/esp32_s3_box_3.rs b/examples/mcu-board-support/esp32_s3_box_3.rs index 3412a3aa4..4f5e16ac6 100644 --- a/examples/mcu-board-support/esp32_s3_box_3.rs +++ b/examples/mcu-board-support/esp32_s3_box_3.rs @@ -58,8 +58,38 @@ pub fn init() { })) .expect("backend already initialized"); } +macro_rules! mk_static { + ($t:ty, $val:expr) => {{ + static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); + STATIC_CELL.init($val) + }}; +} + +use esp_wifi::wifi; +use esp_wifi::{ + wifi::{ClientConfiguration, Configuration, WifiController, WifiEvent, WifiState}, + EspWifiController, +}; +use esp_hal::{rng::Rng, timer::timg::TimerGroup}; + +impl EspBackend { + pub fn wifi<'a>(&self, ssid: &'a str, password: &'a str) -> (wifi::WifiController<'a>, wifi::WifiDevice<'a>) { + // Initialize the Wi-Fi controller and device. + let peripherals = self.peripherals.borrow_mut().take().expect("Peripherals already taken"); + let mut rng = Rng::new(peripherals.RNG); + let timer1 = TimerGroup::new(peripherals.TIMG0); + let wifi_init = &*mk_static!( + EspWifiController<'static>, + esp_wifi::init(timer1.timer0, rng.clone(), peripherals.RADIO_CLK).unwrap() + ); + let (mut wifi_controller, interfaces) = esp_wifi::wifi::new(&wifi_init, peripherals.WIFI) + .expect("Failed to initialize WIFI controller"); + let config = embassy_net::Config::dhcpv4(Default::default()); + let wifi_device = interfaces.sta; + (wifi_controller, wifi_device) + } + -impl slint::platform::Platform for EspBackend { fn create_window_adapter( &self, ) -> Result, slint::PlatformError> {