Author: stepan Date: 2008-11-24 13:23:01 +0100 (Mon, 24 Nov 2008) New Revision: 256
Modified: openbios-devel/arch/ppc/qemu/console.c openbios-devel/arch/ppc/qemu/init.c openbios-devel/arch/ppc/qemu/qemu.c Log: Copy serial support from arch/amd64/console.c
Signed-off-by: Laurent Vivier Laurent@lvivier.info Acked-by: Stefan Reinauer stepan@coresystems.de
Modified: openbios-devel/arch/ppc/qemu/console.c =================================================================== --- openbios-devel/arch/ppc/qemu/console.c 2008-11-24 12:21:36 UTC (rev 255) +++ openbios-devel/arch/ppc/qemu/console.c 2008-11-24 12:23:01 UTC (rev 256) @@ -1,4 +1,3 @@ - /* * <console.c> * @@ -13,12 +12,119 @@ */
#include "openbios/config.h" +#include "openbios/kernel.h" #include "openbios/bindings.h" #include "libc/diskio.h" #include "ofmem.h" #include "qemu/qemu.h"
+#ifdef CONFIG_DEBUG_CONSOLE
+/* ****************************************************************** + * serial console functions + * ****************************************************************** */ + +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + +#define UART(port) (port==2?0x2f8:0x3f8) + +#define RBR(port) (UART(port) + 0) +#define THR(port) (UART(port) + 0) +#define IER(port) (UART(port) + 1) +#define IIR(port) (UART(port) + 2) +#define LCR(port) (UART(port) + 3) +#define MCR(port) (UART(port) + 4) +#define LSR(port) (UART(port) + 5) +#define MSR(port) (UART(port) + 6) +#define SCR(port) (UART(port) + 7) +#define DLL(port) (UART(port) + 0) +#define DLM(port) (UART(port) + 1) + +static int uart_charav(int port) +{ + if (!port) + return -1; + return ((inb(LSR(port)) & 1) != 0); +} + +static char uart_getchar(int port) +{ + if (!port) + return -1; + while (!uart_charav(port)); + return ((char) inb(RBR(port)) & 0177); +} + +static void uart_putchar(int port, unsigned char c) +{ + if (!port) + return -1; + while (!(inb(LSR(port)) & 0x20)); + outb(c, THR(port)); +} + +static void serial_putchar(int c) +{ + if (c == '\n') + uart_putchar(CONFIG_SERIAL_PORT, '\r'); + uart_putchar(CONFIG_SERIAL_PORT, c); +} + +static void uart_init_line(int port, unsigned long baud) +{ + int i, baudconst; + + switch (baud) { + case 115200: + baudconst = 1; + break; + case 57600: + baudconst = 2; + break; + case 38400: + baudconst = 3; + break; + case 19200: + baudconst = 6; + break; + case 9600: + default: + baudconst = 12; + break; + } + + outb(0x87, LCR(port)); + outb(0x00, DLM(port)); + outb(baudconst, DLL(port)); + outb(0x07, LCR(port)); + outb(0x0f, MCR(port)); + + for (i = 10; i > 0; i--) { + if (inb(LSR(port)) == (unsigned int) 0) + break; + inb(RBR(port)); + } +} + +int +serial_init(void) +{ + if (CONFIG_SERIAL_PORT) + uart_init_line(CONFIG_SERIAL_PORT, CONFIG_SERIAL_SPEED); + return -1; +} + +static void serial_cls(void) +{ + serial_putchar(27); + serial_putchar('['); + serial_putchar('H'); + serial_putchar(27); + serial_putchar('['); + serial_putchar('J'); +} +#endif // CONFIG_DEBUG_CONSOLE_SERIAL + typedef struct osi_fb_info { unsigned long mphys; int rb, w, h, depth; @@ -43,5 +149,40 @@
#include "../../../modules/console.c"
+/* ****************************************************************** + * common functions, implementing simple concurrent console + * ****************************************************************** */
+int putchar(int c) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + serial_putchar(c); +#endif + return c; +}
+int availchar(void) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + if (uart_charav(CONFIG_SERIAL_PORT)) + return 1; +#endif + return 0; +} + +int getchar(void) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + if (uart_charav(CONFIG_SERIAL_PORT)) + return (uart_getchar(CONFIG_SERIAL_PORT)); +#endif + return 0; +} + +void cls(void) +{ +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + serial_cls(); +#endif +} +#endif // CONFIG_DEBUG_CONSOLE
Modified: openbios-devel/arch/ppc/qemu/init.c =================================================================== --- openbios-devel/arch/ppc/qemu/init.c 2008-11-24 12:21:36 UTC (rev 255) +++ openbios-devel/arch/ppc/qemu/init.c 2008-11-24 12:23:01 UTC (rev 256) @@ -70,6 +70,11 @@ { arch = &known_arch[ARCH_HEATHROW]; isa_io_base = arch->io_base; +#ifdef CONFIG_DEBUG_CONSOLE +#ifdef CONFIG_DEBUG_CONSOLE_SERIAL + serial_init(); +#endif +#endif printk("\n"); printk("=============================================================\n"); printk("OpenBIOS %s [%s]\n", OPENBIOS_RELEASE, OPENBIOS_BUILD_DATE );
Modified: openbios-devel/arch/ppc/qemu/qemu.c =================================================================== --- openbios-devel/arch/ppc/qemu/qemu.c 2008-11-24 12:21:36 UTC (rev 255) +++ openbios-devel/arch/ppc/qemu/qemu.c 2008-11-24 12:23:01 UTC (rev 256) @@ -19,24 +19,23 @@ #include "openbios/config.h" #include "openbios/kernel.h" #include "openbios/nvram.h" +#include "openbios/bindings.h" #include "libc/vsprintf.h" #include "libc/string.h" #include "libc/byteorder.h" #include "qemu/qemu.h" #include <stdarg.h>
-#define UART_BASE 0x3f8 - // FIXME unsigned long virt_offset = 0;
//#define DUMP_NVRAM
void -exit( int status ) +exit( int status __attribute__ ((unused))) { for (;;); -} +} __attribute__ ((noreturn))
void fatal_error( const char *err ) @@ -50,10 +49,6 @@ { printk("Panic: %s\n", err ); exit(0); - - /* won't come here... this keeps the gcc happy */ - for( ;; ) - ; }
@@ -92,62 +87,6 @@ /* TTY iface */ /************************************************************************/
-static int ttychar = -1; - -static int -tty_avail( void ) -{ - return 1; -} - -static int -tty_putchar( int c ) -{ - if( tty_avail() ) { - while (!(inb(UART_BASE + 0x05) & 0x20)) - ; - outb(c, UART_BASE); - while (!(inb(UART_BASE + 0x05) & 0x40)) - ; - } - return c; -} - -int -availchar( void ) -{ - if( !tty_avail() ) - return 0; - - if( ttychar < 0 ) - ttychar = inb(UART_BASE); - return (ttychar >= 0); -} - -int -getchar( void ) -{ - int ch; - - if( !tty_avail() ) - return 0; - - if( ttychar < 0 ) - return inb(UART_BASE); - ch = ttychar; - ttychar = -1; - return ch; -} - -int -putchar( int c ) -{ - if (c == '\n') - tty_putchar('\r'); - return tty_putchar(c); -} - - /************************************************************************/ /* briQ specific stuff */ /************************************************************************/