diff --git a/custom/integration/wifi/hosted_safe.cpp b/custom/integration/wifi/hosted_safe.cpp new file mode 100644 index 0000000..cbfb21a --- /dev/null +++ b/custom/integration/wifi/hosted_safe.cpp @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD + * + * SPDX-License-Identifier: MIT + */ +#include "integration/wifi/hosted_safe.h" + +#include +#include +#include +#include +#include +#include + +#include "esp_hosted.h" + +namespace custom::integration::wifi +{ + namespace + { + constexpr const char* kTag = "hosted-safe"; + + constexpr TickType_t kSlaveBootGuardDelay = pdMS_TO_TICKS(150); + + void cleanup_transport() + { + const esp_err_t deinit_err = esp_hosted_deinit(); + if (deinit_err != ESP_OK && deinit_err != ESP_ERR_INVALID_STATE) + { + ESP_LOGW(kTag, "esp_hosted_deinit reported: %s", esp_err_to_name(deinit_err)); + } + + const esp_err_t sdmmc_err = sdmmc_host_deinit(); + if (sdmmc_err != ESP_OK && sdmmc_err != ESP_ERR_INVALID_STATE) + { + ESP_LOGW(kTag, "sdmmc_host_deinit reported: %s", esp_err_to_name(sdmmc_err)); + } + } + } // namespace + + bool HostedSafeStart() + { + vTaskDelay(kSlaveBootGuardDelay); + + esp_err_t err = esp_hosted_init(); + if (err != ESP_OK) + { + ESP_LOGE(kTag, "esp_hosted_init failed: %s", esp_err_to_name(err)); + cleanup_transport(); + return false; + } + + wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT(); + err = esp_wifi_remote_init(&wifi_cfg); + if (err != ESP_OK) + { + ESP_LOGE(kTag, "esp_wifi_remote_init failed: %s", esp_err_to_name(err)); + const esp_err_t remote_err = esp_wifi_remote_deinit(); + if (remote_err != ESP_OK && remote_err != ESP_ERR_INVALID_STATE) + { + ESP_LOGW(kTag, "esp_wifi_remote_deinit reported: %s", esp_err_to_name(remote_err)); + } + cleanup_transport(); + return false; + } + + ESP_LOGI(kTag, "Hosted link established"); + return true; + } + +} // namespace custom::integration::wifi diff --git a/custom/integration/wifi/hosted_safe.h b/custom/integration/wifi/hosted_safe.h new file mode 100644 index 0000000..5995225 --- /dev/null +++ b/custom/integration/wifi/hosted_safe.h @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD + * + * SPDX-License-Identifier: MIT + */ +#pragma once + +#include + +namespace custom::integration::wifi +{ + + /** + * @brief Ensure the ESP-Hosted transport and remote Wi-Fi stacks are ready. + * + * Performs the conservative start-up sequence for the ESP-Hosted SDIO link. + * Returns true when the transport and Wi-Fi remote library were successfully + * initialised. + */ + bool HostedSafeStart(); + +} // namespace custom::integration::wifi diff --git a/platforms/tab5/main/hal/components/hal_wifi.cpp b/platforms/tab5/main/hal/components/hal_wifi.cpp index cd3e629..d206bff 100644 --- a/platforms/tab5/main/hal/components/hal_wifi.cpp +++ b/platforms/tab5/main/hal/components/hal_wifi.cpp @@ -18,6 +18,7 @@ #include #include "hal/hal_esp32.h" +#include "integration/wifi/hosted_safe.h" #define TAG "wifi" @@ -260,6 +261,7 @@ bool HalEsp32::wifi_init() esp_err_t softap_err = ESP_FAIL; bool softap_started = false; bool softap_unsupported = false; + bool hosted_initialised = false; auto power_cycle_wifi = [&]() { @@ -289,6 +291,18 @@ bool HalEsp32::wifi_init() vTaskDelay(kRetryBackoffDelay * static_cast(attempt)); } + if (!custom::integration::wifi::HostedSafeStart()) + { + host_err = ESP_FAIL; + if (attempt + 1 < kMaxTransportRetries) + { + schedule_power_cycle = true; + } + continue; + } + + hosted_initialised = true; + host_err = esp_hosted_slave_reset(); if (host_err != ESP_OK) { @@ -297,6 +311,7 @@ bool HalEsp32::wifi_init() attempt + 1, kMaxTransportRetries, esp_err_to_name(host_err)); + esp_hosted_deinit(); if (attempt + 1 < kMaxTransportRetries) { schedule_power_cycle = true; @@ -331,6 +346,8 @@ bool HalEsp32::wifi_init() esp_wifi_deinit(); } + esp_hosted_deinit(); + if (attempt + 1 < kMaxTransportRetries) { schedule_power_cycle = true; @@ -342,9 +359,14 @@ bool HalEsp32::wifi_init() portENTER_CRITICAL(&spinlock); state.failed = true; portEXIT_CRITICAL(&spinlock); + esp_hosted_deinit(); bsp_set_wifi_power_enable(false); - if (softap_unsupported) + if (!hosted_initialised) + { + ESP_LOGW(TAG, "Hosted init failed; Wi-Fi disabled"); + } + else if (softap_unsupported) { ESP_LOGW(TAG, "SoftAP unsupported on hosted slave; Wi-Fi will stay disabled"); } diff --git a/platforms/tab5/sdkconfig.defaults b/platforms/tab5/sdkconfig.defaults index 827f7ba..94de602 100644 --- a/platforms/tab5/sdkconfig.defaults +++ b/platforms/tab5/sdkconfig.defaults @@ -52,4 +52,30 @@ CONFIG_LV_USE_FONT_COMPRESSED=y CONFIG_IDF_EXPERIMENTAL_FEATURES=y CONFIG_SLAVE_IDF_TARGET_ESP32C6=y CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET="esp32c6" +CONFIG_ESP_HOSTED_ENABLED=y +CONFIG_ESP_HOSTED_PRIV_SDIO_OPTION=y +CONFIG_ESP_HOSTED_PRIV_SPI_HD_OPTION=y +CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y +CONFIG_ESP_HOSTED_SDIO_RESET_ACTIVE_HIGH=y +CONFIG_ESP_HOSTED_SDIO_OPTIMIZATION_RX_STREAMING_MODE=y +CONFIG_ESP_HOSTED_SDIO_GPIO_RESET_SLAVE=54 +CONFIG_ESP_HOSTED_SDIO_1_BIT_BUS=y +CONFIG_ESP_HOSTED_SDIO_4_BIT_BUS=n +CONFIG_ESP_HOSTED_SDIO_BUS_WIDTH=1 +CONFIG_ESP_HOSTED_SDIO_CLOCK_FREQ_KHZ=20000 +CONFIG_ESP_HOSTED_SDIO_PIN_CMD=19 +CONFIG_ESP_HOSTED_SDIO_PIN_CLK=18 +CONFIG_ESP_HOSTED_SDIO_PIN_D0=14 +CONFIG_ESP_HOSTED_SDIO_PIN_D1=15 +CONFIG_ESP_HOSTED_SDIO_PIN_D2=16 +CONFIG_ESP_HOSTED_SDIO_PIN_D3=17 +CONFIG_ESP_HOSTED_SDIO_TX_Q_SIZE=20 +CONFIG_ESP_HOSTED_SDIO_RX_Q_SIZE=20 +CONFIG_ESP_HOSTED_GPIO_SLAVE_RESET_SLAVE=54 +CONFIG_ESP_HOSTED_HOST_TO_ESP_WIFI_DATA_THROTTLE=y +CONFIG_ESP_HOSTED_PRIV_WIFI_TX_SDIO_HIGH_THRESHOLD=80 +CONFIG_ESP_HOSTED_TO_WIFI_DATA_THROTTLE_HIGH_THRESHOLD=80 +CONFIG_ESP_HOSTED_TO_WIFI_DATA_THROTTLE_LOW_THRESHOLD=60 +CONFIG_ESP_WIFI_REMOTE_ENABLED=y +CONFIG_ESP_WIFI_REMOTE_LIBRARY_HOSTED=y # CONFIG_HAL_AUDIO_ENABLE_LONG_DEMO is not set