[openfirmware] [commit] r3707 - cpu/x86/pc/olpc/sstools
repository service
svn at openfirmware.info
Sat Jan 11 07:24:15 CET 2014
Author: quozl
Date: Sat Jan 11 07:24:15 2014
New Revision: 3707
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3707
Log:
OLPC XO-1 - screenshot tools
Added:
cpu/x86/pc/olpc/sstools/
cpu/x86/pc/olpc/sstools/565.fth
cpu/x86/pc/olpc/sstools/README
cpu/x86/pc/olpc/sstools/bmp.fth
cpu/x86/pc/olpc/sstools/xpm.fth
Added: cpu/x86/pc/olpc/sstools/565.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/pc/olpc/sstools/565.fth Sat Jan 11 07:24:15 2014 (r3707)
@@ -0,0 +1,47 @@
+\ dump frame buffer in C565 format
+
+dev /display
+: fb-va ( -- fb ) frame-buffer-adr ;
+dend
+
+: ts$ ( -- adr len )
+ time&date >unix-seconds push-decimal 0 <# #s #> pop-base
+;
+
+: putw ( w -- ) wbsplit swap ofd @ fputc ofd @ fputc ;
+
+: fb-save ( file ( -- )
+ writing
+ " C565" ofd @ fputs
+ screen-wh swap putw putw
+ " fb-va" screen-ih $call-method
+ screen-wh swap drop 0 do ( fb )
+ screen-wh drop 0 do ( fb )
+ dup w@ ( fb rgb565 )
+ putw
+ wa1+ ( fb' )
+ loop ( fb' )
+ loop drop ( )
+;
+
+: fb ( -- )
+ ts$
+ " u:\"
+ " fb-save %s%s.565" sprintf
+ screen-ih remove-output
+ 2dup type cr
+ ['] evaluate catch ?dup if nip nip .error then
+ screen-ih add-output
+;
+
+dev /keyboard
+: handler? ( scan-code -- flag )
+ dup h# 73 ( × ) = if fb true exit then
+ handle-volume?
+;
+\ FIXME: during check-alarm, the data stack pointer is in another
+\ place, leading to large negative depth and ?enough failures, in
+\ particular in writing.
+\ ' handler? to scan-handled?
+dend
+
Added: cpu/x86/pc/olpc/sstools/README
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/pc/olpc/sstools/README Sat Jan 11 07:24:15 2014 (r3707)
@@ -0,0 +1 @@
+screenshot tools for XO-1
Added: cpu/x86/pc/olpc/sstools/bmp.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/pc/olpc/sstools/bmp.fth Sat Jan 11 07:24:15 2014 (r3707)
@@ -0,0 +1,74 @@
+\ dump XO-1 frame buffer in BMP24 format
+
+dev /display
+: fb-va ( -- fb ) frame-buffer-adr ;
+dend
+
+: ts$ ( -- adr len )
+ time&date >unix-seconds push-decimal 0 <# #s #> pop-base
+;
+
+0 value bmp-width
+0 value bmp-height
+
+h# 36 constant /bmp-hdr
+/bmp-hdr buffer: bmp-hdr
+
+0 value fb-va
+
+: put-plane ( -- )
+ " fb-va" screen-ih $call-method to fb-va
+ bmp-height 0 do
+ bmp-width
+ 0 ?do
+ fb-va w@ ( rgb565 )
+ 565>rgb ( r g b )
+ ofd @ fputc
+ ofd @ fputc
+ ofd @ fputc
+ fb-va wa1+ to fb-va
+ loop
+ loop
+;
+
+: put-header ( -- )
+ " BM" bmp-hdr swap move \ Signature
+ bmp-width 3 * 4 round-up bmp-height *
+ dup bmp-hdr h# 22 + le-l! \ Image size
+ /bmp-hdr + bmp-hdr 2 + le-l! \ File size
+
+ 0 bmp-hdr 6 + le-l! \ Reserved
+ /bmp-hdr bmp-hdr h# 0a + le-l! \ Image data pixel array offset
+ h# 28 bmp-hdr h# 0e + le-l! \ Some variant of header size
+ bmp-width bmp-hdr h# 12 + le-l!
+ bmp-height negate bmp-hdr h# 16 + le-l! \ Pixel array order top to bottom
+ 1 bmp-hdr h# 1a + le-w! \ Planes
+ d# 24 bmp-hdr h# 1c + le-w! \ Bits per pixel
+ 0 bmp-hdr h# 1e + le-l! \ Compression
+
+ d# 2835 bmp-hdr h# 26 + le-l! \ X pixels/meter
+ d# 2835 bmp-hdr h# 2a + le-l! \ Y pixels/meter
+ 0 bmp-hdr h# 2e + le-l! \ Colors used
+ 0 bmp-hdr h# 32 + le-l! \ Colors important
+
+ bmp-hdr /bmp-hdr ofd @ fputs
+;
+
+: fb-save
+ writing
+ screen-wh to bmp-height to bmp-width
+
+ put-header
+ put-plane
+ ofd @ fclose
+;
+
+: fb ( -- )
+ ts$
+ " u:\"
+ " fb-save %s%s.bmp" sprintf
+ screen-ih remove-output
+ 2dup type cr
+ ['] evaluate catch ?dup if nip nip .error then
+ screen-ih add-output
+;
Added: cpu/x86/pc/olpc/sstools/xpm.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/pc/olpc/sstools/xpm.fth Sat Jan 11 07:24:15 2014 (r3707)
@@ -0,0 +1,111 @@
+\ save frame buffer in open firmware for screen shots (serial, X bitmap)
+
+dev /display
+: fb-va ( -- fb ) frame-buffer-adr ;
+dend
+
+: .xx ( b -- ) 0 <# # # #> type ;
+
+\ colour table,
+\ list of unique colours in frame buffer
+0 value ct \ address of table
+d# 62 value /ct \ entries in table (and alphabet utilisation, @-~)
+ \ d# 62 is insufficient for menu
+h# 0 value nct \ next entry to use in table
+
+\ borrowed from screen-ih
+d# 1200 value width
+d# 900 value height
+h# 0 value fb-va
+
+: ct-free ( -- )
+ ct /ct /w* free-mem
+;
+
+: ct-alloc ( -- )
+ /ct /w* alloc-mem to ct
+;
+
+: ct-init ( -- )
+ " fb-va" screen-ih $call-method to fb-va
+ ct /ct /w* erase
+ h# 0 to nct
+;
+
+: ct-dump ( -- ) \ dump colour table
+ nct if
+ nct 0 do
+ i . ct i wa+ w@ 565>rgb ( r g b ) rot . swap . . cr
+ loop
+ then
+;
+
+: ct-add ( pixel -- ) \ add a colour to the table if not already in table
+ nct if
+ nct 0 do ( pixel )
+ ct i wa+ w@ over = if ( pixel ) \ found
+ drop unloop exit ( ) \ no action required
+ then
+ loop ( pixel ) \ not found
+ then
+ nct /ct < if ( pixel )
+ ct nct wa+ w! ( ) \ store entry
+ nct 1+ to nct ( ) \ increment next slot
+ else
+ abort" ct: too many colours in frame buffer"
+ then
+;
+
+: ct-scan ( -- ) \ survey what colours are used
+ fb-va ( fb )
+ height 0 do ( fb )
+ width 0 do ( fb' )
+ dup w@ ct-add 2+ ( fb' )
+ loop ( fb' )
+ loop drop ( )
+;
+
+: xpm-head ( -- )
+ ." ! XPM2" cr
+ width .d height .d
+ nct .d 1 .d cr
+ nct 0 do
+ i h# 40 + emit
+ ." c #"
+ ct i wa+ w@ 565>rgb ( r g b ) rot .xx swap .xx .xx cr
+ loop
+;
+
+: xpm-body ( -- )
+ fb-va ( fb )
+ height 0 do ( fb )
+ width 0 do ( fb )
+ dup w@ ( fb pixel )
+ nct 0 do ( fb pixel )
+ ct i wa+ w@ over = if ( fb pixel ) \ found
+ i h# 40 + emit ( fb pixel )
+ leave ( fb pixel )
+ then
+ loop ( fb pixel ) \ not found
+ drop ( fb )
+ wa1+ ( fb' )
+ loop cr ( fb' )
+ loop drop ( )
+;
+
+: .xpm2 \ 256 colour from 16bpp
+ ct-alloc
+ ct-init
+ ct-scan
+ xpm-head
+ xpm-body
+ ct-free
+;
+
+: fb-save ( file ( -- )
+ to-file .xpm2
+;
+
+: ts$ ( -- adr len )
+ time&date >unix-seconds push-decimal 0 <# #s #> pop-base
+;
More information about the openfirmware
mailing list