CORTEX-A8裸机系列:第十四章 SD卡启动

第十四章 SD卡启动

本章代码,查看我的github网站:https://github.com/weiqi7777/s5pv210

1、纯粹的Flash:Nandflash,NorFlash

Nandflash、NorFlash芯片只是对存储单元做了最基本的读写接口,然后要求外部的soc来提供flash读写的控制器,产生flash的读写时序来和flash进行通信。

缺陷:读写接口时序比较复杂;内部无坏块处理机制,需要soc自己来管理flash的坏块;各家厂商的flash接口不一致,造成升级比较复杂。

Nandflash分MLC和SLC两种。SLC存储可靠性高,但是容量小,价格高,一般是512M以下,以上的就比较贵了。MLC可靠性差,但是容量大,价格低。

2、SD卡、MMC卡、MicroSD、TF卡

这些卡内部其实就是Flash存储颗粒,比直接的NandFlash芯片多了统一的外部封装和接口。

卡拥有统一的标准,如SD卡,遵照SD规范来发布。规范规定了SD卡的读写速度,读写接口时序、读写命令集、卡大小尺寸、引脚个数及定义。这样做的好处就是不同厂家的SD卡可以通用。

SD卡\MMC卡等卡类有统一的接口标准,而NAND芯片没有统一的标准,各家产品会由差异。

SD和MicroSD只是体积大小的区别,其他都是一样的。TF卡是MicroSD卡的原名,TF卡重新命名为MicroSD。

SD卡有写保护,MicroSD没有写保护。

3、iNand,MoviNand,eSSD

电子产品如手机、相机等,以前是用SD卡\TF卡扩展存储容量;但是现在都直接内置大容量FLASH芯片而不是使用外部扩展卡。

外部扩展卡时间长了卡槽可能会接触不良导致不可靠。

现在主流方向是使用iNand,MoviNand,eSSD这些来做电子产品的存储芯片。这些东西的本质还是nandflash,内部由Nand的存储颗粒构成,再集成了块设备管理单元,综合了SD卡为代表的各种卡的优势和原始nandflash芯片的优势。

优势:

  • 向SD卡学习,有统一的接口标准(包括引脚定义、物理封装、接口时序)

  • 向芯片学习,以芯片的方式发布,不以卡的方式发布,可以减小PCB面积。

  • 内部内置了flash管理模块,提供诸如坏块管理等功能,让nand的管理更容易。其实就是在内部有一个mcu,这个mcu对flash进行管理,外部操作该芯片,其实就是操作内部的MCU。


4、SD卡的编程接口

4.1、SD卡的物理接口

对外有9个接口。9个接口中有2个地、1个电源、6个信号线。


针脚的定义:


4.2、SD协议与SPI协议

SD卡不能直接通过接口给地址来访问,访问需要按照一定的接口协议(时序)来访问。非总线的访问。

SD卡虽然只有一种物理接口,但是支持的通信协议有两种:SD协议和SPI协议。

4.2.1、SPI协议特点

低速、接口操作时序比较简单,适合单片机。

SPI协议是单片机中广泛使用的一种通信协议,并不是为SD卡专门发明的。

SPI协议相对SD协议来说速度比较低。

SD卡支持SPI协议,就是为了单片机方便使用。

4.2.2、SD协议特点

高速、接口时序复杂,适合有SDIO接口的Soc。

SD协议是专门用来和SD卡通信的。但是现在有些其他的芯片也在用SD协议,如wifi芯片。

SD协议要求soc中有SD控制器,运行在高速率下,要求soc的主频不能太低。

4.3、210的SD\MMC控制器(1031页)

该控制器可以工作在52M时钟下,可以实现8-bit数据访问。

框图:


SD卡内部除了存储单元FLASH外,还有SD卡管理模块,soc和SD卡通信时,通过9针引脚以SD协议\SPI协议向SD卡管理模块发送命令、时钟、数据等信息,然后从SD卡返回信息给soc来交互。工作时每一个任务(初始化SD卡,读数据,写数据,擦除等等)都需要一定的时序来完成(所谓时序就是先向SD卡发送XXX命令,SD卡回xx消息,然后再向SD卡发送xxx命令)。

5、210的SD卡启动

5.1、soc为何要支持SD卡启动

soc支持的启动方式越多,将来使用时就越方便,用户可选择性就越大,soc的适用面就越广。

SD卡启动好处:可以不借用专用的烧录工具(如jlink)情况下对SD卡进行刷机,然后刷机后的SD卡插入卡槽,soc即可启动。可以用SD卡启动进行量产刷机。

如210开发板,板子上的iNand是空的,此时无法启动,这时候官方会把事先做好的量产卡插入SD卡槽,开发板是用iNand启动。因为此时iNand是空的,所以第一启动失败,会转而第二启动,就从外部SD2通道的SD卡启动,启动后执行刷机对iNand进行刷机,刷机完成后自动重启。这时候重启,因为iNand中已经有程序了,所以可以从iNand中启动。

5.2、SD卡启动的难点

