[uart] Remove ability to use frame formats other than 8n1

In the context of serial consoles, the use of any frame formats other
than the standard 8 data bits, no parity, and one stop bit is so rare
as to be nonexistent.

Remove the almost certainly unused support for custom frame formats.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-06-17 15:44:12 +01:00
parent 5783a10f72
commit 60e167c00b
6 changed files with 12 additions and 39 deletions

View File

@@ -16,15 +16,12 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define COMCONSOLE COM1 /* I/O port address */ #define COMCONSOLE COM1 /* I/O port address */
/* Keep settings from a previous user of the serial port (e.g. lilo or /* Keep settings from a previous user of the serial port (e.g. lilo or
* LinuxBIOS), ignoring COMSPEED, COMDATA, COMPARITY and COMSTOP. * LinuxBIOS), ignoring COMSPEED.
*/ */
#undef COMPRESERVE #undef COMPRESERVE
#ifndef COMPRESERVE #ifndef COMPRESERVE
#define COMSPEED 115200 /* Baud rate */ #define COMSPEED 115200 /* Baud rate */
#define COMDATA 8 /* Data bits */
#define COMPARITY 0 /* Parity: 0=None, 1=Odd, 2=Even */
#define COMSTOP 1 /* Stop bits */
#endif #endif
/* Early UART configuration (for bare metal prefix debugging only) */ /* Early UART configuration (for bare metal prefix debugging only) */

View File

@@ -46,13 +46,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define GDBSERIAL_BAUD COMSPEED #define GDBSERIAL_BAUD COMSPEED
#endif #endif
/* UART line control register value */
#ifdef COMPRESERVE
#define GDBSERIAL_LCR 0
#else
#define GDBSERIAL_LCR UART_LCR_WPS ( COMDATA, COMPARITY, COMSTOP )
#endif
/** GDB serial UART */ /** GDB serial UART */
static struct uart gdbserial_uart; static struct uart gdbserial_uart;
@@ -90,7 +83,7 @@ static int gdbserial_init ( int argc, char **argv ) {
return 1; return 1;
} }
if ( ! gdbserial_configure ( port, GDBSERIAL_BAUD, GDBSERIAL_LCR ) ) { if ( ! gdbserial_configure ( port, GDBSERIAL_BAUD ) ) {
printf ( "serial: unable to configure\n" ); printf ( "serial: unable to configure\n" );
return 1; return 1;
} }
@@ -106,13 +99,13 @@ struct gdb_transport serial_gdb_transport __gdb_transport = {
}; };
struct gdb_transport * gdbserial_configure ( unsigned int port, struct gdb_transport * gdbserial_configure ( unsigned int port,
unsigned int baud, uint8_t lcr ) { unsigned int baud ) {
int rc; int rc;
if ( ( rc = uart_select ( &gdbserial_uart, port ) ) != 0 ) if ( ( rc = uart_select ( &gdbserial_uart, port ) ) != 0 )
return NULL; return NULL;
if ( ( rc = uart_init ( &gdbserial_uart, baud, lcr ) ) != 0 ) if ( ( rc = uart_init ( &gdbserial_uart, baud ) ) != 0 )
return NULL; return NULL;
return &serial_gdb_transport; return &serial_gdb_transport;

View File

@@ -58,13 +58,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define CONSOLE_BAUD COMSPEED #define CONSOLE_BAUD COMSPEED
#endif #endif
/* UART line control register value */
#ifdef COMPRESERVE
#define CONSOLE_LCR 0
#else
#define CONSOLE_LCR UART_LCR_WPS ( COMDATA, COMPARITY, COMSTOP )
#endif
/** Serial console UART */ /** Serial console UART */
struct uart serial_console; struct uart serial_console;
@@ -149,10 +142,9 @@ static void serial_init ( void ) {
} }
/* Initialise UART */ /* Initialise UART */
if ( ( rc = uart_init ( &serial_console, CONSOLE_BAUD, if ( ( rc = uart_init ( &serial_console, CONSOLE_BAUD ) ) != 0 ) {
CONSOLE_LCR ) ) != 0 ) { DBG ( "Could not initialise UART %d baud %d: %s\n",
DBG ( "Could not initialise UART %d baud %d LCR %#02x: %s\n", CONSOLE_PORT, CONSOLE_BAUD, strerror ( rc ) );
CONSOLE_PORT, CONSOLE_BAUD, CONSOLE_LCR, strerror ( rc ));
return; return;
} }
} }

