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/nuttx.git
The following commit(s) were added to refs/heads/master by this push: new 3f651826999 arch/risc-v: Change DMA functions with common layer approach for esp32[-c3|-c6|-h2] 3f651826999 is described below commit 3f65182699904398c8ecd15b075c60d733e5b8cd Author: Eren Terzioglu <eren.terzio...@espressif.com> AuthorDate: Thu Jun 12 10:07:02 2025 +0200 arch/risc-v: Change DMA functions with common layer approach for esp32[-c3|-c6|-h2] Change DMA functions with common layer functions for risc-v based Espressif devices Signed-off-by: Eren Terzioglu <eren.terzio...@espressif.com> --- arch/risc-v/src/common/espressif/esp_dma.c | 151 +++++++++++------------------ arch/risc-v/src/esp32c3/hal_esp32c3.mk | 2 + arch/risc-v/src/esp32c6/hal_esp32c6.mk | 2 + arch/risc-v/src/esp32h2/hal_esp32h2.mk | 2 + 4 files changed, 64 insertions(+), 93 deletions(-) diff --git a/arch/risc-v/src/common/espressif/esp_dma.c b/arch/risc-v/src/common/espressif/esp_dma.c index b2178b98a15..ec76a1c5bca 100644 --- a/arch/risc-v/src/common/espressif/esp_dma.c +++ b/arch/risc-v/src/common/espressif/esp_dma.c @@ -45,6 +45,7 @@ #include "soc/gdma_periph.h" #include "hal/gdma_hal.h" +#include "hal/gdma_hal_ahb.h" #include "hal/gdma_types.h" #include "hal/gdma_ll.h" #include "periph_ctrl.h" @@ -58,6 +59,12 @@ #define ESPRESSIF_DMA_CHAN_MAX (SOC_GDMA_PAIRS_PER_GROUP_MAX) +#if !SOC_RCC_IS_INDEPENDENT +#define GDMA_RCC_ATOMIC() PERIPH_RCC_ATOMIC() +#else +#define GDMA_RCC_ATOMIC() +#endif + /**************************************************************************** * Private Data ****************************************************************************/ @@ -65,6 +72,10 @@ static bool g_dma_chan_used[ESPRESSIF_DMA_CHAN_MAX]; static mutex_t g_dma_lock = NXMUTEX_INITIALIZER; static gdma_hal_context_t ctx; +static gdma_hal_config_t cfg = +{ + .group_id = 0 +}; /**************************************************************************** * Public Functions @@ -123,26 +134,27 @@ int32_t esp_dma_request(enum esp_dma_periph_e periph, dmainfo("Allocated channel=%d\n", chan); - gdma_ll_rx_connect_to_periph(ctx.dev, chan, periph, periph); - gdma_ll_tx_connect_to_periph(ctx.dev, chan, periph, periph); + gdma_hal_connect_peri(&ctx, chan, GDMA_CHANNEL_DIRECTION_TX, + periph, periph); + gdma_hal_connect_peri(&ctx, chan, GDMA_CHANNEL_DIRECTION_RX, + periph, periph); if (burst_en) { /* Enable DMA TX/RX channels burst sending data */ - gdma_ll_tx_enable_data_burst(ctx.dev, chan, true); - gdma_ll_rx_enable_data_burst(ctx.dev, chan, true); - /* Enable DMA TX/RX channels burst reading descriptor link */ - gdma_ll_tx_enable_descriptor_burst(ctx.dev, chan, true); - gdma_ll_rx_enable_descriptor_burst(ctx.dev, chan, true); + gdma_hal_enable_burst(&ctx, chan, GDMA_CHANNEL_DIRECTION_TX, + true, true); + gdma_hal_enable_burst(&ctx, chan, GDMA_CHANNEL_DIRECTION_RX, + true, true); } /* Set priority for DMA TX/RX channels */ - gdma_ll_tx_set_priority(ctx.dev, chan, tx_prio); - gdma_ll_rx_set_priority(ctx.dev, chan, rx_prio); + gdma_hal_set_priority(&ctx, chan, GDMA_CHANNEL_DIRECTION_TX, tx_prio); + gdma_hal_set_priority(&ctx, chan, GDMA_CHANNEL_DIRECTION_RX, rx_prio); nxmutex_unlock(&g_dma_lock); return chan; @@ -177,6 +189,8 @@ uint32_t esp_dma_setup(int chan, bool tx, uint8_t *pdata = pbuf; uint32_t data_len; uint32_t buf_len; + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; dma_descriptor_t *dma_desc = (dma_descriptor_t *)dmadesc; DEBUGASSERT(chan >= 0); @@ -212,22 +226,16 @@ uint32_t esp_dma_setup(int chan, bool tx, dma_desc[i].dw0.suc_eof = 1; dmadesc[i].next = NULL; + gdma_hal_reset(&ctx, chan, dir); + if (tx) { - /* Reset DMA TX channel FSM and FIFO pointer */ - - gdma_ll_tx_reset_channel(ctx.dev, chan); - /* Set the descriptor link base address for TX channel */ gdma_ll_tx_set_desc_addr(ctx.dev, chan, (uint32_t)dmadesc); } else { - /* Reset DMA RX channel FSM and FIFO pointer */ - - gdma_ll_rx_reset_channel(ctx.dev, chan); - /* Set the descriptor link base address for RX channel */ gdma_ll_rx_set_desc_addr(ctx.dev, chan, (uint32_t)dmadesc); @@ -256,30 +264,14 @@ uint32_t esp_dma_setup(int chan, bool tx, void esp_dma_load(struct esp_dmadesc_s *dmadesc, int chan, bool tx) { uint32_t regval; + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; DEBUGASSERT(chan >= 0); DEBUGASSERT(dmadesc != NULL); - if (tx) - { - /* Reset DMA TX channel FSM and FIFO pointer */ - - gdma_ll_rx_reset_channel(ctx.dev, chan); - - /* Set the descriptor link base address for TX channel */ - - gdma_ll_tx_set_desc_addr(ctx.dev, chan, (uint32_t)dmadesc); - } - else - { - /* Reset DMA RX channel FSM and FIFO pointer */ - - gdma_ll_rx_reset_channel(ctx.dev, chan); - - /* Set the descriptor link base address for RX channel */ - - gdma_ll_rx_set_desc_addr(ctx.dev, chan, (uint32_t)dmadesc); - } + gdma_hal_reset(&ctx, chan, dir); + gdma_hal_start_with_desc(&ctx, chan, dir, (uint32_t)dmadesc); } /**************************************************************************** @@ -301,14 +293,9 @@ void esp_dma_load(struct esp_dmadesc_s *dmadesc, int chan, bool tx) void esp_dma_enable_interrupt(int chan, bool tx, uint32_t mask, bool en) { - if (tx) - { - gdma_ll_tx_enable_interrupt(ctx.dev, chan, mask, en); - } - else - { - gdma_ll_rx_enable_interrupt(ctx.dev, chan, mask, en); - } + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; + gdma_hal_enable_intr(&ctx, chan, dir, mask, en); } /**************************************************************************** @@ -329,17 +316,9 @@ void esp_dma_enable_interrupt(int chan, bool tx, uint32_t mask, bool en) int esp_dma_get_interrupt(int chan, bool tx) { uint32_t intr_status = 0; - - if (tx) - { - intr_status = gdma_ll_tx_get_interrupt_status(ctx.dev, chan, false); - } - else - { - intr_status = gdma_ll_rx_get_interrupt_status(ctx.dev, chan, false); - } - - return intr_status; + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; + return gdma_hal_read_intr_status(&ctx, chan, dir, false); } /**************************************************************************** @@ -360,14 +339,9 @@ int esp_dma_get_interrupt(int chan, bool tx) void esp_dma_clear_interrupt(int chan, bool tx, uint32_t mask) { - if (tx) - { - gdma_ll_tx_clear_interrupt_status(ctx.dev, chan, mask); - } - else - { - gdma_ll_rx_clear_interrupt_status(ctx.dev, chan, mask); - } + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; + gdma_hal_clear_intr(&ctx, chan, dir, mask); } /**************************************************************************** @@ -387,18 +361,9 @@ void esp_dma_clear_interrupt(int chan, bool tx, uint32_t mask) int esp_dma_get_desc_addr(int chan, bool tx) { - uint32_t desc_addr = 0; - - if (tx) - { - desc_addr = gdma_ll_tx_get_eof_desc_addr(ctx.dev, chan); - } - else - { - desc_addr = gdma_ll_rx_get_success_eof_desc_addr(ctx.dev, chan); - } - - return desc_addr; + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; + return gdma_hal_get_eof_desc_addr(&ctx, chan, dir, true); } /**************************************************************************** @@ -445,14 +410,9 @@ void esp_dma_enable(int chan, bool tx) void esp_dma_disable(int chan, bool tx) { - if (tx) - { - gdma_ll_tx_stop(ctx.dev, chan); - } - else - { - gdma_ll_rx_stop(ctx.dev, chan); - } + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; + gdma_hal_stop(&ctx, chan, dir); } /**************************************************************************** @@ -499,14 +459,9 @@ void esp_dma_wait_idle(int chan, bool tx) void esp_dma_reset_channel(int chan, bool tx) { - if (tx) - { - gdma_ll_tx_reset_channel(ctx.dev, chan); - } - else - { - gdma_ll_rx_reset_channel(ctx.dev, chan); - } + gdma_channel_direction_t dir = tx == true ? GDMA_CHANNEL_DIRECTION_TX : \ + GDMA_CHANNEL_DIRECTION_RX; + gdma_hal_reset(&ctx, chan, dir); } /**************************************************************************** @@ -526,7 +481,12 @@ void esp_dma_reset_channel(int chan, bool tx) void esp_dma_init(void) { periph_module_enable(PERIPH_GDMA_MODULE); - ctx.dev = GDMA_LL_GET_HW(0); + GDMA_RCC_ATOMIC() + { + gdma_ll_enable_bus_clock(0, true); + } + + gdma_ahb_hal_init(&ctx, &cfg); gdma_ll_force_enable_reg_clock(ctx.dev, true); } @@ -551,12 +511,17 @@ void esp_dma_deinit(void) /* Disable DMA clock gating */ gdma_ll_force_enable_reg_clock(ctx.dev, false); + GDMA_RCC_ATOMIC() + { + gdma_ll_enable_bus_clock(0, false); + } /* Disable DMA module by gating the clock and asserting the reset * signal. */ periph_module_disable(PERIPH_GDMA_MODULE); + gdma_hal_deinit(&ctx); nxmutex_unlock(&g_dma_lock); } diff --git a/arch/risc-v/src/esp32c3/hal_esp32c3.mk b/arch/risc-v/src/esp32c3/hal_esp32c3.mk index 3f12fe47615..427092cc35c 100644 --- a/arch/risc-v/src/esp32c3/hal_esp32c3.mk +++ b/arch/risc-v/src/esp32c3/hal_esp32c3.mk @@ -150,6 +150,8 @@ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)cache_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)efuse_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gpio_hal.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gdma_hal_ahb_v1.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gdma_hal_top.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)hal_utils.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)ledc_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)ledc_hal_iram.c diff --git a/arch/risc-v/src/esp32c6/hal_esp32c6.mk b/arch/risc-v/src/esp32c6/hal_esp32c6.mk index c509d2c3cdd..941d8036705 100644 --- a/arch/risc-v/src/esp32c6/hal_esp32c6.mk +++ b/arch/risc-v/src/esp32c6/hal_esp32c6.mk @@ -154,6 +154,8 @@ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)brownout_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)efuse_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gpio_hal.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gdma_hal_ahb_v1.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gdma_hal_top.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)hal_utils.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)ledc_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)ledc_hal_iram.c diff --git a/arch/risc-v/src/esp32h2/hal_esp32h2.mk b/arch/risc-v/src/esp32h2/hal_esp32h2.mk index b1d8c615cb8..1049ce600f4 100644 --- a/arch/risc-v/src/esp32h2/hal_esp32h2.mk +++ b/arch/risc-v/src/esp32h2/hal_esp32h2.mk @@ -146,6 +146,8 @@ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$ CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)cache_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)efuse_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gpio_hal.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gdma_hal_ahb_v1.c +CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)gdma_hal_top.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)hal_utils.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)ledc_hal.c CHIP_CSRCS += chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)hal$(DELIM)ledc_hal_iram.c