SRAM、DDR都是总线式访问的,SRAM不需要初始化即可直接使用而DDR需要初始化后才能使用,但是总之CPU可以直接和SRAM\DRAM打交道;而SD卡需要时序访问,CPU不能直接和SD卡打交道。

NorFlash读取时可以总线式访问,所以NorFlash启动非常简单,可以直接启动,但是SD\nandflash不行。

以前只有NorFlash可以作为启动介质。后面三星在2440中使用了stepping stone技术,让nandflash也可以作为启动介质。

Stepping stone技术就是在soc内部而内置4KB的SRAM,然后开机时soc根据OMpin判断用户设置的启动方式,如果是NandFlash启动,则soc的启动部分的硬件直接从外部NandFlash中读取开头的4KB到内部SRAM中作为启动代码。

Stepping stone技术进一步发展,在6410芯片中得到完善,在210芯片时已经成熟。210中有96K的IRAM,并且有一段iROM作为BL0,BL0再去启动BL1。

5.3、210的启动过程回顾

210首先执行内部的iROM(也就是BL0),BL0会判断Ompin来决定从哪个设备启动,如果启动设备是SD卡,则BL0会从SD卡读取前16KB到SRAM中区启动执行(这部分就是BL1,这就是steppingstone技术)

BL1执行之后剩下的就是软件的事情了,soc就不用去操心了。

5.4、SD卡启动流程

分为bin文件小于16KB和大于16KB两种情况:

第一种情况:bin镜像文件小于16KB,这时候相当于整个镜像文件作为BL1被steppingstone直接硬件加载执行。

第二种情况:bin镜像文件大于16KB。这时候就要把整个镜像分为2部分:第一部分16KB大小,第二部分是剩下的大小。然后第一部分作为BL1启动,负责去初始化DRAM并且将第二部分加载到DRAM中去执行。

5.5、IROM是怎样读取SD卡\NandFlash?

三星在iROM中内置了部分代码去初始化了SD卡\NandFlash,并且内置了读取各种SD卡\NandFlash的代码在iROM中,BL0执行时就是通过调用这些device copy函数来读取外部SD卡\NandFlash中的BL1。

5.6、Soc支持SD卡启动的秘密(iROM代码)

三星soc支持SD卡\NandFlash启动,主要是依靠stepping stone技术。具体在210中支持stepping stone技术的是内部的iROM代码。

6、启动文档中描述的MMC设备使用

要使用MMC设备,要设置三个全局变量。

globalBlockSize:MMC设置的块数目

flobalSDHCInfoBit: MMC卡的参数设置

V210_SDMMC_BASE: MMC卡的操作通道,硬件会检测OMpin的值设置这个值,从而让程序判断操作哪一个通道的MMC卡,210总共有4个通道的SD\MMC,0和2通道可以作为启动。


内置的拷贝函数

对于SD\MMC,使用CopySDMMCtoMem函数,地址是在0xd0037f95。这是一个函数指针。


使用方法:    


第一个参数:通道号,可以是0-3。但是在210中,只使用了通道0和通道2,所以这里值为0或者2。

第二个参数:块地址,起始块地址

第三个参数:块大小,复制数据的块的个数

第四个参数:内存地址,复制数据的目的地址

第五个参数:决定卡的initial,一般给0。

返回值:bool类型,成功或者失败。

6.1、扇区和块

早期的存储设备的存储单元不是以字节为单位,而是以扇区为单位。也就是读写的最小单元就是扇区,不能只读取或写扇区中的部分区域。

一个扇区有好多个字节,一般是512字节,但是也有其他的,比如1024字节,2048字节,4096字节。但是因为最早是512字节,很多的软件(如操作系统和文件系统)已经默认了512这个数字,因此后来的硬件虽然物理上可能支持更大的扇区,但是实际上一般还是兼容512字节扇区这种操作方法。

一个扇区可以看成是一个块block(块的概念就是:不是一个字节,是多个字节组成一个共同的操作单元块),所以就把这一类的设备称为块设备。

Linux里有个mtd驱动,就是用来管理块设备的。

FLASH以块为单位来读写,就决定了启动时device copy函数只能以整块为单位来读取SD卡。

SD卡的扇区和块大小是一样的,512字节。

6.2、用函数指针方式调用device copy函数

第一种方法:宏定义方式来调用。好处是简单方便,坏处是编译器不能帮我们做参数的静态类型检查。

第二种方法:使用函数指针调用。


6.3、三星推荐的SD卡分布。

三星,对于SD卡的程序分布,有推荐的方案,我们最好按照三星规定的程序分布,将程序分布到SD卡中。

N,M自己分配。BL1被放在SD卡的第1块。


BL1要完成:关看门狗、设置栈、开icache,初始化DDR,从SD卡复制BL2到DDR中特定位置,跳转执行BL2.

BL1在SD卡中必须以Block1开始(block0不能用),长度定为16KB(也就是32个block);BL1理论上可以从33扇区开始,但是实际上为了安全都会留一些空扇区作为隔离,比如可以从45扇区开始。

代码:


注意从SD卡复制数据到ram中的第二个参数是块地址,如45块,就是45,不是45*512。

此条目发表在CORTEX-A8分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。