xtensa/esp32: Clean up esp32_dma_init code

Removed "isrx" parameter whose only purpose is to trigger an assertion
on DEBUG builds. Also performed a minor refactor.
This commit is contained in:
Gustavo Henrique Nihei 2021-03-17 15:10:15 -03:00 committed by Xiang Xiao
parent 122f59b761
commit bfc551484a
4 changed files with 26 additions and 29 deletions

View File

@ -35,6 +35,14 @@
#include "hardware/esp32_dma.h" #include "hardware/esp32_dma.h"
#include "esp32_dma.h" #include "esp32_dma.h"
/****************************************************************************
* Preprocessor Definitions
****************************************************************************/
#ifndef MIN
# define MIN(a,b) (a < b ? a : b)
#endif
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
****************************************************************************/ ****************************************************************************/
@ -51,7 +59,6 @@
* num - DMA descriptions number * num - DMA descriptions number
* pbuf - RX/TX buffer pointer * pbuf - RX/TX buffer pointer
* len - RX/TX buffer length * len - RX/TX buffer length
* isrx - true: RX DMA descriptions. false: TX DMA descriptions
* *
* Returned Value: * Returned Value:
* Binded pbuf data bytes * Binded pbuf data bytes
@ -59,43 +66,34 @@
****************************************************************************/ ****************************************************************************/
uint32_t esp32_dma_init(struct esp32_dmadesc_s *dmadesc, uint32_t num, uint32_t esp32_dma_init(struct esp32_dmadesc_s *dmadesc, uint32_t num,
uint8_t *pbuf, uint32_t len, int isrx) uint8_t *pbuf, uint32_t len)
{ {
int i; int i;
uint32_t bytes = len; uint32_t bytes = len;
uint8_t *pdata = pbuf; uint8_t *pdata = pbuf;
uint32_t n; uint32_t data_len;
DEBUGASSERT(pbuf && len); DEBUGASSERT(dmadesc != NULL);
if (isrx) DEBUGASSERT(pbuf != NULL);
{ DEBUGASSERT(len > 0);
DEBUGASSERT((len & 3) == 0);
}
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
{ {
if (bytes < ESP32_DMA_DATALEN_MAX) data_len = MIN(bytes, ESP32_DMA_DATALEN_MAX);
{
n = bytes;
}
else
{
n = ESP32_DMA_DATALEN_MAX;
}
dmadesc[i].ctrl = (n << DMA_CTRL_DATALEN_S) | dmadesc[i].ctrl = (data_len << DMA_CTRL_DATALEN_S) |
(n << DMA_CTRL_BUFLEN_S) | (data_len << DMA_CTRL_BUFLEN_S) |
DMA_CTRL_OWN; DMA_CTRL_OWN;
dmadesc[i].pbuf = pdata; dmadesc[i].pbuf = pdata;
dmadesc[i].next = &dmadesc[i + 1]; dmadesc[i].next = &dmadesc[i + 1];
bytes -= n; bytes -= data_len;
if (!bytes) if (bytes == 0)
{ {
break; break;
} }
pdata += n; pdata += data_len;
} }
dmadesc[i].ctrl |= DMA_CTRL_EOF; dmadesc[i].ctrl |= DMA_CTRL_EOF;

View File

@ -80,7 +80,6 @@ struct esp32_dmadesc_s
* num - DMA descriptions number * num - DMA descriptions number
* pbuf - RX/TX buffer pointer * pbuf - RX/TX buffer pointer
* len - RX/TX buffer length * len - RX/TX buffer length
* isrx - true: RX DMA descriptions. false: TX DMA descriptions
* *
* Returned Value: * Returned Value:
* Bind pbuf data bytes * Bind pbuf data bytes
@ -88,7 +87,7 @@ struct esp32_dmadesc_s
****************************************************************************/ ****************************************************************************/
uint32_t esp32_dma_init(struct esp32_dmadesc_s *dmadesc, uint32_t num, uint32_t esp32_dma_init(struct esp32_dmadesc_s *dmadesc, uint32_t num,
uint8_t *pbuf, uint32_t len, int isrx); uint8_t *pbuf, uint32_t len);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -917,7 +917,7 @@ static void esp32_spi_dma_exchange(FAR struct esp32_spi_priv_s *priv,
esp32_spi_reset_regbits(priv, SPI_DMA_CONF_OFFSET, SPI_DMA_RESET_MASK); esp32_spi_reset_regbits(priv, SPI_DMA_CONF_OFFSET, SPI_DMA_RESET_MASK);
n = esp32_dma_init(s_dma_txdesc[priv->config->dma_chan - 1], n = esp32_dma_init(s_dma_txdesc[priv->config->dma_chan - 1],
SPI_DMADESC_NUM, tp, bytes, 0); SPI_DMADESC_NUM, tp, bytes);
regval = (uintptr_t)s_dma_txdesc[priv->config->dma_chan - 1] & regval = (uintptr_t)s_dma_txdesc[priv->config->dma_chan - 1] &
SPI_OUTLINK_ADDR_V; SPI_OUTLINK_ADDR_V;
@ -936,7 +936,7 @@ static void esp32_spi_dma_exchange(FAR struct esp32_spi_priv_s *priv,
if (rp) if (rp)
{ {
esp32_dma_init(s_dma_rxdesc[priv->config->dma_chan - 1], esp32_dma_init(s_dma_rxdesc[priv->config->dma_chan - 1],
SPI_DMADESC_NUM, rp, bytes, 1); SPI_DMADESC_NUM, rp, bytes);
regval = (uintptr_t)s_dma_rxdesc[priv->config->dma_chan - 1] & regval = (uintptr_t)s_dma_rxdesc[priv->config->dma_chan - 1] &
SPI_INLINK_ADDR_V; SPI_INLINK_ADDR_V;

View File

@ -649,7 +649,7 @@ static void esp32_spislv_tx(struct esp32_spislv_priv_s *priv)
if (priv->dma_chan) if (priv->dma_chan)
{ {
esp32_dma_init(s_tx_desc[priv->dma_chan - 1], SPI_DMADESC_NUM, esp32_dma_init(s_tx_desc[priv->dma_chan - 1], SPI_DMADESC_NUM,
priv->txbuffer, priv->txlen, 0); priv->txbuffer, priv->txlen);
regval = (uint32_t)s_tx_desc[priv->dma_chan - 1] & SPI_OUTLINK_ADDR_V; regval = (uint32_t)s_tx_desc[priv->dma_chan - 1] & SPI_OUTLINK_ADDR_V;
esp32_spi_set_reg(priv, SPI_DMA_OUT_LINK_OFFSET, esp32_spi_set_reg(priv, SPI_DMA_OUT_LINK_OFFSET,
@ -725,7 +725,7 @@ static void esp32_spislv_rx(struct esp32_spislv_priv_s *priv)
/* Start to receive next block of data */ /* Start to receive next block of data */
esp32_dma_init(s_rx_desc[priv->dma_chan - 1], SPI_DMADESC_NUM, esp32_dma_init(s_rx_desc[priv->dma_chan - 1], SPI_DMADESC_NUM,
priv->rxbuffer + priv->rxlen, tmp, 1); priv->rxbuffer + priv->rxlen, tmp);
regval = (uint32_t)s_rx_desc[priv->dma_chan - 1] & regval = (uint32_t)s_rx_desc[priv->dma_chan - 1] &
SPI_INLINK_ADDR_V; SPI_INLINK_ADDR_V;
@ -911,7 +911,7 @@ static void esp32_spislv_initialize(FAR struct spi_sctrlr_s *dev)
SPI_OUTDSCR_BURST_EN_M); SPI_OUTDSCR_BURST_EN_M);
esp32_dma_init(s_rx_desc[priv->dma_chan - 1], SPI_DMADESC_NUM, esp32_dma_init(s_rx_desc[priv->dma_chan - 1], SPI_DMADESC_NUM,
priv->rxbuffer, SPI_SLAVE_BUFSIZE, 1); priv->rxbuffer, SPI_SLAVE_BUFSIZE);
regval = (uint32_t)s_rx_desc[priv->dma_chan - 1] & SPI_INLINK_ADDR_V; regval = (uint32_t)s_rx_desc[priv->dma_chan - 1] & SPI_INLINK_ADDR_V;
esp32_spi_set_reg(priv, SPI_DMA_IN_LINK_OFFSET, esp32_spi_set_reg(priv, SPI_DMA_IN_LINK_OFFSET,