Skip to content

Commit ee82737

Browse files
authored
Merge pull request #183 from baba-dev/codex/stabilize-sdio-init-to-prevent-boot-loop
fix(hosted): harden sdio bring-up
2 parents 979c2c3 + a1733bf commit ee82737

File tree

4 files changed

+142
-1
lines changed

4 files changed

+142
-1
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*/
6+
#include "integration/wifi/hosted_safe.h"
7+
8+
#include <driver/sdmmc_host.h>
9+
#include <esp_err.h>
10+
#include <esp_log.h>
11+
#include <esp_wifi.h>
12+
#include <freertos/FreeRTOS.h>
13+
#include <freertos/task.h>
14+
15+
#include "esp_hosted.h"
16+
17+
namespace custom::integration::wifi
18+
{
19+
namespace
20+
{
21+
constexpr const char* kTag = "hosted-safe";
22+
23+
constexpr TickType_t kSlaveBootGuardDelay = pdMS_TO_TICKS(150);
24+
25+
void cleanup_transport()
26+
{
27+
const esp_err_t deinit_err = esp_hosted_deinit();
28+
if (deinit_err != ESP_OK && deinit_err != ESP_ERR_INVALID_STATE)
29+
{
30+
ESP_LOGW(kTag, "esp_hosted_deinit reported: %s", esp_err_to_name(deinit_err));
31+
}
32+
33+
const esp_err_t sdmmc_err = sdmmc_host_deinit();
34+
if (sdmmc_err != ESP_OK && sdmmc_err != ESP_ERR_INVALID_STATE)
35+
{
36+
ESP_LOGW(kTag, "sdmmc_host_deinit reported: %s", esp_err_to_name(sdmmc_err));
37+
}
38+
}
39+
} // namespace
40+
41+
bool HostedSafeStart()
42+
{
43+
vTaskDelay(kSlaveBootGuardDelay);
44+
45+
esp_err_t err = esp_hosted_init();
46+
if (err != ESP_OK)
47+
{
48+
ESP_LOGE(kTag, "esp_hosted_init failed: %s", esp_err_to_name(err));
49+
cleanup_transport();
50+
return false;
51+
}
52+
53+
wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
54+
err = esp_wifi_remote_init(&wifi_cfg);
55+
if (err != ESP_OK)
56+
{
57+
ESP_LOGE(kTag, "esp_wifi_remote_init failed: %s", esp_err_to_name(err));
58+
const esp_err_t remote_err = esp_wifi_remote_deinit();
59+
if (remote_err != ESP_OK && remote_err != ESP_ERR_INVALID_STATE)
60+
{
61+
ESP_LOGW(kTag, "esp_wifi_remote_deinit reported: %s", esp_err_to_name(remote_err));
62+
}
63+
cleanup_transport();
64+
return false;
65+
}
66+
67+
ESP_LOGI(kTag, "Hosted link established");
68+
return true;
69+
}
70+
71+
} // namespace custom::integration::wifi
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*/
6+
#pragma once
7+
8+
#include <stdbool.h>
9+
10+
namespace custom::integration::wifi
11+
{
12+
13+
/**
14+
* @brief Ensure the ESP-Hosted transport and remote Wi-Fi stacks are ready.
15+
*
16+
* Performs the conservative start-up sequence for the ESP-Hosted SDIO link.
17+
* Returns true when the transport and Wi-Fi remote library were successfully
18+
* initialised.
19+
*/
20+
bool HostedSafeStart();
21+
22+
} // namespace custom::integration::wifi

platforms/tab5/main/hal/components/hal_wifi.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <nvs_flash.h>
1919

2020
#include "hal/hal_esp32.h"
21+
#include "integration/wifi/hosted_safe.h"
2122

2223
#define TAG "wifi"
2324

@@ -260,6 +261,7 @@ bool HalEsp32::wifi_init()
260261
esp_err_t softap_err = ESP_FAIL;
261262
bool softap_started = false;
262263
bool softap_unsupported = false;
264+
bool hosted_initialised = false;
263265

264266
auto power_cycle_wifi = [&]()
265267
{
@@ -289,6 +291,18 @@ bool HalEsp32::wifi_init()
289291
vTaskDelay(kRetryBackoffDelay * static_cast<TickType_t>(attempt));
290292
}
291293

