From bf793f94a2218b42794fa1ae11babab8cd565a66 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 8 Nov 2022 16:17:14 -0800 Subject: [PATCH 1/1] samd21: Move DMA channel defs to ao_dma_samd21.h This way if we need to use DMA for something else, we've got a central place to set things up. Signed-off-by: Keith Packard --- src/samd21/ao_dma_samd21.h | 10 ++++++++++ src/samd21/ao_spi_samd21.c | 16 ++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/samd21/ao_dma_samd21.h b/src/samd21/ao_dma_samd21.h index 624e7a92..f28810bb 100644 --- a/src/samd21/ao_dma_samd21.h +++ b/src/samd21/ao_dma_samd21.h @@ -38,4 +38,14 @@ _ao_dma_done_transfer(uint8_t id); void ao_dma_dump(char *where); +/* + * DMA is used for ADC and SERCOM + */ + +#define AO_SERCOM_DMA_BASE 2U +#define AO_SERCOM_INPUT_DMA_ID(id) ((uint8_t) ((id) * 2U + 0U + AO_SERCOM_DMA_BASE)) +#define AO_SERCOM_OUTPUT_DMA_ID(id) ((uint8_t) ((id) * 2U + 1U + AO_SERCOM_DMA_BASE)) + +#define AO_ADC_DMA_ID 0 + #endif /* _AO_DMA_SAM21_H_ */ diff --git a/src/samd21/ao_spi_samd21.c b/src/samd21/ao_spi_samd21.c index 639ba97f..b5ba6548 100644 --- a/src/samd21/ao_spi_samd21.c +++ b/src/samd21/ao_spi_samd21.c @@ -21,14 +21,6 @@ static uint16_t ao_spi_pin_config[SAMD21_NUM_SERCOM]; #define SPI_DEBUG 0 #define SPI_USE_DMA 1 -/* - * DMA is only used for USARTs in altos, which makes assigning DMA IDs - * pretty easy - */ - -#define MISO_DMA_ID(id) ((uint8_t) ((id) * 2U + 0U)) -#define MOSI_DMA_ID(id) ((uint8_t) ((id) * 2U + 1U)) - struct ao_spi_samd21_info { struct samd21_sercom *sercom; }; @@ -176,7 +168,7 @@ spi_run(const void *out, void *in, uint16_t len, uint16_t spi_index, bool step_o /* read any stuck data */ (void) sercom->data; - _ao_dma_start_transfer(MISO_DMA_ID(id), + _ao_dma_start_transfer(AO_SERCOM_INPUT_DMA_ID(id), (void *) &sercom->data, i, len, @@ -187,7 +179,7 @@ spi_run(const void *out, void *in, uint16_t len, uint16_t spi_index, bool step_o (void *) (uintptr_t) id ); - _ao_dma_start_transfer(MOSI_DMA_ID(id), + _ao_dma_start_transfer(AO_SERCOM_OUTPUT_DMA_ID(id), o, (void *) &sercom->data, len, @@ -200,8 +192,8 @@ spi_run(const void *out, void *in, uint16_t len, uint16_t spi_index, bool step_o while (ao_spi_done[id] == 0) ao_sleep(&ao_spi_done[id]); - _ao_dma_done_transfer(MOSI_DMA_ID(id)); - _ao_dma_done_transfer(MISO_DMA_ID(id)); + _ao_dma_done_transfer(AO_SERCOM_OUTPUT_DMA_ID(id)); + _ao_dma_done_transfer(AO_SERCOM_INPUT_DMA_ID(id)); ao_arch_release_interrupts(); } -- 2.30.2