From: Kevin O'Connor Date: Thu, 8 May 2008 01:29:50 +0000 (-0400) Subject: Add support for sending debug messages to a serial port. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=1812e20b4b4edd574e21637c6e57ca17797f155c;p=seabios.git Add support for sending debug messages to a serial port. Enable by turning on CONFIG_DEBUG_SERIAL option. --- diff --git a/src/config.h b/src/config.h index 0b3e42e..88b54d8 100644 --- a/src/config.h +++ b/src/config.h @@ -13,6 +13,8 @@ #define CONFIG_APPNAME "Bochs" #endif +#define CONFIG_DEBUG_SERIAL 0 + #define CONFIG_FLOPPY_SUPPORT 1 #define CONFIG_PS2_MOUSE 1 #define CONFIG_ATA 1 diff --git a/src/output.c b/src/output.c index fc77c21..b2f28e9 100644 --- a/src/output.c +++ b/src/output.c @@ -24,8 +24,15 @@ screenc(u8 c) static void putc(u16 action, char c) { - outb(c, PORT_BIOS_DEBUG); + if (CONFIG_DEBUG_SERIAL) + // Send character to serial port. + debug_serial(c); + else + // Send character to debug port. + outb(c, PORT_BIOS_DEBUG); + if (action) { + // Send character to video screen. if (c == '\n') screenc('\r'); screenc(c); diff --git a/src/post.c b/src/post.c index 64f42bb..36fc2e9 100644 --- a/src/post.c +++ b/src/post.c @@ -176,6 +176,9 @@ rom_scan(u32 start, u32 end) static void post() { + if (CONFIG_DEBUG_SERIAL) + debug_serial_setup(); + BX_INFO("Start bios\n"); init_bda(); diff --git a/src/serial.c b/src/serial.c index 8ca7e36..026c399 100644 --- a/src/serial.c +++ b/src/serial.c @@ -54,6 +54,7 @@ getComAddr(struct bregs *regs) return addr; } +// SERIAL - INITIALIZE PORT static void handle_1400(struct bregs *regs) { @@ -75,14 +76,10 @@ handle_1400(struct bregs *regs) set_success(regs); } -static void -handle_1401(struct bregs *regs) +static int +write_serial(u16 addr, u16 timeout, char c) { - u16 addr = getComAddr(regs); - if (!addr) - return; u16 timer = GET_BDA(timer_counter); - u16 timeout = GET_BDA(com_timeout[regs->dx]); while (((inb(addr+5) & 0x60) != 0x60) && (timeout)) { u16 val16 = GET_BDA(timer_counter); if (val16 != timer) { @@ -90,14 +87,29 @@ handle_1401(struct bregs *regs) timeout--; } } - if (timeout) - outb(regs->al, addr); - regs->ah = inb(addr+5); if (!timeout) + // Ran out of time. + return -1; + outb(c, addr); + return 0; +} + +// SERIAL - WRITE CHARACTER TO PORT +static void +handle_1401(struct bregs *regs) +{ + u16 addr = getComAddr(regs); + if (!addr) + return; + u16 timeout = GET_BDA(com_timeout[regs->dx]); + int ret = write_serial(addr, timeout, regs->al); + regs->ah = inb(addr+5); + if (ret) regs->ah |= 0x80; set_success(regs); } +// SERIAL - READ CHARACTER FROM PORT static void handle_1402(struct bregs *regs) { @@ -122,6 +134,7 @@ handle_1402(struct bregs *regs) set_success(regs); } +// SERIAL - GET PORT STATUS static void handle_1403(struct bregs *regs) { @@ -158,6 +171,26 @@ handle_14(struct bregs *regs) } +/**************************************************************** + * Serial debugging + ****************************************************************/ + +#define BX_DEBUG_PORT 0x03f8 + +void +debug_serial_setup() +{ + /* setup for serial logging: 8N1 */ + outb(0x03, BX_DEBUG_PORT+3); +} + +void +debug_serial(char c) +{ + write_serial(BX_DEBUG_PORT, 0x0a, c); +} + + /**************************************************************** * LPT ports ****************************************************************/ diff --git a/src/util.h b/src/util.h index 10d1835..acd981a 100644 --- a/src/util.h +++ b/src/util.h @@ -145,6 +145,8 @@ void handle_15c2(struct bregs *regs); // serial.c void serial_setup(); +void debug_serial_setup(); +void debug_serial(char c); void lpt_setup(); // clock.c