usbuart: Moved usbuart_usb_out_cb() into usb_serial.c
This commit is contained in:
parent
9afa946703
commit
693c408b98
|
@ -52,13 +52,17 @@
|
||||||
#include <libopencm3/cm3/cortex.h>
|
#include <libopencm3/cm3/cortex.h>
|
||||||
#include <libopencm3/cm3/nvic.h>
|
#include <libopencm3/cm3/nvic.h>
|
||||||
#include <libopencm3/usb/cdc.h>
|
#include <libopencm3/usb/cdc.h>
|
||||||
|
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||||
|
#include <libopencm3/stm32/rcc.h>
|
||||||
#include <libopencm3/stm32/dma.h>
|
#include <libopencm3/stm32/dma.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool gdb_uart_dtr = true;
|
static bool gdb_uart_dtr = true;
|
||||||
|
|
||||||
static void usb_serial_set_state(usbd_device *dev, uint16_t iface, uint8_t ep);
|
static void usb_serial_set_state(usbd_device *dev, uint16_t iface, uint8_t ep);
|
||||||
|
|
||||||
static void debug_uart_send_callback(usbd_device *dev, uint8_t ep);
|
static void debug_uart_send_callback(usbd_device *dev, uint8_t ep);
|
||||||
|
static void usbuart_usb_out_cb(usbd_device *dev, uint8_t ep);
|
||||||
|
|
||||||
#ifdef ENABLE_DEBUG
|
#ifdef ENABLE_DEBUG
|
||||||
/*
|
/*
|
||||||
|
@ -304,6 +308,59 @@ static void debug_uart_send_callback(usbd_device *dev, uint8_t ep)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ENABLE_RTT
|
||||||
|
static void usbuart_usb_out_cb(usbd_device *dev, uint8_t ep)
|
||||||
|
{
|
||||||
|
(void)ep;
|
||||||
|
|
||||||
|
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||||
|
usbd_ep_nak_set(dev, CDCACM_UART_ENDPOINT, 1);
|
||||||
|
|
||||||
|
/* Read new packet directly into TX buffer */
|
||||||
|
char *const tx_buf_ptr = &buf_tx[buf_tx_act_idx * TX_BUF_SIZE];
|
||||||
|
const uint16_t len = usbd_ep_read_packet(dev, CDCACM_UART_ENDPOINT, tx_buf_ptr + buf_tx_act_sz, CDCACM_PACKET_SIZE);
|
||||||
|
|
||||||
|
#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, CDCACM_UART_ENDPOINT, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
buf_tx_act_sz += len;
|
||||||
|
|
||||||
|
/* If DMA is idle, schedule new transfer */
|
||||||
|
if (tx_trfr_cplt)
|
||||||
|
{
|
||||||
|
tx_trfr_cplt = false;
|
||||||
|
usbuart_change_dma_tx_buf();
|
||||||
|
|
||||||
|
/* 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, CDCACM_UART_ENDPOINT, 0);
|
||||||
|
#elif defined(LM4F)
|
||||||
|
char buf[CDCACM_PACKET_SIZE];
|
||||||
|
int len = usbd_ep_read_packet(dev, CDCACM_UART_ENDPOINT,
|
||||||
|
buf, CDCACM_PACKET_SIZE);
|
||||||
|
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
uart_send_blocking(USBUART, buf[i]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* newlib defines _write as a weak link'd function for user code to override.
|
* newlib defines _write as a weak link'd function for user code to override.
|
||||||
*
|
*
|
||||||
|
|
|
@ -20,18 +20,16 @@
|
||||||
#ifndef __USBUART_H
|
#ifndef __USBUART_H
|
||||||
#define __USBUART_H
|
#define __USBUART_H
|
||||||
|
|
||||||
#include <libopencm3/usb/usbd.h>
|
|
||||||
|
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
|
|
||||||
void usbuart_usb_out_cb(usbd_device *dev, uint8_t ep);
|
|
||||||
|
|
||||||
void usbuart_set_led_state(uint8_t ledn, bool state);
|
void usbuart_set_led_state(uint8_t ledn, bool state);
|
||||||
|
void usbuart_change_dma_tx_buf(void);
|
||||||
void debug_uart_run(void);
|
void debug_uart_run(void);
|
||||||
|
|
||||||
#define TX_LED_ACT (1 << 0)
|
#define TX_LED_ACT (1 << 0)
|
||||||
#define RX_LED_ACT (1 << 1)
|
#define RX_LED_ACT (1 << 1)
|
||||||
|
|
||||||
|
#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4)
|
||||||
/* F072 with st_usbfs_v2_usb_drive drops characters at the 64 byte boundary!*/
|
/* F072 with st_usbfs_v2_usb_drive drops characters at the 64 byte boundary!*/
|
||||||
#if !defined(USART_DMA_BUF_SIZE)
|
#if !defined(USART_DMA_BUF_SIZE)
|
||||||
# define USART_DMA_BUF_SIZE 128
|
# define USART_DMA_BUF_SIZE 128
|
||||||
|
@ -39,6 +37,12 @@ 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)
|
||||||
|
|
||||||
|
/* TX double buffer */
|
||||||
|
extern char buf_tx[TX_BUF_SIZE * 2];
|
||||||
|
/* Active buffer part idx */
|
||||||
|
extern uint8_t buf_tx_act_idx;
|
||||||
|
/* Active buffer part used capacity */
|
||||||
|
extern uint8_t buf_tx_act_sz;
|
||||||
/* TX transfer complete */
|
/* TX transfer complete */
|
||||||
extern bool tx_trfr_cplt;
|
extern bool tx_trfr_cplt;
|
||||||
/* RX Fifo buffer with space for copy fn overrun */
|
/* RX Fifo buffer with space for copy fn overrun */
|
||||||
|
@ -56,5 +60,15 @@ extern uint8_t usb_dbg_in;
|
||||||
/* Debug Fifo out pointer */
|
/* Debug Fifo out pointer */
|
||||||
extern uint8_t usb_dbg_out;
|
extern uint8_t usb_dbg_out;
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(LM4F)
|
||||||
|
#define FIFO_SIZE 128
|
||||||
|
|
||||||
|
/* RX Fifo buffer */
|
||||||
|
extern char buf_rx[FIFO_SIZE];
|
||||||
|
/* Fifo in pointer, writes assumed to be atomic, should be only incremented within RX ISR */
|
||||||
|
extern uint8_t buf_rx_in;
|
||||||
|
/* Fifo out pointer, writes assumed to be atomic, should be only incremented outside RX ISR */
|
||||||
|
extern uint8_t buf_rx_out;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,11 +50,11 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TX double buffer */
|
/* TX double buffer */
|
||||||
static uint8_t buf_tx[TX_BUF_SIZE * 2];
|
char buf_tx[TX_BUF_SIZE * 2];
|
||||||
/* Active buffer part idx */
|
/* Active buffer part idx */
|
||||||
static uint8_t buf_tx_act_idx;
|
uint8_t buf_tx_act_idx;
|
||||||
/* Active buffer part used capacity */
|
/* Active buffer part used capacity */
|
||||||
static uint8_t buf_tx_act_sz;
|
uint8_t buf_tx_act_sz;
|
||||||
/* TX transfer complete */
|
/* TX transfer complete */
|
||||||
bool tx_trfr_cplt = true;
|
bool tx_trfr_cplt = true;
|
||||||
/* RX Fifo buffer with space for copy fn overrun */
|
/* RX Fifo buffer with space for copy fn overrun */
|
||||||
|
@ -186,13 +186,13 @@ void aux_serial_init(void)
|
||||||
* Changes USBUSART TX buffer in which data is accumulated from USB.
|
* Changes USBUSART TX buffer in which data is accumulated from USB.
|
||||||
* Filled buffer is submitted to DMA for transfer.
|
* Filled buffer is submitted to DMA for transfer.
|
||||||
*/
|
*/
|
||||||
static void usbuart_change_dma_tx_buf(void)
|
void usbuart_change_dma_tx_buf(void)
|
||||||
{
|
{
|
||||||
/* Select buffer for transmission */
|
/* Select buffer for transmission */
|
||||||
uint8_t *const tx_buf_ptr = &buf_tx[buf_tx_act_idx * TX_BUF_SIZE];
|
char *const tx_buf_ptr = &buf_tx[buf_tx_act_idx * TX_BUF_SIZE];
|
||||||
|
|
||||||
/* Configure DMA */
|
/* Configure DMA */
|
||||||
dma_set_memory_address(USBUSART_DMA_BUS, USBUSART_DMA_TX_CHAN, (uint32_t)tx_buf_ptr);
|
dma_set_memory_address(USBUSART_DMA_BUS, USBUSART_DMA_TX_CHAN, (uintptr_t)tx_buf_ptr);
|
||||||
dma_set_number_of_data(USBUSART_DMA_BUS, USBUSART_DMA_TX_CHAN, buf_tx_act_sz);
|
dma_set_number_of_data(USBUSART_DMA_BUS, USBUSART_DMA_TX_CHAN, buf_tx_act_sz);
|
||||||
dma_enable_channel(USBUSART_DMA_BUS, USBUSART_DMA_TX_CHAN);
|
dma_enable_channel(USBUSART_DMA_BUS, USBUSART_DMA_TX_CHAN);
|
||||||
|
|
||||||
|
@ -201,51 +201,6 @@ static void usbuart_change_dma_tx_buf(void)
|
||||||
buf_tx_act_idx ^= 1;
|
buf_tx_act_idx ^= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ENABLE_RTT
|
|
||||||
void usbuart_usb_out_cb(usbd_device *dev, uint8_t ep)
|
|
||||||
{
|
|
||||||
(void)ep;
|
|
||||||
|
|
||||||
usbd_ep_nak_set(dev, CDCACM_UART_ENDPOINT, 1);
|
|
||||||
|
|
||||||
/* Read new packet directly into TX buffer */
|
|
||||||
uint8_t *const tx_buf_ptr = &buf_tx[buf_tx_act_idx * TX_BUF_SIZE];
|
|
||||||
const uint16_t len = usbd_ep_read_packet(dev, CDCACM_UART_ENDPOINT,
|
|
||||||
tx_buf_ptr + buf_tx_act_sz, CDCACM_PACKET_SIZE);
|
|
||||||
|
|
||||||
#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, CDCACM_UART_ENDPOINT, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (len)
|
|
||||||
{
|
|
||||||
buf_tx_act_sz += len;
|
|
||||||
|
|
||||||
/* If DMA is idle, schedule new transfer */
|
|
||||||
if (tx_trfr_cplt)
|
|
||||||
{
|
|
||||||
tx_trfr_cplt = false;
|
|
||||||
usbuart_change_dma_tx_buf();
|
|
||||||
|
|
||||||
/* 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, CDCACM_UART_ENDPOINT, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USART_ICR)
|
#if defined(USART_ICR)
|
||||||
#define USBUSART_ISR_TEMPLATE(USART, DMA_IRQ) do { \
|
#define USBUSART_ISR_TEMPLATE(USART, DMA_IRQ) do { \
|
||||||
nvic_disable_irq(DMA_IRQ); \
|
nvic_disable_irq(DMA_IRQ); \
|
||||||
|
|
|
@ -33,11 +33,11 @@
|
||||||
#define FIFO_SIZE 128
|
#define FIFO_SIZE 128
|
||||||
|
|
||||||
/* RX Fifo buffer */
|
/* RX Fifo buffer */
|
||||||
static uint8_t buf_rx[FIFO_SIZE];
|
char buf_rx[FIFO_SIZE];
|
||||||
/* Fifo in pointer, writes assumed to be atomic, should be only incremented within RX ISR */
|
/* Fifo in pointer, writes assumed to be atomic, should be only incremented within RX ISR */
|
||||||
static uint8_t buf_rx_in;
|
uint8_t buf_rx_in;
|
||||||
/* Fifo out pointer, writes assumed to be atomic, should be only incremented outside RX ISR */
|
/* Fifo out pointer, writes assumed to be atomic, should be only incremented outside RX ISR */
|
||||||
static uint8_t buf_rx_out;
|
uint8_t buf_rx_out;
|
||||||
|
|
||||||
void aux_serial_init(void)
|
void aux_serial_init(void)
|
||||||
{
|
{
|
||||||
|
@ -76,20 +76,6 @@ void aux_serial_init(void)
|
||||||
nvic_enable_irq(USBUART_IRQ);
|
nvic_enable_irq(USBUART_IRQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef ENABLE_RTT
|
|
||||||
void usbuart_usb_out_cb(usbd_device *dev, uint8_t ep)
|
|
||||||
{
|
|
||||||
(void)ep;
|
|
||||||
|
|
||||||
char buf[CDCACM_PACKET_SIZE];
|
|
||||||
int len = usbd_ep_read_packet(dev, CDCACM_UART_ENDPOINT,
|
|
||||||
buf, CDCACM_PACKET_SIZE);
|
|
||||||
|
|
||||||
for(int i = 0; i < len; i++)
|
|
||||||
uart_send_blocking(USBUART, buf[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read a character from the UART RX and stuff it in a software FIFO.
|
* Read a character from the UART RX and stuff it in a software FIFO.
|
||||||
* Allowed to read from FIFO out pointer, but not write to it.
|
* Allowed to read from FIFO out pointer, but not write to it.
|
||||||
|
|
Loading…
Reference in New Issue