Author: wmb Date: Wed May 25 09:03:39 2011 New Revision: 2222 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2222
Log: BIOSload version - added a VESA linear framebuffer driver.
Added: dev/video/controlr/vesalfb.fth Modified: cpu/x86/pc/biosload/callvbe.fth cpu/x86/pc/biosload/config-usbkey.fth cpu/x86/pc/biosload/devices.fth cpu/x86/pc/biosload/fw.bth cpu/x86/pc/biosload/ofw.bth
Modified: cpu/x86/pc/biosload/callvbe.fth ============================================================================== --- cpu/x86/pc/biosload/callvbe.fth Tue May 24 23:16:47 2011 (r2221) +++ cpu/x86/pc/biosload/callvbe.fth Wed May 25 09:03:39 2011 (r2222) @@ -103,19 +103,54 @@ repeat ( 'mode-list n mode# ) drop nip ( n ) ; -: .vesa-modes ( -- ) +0 value vesa-modes-adr +: vesa-mode-list ( -- adr ) + vesa-modes-adr ?dup if exit then ( ) vbe-info ( adr ) - dup l@ h# 41534556 <> if ( adr ) - ." VBE info call failed" cr - drop exit - then ( adr ) - dup 6 + seg:off@ .cstr cr ( adr ) + dup l@ h# 41534556 <> ( adr flag ) + abort" VBE info call failed" ( adr ) +\ dup 6 + seg:off@ .cstr cr ( adr ) d# 14 + seg:off@ ( 'mode-list ) dup #vesa-modes 1+ ( 'mode-list #modes ) /w* dup alloc-mem ( 'mode-list modes-len adr ) dup >r swap move r> ( adr ) - begin dup w@ dup h# ffff <> while .vesa-mode-info wa1+ repeat cr 2drop + dup to vesa-modes-adr ( adr ) +; +: .vesa-modes ( -- ) + vesa-mode-list + begin ( adr ) + dup w@ dup h# ffff <> ( adr mode# flag ) + exit? 0= and ( adr mode# flag ) + while ( adr mode# ) + .vesa-mode-info wa1+ ( adr' ) + repeat cr ( adr mode# ) + 2drop ( ) +; +: vesa-mode-match? ( x y depth mode# -- x y depth mode# match? ) + dup vesa-mode-info >r ( x y depth mode# r: adr ) + 3 pick r@ h# 12 + w@ <> if ( x y depth mode# r: adr ) + r> drop false exit ( -- x y depth mode# false ) + then ( x y depth mode# r: adr ) + 2 pick r@ h# 14 + w@ <> if ( x y depth mode# r: adr ) + r> drop false exit ( -- x y depth mode# false ) + then ( x y depth mode# r: adr ) + 1 pick r@ h# 19 + c@ <> if ( x y depth mode# r: adr ) + r> drop false exit ( -- x y depth mode# false ) + then ( x y depth mode# r: adr ) + r> drop true ; +: find-vesa-mode ( x y depth -- mode# ) + vesa-mode-list ( x y depth adr ) + begin dup w@ dup h# ffff <> while ( x y depth adr mode# ) + swap >r ( x y depth mode# r: adr ) + vesa-mode-match? if ( x y depth mode# r: adr ) + nip nip nip r> drop ( mode# ) + exit ( -- mode# ) + then ( x y depth mode# r: adr ) + drop r> wa1+ ( x y depth ) + repeat ( x y depth adr ) + 4drop 0 +;
[ifdef] Commentary 00.w mode attributes
Modified: cpu/x86/pc/biosload/config-usbkey.fth ============================================================================== --- cpu/x86/pc/biosload/config-usbkey.fth Tue May 24 23:16:47 2011 (r2221) +++ cpu/x86/pc/biosload/config-usbkey.fth Wed May 25 09:03:39 2011 (r2222) @@ -17,7 +17,8 @@ \ create virtual-mode create use-root-isa create use-isa-ide -create use-ega +create use-ega \ For text-mode display +\ create use-vesa \ For graphics-mode display create use-elf create use-ne2000 create use-watch-all
Modified: cpu/x86/pc/biosload/devices.fth ============================================================================== --- cpu/x86/pc/biosload/devices.fth Tue May 24 23:16:47 2011 (r2221) +++ cpu/x86/pc/biosload/devices.fth Wed May 25 09:03:39 2011 (r2222) @@ -236,6 +236,15 @@ end-package [then]
+[ifdef] use-vesa +0 0 " " " /" begin-package + " display" name + " vesa" " compatible" string-property + fload ${BP}/dev/video/controlr/vesalfb.fth +end-package +devalias screen /display \ Explicit, because it's not probed +[then] + [ifdef] use-ct65550 0 0 " i3b0" " /isa" begin-package fload ${BP}/dev/ct6555x/loadpkg.fth \ Video driver
Modified: cpu/x86/pc/biosload/fw.bth ============================================================================== --- cpu/x86/pc/biosload/fw.bth Tue May 24 23:16:47 2011 (r2221) +++ cpu/x86/pc/biosload/fw.bth Wed May 25 09:03:39 2011 (r2222) @@ -183,6 +183,12 @@ [then] [then]
+fload ${BP}/cpu/x86/pc/rmtools.fth + +[ifdef] syslinux-loaded +fload ${BP}/cpu/x86/pc/biosload/callvbe.fth +[then] + fload ${BP}/cpu/x86/pc/biosload/devices.fth
fload ${BP}/dev/scsi/probscsi.fth \ probe-scsi and probe-scsi-all @@ -240,14 +246,10 @@ ;
fload ${BP}/cpu/x86/pc/biosload/usb.fth -fload ${BP}/cpu/x86/pc/rmtools.fth + fload ${BP}/cpu/x86/pc/biosload/callbios.fth \ fload ${BP}/cpu/x86/pc/biosload/rmenter.fth
-[ifdef] syslinux-loaded -fload ${BP}/cpu/x86/pc/biosload/callvbe.fth -[then] - \ false to stand-init-debug? true to stand-init-debug?
Modified: cpu/x86/pc/biosload/ofw.bth ============================================================================== --- cpu/x86/pc/biosload/ofw.bth Tue May 24 23:16:47 2011 (r2221) +++ cpu/x86/pc/biosload/ofw.bth Wed May 25 09:03:39 2011 (r2222) @@ -157,6 +157,9 @@ [ifdef] use-vga " ${BP}/ofw/termemu/cp881-16.obf" " font" $add-deflated-dropin [then] +[ifdef] use-vesa + " ${BP}/ofw/termemu/cp881-16.obf" " font" $add-deflated-dropin +[then]
[ifdef] grub-loaded ofd @ fsize h# 60 - pad ! \ file size; store in memory for convenience below
Added: dev/video/controlr/vesalfb.fth ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ dev/video/controlr/vesalfb.fth Wed May 25 09:03:39 2011 (r2222) @@ -0,0 +1,130 @@ +\ See license at end of file +purpose: Display driver for VESA linear framebuffer + +d# 640 instance value width \ Active screen width +d# 480 instance value height \ Active screen height +d# 32 instance value depth +d# 640 4 * instance value /scanline \ Active screen width +: (set-resolution) ( width height depth -- ) + to depth to height to width + width depth 8 / * to /scanline +; + +0 value mode# +0 value old-mode# +: set-vesa-resolution ( -- ) + mode# vesa-mode-info + dup h# 10 + w@ to /scanline + dup h# 12 + w@ to width + dup h# 14 + w@ to height + h# 19 + c@ to depth +; +: fb-size ( -- len ) + height /scanline * h# 1000 round-up +; + +h# 200.0000 instance value /mem +: map-mem ( -- ) + mode# vesa-lfb-adr fb-size " map-in" $call-parent to frame-buffer-adr +; +: unmap-mem ( -- ) + frame-buffer-adr fb-size " map-out" $call-parent +; + +headers + +: declare-props ( -- ) \ Instantiate screen properties + " width" get-my-property if + width encode-int " width" property + height encode-int " height" property + depth encode-int " depth" property + /scanline encode-int " linebytes" property + else + 2drop + then +; + +: choose-mode ( -- ) + mode# if exit then + \ Lower-resolution modes scroll faster. 32-bit often works better than 16 + d# 640 d# 480 d# 32 find-vesa-mode ?dup if to mode# exit then + d# 640 d# 480 d# 16 find-vesa-mode ?dup if to mode# exit then + d# 800 d# 600 d# 32 find-vesa-mode ?dup if to mode# exit then + d# 800 d# 600 d# 16 find-vesa-mode ?dup if to mode# exit then + d# 1024 d# 768 d# 32 find-vesa-mode ?dup if to mode# exit then + d# 1024 d# 768 d# 16 find-vesa-mode ?dup if to mode# exit then + d# 1280 d# 1024 d# 32 find-vesa-mode ?dup if to mode# exit then + d# 1280 d# 1024 d# 16 find-vesa-mode ?dup if to mode# exit then + -1 throw +; +: init ( -- ) + current-vesa-mode to old-mode# + choose-mode + set-vesa-resolution + mode# set-linear-mode + map-mem + declare-props +; + +: init-hook ( -- ) ; +: display-remove ( -- ) unmap-mem old-mode# set-vesa-mode ; + +hex +headers + +" display" device-type +" ISO8859-1" encode-string " character-set" property +0 0 encode-bytes " iso6429-1983-colors" property + +: display-selftest ( -- failed? ) false ; + +: display-install ( -- ) + init + default-font set-font + width height over char-width / over char-height / + /scanline depth " fb-install" eval + +; + +' display-install is-install +' display-remove is-remove +' display-selftest is-selftest + +\ We could use the hardware blitter but it's hardly worth the effort. +\ Modern CPUs can pump bits into memory at a blistering rate. + +fload ${BP}/dev/video/common/rectangle16.fth + +: save-rectangle ( n x y w h -- x w y h n x y w h ) + 4 roll >r ( x y w h r: n ) + swap -rot ( x w y h r: n ) + r> ( x w y h n ) + 4 pick 3 pick ( x w y h n x y ) + 5 pick 4 pick ( x w y h n x y w h ) +; + +: text-mode3 ( -- ) 3 set-vesa-mode ; \ Disable SVGA, thus reverting to text mode + +\ LICENSE_BEGIN +\ Copyright (c) 2011 FirmWorks +\ +\ Permission is hereby granted, free of charge, to any person obtaining +\ a copy of this software and associated documentation files (the +\ "Software"), to deal in the Software without restriction, including +\ without limitation the rights to use, copy, modify, merge, publish, +\ distribute, sublicense, and/or sell copies of the Software, and to +\ permit persons to whom the Software is furnished to do so, subject to +\ the following conditions: +\ +\ The above copyright notice and this permission notice shall be +\ included in all copies or substantial portions of the Software. +\ +\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +\ +\ LICENSE_END
openfirmware@openfirmware.info