Author: wmb
Date: 2009-07-31 20:46:49 +0200 (Fri, 31 Jul 2009)
New Revision: 1264
Added:
cpu/x86/pc/olpc/via/copynand.fth
Modified:
cpu/x86/pc/olpc/via/devices.fth
cpu/x86/pc/olpc/via/fw.bth
cpu/x86/pc/olpc/via/olpc.bth
Log:
Via - added "fs-update" command for OS installation.
Added: cpu/x86/pc/olpc/via/copynand.fth
===================================================================
--- cpu/x86/pc/olpc/via/copynand.fth (rev 0)
+++ cpu/x86/pc/olpc/via/copynand.fth 2009-07-31 18:46:49 UTC (rev 1264)
@@ -0,0 +1,567 @@
+\ See license at end of file
+purpose: Copy a file onto the NAND FLASH
+
+0 value fileih
+0 value nandih
+
+h# 20000 value /nand-block
+h# 200 value /nand-page
+/nand-block /nand-page / value nand-pages/block
+0 value #nand-pages
+
+0 value #image-eblocks
+
+: $call-nand ( ?? method$ -- ?? ) nandih $call-method ;
+
+: close-image-file ( -- )
+ fileih ?dup if 0 to fileih close-dev then
+;
+: close-nand ( -- )
+ nandih ?dup if 0 to nandih close-dev then
+;
+: close-nand-ihs ( -- )
+ close-image-file
+ close-nand
+;
+
+: ?nand-abort ( flag msg$ -- )
+ rot if
+ close-nand-ihs $abort
+ else
+ 2drop
+ then
+;
+
+: ?key-stop ( -- )
+ key? dup if key drop then ( stop? )
+ " Stopped by keystroke" ?nand-abort
+;
+
+: set-nand-vars ( -- )
+ " size" $call-nand /nand-page um/mod nip to #nand-pages
+;
+: open-nand ( -- )
+ " fsdisk" open-dev to nandih
+ nandih 0= " Can't open disk device" ?nand-abort
+ set-nand-vars
+;
+
+h# 100 buffer: image-name-buf
+: image-name$ ( -- adr len ) image-name-buf count ;
+
+: get-img-filename ( -- ) safe-parse-word image-name-buf place ;
+
+: open-img ( "devspec" -- )
+ image-name$ open-dev to fileih
+ fileih 0= " Can't open NAND image file" ?nand-abort
+ " size" fileih $call-method ( d.size )
+
+ 2dup h# 20000 um/mod swap if 1+ then ( d.size #eblocks )
+ nip nip ( #eblocks )
+
+ to #image-eblocks
+
+ #image-eblocks 0= " Image file is empty" ?nand-abort
+;
+
+: read-image-block ( -- )
+ load-base /nand-block " read" fileih $call-method ( len )
+ dup /nand-block <> if ( len )
+ load-base over + /nand-page rot - h# ff fill
+ else
+ drop
+ then
+;
+
+: check-mem-hash ( record# -- )
+ drop \ XXX
+;
+
+
+defer show-init ( #eblocks -- )
+' drop to show-init
+
+defer show-erasing ( #blocks -- )
+: (show-erasing) ( #blocks -- ) ." Erasing " . ." blocks" cr ;
+' (show-erasing) to show-erasing
+
+defer show-erased ( block# -- )
+: (show-erased) ( block# -- ) (cr . ;
+' (show-erased) to show-erased
+
+defer show-bad ( block# -- )
+' drop to show-bad
+
+defer show-bbt-block ( block# -- )
+' drop to show-bbt-block
+
+defer show-clean ( block# -- )
+' drop to show-clean
+
+defer show-cleaning ( -- )
+: (show-cleaning) ( -- ) cr ." Cleanmarkers" ;
+' (show-cleaning) to show-cleaning
+
+defer show-writing ( #blocks -- )
+: (show-writing) ." Writing " . ." blocks" cr ;
+' (show-writing) to show-writing
+
+defer show-pending ( block# -- )
+' drop to show-pending
+
+defer show-written
+: (show-written) ( block# -- ) (cr . ;
+' (show-written) to show-written
+
+defer show-strange
+' drop to show-strange
+
+defer show-done
+' cr to show-done
+
+: written? ( adr len -- flag ) h# ffffffff lskip 0<> ;
+
+h# 80 h# 80 h# 80 rgb>565 constant bbt-color \ gray
+ 0 0 0 rgb>565 constant erased-color \ black
+h# ff 0 0 rgb>565 constant bad-color \ red
+ 0 0 h# ff rgb>565 constant clean-color \ blue
+h# ff 0 h# ff rgb>565 constant partial-color \ magenta
+h# ff h# ff 0 rgb>565 constant pending-color \ yellow
+ 0 h# ff 0 rgb>565 constant written-color \ green
+ 0 h# ff h# ff rgb>565 constant strange-color \ cyan
+h# ff h# ff h# ff rgb>565 constant starting-color \ white
+
+d# 22 constant status-line
+
+: gshow-init ( #eblocks -- )
+ cursor-off " erase-screen" $call-screen
+
+ starting-color ( #eblocks color )
+ swap 0 ?do i over show-state loop
+ drop
+ 0 status-line at-xy
+;
+
+: gshow-erasing ( #eblocks -- ) drop ." Erasing " ;
+
+: gshow-erased ( eblock# -- ) erased-color show-state ;
+: gshow-bad ( eblock# -- ) bad-color show-state ;
+: gshow-bbt-block ( eblock# -- ) bbt-color show-state ;
+: gshow-clean ( eblock# -- ) clean-color show-state ;
+: gshow-strange ( eblock# -- ) strange-color show-state ;
+
+: gshow-cleaning ( -- ) d# 26 status-line at-xy ." Cleanmarkers" cr ;
+: gshow-done ( -- ) cursor-on ;
+
+: gshow-pending ( eblock# -- ) pending-color show-state ;
+
+: gshow-writing ( #eblocks -- )
+ ." Writing "
+ 0 swap 0 ?do ( eblock# )
+ dup show-pending ( eblock# )
+ 1 ( eblock# increment )
+ swap 1+ swap ( eblock#' increment )
+ +loop ( eblock#' )
+ drop
+;
+
+: show-eblock# ( eblock# -- ) d# 20 status-line at-xy .x ;
+: gshow-written ( eblock# -- )
+ dup written-color show-state
+ show-eblock#
+;
+
+: gshow
+ ['] gshow-init to show-init
+ ['] gshow-erasing to show-erasing
+ ['] gshow-erased to show-erased
+ ['] gshow-bad to show-bad
+ ['] gshow-bbt-block to show-bbt-block
+ ['] gshow-clean to show-clean
+ ['] gshow-cleaning to show-cleaning
+ ['] gshow-pending to show-pending
+ ['] gshow-writing to show-writing
+ ['] gshow-written to show-written
+ ['] gshow-strange to show-strange
+ ['] gshow-done to show-done
+;
+
+gshow
+
+\ 0 - marked bad block : show-bad
+\ 1 - unreadable block : show-bad
+\ 2 - jffs2 w/ summary: show-written
+\ 3 - jffs2 w/o summary: show-pending
+\ 4 - clean : show-clean
+\ 5 - non-jffs2 data : show-strange
+\ 6 - erased : show-erased
+\ 7 - primary bad-block-table : show-bbt-block
+\ 8 - secondary bad-block-table : show-bbt-block
+: show-status ( status eblock# -- )
+ swap case
+ 0 of show-bad endof
+ 1 of show-bad endof
+ 2 of show-written endof
+ 3 of show-pending endof
+ 4 of show-clean endof
+ 5 of show-strange endof
+ 6 of show-erased endof
+ 7 of show-bbt-block endof
+ 8 of show-bbt-block endof
+ endcase
+;
+
+0 value nand-map
+0 value working-page
+: classify-block ( page# -- status )
+ to working-page
+
+ working-page /nand-page um* " seek" $call-nand drop
+
+ \ Try to read the first few bytes
+ load-base /l " read" $call-nand
+
+ \ Check for non-erased, non-JFFS2 data
+ load-base l@ h# ffff.ffff <> if 5 exit then
+
+ \ See if the whole thing is really completely erased
+ load-base /l + /nand-block /l - " read" $call-nand /nand-block /l - <> if 1 exit then
+
+ \ Not completely erased
+ load-base /nand-block written? if 5 exit then
+
+ \ Erased
+ 6
+;
+
+0 value current-block
+0 value examine-done?
+
+string-array status-descriptions
+ ," Marked bad in Bad Block Table" \ 0
+ ," Read error" \ 1
+ ," JFFS2 data with summary" \ 2
+ ," JFFS2 data, no summary" \ 3
+ ," Clean (erased with JFFS2 cleanmarker)" \ 4
+ ," Dirty, with non-JFFS2 data" \ 5
+ ," Erased, no cleanmarker" \ 6
+ ," Primary Bad Block Table" \ 7
+ ," Secondary Bad Block Table" \ 8
+end-string-array
+
+: show-block-status ( block# -- )
+ dup show-eblock#
+ nand-map + c@ status-descriptions count type kill-line
+;
+
+: cell-border ( block# color -- )
+ swap >loc ( color x y )
+ -1 -1 xy+
+ 3dup grid-w 1 do-fill ( color x y )
+ 3dup grid-w 0 xy+ 1 grid-h do-fill ( color x y )
+ 3dup 0 1 xy+ 1 grid-h do-fill ( color x y )
+ 1 grid-h xy+ grid-w 1 do-fill
+;
+: lowlight ( block# -- ) background-rgb rgb>565 cell-border ;
+: highlight ( block# -- ) 0 cell-border ;
+: point-block ( block# -- )
+ current-block lowlight
+ to current-block
+ current-block highlight
+;
+
+0 value nand-block-limit
+: +block ( offset -- )
+ current-block + nand-block-limit mod ( new-block )
+ point-block
+ current-block show-block-status
+;
+
+: process-key ( char -- )
+ case
+ h# 9b of endof
+ [char] A of #cols negate +block endof \ up
+ [char] B of #cols +block endof \ down
+ [char] C of 1 +block endof \ right
+ [char] D of -1 +block endof \ left
+ [char] ? of #cols 8 * negate +block endof \ page up
+ [char] / of #cols 8 * +block endof \ page down
+ [char] K of 8 +block endof \ page right
+ [char] H of -8 +block endof \ page left
+ h# 1b of d# 20 ms key? 0= if true to examine-done? then endof
+ endcase
+;
+
+: examine-nand ( -- )
+ 0 status-line 1- at-xy red-letters ." Arrows, fn Arrows to move, Esc to exit" black-letters cr
+ #nand-pages nand-pages/block / to nand-block-limit
+ 0 to current-block
+ current-block highlight
+ false to examine-done?
+ begin key process-key examine-done? until
+ current-block lowlight
+;
+
+: (scan-nand) ( -- )
+ nand-map 0= if
+ #nand-pages nand-pages/block / alloc-mem to nand-map
+ then
+
+ " usable-page-limit" $call-nand
+ dup nand-pages/block / show-init ( page-limit )
+
+ 0 ?do
+ i classify-block ( status )
+ i nand-pages/block / ( status eblock# )
+ 2dup nand-map + c! ( status eblock# )
+ show-status
+ nand-pages/block +loop ( )
+
+ show-done
+;
+
+: scan-nand ( -- )
+ open-nand (scan-nand) close-nand-ihs
+ examine-nand
+;
+
+
+: >eblock# ( page# -- eblock# ) nand-pages/block / ;
+
+: copy-nand ( "devspec" -- )
+ open-nand
+ get-img-filename
+ open-img
+
+ ['] noop to show-progress
+
+ #nand-pages >eblock# dup show-init ( #eblocks )
+
+ show-erasing ( )
+
+ #image-eblocks show-writing
+
+ #image-eblocks 0 ?do
+ read-image-block
+ i check-mem-hash
+ load-base " copy-block" $call-nand ( page# error? )
+ " Error writing to NAND FLASH" ?nand-abort ( page# )
+ >eblock# show-written ( )
+ loop
+
+ show-done
+
+ close-nand-ihs
+;
+
+: verify-nand ( "devspec" -- )
+ open-nand
+ get-img-filename
+ open-img
+ ['] noop to show-progress
+
+ ." Verifing " #image-eblocks . ." blocks" cr
+
+ #image-eblocks 0 ?do
+ (cr i .
+ read-image-block
+
+ i /nand-block um* " seek" $call-nand drop
+ load-base /nand-block " read" $call-nand ( len )
+ /nand-block <> " Disk read error" ?nand-abort ( )
+
+ load-base load-base /nand-block + /nand-block comp if ( )
+ cr ." Miscompare in block starting at page# " ( )
+ ?key-stop
+ then ( )
+ loop ( )
+ close-nand-ihs
+;
+
+: verify-img ( "img-devspec" -- )
+ hex
+ open-nand close-nand-ihs \ To set sizes
+ get-img-filename
+ open-img
+
+ ['] noop to show-progress
+
+ ." Verifying " #image-eblocks . ." blocks" cr
+
+ #image-eblocks 0 ?do
+ (cr i .
+ read-image-block
+ i check-mem-hash
+ loop
+ close-nand-ihs
+;
+
+: check-hash ( adr len -- )
+ 2drop \ XXX
+;
+
+: verify-nand ( "crc-devspec" -- )
+ hex
+ open-nand
+ safe-parse-word open-img
+ ['] noop to show-progress
+
+ ." Verifying " #image-eblocks . ." blocks" cr
+
+ #image-eblocks 0 ?do
+ (cr i .
+
+ i /nand-block um* " seek" $call-nand drop
+ load-base /nand-block " read" $call-nand ( len )
+ /nand-block <> " Disk read failure" ?nand-abort ( )
+
+ load-base /nand-block check-hash if ( )
+ cr ." Hash mismatch at eblock " i . cr ( )
+ ?key-stop
+ else ( actual-crc expected-crc )
+ 2drop ( )
+ then ( )
+ loop ( )
+ close-nand-ihs
+;
+
+: make-new-file ( devspec$ -- fileih )
+ 2dup ['] $delete catch if 2drop then ( name$ )
+ 2dup ['] $create-file catch if ( name$ x x )
+ 2drop ( name$ )
+ " Can't open a file. Try using the raw disk?" confirm if ( name$ )
+ open-dev ( ih )
+ else ( name$ )
+ 2drop 0 ( ih=0 )
+ then ( ih )
+ else ( name$ ih )
+ nip nip ( ih )
+ then ( ih )
+;
+
+: open-dump-file ( devspec$ -- )
+ cr ." Dumping to " 2dup type cr
+
+ make-new-file to fileih
+
+ fileih 0= " Can't open output" ?nand-abort
+;
+
+: dump-eblock? ( block# -- flag )
+ \ Dump JFFS2 w/summary (2), JFFS2 w/o summary (3), non JFFS2 data (5)
+ nand-map + c@ dup 2 = over 3 = or swap 5 = or
+;
+
+0 [if]
+: eblock>file ( -- )
+ load-base /nand-block " write" fileih $call-method
+ /nand-block <> " Write to dump file failed" ?nand-abort
+ load-base /nand-block $crc #image-eblocks >crc l!
+ #image-eblocks 1+ to #image-eblocks
+;
+
+: fastdump-nand ( -- )
+ \ The stack is empty at the end of each line unless otherwise noted
+ (scan-nand)
+
+ cursor-off
+ d# 20 status-line at-xy ." "
+
+ " usable-page-limit" $call-nand >eblock# 0 do
+ i dump-eblock? if
+ i point-block
+ i show-eblock#
+ load-base i nand-pages/block * nand-pages/block " read-pages" $call-nand ( #read )
+ nand-pages/block <> " Read failed" ?nand-abort
+ eblock>file
+ then
+ loop
+ show-done
+;
+
+: slowdump-nand ( -- )
+ \ The stack is empty at the end of each line unless otherwise noted
+ #nand-pages 0 ?do
+ (cr i >eblock# .
+ load-base i nand-pages/block " read-pages" $call-nand ( #read )
+ nand-pages/block = if
+ load-base /nand-block written? if
+ ." w"
+ eblock>file
+ i nand-pages/block bounds ?do
+ i pad ! pad 4 " write" fileih $call-method
+ 4 <> " Write of eblock number failed" ?nand-abort
+ loop
+ else
+ ." s"
+ then
+ then
+ nand-pages/block +loop
+;
+
+: (dump-nand) ( "devspec" -- )
+ open-nand
+ get-img-filename
+
+ alloc-crc-buf
+ image-name$ open-dump-file
+
+ 0 to #image-eblocks
+
+ fastdump-nand
+ cr ." Done" cr
+
+ close-image-file
+
+ close-nand-ihs
+;
+: save-nand ( "devspec" -- ) (dump-nand) ;
+
+: fastcopy-nand ( "devspec" -- )
+ open-nand
+
+ safe-parse-word open-dev to fileih
+ fileih 0= " Can't open NAND fastboot image file" ?nand-abort
+
+ " size" fileih $call-method drop ( len )
+ " start-fastcopy" $call-nand ( error? )
+ " Not enough spare NAND space for fast copy" ?nand-abort
+
+ begin ( )
+ load-base /nand-block " read" fileih $call-method ( len )
+ dup 0> while ( len )
+ \ If the read didn't fill a complete block, zero the rest
+ load-base /nand-block rot /string erase
+
+ load-base " next-fastcopy" $call-nand ( )
+ repeat ( len )
+ drop ( )
+ " end-fastcopy" $call-nand ( )
+
+ close-nand-ihs
+;
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 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
Modified: cpu/x86/pc/olpc/via/devices.fth
===================================================================
--- cpu/x86/pc/olpc/via/devices.fth 2009-07-31 18:45:34 UTC (rev 1263)
+++ cpu/x86/pc/olpc/via/devices.fth 2009-07-31 18:46:49 UTC (rev 1264)
@@ -164,9 +164,6 @@
.( XXX Not clearing CMOS) cr
patch noop init-bios-cmos stand-init
-devalias nand /nandflash
-devalias mtd /nandflash
-
[ifdef] use-null-nvram
\ For not storing configuration variable changes across reboots ...
\ This is useful for "turnkey" systems where configurability would
Modified: cpu/x86/pc/olpc/via/fw.bth
===================================================================
--- cpu/x86/pc/olpc/via/fw.bth 2009-07-31 18:45:34 UTC (rev 1263)
+++ cpu/x86/pc/olpc/via/fw.bth 2009-07-31 18:46:49 UTC (rev 1264)
@@ -319,9 +319,8 @@
fload ${BP}/dev/olpc/keyboard/selftest.fth \ Keyboard diagnostic
fload ${BP}/dev/olpc/touchpad/touchpad.fth \ Touchpad diagnostic
fload ${BP}/cpu/x86/pc/olpc/gridmap.fth \ Gridded display tools
-[ifdef] Later
-fload ${BP}/cpu/x86/pc/olpc/copynand.fth
-[then]
+fload ${BP}/cpu/x86/pc/olpc/via/copynand.fth
+
\ fload ${BP}/cpu/x86/pc/olpc/carousel.fth \ Carouseled NAND writing
fload ${BP}/cpu/x86/pc/olpc/crypto.fth \ Cryptographic image validation
fload ${BP}/cpu/x86/pc/olpc/lzip.fth \ Access zip images from memory
@@ -480,8 +479,9 @@
[ifdef] Later
fload ${BP}/cpu/x86/pc/olpc/nandcastui.fth
fload ${BP}/cpu/x86/pc/olpc/wifichannel.fth
-fload ${BP}/cpu/x86/pc/olpc/fsupdate.fth
[then]
+fload ${BP}/cpu/x86/pc/olpc/via/fsupdate.fth
+devalias fsdisk /ide@0/disk:0
fload ${BP}/ofw/inet/sntp.fth
: olpc-ntp-servers ( -- )
Modified: cpu/x86/pc/olpc/via/olpc.bth
===================================================================
--- cpu/x86/pc/olpc/via/olpc.bth 2009-07-31 18:45:34 UTC (rev 1263)
+++ cpu/x86/pc/olpc/via/olpc.bth 2009-07-31 18:46:49 UTC (rev 1264)
@@ -145,8 +145,8 @@
" memtest" " memtest" $add-deflated-dropin
+ " verify.img" " verify" $add-deflated-dropin
[ifdef] Later
- " verify.img" " verify" $add-deflated-dropin
" os.public" " ospubkey" $add-dropin \ Incompressible
" fw.public" " fwpubkey" $add-dropin \ Incompressible
" fs.public" " fspubkey" $add-dropin \ Incompressible