spi: added an API to get max transaction length and use in spi lcd driver

This commit is contained in:
Armando
2023-04-24 14:21:13 +08:00
parent ea10aac4f0
commit 0e72940001
3 changed files with 36 additions and 4 deletions

View File

@@ -111,6 +111,7 @@ We have two bits to control the interrupt:
*/
#include <string.h>
#include <sys/param.h>
#include "esp_private/spi_common_internal.h"
#include "driver/spi_master.h"
#include "esp_clk_tree.h"
@@ -126,7 +127,6 @@ We have two bits to control the interrupt:
#include "hal/spi_ll.h"
#include "esp_heap_caps.h"
typedef struct spi_device_t spi_device_t;
/// struct to hold private transaction data (like tx and rx buffer for DMA).
@@ -1111,3 +1111,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;
}

View File

@@ -391,6 +391,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