aux_serial: Moved all the transmit logic into aux_serial.c and cleaned up in usb_serial.c
This commit is contained in:
parent
b94476841f
commit
dd619ad808
|
@ -37,6 +37,8 @@
|
|||
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||
static char aux_serial_transmit_buffer[2U][TX_BUF_SIZE];
|
||||
static uint8_t aux_serial_transmit_buffer_index;
|
||||
/* Active buffer part used capacity */
|
||||
static uint8_t buf_tx_act_sz;
|
||||
#elif defined(LM4F)
|
||||
static char aux_serial_transmit_buffer[FIFO_SIZE];
|
||||
#endif
|
||||
|
@ -87,6 +89,11 @@ char *aux_serial_current_transmit_buffer(void)
|
|||
return aux_serial_transmit_buffer[aux_serial_transmit_buffer_index];
|
||||
}
|
||||
|
||||
size_t aux_serial_transmit_buffer_fullness(void)
|
||||
{
|
||||
return buf_tx_act_sz;
|
||||
}
|
||||
|
||||
/*
|
||||
* Changes USBUSART TX buffer in which data is accumulated from USB.
|
||||
* Filled buffer is submitted to DMA for transfer.
|
||||
|
@ -102,10 +109,35 @@ void aux_serial_switch_transmit_buffers(void)
|
|||
buf_tx_act_sz = 0;
|
||||
aux_serial_transmit_buffer_index ^= 1;
|
||||
}
|
||||
#elif defined(LM4F)
|
||||
|
||||
void aux_serial_send(const size_t len)
|
||||
{
|
||||
buf_tx_act_sz += len;
|
||||
|
||||
/* If DMA is idle, schedule new transfer */
|
||||
if (len && tx_trfr_cplt)
|
||||
{
|
||||
tx_trfr_cplt = false;
|
||||
aux_serial_switch_transmit_buffers();
|
||||
|
||||
/* Enable LED */
|
||||
usbuart_set_led_state(TX_LED_ACT, true);
|
||||
}
|
||||
}
|
||||
#elif defined(LM4F)
|
||||
char *aux_serial_current_transmit_buffer(void)
|
||||
{
|
||||
return aux_serial_transmit_buffer;
|
||||
}
|
||||
|
||||
size_t aux_serial_transmit_buffer_fullness(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void aux_serial_send(const size_t len)
|
||||
{
|
||||
for(size_t i = 0; i < len; ++i)
|
||||
uart_send_blocking(USBUART, aux_serial_transmit_buffer[i]);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -20,15 +20,22 @@
|
|||
#ifndef AUX_SERIAL_H
|
||||
#define AUX_SERIAL_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <libopencm3/usb/usbd.h>
|
||||
#include <libopencm3/usb/cdc.h>
|
||||
|
||||
void aux_serial_init(void);
|
||||
void aux_serial_set_encoding(struct usb_cdc_line_coding *coding);
|
||||
char *aux_serial_current_transmit_buffer(void);
|
||||
|
||||
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||
void aux_serial_switch_transmit_buffers(void);
|
||||
#endif
|
||||
|
||||
/* Get the current transmit buffer to stage data into */
|
||||
char *aux_serial_current_transmit_buffer(void);
|
||||
/* Get how full the current transmit buffer is */
|
||||
size_t aux_serial_transmit_buffer_fullness(void);
|
||||
/* Send a number of bytes staged into the current transmit bufer */
|
||||
void aux_serial_send(size_t len);
|
||||
|
||||
#endif /*AUX_SERIAL_H*/
|
||||
|
|
|
@ -311,50 +311,23 @@ static void debug_uart_send_callback(usbd_device *dev, uint8_t ep)
|
|||
#ifndef ENABLE_RTT
|
||||
static void debug_uart_receive_callback(usbd_device *dev, uint8_t ep)
|
||||
{
|
||||
char *const transmit_buffer = aux_serial_current_transmit_buffer()
|
||||
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||
+ buf_tx_act_sz
|
||||
#endif
|
||||
;
|
||||
|
||||
char *const transmit_buffer = aux_serial_current_transmit_buffer() + aux_serial_transmit_buffer_fullness();
|
||||
const uint16_t len = usbd_ep_read_packet(dev, ep, transmit_buffer, CDCACM_PACKET_SIZE);
|
||||
|
||||
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||
usbd_ep_nak_set(dev, ep, 1);
|
||||
|
||||
#if defined(BLACKMAGIC)
|
||||
/* Don't bother if uart is disabled.
|
||||
* This will be the case on mini while we're being debugged.
|
||||
*/
|
||||
if(!(RCC_APB2ENR & RCC_APB2ENR_USART1EN) &&
|
||||
!(RCC_APB1ENR & RCC_APB1ENR_USART2EN))
|
||||
{
|
||||
usbd_ep_nak_set(dev, ep, 0);
|
||||
if (!(RCC_APB2ENR & RCC_APB2ENR_USART1EN) && !(RCC_APB1ENR & RCC_APB1ENR_USART2EN))
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (len)
|
||||
{
|
||||
buf_tx_act_sz += len;
|
||||
aux_serial_send(len);
|
||||
|
||||
/* If DMA is idle, schedule new transfer */
|
||||
if (tx_trfr_cplt)
|
||||
{
|
||||
tx_trfr_cplt = false;
|
||||
aux_serial_switch_transmit_buffers();
|
||||
|
||||
/* Enable LED */
|
||||
usbuart_set_led_state(TX_LED_ACT, true);
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable USBUART TX packet reception if buffer has enough space */
|
||||
if (TX_BUF_SIZE - buf_tx_act_sz >= CDCACM_PACKET_SIZE)
|
||||
usbd_ep_nak_set(dev, ep, 0);
|
||||
#elif defined(LM4F)
|
||||
for(uint16_t i = 0; i < len; i++)
|
||||
uart_send_blocking(USBUART, transmit_buffer[i]);
|
||||
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||
/* Disable USBUART TX packet reception if buffer does not have enough space */
|
||||
if (TX_BUF_SIZE - aux_serial_transmit_buffer_fullness() < CDCACM_PACKET_SIZE)
|
||||
usbd_ep_nak_set(dev, ep, 1);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -41,8 +41,6 @@ void debug_uart_run(void);
|
|||
#define RX_FIFO_SIZE (USART_DMA_BUF_SIZE)
|
||||
#define TX_BUF_SIZE (USART_DMA_BUF_SIZE)
|
||||
|
||||
/* Active buffer part used capacity */
|
||||
extern uint8_t buf_tx_act_sz;
|
||||
/* TX transfer complete */
|
||||
extern bool tx_trfr_cplt;
|
||||
/* RX Fifo buffer with space for copy fn overrun */
|
||||
|
|
|
@ -49,8 +49,6 @@
|
|||
#define DMA_CGIF DMA_IFCR_CGIF_BIT
|
||||
#endif
|
||||
|
||||
/* Active buffer part used capacity */
|
||||
uint8_t buf_tx_act_sz;
|
||||
/* TX transfer complete */
|
||||
bool tx_trfr_cplt = true;
|
||||
/* RX Fifo buffer with space for copy fn overrun */
|
||||
|
@ -257,7 +255,7 @@ void USBUSART2_ISR(void)
|
|||
/* If new buffer is ready, continue transmission. \
|
||||
* Otherwise report transfer completion. \
|
||||
*/ \
|
||||
if (buf_tx_act_sz) \
|
||||
if (aux_serial_transmit_buffer_fullness()) \
|
||||
{ \
|
||||
aux_serial_switch_transmit_buffers(); \
|
||||
usbd_ep_nak_set(usbdev, CDCACM_UART_ENDPOINT, 0); \
|
||||
|
|
Loading…
Reference in New Issue