mirror of
https://github.com/esphome/esphome.git
synced 2026-06-01 01:19:45 +08:00
[esp32][wifi] Fix bootloop and WiFi connection issue if nvs partition is missing or has non-default label (#16025)
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
This commit is contained in:
@@ -22,6 +22,12 @@ struct NVSData {
|
|||||||
|
|
||||||
static std::vector<NVSData> s_pending_save; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
static std::vector<NVSData> s_pending_save; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
|
|
||||||
|
// open() runs from app_main() before the logger is initialized, so any failure
|
||||||
|
// must be deferred until after global_logger is set. This is emitted from the
|
||||||
|
// first make_preference() call, which runs from the generated setup() after
|
||||||
|
// log->pre_setup() has run at EARLY_INIT priority.
|
||||||
|
static esp_err_t s_open_err = ESP_OK; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
|
|
||||||
bool ESP32PreferenceBackend::save(const uint8_t *data, size_t len) {
|
bool ESP32PreferenceBackend::save(const uint8_t *data, size_t len) {
|
||||||
// try find in pending saves and update that
|
// try find in pending saves and update that
|
||||||
for (auto &obj : s_pending_save) {
|
for (auto &obj : s_pending_save) {
|
||||||
@@ -74,12 +80,14 @@ bool ESP32PreferenceBackend::load(uint8_t *data, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ESP32Preferences::open() {
|
void ESP32Preferences::open() {
|
||||||
|
// Runs from app_main() before the logger is initialized; any logging here
|
||||||
|
// must be deferred. See s_open_err and make_preference() below.
|
||||||
nvs_flash_init();
|
nvs_flash_init();
|
||||||
esp_err_t err = nvs_open("esphome", NVS_READWRITE, &this->nvs_handle);
|
esp_err_t err = nvs_open("esphome", NVS_READWRITE, &this->nvs_handle);
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ESP_LOGW(TAG, "nvs_open failed: %s - erasing NVS", esp_err_to_name(err));
|
s_open_err = err;
|
||||||
nvs_flash_deinit();
|
nvs_flash_deinit();
|
||||||
nvs_flash_erase();
|
nvs_flash_erase();
|
||||||
nvs_flash_init();
|
nvs_flash_init();
|
||||||
@@ -91,6 +99,14 @@ void ESP32Preferences::open() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ESPPreferenceObject ESP32Preferences::make_preference(size_t length, uint32_t type) {
|
ESPPreferenceObject ESP32Preferences::make_preference(size_t length, uint32_t type) {
|
||||||
|
if (s_open_err != ESP_OK) {
|
||||||
|
if (this->nvs_handle == 0) {
|
||||||
|
ESP_LOGW(TAG, "nvs_open failed: %s - NVS unavailable", esp_err_to_name(s_open_err));
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "nvs_open failed: %s - erased NVS", esp_err_to_name(s_open_err));
|
||||||
|
}
|
||||||
|
s_open_err = ESP_OK;
|
||||||
|
}
|
||||||
auto *pref = new ESP32PreferenceBackend(); // NOLINT(cppcoreguidelines-owning-memory)
|
auto *pref = new ESP32PreferenceBackend(); // NOLINT(cppcoreguidelines-owning-memory)
|
||||||
pref->nvs_handle = this->nvs_handle;
|
pref->nvs_handle = this->nvs_handle;
|
||||||
pref->key = type;
|
pref->key = type;
|
||||||
|
|||||||
@@ -179,7 +179,10 @@ void WiFiComponent::wifi_pre_setup_() {
|
|||||||
#endif // USE_WIFI_AP
|
#endif // USE_WIFI_AP
|
||||||
|
|
||||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||||
// cfg.nvs_enable = false;
|
if (global_preferences->nvs_handle == 0) {
|
||||||
|
ESP_LOGW(TAG, "starting wifi without nvs");
|
||||||
|
cfg.nvs_enable = false;
|
||||||
|
}
|
||||||
err = esp_wifi_init(&cfg);
|
err = esp_wifi_init(&cfg);
|
||||||
if (err != ERR_OK) {
|
if (err != ERR_OK) {
|
||||||
ESP_LOGE(TAG, "esp_wifi_init failed: %s", esp_err_to_name(err));
|
ESP_LOGE(TAG, "esp_wifi_init failed: %s", esp_err_to_name(err));
|
||||||
|
|||||||
Reference in New Issue
Block a user