aboutsummaryrefslogtreecommitdiff
path: root/kernel/uart.c
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-07-04 03:09:26 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-07-04 03:09:26 +0000
commit057b86c04dbd8ea82bc3320abcb8310307afde76 (patch)
tree2d6ac832062675f92709c59c743ca7bff2b777d0 /kernel/uart.c
parentdebce2c859faedf3d9ec28c1dd3d56d492277e76 (diff)
add blocking uart_getchar()
add USE_2X option
Diffstat (limited to 'kernel/uart.c')
-rw-r--r--kernel/uart.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/uart.c b/kernel/uart.c
index 63f5c11..0726a9b 100644
--- a/kernel/uart.c
+++ b/kernel/uart.c
@@ -35,6 +35,36 @@ uart_putchar(char c)
UDR = c;
}
+char
+uart_getchar(void)
+{
+ char c;
+
+ loop_until_bit_is_set(UCSRA, RXC);
+
+ if (UCSRA & _BV(FE))
+ return -2; /* EOF */
+ if (UCSRA & _BV(DOR))
+ return -1; /* ERR */
+ c = UDR;
+
+ switch (c) {
+ case '\r':
+ c = '\n';
+ break;
+ case '\n':
+ uart_putchar(c);
+ break;
+ case '\t':
+ c = ' ';
+ break;
+ default:
+ break;
+ }
+
+ return c;
+}
+
ISR(SIG_UART_RECV)
{
uint8_t c = UDR;
@@ -76,5 +106,9 @@ init_uart(void)
UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXEN);
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
+#if USE_2X
+ UCSRA |= _BV(U2X);
+#else
UCSRA &= ~_BV(U2X);
+#endif
}