diff options
Diffstat (limited to 'src/lpc/ao_serial_lpc.c')
-rw-r--r-- | src/lpc/ao_serial_lpc.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/lpc/ao_serial_lpc.c b/src/lpc/ao_serial_lpc.c index 4ecaa175..c0424699 100644 --- a/src/lpc/ao_serial_lpc.c +++ b/src/lpc/ao_serial_lpc.c @@ -20,7 +20,10 @@ struct ao_fifo ao_usart_rx_fifo; struct ao_fifo ao_usart_tx_fifo; -uint8_t ao_usart_tx_started; +uint8_t ao_usart_tx_avail; +uint8_t ao_usart_tx_avail_min; + +#define LPC_USART_TX_FIFO_SIZE 16 void ao_debug_out(char c) @@ -35,9 +38,10 @@ ao_debug_out(char c) static void _ao_serial_tx_start(void) { - if (!ao_fifo_empty(ao_usart_tx_fifo) & !ao_usart_tx_started) - { - ao_usart_tx_started = 1; + if (!ao_fifo_empty(ao_usart_tx_fifo) && ao_usart_tx_avail) { + ao_usart_tx_avail--; + if (ao_usart_tx_avail < ao_usart_tx_avail_min) + ao_usart_tx_avail_min = ao_usart_tx_avail; ao_fifo_remove(ao_usart_tx_fifo, lpc_usart.rbr_thr); } } @@ -56,7 +60,7 @@ lpc_usart_isr(void) ao_wakeup(&ao_stdin_ready); } if (lpc_usart.lsr & (1 << LPC_USART_LSR_THRE)) { - ao_usart_tx_started = 0; + ao_usart_tx_avail = LPC_USART_TX_FIFO_SIZE; _ao_serial_tx_start(); ao_wakeup(&ao_usart_tx_fifo); } @@ -162,6 +166,9 @@ ao_serial_init(void) (1 << LPC_USART_FCR_TXFIFORES) | (LPC_USART_FCR_RXTL_1 << LPC_USART_FCR_RXTL)); + ao_usart_tx_avail = LPC_USART_TX_FIFO_SIZE; + ao_usart_tx_avail_min = LPC_USART_TX_FIFO_SIZE; + /* 8 n 1 */ lpc_usart.lcr = ((LPC_USART_LCR_WLS_8 << LPC_USART_LCR_WLS) | (LPC_USART_LCR_SBS_1 << LPC_USART_LCR_SBS) | |