[OpenBIOS] r510 - cpu/x86/pc/olpc dev/olpc/cafenand

svn at openbios.org svn at openbios.org
Wed Aug 1 10:25:31 CEST 2007


Author: wmb
Date: 2007-08-01 10:25:31 +0200 (Wed, 01 Aug 2007)
New Revision: 510

Modified:
   cpu/x86/pc/olpc/copynand.fth
   dev/olpc/cafenand/badblock.fth
   dev/olpc/cafenand/cafenand.fth
Log:
OLPC copy-nand - OLPC trac 2614.  Made copy-nand abort not only on a
CRC mismatch, but also on a NAND write error.


Modified: cpu/x86/pc/olpc/copynand.fth
===================================================================
--- cpu/x86/pc/olpc/copynand.fth	2007-08-01 03:15:29 UTC (rev 509)
+++ cpu/x86/pc/olpc/copynand.fth	2007-08-01 08:25:31 UTC (rev 510)
@@ -148,7 +148,8 @@
       (cr i .
       read-image-block
       i ?check-crc
-      load-base " copy-block" nandih $call-method
+      load-base " copy-block" nandih $call-method  ( error? )
+      " Error writing to NAND FLASH" ?nand-abort
    loop
 
    cr ." Filling with cleanmarkers ..."

Modified: dev/olpc/cafenand/badblock.fth
===================================================================
--- dev/olpc/cafenand/badblock.fth	2007-08-01 03:15:29 UTC (rev 509)
+++ dev/olpc/cafenand/badblock.fth	2007-08-01 08:25:31 UTC (rev 510)
@@ -132,7 +132,10 @@
    dup  if                                  ( signature$ page# )
       dup erase-block                       ( signature$ page# )
       bbt over  /bbt /page /   bounds  ?do  ( signature$ page# adr )
-         dup i write-page                   ( signature$ page# adr )
+         dup i write-page  if               ( signature$ page# adr )
+            ." Error writing Bad Block Table - page# " i .x cr
+            3drop unloop exit
+         then
          /page +                            ( signature$ page# adr' )
       loop                                  ( signature$ page# adr' )
       drop                                  ( signature$ page# )
@@ -253,13 +256,15 @@
       over block-bad?  if  3drop 0 exit  then
    then
 
-   dup >r          ( adr page# #pages r: #pages )
-   bounds  ?do                          ( adr )
-      \ XXX need some error handling
-      dup i write-page                  ( adr )
-      /page +                           ( adr' )
-   loop                                 ( adr )
-   drop  r>
+   over >r  dup >r               ( adr page# #pages  r: page# #pages )
+   bounds  ?do                   ( adr  r: page# #pages )
+      dup i write-page  if       ( adr  r: page# #pages )
+         drop r> drop i r> -     ( #written )
+         unloop exit
+      then                       ( adr  r: page# #pages )
+      /page +                    ( adr' r: page# #pages )
+   loop                          ( adr  r: page# #pages )
+   drop  r>  r> drop             ( #pages )
 ;
 
 : erase-blocks  ( page# #pages -- #pages )
@@ -364,12 +369,14 @@
 : start-scan  ( -- )  pages/eblock negate  to scan-page#  ;
 
 \ Must erase all (wipe) first
-: copy-block  ( adr -- )
+: copy-block  ( adr -- error? )
    next-page#  pages/eblock  bounds  ?do  ( adr )
-      dup i write-page                    ( adr )
+      dup i write-page  if                ( adr )
+         drop true  unloop exit           ( true )
+      then                                ( adr )
       /page +                             ( adr' )
    loop                                   ( adr )
-   drop                                   ( )
+   drop false                             ( false )
 ;
 
 : put-cleanmarkers  ( -- )

Modified: dev/olpc/cafenand/cafenand.fth
===================================================================
--- dev/olpc/cafenand/cafenand.fth	2007-08-01 03:15:29 UTC (rev 509)
+++ dev/olpc/cafenand/cafenand.fth	2007-08-01 08:25:31 UTC (rev 510)
@@ -119,7 +119,7 @@
 \ : read-id  ( -- )  0 0 set-page read-id-cmd 0 cmd  wait-cmd  h# 30 cl@  ;
 : dma-off  ( -- )  0 h# 40 cl!  ;
 
-: wait-write-done  ( -- )
+: wait-write-done  ( -- error? )
    0               ( status )
    begin           ( status )
      drop          ( )
@@ -127,7 +127,8 @@
      dup h# 40 and ( status flag )
    until           ( status )
    \ If the value is completely 0 I think it means write protect     
-   1 and  if  ." NAND write error" cr  then
+   1 and  0<>      ( error? )
+   write-disable
 ;
 
 \ Assumes that the range doesn't straddle a page boundary
@@ -149,18 +150,17 @@
    dma-off  set-page  dup datalen         ( adr len )
    chip h# 2000 +  swap  move             ( )
    write-cmd h# 0000.0110 cmd  wait-cmd   ( ) \ No Auto ECC
-   wait-write-done
-   write-disable
+   wait-write-done                        ( error? )
+   drop
 ;
 
-: pio-write-page  ( adr page# -- )
+: pio-write-page  ( adr page# -- error? )
    write-enable  dma-off                  ( adr page# )
    0 set-page                             ( adr )
    /page h# e +  dup datalen              ( adr len )
    chip h# 2000 +  swap  move             ( )
    write-cmd h# 4800.0110 cmd  wait-cmd   ( ) \ 4000. Auto ECC, 0800. R/S ECC
-   wait-write-done
-   write-disable
+   wait-write-done                        ( error? )
 ;
 
 : read-oob  ( page# -- adr )
@@ -228,22 +228,21 @@
    set-page                            ( adr len )
    dup  false dma-setup                ( )
    write-cmd h# 110 cmd wait-cmd       ( )
-   wait-write-done                     ( )
-   dma-release                         ( )
-   write-disable                       ( )
+   wait-write-done                     ( error? )
+   dma-release                         ( error? )
+   drop
 ;
 
-: dma-write-page  ( adr page# -- )  \ Size is fixed
+: dma-write-page  ( adr page# -- error? )  \ Size is fixed
    write-enable                          ( adr page# )
    0 set-page                            ( adr )
    h# 800 h# 80e  false dma-setup        ( )
    write-cmd h# 4800.0110 cmd wait-cmd   ( )  \ Auto-ECC, RS, write cmd
-   wait-write-done                       ( )
+   wait-write-done                       ( error? )
 \   dma-release
-   write-disable                         ( )
 ;
 
-: write-page   ( adr page# -- )  dma-write-page  ;
+: write-page   ( adr page# -- error? )  dma-write-page  ;
 : write-bytes  ( adr len page# offset -- )  pio-write-raw  ;
 
 3 value #erase-adr-bytes  \ Chip dependent
@@ -251,8 +250,8 @@
    write-enable
    set-erase-page
    h# 20.0060 0 #erase-adr-bytes >cmd  h# 1d0 cmd
-   wait-write-done
-   write-disable
+   wait-write-done                       ( error? )
+   drop
 ;
 
 : read-id  ( -- adr )  8  0 0  h# c420.0090  0  generic-read  ;




More information about the OpenBIOS mailing list