@@ -67,20 +67,21 @@ static int IRAM_ATTR spi_esp32_transfer(const struct device *dev)
6767 spi_hal_context_t * hal = & data -> hal ;
6868 spi_hal_dev_config_t * hal_dev = & data -> dev_config ;
6969 spi_hal_trans_config_t * hal_trans = & data -> trans_config ;
70- size_t chunk_len = spi_context_max_continuous_chunk (& data -> ctx );
70+ size_t chunk_len_bytes = spi_context_max_continuous_chunk (& data -> ctx ) * data -> dfs ;
7171 size_t max_buf_sz =
7272 cfg -> dma_enabled ? SPI_DMA_MAX_BUFFER_SIZE : SOC_SPI_MAXIMUM_BUFFER_SIZE ;
73- size_t transfer_len = data -> word_size ? data -> dfs : MIN (chunk_len , max_buf_sz );
74- size_t bit_len = transfer_len << 3 ;
73+ size_t transfer_len_bytes = MIN (chunk_len_bytes , max_buf_sz );
74+ size_t bit_len = transfer_len_bytes << 3 ;
7575 uint8_t * rx_temp = NULL ;
7676 uint8_t * tx_temp = NULL ;
77- uint8_t dma_len_tx = data -> word_size ? data -> dfs : ctx -> tx_len ;
78- uint8_t dma_len_rx = data -> word_size ? data -> dfs : ctx -> rx_len ;
77+ uint8_t dma_len_tx = MIN ( ctx -> tx_len * data -> dfs , SPI_DMA_MAX_BUFFER_SIZE ) ;
78+ uint8_t dma_len_rx = MIN ( ctx -> rx_len * data -> dfs , SPI_DMA_MAX_BUFFER_SIZE ) ;
7979
8080 if (cfg -> dma_enabled ) {
8181 /* bit_len needs to be at least one byte long when using DMA */
8282 bit_len = !bit_len ? 8 : bit_len ;
8383 if (ctx -> tx_buf && !esp_ptr_dma_capable ((uint32_t * )& ctx -> tx_buf [0 ])) {
84+ LOG_DBG ("Tx buffer not DMA capable" );
8485 tx_temp = k_malloc (dma_len_tx );
8586 if (!tx_temp ) {
8687 LOG_ERR ("Error allocating temp buffer Tx" );
@@ -94,6 +95,7 @@ static int IRAM_ATTR spi_esp32_transfer(const struct device *dev)
9495 * multiples of 32 bits to avoid heap
9596 * corruption.
9697 */
98+ LOG_DBG ("Rx buffer not DMA capable" );
9799 rx_temp = k_calloc (((dma_len_rx << 3 ) + 31 ) / 8 , sizeof (uint8_t ));
98100 if (!rx_temp ) {
99101 LOG_ERR ("Error allocating temp buffer Rx" );
@@ -120,7 +122,7 @@ static int IRAM_ATTR spi_esp32_transfer(const struct device *dev)
120122
121123 /* send data */
122124 spi_hal_user_start (hal );
123- spi_context_update_tx (& data -> ctx , data -> dfs , transfer_len /data -> dfs );
125+ spi_context_update_tx (& data -> ctx , data -> dfs , transfer_len_bytes /data -> dfs );
124126
125127 while (!spi_hal_usr_is_done (hal )) {
126128 /* nop */
@@ -130,10 +132,10 @@ static int IRAM_ATTR spi_esp32_transfer(const struct device *dev)
130132 spi_hal_fetch_result (hal );
131133
132134 if (rx_temp ) {
133- memcpy (& ctx -> rx_buf [0 ], rx_temp , transfer_len );
135+ memcpy (& ctx -> rx_buf [0 ], rx_temp , transfer_len_bytes );
134136 }
135137
136- spi_context_update_rx (& data -> ctx , data -> dfs , transfer_len /data -> dfs );
138+ spi_context_update_rx (& data -> ctx , data -> dfs , transfer_len_bytes /data -> dfs );
137139
138140 k_free (tx_temp );
139141 k_free (rx_temp );
@@ -351,14 +353,16 @@ static int IRAM_ATTR spi_esp32_configure(const struct device *dev,
351353 return 0 ;
352354}
353355
354- static inline uint8_t spi_esp32_get_frame_size (const struct device * dev ,
355- const struct spi_config * spi_cfg )
356+ static inline uint8_t spi_esp32_get_frame_size (const struct spi_config * spi_cfg )
356357{
357- struct spi_esp32_data * data = dev -> data ;
358-
359- data -> word_size = SPI_WORD_SIZE_GET (spi_cfg -> operation );
358+ uint8_t dfs = SPI_WORD_SIZE_GET (spi_cfg -> operation );
360359
361- return data -> word_size ? data -> word_size >> 3 : 1 ;
360+ dfs /= 8 ;
361+ if ((dfs == 0 ) || (dfs > 4 )) {
362+ LOG_WRN ("Unsupported dfs, 1-byte size will be used" );
363+ dfs = 1 ;
364+ }
365+ return dfs ;
362366}
363367
364368static int transceive (const struct device * dev ,
@@ -389,7 +393,7 @@ static int transceive(const struct device *dev,
389393 goto done ;
390394 }
391395
392- data -> dfs = spi_esp32_get_frame_size (dev , spi_cfg );
396+ data -> dfs = spi_esp32_get_frame_size (spi_cfg );
393397
394398 spi_context_buffers_setup (& data -> ctx , tx_bufs , rx_bufs , data -> dfs );
395399
0 commit comments