[openfirmware] [commit] r2015 - cpu/arm cpu/arm/olpc/1.75 cpu/x86/pc/olpc cpu/x86/pc/olpc/via dev/olpc/spiflash dev/video/common ofw/gui
repository service
svn at openfirmware.info
Fri Nov 5 19:56:35 CET 2010
Author: wmb
Date: Fri Nov 5 19:56:34 2010
New Revision: 2015
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2015
Log:
Q4A04 - Manufacturing data support, switch to 16bpp mode, added back a lot of features that were omitted for early testing.
Added:
cpu/arm/olpc/1.75/getmfgdata.fth
cpu/x86/pc/olpc/getmfgdata.fth
Modified:
cpu/arm/fb8-ops.fth
cpu/arm/olpc/1.75/addrs.fth
cpu/arm/olpc/1.75/devices.fth
cpu/arm/olpc/1.75/fw-version.fth
cpu/arm/olpc/1.75/fw.bth
cpu/arm/olpc/1.75/lcd.fth
cpu/arm/olpc/1.75/lcdcfg.fth
cpu/arm/olpc/1.75/olpc.bth
cpu/arm/olpc/1.75/prefw.bth
cpu/arm/olpc/1.75/spiui.fth
cpu/x86/pc/olpc/addrs.fth
cpu/x86/pc/olpc/devices.fth
cpu/x86/pc/olpc/gridmap.fth
cpu/x86/pc/olpc/life.fth
cpu/x86/pc/olpc/mfgdata.fth
cpu/x86/pc/olpc/setwp.fth
cpu/x86/pc/olpc/via/addrs.fth
cpu/x86/pc/olpc/via/devices.fth
cpu/x86/pc/olpc/via/recover.fth
dev/olpc/spiflash/recover.fth
dev/olpc/spiflash/spiflash.fth
dev/olpc/spiflash/spiui.fth
dev/video/common/rectangle16.fth
ofw/gui/ofpong.fth
Modified: cpu/arm/fb8-ops.fth
==============================================================================
--- cpu/arm/fb8-ops.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/fb8-ops.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -43,12 +43,13 @@
ldmia sp!,{r1,r2,r3,r4,r5,tos}
\ r0:bg-colour r1:fg-colour r2:bytes/line r3:height r4:width r5:adr
+ add r4,r4,r4 \ Byte count instead of pixel count
begin
cmp r3,#0
> while
mov r6,#0
begin
- cmp r4,r6 \ more pixels/line?
+ cmp r4,r6 \ more bytes/line?
> while
ldrh r7,[r5,r6] \ get pixel colour at adr+offset
cmp r7,r0
@@ -70,13 +71,13 @@
\ r0:scratch r1:fg-colour r2:bytes/line r3:height r4:width r5:adr
\ r6 bytes/line, r7 scratch, r8 scratch, tos bg-color
- add r4,r4,r4, lsl #1 \ Multiply width by 4 to get bytes
+ add r4,r4,r4, lsl #1 \ Multiply width by 3 to get bytes
begin
cmp r3,#0
> while
mov r6,#0
begin
- cmp r4,r6 \ more pixels/line?
+ cmp r4,r6 \ more bytes on this line?
> while
add r0,r5,r6 \ r0 points to the pixel
ldrb r7,[r0] \ Start reading a 3-byte pixel
@@ -125,14 +126,14 @@
> while
mov r6,#0
begin
- cmp r4,r6 \ more pixels/line?
+ cmp r4,r6 \ more bytes on this line?
> while
- ldr r7,[r5,r6] \ get pixel colour at adr+offset
+ ldr r7,[r5,r6,lsl #2] \ get pixel colour at adr+offset
cmp r7,r0
- streq r1,[r5,r6]
+ streq r1,[r5,r6,lsl #2]
cmp r7,r1
- streq r0,[r5,r6]
- inc r6,#4
+ streq r0,[r5,r6,lsl #2]
+ inc r6,#1
repeat
add r5,r5,r2
dec r3,#1
@@ -197,9 +198,10 @@
and r0,r8,#7
rsb r0,r0,#8
movs r0,r9,asr r0
- strcsh r1,[r3,r8]
- strcch tos,[r3,r8]
- inc r8,#2
+ mov r0,r8,lsl #1
+ strcsh r1,[r3,r0]
+ strcch tos,[r3,r0]
+ inc r8,#1
repeat
add r7,r7,r6 \ new font-line
add r3,r3,r2 \ new screen-line
Modified: cpu/arm/olpc/1.75/addrs.fth
==============================================================================
--- cpu/arm/olpc/1.75/addrs.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/addrs.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -6,8 +6,16 @@
fb-pa constant available-ram-size
-h# 20000 constant dropin-offset \ Offset to dropin driver area in SPI FLASH
-h# 100000 constant /rom \ Total size of SPI FLASH
+h# 20000 constant dropin-offset \ Offset to dropin driver area in SPI FLASH
+[ifdef] use-flash-nvram
+h# d.0000 constant nvram-offset
+[then]
+
+h# e.0000 constant mfg-data-offset \ Offset to manufacturing data area in SPI FLASH
+h# f.0000 constant mfg-data-end-offset \ Offset to end of manufacturing data area in SPI FLASH
+h# f.ffd8 constant crc-offset
+
+h# 10.0000 constant /rom \ Total size of SPI FLASH
: (memory?) ( phys -- flag ) total-ram-size u< ;
Modified: cpu/arm/olpc/1.75/devices.fth
==============================================================================
--- cpu/arm/olpc/1.75/devices.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/devices.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -45,6 +45,15 @@
\ This devalias lets us say, for example, "dir rom:"
devalias rom /dropin-fs
+fload ${BP}/cpu/x86/pc/cpunode.fth \ The PC CPU node is actually fairly generic
+
+: cpu-mhz ( -- n )
+ " /cpu at 0" find-package drop ( phandle )
+ " clock-frequency" rot get-package-property if 0 exit then ( adr )
+ decode-int nip nip d# 1000000 /
+;
+
+
fload ${BP}/cpu/arm/mmp2/timer.fth
fload ${BP}/cpu/arm/mmp2/twsi.fth
fload ${BP}/cpu/arm/mmp2/mfpr.fth
@@ -53,14 +62,11 @@
\ fload ${BP}/cpu/arm/olpc/1.75/boardtwsi.fth
fload ${BP}/cpu/arm/olpc/1.75/boardgpio.fth
: init-stuff
-\ set-camera-domain-voltage
acgr-clocks-on
init-mfprs
set-gpio-directions
init-timers
init-twsi
-\ power-on-dsi
-\ power-on-sd
;
stand-init:
init-stuff
@@ -85,19 +91,6 @@
\needs md5init fload ${BP}/ofw/ppp/md5.fth \ MD5 hash
-
-[ifdef] notyet
-fload ${BP}/dev/olpc/confirm.fth \ Selftest interaction modalities
-fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data
-fload ${BP}/cpu/x86/pc/olpc/mfgtree.fth \ Manufacturing data in device tree
-fload ${BP}/cpu/x86/pc/olpc/kbdtype.fth \ Export keyboard type
-
-fload ${BP}/dev/olpc/kb3700/battery.fth \ Battery status reports
-[else]
-: confirm-selftest? ( -- flag ) false ; \ XXX implement me
-: find-tag ( adr len -- false | value$ true ) 2drop false ;
-[then]
-
fload ${BP}/dev/olpc/spiflash/flashif.fth \ Generic FLASH interface
fload ${BP}/dev/olpc/spiflash/spiif.fth \ Generic low-level SPI bus access
@@ -106,7 +99,6 @@
: ignore-power-button ; \ XXX implement me
: ssp-spi-reprogrammed ;
-: ?erased ( adr len -- flag ) 2drop true ;
: ?enough-power ( -- ) ;
fload ${BP}/cpu/arm/mmp2/sspspi.fth \ Synchronous Serial Port SPI interface
@@ -131,7 +123,18 @@
devalias dropins /dropins
-fload ${BP}/cpu/arm/olpc/1.75/spiui.fth \ User interface for SPI FLASH programming
+fload ${BP}/dev/olpc/confirm.fth \ Selftest interaction modalities
+fload ${BP}/cpu/arm/olpc/1.75/getmfgdata.fth \ Get manufacturing data
+fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data
+fload ${BP}/cpu/x86/pc/olpc/mfgtree.fth \ Manufacturing data in device tree
+
+[ifdef] notyet
+fload ${BP}/dev/olpc/kb3700/battery.fth \ Battery status reports
+[then]
+
+false constant tethered? \ We only support reprogramming our own FLASH
+
+fload ${BP}/dev/olpc/spiflash/spiui.fth \ User interface for SPI FLASH programming
\ fload ${BP}/dev/olpc/spiflash/recover.fth \ XO-to-XO SPI FLASH recovery
: ofw-fw-filename$ " disk:\boot\olpc.rom" ;
' ofw-fw-filename$ to fw-filename$
@@ -143,6 +146,32 @@
fload ${BP}/cpu/arm/olpc/1.75/lcd.fth
fload ${BP}/cpu/arm/olpc/1.75/dconsmb.fth \ SMB access to DCON chip - bitbanged
fload ${BP}/dev/olpc/dcon/mmp2dcon.fth \ DCON control
+ defer pixel*
+ defer pixel+
+ defer pixel!
+ depth d# 24 = [if]
+ code 3a+ ( adr n -- n' )
+ pop r0,sp
+ inc tos,#3
+ add tos,tos,r0
+ c;
+ code rgb888! ( n adr -- )
+ pop r0,sp
+ strb r0,[tos]
+ mov r0,r0,lsr #8
+ strb r0,[tos,#1]
+ mov r0,r0,lsr #8
+ strb r0,[tos,#2]
+ pop tos,sp
+ c;
+ ' 3* to pixel*
+ ' 3a+ to pixel+
+ ' rgb888! to pixel!
+ [else]
+ ' /w* to pixel*
+ ' wa+ to pixel+
+ ' w! to pixel!
+ [then]
: display-on
init-xo-display \ Turns on DCON
@@ -180,8 +209,6 @@
create 15x30pc " ${BP}/ofw/termemu/15x30pc.psf" $file,
' 15x30pc to romfont
-\ fload ${BP}/ofw/termemu/cp881-16.fth
-
fload ${BP}/cpu/arm/olpc/1.75/sdhci.fth
devalias int /sd at d4281000/disk
Modified: cpu/arm/olpc/1.75/fw-version.fth
==============================================================================
--- cpu/arm/olpc/1.75/fw-version.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/fw-version.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -1,3 +1,3 @@
\ The overall firmware revision
macro: FW_MAJOR A
-macro: FW_MINOR 03
+macro: FW_MINOR 04
Modified: cpu/arm/olpc/1.75/fw.bth
==============================================================================
--- cpu/arm/olpc/1.75/fw.bth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/fw.bth Fri Nov 5 19:56:34 2010 (r2015)
@@ -90,6 +90,19 @@
;
' (.firmware) to .firmware
+\ fload ${BP}/cpu/x86/pc/olpc/via/banner.fth
+
+patch merge-rect-565 merge-rect merge-cursor \ Hack since we do all our user-level graphics in 565
+patch merge-rect-565 merge-rect merge-cursor \ Hack since we do all our user-level graphics in 565
+
+[ifdef] notyet
+\ Uninstall the diag menu from the general user interface vector
+\ so exiting from emacs doesn't invoke the diag menu.
+' quit to user-interface
+fload ${BP}/cpu/x86/pc/olpc/via/mfgtest.fth
+fload ${BP}/cpu/x86/pc/olpc/via/bootmenu.fth
+[then]
+
: screen-#lines ( -- n )
screen-ih 0= if default-#lines exit then
screen-ih package( #lines )package
@@ -111,17 +124,44 @@
then
;
+fload ${BP}/cpu/x86/pc/olpc/via/banner.fth
+
fload ${BP}/cpu/x86/pc/olpc/help.fth
+fload ${BP}/cpu/x86/pc/olpc/gui.fth
+fload ${BP}/cpu/x86/pc/olpc/strokes.fth
+fload ${BP}/cpu/x86/pc/olpc/plot.fth
+
+\ Pseudo device that appears in the boot order before net booting
+0 0 " " " /" begin-package
+ " prober" device-name
+ : open
+ visible
+ false
+ ;
+ : close ;
+end-package
+fload ${BP}/dev/logdev.fth
[ifdef] notyet
-fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth
+fload ${BP}/dev/olpc/keyboard/selftest.fth \ Keyboard diagnostic
+fload ${BP}/dev/olpc/touchpad/touchpad.fth \ Touchpad diagnostic
+[then]
+fload ${BP}/cpu/x86/pc/olpc/gridmap.fth \ Gridded display tools
+fload ${BP}/cpu/x86/pc/olpc/via/copynand.fth
+[ifdef] notyet
+fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth
: emacs ( -- )
false to already-go?
boot-getline to boot-file " rom:emacs" $boot
;
+defer rm-go-hook \ Not used, but makes security happy
+fload ${BP}/cpu/x86/pc/olpc/security.fth
+
+[then]
fload ${BP}/ofw/gui/ofpong.fth
+[ifdef] notyet
fload ${BP}/cpu/x86/pc/olpc/life.fth
[then]
Added: cpu/arm/olpc/1.75/getmfgdata.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/arm/olpc/1.75/getmfgdata.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -0,0 +1,17 @@
+purpose: Get the manufacturing data into memory where it can be manipulated
+
+/flash-block buffer: mfg-data-buf
+
+: get-mfg-data ( -- )
+ flash-open
+ mfg-data-buf /flash-block mfg-data-offset flash-read
+;
+
+0 value mfg-data-read?
+: mfg-data-top ( -- adr )
+ mfg-data-read? 0= if
+ get-mfg-data
+ true to mfg-data-read?
+ then
+ mfg-data-buf /flash-block +
+;
Modified: cpu/arm/olpc/1.75/lcd.fth
==============================================================================
--- cpu/arm/olpc/1.75/lcd.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/lcd.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -9,7 +9,7 @@
h# 19 pmua-disp-clk-sel + h# d428284c l!
h# 1b pmua-disp-clk-sel + h# d428284c l!
- 0 h# 190 lcd! \ Disable LCD DMA controller
+ 0 h# 190 lcd! \ Disable LCD DMA controller
fb-pa h# f4 lcd! \ Frame buffer area 0
0 h# f8 lcd! \ Frame buffer area 1
hdisp bytes/pixel * h# fc lcd! \ Pitch in bytes
@@ -26,7 +26,8 @@
h# 2000000d h# 1b8 lcd! \ Dumb panel controller - 18 bit RGB666 on LDD[17:0]
h# 01330133 h# 13c lcd! \ Panel VSYNC Pulse Pixel Edge Control
clkdiv h# 1a8 lcd! \ Clock divider
- h# 08021100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 24 bpp mode
+\ h# 08021100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 24 bpp mode
+ h# 08001100 h# 190 lcd! \ DMA CTRL 0 - enable DMA, 16 bpp mode
;
: normal-hsv ( -- )
Modified: cpu/arm/olpc/1.75/lcdcfg.fth
==============================================================================
--- cpu/arm/olpc/1.75/lcdcfg.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/lcdcfg.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -14,9 +14,15 @@
: hfp ( -- n ) htotal hdisp - hsync - hbp - ; \ 24
: vfp ( -- n ) vtotal vdisp - vsync - vbp - ; \ 4
+0 [if]
3 constant #lanes
3 constant bytes/pixel
d# 24 constant bpp
+[else]
+2 constant #lanes
+2 constant bytes/pixel
+d# 16 constant bpp
+[then]
: >bytes ( pixels -- chunks ) bytes/pixel * ;
: >chunks ( pixels -- chunks ) >bytes #lanes / ;
Modified: cpu/arm/olpc/1.75/olpc.bth
==============================================================================
--- cpu/arm/olpc/1.75/olpc.bth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/olpc.bth Fri Nov 5 19:56:34 2010 (r2015)
@@ -196,7 +196,7 @@
filebuf /rom ofd @ fgets /rom <> abort" Can't read back image"
0 crctab filebuf /rom ($crc) crcbuf !
-/rom h# 28 - ofd @ fseek
+crc-offset ofd @ fseek
crcbuf /l ofd @ fputs
ofd @ fclose
Modified: cpu/arm/olpc/1.75/prefw.bth
==============================================================================
--- cpu/arm/olpc/1.75/prefw.bth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/prefw.bth Fri Nov 5 19:56:34 2010 (r2015)
@@ -255,6 +255,7 @@
false value gui-safeboot?
: 2tuck ( d1 d2 -- d2 d1 d2 ) 2swap 2over ;
+false value fru-test?
: user-ok "ok" ; \ This is supposed to check for authorization
true value user-mode?
Modified: cpu/arm/olpc/1.75/spiui.fth
==============================================================================
--- cpu/arm/olpc/1.75/spiui.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/arm/olpc/1.75/spiui.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -8,83 +8,7 @@
h# 4000 constant /chunk \ Convenient sized piece for progress reports
-[ifdef] use-flash-nvram
-h# d.0000 constant nvram-offset
-[then]
-
-[ifdef] mfg-data-top
-h# e.0000 constant mfg-data-offset
mfg-data-offset /flash-block + constant mfg-data-end-offset
-: mfg-data-range ( -- adr len ) mfg-data-top dup last-mfg-data tuck - ;
-
-[ifdef] $call-method
-: make-sn-name ( -- filename$ )
- " SN" find-tag 0= abort" No serial number in mfg data" ( sn$ )
- dup if ( sn$ )
- 2dup + 1- c@ 0= if ( sn$ )
- 1- ( sn$' ) \ Remove Null
- then ( sn$ )
- then ( sn$ )
- d# 11 over - dup 0> if ( sn$' #excess )
- /string ( sn$' ) \ Keep last 11 characters
- else ( sn$' #excess )
- drop ( sn$ )
- then ( sn$ )
-
- " disk:\" "temp place ( sn$' )
-
- dup 8 > if ( sn$ )
- over 8 "temp $cat ( sn$ )
- 8 /string ( sn$' )
- " ." "temp $cat ( sn$ )
- then ( sn$ )
- "temp $cat ( )
- "temp count ( filename$ )
-;
-
-: save-mfg-data ( -- )
- make-sn-name ( name$ )
- ." Creating " 2dup type cr
- $create-file ( ihandle )
- dup 0= abort" Can't create file" >r ( r: ihandle )
- mfg-data-range " write" r@ $call-method ( r: ihandle )
- r> close-dev
-;
-: restore-mfg-data ( "filename" -- )
- reading
- ifd @ fsize dup /flash-block > if ( len )
- drop ifd @ fclose ( )
- true abort" File is too big"
- then ( len )
- mfg-data-buf swap ( adr len )
- 2dup ifd @ fgets drop ( adr len )
- ifd @ fclose
-
- flash-write-enable
- mfg-data-offset flash-erase-block ( adr len )
- mfg-data-end-offset over - ( adr len offset )
- flash-write ( )
- flash-write-disable ( )
-;
-[then]
-
-: ?move-mfg-data ( -- )
- ." Merging existing manufacturing data" cr
-
- tethered? if
- \ Read the manufacturing data from the other FLASH
- flash-buf mfg-data-offset + /flash-block mfg-data-offset flash-read
- exit
- then
-
- \ Copy the entire block containing the manufacturing data into the
- \ memory buffer. This make verification easier.
-
- mfg-data-top /flash-block - ( src-adr )
- flash-buf mfg-data-offset + ( src-adr dst-adr )
- /flash-block move ( )
-;
-[then]
: write-flash-range ( adr end-offset start-offset -- )
." Writing" cr
@@ -118,6 +42,16 @@
;
+\ Perform a series of sanity checks on the new firmware image.
+
+: check-firmware-image ( adr len -- adr len )
+ dup /flash <> abort" Wrong image length" ( adr len )
+ 2dup + h# 40 - ( adr len signature-adr )
+ dup " CL1" comp abort" No firmware signature" ( adr len signature-adr )
+ ." Firmware: " h# 10 type ( adr len )
+ \ XXX add some more sanity checks
+;
+
[ifdef] load-base
: flash-buf load-base ;
: mfg-data-buf load-base /flash + ;
@@ -127,14 +61,12 @@
[then]
0 value file-loaded?
-h# 28 constant crc-offset \ From end
-
: crc ( adr len -- crc ) 0 crctab 2swap ($crc) ;
: ?crc ( -- )
." Checking integrity ..." cr
- flash-buf /flash + crc-offset - ( crc-adr )
+ flash-buf crc-offset + ( crc-adr )
dup l@ >r ( crc-adr r: crc )
-1 over l! ( crc-adr r: crc )
@@ -152,14 +84,12 @@
?crc
-[ifdef] mfg-data-offset
flash-buf mfg-data-offset + /flash-block ['] ?erased catch
abort" Firmware image has data in the manufacturing data block"
[ifdef] use-flash-nvram
flash-buf nvram-offset + /flash-block ['] ?erased catch
abort" Firmware image has data in the NVRAM block"
[then]
-[then]
;
: $get-file ( "filename" -- )
@@ -192,7 +122,76 @@
: verify ( -- ) ?file flash-buf /flash 0 verify-flash-range ;
-[ifdef] mfg-data-offset
+: mfg-data-range ( -- adr len ) mfg-data-top dup last-mfg-data tuck - ;
+
+[ifdef] $call-method
+: make-sn-name ( -- filename$ )
+ " SN" find-tag 0= abort" No serial number in mfg data" ( sn$ )
+ dup if ( sn$ )
+ 2dup + 1- c@ 0= if ( sn$ )
+ 1- ( sn$' ) \ Remove Null
+ then ( sn$ )
+ then ( sn$ )
+ d# 11 over - dup 0> if ( sn$' #excess )
+ /string ( sn$' ) \ Keep last 11 characters
+ else ( sn$' #excess )
+ drop ( sn$ )
+ then ( sn$ )
+
+ " disk:\" "temp place ( sn$' )
+
+ dup 8 > if ( sn$ )
+ over 8 "temp $cat ( sn$ )
+ 8 /string ( sn$' )
+ " ." "temp $cat ( sn$ )
+ then ( sn$ )
+ "temp $cat ( )
+ "temp count ( filename$ )
+;
+
+: save-mfg-data ( -- )
+ make-sn-name ( name$ )
+ ." Creating " 2dup type cr
+ $create-file ( ihandle )
+ dup 0= abort" Can't create file" >r ( r: ihandle )
+ mfg-data-range " write" r@ $call-method ( r: ihandle )
+ r> close-dev
+;
+: restore-mfg-data ( "filename" -- )
+ reading
+ ifd @ fsize dup /flash-block > if ( len )
+ drop ifd @ fclose ( )
+ true abort" File is too big"
+ then ( len )
+ mfg-data-buf swap ( adr len )
+ 2dup ifd @ fgets drop ( adr len )
+ ifd @ fclose
+
+ flash-write-enable
+ mfg-data-offset flash-erase-block ( adr len )
+ mfg-data-end-offset over - ( adr len offset )
+ flash-write ( )
+ flash-write-disable ( )
+;
+[then]
+
+: ?move-mfg-data ( -- )
+ ." Merging existing manufacturing data" cr
+
+ tethered? if
+ \ Read the manufacturing data from the other FLASH
+ flash-buf mfg-data-offset + /flash-block mfg-data-offset flash-read
+ exit
+ then
+
+ \ Copy the entire block containing the manufacturing data into the
+ \ memory buffer. This make verification easier.
+
+ mfg-data-top /flash-block - ( src-adr )
+ flash-buf mfg-data-offset + ( src-adr dst-adr )
+ /flash-block move ( )
+;
+
: verify-firmware ( -- )
[ifdef] use-flash-nvram
flash-buf nvram-offset 0 verify-flash-range \ Verify first part
@@ -214,14 +213,6 @@
flash-buf mfg-data-end-offset + /flash mfg-data-end-offset write-flash-range \ Write last part
;
-[else]
-: verify-firmware ( -- )
- flash-buf /flash 0 verify-flash-range \ Verify entire FLASH
-;
-: write-firmware ( -- )
- flash-buf /flash 0 write-flash-range \ Write entire FLASH
-;
-[then]
: .verify-msg ( -- )
." Type verify if you want to verify the data just written." cr
@@ -233,9 +224,7 @@
?file
flash-write-enable
-[ifdef] ?move-mfg-data
?move-mfg-data
-[then]
write-firmware
@@ -264,7 +253,6 @@
: flash ( ["filename"] -- ) get-file ?enough-power reflash ;
: flash! ( ["filename"] -- ) get-file reflash ;
-0 [if]
\ This is a slower version of "rom-va flash-buf /flash lmove"
\ It works around the problem that continuous CPU access to the
\ SPI FLASH starves the EC of instruction fetch cycles, often
@@ -290,7 +278,7 @@
flash-buf mfg-data-offset + /flash-block h# ff fill
\ Get the CRC and then replace it with -1
- flash-buf /flash + crc-offset - dup l@ swap
+ flash-buf crc-offset + dup l@ swap
-1 swap l!
flash-buf /flash crc <>
@@ -298,19 +286,8 @@
;
device-end
[then]
-[then]
0 [if]
-\ Perform a series of sanity checks on the new firmware image.
-
-: check-firmware-image ( adr len -- adr len )
- dup /flash <> abort" Wrong image length" ( adr len )
- 2dup + h# 40 - ( adr len signature-adr )
- dup " CL1" comp abort" No firmware signature" ( adr len signature-adr )
- ." Firmware: " h# 10 type ( adr len )
- \ XXX add some more sanity checks
-;
-
\ Erase the first block containing the EC microcode. This is dangerous...
: erase-ec ( -- ) 0 flash-erase-block ;
Modified: cpu/x86/pc/olpc/addrs.fth
==============================================================================
--- cpu/x86/pc/olpc/addrs.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/addrs.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -71,6 +71,14 @@
h# 3e constant cmos-alarm-month \ Offset of month alarm in CMOS
h# 32 constant cmos-century \ Offset of century byte in CMOS
+[ifdef] use-flash-nvram
+h# d.0000 constant nvram-offset
+[then]
+
+h# e.0000 constant mfg-data-offset \ Offset to manufacturing data area in SPI FLASH
+h# f.0000 constant mfg-data-end-offset \ Offset to end of manufacturing data area in SPI FLASH
+h# f.ffd0 constant crc-offset
+
fload ${BP}/cpu/x86/pc/virtaddr.fth
[ifndef] virtual-mode
h# ff80.0000 to fw-virt-base \ Override the usual setting; we use an MSR to double-map some memory up high
Modified: cpu/x86/pc/olpc/devices.fth
==============================================================================
--- cpu/x86/pc/olpc/devices.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/devices.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -304,6 +304,7 @@
;
fload ${BP}/dev/olpc/confirm.fth \ Selftest interaction modalities
+fload ${BP}/cpu/x86/pc/olpc/getmfgdata.fth \ Low-level access to manufacturing data
fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data
fload ${BP}/cpu/x86/pc/olpc/mfgtree.fth \ Manufacturing data in device tree
fload ${BP}/cpu/x86/pc/olpc/kbdtype.fth \ Export keyboard type
Added: cpu/x86/pc/olpc/getmfgdata.fth
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ cpu/x86/pc/olpc/getmfgdata.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -0,0 +1,11 @@
+\ Mfg data is in a block by itself.
+/flash-block buffer: mfg-data-buf
+
+\ Read mfg data from FLASH to RAM
+: get-mfg-data ( -- )
+ rom-pa mfg-data-offset + mfg-data-buf /flash-block lmove
+;
+
+: mfg-data-top ( -- adr )
+ flash-base mfg-data-end-offset +
+;
Modified: cpu/x86/pc/olpc/gridmap.fth
==============================================================================
--- cpu/x86/pc/olpc/gridmap.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/gridmap.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -35,6 +35,7 @@
: show-state ( eblock# state -- ) swap >loc glyph-w glyph-h do-fill ;
+[ifdef] 386-assembler
code map-color ( color24 -- color565 )
bx pop
bx ax mov 3 # ax shr h# 1f # ax and \ Blue in correct place
@@ -42,6 +43,22 @@
8 # bx shr h# f800 # bx and bx ax or \ Red, green and blue in place
ax push
c;
+[then]
+[ifdef] arm-assembler
+code map-color ( color24 -- color565 )
+ mov r0,tos,lsr #3
+ and r0,r0,#0x1f \ Blue
+
+ mov r1,tos,lsr #5
+ and r1,r1,#0x7e0
+ orr r0,r0,r1 \ Green
+
+ mov tos,tos,lsr #8
+ and tos,tos,#0xf800
+ orr tos,tos,r0 \ Red
+c;
+[then]
+
: show-color ( eblock# color32 -- ) map-color show-state ;
dev screen : erase-screen erase-screen ; dend
Modified: cpu/x86/pc/olpc/life.fth
==============================================================================
--- cpu/x86/pc/olpc/life.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/life.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -35,6 +35,7 @@
\needs xy+ : xy+ ( x1 y1 x2 y2 -- x3 y3 ) rot + -rot + swap ;
+[ifdef] 386-assembler
code sumcell ( adr -- sum )
bx pop
ax ax xor
@@ -49,7 +50,29 @@
ax push
c;
-
+[then]
+[ifdef] arm-assembler
+code sumcell ( adr -- sum )
+ mov r0,#0
+ ldrb r1,[tos, `lf_width negate`]
+ add r0,r0,r1
+ ldrb r1,[tos, `lf_width 1- negate`]
+ add r0,r0,r1
+ ldrb r1,[tos, `lf_width 1+ negate`]
+ add r0,r0,r1
+ ldrb r1,[tos, #-1]
+ add r0,r0,r1
+ ldrb r1,[tos, #1]
+ add r0,r0,r1
+ ldrb r1,[tos, `lf_width`]
+ add r0,r0,r1
+ ldrb r1,[tos, `lf_width 1-`]
+ add r0,r0,r1
+ ldrb r1,[tos, `lf_width 1+`]
+ add r0,r0,r1
+ mov r0,tos
+c;
+[then]
: +sum ( i j +i +j -- i j )
2over xy+ ( i j i' j' )
Modified: cpu/x86/pc/olpc/mfgdata.fth
==============================================================================
--- cpu/x86/pc/olpc/mfgdata.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/mfgdata.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -44,11 +44,6 @@
true ( adr data$ name-adr true )
;
-\ Mfg data is in a block by itself.
-: mfg-data-top ( -- adr )
- flash-base h# f.0000 +
-;
-
: (find-tag) ( name$ top-adr -- false | data$ true )
-rot drop >r ( adr r: name-adr )
begin another-tag? while ( adr' data$ tname-adr r: name-adr )
Modified: cpu/x86/pc/olpc/setwp.fth
==============================================================================
--- cpu/x86/pc/olpc/setwp.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/setwp.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -28,11 +28,6 @@
\ Set and clear the write-protect tag by copying, erasing, rewriting
-\ Read mfg data from FLASH to RAM
-: get-mfg-data ( -- )
- rom-pa mfg-data-offset + mfg-data-buf /flash-block lmove
-;
-
: (put-mfg-data)
mfg-data-buf mfg-data-end-offset mfg-data-offset write-flash-range
;
Modified: cpu/x86/pc/olpc/via/addrs.fth
==============================================================================
--- cpu/x86/pc/olpc/via/addrs.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/via/addrs.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -103,6 +103,15 @@
h# 7e constant cmos-alarm-month \ Offset of month alarm in CMOS
h# 7f constant cmos-century \ Offset of century byte in CMOS
+
+[ifdef] use-flash-nvram
+h# d.0000 constant nvram-offset
+[then]
+
+h# e.0000 constant mfg-data-offset \ Offset to manufacturing data area in SPI FLASH
+h# f.0000 constant mfg-data-end-offset \ Offset to end of manufacturing data area in SPI FLASH
+h# f.ffd4 constant crc-offset
+
fload ${BP}/cpu/x86/pc/virtaddr.fth
Modified: cpu/x86/pc/olpc/via/devices.fth
==============================================================================
--- cpu/x86/pc/olpc/via/devices.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/via/devices.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -281,6 +281,7 @@
;
fload ${BP}/dev/olpc/confirm.fth \ Selftest interaction modalities
+fload ${BP}/cpu/x86/pc/olpc/getmfgdata.fth \ Low-level access to manufacturing data
fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data
fload ${BP}/cpu/x86/pc/olpc/mfgtree.fth \ Manufacturing data in device tree
fload ${BP}/cpu/x86/pc/olpc/kbdtype.fth \ Export keyboard type
@@ -288,7 +289,6 @@
fload ${BP}/dev/olpc/kb3700/battery.fth \ Battery status reports
fload ${BP}/dev/olpc/spiflash/spiui.fth \ User interface for SPI FLASH programming
-h# 2c to crc-offset
fload ${BP}/cpu/x86/pc/olpc/via/recover.fth \ XO-to-XO SPI FLASH recovery
: ofw-fw-filename$ " disk:\boot\olpc.rom" ;
Modified: cpu/x86/pc/olpc/via/recover.fth
==============================================================================
--- cpu/x86/pc/olpc/via/recover.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ cpu/x86/pc/olpc/via/recover.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -16,7 +16,7 @@
: clone ( -- )
." Getting a copy of this machine's FLASH" cr
- slow-flash-read
+ safe-flash-read
true to file-loaded?
(tethered-flash)
Modified: dev/olpc/spiflash/recover.fth
==============================================================================
--- dev/olpc/spiflash/recover.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ dev/olpc/spiflash/recover.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -30,7 +30,7 @@
: clone ( -- )
." Getting a copy of this machine's FLASH" cr
- slow-flash-read
+ safe-flash-read
true to file-loaded?
(serial-flash)
Modified: dev/olpc/spiflash/spiflash.fth
==============================================================================
--- dev/olpc/spiflash/spiflash.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ dev/olpc/spiflash/spiflash.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -278,7 +278,7 @@
." If you power cycle and try again, it will probably work the next time." cr
abort
endof
- ( default ) ." Unsupported SPI FLASH ID " dup .x cr abort
+ ( default ) true abort" Unsupported SPI FLASH ID"
endcase
to write-spi-flash
0 spi-write-status \ Turn off write protect bits
Modified: dev/olpc/spiflash/spiui.fth
==============================================================================
--- dev/olpc/spiflash/spiui.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ dev/olpc/spiflash/spiui.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -8,13 +8,6 @@
h# 4000 constant /chunk \ Convenient sized piece for progress reports
-[ifdef] use-flash-nvram
-h# d.0000 constant nvram-offset
-[then]
-
-h# e.0000 constant mfg-data-offset
-mfg-data-offset /flash-block + constant mfg-data-end-offset
-
: write-flash-range ( adr end-offset start-offset -- )
." Writing" cr
?do ( adr )
@@ -24,7 +17,7 @@
\ Just write if reading is slow
true ( adr must-write? )
else ( adr )
- dup /flash-block i flash-verify ( adr must-write? )
+ dup /flash-block i flash-verify ( adr must-write? )
then ( adr must-write? )
if
@@ -59,21 +52,18 @@
[ifdef] load-base
: flash-buf load-base ;
-: mfg-data-buf load-base /flash + ;
[else]
/flash buffer: flash-buf
-/flash-block buffer: mfg-data-buf
[then]
-0 value file-loaded?
-h# 30 constant crc-offset \ From end (modified in devices.fth for XO 1.5)
+0 value file-loaded?
: crc ( adr len -- crc ) 0 crctab 2swap ($crc) ;
: ?crc ( -- )
." Checking integrity ..." cr
- flash-buf /flash + crc-offset - ( crc-adr )
+ flash-buf crc-offset + ( crc-adr )
dup l@ >r ( crc-adr r: crc )
-1 over l! ( crc-adr r: crc )
@@ -129,8 +119,6 @@
: verify ( -- ) ?file flash-buf /flash 0 verify-flash-range ;
-: mfg-data-range ( -- adr len ) mfg-data-top dup last-mfg-data tuck - ;
-
[ifdef] $call-method
: make-sn-name ( -- filename$ )
" SN" find-tag 0= abort" No serial number in mfg data" ( sn$ )
@@ -161,14 +149,16 @@
." Creating " 2dup type cr
$create-file ( ihandle )
dup 0= abort" Can't create file" >r ( r: ihandle )
- mfg-data-range " write" r@ $call-method ( r: ihandle )
+ mfg-data-buf /flash-block ( adr len r: ihandle )
+ 2dup mfg-data-offset flash-read ( adr len r: ihandle )
+ " write" r@ $call-method ( r: ihandle )
r> close-dev
;
: restore-mfg-data ( "filename" -- )
reading
- ifd @ fsize dup /flash-block > if ( len )
+ ifd @ fsize dup /flash-block <> if ( len )
drop ifd @ fclose ( )
- true abort" File is too big"
+ true abort" File is the wrong size - should be 65536 bytes"
then ( len )
mfg-data-buf swap ( adr len )
2dup ifd @ fgets drop ( adr len )
@@ -176,29 +166,11 @@
flash-write-enable
mfg-data-offset flash-erase-block ( adr len )
- mfg-data-end-offset over - ( adr len offset )
- flash-write ( )
+ mfg-data-offset flash-write ( )
flash-write-disable ( )
;
[then]
-: ?move-mfg-data ( -- )
- ." Merging existing manufacturing data" cr
-
- tethered? if
- \ Read the manufacturing data from the other FLASH
- flash-buf mfg-data-offset + /flash-block mfg-data-offset flash-read
- exit
- then
-
- \ Copy the entire block containing the manufacturing data into the
- \ memory buffer. This make verification easier.
-
- mfg-data-top /flash-block - ( src-adr )
- flash-buf mfg-data-offset + ( src-adr dst-adr )
- /flash-block move ( )
-;
-
: verify-firmware ( -- )
[ifdef] use-flash-nvram
flash-buf nvram-offset 0 verify-flash-range \ Verify first part
@@ -231,8 +203,6 @@
?file
flash-write-enable
- ?move-mfg-data
-
write-firmware
spi-us d# 20 < if
@@ -260,12 +230,14 @@
: flash ( ["filename"] -- ) get-file ?enough-power reflash ;
: flash! ( ["filename"] -- ) get-file reflash ;
+[ifdef] rom-pa
\ This is a slower version of "rom-va flash-buf /flash lmove"
\ It works around the problem that continuous CPU access to the
\ SPI FLASH starves the EC of instruction fetch cycles, often
-\ causing it to turn off the system.
+\ causing it to turn off the system. This is only a problem
+\ for systems where the CPU and EC share the SPI FLASH.
0 value rom-va
-: slow-flash-read ( -- )
+: safe-flash-read ( -- )
rom-pa /flash root-map-in to rom-va
/flash 0 do
rom-va i + flash-buf i + h# 1.0000 lmove
@@ -273,6 +245,11 @@
h# 1.0000 +loop
rom-va /flash root-map-out 0 to rom-va
;
+[else]
+: safe-flash-read ( -- )
+ flash-buf /flash 0 flash-read
+;
+[then]
[ifdef] dev
dev /flash
@@ -280,12 +257,12 @@
.mfg-data cr
." Checking SPI FLASH CRC ..."
- slow-flash-read
+ safe-flash-read
\ Replace the manufacturing data block with all FF
flash-buf mfg-data-offset + /flash-block h# ff fill
\ Get the CRC and then replace it with -1
- flash-buf /flash + crc-offset - dup l@ swap
+ flash-buf crc-offset + dup l@ swap
-1 swap l!
flash-buf /flash crc <>
Modified: dev/video/common/rectangle16.fth
==============================================================================
--- dev/video/common/rectangle16.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ dev/video/common/rectangle16.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -3,6 +3,80 @@
external
+[ifdef] arm-assembler
+code 565>argb-pixel ( 565 -- argb )
+ mov r0,tos,lsr #11
+ mov r0,r0,lsl #19 \ Red
+ orr r0,r0,#0x70000
+
+ mov r1,tos,lsl #27
+ mov r1,r1,lsr #24
+ orr r1,r1,#0x7
+ orr r0,r0,r1 \ Blue
+
+ mov tos,tos,lsl #21
+ mov tos,tos,lsr #26
+ mov tos,tos,lsl #10
+ orr tos,tos,#0x300
+
+ orr tos,tos,r0
+ orr tos,tos,#0xff000000
+c;
+code 565>argb ( src dst #pixels -- )
+ mov r2,tos
+ ldmia sp!,{r0,r1,tos} \ r0:dst, r1:src, r2:#pixels
+
+ begin
+ ldrh r3,[r1]
+ inc r1,#2
+
+ mov r4,r3,lsr #11
+ mov r4,r4,lsl #19 \ Red
+ orr r4,r4,#0x70000
+
+ mov r5,r3,lsl #27
+ mov r5,r5,lsr #24
+ orr r5,r5,#0x7
+ orr r4,r4,r5 \ Blue
+
+ mov r3,r3,lsl #21
+ mov r3,r3,lsr #26
+ mov r3,r3,lsl #10
+ orr r3,r3,#0x300
+
+ orr r3,r3,r4
+ orr r3,r3,#0xff000000
+
+ str r3,[r0],#4
+ decs r2,#1
+ 0= until
+c;
+code argb>565-pixel ( argb -- 565 )
+ ax pop
+ ax bx mov d# 19 # bx shr d# 11 # bx shl \ Red
+ ax dx mov d# 24 # dx shl d# 27 # dx shr dx bx or \ Blue
+ d# 16 # ax shl d# 26 # ax shr d# 5 # ax shl bx ax or \ Green
+ ax push
+c;
+
+code argb>565 ( src dst #pixels -- )
+ cx pop
+ di 0 [sp] xchg
+ si 4 [sp] xchg
+
+ begin
+ ax lods
+ ax bx mov d# 19 # bx shr d# 11 # bx shl \ Red
+ ax dx mov d# 24 # dx shl d# 27 # dx shr dx bx or \ Blue
+ d# 16 # ax shl d# 26 # ax shr d# 5 # ax shl bx ax or \ Green
+ op: ax stos
+ loopa
+
+ di pop
+ si pop
+c;
+[then]
+[ifdef] 386-assembler
code 565>argb-pixel ( 565 -- argb )
ax pop
ax bx mov d# 11 # bx shr d# 19 # bx shl \ Red
@@ -53,6 +127,7 @@
di pop
si pop
c;
+[then]
: rectangle-setup ( x y w h -- wb fbadr h )
swap depth * 3 rshift swap ( x y wbytes h )
Modified: ofw/gui/ofpong.fth
==============================================================================
--- ofw/gui/ofpong.fth Fri Nov 5 19:51:45 2010 (r2014)
+++ ofw/gui/ofpong.fth Fri Nov 5 19:56:34 2010 (r2015)
@@ -69,7 +69,7 @@
get-msecs to grandseed
;
-: random ( -- n ) grandseed 16807 * 17 + abs to grandseed grandseed 1000 mod ;
+: random1k ( -- n ) grandseed 16807 * 17 + abs to grandseed grandseed 1000 mod ;
: unscale ( n -- n ) pscale 2/ + pscale / ;
: calcbatx ( n -- x ) screenw ballsize 3 * - * ballsize + ;
: paintrect ( c pixx pixy pixw pixh -- ) " fill-rectangle" $call-screen ;
@@ -236,16 +236,16 @@
: resetball ( -- )
500 to ballstop
- screenw ballsize - 2 / pscale * ballx pscale mod + random + to ballx
- screenh ballsize - 2 / pscale * bally pscale mod + random + to bally
+ screenw ballsize - 2 / pscale * ballx pscale mod + random1k + to ballx
+ screenh ballsize - 2 / pscale * bally pscale mod + random1k + to bally
- random screenw pscale * * 2000000 / to balldx
- random screenh pscale * * 2000000 / to balldy
- balldx screenw pscale * 3000 / + to balldx
- balldy screenh pscale * 6000 / + to balldy
+ random1k screenw pscale * * 2000000 / to balldx
+ random1k screenh pscale * * 2000000 / to balldy
+ balldx screenw pscale * 3000 / + to balldx
+ balldy screenh pscale * 6000 / + to balldy
- random 500 < if balldx negate to balldx then
- random 500 < if balldy negate to balldy then
+ random1k 500 < if balldx negate to balldx then
+ random1k 500 < if balldy negate to balldy then
;
: initvalues ( -- )
@@ -391,11 +391,11 @@
then
ballx reflect_left_x > if
- balldx abs random 50 / + to balldx
+ balldx abs random1k 50 / + to balldx
leftbaty bally - unscale
dup 0 batsize between if
- batsize 2 / - random * 2 / batsize / 25 / balldy + to balldy
+ batsize 2 / - random1k * 2 / batsize / 25 / balldy + to balldy
else
drop
then
@@ -417,11 +417,11 @@
then
ballx reflect_right_x < if
- balldx abs random 50 / + negate to balldx
+ balldx abs random1k 50 / + negate to balldx
rightbaty bally - unscale
dup 0 batsize between if
- batsize 2 / - random * 2 / batsize / 25 / balldy + to balldy
+ batsize 2 / - random1k * 2 / batsize / 25 / balldy + to balldy
else
drop
then
More information about the openfirmware
mailing list