summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/stm32/dma.c10
-rw-r--r--ports/stm32/dma.h8
2 files changed, 18 insertions, 0 deletions
diff --git a/ports/stm32/dma.c b/ports/stm32/dma.c
index ba09dc170..4b078eebb 100644
--- a/ports/stm32/dma.c
+++ b/ports/stm32/dma.c
@@ -1233,3 +1233,13 @@ void dma_nohal_start(const dma_descr_t *descr, uint32_t src_addr, uint32_t dst_a
}
#endif
+
+#define DMA_ID_FROM_CONTROLLER_STREAM(c, s) ((s) + (c) * NSTREAMS_PER_CONTROLLER)
+
+void dma_external_acquire(uint32_t controller, uint32_t stream) {
+ dma_enable_clock(DMA_ID_FROM_CONTROLLER_STREAM(controller, stream));
+}
+
+void dma_external_release(uint32_t controller, uint32_t stream) {
+ dma_disable_clock(DMA_ID_FROM_CONTROLLER_STREAM(controller, stream));
+}
diff --git a/ports/stm32/dma.h b/ports/stm32/dma.h
index 8bd101a61..00200bae4 100644
--- a/ports/stm32/dma.h
+++ b/ports/stm32/dma.h
@@ -102,13 +102,21 @@ extern const dma_descr_t dma_I2C_4_RX;
#endif
+// API that configures the DMA via the HAL.
void dma_init(DMA_HandleTypeDef *dma, const dma_descr_t *dma_descr, uint32_t dir, void *data);
void dma_init_handle(DMA_HandleTypeDef *dma, const dma_descr_t *dma_descr, uint32_t dir, void *data);
void dma_deinit(const dma_descr_t *dma_descr);
void dma_invalidate_channel(const dma_descr_t *dma_descr);
+// API that configures the DMA directly and does not use the HAL.
void dma_nohal_init(const dma_descr_t *descr, uint32_t config);
void dma_nohal_deinit(const dma_descr_t *descr);
void dma_nohal_start(const dma_descr_t *descr, uint32_t src_addr, uint32_t dst_addr, uint16_t len);
+// API to be used if DMA is controlled externally, to ensure the clock remains enabled.
+// - controller: should be 0 or 1, corresponding to DMA1 or DMA2
+// - stream: should be 0 to N, corresponding to Stream0..StreamN, or Channel1..ChannelN
+void dma_external_acquire(uint32_t controller, uint32_t stream);
+void dma_external_release(uint32_t controller, uint32_t stream);
+
#endif // MICROPY_INCLUDED_STM32_DMA_H