Skip to content

Commit 1b72ec0

Browse files
Raffael RostagnoMaureenHelm
authored andcommitted
dma: esp32c6: Added support to GDMA
Added support of GDMA driver for C6 Signed-off-by: Raffael Rostagno <[email protected]>
1 parent 931628a commit 1b72ec0

File tree

2 files changed

+83
-5
lines changed

2 files changed

+83
-5
lines changed

drivers/dma/dma_esp32_gdma.c

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,24 @@ LOG_MODULE_REGISTER(dma_esp32_gdma, CONFIG_DMA_LOG_LEVEL);
2121
#include <zephyr/drivers/dma.h>
2222
#include <zephyr/drivers/dma/dma_esp32.h>
2323
#include <zephyr/drivers/clock_control.h>
24-
#ifndef CONFIG_SOC_SERIES_ESP32C3
25-
#include <zephyr/drivers/interrupt_controller/intc_esp32.h>
26-
#else
24+
#if defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32C6)
2725
#include <zephyr/drivers/interrupt_controller/intc_esp32c3.h>
26+
#else
27+
#include <zephyr/drivers/interrupt_controller/intc_esp32.h>
2828
#endif
2929

30-
#ifdef CONFIG_SOC_SERIES_ESP32C3
30+
#if defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32C6)
3131
#define ISR_HANDLER isr_handler_t
3232
#else
3333
#define ISR_HANDLER intr_handler_t
3434
#endif
3535

36+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
37+
#define DMA_MAX_CHANNEL SOC_GDMA_PAIRS_PER_GROUP_MAX
38+
#else
3639
#define DMA_MAX_CHANNEL SOC_GDMA_PAIRS_PER_GROUP
40+
#endif
41+
3742
#define ESP_DMA_M2M_ON 0
3843
#define ESP_DMA_M2M_OFF 1
3944

@@ -103,6 +108,7 @@ static void IRAM_ATTR dma_esp32_isr_handle_tx(const struct device *dev,
103108
}
104109
}
105110

111+
#if !defined(CONFIG_SOC_SERIES_ESP32C6)
106112
static void IRAM_ATTR dma_esp32_isr_handle(const struct device *dev, uint8_t rx_id, uint8_t tx_id)
107113
{
108114
struct dma_esp32_config *config = (struct dma_esp32_config *)dev->config;
@@ -121,6 +127,7 @@ static void IRAM_ATTR dma_esp32_isr_handle(const struct device *dev, uint8_t rx_
121127
dma_esp32_isr_handle_tx(dev, dma_channel_tx, intr_status);
122128
}
123129
}
130+
#endif
124131

125132
#if defined(CONFIG_SOC_SERIES_ESP32C3)
126133
static int dma_esp32_enable_interrupt(const struct device *dev,
@@ -138,6 +145,20 @@ static int dma_esp32_disable_interrupt(const struct device *dev,
138145

139146
return esp_intr_disable(config->irq_src[dma_channel->channel_id]);
140147
}
148+
#elif defined(CONFIG_SOC_SERIES_ESP32C6)
149+
static int dma_esp32_enable_interrupt(const struct device *dev, uint32_t channel)
150+
{
151+
struct dma_esp32_config *config = (struct dma_esp32_config *)dev->config;
152+
153+
return esp_intr_enable(config->irq_src[channel]);
154+
}
155+
156+
static int dma_esp32_disable_interrupt(const struct device *dev, uint32_t channel)
157+
{
158+
struct dma_esp32_config *config = (struct dma_esp32_config *)dev->config;
159+
160+
return esp_intr_disable(config->irq_src[channel]);
161+
}
141162
#else
142163
static int dma_esp32_enable_interrupt(const struct device *dev,
143164
struct dma_esp32_channel *dma_channel)
@@ -338,7 +359,11 @@ static int dma_esp32_start(const struct device *dev, uint32_t channel)
338359
return -EINVAL;
339360
}
340361

362+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
363+
if (dma_esp32_enable_interrupt(dev, channel)) {
364+
#else
341365
if (dma_esp32_enable_interrupt(dev, dma_channel)) {
366+
#endif
342367
return -EINVAL;
343368
}
344369

@@ -384,7 +409,11 @@ static int dma_esp32_stop(const struct device *dev, uint32_t channel)
384409
return -EINVAL;
385410
}
386411

