335027b731
Previously, as DMA descriptors were processed, the task performing SDMMC transfer would get woken up and would refill the descriptors. This design didn't work correctly when higher priority tasks occupied the CPU for too long, resulting in SDMMC transfer timing out. This change moves DMA descriptor refilling into SDMMC ISR. Now the "DMA done" interrupt is delivered back to task context only when the entire transfer is completed. Closes https://github.com/espressif/esp-idf/issues/13934
44 lines
1.2 KiB
C
44 lines
1.2 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include "esp_err.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/queue.h"
|
|
#include "soc/sdmmc_periph.h"
|
|
|
|
typedef struct {
|
|
uint32_t sdmmc_status; ///< masked SDMMC interrupt status
|
|
uint32_t dma_status; ///< masked DMA interrupt status
|
|
} sdmmc_event_t;
|
|
|
|
#define SDMMC_HOST_CLOCK_UPDATE_CMD_TIMEOUT_US 1000 * 1000
|
|
#define SDMMC_HOST_START_CMD_TIMEOUT_US 1000 * 1000
|
|
#define SDMMC_HOST_RESET_TIMEOUT_US 5000 * 1000
|
|
|
|
esp_err_t sdmmc_host_reset(void);
|
|
|
|
esp_err_t sdmmc_host_start_command(int slot, sdmmc_hw_cmd_t cmd, uint32_t arg);
|
|
|
|
esp_err_t sdmmc_host_wait_for_event(int tick_count, sdmmc_event_t* out_event);
|
|
|
|
void sdmmc_host_dma_prepare(void* data_ptr, size_t data_size, size_t block_size);
|
|
|
|
void sdmmc_host_dma_stop(void);
|
|
|
|
void sdmmc_host_dma_resume(void);
|
|
|
|
bool sdmmc_host_card_busy(void);
|
|
|
|
void sdmmc_host_enable_clk_cmd11(int slot, bool enable);
|
|
|
|
esp_err_t sdmmc_host_transaction_handler_init(void);
|
|
|
|
void sdmmc_host_transaction_handler_deinit(void);
|