一,sdio cmd

  • cmd:bus上一个cmd代表一个命令的开始令牌(token),它是在CMD信号线上传输,由host发送到device。
  • response:在device收到这个cmd之后会在CMD信号线上返回一个response令牌(token)用来回复之前接收到的命令。但是不是所有的cmd,sdio device都会回复,如果sdio device没有包含memory portion,则不会响应给SD card的cmd命令。同样的SD card也不会响应给sdio device专用的cmd。
    sdio cmd

二,sdio 命令格式

 1) Commond格式

 所有的commond都有一个固定的48bit长度,在CMD Line上传输的是MSB优先,先它的格式如下图所示:
Commond格式
格式说明如下:

  • 47bit 起始位start bit始终为0
  • 46bit 代表传输的方向,bit = 1代表由host端发送给device端,bit = 0代表由device端回复给host
  • [45:40]bit 代表命令索引command index,例如CMD0 这项值为0 ,CMD5则这项值为5,它的范围是0-63
  • [39:8]bit 是该CMD所附带的一些参数,不同的CMD,这32bit每一位所代表的含义是不一样的
  • [7:1]bit 这7位是CRC校验码,它是对[47-8]bit进行循环冗余校验所得到的值,其中command和response使用的多项式生成公式都是
    G ( x ) = x 7 + x 3 + 1 G(x) = x^7+x^3+1 G(x)=x7+x3+1
      data line的校验方式与command有所不同,它使用的是CRC16,而Command使用的是CRC7
  • End bit,始终为1,代表cmd命令结束

 2) response格式

  同样所有的response都是通过CMD Line有device进行发送,传输也是MSB优先,它的格式与commad不同的地方是response格式取决于response的类型,类型不一样,长度也不一样。
  但是所有的response类型它的格式起始位都是0,接着一位代表传输方向固定为0。除去R3以外,其他的response都附带CRC。
  SD 内存卡支持五种response type:R1,R1b,R2,R3,R6
  SDIO卡额外支持2中response type:R4,R5

  • Response R1 (normal response command):
    response R1
     start bit和transmission bit都固定为0,command index代表命令的索引,表示回复的是哪个Command,card status用于表示传输过程中card的状态信息,它有32bit,除去reserved bit以外,其他的bit都代表一个状态标志,用于表示card处理上一个command时的某些状态。
  • response R1b
     与R1不用的是card可能会在收到相应的command之后根据card自身的状态在data line上面发送card busy
  • resposne R2
     它的长度是136个bit,如果[127:1]位中包含的是CID寄存器中的信息,那么该response回复的是CMD2和CMD10,如果[127:1]位中包含的是CSD寄存器中的信息,则回复的是CMD9
    response R2
  • response R3
     回复code的长度是48bit,其中包含了OCR寄存器中的信息,SD memory card用来回复ACMD41
    response R3
  • response R6
     用来回复CMD3
    response R6
  • response R7
     回复code的长度是48bit,用来表示该card支持的电压信息,[19:16]代表card中支持的电压信息,用来回复CMD8
    response R7
  • response R4
     用来回复CMD5,该CMD是给SDIO card专用的,用来查询card中支持的电压域,response则回复支持的电压域
    response R5
  • response R5
     用来回复CMD52,该CMD是给SDIO card专用的

 3) Command Class

 Command 被划分为12类class0-class11,SD card通过读寄存器CSD(card specific data)中12位CCC bit field来确定该card支持哪些classes,SD memory card和sdio card(不包含memory portion)所支持的cmd是不一样的,比如CMD5,CMD52,CMD53只有sdio card支持,而CID,DSR和CSD寄存器在sdio card中不存在所以不支持有这些寄存器相关的读取命令,比如CMD2,CMD4,CMD9,CMD10。
 下图为class0(basic commands)
Command Classcommand15

三,SD,SDIO 寄存器

 1) SD memory register

 SD card支持OCR, CID, CSD, RCA, DSR SCR寄存器,这些寄存器都是通过相应的CMD进行读取

  • OCR(operation conditions register)32bit寄存器包含了Vdd支持电压,并且包含了card的状态信息,用以表示该card是否power up,以及表示card是否为大容量和标准容量。
    OCR register
  • CID(Card IDentification) 128bit寄存器,它包含了card identification information,寄存器的field定义如下图:
    CID
  • CSD(Card-Specific Data) Register包含了数据格式,支持的command classes,纠错类型,最大数据访问时间,是否可以使用DSR寄存器等。
  • RCA register(relative card address register) register 相对地址寄存器包含了在扫卡期间由卡publish的地址。
  • DSR register(driver stage register)
  • SCR register(SD CARD Configuration Register)包含了制造商设置的配置信息,比如支持的SD version,SD Security Support,SD_BUS_WIDTHS等

 2) SDIO register

 sdio寄存器和sd memory寄存器有所不同,有些寄存器在sdio card中没有,有些寄存器位跟SD card也不一样。
 OCR register,sdio card是通过CMD5,来获取OCR的寄存器信息,它与SD card不同的在于它只有24bit,并且只包含card所支持的电压域信息,如下图所示:
SDIO OCR
 host通过CMD5来查询sdio card的电压支持域,CMD5格式如下图所示:
