Author: blueswirl Date: 2009-01-02 15:53:33 +0100 (Fri, 02 Jan 2009) New Revision: 343
Added: openbios-devel/modules/console_common.c Removed: openbios-devel/modules/console.c Modified: openbios-devel/arch/ppc/build.xml openbios-devel/arch/ppc/qemu/console.c openbios-devel/arch/sparc32/console.c openbios-devel/arch/sparc32/openbios.c openbios-devel/arch/sparc64/openbios.c openbios-devel/include/openbios/drivers.h openbios-devel/include/video_subr.h openbios-devel/modules/build.xml openbios-devel/modules/video.c Log: Clean up video routines
Modified: openbios-devel/arch/ppc/build.xml =================================================================== --- openbios-devel/arch/ppc/build.xml 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/arch/ppc/build.xml 2009-01-02 14:53:33 UTC (rev 343) @@ -231,8 +231,9 @@ </object> <external-object source="libqemu.a"/> <external-object source="libbootstrap.a"/> + <external-object source="libdrivers.a"/> + <!-- Needs to be after drivers to avoid missing symbols --> <external-object source="libmodules.a"/> - <external-object source="libdrivers.a"/> <external-object source="liblibc.a"/> <external-object source="libfs.a"/> <external-object source="libgcc.a"/>
Modified: openbios-devel/arch/ppc/qemu/console.c =================================================================== --- openbios-devel/arch/ppc/qemu/console.c 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/arch/ppc/qemu/console.c 2009-01-02 14:53:33 UTC (rev 343) @@ -17,6 +17,7 @@ #include "libc/diskio.h" #include "ofmem.h" #include "qemu/qemu.h" +#include "video_subr.h"
#ifdef CONFIG_DEBUG_CONSOLE
@@ -125,14 +126,6 @@ } #endif // CONFIG_DEBUG_CONSOLE_SERIAL
-typedef struct osi_fb_info { - unsigned long mphys; - int rb, w, h, depth; -} osi_fb_info_t; - -#include "../../../modules/video.c" -#include "../../../modules/console.c" - /* ****************************************************************** * common functions, implementing simple concurrent console * ****************************************************************** */
Modified: openbios-devel/arch/sparc32/console.c =================================================================== --- openbios-devel/arch/sparc32/console.c 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/arch/sparc32/console.c 2009-01-02 14:53:33 UTC (rev 343) @@ -9,6 +9,7 @@ #include "openbios/kernel.h" #include "openbios/drivers.h" #include "openbios.h" +#include "video_subr.h"
#ifdef CONFIG_DEBUG_CONSOLE
@@ -24,16 +25,8 @@ #define DAC_SIZE 16
unsigned char *vmem; -static volatile uint32_t *dac; +volatile uint32_t *dac;
-typedef struct osi_fb_info { - unsigned long mphys; - int rb, w, h, depth; -} osi_fb_info_t; - -#include "../../modules/video.c" -#include "../../modules/console.c" - static void video_putchar(int c) { char buf[2];
Modified: openbios-devel/arch/sparc32/openbios.c =================================================================== --- openbios-devel/arch/sparc32/openbios.c 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/arch/sparc32/openbios.c 2009-01-02 14:53:33 UTC (rev 343) @@ -17,6 +17,7 @@ #include "sys_info.h" #include "openbios.h" #include "boot.h" +#include "video_subr.h"
int qemu_machine_type;
Modified: openbios-devel/arch/sparc64/openbios.c =================================================================== --- openbios-devel/arch/sparc64/openbios.c 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/arch/sparc64/openbios.c 2009-01-02 14:53:33 UTC (rev 343) @@ -28,6 +28,7 @@ #include "libc/vsprintf.h" #define NO_QEMU_PROTOS #include "openbios/fw_cfg.h" +#include "video_subr.h"
#define BIOS_CFG_CMD 0x510 #define BIOS_CFG_DATA 0x511
Modified: openbios-devel/include/openbios/drivers.h =================================================================== --- openbios-devel/include/openbios/drivers.h 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/include/openbios/drivers.h 2009-01-02 14:53:33 UTC (rev 343) @@ -13,18 +13,6 @@
#include "openbios/config.h"
-/* modules/video.c */ -int video_get_res(int *w, int *h); -void draw_pixel(int x, int y, int colind); -void set_color(int ind, ulong color); -void video_scroll(int height); -void init_video(unsigned long fb, int width, int height, int depth, int rb); - -/* modules/console.c */ -int console_draw_str(const char *str); -void console_close(void); -void cls(void); - #ifdef CONFIG_DRIVER_PCI /* drivers/pci.c */ int ob_pci_init(void);
Modified: openbios-devel/include/video_subr.h =================================================================== --- openbios-devel/include/video_subr.h 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/include/video_subr.h 2009-01-02 14:53:33 UTC (rev 343) @@ -15,4 +15,19 @@ void vga_vbe_init(const char *path, uint32_t fb, uint32_t fb_size, unsigned long rom, uint32_t rom_size);
+/* modules/video.c */ +int video_get_res(int *w, int *h); +void draw_pixel(int x, int y, int colind); +void set_color(int ind, unsigned long color); +void video_scroll(int height); +void init_video(unsigned long fb, int width, int height, int depth, int rb); + +/* modules/console_common.c */ +int console_draw_str(const char *str); +int console_init(void); +void console_close(void); +void cls(void); + +extern volatile uint32_t *dac; + #endif /* VIDEO_SUBR_H */
Modified: openbios-devel/modules/build.xml =================================================================== --- openbios-devel/modules/build.xml 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/modules/build.xml 2009-01-02 14:53:33 UTC (rev 343) @@ -6,6 +6,8 @@ <object source="bindings.c"/> <object source="client.c"/> <object source="ipchecksum.c"/> + <object source="video.c"/> + <object source="console_common.c"/> <object source="elfnote.c" condition="X86"/> <object source="elfnote.c" condition="AMD64"/> <object source="elfnote.c" condition="SPARC32"/>
Deleted: openbios-devel/modules/console.c =================================================================== --- openbios-devel/modules/console.c 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/modules/console.c 2009-01-02 14:53:33 UTC (rev 343) @@ -1,329 +0,0 @@ -/* - * <console.c> - * - * Simple text console - * - * Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se) - * Copyright (C) 2005 Stefan Reinauer stepan@openbios.org - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation - * - */ - -#include "openbios/config.h" -#include "openbios/bindings.h" -#include "openbios/fontdata.h" - -#if !defined(fontdata) -#if defined(CONFIG_FONT_8X8) -#define fontdata fontdata_8x8 -#define FONT_HEIGHT FONT_HEIGHT_8X8 -#define FONT_WIDTH FONT_WIDTH_8X8 -#elif defined(CONFIG_FONT_8X16) -#define fontdata fontdata_8x16 -#define FONT_HEIGHT FONT_HEIGHT_8X16 -#define FONT_WIDTH FONT_WIDTH_8X16 -#else -#error no font selected -#endif -#endif - -#define FONT_ADJ_HEIGHT (FONT_HEIGHT + 2) -#define NCOLS 80 -#define NROWS 48 - -typedef enum { - ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, - EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd, - ESpalette -} vc_state_t; - -#define NPAR 16 -static struct { - int inited; - int physw, physh; - int w,h; - - int x,y; - char *buf; - - int cursor_on; - vc_state_t vc_state; - unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current - escape sequence */ -} cons; - -static int -get_conschar( int x, int y ) -{ - if( (uint)x < cons.w && (uint)y < cons.h ) - return cons.buf[y*cons.w + x]; - return ' '; -} - -static void -draw_char( uint h, uint v ) -{ - const unsigned char *c = fontdata; - int x, y, xx, rskip, m; - int invert = (h==cons.x && v==cons.y && cons.cursor_on); - int ch = get_conschar( h, v ); - - while( h >= cons.w || v >= cons.h ) - return; - - h *= FONT_WIDTH; - v *= FONT_ADJ_HEIGHT; - - rskip = (FONT_WIDTH > 8)? 2 : 1; - c += rskip * (unsigned int)(ch & 0xff) * FONT_HEIGHT; - - for( x=0; x<FONT_WIDTH; x++ ) { - xx = x % 8; - if( x && !xx ) - c++; - m = (1<<(7-xx)); - for( y=0; y<FONT_HEIGHT; y++ ){ - int col = ((!(c[rskip*y] & m)) != invert) ? 254 : 0; - draw_pixel( h+x, v+y+1, col ); - } - draw_pixel( h+x, v, 254 ); - draw_pixel( h+x, v+FONT_HEIGHT+1, 254 ); - } -} - -static void -show_cursor( int show ) -{ - if( cons.cursor_on == show ) - return; - cons.cursor_on = show; - draw_char( cons.x, cons.y ); -} - - -static void -draw_line( int n ) -{ - int i; - - if( n >= cons.h || n < 0 ) - return; - for( i=0; i<cons.w; i++ ) - draw_char( i, n ); -} - -#if 0 -static void -refresh( void ) -{ - int i; - for( i=0; i<cons.h; i++ ) - draw_line(i); -} -#endif - -static int -console_init( void ) -{ - if( video_get_res(&cons.physw,&cons.physh) < 0 ) - return -1; - - set_color( 0, 0 ); - - cons.w = cons.physw/FONT_WIDTH; - cons.h = cons.physh/FONT_ADJ_HEIGHT; - cons.buf = malloc( cons.w * cons.h ); - cons.inited = 1; - cons.x = cons.y = 0; - cons.vc_state = ESnormal; - return 0; -} - -void -console_close( void ) -{ - if( !cons.inited ) - return; - free( cons.buf ); - cons.inited = 0; -} - -static void -rec_char( int ch, int x, int y ) -{ - if( (uint)x < cons.w && (uint)y < cons.h ) { - cons.buf[y*cons.w + x] = ch; - draw_char( x, y ); - } -} - -static void -scroll1( void ) -{ - int x; - - video_scroll( FONT_ADJ_HEIGHT ); - - for( x=0; x<cons.w; x++ ) - cons.buf[(cons.h-1)*cons.w + x] = 0; - draw_line(cons.h-1); -} - -static void -do_con_trol(int ch) -{ - unsigned int i, j; - - switch (ch) { - case 8: - if (cons.x) - cons.x--; - return; - case 10 ... 12: - cons.x = 0; - cons.y++; - return; - case 13: - cons.x = 0; - return; - case 24: - case 26: - cons.vc_state = ESnormal; - return; - case 27: - cons.vc_state = ESesc; - return; - } - - switch (cons.vc_state) { - case ESesc: - cons.vc_state = ESnormal; - switch (ch) { - case '[': - cons.vc_state = ESsquare; - return; - case 'M': - scroll1(); - return; - default: - printk("Unhandled escape code '%c'\n", ch); - return; - } - return; - case ESsquare: - for(cons.vc_npar = 0; cons.vc_npar < NPAR ; cons.vc_npar++) - cons.vc_par[cons.vc_npar] = 0; - cons.vc_npar = 0; - cons.vc_state = ESgetpars; - // Fall through - case ESgetpars: - if (ch == ';' && cons.vc_npar < NPAR - 1) { - cons.vc_npar++; - return; - } else if (ch >= '0' && ch <= '9') { - cons.vc_par[cons.vc_npar] *= 10; - cons.vc_par[cons.vc_npar] += ch - '0'; - return; - } else - cons.vc_state=ESgotpars; - // Fall through - case ESgotpars: - cons.vc_state = ESnormal; - switch(ch) { - case 'H': - case 'f': - if (cons.vc_par[0]) - cons.vc_par[0]--; - - if (cons.vc_par[1]) - cons.vc_par[1]--; - - cons.x = cons.vc_par[1]; - cons.y = cons.vc_par[0]; - return; - case 'J': - if (cons.vc_par[0] == 0 && (uint)cons.y < (uint)cons.h && - (uint)cons.x < (uint)cons.w) { - // erase from cursor to end of display - for (i = cons.x; i < cons.w; i++) - cons.buf[cons.y * cons.w + i] = ' '; - draw_line(cons.y); - for (j = cons.y + 1; j < cons.h; j++) { - for (i = 0; i < cons.w; i++) - cons.buf[j * cons.w + i] = ' '; - draw_line(j); - } - } - return; - case 'K': - switch (cons.vc_par[0]) { - case 0: /* erase from cursor to end of line */ - for (i = cons.x; i < cons.w; i++) - cons.buf[cons.y * cons.w + i] = ' '; - draw_line(cons.y); - return; - case 1: /* erase from start of line to cursor */ - for (i = 0; i <= cons.x; i++) - cons.buf[cons.y * cons.w + i] = ' '; - draw_line(cons.y); - return; - case 2: /* erase whole line */ - for (i = 0; i <= cons.w; i++) - cons.buf[cons.y * cons.w + i] = ' '; - draw_line(cons.y); - return; - default: - return; - } - return; - case 'M': - scroll1(); - return; - case 'm': - return; - case '@': - return; - default: - printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n", - ch, cons.vc_par[0], cons.vc_par[1], cons.vc_par[2], - cons.vc_par[3], cons.vc_par[4]); - return; - } - return; - default: - cons.vc_state = ESnormal; - rec_char(ch, cons.x++, cons.y); - return; - } -} - -int -console_draw_str( const char *str ) -{ - int ch, y, x; - - if( !cons.inited && console_init() ) - return -1; - - show_cursor(0); - while( (ch=*str++) ) { - do_con_trol(ch); - - if( cons.x >= cons.w ) { - cons.x=0, cons.y++; - } - if( cons.y >= cons.h ) { - for( y=0; y<cons.h-1; y++ ) - for( x=0; x<cons.w; x++ ) - cons.buf[y*cons.w + x] = cons.buf[(y+1)*cons.w + x]; - cons.y = cons.h-1; - cons.x = 0; - scroll1(); - } - } - show_cursor(1); - return 0; -}
Copied: openbios-devel/modules/console_common.c (from rev 342, openbios-devel/modules/console.c) =================================================================== --- openbios-devel/modules/console_common.c (rev 0) +++ openbios-devel/modules/console_common.c 2009-01-02 14:53:33 UTC (rev 343) @@ -0,0 +1,330 @@ +/* + * <console.c> + * + * Simple text console + * + * Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se) + * Copyright (C) 2005 Stefan Reinauer stepan@openbios.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation + * + */ + +#include "openbios/config.h" +#include "openbios/bindings.h" +#include "openbios/fontdata.h" +#include "video_subr.h" + +#if !defined(fontdata) +#if defined(CONFIG_FONT_8X8) +#define fontdata fontdata_8x8 +#define FONT_HEIGHT FONT_HEIGHT_8X8 +#define FONT_WIDTH FONT_WIDTH_8X8 +#elif defined(CONFIG_FONT_8X16) +#define fontdata fontdata_8x16 +#define FONT_HEIGHT FONT_HEIGHT_8X16 +#define FONT_WIDTH FONT_WIDTH_8X16 +#else +#error no font selected +#endif +#endif + +#define FONT_ADJ_HEIGHT (FONT_HEIGHT + 2) +#define NCOLS 80 +#define NROWS 48 + +typedef enum { + ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, + EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd, + ESpalette +} vc_state_t; + +#define NPAR 16 +static struct { + int inited; + int physw, physh; + int w,h; + + int x,y; + char *buf; + + int cursor_on; + vc_state_t vc_state; + unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current + escape sequence */ +} cons; + +static int +get_conschar( int x, int y ) +{ + if( (uint)x < cons.w && (uint)y < cons.h ) + return cons.buf[y*cons.w + x]; + return ' '; +} + +static void +draw_char( uint h, uint v ) +{ + const unsigned char *c = fontdata; + int x, y, xx, rskip, m; + int invert = (h==cons.x && v==cons.y && cons.cursor_on); + int ch = get_conschar( h, v ); + + while( h >= cons.w || v >= cons.h ) + return; + + h *= FONT_WIDTH; + v *= FONT_ADJ_HEIGHT; + + rskip = (FONT_WIDTH > 8)? 2 : 1; + c += rskip * (unsigned int)(ch & 0xff) * FONT_HEIGHT; + + for( x=0; x<FONT_WIDTH; x++ ) { + xx = x % 8; + if( x && !xx ) + c++; + m = (1<<(7-xx)); + for( y=0; y<FONT_HEIGHT; y++ ){ + int col = ((!(c[rskip*y] & m)) != invert) ? 254 : 0; + draw_pixel( h+x, v+y+1, col ); + } + draw_pixel( h+x, v, 254 ); + draw_pixel( h+x, v+FONT_HEIGHT+1, 254 ); + } +} + +static void +show_cursor( int show ) +{ + if( cons.cursor_on == show ) + return; + cons.cursor_on = show; + draw_char( cons.x, cons.y ); +} + + +static void +draw_line( int n ) +{ + int i; + + if( n >= cons.h || n < 0 ) + return; + for( i=0; i<cons.w; i++ ) + draw_char( i, n ); +} + +#if 0 +static void +refresh( void ) +{ + int i; + for( i=0; i<cons.h; i++ ) + draw_line(i); +} +#endif + +int +console_init( void ) +{ + if( video_get_res(&cons.physw,&cons.physh) < 0 ) + return -1; + + set_color( 0, 0 ); + + cons.w = cons.physw/FONT_WIDTH; + cons.h = cons.physh/FONT_ADJ_HEIGHT; + cons.buf = malloc( cons.w * cons.h ); + cons.inited = 1; + cons.x = cons.y = 0; + cons.vc_state = ESnormal; + return 0; +} + +void +console_close( void ) +{ + if( !cons.inited ) + return; + free( cons.buf ); + cons.inited = 0; +} + +static void +rec_char( int ch, int x, int y ) +{ + if( (uint)x < cons.w && (uint)y < cons.h ) { + cons.buf[y*cons.w + x] = ch; + draw_char( x, y ); + } +} + +static void +scroll1( void ) +{ + int x; + + video_scroll( FONT_ADJ_HEIGHT ); + + for( x=0; x<cons.w; x++ ) + cons.buf[(cons.h-1)*cons.w + x] = 0; + draw_line(cons.h-1); +} + +static void +do_con_trol(int ch) +{ + unsigned int i, j; + + switch (ch) { + case 8: + if (cons.x) + cons.x--; + return; + case 10 ... 12: + cons.x = 0; + cons.y++; + return; + case 13: + cons.x = 0; + return; + case 24: + case 26: + cons.vc_state = ESnormal; + return; + case 27: + cons.vc_state = ESesc; + return; + } + + switch (cons.vc_state) { + case ESesc: + cons.vc_state = ESnormal; + switch (ch) { + case '[': + cons.vc_state = ESsquare; + return; + case 'M': + scroll1(); + return; + default: + printk("Unhandled escape code '%c'\n", ch); + return; + } + return; + case ESsquare: + for(cons.vc_npar = 0; cons.vc_npar < NPAR ; cons.vc_npar++) + cons.vc_par[cons.vc_npar] = 0; + cons.vc_npar = 0; + cons.vc_state = ESgetpars; + // Fall through + case ESgetpars: + if (ch == ';' && cons.vc_npar < NPAR - 1) { + cons.vc_npar++; + return; + } else if (ch >= '0' && ch <= '9') { + cons.vc_par[cons.vc_npar] *= 10; + cons.vc_par[cons.vc_npar] += ch - '0'; + return; + } else + cons.vc_state=ESgotpars; + // Fall through + case ESgotpars: + cons.vc_state = ESnormal; + switch(ch) { + case 'H': + case 'f': + if (cons.vc_par[0]) + cons.vc_par[0]--; + + if (cons.vc_par[1]) + cons.vc_par[1]--; + + cons.x = cons.vc_par[1]; + cons.y = cons.vc_par[0]; + return; + case 'J': + if (cons.vc_par[0] == 0 && (uint)cons.y < (uint)cons.h && + (uint)cons.x < (uint)cons.w) { + // erase from cursor to end of display + for (i = cons.x; i < cons.w; i++) + cons.buf[cons.y * cons.w + i] = ' '; + draw_line(cons.y); + for (j = cons.y + 1; j < cons.h; j++) { + for (i = 0; i < cons.w; i++) + cons.buf[j * cons.w + i] = ' '; + draw_line(j); + } + } + return; + case 'K': + switch (cons.vc_par[0]) { + case 0: /* erase from cursor to end of line */ + for (i = cons.x; i < cons.w; i++) + cons.buf[cons.y * cons.w + i] = ' '; + draw_line(cons.y); + return; + case 1: /* erase from start of line to cursor */ + for (i = 0; i <= cons.x; i++) + cons.buf[cons.y * cons.w + i] = ' '; + draw_line(cons.y); + return; + case 2: /* erase whole line */ + for (i = 0; i <= cons.w; i++) + cons.buf[cons.y * cons.w + i] = ' '; + draw_line(cons.y); + return; + default: + return; + } + return; + case 'M': + scroll1(); + return; + case 'm': + return; + case '@': + return; + default: + printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n", + ch, cons.vc_par[0], cons.vc_par[1], cons.vc_par[2], + cons.vc_par[3], cons.vc_par[4]); + return; + } + return; + default: + cons.vc_state = ESnormal; + rec_char(ch, cons.x++, cons.y); + return; + } +} + +int +console_draw_str( const char *str ) +{ + int ch, y, x; + + if( !cons.inited && console_init() ) + return -1; + + show_cursor(0); + while( (ch=*str++) ) { + do_con_trol(ch); + + if( cons.x >= cons.w ) { + cons.x=0, cons.y++; + } + if( cons.y >= cons.h ) { + for( y=0; y<cons.h-1; y++ ) + for( x=0; x<cons.w; x++ ) + cons.buf[y*cons.w + x] = cons.buf[(y+1)*cons.w + x]; + cons.y = cons.h-1; + cons.x = 0; + scroll1(); + } + } + show_cursor(1); + return 0; +}
Modified: openbios-devel/modules/video.c =================================================================== --- openbios-devel/modules/video.c 2009-01-02 13:32:15 UTC (rev 342) +++ openbios-devel/modules/video.c 2009-01-02 14:53:33 UTC (rev 343) @@ -21,6 +21,11 @@ #include "openbios/drivers.h" #include "video_subr.h"
+typedef struct osi_fb_info { + unsigned long mphys; + int rb, w, h, depth; +} osi_fb_info_t; + static struct { int has_video; osi_fb_info_t fb;