summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/console/console.c25
-rw-r--r--src/console/logbuf_console.c2
-rw-r--r--src/console/uart8250_console.c12
-rw-r--r--src/console/vga_console.c2
-rw-r--r--src/include/console/console.h4
-rw-r--r--src/include/uart8250.h2
-rw-r--r--src/lib/uart8250.c14
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;