mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-03 22:08:28 +00:00 
			
		
		
		
	Merge branch 'bugfix/put_sempher_and_queue_used_in_isr_into_DRAM_v4.3' into 'release/v4.3'
Make sure semphr/queue used in interrupt is in DRAM See merge request espressif/esp-idf!18989
This commit is contained in:
		@@ -88,10 +88,6 @@ do{\
 | 
			
		||||
#define OSI_VERSION              0x00010003
 | 
			
		||||
#define OSI_MAGIC_VALUE          0xFADEBEAD
 | 
			
		||||
 | 
			
		||||
/* SPIRAM Configuration */
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
#define BTDM_MAX_QUEUE_NUM       (6)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Types definition
 | 
			
		||||
 ************************************************************************
 | 
			
		||||
@@ -110,14 +106,10 @@ typedef struct {
 | 
			
		||||
    intptr_t end;
 | 
			
		||||
} btdm_dram_available_region_t;
 | 
			
		||||
 | 
			
		||||
/* PSRAM configuration */
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
typedef struct {
 | 
			
		||||
    QueueHandle_t handle;
 | 
			
		||||
    void *handle;
 | 
			
		||||
    void *storage;
 | 
			
		||||
    void *buffer;
 | 
			
		||||
} btdm_queue_item_t;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* OSI function */
 | 
			
		||||
struct osi_funcs_t {
 | 
			
		||||
@@ -263,10 +255,6 @@ extern uint32_t _btdm_data_end;
 | 
			
		||||
/* Local Function Declare
 | 
			
		||||
 *********************************************************************
 | 
			
		||||
 */
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
static bool btdm_queue_generic_register(const btdm_queue_item_t *queue);
 | 
			
		||||
static bool btdm_queue_generic_deregister(btdm_queue_item_t *queue);
 | 
			
		||||
#endif /* CONFIG_SPIRAM_USE_MALLOC */
 | 
			
		||||
static void IRAM_ATTR interrupt_disable(void);
 | 
			
		||||
static void IRAM_ATTR interrupt_restore(void);
 | 
			
		||||
static void IRAM_ATTR task_yield(void);
 | 
			
		||||
@@ -408,11 +396,6 @@ SOC_RESERVE_MEMORY_REGION(SOC_MEM_BT_DATA_START, SOC_MEM_BT_DATA_END,
 | 
			
		||||
 | 
			
		||||
static DRAM_ATTR struct osi_funcs_t *osi_funcs_p;
 | 
			
		||||
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
static DRAM_ATTR btdm_queue_item_t btdm_queue_table[BTDM_MAX_QUEUE_NUM];
 | 
			
		||||
static DRAM_ATTR SemaphoreHandle_t btdm_queue_table_mux = NULL;
 | 
			
		||||
#endif /* #if CONFIG_SPIRAM_USE_MALLOC */
 | 
			
		||||
 | 
			
		||||
/* Static variable declare */
 | 
			
		||||
// timestamp when PHY/RF was switched on
 | 
			
		||||
static DRAM_ATTR int64_t s_time_phy_rf_just_enabled = 0;
 | 
			
		||||
@@ -464,52 +447,6 @@ static inline void btdm_check_and_init_bb(void)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
static bool btdm_queue_generic_register(const btdm_queue_item_t *queue)
 | 
			
		||||
{
 | 
			
		||||
    if (!btdm_queue_table_mux || !queue) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool ret = false;
 | 
			
		||||
    btdm_queue_item_t *item;
 | 
			
		||||
    xSemaphoreTake(btdm_queue_table_mux, portMAX_DELAY);
 | 
			
		||||
    for (int i = 0; i < BTDM_MAX_QUEUE_NUM; ++i) {
 | 
			
		||||
        item = &btdm_queue_table[i];
 | 
			
		||||
        if (item->handle == NULL) {
 | 
			
		||||
            memcpy(item, queue, sizeof(btdm_queue_item_t));
 | 
			
		||||
            ret = true;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    xSemaphoreGive(btdm_queue_table_mux);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool btdm_queue_generic_deregister(btdm_queue_item_t *queue)
 | 
			
		||||
{
 | 
			
		||||
    if (!btdm_queue_table_mux || !queue) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool ret = false;
 | 
			
		||||
    btdm_queue_item_t *item;
 | 
			
		||||
    xSemaphoreTake(btdm_queue_table_mux, portMAX_DELAY);
 | 
			
		||||
    for (int i = 0; i < BTDM_MAX_QUEUE_NUM; ++i) {
 | 
			
		||||
        item = &btdm_queue_table[i];
 | 
			
		||||
        if (item->handle == queue->handle) {
 | 
			
		||||
            memcpy(queue, item, sizeof(btdm_queue_item_t));
 | 
			
		||||
            memset(item, 0, sizeof(btdm_queue_item_t));
 | 
			
		||||
            ret = true;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    xSemaphoreGive(btdm_queue_table_mux);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_SPIRAM_USE_MALLOC */
 | 
			
		||||
 | 
			
		||||
static void IRAM_ATTR interrupt_disable(void)
 | 
			
		||||
{
 | 
			
		||||
    if (xPortInIsrContext()) {
 | 
			
		||||
@@ -540,148 +477,74 @@ static void IRAM_ATTR task_yield_from_isr(void)
 | 
			
		||||
 | 
			
		||||
static void *semphr_create_wrapper(uint32_t max, uint32_t init)
 | 
			
		||||
{
 | 
			
		||||
    btdm_queue_item_t *semphr = heap_caps_calloc(1, sizeof(btdm_queue_item_t), MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL);
 | 
			
		||||
    assert(semphr);
 | 
			
		||||
 | 
			
		||||
#if !CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    return (void *)xSemaphoreCreateCounting(max, init);
 | 
			
		||||
    semphr->handle = (void *)xSemaphoreCreateCounting(max, init);
 | 
			
		||||
#else
 | 
			
		||||
    StaticQueue_t *queue_buffer = NULL;
 | 
			
		||||
    QueueHandle_t handle = NULL;
 | 
			
		||||
 | 
			
		||||
    queue_buffer = heap_caps_malloc(sizeof(StaticQueue_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    if (!queue_buffer) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    semphr->storage = heap_caps_malloc(sizeof(StaticQueue_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    assert(semphr->storage);
 | 
			
		||||
 | 
			
		||||
    handle = xSemaphoreCreateCountingStatic(max, init, queue_buffer);
 | 
			
		||||
    if (!handle) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    btdm_queue_item_t item = {
 | 
			
		||||
        .handle = handle,
 | 
			
		||||
        .storage = NULL,
 | 
			
		||||
        .buffer = queue_buffer,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (!btdm_queue_generic_register(&item)) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    return handle;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
    if (handle) {
 | 
			
		||||
        vSemaphoreDelete(handle);
 | 
			
		||||
    }
 | 
			
		||||
    if (queue_buffer) {
 | 
			
		||||
        free(queue_buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return NULL;
 | 
			
		||||
    semphr->handle = (void *)xSemaphoreCreateCountingStatic(max, init, semphr->storage);
 | 
			
		||||
#endif
 | 
			
		||||
    assert(semphr->handle);
 | 
			
		||||
    return semphr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void semphr_delete_wrapper(void *semphr)
 | 
			
		||||
{
 | 
			
		||||
#if !CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    vSemaphoreDelete(semphr);
 | 
			
		||||
#else
 | 
			
		||||
    btdm_queue_item_t item = {
 | 
			
		||||
        .handle = semphr,
 | 
			
		||||
        .storage = NULL,
 | 
			
		||||
        .buffer = NULL,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (btdm_queue_generic_deregister(&item)) {
 | 
			
		||||
        vSemaphoreDelete(item.handle);
 | 
			
		||||
        free(item.buffer);
 | 
			
		||||
    if (semphr == NULL) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
    btdm_queue_item_t *semphr_item = (btdm_queue_item_t *)semphr;
 | 
			
		||||
 | 
			
		||||
    if (semphr_item->handle) {
 | 
			
		||||
        vSemaphoreDelete(semphr_item->handle);
 | 
			
		||||
    }
 | 
			
		||||
#ifdef CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    if (semphr_item->storage) {
 | 
			
		||||
        free(semphr_item->storage);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    free(semphr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreTakeFromISR(semphr, hptw);
 | 
			
		||||
    return (int)xSemaphoreTakeFromISR(((btdm_queue_item_t *)semphr)->handle, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR semphr_give_from_isr_wrapper(void *semphr, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreGiveFromISR(semphr, hptw);
 | 
			
		||||
    return (int)xSemaphoreGiveFromISR(((btdm_queue_item_t *)semphr)->handle, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t semphr_take_wrapper(void *semphr, uint32_t block_time_ms)
 | 
			
		||||
{
 | 
			
		||||
    if (block_time_ms == OSI_FUNCS_TIME_BLOCKING) {
 | 
			
		||||
        return (int32_t)xSemaphoreTake(semphr, portMAX_DELAY);
 | 
			
		||||
        return (int)xSemaphoreTake(((btdm_queue_item_t *)semphr)->handle, portMAX_DELAY);
 | 
			
		||||
    } else {
 | 
			
		||||
        return (int32_t)xSemaphoreTake(semphr, block_time_ms / portTICK_PERIOD_MS);
 | 
			
		||||
        return (int)xSemaphoreTake(((btdm_queue_item_t *)semphr)->handle, block_time_ms / portTICK_PERIOD_MS);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t semphr_give_wrapper(void *semphr)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreGive(semphr);
 | 
			
		||||
    return (int)xSemaphoreGive(((btdm_queue_item_t *)semphr)->handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void *mutex_create_wrapper(void)
 | 
			
		||||
{
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    StaticQueue_t *queue_buffer = NULL;
 | 
			
		||||
    QueueHandle_t handle = NULL;
 | 
			
		||||
 | 
			
		||||
    queue_buffer = heap_caps_malloc(sizeof(StaticQueue_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    if (!queue_buffer) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handle = xSemaphoreCreateMutexStatic(queue_buffer);
 | 
			
		||||
    if (!handle) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    btdm_queue_item_t item = {
 | 
			
		||||
        .handle = handle,
 | 
			
		||||
        .storage = NULL,
 | 
			
		||||
        .buffer = queue_buffer,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (!btdm_queue_generic_register(&item)) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    return handle;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
    if (handle) {
 | 
			
		||||
        vSemaphoreDelete(handle);
 | 
			
		||||
    }
 | 
			
		||||
    if (queue_buffer) {
 | 
			
		||||
        free(queue_buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return NULL;
 | 
			
		||||
#else
 | 
			
		||||
    return (void *)xSemaphoreCreateMutex();
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void mutex_delete_wrapper(void *mutex)
 | 
			
		||||
{
 | 
			
		||||
#if !CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    vSemaphoreDelete(mutex);
 | 
			
		||||
#else
 | 
			
		||||
    btdm_queue_item_t item = {
 | 
			
		||||
        .handle = mutex,
 | 
			
		||||
        .storage = NULL,
 | 
			
		||||
        .buffer = NULL,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (btdm_queue_generic_deregister(&item)) {
 | 
			
		||||
        vSemaphoreDelete(item.handle);
 | 
			
		||||
        free(item.buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t mutex_lock_wrapper(void *mutex)
 | 
			
		||||
@@ -696,102 +559,71 @@ static int32_t mutex_unlock_wrapper(void *mutex)
 | 
			
		||||
 | 
			
		||||
static void *queue_create_wrapper(uint32_t queue_len, uint32_t item_size)
 | 
			
		||||
{
 | 
			
		||||
    btdm_queue_item_t *queue = NULL;
 | 
			
		||||
 | 
			
		||||
    queue = (btdm_queue_item_t*)heap_caps_malloc(sizeof(btdm_queue_item_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    assert(queue);
 | 
			
		||||
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    StaticQueue_t *queue_buffer = NULL;
 | 
			
		||||
    uint8_t *queue_storage = NULL;
 | 
			
		||||
    QueueHandle_t handle = NULL;
 | 
			
		||||
 | 
			
		||||
    queue_buffer = heap_caps_malloc(sizeof(StaticQueue_t), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    if (!queue_buffer) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    queue->storage = heap_caps_calloc(1, sizeof(StaticQueue_t) + (queue_len*item_size), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    assert(queue->storage);
 | 
			
		||||
 | 
			
		||||
    queue_storage = heap_caps_malloc((queue_len*item_size), MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT);
 | 
			
		||||
    if (!queue_storage ) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    queue->handle = xQueueCreateStatic( queue_len, item_size, ((uint8_t*)(queue->storage)) + sizeof(StaticQueue_t), (StaticQueue_t*)(queue->storage));
 | 
			
		||||
    assert(queue->handle);
 | 
			
		||||
 | 
			
		||||
    handle = xQueueCreateStatic(queue_len, item_size, queue_storage, queue_buffer);
 | 
			
		||||
    if (!handle) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    btdm_queue_item_t item = {
 | 
			
		||||
        .handle = handle,
 | 
			
		||||
        .storage = queue_storage,
 | 
			
		||||
        .buffer = queue_buffer,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (!btdm_queue_generic_register(&item)) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return handle;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
    if (handle) {
 | 
			
		||||
        vQueueDelete(handle);
 | 
			
		||||
    }
 | 
			
		||||
    if (queue_storage) {
 | 
			
		||||
        free(queue_storage);
 | 
			
		||||
    }
 | 
			
		||||
    if (queue_buffer) {
 | 
			
		||||
        free(queue_buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return NULL;
 | 
			
		||||
#else
 | 
			
		||||
    return (void *)xQueueCreate(queue_len, item_size);
 | 
			
		||||
    queue->handle = xQueueCreate( queue_len, item_size);
 | 
			
		||||
    assert(queue->handle);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return queue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void queue_delete_wrapper(void *queue)
 | 
			
		||||
{
 | 
			
		||||
#if !CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    vQueueDelete(queue);
 | 
			
		||||
#else
 | 
			
		||||
    btdm_queue_item_t item = {
 | 
			
		||||
        .handle = queue,
 | 
			
		||||
        .storage = NULL,
 | 
			
		||||
        .buffer = NULL,
 | 
			
		||||
    };
 | 
			
		||||
    btdm_queue_item_t *queue_item = (btdm_queue_item_t *)queue;
 | 
			
		||||
    if (queue_item) {
 | 
			
		||||
        if(queue_item->handle){
 | 
			
		||||
            vQueueDelete(queue_item->handle);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    if (btdm_queue_generic_deregister(&item)) {
 | 
			
		||||
        vQueueDelete(item.handle);
 | 
			
		||||
        free(item.storage);
 | 
			
		||||
        free(item.buffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
        if (queue_item->storage) {
 | 
			
		||||
            free(queue_item->storage);
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        free(queue_item);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t queue_send_wrapper(void *queue, void *item, uint32_t block_time_ms)
 | 
			
		||||
{
 | 
			
		||||
    if (block_time_ms == OSI_FUNCS_TIME_BLOCKING) {
 | 
			
		||||
        return (int32_t)xQueueSend(queue, item, portMAX_DELAY);
 | 
			
		||||
        return (int32_t)xQueueSend(((btdm_queue_item_t*)queue)->handle, item, portMAX_DELAY);
 | 
			
		||||
    } else {
 | 
			
		||||
        return (int32_t)xQueueSend(queue, item, block_time_ms / portTICK_PERIOD_MS);
 | 
			
		||||
        return (int32_t)xQueueSend(((btdm_queue_item_t*)queue)->handle, item, block_time_ms / portTICK_PERIOD_MS);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR queue_send_from_isr_wrapper(void *queue, void *item, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xQueueSendFromISR(queue, item, hptw);
 | 
			
		||||
    return (int32_t)xQueueSendFromISR(((btdm_queue_item_t*)queue)->handle, item, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t queue_recv_wrapper(void *queue, void *item, uint32_t block_time_ms)
 | 
			
		||||
{
 | 
			
		||||
    if (block_time_ms == OSI_FUNCS_TIME_BLOCKING) {
 | 
			
		||||
        return (int32_t)xQueueReceive(queue, item, portMAX_DELAY);
 | 
			
		||||
        return (int32_t)xQueueReceive(((btdm_queue_item_t*)queue)->handle, item, portMAX_DELAY);
 | 
			
		||||
    } else {
 | 
			
		||||
        return (int32_t)xQueueReceive(queue, item, block_time_ms / portTICK_PERIOD_MS);
 | 
			
		||||
        return (int32_t)xQueueReceive(((btdm_queue_item_t*)queue)->handle, item, block_time_ms / portTICK_PERIOD_MS);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR queue_recv_from_isr_wrapper(void *queue, void *item, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xQueueReceiveFromISR(queue, item, hptw);
 | 
			
		||||
    return (int32_t)xQueueReceiveFromISR(((btdm_queue_item_t*)queue)->handle, item, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t task_create_wrapper(void *task_func, const char *name, uint32_t stack_depth, void *param, uint32_t prio, void *task_handle, uint32_t core_id)
 | 
			
		||||
@@ -1383,14 +1215,6 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg)
 | 
			
		||||
 | 
			
		||||
    ESP_LOGI(BTDM_LOG_TAG, "BT controller compile version [%s]", btdm_controller_get_compile_version());
 | 
			
		||||
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    btdm_queue_table_mux = xSemaphoreCreateMutex();
 | 
			
		||||
    if (btdm_queue_table_mux == NULL) {
 | 
			
		||||
        return ESP_ERR_NO_MEM;
 | 
			
		||||
    }
 | 
			
		||||
    memset(btdm_queue_table, 0, sizeof(btdm_queue_item_t) * BTDM_MAX_QUEUE_NUM);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    s_wakeup_req_sem = semphr_create_wrapper(1, 0);
 | 
			
		||||
    if (s_wakeup_req_sem == NULL) {
 | 
			
		||||
        err = ESP_ERR_NO_MEM;
 | 
			
		||||
@@ -1546,12 +1370,6 @@ esp_err_t esp_bt_controller_deinit(void)
 | 
			
		||||
    semphr_delete_wrapper(s_wakeup_req_sem);
 | 
			
		||||
    s_wakeup_req_sem = NULL;
 | 
			
		||||
 | 
			
		||||
#if CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    vSemaphoreDelete(btdm_queue_table_mux);
 | 
			
		||||
    btdm_queue_table_mux = NULL;
 | 
			
		||||
    memset(btdm_queue_table, 0, sizeof(btdm_queue_item_t) * BTDM_MAX_QUEUE_NUM);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    free(osi_funcs_p);
 | 
			
		||||
    osi_funcs_p = NULL;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -288,16 +288,6 @@ static void * wifi_thread_semphr_get_wrapper(void)
 | 
			
		||||
    return (void*)sem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreTakeFromISR(semphr, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR semphr_give_from_isr_wrapper(void *semphr, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreGiveFromISR(semphr, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t semphr_take_wrapper(void *semphr, uint32_t block_time_tick)
 | 
			
		||||
{
 | 
			
		||||
    if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) {
 | 
			
		||||
@@ -312,6 +302,82 @@ static int32_t semphr_give_wrapper(void *semphr)
 | 
			
		||||
    return (int32_t)xSemaphoreGive(semphr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void *internal_semphr_create_wrapper(uint32_t max, uint32_t init)
 | 
			
		||||
{
 | 
			
		||||
    wifi_static_queue_t *semphr = heap_caps_calloc(1, sizeof(wifi_static_queue_t), MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL);
 | 
			
		||||
    if (!semphr) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
    semphr->storage = heap_caps_calloc(1, sizeof(StaticSemaphore_t), MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL);
 | 
			
		||||
    if (!semphr->storage) {
 | 
			
		||||
        goto _error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    semphr->handle = xSemaphoreCreateCountingStatic(max, init, semphr->storage);
 | 
			
		||||
    if (!semphr->handle) {
 | 
			
		||||
        goto _error;
 | 
			
		||||
    }
 | 
			
		||||
    return (void *)semphr;
 | 
			
		||||
 | 
			
		||||
_error:
 | 
			
		||||
    if (semphr) {
 | 
			
		||||
        if (semphr->storage) {
 | 
			
		||||
            free(semphr->storage);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        free(semphr);
 | 
			
		||||
    }
 | 
			
		||||
    return NULL;
 | 
			
		||||
#else
 | 
			
		||||
    semphr->handle = xSemaphoreCreateCounting(max, init);
 | 
			
		||||
    return (void *)semphr;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void internal_semphr_delete_wrapper(void *semphr)
 | 
			
		||||
{
 | 
			
		||||
    wifi_static_queue_t *semphr_item = (wifi_static_queue_t *)semphr;
 | 
			
		||||
    if (semphr_item) {
 | 
			
		||||
        if (semphr_item->handle) {
 | 
			
		||||
            vSemaphoreDelete(semphr_item->handle);
 | 
			
		||||
        }
 | 
			
		||||
#ifdef CONFIG_SPIRAM_USE_MALLOC
 | 
			
		||||
        if (semphr_item->storage) {
 | 
			
		||||
            free(semphr_item->storage);
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
        free(semphr_item);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR internal_semphr_take_from_isr_wrapper(void *semphr, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreTakeFromISR(((wifi_static_queue_t *)semphr)->handle, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t IRAM_ATTR internal_semphr_give_from_isr_wrapper(void *semphr, void *hptw)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreGiveFromISR(((wifi_static_queue_t *)semphr)->handle, hptw);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t internal_semphr_take_wrapper(void *semphr, uint32_t block_time_tick)
 | 
			
		||||
{
 | 
			
		||||
    if (block_time_tick == OSI_FUNCS_TIME_BLOCKING) {
 | 
			
		||||
        return (int32_t)xSemaphoreTake(((wifi_static_queue_t *)semphr)->handle, portMAX_DELAY);
 | 
			
		||||
    } else {
 | 
			
		||||
        return (int32_t)xSemaphoreTake(((wifi_static_queue_t *)semphr)->handle, block_time_tick);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int32_t internal_semphr_give_wrapper(void *semphr)
 | 
			
		||||
{
 | 
			
		||||
    return (int32_t)xSemaphoreGive(((wifi_static_queue_t *)semphr)->handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void * recursive_mutex_create_wrapper(void)
 | 
			
		||||
{
 | 
			
		||||
    return (void *)xSemaphoreCreateRecursiveMutex();
 | 
			
		||||
@@ -788,12 +854,12 @@ coex_adapter_funcs_t g_coex_adapter_funcs = {
 | 
			
		||||
    ._int_disable = wifi_int_disable_wrapper,
 | 
			
		||||
    ._int_enable = wifi_int_restore_wrapper,
 | 
			
		||||
    ._task_yield_from_isr = task_yield_from_isr_wrapper,
 | 
			
		||||
    ._semphr_create = semphr_create_wrapper,
 | 
			
		||||
    ._semphr_delete = semphr_delete_wrapper,
 | 
			
		||||
    ._semphr_take_from_isr = semphr_take_from_isr_wrapper,
 | 
			
		||||
    ._semphr_give_from_isr = semphr_give_from_isr_wrapper,
 | 
			
		||||
    ._semphr_take = semphr_take_wrapper,
 | 
			
		||||
    ._semphr_give = semphr_give_wrapper,
 | 
			
		||||
    ._semphr_create = internal_semphr_create_wrapper,
 | 
			
		||||
    ._semphr_delete = internal_semphr_delete_wrapper,
 | 
			
		||||
    ._semphr_take_from_isr = internal_semphr_take_from_isr_wrapper,
 | 
			
		||||
    ._semphr_give_from_isr = internal_semphr_give_from_isr_wrapper,
 | 
			
		||||
    ._semphr_take = internal_semphr_take_wrapper,
 | 
			
		||||
    ._semphr_give = internal_semphr_give_wrapper,
 | 
			
		||||
    ._is_in_isr = coex_is_in_isr_wrapper,
 | 
			
		||||
    ._malloc_internal =  malloc_internal_wrapper,
 | 
			
		||||
    ._free = free,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user