This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit 27e2da33b4253aca4eb28bf1e293354e598779f7
Author: Gustavo Henrique Nihei <[email protected]>
AuthorDate: Fri Mar 19 16:10:56 2021 -0300

    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 112e48b..b4b2d21 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];

Reply via email to