aboutsummaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2018-06-25 15:55:33 +0200
committerHarald Welte <laforge@gnumonks.org>2018-06-29 20:07:31 +0200
commiteac1bec4285a48b466e9fd09b0513b3c49d393b3 (patch)
tree7f28025fa486c31854a83bc0c7b174ae18917ea7 /firmware
parent51c128bc354a324a11553febaa46955e07ef1e3d (diff)
console: use buffer and interrupts instead of busy loops for UART debug output
Diffstat (limited to 'firmware')
-rw-r--r--firmware/libboard/common/include/board_common.h10
-rw-r--r--firmware/libboard/common/source/uart_console.c55
2 files changed, 52 insertions, 13 deletions
diff --git a/firmware/libboard/common/include/board_common.h b/firmware/libboard/common/include/board_common.h
index c3bb235..8349698 100644
--- a/firmware/libboard/common/include/board_common.h
+++ b/firmware/libboard/common/include/board_common.h
@@ -65,10 +65,14 @@
/** UART0 */
/** Console baudrate always using 115200. */
#define CONSOLE_BAUDRATE 115200
-/** Usart Hw interface used by the console (UART0). */
-#define CONSOLE_USART UART0
-/** Usart Hw ID used by the console (UART0). */
+/** UART peripheral used by the console (UART0). */
+#define CONSOLE_UART UART0
+/** UART peripheral ID used by the console (UART0). */
#define CONSOLE_ID ID_UART0
+/** UART ISR used by the console (UART0). */
+#define CONSOLE_ISR UART0_IrqHandler
+/** UART IRQ used by the console (UART0). */
+#define CONSOLE_IRQ UART0_IRQn
/** Pins description corresponding to Rxd,Txd, (UART pins) */
#define CONSOLE_PINS {PINS_UART}
diff --git a/firmware/libboard/common/source/uart_console.c b/firmware/libboard/common/source/uart_console.c
index 2fda8ba..e52cd51 100644
--- a/firmware/libboard/common/source/uart_console.c
+++ b/firmware/libboard/common/source/uart_console.c
@@ -43,6 +43,8 @@
#include <stdio.h>
#include <stdint.h>
+#include "ringbuffer.h"
+
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
@@ -52,7 +54,9 @@
*----------------------------------------------------------------------------*/
/** Is Console Initialized. */
-static uint8_t _ucIsConsoleInitialized=0 ;
+static uint8_t _ucIsConsoleInitialized=0;
+/** Ring buffer to queue data to be sent */
+static ringbuf uart_tx_buffer;
/**
* \brief Configures an USART peripheral with the specified parameters.
@@ -63,7 +67,7 @@ static uint8_t _ucIsConsoleInitialized=0 ;
extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
{
const Pin pPins[] = CONSOLE_PINS;
- Uart *pUart = CONSOLE_USART;
+ Uart *pUart = CONSOLE_UART;
/* Configure PIO */
PIO_Configure(pPins, PIO_LISTSIZE(pPins));
@@ -85,12 +89,34 @@ extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
/* Disable PDC channel */
pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
+ /* Reset transmit ring buffer */
+ rbuf_reset(&uart_tx_buffer);
+
+ /* Enable TX interrupts */
+ pUart->UART_IER = UART_IER_TXRDY;
+ NVIC_EnableIRQ(CONSOLE_IRQ);
+
/* Enable receiver and transmitter */
pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
+ /* Remember the configuration is complete */
_ucIsConsoleInitialized=1 ;
}
+/** Interrupt Service routine to transmit queued data */
+void CONSOLE_ISR(void)
+{
+ Uart *uart = CONSOLE_UART;
+ if (uart->UART_SR & UART_SR_TXRDY) {
+ if (!rbuf_is_empty(&uart_tx_buffer)) {
+ //uart->UART_IER = UART_IER_TXRDY;
+ uart->UART_THR = rbuf_read(&uart_tx_buffer);
+ } else {
+ uart->UART_IDR = UART_IER_TXRDY;
+ }
+ }
+}
+
/**
* \brief Outputs a character on the UART line.
*
@@ -99,19 +125,28 @@ extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
*/
extern void UART_PutChar( uint8_t c )
{
- Uart *pUart=CONSOLE_USART ;
+ Uart *pUart = CONSOLE_UART ;
+ /* Initialize console is not already done */
if ( !_ucIsConsoleInitialized )
{
UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
}
- /* Wait for the transmitter to be ready */
- while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;
-
- /* Send character */
- pUart->UART_THR=c ;
+ /* Wait until there is space in the buffer */
+ while (rbuf_is_full(&uart_tx_buffer)) {
+ if (pUart->UART_SR & UART_SR_TXEMPTY) {
+ pUart->UART_IER = UART_IER_TXRDY;
+ CONSOLE_ISR();
+ }
+ }
+ /* Put character into buffer */
+ rbuf_write(&uart_tx_buffer, c);
+ if (pUart->UART_SR & UART_SR_TXEMPTY) {
+ pUart->UART_IER = UART_IER_TXRDY;
+ CONSOLE_ISR();
+ }
}
/**
@@ -122,7 +157,7 @@ extern void UART_PutChar( uint8_t c )
*/
extern uint32_t UART_GetChar( void )
{
- Uart *pUart=CONSOLE_USART ;
+ Uart *pUart = CONSOLE_UART ;
if ( !_ucIsConsoleInitialized )
{
@@ -142,7 +177,7 @@ extern uint32_t UART_GetChar( void )
*/
extern uint32_t UART_IsRxReady( void )
{
- Uart *pUart=CONSOLE_USART ;
+ Uart *pUart = CONSOLE_UART;
if ( !_ucIsConsoleInitialized )
{