2024年1月5日发(作者:蒙蔚然)
1 SD /MMC HOST CONTROLER
1.1 SD中断检测时序
Card 检测时序Start
使能中断卡检测(对本驱动而言是基于sdio的wifi芯片数据检测)当HOST DRIVER检测到card插入和移除的时,清除中断状态,如果card插入中断发生,写1到card 插入bit(在正常中断状态寄存器中)。如果card移除中断发生,写1到card移除中断状态位(也在终端状态寄存器中)使能中断卡检测,需要写1到下面的bit1:card插入状态位使能(ENSTACARDNS)(此状态位在正常中断状态使能寄存器)2:card插入信号使能(ENSIGCARDNS)(此状态位在正常中断信号使能寄存器)3:card 移除状态使能(ENSTACARDREM),此状态位在正常中断状态使能寄存器4:card 移除信号使能(ENSIGCARDREM),此状态位在正常中断信号使能寄存器清除card检测中断位检测卡插入card插入bit是1,表示为card插入检测card插入是在当前状态寄存器中(Present State register)。card插入是1,host driver 能提供电压和时钟到sd card(对于wifi同样提供时钟和电压);在card 插入是0时,其他一些程序将立即关闭endcard插入bit是0,表示为清除cardSD中断检测时序主要是配置好正常中断状态使能寄存器和正常中断信号使能寄存器相关的bit位。主要是卡插入状态使能(ENSTACARDNS),卡插入信号使能(ENSIGCARDNS),卡移除状态使能(ENSTACARDREM),卡移除信号使能(ENSIGCARDREM)
1.2 SD时钟提供时序
Sd card时钟提供时序计算一个分频确定SD时钟,通过基础时钟频率计算分频为sd时钟频率设置SDCLK频率 ,选择内部时钟使能检测内部时钟在时钟控制寄存器,重复直到时钟 clock stabel
是1检测内部时钟使能设置SD clock enable
(ENSDCLK)为0 ,HOST controller 停止提供SD时钟设置SD 时钟使能end
SD时钟提供按下面的操作进行:
A:发送一个SD命令
B:检测在4bit模式下SD卡产生的中断。
对于停止SD时钟的提供,只要设置SD时钟使能位为0,该寄存器位在时钟控制寄存器
1.2.1 时钟改变的函数逻辑
SD时钟的改变时通过sdhci_s3c_change_clock()函数来处理,其中主要对时钟控制寄存器和超时控制寄存器进行配置,最后通过sdhci_change_clock()函数来处理SD时钟设置,其中包括分频值的计算,以及时钟控制寄存器的配置等。
1.3 SD总线电压控制时序
start通过读Capabilities register,
获得host controller支持的电压获得支持电压(从host
controller)设置SD bus电压选择支持最大电压设置SD bus
power1设置SD bus 电压门限。Host
controller支持23设置sd bus
power 在power register为1获得OCR值(所有SD卡的功能)获得SD卡OCR值(wifi可能有差异)4No change备注:2和3可以同时执行,7和8也可以同时执行SD bus 电压改变?5change清除sd bus电压设置(SELPWRLVL)
in the Power
Control register.设置power
register power
0设置SD BUS 电压门限6设置SD BUS POWER7END8
1.4 改变总线宽度时序
开始禁止HOST中断yesSD内存卡no屏蔽卡中断SD内存卡yesno改变卡的位模式使能卡中断改变HOST的位模式使能HOST中断结束
1:设置卡中断状态使能位为0,屏蔽不正确的中断,当改变总线宽度时
2:如果是SD内存卡,执行第4部,如果是其他的卡,执行第3步
3:设置CCCR中的IENM为0,通过CMD52命令
4:改变SD卡的位模式。改变SD内存卡总线的宽度(ACMD6),SDIO卡的总线宽度设置通过CCCR设置
5:如果你想改变成4位传输模式,设置数据传输宽度(WIDE4)到Host Control 寄存器为1,其他方式下,设置为0.
6:如果是SD内存卡,结束操作,如果是其他卡,继续第7步
7:设置IENM(CCCR)位1,通过CMD52命令
8:设置卡中断状态使能位为1
1.5 数据线超时设置
开始计算检测时间分频值设置检测超时时间结束
为了检测数据线的超时错误,HOST Driver应该执行下面两个步骤
1:计算一个检测超时分频值,把值写超时控制寄存器
2:设置超时数据值到超时控制寄存器
1.6 SD 数据交换执行
这节主要描述产生时序和控制各种SD数据交换。SD数据交换被分为下面3中
1:数据传输不用数据线
2:数据传输用数据线仅表示忙信号
3:数据传输用数据线用作数据传输
第1和第2中方式传输被定义为数据传输控制没有数据传输,第3中被定义为实际的数据传输
1.7 SD 命令发送时序
开始1检测命令禁止(CMD)CMD LINE busyCMD LINE free2NOHOST发送一个忙信号yes设置命令到Argument 寄存器发送停止命令53DAT line
busyyes设置命令到命令寄存器6命令完成序列47检测数据停止命令Data line
free采用下面的步骤来设置超时设置
1:检测当前状态寄存器的命令停止(CMD)。重复直到CMD为0。当CMD为1。HOST Driver不应该发送SD 命令
2:如果HOST 发送的是SD 命令忙信号,执行第3步。如果不是忙信号,执行第5步
3:如果HOST端发送一个停止命令,执行第5步,不是,则执行第4步
4:检测命令停止BIT。重复这步直到命令停止位为0
5:设置合适的值到Argument 寄存器
6:设置合适的值到命令寄存器
7:执行命令完成序列
完成
1.7.1 命令发送时序的函数分析
HOST对卡的命令发送过程,最后都会调用sdhci_send_command()函数,此函数原型在drivers/mmc/host/sdhci.c中,函数的处理逻辑是按流程图中的处理过程,但其函数处理逻辑中
还包括传输模式的设置(sdhci_set_transfer_mode()函数是用来设置HOST的传输模式),同时还包括数据操作的准备工作,处理函数是sdhci_prepare_data(),函数中实现了函数超时设置和DMA寄存器的相关配置,以及HOST CONTROL 寄存器的配置等。
1.8 命令完成序列
开始等待传输完成中断15等待命令完成中断中断发生清除中断完成状态62清除命令完成中断状态获得返回的数据检查返回的数据值73返回有错no4返回无错命令传输完成中断结束
1:等待命令完成中断。如果命令中断发生,执行第2部
2:写1到命令完成BIT清除这位
3:读相应寄存器并且获得必要的信息
4:判断是否用数据传输完成中断,如果用了传输完成中断,执行第5步,否则执行第7步
5:等待传输完成中断。如果传输中断发生,执行第6步。
6:写1到传输完成BIT清除这位
7:检测相应的数据是否有错误。如果有错误,执行第8步,没有错,执行第9步
8:返回无错
9:返回状态有错
1.8.1 命令完成函数分析
当命令中断发生时,调用中断处理函数sdhci_cmd_irq,通过终端标志位的判断,最终会调用sdhci_finish_command()函数来响应命令完成逻辑的处理,此函数在drivers/mmc/host/sdhci.c中。sdhci_finish_data此函数获取相应后的数据,并作出出错处理。函数的处理逻辑是按照流程图的出路过程,但是增加了其他的处理过程,和实际的代码处理时不完全一致的。
1.9 数据传输控制
数据传输可以用DMA方式和非DMA方式。有3中数据块的数据传输方式
1:Single Block Transfer
块传输个数在传输前被HOST 端定义,传输块数量总是1
2:Mutiple Block Transfer
传输块数是1个或者多个
3:Infinite Block Transfer
这个在数据传输前不被HOST定义,传输一直进行,直到停止传输,停止传输通过CMD12命令,而SDIO通过CMD52
2 SD/MMC寄存器描述
2.1 备注
本机只对比较重要的寄存器如何配置做出描述,不会全部描述数据手册中的内容。参考的数据手册主要是6410数据手册中SD/MMC中的相关内容。
2.2 SDMA SYSTEM ADDRESS REGISTER
寄存器 地址 R/W 解释 复位值
SDMASYSAD0 0x7C200000 R/W SDMA 系统地址寄存器,这3个寄存器包含SDMASYSAD1 0x7C300000 R/W
DMA传输的系统内存地址。当HOST控制器停SDMASYSAD2 0x7C400000 R/W
止DMA传输时,寄存器将指向下一个数据传输的地址。
0x0
2.3 BLOCK SIZE REGISTER
此寄存器用到配置块数据传输的大小。
寄存器 地址 R/W 解释 复位值
BLKSIZE0 0x7C200004 R/W HOST DMA buffer边界值和传输块大小寄存器 0x0
BLKSIZE1 0x7C300004 R/W
BLKSIZE2 0x7C400004 R/W
Bit位的值设定表
Name
BUFB
Bit
15
解释
保留
001b = 8K bytes
010b = 16K Bytes
011b = 32K Bytes
100b = 64K bytes
101b = 128K Bytes
110b = 256K Bytes
111b = 512K Bytes
初始化值
0x0
OUND
14:12 000b = 4K bytes
BLKSI
ZE
11:0 0200h = 512 Bytes
01FFh = 511 Bytes
… …
0004h = 4 Bytes
0003h = 3 Bytes
0002h = 2 Bytes
0001h = 1 Byte
0000h = No data
transfer
2.4 BLOCK COUNT REGISTER
这个寄存器被用来配置块数量
Name Bit 解释
FFFFh = 65535 blocks
… …
0002h = 2 blocks
0001h = 1 block
0000h = Stop Count
复位值
BLKCNT 15:0 必须使能Block Count Enable 0
2.5 ARGUMENT REGISTER
这个寄存器包含SD命令的参数,也包含3个寄存器从ARGUMENT0到ARGUMENT2.
2.6 TRANSFER MODE REGISTER
传输模式寄存器,这个寄存器用来控制数据传输的操作,寄存器包含TRNMOD0,TRNMOD1,TRNMOD23种。
Name
CCSCON
Bit
15:10
9:8
解释
保留
命令完成信号控制
00=没有CCS操作
01=读写数据传输CCS使能
10=没有数据传输
11=禁止完成信号产生
MUL1SIN0 5 Multi / Single Block
Select
如果这位为0,没有必要设置Block Count
初始化值
0
0
寄存器
1 = Multiple Block
0 = Single Block
RD1WT0 4 Data Transfer 0
Direction Select
这位定义数据线的传输方向
1 = Read (Card to
Host)
0 = Write (Host to
Card)
ENACMD12
3
2
保留
Auto CMD12 Enable
多块数据传输需要CMD12命令停止数据交换当这位为1时,HOST控制器将在数据传输的最后一块完成时发送CMD12命令。
1 = Enable
0 = Disable
ENDMA 0 DMA Enablezhe
1 = Enable
0 = Disable
这位与命令寄存器和功(能寄存器Capabilities
0
0
0
registe)相关
2.7 COMMAND REGISTER
这个寄存器包含SD命令参数,在写命令寄存器之前HOST Driver将检查数据线的命令停止位和命令线的数据停止位(这些BIT在当前状态寄存器中)。
Name
CMDIDX
Bit
15:14
13:8
描述
保留
命令索引号,这个在SDIO和SD标准协议中有定义
CMDTYP 7:6 Command Type
11b = Abort CMD12,
CMD52 for writing
“I/O Abort” in CCCR
10b = Resume
初始值
CMD52 for writing
“Function Select” in
CCCR
01b = Suspend
CMD52 for writing
“Bus Suspend” in
CCCR
00b = Normal Other
commands
DARAPRNT 5 Data Present Select
1 = Data Present
0 = No Data Present
这位设置为 1指示数据存在,并且将用数据线传输。
ENCMDIDX 4 Command
Check Enable
这位设置为1,HOST将检查命令索引是否存在。没有将出错
1=Enable
0 = Disable
ENCMDCRC 3 Command
Check Enable
如果这位设置为1,HOST将检查CRC,如果出错,报告CRC命令错误。否则不检查
1=Enable
0 = Disable
PSPTYP
2
1:0
保留
Response
Select
00 = No Response
01=Response Length
136
10=Response Length
48
11=Response Length
48 check Busy after
response
Type
CRC
Index
2.8 RESPONSE REGISTER
这个寄存器用来存储SD 卡的响应数据。包括寄存器RSPREG0_0-RSPREG0_2,RSPREG1_0-RSPREG1_2,RSPREG2_0-RSPREG2_,RSPREG3_0-RSPREG3_2。
寄存器标志位描述
Name
CMDRSP
Bit
127:0
解释
这个响应对应一张映射表,可以参考数据手册923页。
128Bit响应顺序,{RSPREG3,
RSPREG2,
RSPREG1,
RSPREG0}
初始化值
Command Response
2.9 PRESENT STATE REGISTER
这个寄存器包含SD命令参数,从PRNSTS0-PRNSTS2.
Name
PRNTCMD
Bit
31:25
24
描述
保留
只读,这个位被用来检测CMD LINE从错误状态恢复。调试用。
PRNTDAT 23:20 这个位放映数据线从错误状态恢复,用于调试。DAT[0]用于忙信号
PRNTCD
19
18
保留
Card Detect
Level (RO)
1 = Card present
(SDCD#=0)
0 = No card present
(SDCD#=1)
STBLCARD 17 Card State Stable
(RO)
这位被用来测试。
1=没有卡插入
0=复位
INSCARD 16 Card Inserted (RO)
这位表示是否有卡插入。
1 = Card Inserted
0
1
Pin Line state
LINE State
初始化值
0
0
0=复位或没有卡
BUFRDRDY
15:12
11
保留
(ROC)
这位被用做非DMA读操作。
1=读使能
0=读禁止
BUFWTRDY 10 这个状态被用作非DMA写。
1 = Write enable
0 = Write disable
RDTRA
NACT
9 ReadTransfer Active 0
(ROC)
1= Transferring data
0 = No valid data
WTTRA
NACT
8 WriteTransfer Active 0
(ROC)
1= Transferring data
0 = No valid data
DATLIN
EACT
2 DAT
(ROC)
1 = DAT Line Active
0=DAT Line Inactive
CMDIN
HDAT
1 1=不能用数据线发送命令
0=能用数据线发送mingl
CMDIN
HCMD
0 Command
(CMD) (ROC)
1=不能发送命令
0=能用命令线发送命令
Inhibit 0
0
Line Active 0
0
Buffer Read Enable
2.10 HOST CONTROL REGISTER
这个寄存器包含SD命令参数,寄存器包括HOSTCTL0-HOSTCTL2
Name
WIDE8
Bit
7
6
5
解释
保留
保留
1=8bit操作
0=1bit
DMASEL 4:3 DMA Select 0
初始化值
0
0
Extended Data Transfer Width (It is for MMC 8-bit card.) 0
00 = SDMA is selected
01 = Reserved
10 = 32-bit Address ADMA2 is selected
11 = 64-bit Address ADMA2 is selected (Not supported)
ENHIGHSPD 2 High Speed Enable
1=高速模式
0=正常模式
WIDE4 1 数据传输宽度
1=4位模式
0=1位模式
0 保留 0
0
0
2.11 CLOCK CONTROL REGISTER
时钟控制寄存器。寄存器包括CLKCON0 –CLKCON2.
Name
SELFREQ
Bit 描述 初始化值
15:8 SDCLK Frequency Select
这个寄存器被用作选择SDCLK频率,选择分频值
80H=256分频
40H=128分频
20H=64分频
10H=32分频
08H=16分频
04H=8分频
02H=4分频
01H=2分频
00H=基本源时钟是10MHZ-63MHZ
ENSDCLK
3
2
保留
SD CLOCK ENABLE
使能SDCLK=1,关闭SDCLK=0
STBLINTCLK 1 Internal Clock Stable
这位设置为1,当SD时钟是稳定的,然后写1到nternal Clock
Enable位。SD HOST将等待SD CLOCK 使能直到这位为1.
1‟ = Ready
0‟ = Not Ready
ENINTCLK 0 Internal Clock Enable
0
0
0
2.12 TIMEOUT CONTROL REGISTER
超时控制寄存器,这个用来控制超时的时间长度,超时时间设置时4位2进制分别对应不同的超时值。具体配置值可以参考数据手册939页,实际我们驱动用的超时值是配的最大的1110b=TMCLK*2^27.最小是0000Btmclk*2^13
2.13 NORMAL INTERRUPT STATUS REGISTER
正常中断状态使能影响寄存器的读,但是正常中断信号使能不影响读。一个中断发生,正常中断信号使能被使能,并且至少一个状态位被置1.所有这些未除了卡中断和错误中断,写一清除这位,写0保持不变
寄存器包括NORINTSTS0-NORINTSTS2
Name
STAERR
STAFIA3
Bit 描述
15 这个用于错误检测,只读
0=no error 1=error
14 FIFO SD Address Pointer Interrupt 3Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STAFIA2 13 FIFO SD Address Pointer Interrupt 2Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STAFIA1 12 FIFO SD Address Pointer Interrupt 1Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STAFIA0 11 FIFO SD Address Pointer Interrupt 0Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STARWAIT 10 Read Wait Interrupt Status (RW1C)
0‟ = Read Wait Interrupt Not Occurred
1‟ = Read Wait Interrupt Occurred
STACCS 9 CCS Interrupt Status (RW1C)
命令完成信号中断状态位,只能在CE-ATA接口模式
0‟ = CCS Interrupt Occurred, ‟1‟ = CCS Interrupt Not
Occurred
STACARDI
NT
STACARDREM 7
8 Card Interrupt
1‟ = Generate Card Interrupt
0‟ = No Card Interrupt
CARD Removal
这个标志位指示是否有卡插入,当前状态寄存器改变从1到0
1=卡移除
0=卡状态稳定,存在
STACARDINS 6 Card Insertion
这位指示是否有卡插入,当前状态寄存器从1改变为0.。HOST写1清除这位。
1=卡插入
0=卡稳定或移除
STABUFDRDY 5 Buffer Read Ready
如果buffer读使能从0变成1.,这位状态位设置。
1=准备读buffer
0
0
0
0
0
0
0
0
0
初始值
0
0=没有准备读buffer
STABUFWTRDY 4 Buffer Write Ready
如果BUFFER写使能从0变成1.状态位被置1
1=准备写BUFFER
0=没有准备些BUFFER
STADMAINT 3 DMA Interrupt
1=MDA 中断发生
0=没有DMA中断发生
STABLKGAP 2 Block Gap Event
„1‟ = Transaction stopped at block gap
„0‟ = No Block Gap Event
STATRANCMPLT 1 Transfer Complete
1=传输结束
0=没有传输结束
STACMDCMPLT 0 Command Complete
1=命令完成
0=没有命令结束
备注:相对应的包括错误中断状态寄存器
0
0
0
0
0
2.14 NORMAL INTERRUPT STATUS ENABLE REGISTER
此寄存器使能和屏蔽相关的寄存器中断使能位,包括读写中断使能,卡插入和卡移除使能,传输完成中断使能,命令传输完成状态使能。
相对应的还包括错误中断使能寄存器
2.15 NORMAL INTERRUPT SIGNAL ENABLE REGISTER
这个和正常中断状态使能次寄存器相对应,这个寄存器主要是使能相对应的中断信号使能。同时还包含错误中断信号使能寄存器。
2.16 CAPABILITIES REGISTER
HOST DRIVER支持的相关信息。包过支持的电压等级( 1.8-3.3)是否支持睡眠唤醒,是否支持DMA,高速支持,ADMA2支持,最大块传输长度,超时单位设置,超时频率设置。
2.17 CONTROL REGISTER 2
控制寄存器2,这个寄存器中包含SD命令参数。有CONTROL2_0-CONTROL2_2。下面描述寄存器中的相关位,在实际驱动中,这个用的比较普遍
Name
ENSTAASYNCCLR
Bit
31
描述
这位使能异步清除使能。初始化期间,应该使能该位
1=使能,0=禁止
初始值
0
ENCMDCNFMSK
CDINVRXD3
SELCARDOUT
30
29
28
命令冲突屏蔽使能
当在高速模式是,这位应该被使能
卡检测信号翻转
0=禁止,1=使能
卡移除条件选择
0=卡指出条件是没有卡插入
1=是卡移除
0
0
0
LVLDAT
ENFBCLKTX
ENFBCLKRX
SDCDSEL
23:16 只读
15
14
13
发送数据和命令时钟的反馈时钟使能
1=使能 0=禁止
接收数据和命令反馈时钟使能。
0=禁止;1=使能
SD卡检测信号选择
0=nSDCD被用来SD 卡检测信号
1=DAT[3]被用来检测SD卡检测信号
0
0
0
0
SDSIGPC 12 SD输出信号功耗控制支持
0=CMD和DAT 输出不被SD bus Power 位控制
1=被SD Bus Power控制
0
ENBUSCHKTXSTART 11 CE-ATA I/F mode
发送数据前检查忙状态
0=禁止检测,1=使能
0
DFCNT
ENCLKOUTHOLD
10:9 Debounce Filter Count
8 SDCLK Hold Enable
进入和退出SDCLK保持状态有HOST 控制器来完成
0=禁止,1=使能
0
0
RWAITMODE 7 Read Wait Release Control
0=读等待释放由HOST控制器自动释放
1=读等待被HOST 驱动释放(人工)
0
DISBUFRD 6 Buffer Read Disable
0=正常模式,用户能读buffer数据
1=用户不能读buffer(FIFO)数据
0
SELBASECLK
PWRSYNC
5:4
3
2
基础时钟源选择
保留
cleared
0
ENCLKOUTTMSKCON 1
HWINITFIN 0
SDCLK output clock masking when Card Insert
SD HOST 控制硬件初始化完成
0=没有完成,1=完成
0
2.18 备注
寄存器中还包含控制寄存器3和控制寄存器4等。控制寄存器3包含反馈时钟的选择,FIFO中选地址寄存器的选择。ADMA系统地址寄存器,这个寄存器包含物理描述符的地址。还有HOST
控制寄存器,几种包含厂商的版本信息和SD协议的标准信息等。
2024年1月5日发(作者:蒙蔚然)
1 SD /MMC HOST CONTROLER
1.1 SD中断检测时序
Card 检测时序Start
使能中断卡检测(对本驱动而言是基于sdio的wifi芯片数据检测)当HOST DRIVER检测到card插入和移除的时,清除中断状态,如果card插入中断发生,写1到card 插入bit(在正常中断状态寄存器中)。如果card移除中断发生,写1到card移除中断状态位(也在终端状态寄存器中)使能中断卡检测,需要写1到下面的bit1:card插入状态位使能(ENSTACARDNS)(此状态位在正常中断状态使能寄存器)2:card插入信号使能(ENSIGCARDNS)(此状态位在正常中断信号使能寄存器)3:card 移除状态使能(ENSTACARDREM),此状态位在正常中断状态使能寄存器4:card 移除信号使能(ENSIGCARDREM),此状态位在正常中断信号使能寄存器清除card检测中断位检测卡插入card插入bit是1,表示为card插入检测card插入是在当前状态寄存器中(Present State register)。card插入是1,host driver 能提供电压和时钟到sd card(对于wifi同样提供时钟和电压);在card 插入是0时,其他一些程序将立即关闭endcard插入bit是0,表示为清除cardSD中断检测时序主要是配置好正常中断状态使能寄存器和正常中断信号使能寄存器相关的bit位。主要是卡插入状态使能(ENSTACARDNS),卡插入信号使能(ENSIGCARDNS),卡移除状态使能(ENSTACARDREM),卡移除信号使能(ENSIGCARDREM)
1.2 SD时钟提供时序
Sd card时钟提供时序计算一个分频确定SD时钟,通过基础时钟频率计算分频为sd时钟频率设置SDCLK频率 ,选择内部时钟使能检测内部时钟在时钟控制寄存器,重复直到时钟 clock stabel
是1检测内部时钟使能设置SD clock enable
(ENSDCLK)为0 ,HOST controller 停止提供SD时钟设置SD 时钟使能end
SD时钟提供按下面的操作进行:
A:发送一个SD命令
B:检测在4bit模式下SD卡产生的中断。
对于停止SD时钟的提供,只要设置SD时钟使能位为0,该寄存器位在时钟控制寄存器
1.2.1 时钟改变的函数逻辑
SD时钟的改变时通过sdhci_s3c_change_clock()函数来处理,其中主要对时钟控制寄存器和超时控制寄存器进行配置,最后通过sdhci_change_clock()函数来处理SD时钟设置,其中包括分频值的计算,以及时钟控制寄存器的配置等。
1.3 SD总线电压控制时序
start通过读Capabilities register,
获得host controller支持的电压获得支持电压(从host
controller)设置SD bus电压选择支持最大电压设置SD bus
power1设置SD bus 电压门限。Host
controller支持23设置sd bus
power 在power register为1获得OCR值(所有SD卡的功能)获得SD卡OCR值(wifi可能有差异)4No change备注:2和3可以同时执行,7和8也可以同时执行SD bus 电压改变?5change清除sd bus电压设置(SELPWRLVL)
in the Power
Control register.设置power
register power
0设置SD BUS 电压门限6设置SD BUS POWER7END8
1.4 改变总线宽度时序
开始禁止HOST中断yesSD内存卡no屏蔽卡中断SD内存卡yesno改变卡的位模式使能卡中断改变HOST的位模式使能HOST中断结束
1:设置卡中断状态使能位为0,屏蔽不正确的中断,当改变总线宽度时
2:如果是SD内存卡,执行第4部,如果是其他的卡,执行第3步
3:设置CCCR中的IENM为0,通过CMD52命令
4:改变SD卡的位模式。改变SD内存卡总线的宽度(ACMD6),SDIO卡的总线宽度设置通过CCCR设置
5:如果你想改变成4位传输模式,设置数据传输宽度(WIDE4)到Host Control 寄存器为1,其他方式下,设置为0.
6:如果是SD内存卡,结束操作,如果是其他卡,继续第7步
7:设置IENM(CCCR)位1,通过CMD52命令
8:设置卡中断状态使能位为1
1.5 数据线超时设置
开始计算检测时间分频值设置检测超时时间结束
为了检测数据线的超时错误,HOST Driver应该执行下面两个步骤
1:计算一个检测超时分频值,把值写超时控制寄存器
2:设置超时数据值到超时控制寄存器
1.6 SD 数据交换执行
这节主要描述产生时序和控制各种SD数据交换。SD数据交换被分为下面3中
1:数据传输不用数据线
2:数据传输用数据线仅表示忙信号
3:数据传输用数据线用作数据传输
第1和第2中方式传输被定义为数据传输控制没有数据传输,第3中被定义为实际的数据传输
1.7 SD 命令发送时序
开始1检测命令禁止(CMD)CMD LINE busyCMD LINE free2NOHOST发送一个忙信号yes设置命令到Argument 寄存器发送停止命令53DAT line
busyyes设置命令到命令寄存器6命令完成序列47检测数据停止命令Data line
free采用下面的步骤来设置超时设置
1:检测当前状态寄存器的命令停止(CMD)。重复直到CMD为0。当CMD为1。HOST Driver不应该发送SD 命令
2:如果HOST 发送的是SD 命令忙信号,执行第3步。如果不是忙信号,执行第5步
3:如果HOST端发送一个停止命令,执行第5步,不是,则执行第4步
4:检测命令停止BIT。重复这步直到命令停止位为0
5:设置合适的值到Argument 寄存器
6:设置合适的值到命令寄存器
7:执行命令完成序列
完成
1.7.1 命令发送时序的函数分析
HOST对卡的命令发送过程,最后都会调用sdhci_send_command()函数,此函数原型在drivers/mmc/host/sdhci.c中,函数的处理逻辑是按流程图中的处理过程,但其函数处理逻辑中
还包括传输模式的设置(sdhci_set_transfer_mode()函数是用来设置HOST的传输模式),同时还包括数据操作的准备工作,处理函数是sdhci_prepare_data(),函数中实现了函数超时设置和DMA寄存器的相关配置,以及HOST CONTROL 寄存器的配置等。
1.8 命令完成序列
开始等待传输完成中断15等待命令完成中断中断发生清除中断完成状态62清除命令完成中断状态获得返回的数据检查返回的数据值73返回有错no4返回无错命令传输完成中断结束
1:等待命令完成中断。如果命令中断发生,执行第2部
2:写1到命令完成BIT清除这位
3:读相应寄存器并且获得必要的信息
4:判断是否用数据传输完成中断,如果用了传输完成中断,执行第5步,否则执行第7步
5:等待传输完成中断。如果传输中断发生,执行第6步。
6:写1到传输完成BIT清除这位
7:检测相应的数据是否有错误。如果有错误,执行第8步,没有错,执行第9步
8:返回无错
9:返回状态有错
1.8.1 命令完成函数分析
当命令中断发生时,调用中断处理函数sdhci_cmd_irq,通过终端标志位的判断,最终会调用sdhci_finish_command()函数来响应命令完成逻辑的处理,此函数在drivers/mmc/host/sdhci.c中。sdhci_finish_data此函数获取相应后的数据,并作出出错处理。函数的处理逻辑是按照流程图的出路过程,但是增加了其他的处理过程,和实际的代码处理时不完全一致的。
1.9 数据传输控制
数据传输可以用DMA方式和非DMA方式。有3中数据块的数据传输方式
1:Single Block Transfer
块传输个数在传输前被HOST 端定义,传输块数量总是1
2:Mutiple Block Transfer
传输块数是1个或者多个
3:Infinite Block Transfer
这个在数据传输前不被HOST定义,传输一直进行,直到停止传输,停止传输通过CMD12命令,而SDIO通过CMD52
2 SD/MMC寄存器描述
2.1 备注
本机只对比较重要的寄存器如何配置做出描述,不会全部描述数据手册中的内容。参考的数据手册主要是6410数据手册中SD/MMC中的相关内容。
2.2 SDMA SYSTEM ADDRESS REGISTER
寄存器 地址 R/W 解释 复位值
SDMASYSAD0 0x7C200000 R/W SDMA 系统地址寄存器,这3个寄存器包含SDMASYSAD1 0x7C300000 R/W
DMA传输的系统内存地址。当HOST控制器停SDMASYSAD2 0x7C400000 R/W
止DMA传输时,寄存器将指向下一个数据传输的地址。
0x0
2.3 BLOCK SIZE REGISTER
此寄存器用到配置块数据传输的大小。
寄存器 地址 R/W 解释 复位值
BLKSIZE0 0x7C200004 R/W HOST DMA buffer边界值和传输块大小寄存器 0x0
BLKSIZE1 0x7C300004 R/W
BLKSIZE2 0x7C400004 R/W
Bit位的值设定表
Name
BUFB
Bit
15
解释
保留
001b = 8K bytes
010b = 16K Bytes
011b = 32K Bytes
100b = 64K bytes
101b = 128K Bytes
110b = 256K Bytes
111b = 512K Bytes
初始化值
0x0
OUND
14:12 000b = 4K bytes
BLKSI
ZE
11:0 0200h = 512 Bytes
01FFh = 511 Bytes
… …
0004h = 4 Bytes
0003h = 3 Bytes
0002h = 2 Bytes
0001h = 1 Byte
0000h = No data
transfer
2.4 BLOCK COUNT REGISTER
这个寄存器被用来配置块数量
Name Bit 解释
FFFFh = 65535 blocks
… …
0002h = 2 blocks
0001h = 1 block
0000h = Stop Count
复位值
BLKCNT 15:0 必须使能Block Count Enable 0
2.5 ARGUMENT REGISTER
这个寄存器包含SD命令的参数,也包含3个寄存器从ARGUMENT0到ARGUMENT2.
2.6 TRANSFER MODE REGISTER
传输模式寄存器,这个寄存器用来控制数据传输的操作,寄存器包含TRNMOD0,TRNMOD1,TRNMOD23种。
Name
CCSCON
Bit
15:10
9:8
解释
保留
命令完成信号控制
00=没有CCS操作
01=读写数据传输CCS使能
10=没有数据传输
11=禁止完成信号产生
MUL1SIN0 5 Multi / Single Block
Select
如果这位为0,没有必要设置Block Count
初始化值
0
0
寄存器
1 = Multiple Block
0 = Single Block
RD1WT0 4 Data Transfer 0
Direction Select
这位定义数据线的传输方向
1 = Read (Card to
Host)
0 = Write (Host to
Card)
ENACMD12
3
2
保留
Auto CMD12 Enable
多块数据传输需要CMD12命令停止数据交换当这位为1时,HOST控制器将在数据传输的最后一块完成时发送CMD12命令。
1 = Enable
0 = Disable
ENDMA 0 DMA Enablezhe
1 = Enable
0 = Disable
这位与命令寄存器和功(能寄存器Capabilities
0
0
0
registe)相关
2.7 COMMAND REGISTER
这个寄存器包含SD命令参数,在写命令寄存器之前HOST Driver将检查数据线的命令停止位和命令线的数据停止位(这些BIT在当前状态寄存器中)。
Name
CMDIDX
Bit
15:14
13:8
描述
保留
命令索引号,这个在SDIO和SD标准协议中有定义
CMDTYP 7:6 Command Type
11b = Abort CMD12,
CMD52 for writing
“I/O Abort” in CCCR
10b = Resume
初始值
CMD52 for writing
“Function Select” in
CCCR
01b = Suspend
CMD52 for writing
“Bus Suspend” in
CCCR
00b = Normal Other
commands
DARAPRNT 5 Data Present Select
1 = Data Present
0 = No Data Present
这位设置为 1指示数据存在,并且将用数据线传输。
ENCMDIDX 4 Command
Check Enable
这位设置为1,HOST将检查命令索引是否存在。没有将出错
1=Enable
0 = Disable
ENCMDCRC 3 Command
Check Enable
如果这位设置为1,HOST将检查CRC,如果出错,报告CRC命令错误。否则不检查
1=Enable
0 = Disable
PSPTYP
2
1:0
保留
Response
Select
00 = No Response
01=Response Length
136
10=Response Length
48
11=Response Length
48 check Busy after
response
Type
CRC
Index
2.8 RESPONSE REGISTER
这个寄存器用来存储SD 卡的响应数据。包括寄存器RSPREG0_0-RSPREG0_2,RSPREG1_0-RSPREG1_2,RSPREG2_0-RSPREG2_,RSPREG3_0-RSPREG3_2。
寄存器标志位描述
Name
CMDRSP
Bit
127:0
解释
这个响应对应一张映射表,可以参考数据手册923页。
128Bit响应顺序,{RSPREG3,
RSPREG2,
RSPREG1,
RSPREG0}
初始化值
Command Response
2.9 PRESENT STATE REGISTER
这个寄存器包含SD命令参数,从PRNSTS0-PRNSTS2.
Name
PRNTCMD
Bit
31:25
24
描述
保留
只读,这个位被用来检测CMD LINE从错误状态恢复。调试用。
PRNTDAT 23:20 这个位放映数据线从错误状态恢复,用于调试。DAT[0]用于忙信号
PRNTCD
19
18
保留
Card Detect
Level (RO)
1 = Card present
(SDCD#=0)
0 = No card present
(SDCD#=1)
STBLCARD 17 Card State Stable
(RO)
这位被用来测试。
1=没有卡插入
0=复位
INSCARD 16 Card Inserted (RO)
这位表示是否有卡插入。
1 = Card Inserted
0
1
Pin Line state
LINE State
初始化值
0
0
0=复位或没有卡
BUFRDRDY
15:12
11
保留
(ROC)
这位被用做非DMA读操作。
1=读使能
0=读禁止
BUFWTRDY 10 这个状态被用作非DMA写。
1 = Write enable
0 = Write disable
RDTRA
NACT
9 ReadTransfer Active 0
(ROC)
1= Transferring data
0 = No valid data
WTTRA
NACT
8 WriteTransfer Active 0
(ROC)
1= Transferring data
0 = No valid data
DATLIN
EACT
2 DAT
(ROC)
1 = DAT Line Active
0=DAT Line Inactive
CMDIN
HDAT
1 1=不能用数据线发送命令
0=能用数据线发送mingl
CMDIN
HCMD
0 Command
(CMD) (ROC)
1=不能发送命令
0=能用命令线发送命令
Inhibit 0
0
Line Active 0
0
Buffer Read Enable
2.10 HOST CONTROL REGISTER
这个寄存器包含SD命令参数,寄存器包括HOSTCTL0-HOSTCTL2
Name
WIDE8
Bit
7
6
5
解释
保留
保留
1=8bit操作
0=1bit
DMASEL 4:3 DMA Select 0
初始化值
0
0
Extended Data Transfer Width (It is for MMC 8-bit card.) 0
00 = SDMA is selected
01 = Reserved
10 = 32-bit Address ADMA2 is selected
11 = 64-bit Address ADMA2 is selected (Not supported)
ENHIGHSPD 2 High Speed Enable
1=高速模式
0=正常模式
WIDE4 1 数据传输宽度
1=4位模式
0=1位模式
0 保留 0
0
0
2.11 CLOCK CONTROL REGISTER
时钟控制寄存器。寄存器包括CLKCON0 –CLKCON2.
Name
SELFREQ
Bit 描述 初始化值
15:8 SDCLK Frequency Select
这个寄存器被用作选择SDCLK频率,选择分频值
80H=256分频
40H=128分频
20H=64分频
10H=32分频
08H=16分频
04H=8分频
02H=4分频
01H=2分频
00H=基本源时钟是10MHZ-63MHZ
ENSDCLK
3
2
保留
SD CLOCK ENABLE
使能SDCLK=1,关闭SDCLK=0
STBLINTCLK 1 Internal Clock Stable
这位设置为1,当SD时钟是稳定的,然后写1到nternal Clock
Enable位。SD HOST将等待SD CLOCK 使能直到这位为1.
1‟ = Ready
0‟ = Not Ready
ENINTCLK 0 Internal Clock Enable
0
0
0
2.12 TIMEOUT CONTROL REGISTER
超时控制寄存器,这个用来控制超时的时间长度,超时时间设置时4位2进制分别对应不同的超时值。具体配置值可以参考数据手册939页,实际我们驱动用的超时值是配的最大的1110b=TMCLK*2^27.最小是0000Btmclk*2^13
2.13 NORMAL INTERRUPT STATUS REGISTER
正常中断状态使能影响寄存器的读,但是正常中断信号使能不影响读。一个中断发生,正常中断信号使能被使能,并且至少一个状态位被置1.所有这些未除了卡中断和错误中断,写一清除这位,写0保持不变
寄存器包括NORINTSTS0-NORINTSTS2
Name
STAERR
STAFIA3
Bit 描述
15 这个用于错误检测,只读
0=no error 1=error
14 FIFO SD Address Pointer Interrupt 3Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STAFIA2 13 FIFO SD Address Pointer Interrupt 2Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STAFIA1 12 FIFO SD Address Pointer Interrupt 1Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STAFIA0 11 FIFO SD Address Pointer Interrupt 0Status(RW1C)
0‟ = Occurred
1‟ = Not Occurred
STARWAIT 10 Read Wait Interrupt Status (RW1C)
0‟ = Read Wait Interrupt Not Occurred
1‟ = Read Wait Interrupt Occurred
STACCS 9 CCS Interrupt Status (RW1C)
命令完成信号中断状态位,只能在CE-ATA接口模式
0‟ = CCS Interrupt Occurred, ‟1‟ = CCS Interrupt Not
Occurred
STACARDI
NT
STACARDREM 7
8 Card Interrupt
1‟ = Generate Card Interrupt
0‟ = No Card Interrupt
CARD Removal
这个标志位指示是否有卡插入,当前状态寄存器改变从1到0
1=卡移除
0=卡状态稳定,存在
STACARDINS 6 Card Insertion
这位指示是否有卡插入,当前状态寄存器从1改变为0.。HOST写1清除这位。
1=卡插入
0=卡稳定或移除
STABUFDRDY 5 Buffer Read Ready
如果buffer读使能从0变成1.,这位状态位设置。
1=准备读buffer
0
0
0
0
0
0
0
0
0
初始值
0
0=没有准备读buffer
STABUFWTRDY 4 Buffer Write Ready
如果BUFFER写使能从0变成1.状态位被置1
1=准备写BUFFER
0=没有准备些BUFFER
STADMAINT 3 DMA Interrupt
1=MDA 中断发生
0=没有DMA中断发生
STABLKGAP 2 Block Gap Event
„1‟ = Transaction stopped at block gap
„0‟ = No Block Gap Event
STATRANCMPLT 1 Transfer Complete
1=传输结束
0=没有传输结束
STACMDCMPLT 0 Command Complete
1=命令完成
0=没有命令结束
备注:相对应的包括错误中断状态寄存器
0
0
0
0
0
2.14 NORMAL INTERRUPT STATUS ENABLE REGISTER
此寄存器使能和屏蔽相关的寄存器中断使能位,包括读写中断使能,卡插入和卡移除使能,传输完成中断使能,命令传输完成状态使能。
相对应的还包括错误中断使能寄存器
2.15 NORMAL INTERRUPT SIGNAL ENABLE REGISTER
这个和正常中断状态使能次寄存器相对应,这个寄存器主要是使能相对应的中断信号使能。同时还包含错误中断信号使能寄存器。
2.16 CAPABILITIES REGISTER
HOST DRIVER支持的相关信息。包过支持的电压等级( 1.8-3.3)是否支持睡眠唤醒,是否支持DMA,高速支持,ADMA2支持,最大块传输长度,超时单位设置,超时频率设置。
2.17 CONTROL REGISTER 2
控制寄存器2,这个寄存器中包含SD命令参数。有CONTROL2_0-CONTROL2_2。下面描述寄存器中的相关位,在实际驱动中,这个用的比较普遍
Name
ENSTAASYNCCLR
Bit
31
描述
这位使能异步清除使能。初始化期间,应该使能该位
1=使能,0=禁止
初始值
0
ENCMDCNFMSK
CDINVRXD3
SELCARDOUT
30
29
28
命令冲突屏蔽使能
当在高速模式是,这位应该被使能
卡检测信号翻转
0=禁止,1=使能
卡移除条件选择
0=卡指出条件是没有卡插入
1=是卡移除
0
0
0
LVLDAT
ENFBCLKTX
ENFBCLKRX
SDCDSEL
23:16 只读
15
14
13
发送数据和命令时钟的反馈时钟使能
1=使能 0=禁止
接收数据和命令反馈时钟使能。
0=禁止;1=使能
SD卡检测信号选择
0=nSDCD被用来SD 卡检测信号
1=DAT[3]被用来检测SD卡检测信号
0
0
0
0
SDSIGPC 12 SD输出信号功耗控制支持
0=CMD和DAT 输出不被SD bus Power 位控制
1=被SD Bus Power控制
0
ENBUSCHKTXSTART 11 CE-ATA I/F mode
发送数据前检查忙状态
0=禁止检测,1=使能
0
DFCNT
ENCLKOUTHOLD
10:9 Debounce Filter Count
8 SDCLK Hold Enable
进入和退出SDCLK保持状态有HOST 控制器来完成
0=禁止,1=使能
0
0
RWAITMODE 7 Read Wait Release Control
0=读等待释放由HOST控制器自动释放
1=读等待被HOST 驱动释放(人工)
0
DISBUFRD 6 Buffer Read Disable
0=正常模式,用户能读buffer数据
1=用户不能读buffer(FIFO)数据
0
SELBASECLK
PWRSYNC
5:4
3
2
基础时钟源选择
保留
cleared
0
ENCLKOUTTMSKCON 1
HWINITFIN 0
SDCLK output clock masking when Card Insert
SD HOST 控制硬件初始化完成
0=没有完成,1=完成
0
2.18 备注
寄存器中还包含控制寄存器3和控制寄存器4等。控制寄存器3包含反馈时钟的选择,FIFO中选地址寄存器的选择。ADMA系统地址寄存器,这个寄存器包含物理描述符的地址。还有HOST
控制寄存器,几种包含厂商的版本信息和SD协议的标准信息等。