david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[Serial] Split serial console from serial driver

This commit is contained in:
Stefan Hajnoczi 2008-06-04 21:00:46 +01:00 committed by Michael Brown
parent f866b17998
commit 831db76ff7
5 changed files with 62 additions and 32 deletions

View File

@ -54,7 +54,7 @@
REQUIRE_OBJECT ( bios_console ); REQUIRE_OBJECT ( bios_console );
#endif #endif
#ifdef CONSOLE_SERIAL #ifdef CONSOLE_SERIAL
REQUIRE_OBJECT ( serial ); REQUIRE_OBJECT ( serial_console );
#endif #endif
#ifdef CONSOLE_DIRECT_VGA #ifdef CONSOLE_DIRECT_VGA
REQUIRE_OBJECT ( video_subr ); REQUIRE_OBJECT ( video_subr );

View File

@ -12,10 +12,10 @@
*/ */
#include "stddef.h" #include "stddef.h"
#include "console.h"
#include <gpxe/init.h> #include <gpxe/init.h>
#include "io.h" #include "io.h"
#include <unistd.h> #include <unistd.h>
#include <gpxe/serial.h>
#include "config/serial.h" #include "config/serial.h"
/* Set default values if none specified */ /* Set default values if none specified */
@ -91,13 +91,11 @@
#define uart_writeb(val,addr) outb((val),(addr)) #define uart_writeb(val,addr) outb((val),(addr))
#endif #endif
struct console_driver serial_console __console_driver;
/* /*
* void serial_putc(int ch); * void serial_putc(int ch);
* Write character `ch' to port UART_BASE. * Write character `ch' to port UART_BASE.
*/ */
static void serial_putc ( int ch ) { void serial_putc ( int ch ) {
int i; int i;
int status; int status;
i = 1000; /* timeout */ i = 1000; /* timeout */
@ -116,7 +114,7 @@ static void serial_putc ( int ch ) {
* int serial_getc(void); * int serial_getc(void);
* Read a character from port UART_BASE. * Read a character from port UART_BASE.
*/ */
static int serial_getc ( void ) { int serial_getc ( void ) {
int status; int status;
int ch; int ch;
do { do {
@ -135,7 +133,7 @@ static int serial_getc ( void ) {
* If there is a character in the input buffer of port UART_BASE, * If there is a character in the input buffer of port UART_BASE,
* return nonzero; otherwise return 0. * return nonzero; otherwise return 0.
*/ */
static int serial_ischar ( void ) { int serial_ischar ( void ) {
int status; int status;
status = uart_readb(UART_BASE + UART_LSR); /* line status reg; */ status = uart_readb(UART_BASE + UART_LSR); /* line status reg; */
return status & 1; /* rx char available */ return status & 1; /* rx char available */
@ -217,7 +215,6 @@ static void serial_init ( void ) {
/* line status reg */ /* line status reg */
status = uart_readb(UART_BASE + UART_LSR); status = uart_readb(UART_BASE + UART_LSR);
} while(status & UART_LSR_DR); } while(status & UART_LSR_DR);
serial_console.disabled = 0;
out: out:
return; return;
} }
@ -229,10 +226,6 @@ static void serial_init ( void ) {
*/ */
static void serial_fini ( void ) { static void serial_fini ( void ) {
int i, status; int i, status;
if (serial_console.disabled) {
/* no serial interface */
return;
}
/* Flush the output buffer to avoid dropping characters, /* Flush the output buffer to avoid dropping characters,
* if we are reinitializing the serial port. * 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 */ /* 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 * Initialise serial port early on so that it is available to capture
* early debug messages. It is safe to call serial_init() multiple * early debug messages.
* times.
*/ */
struct init_fn serial_init_fn __init_fn ( INIT_CONSOLE ) = { struct init_fn serial_init_fn __init_fn ( INIT_SERIAL ) = {
.initialise = serial_init, .initialise = serial_init,
}; };
/** Serial driver startup function */
struct startup_fn serial_startup_fn __startup_fn ( STARTUP_NORMAL ) = {
.shutdown = serial_fini,
};

31
src/core/serial_console.c Normal file
View File

@ -0,0 +1,31 @@
#include <gpxe/init.h>
#include <gpxe/serial.h>
#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,
};

View File

@ -22,8 +22,9 @@ struct init_fn {
*/ */
#define INIT_EARLY 01 /**< Early initialisation */ #define INIT_EARLY 01 /**< Early initialisation */
#define INIT_CONSOLE 02 /**< Console initialisation */ #define INIT_SERIAL 02 /**< Serial driver initialisation */
#define INIT_NORMAL 03 /**< Normal initialisation */ #define INIT_CONSOLE 03 /**< Console initialisation */
#define INIT_NORMAL 04 /**< Normal initialisation */
/** @} */ /** @} */

14
src/include/gpxe/serial.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef _GPXE_SERIAL_H
#define _GPXE_SERIAL_H
/** @file
*
* Serial driver functions
*
*/
extern void serial_putc ( int ch );
extern int serial_getc ( void );
extern int serial_ischar ( void );
#endif /* _GPXE_SERIAL_H */