mirror of
https://github.com/ipxe/ipxe
synced 2025-12-11 14:03:29 +03:00
[gdb] Use new UART abstraction in GDB serial transport
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -23,31 +23,68 @@
|
|||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ipxe/serial.h>
|
#include <ipxe/uart.h>
|
||||||
#include <ipxe/gdbstub.h>
|
#include <ipxe/gdbstub.h>
|
||||||
#include <ipxe/gdbserial.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 ) {
|
static size_t gdbserial_recv ( char *buf, size_t len ) {
|
||||||
|
|
||||||
assert ( len > 0 );
|
assert ( len > 0 );
|
||||||
buf [ 0 ] = serial_getc();
|
while ( ! uart_data_ready ( &gdbserial_uart ) ) {}
|
||||||
|
buf[0] = uart_receive ( &gdbserial_uart );
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gdbserial_send ( const char *buf, size_t len ) {
|
static void gdbserial_send ( const char *buf, size_t len ) {
|
||||||
|
|
||||||
while ( len-- > 0 ) {
|
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 = {
|
struct gdb_transport serial_gdb_transport __gdb_transport = {
|
||||||
.name = "serial",
|
.name = "serial",
|
||||||
|
.init = gdbserial_init,
|
||||||
.recv = gdbserial_recv,
|
.recv = gdbserial_recv,
|
||||||
.send = gdbserial_send,
|
.send = gdbserial_send,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gdb_transport *gdbserial_configure ( void ) {
|
|
||||||
return &serial_gdb_transport;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -9,13 +9,4 @@
|
|||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
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 */
|
#endif /* _IPXE_GDBSERIAL_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user