[OpenBIOS] r430 - cpu/x86/pc/olpc

svn at openbios.org svn at openbios.org
Thu May 31 02:05:37 CEST 2007


Author: wmb
Date: 2007-05-31 02:05:36 +0200 (Thu, 31 May 2007)
New Revision: 430

Modified:
   cpu/x86/pc/olpc/copynand.fth
Log:
OLPC copy-nand - Trac #498 - Check the nand.img file against the nand.crc file if there is one.
Also changed "crc-img" to require only one argument, the name of the .img file (the .crc filename
is synthesized from the .img filename.).


Modified: cpu/x86/pc/olpc/copynand.fth
===================================================================
--- cpu/x86/pc/olpc/copynand.fth	2007-05-30 22:41:42 UTC (rev 429)
+++ cpu/x86/pc/olpc/copynand.fth	2007-05-31 00:05:36 UTC (rev 430)
@@ -3,14 +3,35 @@
 
 0 value fileih
 0 value nandih
+0 value crc-ih
+
 0 value /nand-block
 0 value /nand-page
 0 value nand-pages/block
 0 value #nand-pages
 
+: close-nand-ihs  ( -- )
+   fileih  ?dup  if  0 to fileih  close-dev  then
+   nandih  ?dup  if  0 to nandih  close-dev  then
+   crc-ih  ?dup  if  0 to crc-ih  close-dev  then
+;
+
+: ?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
+;
+
 : open-nand  ( -- )
    " /nandflash" open-dev to nandih
-   nandih 0= abort" Can't open NAND FLASH device"
+   nandih 0=  " Can't open NAND FLASH device"  ?nand-abort
    " erase-size" nandih $call-method to /nand-block
    " block-size" nandih $call-method to /nand-page
    " size" nandih $call-method  /nand-page  um/mod nip to #nand-pages
@@ -18,18 +39,66 @@
    " start-scan" nandih $call-method
 ;
 
+h# 20 buffer: line-buf
+: next-crc  ( -- false | crc true )
+   line-buf 9  " read" crc-ih $call-method   ( len )
+   dup  0=  if  exit  then                   ( len )
+   9 <> " Bad CRC line length" ?nand-abort   ( )
+   line-buf 8 $number " Bad number in CRC file"  ?nand-abort  ( crc )
+   true
+;
+
+
+: open-crcs  ( name$ -- )
+   open-dev  to crc-ih
+   crc-ih 0= " Can't open CRC file"  ?nand-abort
+;
+
+h# 100 buffer: image-name-buf
+: image-name$  ( -- adr len )  image-name-buf count  ;
+
+
+: ?open-crcs  ( -- )
+   image-name$ + 4 -  4  " .img" $=  if
+      " crc"  image-name$ + 3 -  swap move
+      image-name$ open-crcs
+   else
+      0 to crc-ih
+   then
+   crc-ih  if  ." Check file is " image-name$ type cr  then
+;
+
 : open-img  ( "devspec" -- )
-   safe-parse-word  open-dev  to fileih
-   fileih 0=  abort" Can't open NAND image file"
+   safe-parse-word  2dup image-name-buf place   ( devspec$ )
+   open-dev  to fileih
+   fileih 0= " Can't open NAND image file"  ?nand-abort
 ;
 
 : #records  ( ih /record -- n )
    swap " size" rot $call-method  rot um/mod nip
 ;
 
+: check-mem-crc  ( crc -- )
+   load-base /nand-block  $crc                          ( crc actual-crc )
+   2dup <>  if
+      cr ." CRC miscompare - expected " swap . ." got " . cr
+      true " Stopping" ?nand-abort
+      ?key-stop
+   else
+      2drop
+   then                                                 ( )
+;
+
+: ?check-crc  ( -- )
+   crc-ih  if
+      next-crc  0=  " Premature end of .crc file" ?nand-abort
+      check-mem-crc
+   then
+;
 : copy-nand  ( "devspec" -- )
    open-nand
    open-img
