diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fc6782e824..11946b0a82f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - NVS: Implemented `RawHandle` for `EspNvs` - NVS: Added `EspNvs::erase_all` to remove all data stored in an nvs namespace - NVS: Added `EspNvs::keys` to iterate over all stored keys -- esp32p4: This chip has no radio, so wifi has been disabled for this +- esp32p4: This chip has no radio, but can use wifi via esp_wifi_remote. Support for esp_wifi_remote has been added. - HTTP: added `keep_alive_*` option into configuration ## [0.51.0] - 2025-01-15 diff --git a/src/lib.rs b/src/lib.rs index f1fbefe5626..b17506cd28c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -105,9 +105,9 @@ pub mod thread; pub mod timer; pub mod tls; #[cfg(all( - not(any(esp32h2, esp32p4)), + not(esp32h2), feature = "alloc", - esp_idf_comp_esp_wifi_enabled, + any(esp_idf_comp_esp_wifi_enabled, esp_idf_comp_esp_wifi_remote_enabled), esp_idf_comp_esp_event_enabled, ))] pub mod wifi; diff --git a/src/netif.rs b/src/netif.rs index 037473ddba9..28b61588912 100644 --- a/src/netif.rs +++ b/src/netif.rs @@ -80,9 +80,26 @@ impl NetifStack { fn default_mac(&self) -> Result, EspError> { if let Some(mac_type) = self.default_mac_raw_type() { let mut mac = [0; 6]; - esp!(unsafe { esp_read_mac(mac.as_mut_ptr() as *mut _, mac_type) })?; - Ok(Some(mac)) + // On SoCs without native WiFi hardware (e.g., ESP32-P4 using + // esp_wifi_remote), the eFuse has no WiFi MAC address. + // esp_read_mac will fail for WiFi MAC types. Return None and let + // esp_wifi_start() set the real MAC from the companion chip later. + #[cfg(not(esp_idf_soc_wifi_supported))] + { + let err = unsafe { esp_read_mac(mac.as_mut_ptr() as *mut _, mac_type) }; + if err == ESP_OK { + return Ok(Some(mac)); + } else { + return Ok(None); + } + } + + #[cfg(esp_idf_soc_wifi_supported)] + { + esp!(unsafe { esp_read_mac(mac.as_mut_ptr() as *mut _, mac_type) })?; + Ok(Some(mac)) + } } else { Ok(None) } diff --git a/src/wifi.rs b/src/wifi.rs index 0a5ad35ee01..0f621e55f0b 100644 --- a/src/wifi.rs +++ b/src/wifi.rs @@ -2373,18 +2373,39 @@ impl EspEventDeserializer for WifiEvent<'_> { ), )))] wifi_event_t_WIFI_EVENT_HOME_CHANNEL_CHANGE => { - let payload = unsafe { - (data.payload.unwrap() as *const _ as *const wifi_event_home_channel_change_t) - .as_ref() + #[cfg(esp_idf_soc_wifi_supported)] + { + let payload = unsafe { + (data.payload.unwrap() as *const _ + as *const wifi_event_home_channel_change_t) + .as_ref() + } + .unwrap(); + + WifiEvent::HomeChannelChange(HomeChannelChange { + old_chan: payload.old_chan, + old_snd: payload.old_snd.try_into().ok(), + new_chan: payload.new_chan, + new_snd: payload.new_snd.try_into().ok(), + }) + } + + // On SoCs without native WiFi (using esp_wifi_remote), this + // event may fire without a payload. + #[cfg(not(esp_idf_soc_wifi_supported))] + { + let payload = data + .payload + .map(|p| p as *const _ as *const wifi_event_home_channel_change_t) + .and_then(|p| unsafe { p.as_ref() }); + + WifiEvent::HomeChannelChange(HomeChannelChange { + old_chan: payload.map_or(0, |p| p.old_chan), + old_snd: payload.and_then(|p| p.old_snd.try_into().ok()), + new_chan: payload.map_or(0, |p| p.new_chan), + new_snd: payload.and_then(|p| p.new_snd.try_into().ok()), + }) } - .unwrap(); - - WifiEvent::HomeChannelChange(HomeChannelChange { - old_chan: payload.old_chan, - old_snd: payload.old_snd.try_into().ok(), - new_chan: payload.new_chan, - new_snd: payload.new_snd.try_into().ok(), - }) } _ => panic!("unknown event ID: {event_id}"), }