added rx support
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1410 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
5c51c3d9d9
commit
e54d55b9d9
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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,
|
||||||
};}
|
};}
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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")))
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue