Author: quozl Date: Wed Apr 27 09:14:27 2011 New Revision: 2192 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2192
Log: OLPC XO-1.5 - fs-update, add support for sparse .zd files, undo -r2186 meaning of zblocks: parameter, split card erasure to avoid card lockup, and show progress during erasure.
SDHCI - erase blocks, wait for card to leave programming state, and ignore spurious data timeout.
Modified: cpu/x86/pc/olpc/via/fsupdate.fth dev/mmc/sdhci/sdhci.fth
Modified: cpu/x86/pc/olpc/via/fsupdate.fth ============================================================================== --- cpu/x86/pc/olpc/via/fsupdate.fth Mon Apr 18 12:11:06 2011 (r2191) +++ cpu/x86/pc/olpc/via/fsupdate.fth Wed Apr 27 09:14:27 2011 (r2192) @@ -8,14 +8,28 @@ push-hex $number pop-base " Bad number" ?nand-abort ;
-0 value #eblocks-written +0 value min-eblock# +0 value max-eblock# + +: written ( eblock# -- ) + dup + max-eblock# max to max-eblock# ( eblock# ) + min-eblock# min to min-eblock# +;
: ?all-written ( -- ) - #eblocks-written #image-eblocks <> if + max-eblock# 1+ #image-eblocks <> if cr red-letters - ." WARNING: The file specified " #image-eblocks .d - ." chunks but wrote only " #eblocks-written .d ." chunks" cr + ." WARNING: The file said highest block " #image-eblocks .d + ." but wrote only as high as block " max-eblock# .d cr + black-letters + then + min-eblock# 0 <> if + cr + red-letters + ." WARNING: The file did not write a zero block, " + ." but wrote only as low as block " min-eblock# .d cr black-letters then ; @@ -52,15 +66,35 @@ vocabulary nand-commands also nand-commands definitions
+\ some cards do not respond in a reasonable time, +\ some cards lock up and cause a command timeout in get-status, +\ so split the erase into many parts. +: erase-blocks + [char] ~ emit \ visual hint of erase delay + #image-eblocks /nand-block h# 200 */ ( #blocks ) + dup d# 16 / swap ( /part #blocks ) + 0 do ( /part ) + i over " erase-blocks" $call-nand + hdd-led-toggle \ visual hint of progress + dup +loop ( /part ) + drop + bs emit space bs emit hdd-led-off \ visual hint remove +; + +\ : erase-blocks +\ 0 #image-eblocks /nand-block h# 200 */ " erase-blocks" $call-nand ; + : zblocks: ( "eblock-size" "#eblocks" ... -- ) hdd-led-toggle ?compare-spec-line get-hex# to /nand-block get-hex# to #image-eblocks + #image-eblocks to min-eblock# + 0 to max-eblock# " size" $call-nand #image-eblocks /nand-block um* d< " Image size is larger than output device" ?nand-abort #image-eblocks show-init - 0 #image-eblocks /nand-block h# 200 */ " erase-blocks" $call-nand + erase-blocks get-inflater \ Separate the two buffers by enough space for both the compressed \ and uncompressed copies of the data. 4x is overkill, but there @@ -200,8 +234,8 @@ swap-buffers ( eblock# ) \ then
+ dup written ( eblock# ) show-written ( ) - #eblocks-written 1+ to #eblocks-written ( ) show-temperature hdd-led-toggle ;
Modified: dev/mmc/sdhci/sdhci.fth ============================================================================== --- dev/mmc/sdhci/sdhci.fth Mon Apr 18 12:11:06 2011 (r2191) +++ dev/mmc/sdhci/sdhci.fth Wed Apr 27 09:14:27 2011 (r2192) @@ -284,7 +284,7 @@ then ( isr esr )
allow-timeout? if ( isr esr ) - dup 1 = if true to timeout? 2drop exit then + dup 1 = over h# 10 = or if true to timeout? 2drop exit then then ( isr esr )
." SDHCI: Error: ISR = " swap u. @@ -489,16 +489,6 @@
0 instance value writing?
-: erase-blocks ( block# #blocks -- ) \ UNTESTED - intstat-on - dup 0= if 2drop exit then - 1- bounds ( last first ) - h# 201a 0 cmd ( last ) \ CMD32 - R1 - h# 211a 0 cmd ( ) \ CMD33 - R1 - 0 h# 261b 0 cmd \ CMD38 - R1b (wait for busy) - intstat-off -; - \ CMD40 is MMC
\ See table 4-5 in sandisk spec @@ -1034,6 +1024,21 @@ : detach-sdio-card ( -- ) ;
+: erase-blocks ( block# #blocks -- ) + intstat-on + dup 0= if 2drop exit then + 1- bounds ( last first ) + h# 201a 0 cmd ( last ) \ CMD32 - R1 + h# 211a 0 cmd ( ) \ CMD33 - R1 + 0 h# 261b 0 cmd \ CMD38 - R1b (wait for busy) + true to writing? ( ) + true to allow-timeout? + false to timeout? + wait-write-done drop + false to allow-timeout? + intstat-off +; + \ Asynchronous poll for completion : r/w-blocks-end? ( in? -- false | error? true ) drop