View File

@@ -107,10 +107,9 @@ int uart_exists ( struct uart *uart ) {
* *
* @v uart UART * @v uart UART
* @v baud Baud rate, or zero to leave unchanged * @v baud Baud rate, or zero to leave unchanged
* @v lcr Line control register value, or zero to leave unchanged
* @ret rc Return status code * @ret rc Return status code
*/ */
int uart_init ( struct uart *uart, unsigned int baud, uint8_t lcr ) { int uart_init ( struct uart *uart, unsigned int baud ) {
uint8_t dlm; uint8_t dlm;
uint8_t dll; uint8_t dll;
int rc; int rc;
@@ -120,10 +119,7 @@ int uart_init ( struct uart *uart, unsigned int baud, uint8_t lcr ) {
return rc; return rc;
/* Configure divisor and line control register, if applicable */ /* Configure divisor and line control register, if applicable */
if ( ! lcr ) uart_write ( uart, UART_LCR, ( UART_LCR_8N1 | UART_LCR_DLAB ) );
lcr = uart_read ( uart, UART_LCR );
uart->lcr = lcr;
uart_write ( uart, UART_LCR, ( lcr | UART_LCR_DLAB ) );
if ( baud ) { if ( baud ) {
uart->divisor = ( UART_MAX_BAUD / baud ); uart->divisor = ( UART_MAX_BAUD / baud );
dlm = ( ( uart->divisor >> 8 ) & 0xff ); dlm = ( ( uart->divisor >> 8 ) & 0xff );
@@ -135,7 +131,7 @@ int uart_init ( struct uart *uart, unsigned int baud, uint8_t lcr ) {
dll = uart_read ( uart, UART_DLL ); dll = uart_read ( uart, UART_DLL );
uart->divisor = ( ( dlm << 8 ) | dll ); uart->divisor = ( ( dlm << 8 ) | dll );
} }
uart_write ( uart, UART_LCR, ( lcr & ~UART_LCR_DLAB ) ); uart_write ( uart, UART_LCR, UART_LCR_8N1 );
/* Disable interrupts */ /* Disable interrupts */
uart_write ( uart, UART_IER, 0 ); uart_write ( uart, UART_IER, 0 );

View File

@@ -9,12 +9,9 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdint.h>
struct gdb_transport; struct gdb_transport;
extern struct gdb_transport * gdbserial_configure ( unsigned int port, extern struct gdb_transport * gdbserial_configure ( unsigned int port,
unsigned int baud, unsigned int baud );
uint8_t lcr );
#endif /* _IPXE_GDBSERIAL_H */ #endif /* _IPXE_GDBSERIAL_H */

View File

@@ -82,8 +82,6 @@ struct uart {
void *base; void *base;
/** Baud rate divisor */ /** Baud rate divisor */
uint16_t divisor; uint16_t divisor;
/** Line control register */
uint8_t lcr;
}; };
/** Symbolic names for port indexes */ /** Symbolic names for port indexes */
@@ -127,6 +125,6 @@ static inline uint8_t uart_receive ( struct uart *uart ) {
extern void uart_transmit ( struct uart *uart, uint8_t data ); extern void uart_transmit ( struct uart *uart, uint8_t data );
extern void uart_flush ( struct uart *uart ); extern void uart_flush ( struct uart *uart );
extern int uart_exists ( struct uart *uart ); extern int uart_exists ( struct uart *uart );
extern int uart_init ( struct uart *uart, unsigned int baud, uint8_t lcr ); extern int uart_init ( struct uart *uart, unsigned int baud );
#endif /* _IPXE_UART_H */ #endif /* _IPXE_UART_H */