[wifi] Add phy_mode option for ESP8266

This commit is contained in:
J. Nick Koston
2026-04-27 07:43:21 -05:00
parent 24c6a0d711
commit e232325a33
5 changed files with 48 additions and 0 deletions
+15
View File
@@ -73,6 +73,7 @@ NO_WIFI_VARIANTS = [const.VARIANT_ESP32H2, const.VARIANT_ESP32P4]
CONF_SAVE = "save"
CONF_BAND_MODE = "band_mode"
CONF_MIN_AUTH_MODE = "min_auth_mode"
CONF_PHY_MODE = "phy_mode"
CONF_POST_CONNECT_ROAMING = "post_connect_roaming"
# Maximum number of WiFi networks that can be configured
@@ -112,6 +113,13 @@ WIFI_MIN_AUTH_MODES = {
"WPA3": WifiMinAuthMode.WIFI_MIN_AUTH_MODE_WPA3,
}
VALIDATE_WIFI_MIN_AUTH_MODE = cv.enum(WIFI_MIN_AUTH_MODES, upper=True)
WiFi8266PhyMode = wifi_ns.enum("WiFi8266PhyMode")
WIFI_8266_PHY_MODES = {
"11B": WiFi8266PhyMode.WIFI_8266_PHY_MODE_11B,
"11G": WiFi8266PhyMode.WIFI_8266_PHY_MODE_11G,
"11N": WiFi8266PhyMode.WIFI_8266_PHY_MODE_11N,
}
WiFiConnectedCondition = wifi_ns.class_("WiFiConnectedCondition", Condition)
WiFiEnabledCondition = wifi_ns.class_("WiFiEnabledCondition", Condition)
WiFiAPActiveCondition = wifi_ns.class_("WiFiAPActiveCondition", Condition)
@@ -406,6 +414,10 @@ CONFIG_SCHEMA = cv.All(
cv.only_on_esp32,
only_on_variant(supported=[const.VARIANT_ESP32C5]),
),
cv.Optional(CONF_PHY_MODE): cv.All(
cv.enum(WIFI_8266_PHY_MODES, upper=True),
cv.only_on_esp8266,
),
cv.Optional(CONF_PASSIVE_SCAN, default=False): cv.boolean,
cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean,
cv.Optional(CONF_POST_CONNECT_ROAMING, default=True): cv.boolean,
@@ -569,6 +581,9 @@ async def to_code(config):
if CORE.is_esp8266:
cg.add_library("ESP8266WiFi", None)
if CONF_PHY_MODE in config:
cg.add_define("USE_WIFI_PHY_MODE")
cg.add(var.set_phy_mode(config[CONF_PHY_MODE]))
elif CORE.is_rp2040:
cg.add_library("WiFi", None)
+18
View File
@@ -345,6 +345,15 @@ enum WifiMinAuthMode : uint8_t {
WIFI_MIN_AUTH_MODE_WPA3,
};
#ifdef USE_WIFI_PHY_MODE
// Values match ESP8266 SDK phy_mode_t (PHY_MODE_11B=1, PHY_MODE_11G=2, PHY_MODE_11N=3).
enum WiFi8266PhyMode : uint8_t {
WIFI_8266_PHY_MODE_11B = 1,
WIFI_8266_PHY_MODE_11G = 2,
WIFI_8266_PHY_MODE_11N = 3,
};
#endif
#ifdef USE_ESP32
struct IDFWiFiEvent;
#endif
@@ -455,6 +464,9 @@ class WiFiComponent final : public Component {
#if defined(USE_ESP32) && defined(SOC_WIFI_SUPPORT_5G)
void set_band_mode(wifi_band_mode_t band_mode) { this->band_mode_ = band_mode; }
#endif
#ifdef USE_WIFI_PHY_MODE
void set_phy_mode(WiFi8266PhyMode phy_mode) { this->phy_mode_ = phy_mode; }
#endif
void set_passive_scan(bool passive);
@@ -672,6 +684,9 @@ class WiFiComponent final : public Component {
bool wifi_apply_power_save_();
#if defined(USE_ESP32) && defined(SOC_WIFI_SUPPORT_5G)
bool wifi_apply_band_mode_();
#endif
#ifdef USE_WIFI_PHY_MODE
bool wifi_apply_phy_mode_();
#endif
bool wifi_sta_ip_config_(const optional<ManualIP> &manual_ip);
bool wifi_apply_hostname_();
@@ -810,6 +825,9 @@ class WiFiComponent final : public Component {
WiFiPowerSaveMode power_save_{WIFI_POWER_SAVE_NONE};
#if defined(USE_ESP32) && defined(SOC_WIFI_SUPPORT_5G)
wifi_band_mode_t band_mode_{WIFI_BAND_MODE_AUTO};
#endif
#ifdef USE_WIFI_PHY_MODE
WiFi8266PhyMode phy_mode_{WIFI_8266_PHY_MODE_11N};
#endif
WifiMinAuthMode min_auth_mode_{WIFI_MIN_AUTH_MODE_WPA2};
WiFiRetryPhase retry_phase_{WiFiRetryPhase::INITIAL_CONNECT};
@@ -621,10 +621,23 @@ bool WiFiComponent::wifi_sta_pre_setup_() {
ESP_LOGV(TAG, "Disabling Auto-Connect failed");
}
#ifdef USE_WIFI_PHY_MODE
if (!this->wifi_apply_phy_mode_()) {
ESP_LOGV(TAG, "Setting PHY Mode failed");
}
#endif
delay(10);
return true;
}
#ifdef USE_WIFI_PHY_MODE
bool WiFiComponent::wifi_apply_phy_mode_() {
// Values of WiFi8266PhyMode are aligned with the SDK's phy_mode_t enum.
return wifi_set_phy_mode(static_cast<phy_mode_t>(this->phy_mode_));
}
#endif
void WiFiComponent::wifi_pre_setup_() {
wifi_set_event_handler_cb(&WiFiComponent::wifi_event_callback);
+1
View File
@@ -282,6 +282,7 @@
#define USE_CAPTIVE_PORTAL_GZIP
#define USE_WIFI_11KV_SUPPORT
#define USE_WIFI_FAST_CONNECT
#define USE_WIFI_PHY_MODE
#define USE_WIFI_IP_STATE_LISTENERS
#define USE_WIFI_SCAN_RESULTS_LISTENERS
#define USE_WIFI_CONNECT_STATE_LISTENERS
@@ -1,6 +1,7 @@
wifi:
min_auth_mode: WPA2
post_connect_roaming: true
phy_mode: 11G
packages:
- !include common.yaml