一、iNand介绍
1、iNand/eMMC/SD Card/MMC Card 的关联
(1) 最早出现的是 MMC 卡,卡片式结构,按照 MMC 协议设计。(相较于 NandFlash 芯片来说,MMC 卡有 2 个优势:第一是卡片化,便于拆装;第二是统一了协议接口,兼容性好。)
(2) 后来出现 SD 卡,兼容 MMC 协议。SD 卡较 MMC 有一些改进,譬如写保护、速率、容量等。
(3) SD 卡遵守 SD 协议,有多个版本。多个版本之间向前兼容。
(4) iNand/eMMC 在 SD 卡的基础上发展起来,较 SD 卡的区别就是将 SD 卡芯片化了(解决卡的接触不良问题,便于设备迷你化)。
(5) iNand 和 eMMC 的关联:eMMC 是协议,iNand 是 Sandisk 公司符合 eMMC 协议的一种芯片系列名称。
2、iNand/eMMC 的结构框图及其与 NandFlash 的区别
(1) iNand 内部也是由存储系统和接口电路构成(和 Nand 结构特性类似,不同之处在于接口电路功能不同)。
(2) iNand 的接口电路挺复杂,功能很健全。譬如:
第一,提供 eMMC 接口协议,和 SoC 的 eMMC 接口控制器通信对接。
第二,提供块 block 的 ECC 校验相关的逻辑,也就是说,iNand 本身自己完成存储系统的 ECC 功能,SoC 使用 iNand 时,自己不用写代码来进行 ECC 相关操作,大大简化了 SoC 的编程难度。( NandFlash 分2种:SLC 和 MLC,SLC 更稳定,但是容量小价格高;MLC 容易出错,但是容量大价格低)
第三,iNand 芯片内部使用 MLC Nand 颗粒,所以性价比很高。
第四,iNand 接口电路还提供了 cache 机制,所以 inand 的操作速度很快。
3、iNand/eMMC 的物理接口和 SD 卡物理接口的对比
(1) S5PV210 芯片本身支持 4 通道的 SD/MMC,在 X210 中实际是在 SD/MMC0 通道接了 iNand 芯片,而 SD/MMC2 接了 SD 卡(SD/MMC3 也接了 SD 卡)。
(2) 对比 inand 和 SD 卡接线,发现:这两个接线几乎是一样的,唯一的区别就是 SD 卡 IO 线有 4 根,而 iNand 的 IO 线有 8 根。
(3) 这个告诉我们,我们在实际操作 iNand 芯片时和操作 SD 卡时几乎是一样的(物理接线几乎一样,软件操作协议几乎一样)。
4、结论:iNand/eMMC 其实就是芯片化的 SD/MMC 卡,软件操作和 SD 卡相同。
分析 iNand 芯片的操作代码时,其实就是以前的 SD 卡的操作代码。一些细节的区别就是为了区分各种不同版本的 SD 卡、iNand 的细节差异。
二、SD卡/iNand 操作
1、硬件接口:DATA、CLK、CMD
(1) iNand 的 IO 线有 8 根,支持 1、4、8 线并行传输模式;SD 卡 IO 线有 4 根,支持 1、4 线并行传输模式。
(2) CMD 线用来传输命令、CLK 线用来传输时钟信号。
(3) 接口有 CLK 线,工作时,主机 SoC 通过 CLK 线传输时钟信号给 SD卡/iNand 芯片,说明:SD/iNand 是同步的,SD/iNand 的工作速率是由主机给它的 CLK 频率决定的。
2、命令响应的操作模式
(1) SD 协议事先定义了很多标准命令(CMD0、CMD1·····),每个命令都有它的作用和使用条件和对应的响应。SD 卡工作的时候,就是一个一个的命令周期组合起来的,在一个命令周期中,主机先发送 CMD 给 SD 卡,然后 SD 卡解析这个命令并且执行这个命令,然后 SD 卡根据结果回发给主机 SoC 一个响应。(有些命令是不需要响应的,这时 SD 卡不会给主机回发响应,主机也不用等待响应)。标准的 “命令+响应” 的周期中,主机发完一个命令后,应该等待 SD 卡的响应,而不是接着发下一条命令。
3、SD/iNand 的体系结构图
(1) SD 卡内部有一个接口控制器,这个控制器类似于一个单片机,这个单片机的程序功能就是,通过 CMD 线接收外部主机 SoC 发给 SD 卡的命令码,然后执行这个命令并且回发响应给主机 SoC。这个单片机处理命令及回发响应遵循的就是 SD 协议。这个单片机同时可以控制 SD 卡内部的存储单元,可以读写存储单元。
4、SD/iNand 的寄存器(重点是 RCA 寄存器)
(1) 注意这里说的是 SD 卡内部的寄存器,而不是主机 SoC 的 SD 控制器的寄存器。(很多外置芯片内部都是有寄存器的,这些寄存器可以按照一定的规则访问,访问这些寄存器可以得知芯片的一些信息)。
(2) RCA(relative address,相对地址寄存器)。我们在访问 SD 卡时,实际上 SD 卡内部每个存储单元的地址没有绝对数字,都是使用相对地址。相对地址由 SD 卡自己决定的,存放在 RCA 寄存器中。
5、SoC 的 SD/MMC/iNand 控制器简介
(1) 不同的 SoC 可能在 SD/MMC/iNand 等支持方面有差异,但是如果支持都是通过内部提供 SD 控制器来支持的。
(2) S5PV210 的 SD 卡控制器在 Section8.7 部分。
三、SD/iNand 代码实战分析1
1、命令码 CMD 和 ACMD
(1) SD 卡工作在 “命令+响应” 的模式下。
(2) SD 协议的命令分 2 种:CMDx 和 ACMDx。 CMD 是单命令的命令,就是单独发一个 CMD 即可表示一个意思。ACMD 是一种扩展,就是发 2 个 CMD 加起来表示一个命令。可以认为 ACMDx = CMDy + CMDz(y一般是55)。
2、卡类型识别 SD or MMC?
(1) MMC 协议、SD 协议、eMMC 协议本身是一脉相承的,所以造成了一定的兼容性;所以当我们 SoC 控制器工作时,连接到 SoC 上的可能是一个 MMC 卡、也可能是 SD 卡、也可能是 iNand 芯片。主机 SoC 需要去识别这个卡到底是什么版本的卡。
(2) SoC 如何区分卡种类?因为不同版本的卡内部协议是不同的,所以对卡识别命令的响应也是不同的。SoC 通过发送一些命令、听取响应,就可以根据不同的响应判定卡的版本。
3、卡状态
(1) SD 卡内部的接口控制器类似于一个单片机,这个单片机其实是一个状态机。所以 SD 卡任何时候都属于某一种状态(空闲状态、准备好状态、读写状态、出错状态 ···· 都是事先定义好的),在这种状态下能够接受的命令是一定的,接受到命令之后执行一定的操作,然后根据操作结果会跳转为其他状态。如果主机发过来的命令和当前状态不符,状态机就不响应,如果收到命令和当前状态相符,就会执行相应操作,执行完之后根据结果跳转为其他状态。
4、卡回复类型
(1) 一般来说,SD 卡的命令都属于:“命令+响应” 的模式。也有极少数的 SD 卡命令是不需要回复的。
(2) 卡回复有 R1、R7、R1B 等 8 种类型,每种卡回复类型都有自己的解析规则。然后卡在特定状态下响应特定命令时,有可能回复哪种响应都是 SD 协议事先规定好的,详细细节要查阅协议文档。
四、SD/iNand 代码实战分析2
1、linux 内核风格的寄存器定义
(1) 定义一个基地址,然后定义要访问的寄存器和基地址之间的偏移量,在最终访问寄存器时,地址就等于基地址+偏移量。
(2) 给大家提供的代码中宏定义是不完整的,很多宏定义只能从字面意思来理解对应,无法通过语法完全获得。这样写代码的好处是可以见名知意,就算代码不全都能读。
2、SD/iNand 的时钟设置
(1) SD 卡本身工作需要时钟,但是自己又没有时钟发生单元,依靠主机 SoC 的控制器通过 SD 接口中的 CLK 线传一个时钟过来给 SD 卡内部使用。所以主机 SD 卡控制器先初始化好自己的时钟,然后将自己的时钟传给 SD 卡。
(2) 因为此时刚开始和 SD 卡通信,主机不清楚 SD 卡属于哪个版本(高版本和低版本的 SD 卡的读写速率不同,高版本的可以工作在低版本的速率下,低版本的 SD 卡不能工作在高版本速率下),所以先给 SD 卡发 400KHz 的低速率时钟,SD 卡拿到这个时钟后就能工作了。然后在后面和 SD 卡进行进一步通信时去识别 SD 卡的版本号,识别后再根据 SD 卡的版本进一步给它更合适的时钟。
源自朱有鹏老师.
参考链接