From: Keith Packard Date: Wed, 9 Nov 2022 00:17:14 +0000 (-0800) Subject: samd21: Move DMA channel defs to ao_dma_samd21.h X-Git-Tag: 1.9.13~1^2~26^2~28 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=bf793f94a2218b42794fa1ae11babab8cd565a66 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 --- 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(); }