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