usbuart: Moved the aux UART DMA TX interrupt handling into aux_serial.c
This commit is contained in:
parent
5d94ea3017
commit
d25a093d7f
|
@ -40,6 +40,7 @@
|
||||||
static char aux_serial_transmit_buffer[2U][TX_BUF_SIZE];
|
static char aux_serial_transmit_buffer[2U][TX_BUF_SIZE];
|
||||||
static uint8_t aux_serial_transmit_buffer_index;
|
static uint8_t aux_serial_transmit_buffer_index;
|
||||||
static uint8_t aux_serial_transmit_buffer_consumed;
|
static uint8_t aux_serial_transmit_buffer_consumed;
|
||||||
|
static bool aux_serial_transmit_complete = true;
|
||||||
|
|
||||||
#ifdef DMA_STREAM0
|
#ifdef DMA_STREAM0
|
||||||
#define dma_channel_reset(dma, channel) dma_stream_reset(dma, channel)
|
#define dma_channel_reset(dma, channel) dma_stream_reset(dma, channel)
|
||||||
|
@ -285,6 +286,29 @@ static void aux_serial_receive_isr(const uint32_t usart, const uint8_t dma_irq)
|
||||||
nvic_enable_irq(dma_irq);
|
nvic_enable_irq(dma_irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void aux_serial_dma_transmit_isr(const uint8_t dma_tx_channel)
|
||||||
|
{
|
||||||
|
nvic_disable_irq(USB_IRQ);
|
||||||
|
|
||||||
|
/* Stop DMA */
|
||||||
|
dma_disable_channel(USBUSART_DMA_BUS, dma_tx_channel);
|
||||||
|
dma_clear_interrupt_flags(USBUSART_DMA_BUS, dma_tx_channel, DMA_CGIF);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If a new buffer is ready, continue transmission.
|
||||||
|
* Otherwise we report the transfer has completed.
|
||||||
|
*/
|
||||||
|
if (aux_serial_transmit_buffer_fullness()) {
|
||||||
|
aux_serial_switch_transmit_buffers();
|
||||||
|
usbd_ep_nak_set(usbdev, CDCACM_UART_ENDPOINT, 0);
|
||||||
|
} else {
|
||||||
|
usbuart_set_led_state(TX_LED_ACT, false);
|
||||||
|
aux_serial_transmit_complete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
nvic_enable_irq(USB_IRQ);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(USBUSART_ISR)
|
#if defined(USBUSART_ISR)
|
||||||
void USBUSART_ISR(void)
|
void USBUSART_ISR(void)
|
||||||
{
|
{
|
||||||
|
@ -318,6 +342,27 @@ void USBUSART2_ISR(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(USBUSART_DMA_TX_ISR)
|
||||||
|
void USBUSART_DMA_TX_ISR(void)
|
||||||
|
{
|
||||||
|
aux_serial_dma_transmit_isr(USBUSART_DMA_TX_CHAN);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USBUSART1_DMA_TX_ISR)
|
||||||
|
void USBUSART1_DMA_TX_ISR(void)
|
||||||
|
{
|
||||||
|
aux_serial_dma_transmit_isr(USBUSART1_DMA_TX_CHAN);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(USBUSART2_DMA_TX_ISR)
|
||||||
|
void USBUSART2_DMA_TX_ISR(void)
|
||||||
|
{
|
||||||
|
aux_serial_dma_transmit_isr(USBUSART2_DMA_TX_CHAN);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(LM4F)
|
#elif defined(LM4F)
|
||||||
char *aux_serial_current_transmit_buffer(void)
|
char *aux_serial_current_transmit_buffer(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,7 +41,6 @@ void debug_uart_run(void);
|
||||||
#define RX_FIFO_SIZE (USART_DMA_BUF_SIZE)
|
#define RX_FIFO_SIZE (USART_DMA_BUF_SIZE)
|
||||||
#define TX_BUF_SIZE (USART_DMA_BUF_SIZE)
|
#define TX_BUF_SIZE (USART_DMA_BUF_SIZE)
|
||||||
|
|
||||||
extern bool aux_serial_transmit_complete;
|
|
||||||
/* RX Fifo buffer with space for copy fn overrun */
|
/* RX Fifo buffer with space for copy fn overrun */
|
||||||
extern char buf_rx[RX_FIFO_SIZE + sizeof(uint64_t)];
|
extern char buf_rx[RX_FIFO_SIZE + sizeof(uint64_t)];
|
||||||
/* RX Fifo out pointer, writes assumed to be atomic */
|
/* RX Fifo out pointer, writes assumed to be atomic */
|
||||||
|
|
|
@ -38,8 +38,6 @@
|
||||||
#define DMA_CGIF DMA_IFCR_CGIF_BIT
|
#define DMA_CGIF DMA_IFCR_CGIF_BIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TX transfer complete */
|
|
||||||
bool aux_serial_transmit_complete = true;
|
|
||||||
/* RX Fifo buffer with space for copy fn overrun */
|
/* RX Fifo buffer with space for copy fn overrun */
|
||||||
char buf_rx[RX_FIFO_SIZE + sizeof(uint64_t)];
|
char buf_rx[RX_FIFO_SIZE + sizeof(uint64_t)];
|
||||||
/* RX Fifo out pointer, writes assumed to be atomic */
|
/* RX Fifo out pointer, writes assumed to be atomic */
|
||||||
|
@ -78,51 +76,6 @@ void usbuart_set_led_state(uint8_t ledn, bool state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define USBUSART_DMA_TX_ISR_TEMPLATE(DMA_TX_CHAN) do { \
|
|
||||||
nvic_disable_irq(USB_IRQ); \
|
|
||||||
\
|
|
||||||
/* Stop DMA */ \
|
|
||||||
dma_disable_channel(USBUSART_DMA_BUS, DMA_TX_CHAN); \
|
|
||||||
dma_clear_interrupt_flags(USBUSART_DMA_BUS, DMA_TX_CHAN, DMA_CGIF); \
|
|
||||||
\
|
|
||||||
/* If new buffer is ready, continue transmission. \
|
|
||||||
* Otherwise report transfer completion. \
|
|
||||||
*/ \
|
|
||||||
if (aux_serial_transmit_buffer_fullness()) \
|
|
||||||
{ \
|
|
||||||
aux_serial_switch_transmit_buffers(); \
|
|
||||||
usbd_ep_nak_set(usbdev, CDCACM_UART_ENDPOINT, 0); \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
usbuart_set_led_state(TX_LED_ACT, false); \
|
|
||||||
aux_serial_transmit_complete = true; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
nvic_enable_irq(USB_IRQ); \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#if defined(USBUSART_DMA_TX_ISR)
|
|
||||||
void USBUSART_DMA_TX_ISR(void)
|
|
||||||
{
|
|
||||||
USBUSART_DMA_TX_ISR_TEMPLATE(USBUSART_DMA_TX_CHAN);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USBUSART1_DMA_TX_ISR)
|
|
||||||
void USBUSART1_DMA_TX_ISR(void)
|
|
||||||
{
|
|
||||||
USBUSART_DMA_TX_ISR_TEMPLATE(USBUSART1_DMA_TX_CHAN);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USBUSART2_DMA_TX_ISR)
|
|
||||||
void USBUSART2_DMA_TX_ISR(void)
|
|
||||||
{
|
|
||||||
USBUSART_DMA_TX_ISR_TEMPLATE(USBUSART2_DMA_TX_CHAN);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define USBUSART_DMA_RX_ISR_TEMPLATE(USART_IRQ, DMA_RX_CHAN) do { \
|
#define USBUSART_DMA_RX_ISR_TEMPLATE(USART_IRQ, DMA_RX_CHAN) do { \
|
||||||
nvic_disable_irq(USART_IRQ); \
|
nvic_disable_irq(USART_IRQ); \
|
||||||
\
|
\
|
||||||
|
|
Loading…
Reference in New Issue