[OpenBIOS] [PATCH 08/16] video: Create tcx.fs and vga.fs to simulate Fcode video initialisation code.
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sun Mar 10 17:50:38 CET 2013
The IEEE1275 is-install routine needs to call a basic initialisation routine for
each driver as typically supplied as an Fcode ROM. Provide a suitable set of
basic initialisers for a QEMU host.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
openbios-devel/drivers/build.xml | 2 ++
openbios-devel/drivers/tcx.fs | 13 +++++++++
openbios-devel/drivers/vga.fs | 13 +++++++++
openbios-devel/forth/device/display.fs | 15 ++++++++++
openbios-devel/libopenbios/video_common.c | 45 +++++++++++++++++++++++++++++
openbios-devel/packages/video.c | 15 ----------
6 files changed, 88 insertions(+), 15 deletions(-)
create mode 100644 openbios-devel/drivers/tcx.fs
create mode 100644 openbios-devel/drivers/vga.fs
diff --git a/openbios-devel/drivers/build.xml b/openbios-devel/drivers/build.xml
index 75aff87..e564292 100644
--- a/openbios-devel/drivers/build.xml
+++ b/openbios-devel/drivers/build.xml
@@ -29,6 +29,8 @@
<object source="pci.fs" condition="DRIVER_PCI"/>
<object source="sbus.fs" condition="DRIVER_SBUS"/>
<object source="esp.fs" condition="DRIVER_ESP"/>
+ <object source="tcx.fs" condition="DRIVER_SBUS"/>
+ <object source="vga.fs" condition="DRIVER_VGA"/>
</dictionary>
</build>
diff --git a/openbios-devel/drivers/tcx.fs b/openbios-devel/drivers/tcx.fs
new file mode 100644
index 0000000..4035b45
--- /dev/null
+++ b/openbios-devel/drivers/tcx.fs
@@ -0,0 +1,13 @@
+\
+\ Fcode payload for QEMU TCX graphics card
+\
+\ This is the Forth source for an Fcode payload to initialise
+\ the QEMU TCX graphics card.
+\
+
+: qemu-tcx-driver-init ( -- )
+ qemu-video-addr to frame-buffer-adr
+ default-font set-font
+ qemu-video-width qemu-video-height over char-width / over char-height /
+ fb8-install
+;
diff --git a/openbios-devel/drivers/vga.fs b/openbios-devel/drivers/vga.fs
new file mode 100644
index 0000000..632cca0
--- /dev/null
+++ b/openbios-devel/drivers/vga.fs
@@ -0,0 +1,13 @@
+\
+\ Fcode payload for QEMU VGA graphics card
+\
+\ This is the Forth source for an Fcode payload to initialise
+\ the QEMU VGA graphics card.
+\
+
+: qemu-vga-driver-init ( -- )
+ qemu-video-addr to frame-buffer-adr
+ default-font set-font
+ qemu-video-width qemu-video-height over char-width / over char-height /
+ fb8-install
+;
diff --git a/openbios-devel/forth/device/display.fs b/openbios-devel/forth/device/display.fs
index bbd2b13..0df7165 100644
--- a/openbios-devel/forth/device/display.fs
+++ b/openbios-devel/forth/device/display.fs
@@ -44,6 +44,10 @@ hex
0 value foreground-color
0 value background-color
+\ internal values read from QEMU firmware interface
+0 value qemu-video-addr
+0 value qemu-video-height
+0 value qemu-video-width
\ The following wordset is called the "defer word interface" of the
\ terminal-emulator support package. It gets overloaded by fb1-install
@@ -102,6 +106,8 @@ defer fb-emit ( x -- )
s" open" header
1 , \ colon definition
,
+ ['] (lit) ,
+ -1 ,
['] (semis) ,
reveal
s" : write dup >r bounds do i c@ fb-emit loop r> ; " evaluate
@@ -242,6 +248,10 @@ defer fb-emit ( x -- )
false to inverse-screen?
0 to foreground-color
d# 15 to background-color
+
+ \ override with OpenBIOS defaults
+ fe to background-color
+ 0 to foreground-color
;
: fb8-toggle-cursor ( -- )
@@ -363,4 +373,9 @@ defer fb-emit ( x -- )
then
to foreground-color to background-color
+ \ ... but let's override with some better defaults
+ fe to background-color
+ 0 to foreground-color
+
+ fb8-erase-screen
;
diff --git a/openbios-devel/libopenbios/video_common.c b/openbios-devel/libopenbios/video_common.c
index 0892859..f33286b 100644
--- a/openbios-devel/libopenbios/video_common.c
+++ b/openbios-devel/libopenbios/video_common.c
@@ -16,6 +16,8 @@
#include "config.h"
#include "libopenbios/bindings.h"
+#include "libopenbios/console.h"
+#include "libopenbios/fontdata.h"
#include "libopenbios/ofmem.h"
#include "libopenbios/video.h"
#include "packages/video.h"
@@ -211,6 +213,26 @@ refresh_palette( void )
#endif
}
+static void
+video_open(void)
+{
+ PUSH(-1);
+}
+
+/* ( addr len -- actual ) */
+static void
+video_write(void)
+{
+ char *addr;
+ int len;
+
+ len = POP();
+ addr = (char *)cell2pointer(POP());
+
+ console_draw_fstr(addr, len);
+ PUSH(len);
+}
+
void
init_video( unsigned long fb, int width, int height, int depth, int rb )
{
@@ -241,6 +263,15 @@ init_video( unsigned long fb, int width, int height, int depth, int rb )
set_int_property( ph, "address", video.fb.mvirt );
activate_dev(ph);
+
+ if (!find_package_method("open", ph)) {
+ bind_func("open", video_open);
+ }
+
+ if (!find_package_method("write", ph)) {
+ bind_func("write", video_write);
+ }
+
molvideo_init();
}
video.has_video = 1;
@@ -250,6 +281,20 @@ init_video( unsigned long fb, int width, int height, int depth, int rb )
PUSH(video.fb.mvirt);
feval("to frame-buffer-adr");
+ /* Set global variables ready for fb8-install */
+ PUSH((ucell)fontdata);
+ feval("to (romfont)");
+ PUSH(FONT_HEIGHT);
+ feval("to (romfont-height)");
+ PUSH(FONT_WIDTH);
+ feval("to (romfont-width)");
+ PUSH(video.fb.mvirt);
+ feval("to qemu-video-addr");
+ PUSH(video.fb.w);
+ feval("to qemu-video-width");
+ PUSH(video.fb.h);
+ feval("to qemu-video-height");
+
#if defined(CONFIG_OFMEM) && defined(CONFIG_DRIVER_PCI)
size = ((video.fb.h * video.fb.rb) + 0xfff) & ~0xfff;
diff --git a/openbios-devel/packages/video.c b/openbios-devel/packages/video.c
index 2c2aeac..e68faa5 100644
--- a/openbios-devel/packages/video.c
+++ b/openbios-devel/packages/video.c
@@ -84,26 +84,11 @@ video_fill_rect( void )
fill_rect( color_ind, x, y, w, h );
}
-/* ( addr len -- actual ) */
-static void
-video_write(void)
-{
- char *addr;
- int len;
-
- len = POP();
- addr = (char *)cell2pointer(POP());
-
- console_draw_fstr(addr, len);
- PUSH(len);
-}
-
NODE_METHODS( video ) = {
{"dimensions", video_dimensions },
{"set-colors", video_set_colors },
{"fill-rectangle", video_fill_rect },
{"color!", video_color_bang },
- {"write", video_write },
};
--
1.7.10.4
More information about the OpenBIOS
mailing list