412+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
413+
if (dma_esp32_disable_interrupt(dev, channel)) {
414+
#else
387415
if (dma_esp32_disable_interrupt(dev, dma_channel)) {
416+
#endif
388417
return -EINVAL;
389418
}
390419

@@ -470,7 +499,7 @@ static int dma_esp32_reload(const struct device *dev, uint32_t channel, uint32_t
470499
return 0;
471500
}
472501

473-
#if defined(CONFIG_SOC_SERIES_ESP32C3)
502+
#if defined(CONFIG_SOC_SERIES_ESP32C3) || defined(CONFIG_SOC_SERIES_ESP32C6)
474503
static int dma_esp32_configure_irq(const struct device *dev)
475504
{
476505
struct dma_esp32_config *config = (struct dma_esp32_config *)dev->config;
@@ -559,14 +588,49 @@ static const struct dma_driver_api dma_esp32_api = {
559588
.reload = dma_esp32_reload,
560589
};
561590

591+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
592+
593+
#define DMA_ESP32_DEFINE_IRQ_HANDLER(channel) \
594+
__attribute__((unused)) static void IRAM_ATTR dma_esp32_isr_##channel##_rx( \
595+
const struct device *dev) \
596+
{ \
597+
struct dma_esp32_config *config = (struct dma_esp32_config *)dev->config; \
598+
struct dma_esp32_data *data = (struct dma_esp32_data *const)(dev)->data; \
599+
uint32_t intr_status = gdma_ll_rx_get_interrupt_status(data->hal.dev, channel); \
600+
if (intr_status) { \
601+
dma_esp32_isr_handle_rx(dev, &config->dma_channel[channel * 2], \
602+
intr_status); \
603+
} \
604+
} \
605+
\
606+
__attribute__((unused)) static void IRAM_ATTR dma_esp32_isr_##channel##_tx( \
607+
const struct device *dev) \
608+
{ \
609+
struct dma_esp32_config *config = (struct dma_esp32_config *)dev->config; \
610+
struct dma_esp32_data *data = (struct dma_esp32_data *const)(dev)->data; \
611+
uint32_t intr_status = gdma_ll_tx_get_interrupt_status(data->hal.dev, channel); \
612+
if (intr_status) { \
613+
dma_esp32_isr_handle_tx(dev, &config->dma_channel[channel * 2 + 1], \
614+
intr_status); \
615+
} \
616+
}
617+
618+
#else
619+
562620
#define DMA_ESP32_DEFINE_IRQ_HANDLER(channel) \
563621
__attribute__((unused)) static void IRAM_ATTR dma_esp32_isr_##channel( \
564622
const struct device *dev) \
565623
{ \
566624
dma_esp32_isr_handle(dev, channel * 2, channel * 2 + 1); \
567625
}
568626

627+
#endif
628+
629+
#if defined(CONFIG_SOC_SERIES_ESP32C6)
630+
#define ESP32_DMA_HANDLER(channel) dma_esp32_isr_##channel##_rx, dma_esp32_isr_##channel##_tx
631+
#else
569632
#define ESP32_DMA_HANDLER(channel) dma_esp32_isr_##channel
633+
#endif
570634

571635
DMA_ESP32_DEFINE_IRQ_HANDLER(0)
572636
DMA_ESP32_DEFINE_IRQ_HANDLER(1)

dts/riscv/espressif/esp32c6/esp32c6_common.dtsi

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,20 @@
128128
};
129129
};
130130

131+
dma: dma@60080000 {
132+
compatible = "espressif,esp32-gdma";
133+
reg = <0x60080000 DT_SIZE_K(4)>;
134+
#dma-cells = <1>;
135+
interrupts = <DMA_IN_CH0_INTR_SOURCE DMA_OUT_CH0_INTR_SOURCE
136+
DMA_IN_CH1_INTR_SOURCE DMA_OUT_CH1_INTR_SOURCE
137+
DMA_IN_CH2_INTR_SOURCE DMA_OUT_CH2_INTR_SOURCE>;
138+
interrupt-parent = <&intc>;
139+
clocks = <&rtc ESP32_GDMA_MODULE>;
140+
dma-channels = <6>;
141+
dma-buf-addr-alignment = <4>;
142+
status = "disabled";
143+
};
144+
131145
gpio0: gpio@60091000 {
132146
compatible = "espressif,esp32-gpio";
133147
gpio-controller;

0 commit comments

Comments
 (0)