一 Nand flash概述:
看过一些关于Nand Flash的材料,有的说得太细,细到每个寄存器的每个位,不容易整体把握;有的讲述的太粗泛,忽略细节,所以在这里想整理一下,以背后用并愿意跟各位同仁分享,水平有限,有错误之处还请见谅并提出。
在arm产品的开发中,SRAM (Static RAM,静态随机存储器) - 此类静态RAM的运行速度非常快,也非常昂贵,其体积相对来说也比较大。今天我们常说的CPU内的一级、二级缓存就是使用了此SRAM。但是这种SRAM比较昂贵,因此在CPU内只能使用少量的SRAM,以降低处理器的生产成本;不过由于SRAM的特点---高速 度,因此对提高系统性能非常有帮助。
SDRAM和Nand flash存储器比SRAM存储器要经济,这样就促使了用户使用在Nand flash上执行启动代码,在SDRAM上执行主程序。
Nand-flash内存是flash内存的-种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有大容量改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。
NAND型闪存以块为单位进行擦除操作。闪存的写入操作必须在空白区域进行,如果目标区域已经有数据,必须先擦除后写入,因此擦除操作是闪存的基本操作。
S3c2440的驱动代码可以在Nand flash存储器上被执行。为了支持Nand flash的boot loader,S3c2440上面配备了一个容量只有4KB内部的SRAM缓冲器,就是steppingstone。启动时nand flash上的前4KB字节的数据被加载到stepingstone上。
二 Nand Flash的特性:
(1)自动启动:启动代码在重启时被传输到4KB的Steppingstone上,传输后代码会在steppingstone上被执行。
(2)Nand Flash存储器接口:支持256字,512字,1KB字和2KB字的页
(3)软件模式:用户可以直接访问它
(4)接口:8或16位的Nand Flash存储器可口总行
(5)硬件ECC生成,检测和指示软件错误
(6)SFR接口:支持小端模式,对数据和ECC数据寄存器的字节,半字和字访问
(7)steppingstone接口:支持大小端,字节,半字和字访问
(8)steppingstone 4KB内部SRAM缓冲器可以在Nand Flash启动后用于其它目的
三 Nand Flash的模块图:
图解:系统总线:用来在CPU和Nand Flash之间传输数据。
AHB系统总线,主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线,它包括以下一些特性:单个时钟边沿操作;非三态的实现方式;支持突发传输;支持分段传输;支持多个主控制器;可配置32位~128位总线宽度;支持字节、半字节和字的传输。
其它部分上面以介绍,在此不再赘述。
四 boodloader功能图:
在启动期间,Nand Flash控制器通过引脚状态得到连接Nand Flash的信息,在上电或重启以后,Nand Flash控制器自动加载4KB的bootloader代码(注意:这里的4KB代码,不是bootloader的全部),在加载后自动执行。在自动重启期间,ECC没有检查,因为Nand Flash的前4KB数据一般认为没有位错误。
五 这里介绍几个重要的引脚配置:
OM[1:0] = 00:使能Nand Flash存储器启动
NCON:Nand Flash存储器选择,0:普通Nand Flash(256字/512字节页大小,3~4地址周期) 1:先进Nand Flash(1KB字/2KB字节页大小,4~5地址周期)
GPG13:Nand Flash存储器页容量
0:页=256B或1KB
1:页=512B或2KB
GPG15:Nand Flash存储器地址周期选择
0:3~4个地址周期
1:4~5个地址周期
GPG15:Nand Flash存储器总线宽带选择
0:8位总线宽带
1:16位总线宽度
至于,各个寄存器的详细内容查看芯片手册。
六 Nand Flash在S3c2440中的启动流程:
(1)S3c2440支持从Nand Flash启动,在系统上电时,Steppingstone(寄存器组,一块不用初始化的SRAM)通过Nand Flash控制器将Nand Flash上的前4KB的启动代码自动加载到自己的4KB的空间里。
(2)然后,Nand Flash控制器把该段代码映射到物理内存的起始位置,即内存的0x00000000地址,映射完毕之后,就自动启动该段代码,这个过程不需程序干扰。
注意:到这里的所有操作(Stage1)是通过硬件完成的,不需要软件的支持,程序员只需要把最核心的启动程序放在Nand Flash的前4KB中就好。
(3)要知道,上面两个步骤中涉及到启动代码只是bootloader的一部分,是启动代码,它的主要功能是完成由硬件启动到操作系统启动的过度,为运行操作系统提供基本的运行环境,如初始化cpc,堆栈,初始化存储器系统等,其功能类似于pc机的BIOS。Steppingstons总的启动代码在完成基本的初始化以后,就开始调用拷贝函数将bootloader的其他代码拷贝到内部存储器的SDRAM中运行。
(4)bootloader的功能主要有两个,一个是启动系统,二是加载内核。第三步运行的bootloader代码主要完成第二个功能----加载内核,在内核被成功加载到内部的SDRAM中后就将cpu的控制权移交给内核,bootloader代码的最后一句就是调用内核函数。
(5)内核得到控制权后,首先执行内核环境的初始化函数,并且加载文件系统等操作,到这里Nand Flash的启动过程就基本结束了。
七 Nand Flash启动的误区
初学者都会认为:bootloader镜像,内核镜像和文件系统镜像都是烧写在Nand Flash上的(当然bootloader镜像在Nor Flash也有烧写),那么Nand Flash的启动应该是在自己的空间里运行的。由上面的讲述,相信聪明的你一定知道根本不是这样的,那么为什么不能够在Nand Flash上直接运行程序呢?大概可以总结如下:
首先,Nand Flash本事是连接到控制器上而不是系统总线上的,CPU启动后的取指令操作,而取指令的对象都是像SROM,NOR Flash之类的存储器,但在Nand Flash上不行,因为Nand Flash是管脚复用的,它有自己的一套时序机制,这样CPU无法取得可以执行的代码,也就不能初始化系统了。比如:str r0, [r1],该汇编指令包含了目的地址和源寄存器,按照CPU的时序将寄存器中的数据保存的内存中。如果想把数据存储到Nand Flash上,必须按照Nand Flash的读写时序进行,即先写NFCONF(Nand Flash的配置寄存器),然后写NFCMD(命令寄存器),NFADDR(地址寄存器),最后写NFDATA(数据寄存器)。
其次,Nand Flash是顺序存取设备,不能够背随即访问,读写访问以页尾单位,程序就不能够分支和跳转,这样你无法涉及程序。