diff --git a/src/uart.c b/src/uart.c index e98fb64..0c77475 100644 --- a/src/uart.c +++ b/src/uart.c @@ -12,29 +12,61 @@ /* http://www.cs.mun.ca/~rod/Winter2007/4723/notes/serial/serial.html */ -void uart_init(void) { +void uart0_init(void) +{ UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE; - #if USE_2X UCSR0A |= _BV(U2X0); #else UCSR0A &= ~(_BV(U2X0)); #endif - - UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */ - UCSR0B = _BV(RXEN0) | _BV(TXEN0); /* Enable RX and TX */ + UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */ + UCSR0B = _BV(RXEN0) | _BV(TXEN0); /* Enable RX and TX */ } -void uart_putchar(char c, FILE *stream) { +void uart3_init(void) +{ + UBRR3H = UBRRH_VALUE; + UBRR3L = UBRRL_VALUE; +#if USE_2X + UCSR3A |= _BV(U2X3); +#else + UCSR3A &= ~(_BV(U2X3)); +#endif + UCSR3C = _BV(UCSZ31) | _BV(UCSZ30); /* 8-bit data */ + UCSR3B = _BV(TXEN3); /* Enable RX and TX */ +} + +int uart0_putchar(char c, FILE *stream) +{ + (void) stream; + if (c == '\n') { - uart_putchar('\r', stream); + uart0_putchar('\r', stream); } + loop_until_bit_is_set(UCSR0A, UDRE0); UDR0 = c; + return 0; } -char uart_getchar(FILE *stream) { +int uart3_putchar(char c, FILE *stream) +{ + (void) stream; + + if (c == '\n') { + uart3_putchar('\r', stream); + } + + loop_until_bit_is_set(UCSR3A, UDRE3); + UDR3 = c; + return 0; +} + +int uart0_getchar(FILE *stream) +{ + (void) stream; loop_until_bit_is_set(UCSR0A, RXC0); return UDR0; } diff --git a/src/uart.h b/src/uart.h index b2c6cde..6667ab1 100644 --- a/src/uart.h +++ b/src/uart.h @@ -1,9 +1,12 @@ -void uart_putchar(char c, FILE *stream); -char uart_getchar(FILE *stream); +int uart0_putchar(char c, FILE *stream); +int uart0_getchar(FILE *stream); -void uart_init(void); +int uart3_putchar(char c, FILE *stream); + +void uart0_init(void); +void uart3_init(void); /* http://www.ermicro.com/blog/?p=325 */ -FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); -FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); +FILE uart0_io = FDEV_SETUP_STREAM(uart0_putchar, uart0_getchar, _FDEV_SETUP_RW); +FILE uart3_out = FDEV_SETUP_STREAM(uart3_putchar, NULL, _FDEV_SETUP_WRITE);