Author: wmb Date: 2010-01-25 09:36:22 +0100 (Mon, 25 Jan 2010) New Revision: 1697
Modified: cpu/x86/pc/olpc/via/fw.bth dev/mmc/sdhci/sdhci.fth dev/mmc/sdhci/sdmmc.fth Log: OLPC trac 9484 - NANDblaster is now working reasonably well in wired mode.
Modified: cpu/x86/pc/olpc/via/fw.bth =================================================================== --- cpu/x86/pc/olpc/via/fw.bth 2010-01-25 08:34:05 UTC (rev 1696) +++ cpu/x86/pc/olpc/via/fw.bth 2010-01-25 08:36:22 UTC (rev 1697) @@ -500,6 +500,7 @@
fload ${BP}/cpu/x86/pc/olpc/nandcastui.fth fload ${BP}/cpu/x86/pc/olpc/wifichannel.fth +fload ${BP}/cpu/x86/pc/olpc/via/blockfifo.fth fload ${BP}/cpu/x86/pc/olpc/via/fsupdate.fth fload ${BP}/cpu/x86/pc/olpc/via/fsverify.fth devalias fsdisk int:0
Modified: dev/mmc/sdhci/sdhci.fth =================================================================== --- dev/mmc/sdhci/sdhci.fth 2010-01-25 08:34:05 UTC (rev 1696) +++ dev/mmc/sdhci/sdhci.fth 2010-01-25 08:36:22 UTC (rev 1697) @@ -323,6 +323,27 @@ ." Stopping" cr abort ;
+: isr-event? ( mask -- happened? ) + h# 8000 or ( mask' ) + isr@ 2dup and if ( mask' isr ) + \ Only clear the bits we will handle this time. + \ If additional ISR bits are set, leave them set because + \ later code will be waiting for them. In practice, the + \ only such additional bit is the "data transfer complete" + \ bit - mask 2 - which "2 wait" will handle. + \ But we do go ahead and clear card removal/insertion + \ events, because we don't handle them elsewhere. + swap h# c0 or over and isr! ( isr ) + + dup h# 8000 and if .sderror else drop then ( ) + true + else ( mask' isr ) + \ DMA interrupt - the transfer crossed an address boundary + 8 and if 0 cl@ 0 cl! 8 isr! then ( mask ) + drop false ( false ) + then +; + : wait ( mask -- ) h# 8000 or ( mask' ) begin ( mask ) @@ -711,6 +732,28 @@ drop ;
+: card-error? ( status -- error? ) + dup h# fdf9.8008 and if ( status ) + cr ." SD Error - status = " dup . cr + .card-error + true + else + drop + false + then +; + +: write-done? ( -- false | error? true ) + intstat-on + get-status dup 9 rshift h# f and 7 = if ( status ) + drop false ( false ) + else ( status ) + card-error? ( error? ) + true ( error? true ) + then ( false | error? true ) + intstat-off ( false | error? true ) +; + \ This is the correct way to wait for programming complete. : wait-write-done ( -- error? ) writing? 0= if false exit then ( limit ) @@ -724,15 +767,7 @@ then repeat ( limit status ) nip ( status ) - dup h# fdf9.8008 and if ( status ) - cr ." SD Error - status = " dup . cr - .card-error - true - else - drop - false - then - + card-error? ( error? ) false to writing? ;
@@ -772,6 +807,18 @@
0 instance value dma?
+: dma-done? ( -- flag ) + dma? if + 2 isr-event? dup if ( flag ) + dma-release ( flag ) + intstat-off ( flag ) + false to dma? ( flag ) + then ( flag ) + else + true + then +; + : wait-dma-done ( -- ) dma? if 2 wait @@ -865,6 +912,17 @@ : detach-sdio-card ( -- ) ;
+\ Asynchronous poll for completion +: r/w-blocks-end? ( in? -- false | error? true ) + drop + dma-done? if + write-done? + else + false + then +; + +\ Wait for completion : r/w-blocks-end ( in? -- error? ) drop wait-dma-done
Modified: dev/mmc/sdhci/sdmmc.fth =================================================================== --- dev/mmc/sdhci/sdmmc.fth 2010-01-25 08:34:05 UTC (rev 1696) +++ dev/mmc/sdhci/sdmmc.fth 2010-01-25 08:36:22 UTC (rev 1697) @@ -40,6 +40,9 @@ : write-blocks-end ( -- error? ) false " r/w-blocks-end" $call-parent ; +: write-blocks-end? ( -- false | error? true ) + false " r/w-blocks-end?" $call-parent +;
: dma-alloc ( size -- vadr ) " dma-alloc" $call-parent ; : dma-free ( vadr size -- ) " dma-free" $call-parent ;