From e08bbd311f0e875499c88ff5ced9849ac1077cca Mon Sep 17 00:00:00 2001 From: wanlei Date: Mon, 28 Nov 2022 10:22:25 +0800 Subject: [PATCH] spi_slave: fix slave can't use iomux bus mixed with gpio cs_pin --- components/driver/spi_slave.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/components/driver/spi_slave.c b/components/driver/spi_slave.c index 05f64b2369..4e4cbc2f12 100644 --- a/components/driver/spi_slave.c +++ b/components/driver/spi_slave.c @@ -64,6 +64,7 @@ typedef struct { QueueHandle_t trans_queue; QueueHandle_t ret_queue; int dma_chan; + bool cs_iomux; #ifdef CONFIG_PM_ENABLE esp_pm_lock_handle_t pm_lock; #endif @@ -97,7 +98,7 @@ static void SPI_SLAVE_ISR_ATTR freeze_cs(spi_slave_t *host) // This is used in test by internal gpio matrix connections static inline void SPI_SLAVE_ISR_ATTR restore_cs(spi_slave_t *host) { - if (bus_is_iomux(host)) { + if (host->cs_iomux) { gpio_iomux_in(host->cfg.spics_io_num, spi_periph_signal[host->id].spics_in); } else { gpio_matrix_in(host->cfg.spics_io_num, spi_periph_signal[host->id].spics_in, false); @@ -147,7 +148,12 @@ esp_err_t spi_slave_initialize(spi_host_device_t host, const spi_bus_config_t *b ret = err; goto cleanup; } - spicommon_cs_initialize(host, slave_config->spics_io_num, 0, !bus_is_iomux(spihost[host])); + if (slave_config->spics_io_num >= 0) { + spicommon_cs_initialize(host, slave_config->spics_io_num, 0, !bus_is_iomux(spihost[host])); + // check and save where cs line really route through + spihost[host]->cs_iomux = (slave_config->spics_io_num == spi_periph_signal[host].spics0_iomux_pin) && bus_is_iomux(spihost[host]); + } + // The slave DMA suffers from unexpected transactions. Forbid reading if DMA is enabled by disabling the CS line. if (use_dma) freeze_cs(spihost[host]); @@ -404,4 +410,3 @@ static void SPI_SLAVE_ISR_ATTR spi_intr(void *arg) } if (do_yield) portYIELD_FROM_ISR(); } -