SDIO接口WIFI驱动之二:iSDIO寄存器与CMD52/CMD53命令介绍
SDIO接口WIFI驱动之二:iSDIO寄存器与CMD52/CMD53命令介绍-电子头条-EEWORLD电子工程世界
SDIO接口WIFI驱动之二:iSDIO寄存器与CMD52/CMD53命令介绍
一 . 前言
前面介绍了初始化过程中涉及到的三条命令 CMD5/CMD3/CMD7( 属于 SDIO 层面 ) ,现在继续来介绍 SDIO/iSDIO 的寄存器 ( 属于 SDIO 层面 ) 和访问寄存器的 CMD52/CMD53 命令 ( 属于 SDIO 层面 ) 。
SDIO 协议是基于 SD 卡协议而来 , 而 iSDIO 又是在 SDIO 基础上定义的一类智能卡, iSDIO Wireless LAN 则是 iSDIO 类卡的一个具体的实例。
即对应 SD->SDIO->iSDIO->WLAN 这几个层级,规格书分别对应以下 :
[REF1]SD Specifications Part 1 Physical Layer Specification Version 3.01 February 18, 2010
[REF2] SD Specifications Part E1 SDIO Simplified Specification Version 3.00 July 25, 2018
[REF3]SD Specifications Part E7 iSDIO Simplifed Specification Version 1.10 July 25, 2018
[REF4]SD Specifications Part E7 Wireless LAN Simplified Addendum Version 1.10 July 25, 2018
二 . 拓扑结构
[REF3] 1.3 章节中的如下框图,很好的介绍了 iSDIO 的拓扑结构。
Part1 是 SD 卡的协议 [REF1] 。
在 SD 卡协议基础上定义了 SDIO 的协议 PartE1[REF2] , SDIO 相对于 SD 卡,增加了第 9 类命令中的 IO_RW_DIRECT (CMD52) 和 IO_RW_EXTENDED(CMD53), 用于快速的进行 I/O 卡的字节和块访问,见 [REF2] 的第 5 章。 SDIO 同时定义了其寄存器空间 , 见 [REF2] 的 6.7 章节。
然后在 SDIO 基础之上定义了 iSDIO 的协议 [REF3] , iSDIO 可以通过 SDIO 方式即 CMD52/CMD53 操作,也可以使用 SD 卡方式 CMD48 和 CMD49 操作。同时在 SDIO 寄存器空间基础上,定义了 iSDIO 的寄存器见 [REF3] 的 2.2 章节,相对 SDIO 空间一样只是定义了更多 iSDIO 相关的寄存器。
iSDIO 是智能卡类别总的协议,在此之上定义具体的设备比如 WIFI ,蓝牙等的协议,其中 PartE7 Wireless LAN[REF4] 是 WIFI 的协议,在 iSDIO 基础上进一步定义了其相关寄存器 [REF4] 的第 3 章节,相对 iSDIO 空间一样只是定义了更多 WIFI 相关的寄存器。

三 . 命令
3.1 功能寄存器空间寻址
[REF3] 的第二章,在 [REF2] 第六章 SDIO 基础上,定义了 iSDIO 的功能寄存器空间。
可以通过 CMD52/53 或者 CMD48/49 访问这些寄存器。
寄存器地址空间按照 Function 为单位划分,每个 Function 的空间都是 128KB ,其中 Function 0 即 CIA 是必须要有的, Function 0 又划分为 CCCR , FBR1~7 , General Informationm , RFU , CIS Area , RFU 几个部分,这些部分每个设备都是一样的。除了 Function 0 还可以有 1~7 个 Function(Function Unique Register) ,这些 Function 是不同设备自定义实现的。
上一篇文章介绍了 CMD5 命令,卡会响应该命令,字段 Number of I/O functions 即代表的这些自定义的 Function 个数。
如下所示,寄存器空间采用二级索引,即先根据 Function Number 找到对应 Function ,然后使用 Register Address 找到该功能内的具体的某一个寄存器。所以在命令 CMD52 , CMD53 中需要这两个参数。且 Function Number 只需要 3 位可以表示 0~7 ,即自定义的 Function 个数是最多 7 个,其序号从 1 开始即 1~7. 访问 128KB 空间, Register Address 需要 17 位。
SDIO 规格书中寄存器空间如下

iSDIO 规格书中地址空间如下

3.1.1Function0(CIA)
iSDIO 对于 function 0 统一定义为以下部分 :CCCR,FBR1~7,CIS.
以下表格总结了,分别使用 SD 卡模式和 SDIO 模式访问,需要实现的寄存器

3.1.1.1CCCR
[REF2] 的 6.9 章节定义了 SDIO 完整的 CCCR 寄存器, iSDIO 无需实现所有的,

iSDIO 要求白色背景的是必须实现的,其他是可选实现的 , 见 [REF3] 的 2.2.1.1

3.1.1.2FBR
[REF2] 的 6.10 章节,定义了 SDIO 详细的 FBR 寄存器。

iSDIO 在此基础上增加了如下粗体字部分见 [REF3] 的 2.2.1.2

3.1.1.3CIS
[REF2] 的 6.11 定义了 SDIO 的 CIS 寄存器

iSDIO 增加了如下粗体字部分,见 [REF3] 的 2.2.1.3

3.2 CMD52
3.2.1 命令格式
IO_RW_DIRECT(CMD52) 是用于按照字节为单位访问 I/O 功能中 128K 寄存器空间,包括公共 I/O 区域( CIA )。一般用于初始化功能的寄存器和查看状态。
格式如下

