From 09893c47d186d8cdbbf43041ad5d5cfd45bc4a04 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 6 Nov 2018 14:21:10 +0900 Subject: Proper print abstraction and ring buffer works --- src/usart_helpers.h | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'src/usart_helpers.h') diff --git a/src/usart_helpers.h b/src/usart_helpers.h index 18de3b4..d2cee0c 100644 --- a/src/usart_helpers.h +++ b/src/usart_helpers.h @@ -26,18 +26,55 @@ #include "usbh_core.h" #include #include +#include BEGIN_DECLS -#ifdef USART_DEBUG +struct dma_buf { + uint32_t xfr_start; /* Start index of running DMA transfer */ + uint32_t xfr_end; /* End index of running DMA transfer plus one */ + uint32_t wr_pos; /* Next index to be written */ + uint32_t len; + uint8_t data[0]; +}; + +struct dma_usart_file { + uint32_t dma; + uint8_t stream; + uint8_t irqn; + struct dma_buf *buf; +}; + + +extern struct dma_usart_file *debug_out; + + void usart_init(uint32_t usart, uint32_t baudrate); -void usart_printf(const char *str, ...); +void usart_fprintf(struct dma_usart_file *f, const char *str, ...); void usart_fifo_push(uint8_t c); -void debug_usart_init(void); +void usart_dma_init(uint32_t usart, uint32_t baudrate, uint32_t dma, uint8_t stream, uint8_t channel); +void usart_kickoff_dma(uint32_t dma, uint8_t stream, uint8_t *buf, size_t len); +void schedule_dma(volatile struct dma_usart_file *f); +int dma_fifo_push(volatile struct dma_buf *buf, char c); +void putf(void *file, char c); + +/* This macro abomination templates a bunch of dma-specific register/constant names from preprocessor macros passed in + * from cmake. */ +#define DMA_PASTE(num) DMA ## num +#define DMA(num) DMA_PASTE(num) + +#define NVIC_DMA_IRQ_PASTE(dma, stream) NVIC_ ## DMA ## dma ## _ ## STREAM ## stream ## _IRQ +#define NVIC_DMA_IRQ(dma, stream) NVIC_DMA_IRQ_PASTE(dma, stream) -#define LOG_PRINTF(format, ...) usart_printf(format, ##__VA_ARGS__); +#define DMA_ISR_PASTE(dma, stream) DMA ## dma ## _ ## STREAM ## stream ## _IRQHandler +#define DMA_ISR(dma, stream) DMA_ISR_PASTE(dma, stream) + +#ifdef USART_DEBUG +#define DEBUG_USART_INIT() usart_dma_init(DEBUG_USART, DEBUG_USART_BAUDRATE, DMA(DEBUG_USART_DMA_NUM), DEBUG_USART_DMA_STREAM_NUM, DEBUG_USART_DMA_CHANNEL_NUM) +#define LOG_PRINTF(format, ...) usart_fprintf(debug_out, format, ##__VA_ARGS__); #else +#define DEBUG_USART_INIT() ((void)0) #define LOG_PRINTF(dummy, ...) ((void)dummy) #endif -- cgit