[openfirmware] [commit] r1902 - dev/mmc/sdhci

repository service svn at openfirmware.info
Tue Aug 3 21:31:37 CEST 2010


Author: wmb
Date: Tue Aug  3 21:31:37 2010
New Revision: 1902
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/1902

Log:
SD driver - fixed the ADATA SD card problems without a delay, by using READ/WRITE_SINGLE (instead of _MULTIPLE) for one-block transfers.

Modified:
   dev/mmc/sdhci/sdhci.fth

Modified: dev/mmc/sdhci/sdhci.fth
==============================================================================
--- dev/mmc/sdhci/sdhci.fth	Tue Aug  3 11:53:23 2010	(r1901)
+++ dev/mmc/sdhci/sdhci.fth	Tue Aug  3 21:31:37 2010	(r1902)
@@ -432,6 +432,9 @@
 : write-single    ( address -- )  h# 183a h# 03 cmd  ;  \ CMD24 R1 WRITE_SINGLE_BLOCK
 : write-multiple  ( address -- )  h# 193a h# 27 cmd  ;  \ CMD25 R1 WRITE_MULTIPLE
 
+: issue-write  ( address #blocks -- )  1 =  if  write-single  else  write-multiple  then  ;
+: issue-read   ( address #blocks -- )  1 =  if  read-single   else  read-multiple   then  ;
+
 : program-csd  ( -- )     0  h# 1b1a 0 cmd  ;  \ CMD27 R1 UNTESTED
 : protect     ( group# -- )  h# 1c1b 0 cmd  ;  \ CMD28 R1b UNTESTED
 : unprotect   ( group# -- )  h# 1d1b 0 cmd  ;  \ CMD29 R1b UNTESTED
@@ -711,7 +714,7 @@
 
 \ This is the correct way to wait for programming complete.
 : wait-write-done  ( -- error? )
-   writing? 0=  if  false exit  then               ( limit )
+   writing? 0=  if  false exit  then
 
    get-msecs d# 4000 +                             ( limit )
    \ Wait for return to "tran" state (4)
@@ -899,14 +902,12 @@
    rot dma-setup    ( block#              r: #blocks fresh? in? )
    wait-write-done  if  drop  r> r> r> 3drop true exit  then  ( block# )
    address-shift lshift  r>  if         ( block# r: #blocks fresh? )
-      r> r> 2drop                       ( block# )
-      read-multiple                     ( )
+      r> drop                           ( block# r: #blocks )
+      r> issue-read                     ( )
    else                                 ( block# r: #blocks fresh? )
-      \ Ugly ugly workaround for a problem with AData Class 6 SD cards
-      \ They hang (data timeout) if you start a write too soon after a read.
-      " d# 1200 us" evaluate
-      r>  if  r> pre-write-erase  else  r> drop  then  ( block# )
-      write-multiple  true to writing?  ( )
+      r>  if  r@ pre-write-erase  then  ( block# r: #blocks )
+      r> issue-write                    ( )
+      true to writing?                  ( )
    then                                 ( )
    true to dma?                         ( )
    false                                ( error? )



More information about the openfirmware mailing list