diff --git a/components/driver/include/driver/spi_master.h b/components/driver/include/driver/spi_master.h index eaf391c821..03de6c0eb7 100644 --- a/components/driver/include/driver/spi_master.h +++ b/components/driver/include/driver/spi_master.h @@ -384,6 +384,18 @@ void spi_get_timing(bool gpio_is_used, int input_delay_ns, int eff_clk, int *dum */ int spi_get_freq_limit(bool gpio_is_used, int input_delay_ns); +/** + * @brief Get max length (in bytes) of one transaction + * + * @param host_id SPI peripheral + * @param[out] max_bytes Max length of one transaction, in bytes + * + * @return + * - ESP_OK: On success + * - ESP_ERR_INVALID_ARG: Invalid argument + */ +esp_err_t spi_bus_get_max_transaction_len(spi_host_device_t host_id, size_t *max_bytes); + #ifdef __cplusplus } #endif diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index dda480f373..e1fbbef2c1 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -111,6 +111,7 @@ We have two bits to control the interrupt: */ #include +#include #include "driver/spi_common_internal.h" #include "driver/spi_master.h" @@ -1022,3 +1023,20 @@ esp_err_t SPI_MASTER_ISR_ATTR spi_device_polling_transmit(spi_device_handle_t ha return spi_device_polling_end(handle, portMAX_DELAY); } + +esp_err_t spi_bus_get_max_transaction_len(spi_host_device_t host_id, size_t *max_bytes) +{ + SPI_CHECK(is_valid_host(host_id), "invalid host", ESP_ERR_INVALID_ARG); + if (bus_driver_ctx[host_id] == NULL || max_bytes == NULL) { + return ESP_ERR_INVALID_ARG; + } + + spi_host_t *host = bus_driver_ctx[host_id]; + if (host->bus_attr->dma_enabled) { + *max_bytes = MIN(host->bus_attr->max_transfer_sz, (SPI_LL_DMA_MAX_BIT_LEN / 8)); + } else { + *max_bytes = MIN(host->bus_attr->max_transfer_sz, (SPI_LL_CPU_MAX_BIT_LEN / 8)); + } + + return ESP_OK; +} diff --git a/components/esp_lcd/src/esp_lcd_panel_io_spi.c b/components/esp_lcd/src/esp_lcd_panel_io_spi.c index b21eea0a58..1dbbb169c4 100644 --- a/components/esp_lcd/src/esp_lcd_panel_io_spi.c +++ b/components/esp_lcd/src/esp_lcd_panel_io_spi.c @@ -102,9 +102,13 @@ esp_err_t esp_lcd_new_panel_io_spi(esp_lcd_spi_bus_handle_t bus, const esp_lcd_p spi_panel_io->base.tx_color = panel_io_spi_tx_color; spi_panel_io->base.del = panel_io_spi_del; spi_panel_io->base.register_event_callbacks = panel_io_spi_register_event_callbacks; - spi_panel_io->spi_trans_max_bytes = spi_bus_get_attr((spi_host_device_t)bus)->max_transfer_sz; + + size_t max_trans_bytes = 0; + ESP_GOTO_ON_ERROR(spi_bus_get_max_transaction_len((spi_host_device_t)bus, &max_trans_bytes), err, TAG, "get spi max transaction len failed"); + spi_panel_io->spi_trans_max_bytes = max_trans_bytes; + *ret_io = &(spi_panel_io->base); - ESP_LOGD(TAG, "new spi lcd panel io @%p", spi_panel_io); + ESP_LOGD(TAG, "new spi lcd panel io @%p, max_trans_bytes: %d", spi_panel_io, (int)max_trans_bytes); return ESP_OK;