[openfirmware] r1146 - dev/mmc/sdhci
svn at openfirmware.info
svn at openfirmware.info
Thu Apr 16 22:41:04 CEST 2009
Author: wmb
Date: 2009-04-16 22:41:04 +0200 (Thu, 16 Apr 2009)
New Revision: 1146
Modified:
dev/mmc/sdhci/sdhci.fth
Log:
SDHCI - isolated some stuff that is specific to the CaFe chip,
added workarounds from some issues with the Via 855 chip,
and added the start of SDIO support.
Modified: dev/mmc/sdhci/sdhci.fth
===================================================================
--- dev/mmc/sdhci/sdhci.fth 2009-04-15 17:04:05 UTC (rev 1145)
+++ dev/mmc/sdhci/sdhci.fth 2009-04-16 20:41:04 UTC (rev 1146)
@@ -17,8 +17,6 @@
" sdhci" " compatible" string-property
-create marvell
-
h# 4000 constant /regs
: phys+ encode-phys encode+ ;
@@ -71,15 +69,18 @@
: esr@ ( -- w ) h# 32 cw@ ;
: esr! ( w -- ) h# 32 cw! ;
-[ifdef] marvell
+: marvell? ( -- flag ) 0 my-w@ h# 11ab = ;
: vendor-modes ( -- )
- \ One-time initialization of Marvell CaFe SD interface.
- \ Marvell told us to do this once after reset.
- \ The sw-reset command resets the registers, so you have
- \ to do it after that, in addition to after power-up.
- h# 0004 h# 6a cw! \ Enable data CRC check
- h# 7fff h# 60 cw! \ Disable internal pull-up/down on DATA3
+ marvell? if \ Marvel CaFe chip
+ \ One-time initialization of Marvell CaFe SD interface.
+ \ Marvell told us to do this once after reset.
+ \ The sw-reset command resets the registers, so you have
+ \ to do it after that, in addition to after power-up.
+ h# 0004 h# 6a cw! \ Enable data CRC check
+ h# 7fff h# 60 cw! \ Disable internal pull-up/down on DATA3
+ then
;
+\ Some Marvell-specific stuff
: enable-sd-int ( -- )
h# 300c cl@ h# 8000.0002 or h# 300c cl!
;
@@ -92,9 +93,6 @@
: disable-sd-clk ( -- )
h# 3004 cw@ h# 2000 invert and h# 3004 cw!
;
-[else]
-: vendor-modes ;
-[then]
: clear-interrupts ( -- )
isr@ drop esr@ drop
@@ -137,10 +135,13 @@
\ Card power on does not work if a removal interrupt is pending
h# c0 isr! \ Clear any pending insert/remove events
- \ XXX should use the capabilities register (40 cl@) to determine
- \ which power choices are available.
- h# c h# 29 cb! \ 3.0V
- h# d h# 29 cb! \ 3.0V + on
+ \ The 200.0000 bit is set if 3.0V is supported. If it is,
+ \ use it (value c for reg 29), otherwise use 3.3V (value e).
+ \ For now we don't handle the 1.8V possibility.
+
+ h# 40 cl@ h# 200.0000 and if h# c else h# e then ( voltage )
+ dup h# 29 cb! ( voltage ) \ First set the voltage
+ 1 or h# 29 cb! ( ) \ Then turn it on
;
: card-power-off ( -- ) 0 h# 29 cb! ;
@@ -169,8 +170,10 @@
card-clock-off
h# 003 \ division = 2^0, clocks on
- \ OLPC-specific hack: fast clock doesn't work on the FPGA CaFe chip
- " board-revision" evaluate h# b20 < if drop h# 103 then
+ marvell? if
+ \ OLPC-specific hack: fast clock doesn't work on the FPGA CaFe chip
+ " board-revision" evaluate h# b20 < if drop h# 103 then
+ then
h# 2c cw! \ Set divisor to 2^0, leaving internal clock on
card-clock-on
@@ -249,6 +252,17 @@
: .sderror ( isr -- )
esr@ dup esr! ( isr esr )
+
+ dup 1 and if ( isr esr )
+ \ Reset CMD line if necessary
+ present-state@ 1 and if 2 sw-reset then
+ then ( isr esr )
+
+ dup h# 10 and if ( isr esr )
+ \ Reset DAT line if necessary
+ present-state@ 2 and if 4 sw-reset then
+ then ( isr esr )
+
allow-timeout? if ( isr esr )
dup 1 = if true to timeout? 2drop exit then
then ( isr esr )
@@ -348,6 +362,8 @@
: set-dsr ( -- ) 0 h# 0400 0 cmd ; \ 4 - UNTESTED
+\ 5 - CMD5 is for SDIO. It is defined below in the SDIO section.
+
\ cmd6 (R1) is switch-function. It can be used to enter high-speed mode
: switch-function ( arg -- adr )
scratch-buf d# 64 d# 64 (dma-setup)
@@ -430,6 +446,66 @@
scratch-buf
;
+\ SDIO-specific commands:
+
+\ We can't set the 10 bit in the cmd register here, because the R4 response
+\ format doesn't echo the command index in the response.
+
+: io-send-op-cond ( voltage-range -- ocr ) h# 050a 0 cmd response ; \ 5 R4
+
+: >io-arg ( reg# function# -- arg ) 7 and d# 28 lshift or ;
+
+\ The following are CMD52 variants
+\ Flags: 80:CRC_ERROR 40:ILLEGAL_COMMAND 30:IO_STATE (see spec)
+\ 08:ERROR 04:reserved 02:INVALID_FUNCTION# 01:OUT_OF_RANGE
+: io-b@ ( reg# function# -- value flags )
+ >io-arg h# 341a 0 cmd
+ response wbsplit
+;
+: io-b! ( value reg# function# -- flags )
+ >io-arg or h# 8000.0000 or h# 341a 0 cmd
+ response wbsplit nip
+;
+: io-b!@ ( value reg# function# -- value' flags ) \ Write then read back
+ >io-arg or h# 8800.0000 or h# 341a 0 cmd
+ response wbsplit
+;
+
+\ CMD53 - IO_RW_EXTENDED
+\ These commands - io-{read,write}-{bytes,blocks} will need to be
+\ enclosed in a method like r/w-blocks, in order to set up the DMA hardware.
+
+0 instance value io-block-len
+
+\ In FIFO mode, the address inside the card does not autoincrement
+\ during the transfer.
+: >io-xarg ( reg# function# fifo-mode? -- arg )
+ >r >io-arg r> 0= if h# 0400.0000 or then
+;
+
+\ Set up memory address in caller
+: io-read-bytes ( len reg# function# fifo? -- flags ) \ 1 <= len <= 512
+ >io-xarg ( len arg )
+ swap h# 1ff and or ( arg' ) \ Byte count
+ h# 353a h# 13 cmd ( )
+;
+: io-read-blocks ( adr len reg# function# fifo? -- flags )
+ >io-xarg h# 0800.0000 or ( len arg )
+ swap io-block-len / or ( arg' ) \ Block count
+ h# 353a h# 37 cmd ( )
+;
+: io-write-bytes ( len reg# function# fifo? -- flags )
+ >io-xarg h# 8000.0000 or ( len arg )
+ swap h# 1ff and or ( arg' ) \ Byte count
+ h# 353a h# 03 cmd
+;
+: io-write-blocks ( len reg# function# fifo? -- flags )
+ >io-xarg h# 8800.0000 or ( len arg )
+ swap io-block-len / or ( arg' ) \ Block count
+ h# 353a h# 27 cmd
+;
+
+
9 instance value address-shift
h# 8010.0000 value oc-mode \ Voltage settings, etc.
@@ -602,10 +678,10 @@
select-card \ Cmd 7 - Select
+ set-timeout
+
configure-transfer
- set-timeout
-
intstat-off
true
;
More information about the openfirmware
mailing list