mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
Merge branch 'feat/spi_slave_edma_psram_support_v6.0' into 'release/v6.0'
fix(driver_spi): added slave/slave_hd edma support, and add master bit length check, internal mem length check (v6.0) See merge request espressif/esp-idf!46349
This commit is contained in:
@@ -185,6 +185,7 @@ esp_err_t spi_slave_queue_trans(spi_host_device_t host, const spi_slave_transact
|
||||
* @return
|
||||
* - ESP_ERR_INVALID_ARG if parameter is invalid
|
||||
* - ESP_ERR_NOT_SUPPORTED if flag `SPI_SLAVE_NO_RETURN_RESULT` is set
|
||||
* - ESP_ERR_INVALID_STATE if dma over/underflow error occurs during psram transfer
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t spi_slave_get_trans_result(spi_host_device_t host, spi_slave_transaction_t **trans_desc, uint32_t ticks_to_wait);
|
||||
@@ -204,6 +205,7 @@ esp_err_t spi_slave_get_trans_result(spi_host_device_t host, spi_slave_transacti
|
||||
* out.
|
||||
* @return
|
||||
* - ESP_ERR_INVALID_ARG if parameter is invalid
|
||||
* - ESP_ERR_INVALID_STATE if dma over/underflow error occurs during psram transfer
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t spi_slave_transmit(spi_host_device_t host, spi_slave_transaction_t *trans_desc, uint32_t ticks_to_wait);
|
||||
|
||||
@@ -166,7 +166,7 @@ esp_err_t spi_slave_hd_queue_trans(spi_host_device_t host_id, spi_slave_chan_t c
|
||||
* - ESP_OK: on success
|
||||
* - ESP_ERR_INVALID_ARG: Function is not valid
|
||||
* - ESP_ERR_TIMEOUT: There's no transaction done before timeout
|
||||
* - ESP_ERR_INVALID_STATE: Function called in invalid state. This API should be called under segment mode.
|
||||
* - ESP_ERR_INVALID_STATE: Function called in invalid state. This API should be called under segment mode. Or DMA hardware over/underflow occurred.
|
||||
*/
|
||||
esp_err_t spi_slave_hd_get_trans_res(spi_host_device_t host_id, spi_slave_chan_t chan, spi_slave_hd_data_t **out_trans, uint32_t timeout);
|
||||
|
||||
@@ -223,7 +223,7 @@ esp_err_t spi_slave_hd_append_trans(spi_host_device_t host_id, spi_slave_chan_t
|
||||
* - ESP_OK: on success
|
||||
* - ESP_ERR_INVALID_ARG: Function is not valid
|
||||
* - ESP_ERR_TIMEOUT: There's no transaction done before timeout
|
||||
* - ESP_ERR_INVALID_STATE: Function called in invalid state. This API should be called under append mode.
|
||||
* - ESP_ERR_INVALID_STATE: Function called in invalid state. This API should be called under append mode. Or DMA hardware over/underflow occurred.
|
||||
*/
|
||||
esp_err_t spi_slave_hd_get_append_trans_res(spi_host_device_t host_id, spi_slave_chan_t chan, spi_slave_hd_data_t **out_trans, uint32_t timeout);
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ typedef enum {
|
||||
/// Attributes of an SPI bus
|
||||
typedef struct {
|
||||
spi_bus_config_t bus_cfg; ///< Config used to initialize the bus
|
||||
uint64_t gpio_reserve; ///< reserved output gpio bit mask
|
||||
uint64_t gpio_reserve; ///< reserved gpio matrix output pins and all iomux pins bit mask
|
||||
uint32_t flags; ///< Flags (SPICOMMON_BUSFLAG_* flag combination of bus abilities) of the bus
|
||||
int max_transfer_sz; ///< Maximum length of bytes available to send
|
||||
bool dma_enabled; ///< To enable DMA or not
|
||||
@@ -104,19 +104,18 @@ esp_err_t spicommon_bus_free(spi_host_device_t host_id);
|
||||
*
|
||||
* @param host_id SPI host ID
|
||||
* @param dma_chan DMA channel to be used
|
||||
* @param out_dma_ctx Actual DMA channel context (if you choose to assign a specific DMA channel, this will be the channel you assigned before)
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: On success
|
||||
* - ESP_ERR_NO_MEM: No enough memory
|
||||
* - ESP_ERR_NOT_FOUND: There is no available DMA channel
|
||||
*/
|
||||
esp_err_t spicommon_dma_chan_alloc(spi_host_device_t host_id, spi_dma_chan_t dma_chan, spi_dma_ctx_t **out_dma_ctx);
|
||||
esp_err_t spicommon_dma_chan_alloc(spi_host_device_t host_id, spi_dma_chan_t dma_chan);
|
||||
|
||||
/**
|
||||
* @brief Alloc DMA descriptors for SPI
|
||||
*
|
||||
* @param dma_ctx DMA context returned by `spicommon_dma_chan_alloc`
|
||||
* @param[in] host_id SPI host ID
|
||||
* @param[in] cfg_max_sz Expected maximum transfer size, in bytes.
|
||||
* @param[out] actual_max_sz Actual max transfer size one transaction can be, in bytes.
|
||||
*
|
||||
@@ -124,7 +123,7 @@ esp_err_t spicommon_dma_chan_alloc(spi_host_device_t host_id, spi_dma_chan_t dma
|
||||
* - ESP_OK: On success
|
||||
* - ESP_ERR_NO_MEM: No enough memory
|
||||
*/
|
||||
esp_err_t spicommon_dma_desc_alloc(spi_dma_ctx_t *dma_ctx, int cfg_max_sz, int *actual_max_sz);
|
||||
esp_err_t spicommon_dma_desc_alloc(spi_host_device_t host_id, int cfg_max_sz, int *actual_max_sz);
|
||||
|
||||
/**
|
||||
* Setupt/Configure dma descriptor link list
|
||||
@@ -136,15 +135,40 @@ esp_err_t spicommon_dma_desc_alloc(spi_dma_ctx_t *dma_ctx, int cfg_max_sz, int *
|
||||
*/
|
||||
void spicommon_dma_desc_setup_link(spi_dma_desc_t *dmadesc, const void *data, int len, bool is_rx);
|
||||
|
||||
/**
|
||||
* @brief Setup private buffer for DMA transfer
|
||||
*
|
||||
* @param host_id SPI host ID to access the DMA context
|
||||
* @param buffer buffer to be setup
|
||||
* @param len length of buffer, in byte
|
||||
* @param is_tx if buffer is for tx/transmit direction
|
||||
* @param psram_prefer if psram is preferred
|
||||
* @param auto_malloc if auto malloc is enabled
|
||||
* @param ret_buffer return buffer, which is the buffer that is actually used for DMA transfer
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: On success
|
||||
* - ESP_ERR_NO_MEM: No enough memory
|
||||
*/
|
||||
esp_err_t spicommon_dma_setup_priv_buffer(spi_host_device_t host_id, uint32_t *buffer, uint32_t len, bool is_tx, bool psram_prefer, bool auto_malloc, uint32_t **ret_buffer);
|
||||
|
||||
/**
|
||||
* @brief Memory barrier for DMA RX buffer
|
||||
*
|
||||
* @param host_id SPI host ID
|
||||
* @param rx_buffer RX buffer
|
||||
*/
|
||||
void spicommon_dma_rx_mb(spi_host_device_t host_id, void *rx_buffer);
|
||||
|
||||
/**
|
||||
* @brief Free DMA for SPI
|
||||
*
|
||||
* @param dma_ctx spi_dma_ctx_t struct pointer
|
||||
* @param host_id SPI host ID
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: On success
|
||||
*/
|
||||
esp_err_t spicommon_dma_chan_free(spi_dma_ctx_t *dma_ctx);
|
||||
esp_err_t spicommon_dma_chan_free(spi_host_device_t host_id);
|
||||
|
||||
/**
|
||||
* @brief Connect a SPI peripheral to GPIO pins
|
||||
@@ -180,19 +204,18 @@ esp_err_t spicommon_dma_chan_free(spi_dma_ctx_t *dma_ctx);
|
||||
* - ESP_ERR_INVALID_ARG if parameter is invalid
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_config_t *bus_config, uint32_t flags, uint32_t *flags_o, uint64_t *io_reserved);
|
||||
esp_err_t spicommon_bus_initialize_io(spi_host_device_t host, const spi_bus_config_t *bus_config, uint32_t flags, uint32_t *flags_o);
|
||||
|
||||
/**
|
||||
* @brief Free the IO used by a SPI peripheral
|
||||
*
|
||||
* @param bus_cfg Bus config struct which defines which pins to be used.
|
||||
* @param io_reserved Bitmap indicate which pin is reserved
|
||||
* @param host SPI peripheral
|
||||
*
|
||||
* @return
|
||||
* - ESP_ERR_INVALID_ARG if parameter is invalid
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t spicommon_bus_free_io_cfg(const spi_bus_config_t *bus_cfg, uint64_t *io_reserved);
|
||||
esp_err_t spicommon_bus_free_io_cfg(spi_host_device_t host);
|
||||
|
||||
/**
|
||||
* @brief Initialize a Chip Select pin for a specific SPI peripheral
|
||||
@@ -293,7 +316,7 @@ void spicommon_dmaworkaround_transfer_active(int dmachan);
|
||||
* @param host_id The specified host to get attribute
|
||||
* @return (Const) Pointer to the attributes
|
||||
*/
|
||||
const spi_bus_attr_t* spi_bus_get_attr(spi_host_device_t host_id);
|
||||
spi_bus_attr_t* spi_bus_get_attr(spi_host_device_t host_id);
|
||||
|
||||
/**
|
||||
* @brief Get the dma context of a specified SPI bus.
|
||||
@@ -301,7 +324,7 @@ const spi_bus_attr_t* spi_bus_get_attr(spi_host_device_t host_id);
|
||||
* @param host_id The specified host to get attribute
|
||||
* @return (Const) Pointer to the dma context
|
||||
*/
|
||||
const spi_dma_ctx_t* spi_bus_get_dma_ctx(spi_host_device_t host_id);
|
||||
spi_dma_ctx_t* spi_bus_get_dma_ctx(spi_host_device_t host_id);
|
||||
|
||||
/**
|
||||
* @brief Register a function to a initialized bus to make it called when deinitializing the bus.
|
||||
|
||||
Reference in New Issue
Block a user