[openfirmware] r1550 - dev/mmc/sdhci

svn at openfirmware.info svn at openfirmware.info
Tue Dec 8 09:29:20 CET 2009


Author: wmb
Date: 2009-12-08 09:29:20 +0100 (Tue, 08 Dec 2009)
New Revision: 1550

Modified:
   dev/mmc/sdhci/sdhci.fth
   dev/mmc/sdhci/selftest.fth
Log:
Test for write protect switch in SD selftest.


Modified: dev/mmc/sdhci/sdhci.fth
===================================================================
--- dev/mmc/sdhci/sdhci.fth	2009-12-08 06:21:21 UTC (rev 1549)
+++ dev/mmc/sdhci/sdhci.fth	2009-12-08 08:29:20 UTC (rev 1550)
@@ -153,8 +153,11 @@
 \ The debouncer takes about 300 ms to stabilize.
 
 : card-inserted?  ( -- flag )
-   present-state@ h# 40000 and  h# 40000 =
+   present-state@ h# 30000 and  h# 30000 =
 ;
+: write-protected?  ( -- flag )
+   present-state@ h# 80000 and  0=
+;
 
 : ?via-quirk  ( -- )
    \ This is a workaround for an odd problem with the Via Vx855 chip.
@@ -314,8 +317,10 @@
 
    ." SDHCI: Error: ISR = " swap u.
    ." ESR = " dup u.  decode-esr
+\  debug-me
+   card-clock-off
+   card-power-off
    ." Stopping" cr abort
-   \      debug-me
 ;
 
 : wait  ( mask -- )
@@ -724,10 +729,10 @@
 \ -1 means error, 1 means retry
 : power-up-sdio-card  ( -- false | retry? true )
    intstat-on
-   card-power-off d# 20 ms
-   card-power-on  d# 40 ms  \ This delay is just a guess (20 was barely too slow for a Via board)
+   card-power-off d# 50 ms
+   card-power-on  d# 50 ms  \ This delay is just a guess (20 was barely too slow for a Via board)
    card-inserted?  0=  if  card-power-off  intstat-off  false true exit  then   
-   card-clock-slow  d# 10 ms  \ This delay is just a guess
+   card-clock-slow  d# 50 ms  \ This delay is just a guess
    reset-card     \ Cmd 0
    false
 ;
@@ -756,9 +761,15 @@
 
 : attach-card  ( -- okay? )
    setup-host
-   power-up-card  if         ( retry? )
+   ['] power-up-card catch  if  true true  then   if         ( retry? )
       \ The first try at powering up failed.
       if                     ( )
+         ." Trying to reset data lines" cr
+         card-clock-off
+         card-power-off
+         d# 500 ms
+         setup-host
+
          \ The card was detected, but didn't go to "powered up" state.
          \ Sometimes that can be fixed by power cycling, so we retry
          power-up-card  if   ( retry? )
@@ -798,7 +809,7 @@
    intstat-on  wait-write-done  intstat-off
    card-clock-off
    card-power-off
-   unmap-regs
+\  unmap-regs
 ;
 
 : attach-sdio-card  ( -- okay? )

Modified: dev/mmc/sdhci/selftest.fth
===================================================================
--- dev/mmc/sdhci/selftest.fth	2009-12-08 06:21:21 UTC (rev 1549)
+++ dev/mmc/sdhci/selftest.fth	2009-12-08 08:29:20 UTC (rev 1550)
@@ -28,28 +28,85 @@
    ibuf obuf /block comp
 ;
 
+: write-protected?  ( -- )  " write-protected?" $call-parent  ;
+
 : (selftest)  ( -- error? )
+   write-protected?  if  ." SD card is locked" cr  true  exit  then
+
    sbuf 0  read-block  if  true exit  then
    0 h# 5a test-block  if  true exit  then
    0 h# a5 test-block  if  true exit  then
    sbuf 0 write-block	   	        \ Restore original content
 ;
+: $=  ( $1 $2 -- flag )
+   rot tuck <>  if        ( adr1 adr2 len1 )
+      3drop false exit
+   then                   ( adr1 adr2 len1 )
+   comp 0=                ( flag )
+;
+: external?  ( -- flag )
+   " slot-name" get-my-property  if
+      false
+   else
+      decode-string " external" $=
+   then
+;
+: .slot-name  ( -- )
+   " slot-name" get-my-property  0=  if
+      decode-string type space  2drop
+   then
+   ." SD slot"
+;
+: card-present?  ( -- )  " card-inserted?" $call-parent  ;
+: test-abort?  ( -- flag )
+   key?  if  key h# 1b =  else  false  then
+;
+: wait-card?  ( -- error? )
+   card-present?  if  false exit  then
+   diagnostic-mode?  if
+      ." Please insert card in " .slot-name ."  to continue test."  cr
+      begin
+         d# 100 ms
+         test-abort?  if  ." Aborted" true exit  then
+      card-present? until
+      ." Card insertion correctly detected." cr
+      d# 200 ms  \ Settling time
+      false
+   else
+      ." No card in " .slot-name cr
+      true
+   then
+;
+
+: wait-removal?  ( -- error? )
+   diagnostic-mode?  0=  if  false exit  then
+   external?  0=  if  false exit  then
+
+   ." Please remove card from " .slot-name ."  to continue test."  cr         
+
+   begin
+      d# 100 ms
+      test-abort?  if  ." Aborted" true exit  then
+   card-present? 0= until
+   ." Card removal correctly detected." cr
+   false
+;
+
 external
 : selftest  ( -- error? )
    set-unit
-   " card-inserted?" $call-parent  0=  if
-      ." No card in "
-      " slot-name" get-my-property  0=  if
-         decode-string type space  2drop
-      then
-      ." SD slot" cr
-      true exit
-   then
-   open 0=  if  ." Open sdmmc failed" cr true exit  then
+
+   wait-card?  if  true exit  then
+
+   open 0=  if  ." Open SD card failed" cr true exit  then
    alloc-test-bufs
-   ['] (selftest) catch  if  true  then
-   free-test-bufs
-   close
+   ['] (selftest) catch  if  true  then  ( error? )
+   free-test-bufs                        ( error? )
+   close                                 ( error? )
+
+   if  true exit  then                   ( )
+
+   wait-removal?                         ( error? )
 ;
 headers
 




More information about the openfirmware mailing list