added rx support

git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1410 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Greg Watson 2004-03-13 03:40:51 +00:00
parent 5c51c3d9d9
commit e54d55b9d9
7 changed files with 60 additions and 1 deletions

View File

@ -52,6 +52,31 @@ void console_tx_byte(unsigned char byte)
__console_tx_byte(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 * Write POST information
*/ */

View File

@ -16,4 +16,6 @@ static void logbuf_tx_byte(unsigned char byte)
static struct console_driver __console = { static struct console_driver __console = {
.init = 0, .init = 0,
.tx_byte = logbuf_tx_byte, .tx_byte = logbuf_tx_byte,
.rx_byte = 0,
.tst_byte = 0,
};} };}

View File

@ -43,8 +43,20 @@ void ttyS0_tx_byte(unsigned char data)
uart8250_tx_byte(TTYS0_BASE, 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 = { static struct console_driver uart8250_console __console = {
.init = ttyS0_init, .init = ttyS0_init,
.tx_byte = ttyS0_tx_byte, .tx_byte = ttyS0_tx_byte,
.rx_byte = ttyS0_rx_byte,
.tst_byte = ttyS0_tst_byte,
}; };

View File

@ -97,4 +97,6 @@ static void vga_tx_byte(unsigned char byte)
struct console_driver { struct console_driver {
.init = vga_init, .init = vga_init,
.tx_byte = vga_tx_byte, .tx_byte = vga_tx_byte,
.rx_byte = 0,
.tst_byte = 0,
}; };

View File

@ -7,6 +7,8 @@
void console_init(void); void console_init(void);
void console_tx_byte(unsigned char byte); void console_tx_byte(unsigned char byte);
void console_tx_flush(void); void console_tx_flush(void);
unsigned char console_rx_byte(void);
int console_tst_byte(void);
void post_code(uint8_t value); void post_code(uint8_t value);
void die(char *msg); void die(char *msg);
@ -14,6 +16,8 @@ struct console_driver {
void (*init)(void); void (*init)(void);
void (*tx_byte)(unsigned char byte); void (*tx_byte)(unsigned char byte);
void (*tx_flush)(void); void (*tx_flush)(void);
unsigned char (*rx_byte)(void);
int (*tst_byte)(void);
}; };
#define __console __attribute__((unused, __section__ (".rodata.console_drivers"))) #define __console __attribute__((unused, __section__ (".rodata.console_drivers")))

View File

@ -6,6 +6,8 @@ struct uart8250 {
/* Do I need an lcs parameter here? */ /* 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_tx_byte(unsigned base_port, unsigned char data);
void uart8250_init(unsigned base_port, unsigned divisor, unsigned lcs); void uart8250_init(unsigned base_port, unsigned divisor, unsigned lcs);
void init_uart8250(unsigned base_port, struct uart8250 *uart); void init_uart8250(unsigned base_port, struct uart8250 *uart);

View File

@ -20,7 +20,7 @@
#define UART_MSR 0x06 #define UART_MSR 0x06
#define UART_SCR 0x07 #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; 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); 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) void uart8250_init(unsigned base_port, unsigned divisor, unsigned lcs)
{ {
lcs &= 0x7f; lcs &= 0x7f;