[gdb] Use new UART abstraction in GDB serial transport
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
611c9e39da
commit
5e622dc085
|
@ -23,31 +23,68 @@
|
|||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <stddef.h>
|
||||
#include <assert.h>
|
||||
#include <ipxe/serial.h>
|
||||
#include <ipxe/uart.h>
|
||||
#include <ipxe/gdbstub.h>
|
||||
#include <ipxe/gdbserial.h>
|
||||
#include <config/serial.h>
|
||||
|
||||
struct gdb_transport serial_gdb_transport __gdb_transport;
|
||||
/* UART port number */
|
||||
#ifdef COMCONSOLE
|
||||
#define GDBSERIAL_PORT COMCONSOLE
|
||||
#else
|
||||
#define GDBSERIAL_PORT 0
|
||||
#endif
|
||||
|
||||
/* UART baud rate */
|
||||
#ifdef COMPRESERVE
|
||||
#define GDBSERIAL_BAUD 0
|
||||
#else
|
||||
#define GDBSERIAL_BAUD COMSPEED
|
||||
#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 */
|
||||
static struct uart gdbserial_uart;
|
||||
|
||||
static size_t gdbserial_recv ( char *buf, size_t len ) {
|
||||
|
||||
assert ( len > 0 );
|
||||
buf [ 0 ] = serial_getc();
|
||||
while ( ! uart_data_ready ( &gdbserial_uart ) ) {}
|
||||
buf[0] = uart_receive ( &gdbserial_uart );
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void gdbserial_send ( const char *buf, size_t len ) {
|
||||
|
||||
while ( len-- > 0 ) {
|
||||
serial_putc ( *buf++ );
|
||||
uart_transmit ( &gdbserial_uart, *buf++ );
|
||||
}
|
||||
}
|
||||
|
||||
static int gdbserial_init ( int argc __unused, char **argv __unused ) {
|
||||
int rc;
|
||||
|
||||
if ( ( rc = uart_select ( &gdbserial_uart, GDBSERIAL_PORT ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
if ( ( rc = uart_init ( &gdbserial_uart, GDBSERIAL_BAUD,
|
||||
GDBSERIAL_LCR ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct gdb_transport serial_gdb_transport __gdb_transport = {
|
||||
.name = "serial",
|
||||
.init = gdbserial_init,
|
||||
.recv = gdbserial_recv,
|
||||
.send = gdbserial_send,
|
||||
};
|
||||
|
||||
struct gdb_transport *gdbserial_configure ( void ) {
|
||||
return &serial_gdb_transport;
|
||||
}
|
||||
|
|
|
@ -9,13 +9,4 @@
|
|||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
struct gdb_transport;
|
||||
|
||||
/**
|
||||
* Set up the serial transport
|
||||
*
|
||||
* @ret transport suitable for starting the GDB stub or NULL on error
|
||||
*/
|
||||
struct gdb_transport *gdbserial_configure ( void );
|
||||
|
||||
#endif /* _IPXE_GDBSERIAL_H */
|
||||
|
|
Reference in New Issue