From 27e2da33b4253aca4eb28bf1e293354e598779f7 Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Nihei Date: Fri, 19 Mar 2021 16:10:56 -0300 Subject: [PATCH] xtensa/esp32: Fix buffer size word-alignment for DMA transfers --- arch/xtensa/src/esp32/esp32_dma.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/xtensa/src/esp32/esp32_dma.c b/arch/xtensa/src/esp32/esp32_dma.c index 112e48bce6..b4b2d21e44 100644 --- a/arch/xtensa/src/esp32/esp32_dma.c +++ b/arch/xtensa/src/esp32/esp32_dma.c @@ -72,6 +72,7 @@ uint32_t esp32_dma_init(struct esp32_dmadesc_s *dmadesc, uint32_t num, uint32_t bytes = len; uint8_t *pdata = pbuf; uint32_t data_len; + uint32_t buf_len; DEBUGASSERT(dmadesc != NULL); DEBUGASSERT(pbuf != NULL); @@ -81,8 +82,14 @@ uint32_t esp32_dma_init(struct esp32_dmadesc_s *dmadesc, uint32_t num, { data_len = MIN(bytes, ESP32_DMA_DATALEN_MAX); + /* Round the number of bytes to the nearest word, since the buffer + * length must be word-aligned. + */ + + buf_len = (data_len + sizeof(uintptr_t) - 1) / sizeof(uintptr_t); + dmadesc[i].ctrl = (data_len << DMA_CTRL_DATALEN_S) | - (data_len << DMA_CTRL_BUFLEN_S) | + (buf_len << DMA_CTRL_BUFLEN_S) | DMA_CTRL_OWN; dmadesc[i].pbuf = pdata; dmadesc[i].next = &dmadesc[i + 1];