X-Git-Url: http://git.droids-corp.org/?p=aversive.git;a=blobdiff_plain;f=modules%2Fcomm%2Fuart%2Fuart_recv_nowait.c;h=2872d21a0f5438e7f6732a36c49903b9d8a32409;hp=c4c1a0455a63f361e249efc273028d12f59ed3da;hb=6d8949fd4fc3a1e65ff060cfbdb5e405efe15c6c;hpb=daf4ef7d2b5222632a5313841f84cf09810827c3;ds=sidebyside diff --git a/modules/comm/uart/uart_recv_nowait.c b/modules/comm/uart/uart_recv_nowait.c index c4c1a04..2872d21 100644 --- a/modules/comm/uart/uart_recv_nowait.c +++ b/modules/comm/uart/uart_recv_nowait.c @@ -31,13 +31,23 @@ int uart_recv_nowait(uint8_t num) char elt = 0; uint8_t flags; - IRQ_LOCK(flags); - if( !CIRBUF_IS_EMPTY(&g_rx_fifo[num]) ) { - elt = cirbuf_get_tail(&g_rx_fifo[num]); - cirbuf_del_tail(&g_rx_fifo[num]); + /* if interrupt mode is off, we have to check the status + * register */ + if (!(*uart_regs[num].ucsrb & (1 << RXCIE))) { + if ( !(*uart_regs[num].ucsra & (1 << RXC)) ) + return -1; + return uart_get_udr(num); + } + /* else check the fifo */ + else { + IRQ_LOCK(flags); + if( !CIRBUF_IS_EMPTY(&g_rx_fifo[num]) ) { + elt = cirbuf_get_tail(&g_rx_fifo[num]); + cirbuf_del_tail(&g_rx_fifo[num]); + IRQ_UNLOCK(flags); + return (int)elt; + } IRQ_UNLOCK(flags); - return (int)elt; + return -1; } - IRQ_UNLOCK(flags); - return (-1); }