summaryrefslogtreecommitdiffstats
path: root/src/core/gdbserial.c
diff options
context:
space:
mode:
authorMichael Brown2015-06-29 11:07:56 +0200
committerMichael Brown2015-06-29 12:03:12 +0200
commit5e622dc085d461d21e0db8f8d9773863ebc1468f (patch)
tree17baf6c4f21f466160dd1f9fa135549d6a72fa03 /src/core/gdbserial.c
parent[serial] Add general abstraction of a 16550-compatible UART (diff)
downloadipxe-5e622dc085d461d21e0db8f8d9773863ebc1468f.tar.gz
ipxe-5e622dc085d461d21e0db8f8d9773863ebc1468f.tar.xz
ipxe-5e622dc085d461d21e0db8f8d9773863ebc1468f.zip
[gdb] Use new UART abstraction in GDB serial transport
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/gdbserial.c')
-rw-r--r--src/core/gdbserial.c53
1 files changed, 45 insertions, 8 deletions
diff --git a/src/core/gdbserial.c b/src/core/gdbserial.c
index 255acea7..802463f4 100644
--- a/src/core/gdbserial.c
+++ b/src/core/gdbserial.c
@@ -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;
-}