diff --git a/firmware/common/gpdma.c b/firmware/common/gpdma.c index dbccbd7f..315b3180 100644 --- a/firmware/common/gpdma.c +++ b/firmware/common/gpdma.c @@ -48,3 +48,15 @@ void gpdma_channel_interrupt_error_clear(const uint_fast8_t channel) { void gpdma_lli_enable_interrupt(gpdma_lli_t* const lli) { lli->ccontrol |= GPDMA_CCONTROL_I(1); } + +void gpdma_lli_create_loop(gpdma_lli_t* const lli, const size_t lli_count) { + for(size_t i=0; i> 2); + } +} + +void gpdma_lli_create_oneshot(gpdma_lli_t* const lli, const size_t lli_count) { + gpdma_lli_create_loop(lli, lli_count); + lli[lli_count - 1].clli &= ~GPDMA_CLLI_LLI_MASK; +} diff --git a/firmware/common/gpdma.h b/firmware/common/gpdma.h index e9cc66d4..11c4e74f 100644 --- a/firmware/common/gpdma.h +++ b/firmware/common/gpdma.h @@ -22,6 +22,7 @@ #ifndef __GPDMA_H__ #define __GPDMA_H__ +#include #include #include @@ -36,4 +37,7 @@ void gpdma_channel_interrupt_error_clear(const uint_fast8_t channel); void gpdma_lli_enable_interrupt(gpdma_lli_t* const lli); +void gpdma_lli_create_loop(gpdma_lli_t* const lli, const size_t lli_count); +void gpdma_lli_create_oneshot(gpdma_lli_t* const lli, const size_t lli_count); + #endif/*__GPDMA_H__*/ diff --git a/firmware/common/sgpio_dma.c b/firmware/common/sgpio_dma.c index 10c655db..dc78ddf1 100644 --- a/firmware/common/sgpio_dma.c +++ b/firmware/common/sgpio_dma.c @@ -39,6 +39,8 @@ void sgpio_dma_configure_lli( const size_t bytes_per_word = 4; const size_t transfer_words = (transfer_bytes + bytes_per_word - 1) / bytes_per_word; + gpdma_lli_create_loop(lli, lli_count); + for(size_t i=0; i