diff options
-rw-r--r-- | src/console/console.c | 25 | ||||
-rw-r--r-- | src/console/logbuf_console.c | 2 | ||||
-rw-r--r-- | src/console/uart8250_console.c | 12 | ||||
-rw-r--r-- | src/console/vga_console.c | 2 | ||||
-rw-r--r-- | src/include/console/console.h | 4 | ||||
-rw-r--r-- | src/include/uart8250.h | 2 | ||||
-rw-r--r-- | src/lib/uart8250.c | 14 |
7 files changed, 60 insertions, 1 deletions
diff --git a/src/console/console.c b/src/console/console.c index 5ec936d8ab..b97ee8e1d5 100644 --- a/src/console/console.c +++ b/src/console/console.c @@ -52,6 +52,31 @@ void console_tx_byte(unsigned char byte) __console_tx_byte(byte); } +unsigned char console_rx_byte(void) +{ + struct console_driver *driver; + if (!initialized) + return 0; + for(driver = console_drivers; driver < econsole_drivers; driver++) + if (driver->tst_byte) + break; + if (driver == econsole_drivers) + return 0; + while (!driver->tst_byte()); + return driver->rx_byte(); +} + +int console_tst_byte(void) +{ + struct console_driver *driver; + if (!initialized) + return 0; + for(driver = console_drivers; driver < econsole_drivers; driver++) + if (driver->tst_byte) + return driver->tst_byte(); + return 0; +} + /* * Write POST information */ diff --git a/src/console/logbuf_console.c b/src/console/logbuf_console.c index e605ae5c23..00185d383c 100644 --- a/src/console/logbuf_console.c +++ b/src/console/logbuf_console.c @@ -16,4 +16,6 @@ static void logbuf_tx_byte(unsigned char byte) static struct console_driver __console = { .init = 0, .tx_byte = logbuf_tx_byte, + .rx_byte = 0, + .tst_byte = 0, };} diff --git a/src/console/uart8250_console.c b/src/console/uart8250_console.c index bb51d0f363..333693befb 100644 --- a/src/console/uart8250_console.c +++ b/src/console/uart8250_console.c @@ -43,8 +43,20 @@ void ttyS0_tx_byte(unsigned char data) uart8250_tx_byte(TTYS0_BASE, data); } +unsigned char ttyS0_rx_byte(void) +{ + return uart8250_rx_byte(TTYS0_BASE); +} + +int ttyS0_tst_byte(unsigned char data) +{ + return uart8250_can_rx_byte(TTYS0_BASE); +} + static struct console_driver uart8250_console __console = { .init = ttyS0_init, .tx_byte = ttyS0_tx_byte, + .rx_byte = ttyS0_rx_byte, + .tst_byte = ttyS0_tst_byte, }; diff --git a/src/console/vga_console.c b/src/console/vga_console.c index ffd6699529..8dcbe07db1 100644 --- a/src/console/vga_console.c +++ b/src/console/vga_console.c @@ -97,4 +97,6 @@ static void vga_tx_byte(unsigned char byte) struct console_driver { .init = vga_init, .tx_byte = vga_tx_byte, + .rx_byte = 0, + .tst_byte = 0, }; diff --git a/src/include/console/console.h b/src/include/console/console.h index ffb17d4c9b..aeb5895587 100644 --- a/src/include/console/console.h +++ b/src/include/console/console.h @@ -7,6 +7,8 @@ void console_init(void); void console_tx_byte(unsigned char byte); void console_tx_flush(void); +unsigned char console_rx_byte(void); +int console_tst_byte(void); void post_code(uint8_t value); void die(char *msg); @@ -14,6 +16,8 @@ struct console_driver { void (*init)(void); void (*tx_byte)(unsigned char byte); void (*tx_flush)(void); + unsigned char (*rx_byte)(void); + int (*tst_byte)(void); }; #define __console __attribute__((unused, __section__ (".rodata.console_drivers"))) diff --git a/src/include/uart8250.h b/src/include/uart8250.h index f610026614..dc09315dea 100644 --- a/src/include/uart8250.h +++ b/src/include/uart8250.h @@ -6,6 +6,8 @@ struct uart8250 { /* Do I need an lcs parameter here? */ }; +unsigned char uart8250_rx_byte(unsigned base_port); +int uart8250_can_rx_byte(unsigned base_port); void uart8250_tx_byte(unsigned base_port, unsigned char data); void uart8250_init(unsigned base_port, unsigned divisor, unsigned lcs); void init_uart8250(unsigned base_port, struct uart8250 *uart); diff --git a/src/lib/uart8250.c b/src/lib/uart8250.c index 67b0a95cfb..e3a1255dc6 100644 --- a/src/lib/uart8250.c +++ b/src/lib/uart8250.c @@ -20,7 +20,7 @@ #define UART_MSR 0x06 #define UART_SCR 0x07 -static inline int uart8250_can_tx_byte(unsigned base_port) +static int uart8250_can_tx_byte(unsigned base_port) { return inb(base_port + UART_LSR) & 0x20; } @@ -45,6 +45,18 @@ void uart8250_tx_byte(unsigned base_port, unsigned char data) uart8250_wait_until_sent(base_port); } +int uart8250_can_rx_byte(unsigned base_port) +{ + return inb(base_port + UART_LSR) & 0x01; +} + +unsigned char uart8250_rx_byte(unsigned base_port) +{ + while(!uart8250_can_rx_byte(base_port)) + ; + return inb(base_port + UART_RBR); +} + void uart8250_init(unsigned base_port, unsigned divisor, unsigned lcs) { lcs &= 0x7f; |