Skip to content

Commit 47f4218

Browse files
dean-at-evoscarlescufi
authored andcommitted
drivers: spi: esp32xx: Fix word size limiting transaction
Word size setting limited any SPI transaction to the frame size. In addition to making the SPI inefficient this broke drivers that set the word size. It appears that most drivers use a one byte (8) size for this setting. This change respects what I think is the intended use of the word size setting. That is to set the length of each element in a tx/rx buffer struct. Signed-off-by: Dean Sellers <[email protected]>
1 parent 4ffff54 commit 47f4218

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

drivers/spi/spi_esp32_spim.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

364368
static 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

drivers/spi/spi_esp32_spim.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ struct spi_esp32_data {
5252
int irq_line;
5353
lldesc_t dma_desc_tx;
5454
lldesc_t dma_desc_rx;
55-
uint8_t word_size;
5655
};
5756

5857
#endif /* ZEPHYR_DRIVERS_SPI_ESP32_SPIM_H_ */

0 commit comments

Comments
 (0)