294+
if (!custom::integration::wifi::HostedSafeStart())
295+
{
296+
host_err = ESP_FAIL;
297+
if (attempt + 1 < kMaxTransportRetries)
298+
{
299+
schedule_power_cycle = true;
300+
}
301+
continue;
302+
}
303+
304+
hosted_initialised = true;
305+
292306
host_err = esp_hosted_slave_reset();
293307
if (host_err != ESP_OK)
294308
{
@@ -297,6 +311,7 @@ bool HalEsp32::wifi_init()
297311
attempt + 1,
298312
kMaxTransportRetries,
299313
esp_err_to_name(host_err));
314+
esp_hosted_deinit();
300315
if (attempt + 1 < kMaxTransportRetries)
301316
{
302317
schedule_power_cycle = true;
@@ -331,6 +346,8 @@ bool HalEsp32::wifi_init()
331346
esp_wifi_deinit();
332347
}
333348

349+
esp_hosted_deinit();
350+
334351
if (attempt + 1 < kMaxTransportRetries)
335352
{
336353
schedule_power_cycle = true;
@@ -342,9 +359,14 @@ bool HalEsp32::wifi_init()
342359
portENTER_CRITICAL(&spinlock);
343360
state.failed = true;
344361
portEXIT_CRITICAL(&spinlock);
362+
esp_hosted_deinit();
345363
bsp_set_wifi_power_enable(false);
346364

347-
if (softap_unsupported)
365+
if (!hosted_initialised)
366+
{
367+
ESP_LOGW(TAG, "Hosted init failed; Wi-Fi disabled");
368+
}
369+
else if (softap_unsupported)
348370
{
349371
ESP_LOGW(TAG, "SoftAP unsupported on hosted slave; Wi-Fi will stay disabled");
350372
}

platforms/tab5/sdkconfig.defaults

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,30 @@ CONFIG_LV_USE_FONT_COMPRESSED=y
5252
CONFIG_IDF_EXPERIMENTAL_FEATURES=y
5353
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
5454
CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET="esp32c6"
55+
CONFIG_ESP_HOSTED_ENABLED=y
56+
CONFIG_ESP_HOSTED_PRIV_SDIO_OPTION=y
57+
CONFIG_ESP_HOSTED_PRIV_SPI_HD_OPTION=y
58+
CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y
59+
CONFIG_ESP_HOSTED_SDIO_RESET_ACTIVE_HIGH=y
60+
CONFIG_ESP_HOSTED_SDIO_OPTIMIZATION_RX_STREAMING_MODE=y
61+
CONFIG_ESP_HOSTED_SDIO_GPIO_RESET_SLAVE=54
62+
CONFIG_ESP_HOSTED_SDIO_1_BIT_BUS=y
63+
CONFIG_ESP_HOSTED_SDIO_4_BIT_BUS=n
64+
CONFIG_ESP_HOSTED_SDIO_BUS_WIDTH=1
65+
CONFIG_ESP_HOSTED_SDIO_CLOCK_FREQ_KHZ=20000
66+
CONFIG_ESP_HOSTED_SDIO_PIN_CMD=19
67+
CONFIG_ESP_HOSTED_SDIO_PIN_CLK=18
68+
CONFIG_ESP_HOSTED_SDIO_PIN_D0=14
69+
CONFIG_ESP_HOSTED_SDIO_PIN_D1=15
70+
CONFIG_ESP_HOSTED_SDIO_PIN_D2=16
71+
CONFIG_ESP_HOSTED_SDIO_PIN_D3=17
72+
CONFIG_ESP_HOSTED_SDIO_TX_Q_SIZE=20
73+
CONFIG_ESP_HOSTED_SDIO_RX_Q_SIZE=20
74+
CONFIG_ESP_HOSTED_GPIO_SLAVE_RESET_SLAVE=54
75+
CONFIG_ESP_HOSTED_HOST_TO_ESP_WIFI_DATA_THROTTLE=y
76+
CONFIG_ESP_HOSTED_PRIV_WIFI_TX_SDIO_HIGH_THRESHOLD=80
77+
CONFIG_ESP_HOSTED_TO_WIFI_DATA_THROTTLE_HIGH_THRESHOLD=80
78+
CONFIG_ESP_HOSTED_TO_WIFI_DATA_THROTTLE_LOW_THRESHOLD=60
79+
CONFIG_ESP_WIFI_REMOTE_ENABLED=y
80+
CONFIG_ESP_WIFI_REMOTE_LIBRARY_HOSTED=y
5581
# CONFIG_HAL_AUDIO_ENABLE_LONG_DEMO is not set

0 commit comments

Comments
 (0)