From 831db76ff7275ae33cfb95ba9b7cfed337464ebd Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Wed, 4 Jun 2008 21:00:46 +0100 Subject: [Serial] Split serial console from serial driver --- src/core/config.c | 2 +- src/core/serial.c | 42 +++++++++++++----------------------------- src/core/serial_console.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 src/core/serial_console.c (limited to 'src/core') diff --git a/src/core/config.c b/src/core/config.c index 402cba90f..efb82809d 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -54,7 +54,7 @@ REQUIRE_OBJECT ( bios_console ); #endif #ifdef CONSOLE_SERIAL -REQUIRE_OBJECT ( serial ); +REQUIRE_OBJECT ( serial_console ); #endif #ifdef CONSOLE_DIRECT_VGA REQUIRE_OBJECT ( video_subr ); diff --git a/src/core/serial.c b/src/core/serial.c index a5b3f9135..54c229549 100644 --- a/src/core/serial.c +++ b/src/core/serial.c @@ -12,10 +12,10 @@ */ #include "stddef.h" -#include "console.h" #include #include "io.h" #include +#include #include "config/serial.h" /* Set default values if none specified */ @@ -91,13 +91,11 @@ #define uart_writeb(val,addr) outb((val),(addr)) #endif -struct console_driver serial_console __console_driver; - /* * void serial_putc(int ch); * Write character `ch' to port UART_BASE. */ -static void serial_putc ( int ch ) { +void serial_putc ( int ch ) { int i; int status; i = 1000; /* timeout */ @@ -116,7 +114,7 @@ static void serial_putc ( int ch ) { * int serial_getc(void); * Read a character from port UART_BASE. */ -static int serial_getc ( void ) { +int serial_getc ( void ) { int status; int ch; do { @@ -135,7 +133,7 @@ static int serial_getc ( void ) { * If there is a character in the input buffer of port UART_BASE, * return nonzero; otherwise return 0. */ -static int serial_ischar ( void ) { +int serial_ischar ( void ) { int status; status = uart_readb(UART_BASE + UART_LSR); /* line status reg; */ return status & 1; /* rx char available */ @@ -217,7 +215,6 @@ static void serial_init ( void ) { /* line status reg */ status = uart_readb(UART_BASE + UART_LSR); } while(status & UART_LSR_DR); - serial_console.disabled = 0; out: return; } @@ -229,10 +226,6 @@ static void serial_init ( void ) { */ static void serial_fini ( void ) { int i, status; - if (serial_console.disabled) { - /* no serial interface */ - return; - } /* Flush the output buffer to avoid dropping characters, * if we are reinitializing the serial port. */ @@ -243,26 +236,17 @@ static void serial_fini ( void ) { /* Don't mark it as disabled; it's still usable */ } -struct console_driver serial_console __console_driver = { - .putchar = serial_putc, - .getchar = serial_getc, - .iskey = serial_ischar, - .disabled = 1, -}; - -/** Serial console startup function */ -struct startup_fn serial_startup_fn __startup_fn ( STARTUP_NORMAL ) = { - .startup = serial_init, - .shutdown = serial_fini, -}; - /** - * Serial console initialisation function + * Serial driver initialisation function * - * Initialise console early on so that it is available to capture - * early debug messages. It is safe to call serial_init() multiple - * times. + * Initialise serial port early on so that it is available to capture + * early debug messages. */ -struct init_fn serial_init_fn __init_fn ( INIT_CONSOLE ) = { +struct init_fn serial_init_fn __init_fn ( INIT_SERIAL ) = { .initialise = serial_init, }; + +/** Serial driver startup function */ +struct startup_fn serial_startup_fn __startup_fn ( STARTUP_NORMAL ) = { + .shutdown = serial_fini, +}; diff --git a/src/core/serial_console.c b/src/core/serial_console.c new file mode 100644 index 000000000..0300482af --- /dev/null +++ b/src/core/serial_console.c @@ -0,0 +1,31 @@ +#include +#include +#include "console.h" + +/** @file + * + * Serial console + * + */ + +struct console_driver serial_console __console_driver; + +static void serial_console_init ( void ) { + /* Serial driver initialization should already be done, + * time to enable the serial console. */ + serial_console.disabled = 0; +} + +struct console_driver serial_console __console_driver = { + .putchar = serial_putc, + .getchar = serial_getc, + .iskey = serial_ischar, + .disabled = 1, +}; + +/** + * Serial console initialisation function + */ +struct init_fn serial_console_init_fn __init_fn ( INIT_CONSOLE ) = { + .initialise = serial_console_init, +}; -- cgit v1.2.3-55-g7522