bitvend/usb-interface/firmware/stdio.c

95 lines
2.4 KiB
C

#include <libopencm3/cm3/nvic.h>
#include <libopencm3/stm32/dbgmcu.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/timer.h>
#include <libopencm3/stm32/usart.h>
#include <libopencm3/usb/cdc.h>
#include <libopencm3/usb/usbd.h>
#include <libopencmsis/core_cm3.h>
#include "fifo.h"
#include "iobuffers.h"
#include "usb.h"
uint8_t tx_buffer[1024];
uint8_t rx_buffer[1024];
fifo tx_fifo;
fifo rx_fifo;
void stdio_init(void);
#ifdef STDIO_USB
usbd_device* usbd_dev;
void usb_hp_can_tx_isr(void){
usbd_poll(usbd_dev);
}
void usb_lp_can_rx0_isr(void){
usbd_poll(usbd_dev);
}
#endif
#ifdef STDIO_UART
void usart1_isr(void) {
uint8_t data;
/* RXNE interrupt handling */
if (((USART_CR1(USART1) & USART_CR1_RXNEIE) != 0) &&
((USART_SR(USART1) & USART_SR_RXNE) != 0)) {
data = usart_recv(USART1);
if(!fifoFull(&rx_fifo))
fifoPush(&rx_fifo, data);
}
/* TXE interrupt handling */
if (((USART_CR1(USART1) & USART_CR1_TXEIE) != 0) &&
((USART_SR(USART1) & USART_SR_TXE) != 0)) {
if(!fifoEmpty(&tx_fifo)){
data = fifoPop(&tx_fifo);
usart_send(USART1, data);
} else {
/* disable TXE interrupt if buffer empty */
USART_CR1(USART1) &= ~USART_CR1_TXEIE;
}
}
}
#endif
void stdio_init(void) {
/* init data structures */
fifoInit(&tx_fifo, tx_buffer, 1024);
fifoInit(&rx_fifo, rx_buffer, 1024);
#ifdef STDIO_UART
/* usart configuration */
rcc_periph_clock_enable(RCC_USART1);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_USART1_TX);
gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOAT, GPIO_USART1_RX);
usart_set_baudrate(USART1, 115200);
usart_set_databits(USART1, 8);
usart_set_stopbits(USART1, USART_STOPBITS_1);
usart_set_parity(USART1, USART_PARITY_NONE);
usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
usart_set_mode(USART1, USART_MODE_TX_RX);
USART_CR1(USART1) |= USART_CR1_RXNEIE; // enable interrupt
usart_enable(USART1);
#endif
#ifdef STDIO_USB
/* usb configuration */
rcc_set_usbpre(RCC_CFGR_USBPRE_PLL_CLK_DIV1_5);
usbd_dev = usb_init();
usbd_poll(usbd_dev);
nvic_enable_irq(NVIC_USB_HP_CAN_TX_IRQ);
nvic_enable_irq(NVIC_USB_LP_CAN_RX0_IRQ);
nvic_set_priority(NVIC_USB_HP_CAN_TX_IRQ, 1);
nvic_set_priority(NVIC_USB_LP_CAN_RX0_IRQ, 1);
#endif
}