32 位的命令参数划分为了 Function Number~Write Data or Stuff Bits 这几个字段。
S,D,Conmand Index,CRC7,E 这些字段和 SD 卡命令格式一样,所以不再介绍,只介绍后面参数部分。
其中 Function Number 和 Register Address 即前面介绍的功能寄存器空间寻址的两个参数。
R/W Flag: 0 表示读寄存器,读到的寄存器内容通过 R5 响应返回 ( 见后面一小节 ) ,如果设置为 1 表示写寄存器。
RAW flag: 这个 bit 设置为 1 ,则 R/W Flag=1 写寄存器时,同时立即回读写入的值返回,无需再单独进行一次读来确认写入结果。如果设置为 0 则返回写入的寄存器值 ( 不是回读出来的 ) 。
Write Data: 对于写,则填充待写的寄存器内容,读则设置为 0.
Stuff 位都写 0
3.2.2 响应
CMD52 响应 R5 ,内容如下
S, D , Command Index , Stuff , CRC7 , E 这些和 SD 卡都是一样的,不再赘述,只介绍 Respense Flasgs BIt 和 Read or Write Data 字段。

Response Flags Bit : 表示 8 位的卡状态,定义如下


Read or Write Data:
如果是读寄存器则返回的是读到的寄存器内容,
如果是写寄存器且 RAW flag=1 则是写入后,再重新读出来的寄存器值,
如果是写寄存器且 RAW flag=0 ,则返回的就是写入命令中的值 ( 不是回读值 ) 。
如果是 SPI 模式则响应为 16 位,如下

3.3 CMD53
3.3.1 命令格式
CMD52 用于单个寄存器操作, CMD53 则用户批量操作。
格式如下

同样的只关注 R/W flag , Function Number , Block Mode , OP Code , Register Address Byte/Block Count 这几个参数。
Function Number 和 Register Address 和 CMD52 一样用于寻址寄存器的位置。
R/W flag 也和 CMD52 一样, 1 表示写, 0 表示读。
Block Mode 用于表示操作模式 : 设置为 1 表示按照 block 为单位进行操作,后面 Byte/Block Count 即为一次操作的 block 数。设置为 0 表示则表示按照字节操作,后面 Byte/Block Count 即为一次操作的字节数。
Function 0 的 block 大小由 CCCR 寄存器的 FN0 设置。 Function1~7 的 block 大小由 FBR 寄存器配置。 CCCR 寄存器的 SMB 位表示卡是否支持 block 模式。
OP Code ,操作模式, 1 表示地址自动递增, 0 表示不自动递增。

Byte/Block Count 表示要操作的字节字节数或者 block 数,在 block 模式时需要注意的是,设置为 0 表示一直读写,直到设置 CCCR 寄存器的 ASx 中止。

3.3.2 响应
和 CMD52 一样,但是 8 位的 Data 填充为 0.
3.3.3 数传输格式
CMD53 的数据传输,数据不再在命令中,而是和 memory 的读写一样。
非 Block 读写和 CMD17/CMD24 类似
Block 读写则和 CMD18/CMD25 一样。如果不是 infinite 即 Count 不是 0 则无需停止直到传输完指定的块,否则需要 stop 操作进行停止。
四. iSDIO 寄存器与数据通道
前面介绍了通过 CMD52/CMD52 进行 iSDIO 的功能寄存器的操作, iSDIO 规范了功能寄存器的空间和寻址。其中 function0 是通用的, function1~7 是自定义的。不同的具体的 iSDIO 设备即实现不同的功能寄存器即可,通过这些设备特定的功能寄存器即可操作特定的设备。
此时就需要参考具体的设备的规格书了,比如 iSDIO 参考 [REF3], 然后再细分对应具体的 WIFI 设备参考 [REF4] 。
对于 Function0 所有的 SDIO 设备都是一样的,而对于 iSDIO 则通过 Function1~7 去额外定义自己的功能寄存器。
我们前面第二章拓扑结构,可以看到可以通过 CMD52/CMD53 去操作功能寄存器,但是如何和具体的设备交互数据呢,比如要通过 WIFI 收发数据,数据量是很大的,肯定不能通过这些寄存器直接进行数据传输。那么如何实现呢?通常的做法一般是通过 FIFO 进行数据传输,
这里也是类似使用了一个 Function Unique Register 的 Command Write Register
Port和Response Data Register Port来实现的,即用某个Function的某两个寄存器地址一个作为写,一个作为读入口用,读写这两个寄存器地址即类似于读写FIFO。类似于硬件FIFO,读写FIFO即读写某个固定的空间(地址固定),iSDIO也是类似的。
见 [REF3]的2.2.2章节。
要写数据则写某个 Unique Function的寄存器地址为00000h的地方即Command Write RegisterPort。
读数据则读某个 Unique Function的寄存器地址为00200h的地方即Response Data Register Port。
当然为了获取状态,能力等还定义了 Status寄存器Capability寄存器,厂商自定寄存器等,见[REF3]中的下表。

上述 Unique Function ,即 Function Unique Register1~7 中选一个,一般选 1 , 作为 iSDIO Register Map 映射。
所以对于 iSDIO 的寄存器,实际就是映射的 Function Unique Register1 功能寄存器。
换句话说 Function 0 定义了 SDIO 通用的寄存器, Function 1 定义 iSDIO 通用的寄存器。
五. 总结
以上分享了 SDIO->iSDIO->WIFI 卡的的拓扑结构, CMD52/53 命令 , 以及寄存器地址空间。以及数据通道 Command Write Register Port 和 Response Data Register Port 的原理,简单理解就是读写固定寄存器地址,类似于 FIFO 固定地址的读写。以上都是原理协议上的分享,下一篇实战分享 CMD52 和 CMD53 的读写。

浙公网安备 33010602011771号