+   ?open-crcs
 
    ['] noop to show-progress
 
@@ -42,11 +111,11 @@
       load-base /nand-block  " read" fileih $call-method
    0> while
       (cr dup .  1+
+      ?check-crc
       load-base " copy-block" nandih $call-method
    repeat
    drop
-   fileih close-dev
-   nandih close-dev
+   close-nand-ihs
 ;
 
 : verify-nand  ( "devspec" -- )
@@ -65,37 +134,19 @@
       load-base  load-base /nand-block +  /nand-block  comp  if        ( block# )
          cr  ." Miscompare in block starting at page# "                ( block# )
          " scan-page#" nandih $call-method  .x cr                      ( block# )
-         key? if
-            nandih close-dev  fileih close-dev                         ( block# )
-            key drop  true abort" Aborted by keystroke"
-         then
+         ?key-stop
       then                                                 ( block# )
    repeat                                                  ( block# )
    drop                                                    ( )
-   fileih close-dev
-   nandih close-dev
+   close-nand-ihs
 ;
 
-0 value crc-ih
-h# 20 buffer: line-buf
-: next-crc  ( -- false | crc true )
-   line-buf 9  " read" crc-ih $call-method   ( len )
-   dup  0=  if  exit  then                   ( len )
-   9 <> abort" Bad CRC line length"          ( )
-   line-buf 8 $number  abort" Bad number in CRC file"   ( crc )
-   true
-;
-
-: open-crcs  ( -- )
-   safe-parse-word  open-dev  to crc-ih
-   crc-ih 0=  abort" Can't open CRC file"
-;
-
-: crc-img  ( "img-devspec" "crc-devspec" -- )
+: crc-img  ( "img-devspec" -- )
    hex
-   open-nand  nandih close-dev  \ To set sizes
+   open-nand  close-nand-ihs   \ To set sizes
    open-img
-   open-crcs
+   ?open-crcs
+   crc-ih 0= " No CRC file"  ?nand-abort
 
    ['] noop to show-progress
 
@@ -106,28 +157,18 @@
       swap  (cr dup .  1+   swap                           ( block#' crc )
 
       load-base /nand-block  " read" fileih $call-method   ( block# crc len )
-      /nand-block <>  abort" Short img file"               ( block# crc )
+      /nand-block <> " Short img file"  ?nand-abort        ( block# crc )
 
-      load-base /nand-block  $crc                          ( block# crc actual-crc )
-      2dup <>  if
-         cr ." CRC miscompare - expected " swap . ." got " . cr
-         key?  if
-            crc-ih close-dev  fileih close-dev
-            key drop  true abort" Aborted by keystroke"
-         then
-      else
-         2drop
-      then                                                 ( block# )
+      check-mem-crc                                        ( block# )
    repeat                                                  ( block# )
    drop                                                    ( )
-   fileih close-dev
-   crc-ih close-dev
+   close-nand-ihs
 ;
 
 : crc-nand  ( "crc-devspec" -- )
    hex
    open-nand
-   open-crcs
+   safe-parse-word  open-crcs
    ['] noop to show-progress
 
    ." Verifying " crc-ih 9 #records . ." blocks" cr
@@ -143,17 +184,13 @@
          cr ." CRC miscompare - expected " swap . ." got " .
          ." in NAND block starting at page "
          " scan-page#" nandih $call-method . cr
-         key?  if
-            nandih close-dev  crc-ih close-dev
-            key drop  true abort" Aborted by keystroke"
-         then
+         ?key-stop
       else
          2drop
       then                                                 ( block# )
    repeat                                                  ( block# )
    drop                                                    ( )
-   nandih close-dev
-   crc-ih close-dev
+   close-nand-ihs
 ;
 
 
@@ -181,7 +218,7 @@
    then
    to fileih
 
-   fileih 0=  if  nandih close-dev  true abort" Can't open output"  then
+   fileih 0=  " Can't open output"  ?nand-abort
 
    \ The stack is empty at the end of each line unless otherwise noted
    #nand-pages  0  do
@@ -202,8 +239,7 @@
    nand-pages/block +loop
    cr  ." Done" cr
 
-   fileih close-dev
-   nandih close-dev
+   close-nand-ihs
 ;
 : dump-nand  ( "devspec" -- )  true  to dump-oob?  (dump-nand)  ;
 : save-nand  ( "devspec" -- )  false to dump-oob?  (dump-nand)  ;
@@ -213,13 +249,11 @@
    open-nand
 
    safe-parse-word  open-dev  to fileih
-   fileih 0=  abort" Can't open NAND fastboot image file"
+   fileih 0= " Can't open NAND fastboot image file"  ?nand-abort
 
-   " size" fileih $call-method  drop              ( len )
-   " start-fastcopy" nandih $call-method  if      ( )
-      nandih close-dev  fileih close-dev
-      true abort" Not enough spare NAND space for fast copy"
-   then                                                   ( )
+   " size" fileih $call-method  drop                      ( len )
+   " start-fastcopy" nandih $call-method                  ( error? )
+   " Not enough spare NAND space for fast copy" ?nand-abort
 
    begin                                                  ( )
       load-base /nand-block  " read" fileih $call-method  ( len )
@@ -232,8 +266,7 @@
    drop                                                   ( )
    " end-fastcopy" nandih $call-method                    ( )
 
-   fileih close-dev
-   nandih close-dev
+   close-nand-ihs
 ;
 
 \ LICENSE_BEGIN




More information about the OpenBIOS mailing list