CMD5

  • S(tart bit): 起始位为0
  • D(irection): 方向,1代表是从host发送给device
  • Command Index: CMD的index value是 000101
  • Stuff Bits: 填充位为0.
  • S18R: host是否支持1.8v信号电压切换,card 支持UHS模式host需要切换1.8v信号电压
  • I/O OCR: HOST Vdd支持的电源域
  • CRC7: 7bit CRC校验码
  • End bit: 结束位为1
    CMD5 response
  • S(tart bit): 起始位为0
  • D(irection): 方向为0,代表是从device发送给host
  • Reserved: 预留位为1.
  • C: 在host 发送CMD5且满足card的电压域时card response并设置该位为1,代表card初始化完成
  • Number of I/O Functions: 表示该sdio card所支持的I/O function数量
  • Memory Present: 表示该card是否包含SD memory portion
  • S18A: 表示card支持1.8V电压切换,也就是支持UHS模式(超高速模式)
  • I/O OCR: 支持的操作电压域

 RCA register,相对地址寄存器包含了在扫卡期间由卡publish的地址,通过CMD3获取RCA值
 CSR register,对combo sdio card有效[12:9]bit表示memory controller state,如果是sdio only card这该bit feild无效

四,SDIO 公共I/O区(Common I/O Area)

 host通过读取function 0来获取寄CIA存器的值。它包含三个部分寄存器:

  1. Card Common Control Registers (CCCR)
  2. Function Basic Registers (FBR)
  3. Card Information Structure (CIS)

 SDIO card和SD card有一个很重要的区别是,SDIO card拥有CIA也称作function 0,为此SDIO有专门读写CIA中寄存器的commond(CMD52),

1) SDIO CCCR公共寄存器组

 CCCR全称是Card Common Control Registers,它的地址是0x00 - 0xff,每个地址中8位数据,CCCR中有些寄存器是是8位的,有些寄存器是24位的比如CIS pointer寄存器,它有连续三个地址构成。如果读24位的寄存器,需要用CMD52读三次,每次读一个字节。寄存器表如下图所示
CCCR寄存器表
CCCR中寄存器可用于控制I/O,使能中断,读取card information,报告sdio控制器的状态等。

  • CCCR version寄存器可以读取card支持的SDIO version
  • Bus Width寄存器读取card支持的Bus Width为1bit还是4bit
  • Card Capability寄存器中读取该card是否为High speed card
  • UHS-I Support寄存器获取card支持的speed模式,如UHS_DDR50,UHS_SDR50,UHS_SDR104等

2) SDIO Function Basic Registers

 一个SDIO card支持1到7个Function和一个function 0(CIA)组成。function 0包含了SDIO协议的版本号,BUS MODE,Speed MODE,块大小等信息。每一个function都是独立,它相当于一个包含在card中的I/O device。对于card中所支持的function数量,是通过host发送CMD5,card response中的得到。对于这部分寄存host通过CMD52,CMD53进行读写。对于每一个支持的I/O function在CIA中都有256byte个字节大小的FBR寄存器用来确定I/O function的功能,需求,并使能软件的加载。它的地址是从0x00n00 to 0x00nFF(n为1到7),下图是FBR寄存器在Internal map中所处的位置。
Internal map
 为了满足SDIO卡的“即插即用”每个function都包含一段存储区,用来存储驱动程序或者应用程序,CSA存储区可以起到该作用,如上图所示通过FBR window寄存器可以对CSA 区域进行读写,现在的CSA存储区是被SDIO card制造商定制过的,里面存储空间可能是用来给module中某个function存储初始化固件用的。对于CSA存储区多字节读写可以用CMD53。

 SDIO对128k的CIA寄存器的读写使用的是CMD52

  • IO_RW_DIRECT command(CMD52)该命令是读取某个I/O寄存器最快的方法,通常用来初始化某些寄存器或者读取某些寄存器以获取状态。CMD52格式如下:
    CMD52
    R/W flag:这一位是对IO操作的读写标志,0代表读,1代表写
    Function NUmber:function number,如果是CIA中寄存器,则该位为0,如果是function unique则是对应的function number
    RAW flag:置1并且RW flag为1,发送cmd后在response中会包含从寄存器中读出来的值,如果是置0,那么response中和write data的值一样
    Write Data:RAW flag为0时该域为写入寄存器的值
    Register Address:读写寄存器的地址
  • IO_RW_DIRECT Response (R5)
    该命令用来回复CMD52,Respons格式如下图所示:
    cmd52 response
    D :0代表 response
    Command index:回复的命令索引
    Response Flags: 表示SDIO card的状态标志
    Read or Write Data: 如果Raw flag为1,并且cmd是write那么这几个bit是从寄存器里面实际读出来的值,如果raw flag为0则该field为write进去的值。如果cmd是read那么这几个bit是读出来的IO寄存器里面的值。

3) CIS Area

  CCCR中和FBR中包含CIS pointer寄存器,该寄存器24bit用于指向对应card和function在CIS Area中CIS信息的地址。如图所示:
CIS
下图为CIS Area,card和每个function的CIS寄存器都在其中
CIS Area
在实际指向的CIS寄存器中包含了card和每个function更完整的信息,CIS寄存器中包含了多组信息,每组信息称为一个tuple,它的格式如下:
tuple
 card和function的 vendor id和device id都是在CIS寄存器中读出来的。
tuple supported
引用资料:
Part_E1_SDIO_Simplified_Specifcation_Ver3.00_20110225
SD Specifications_Part_1_Physical_Layer_Specification_Ver3.00_Final_090416

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