diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index df26b9a869..a718dba2f5 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -278,12 +278,20 @@ menu "OpenThread" help Select this option to enable border router features in OpenThread. - config OPENTHREAD_PLATFORM_MSGPOOL_MANAGEMENT - bool 'Allocate message pool buffer from PSRAM' + menu "Thread Memory Allocation Config" depends on OPENTHREAD_ENABLED && (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC) - default n - help - If enabled, the message pool is managed by platform defined logic. + config OPENTHREAD_MEM_ALLOC_EXTERNAL + bool 'Allocate memory from PSRAM' + default y + help + Select this option to allocate buffer from PSRAM for Thread + + config OPENTHREAD_PLATFORM_MSGPOOL_MANAGEMENT + bool 'Allocate message pool buffer from PSRAM' + default n + help + If enabled, the message pool is managed by platform defined logic. + endmenu config OPENTHREAD_NUM_MESSAGE_BUFFERS int "The number of openthread message buffers" diff --git a/components/openthread/private_include/esp_openthread_common.hpp b/components/openthread/private_include/esp_openthread_common.hpp new file mode 100644 index 0000000000..c4dbf749ee --- /dev/null +++ b/components/openthread/private_include/esp_openthread_common.hpp @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_heap_caps.h" +#include +#include "common/new.hpp" + +template +inline T *New(uint32_t alloc_caps, Args &&...args) +{ + void *p = heap_caps_calloc(1, sizeof(T), alloc_caps); + if (p != nullptr) { + return new (p) T(std::forward(args)...); + } + return nullptr; +} diff --git a/components/openthread/private_include/esp_openthread_platform.h b/components/openthread/private_include/esp_openthread_platform.h index 6919e914be..3999322a8d 100644 --- a/components/openthread/private_include/esp_openthread_platform.h +++ b/components/openthread/private_include/esp_openthread_platform.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -84,7 +84,7 @@ void esp_openthread_platform_workflow_unregister(const char *name); * @brief Initializes the platform-specific support for the OpenThread stack. * * @note This function is not called by and will not call the OpenThread library. - * The user needs to call otInstanceInitSingle to intialize the OpenThread + * The user needs to call otInstanceInitSingle to initialize the OpenThread * stack after calling this function. * * @param[in] init_config The initialization configuration. @@ -146,6 +146,15 @@ esp_err_t esp_openthread_platform_process(otInstance *instance, const esp_openth * */ void esp_openthread_set_storage_name(const char *name); + +/** + * @brief Gets the caps of memory allocation. + * + * @return + * - The caps of the memory. + */ +uint32_t esp_openthread_get_alloc_caps(void); + #ifdef __cplusplus } // end of extern "C" #endif diff --git a/components/openthread/src/esp_openthread_platform.cpp b/components/openthread/src/esp_openthread_platform.cpp index 8beb8143dc..51bfd77904 100644 --- a/components/openthread/src/esp_openthread_platform.cpp +++ b/components/openthread/src/esp_openthread_platform.cpp @@ -204,3 +204,13 @@ esp_err_t esp_openthread_platform_process(otInstance *instance, const esp_openth } return ESP_OK; } + +uint32_t esp_openthread_get_alloc_caps(void) +{ + return +#if CONFIG_OPENTHREAD_PLATFORM_MALLOC_CAP_SPIRAM + (MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); +#else + (MALLOC_CAP_DEFAULT | MALLOC_CAP_8BIT); +#endif +}