From c01fb28dfb5ce2c707ef193d4f23a88eb5379450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20P=C3=B6tzi?= Date: Thu, 21 Nov 2024 13:24:40 +0100 Subject: [PATCH] add function to start spi transaction from isr --- .../include/driver/spi_master.h | 3 +++ .../esp_driver_spi/src/gpspi/spi_master.c | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/components/esp_driver_spi/include/driver/spi_master.h b/components/esp_driver_spi/include/driver/spi_master.h index a432e62334..00f0ad1729 100644 --- a/components/esp_driver_spi/include/driver/spi_master.h +++ b/components/esp_driver_spi/include/driver/spi_master.h @@ -407,6 +407,9 @@ int spi_get_freq_limit(bool gpio_is_used, int input_delay_ns); */ esp_err_t spi_bus_get_max_transaction_len(spi_host_device_t host_id, size_t *max_bytes); +intr_handle_t spi_bus_get_intr(spi_host_device_t host); +void spi_dma_reset_start(spi_device_handle_t handle); + #ifdef __cplusplus } #endif diff --git a/components/esp_driver_spi/src/gpspi/spi_master.c b/components/esp_driver_spi/src/gpspi/spi_master.c index daf953fb92..21d4ba5d60 100644 --- a/components/esp_driver_spi/src/gpspi/spi_master.c +++ b/components/esp_driver_spi/src/gpspi/spi_master.c @@ -721,6 +721,22 @@ static void SPI_MASTER_ISR_ATTR spi_bus_intr_disable(void *host) #define spi_dma_start(chan, addr) gdma_start(chan, (intptr_t)(addr)) #endif +void SPI_MASTER_ISR_ATTR spi_dma_reset_start(spi_device_handle_t handle){ + spi_host_t *host = handle->host; + spi_hal_context_t *hal = &(host->hal); + + const spi_dma_ctx_t *dma_ctx = host->dma_ctx; + + spi_dma_reset(dma_ctx->rx_dma_chan); + spi_hal_hw_prepare_rx(hal->hw); + spi_dma_start(dma_ctx->rx_dma_chan, dma_ctx->dmadesc_rx); + + + spi_dma_reset(dma_ctx->tx_dma_chan); + spi_hal_hw_prepare_tx(hal->hw); + spi_dma_start(dma_ctx->tx_dma_chan, dma_ctx->dmadesc_tx); +} + static void SPI_MASTER_ISR_ATTR s_spi_dma_prepare_data(spi_host_t *host, spi_hal_context_t *hal, const spi_hal_dev_config_t *dev, const spi_hal_trans_config_t *trans) { const spi_dma_ctx_t *dma_ctx = host->dma_ctx; @@ -1510,6 +1526,10 @@ esp_err_t spi_bus_get_max_transaction_len(spi_host_device_t host_id, size_t *max return ESP_OK; } +intr_handle_t spi_bus_get_intr(spi_host_device_t host) { + return bus_driver_ctx[host]->intr; +} + #if SOC_SPI_SCT_SUPPORTED /*-----------------------------------------------------------