mirror of
https://github.com/ipxe/ipxe
synced 2025-12-08 02:10:25 +03:00
[uart] Make baud rate a property of the UART
Make the current baud rate (if specified) a property of the UART, to allow the default_serial_console() function to specify the default baud rate as well as the default UART device. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -95,7 +95,9 @@ struct gdb_transport * gdbserial_configure ( const char *name,
|
|||||||
return NULL;
|
return NULL;
|
||||||
uart_get ( gdbserial_uart );
|
uart_get ( gdbserial_uart );
|
||||||
|
|
||||||
if ( ( rc = uart_init ( gdbserial_uart, baud ) ) != 0 )
|
gdbserial_uart->baud = baud;
|
||||||
|
|
||||||
|
if ( ( rc = uart_init ( gdbserial_uart ) ) != 0 )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return &serial_gdb_transport;
|
return &serial_gdb_transport;
|
||||||
|
|||||||
@@ -74,8 +74,14 @@ struct uart *serial_console = NULL;
|
|||||||
* @ret uart Serial console UART, or NULL
|
* @ret uart Serial console UART, or NULL
|
||||||
*/
|
*/
|
||||||
static struct uart * serial_comconsole ( void ) {
|
static struct uart * serial_comconsole ( void ) {
|
||||||
|
struct uart *uart = COMCONSOLE;
|
||||||
|
unsigned int baud = COMSPEED;
|
||||||
|
|
||||||
return COMCONSOLE;
|
/* Set default baud rate, if applicable */
|
||||||
|
if ( uart && baud )
|
||||||
|
uart->baud = baud;
|
||||||
|
|
||||||
|
return uart;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -154,9 +160,9 @@ static void serial_init ( void ) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Initialise UART */
|
/* Initialise UART */
|
||||||
if ( ( rc = uart_init ( uart, COMSPEED ) ) != 0 ) {
|
if ( ( rc = uart_init ( uart ) ) != 0 ) {
|
||||||
DBGC ( uart, "SERIAL could not initialise %s baud %d: %s\n",
|
DBGC ( uart, "SERIAL could not initialise %s: %s\n",
|
||||||
uart->name, COMSPEED, strerror ( rc ) );
|
uart->name, strerror ( rc ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,7 @@ static uint8_t null_uart_receive ( struct uart *uart __unused ) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int null_uart_init ( struct uart *uart __unused,
|
static int null_uart_init ( struct uart *uart __unused ) {
|
||||||
unsigned int baud __unused ) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -115,10 +115,9 @@ static void ns16550_flush ( struct uart *uart ) {
|
|||||||
* Initialise UART
|
* Initialise UART
|
||||||
*
|
*
|
||||||
* @v uart UART
|
* @v uart UART
|
||||||
* @v baud Baud rate, or zero to leave unchanged
|
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int ns16550_init ( struct uart *uart, unsigned int baud ) {
|
static int ns16550_init ( struct uart *uart ) {
|
||||||
struct ns16550_uart *ns16550 = uart->priv;
|
struct ns16550_uart *ns16550 = uart->priv;
|
||||||
uint8_t dlm;
|
uint8_t dlm;
|
||||||
uint8_t dll;
|
uint8_t dll;
|
||||||
@@ -137,8 +136,8 @@ static int ns16550_init ( struct uart *uart, unsigned int baud ) {
|
|||||||
/* Configure divisor and line control register, if applicable */
|
/* Configure divisor and line control register, if applicable */
|
||||||
ns16550_write ( ns16550, NS16550_LCR,
|
ns16550_write ( ns16550, NS16550_LCR,
|
||||||
( NS16550_LCR_8N1 | NS16550_LCR_DLAB ) );
|
( NS16550_LCR_8N1 | NS16550_LCR_DLAB ) );
|
||||||
if ( baud ) {
|
if ( uart->baud ) {
|
||||||
ns16550->divisor = ( ( ns16550->clock / baud ) /
|
ns16550->divisor = ( ( ns16550->clock / uart->baud ) /
|
||||||
NS16550_CLK_BIT );
|
NS16550_CLK_BIT );
|
||||||
dlm = ( ( ns16550->divisor >> 8 ) & 0xff );
|
dlm = ( ( ns16550->divisor >> 8 ) & 0xff );
|
||||||
dll = ( ( ns16550->divisor >> 0 ) & 0xff );
|
dll = ( ( ns16550->divisor >> 0 ) & 0xff );
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ struct uart {
|
|||||||
/** List of registered UARTs */
|
/** List of registered UARTs */
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
|
||||||
|
/** Baud rate (if specified) */
|
||||||
|
unsigned int baud;
|
||||||
|
|
||||||
/** UART operations */
|
/** UART operations */
|
||||||
struct uart_operations *op;
|
struct uart_operations *op;
|
||||||
/** Driver-private data */
|
/** Driver-private data */
|
||||||
@@ -56,10 +59,9 @@ struct uart_operations {
|
|||||||
* Initialise UART
|
* Initialise UART
|
||||||
*
|
*
|
||||||
* @v uart UART
|
* @v uart UART
|
||||||
* @v baud Baud rate, or zero to leave unchanged
|
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
int ( * init ) ( struct uart *uart, unsigned int baud );
|
int ( * init ) ( struct uart *uart );
|
||||||
/**
|
/**
|
||||||
* Flush transmitted data
|
* Flush transmitted data
|
||||||
*
|
*
|
||||||
@@ -109,13 +111,12 @@ uart_receive ( struct uart *uart ) {
|
|||||||
* Initialise UART
|
* Initialise UART
|
||||||
*
|
*
|
||||||
* @v uart UART
|
* @v uart UART
|
||||||
* @v baud Baud rate, or zero to leave unchanged
|
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static inline __attribute__ (( always_inline )) int
|
static inline __attribute__ (( always_inline )) int
|
||||||
uart_init ( struct uart *uart, unsigned int baud ) {
|
uart_init ( struct uart *uart ) {
|
||||||
|
|
||||||
return uart->op->init ( uart, baud );
|
return uart->op->init ( uart );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user