[Serial] Split serial console from serial driver
This commit is contained in:
parent
f866b17998
commit
831db76ff7
|
@ -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 );
|
||||||
|
|
|
@ -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,
|
||||||
|
};
|
||||||
|
|
|
@ -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,
|
||||||
|
};
|
|
@ -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 */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
Reference in New Issue