1.为什么NAND FLASH不能直接运行程序
NAND FLASH本身是连接到了控制器上而不是系统总线上。CPU运行机制为:CPU启动后是要取指令执行的,如果是SROM、NOR FLASH 等之类的,CPU 通过地址线发个地址就可以取得指令并执行,NAND FLASH不行,因为NAND FLASH 是管脚复用,它有自己的一套时序,这样CPU无法取得可以执行的代码,也就不能初始化系统了。
NAND FLASH是顺序存取设备,不能够被随机访问,程序就不能够分支或跳转,这样你如何去设计程序。
U-BOOT 支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统,主要用来开发嵌入式系统初始化代码 bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化CPU、堆栈、初始化存储器系统等,其功能类似于PC机的BIOS。
2.为什么s3c2440可以从NAND FLASH启动
椐了解 NOR FLASH 是容量小,速度快,稳定性好,适合做程序存储器。
NAND FLASH 总容量大,适合做数据存储器是不能从NAND FLASH启动的,NAND FLASH是的读写时序是不能直接有ARM硬件产生的,要读写NAND FLASH是要通过程序来实现的,很明显能看出来的就是NAND FLASH只有8个数据、地址复用的数据地址接口。2410/2440可以直接从NAND FLASH启动的,因为它把NAND前面的4K映射到了RAM的空间
2.1 Flash种类
NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。
NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。
通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。而且都是在一个总线完成的。
结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash.
装载程序只能从mask rom 或者Nor flash.
三星的2410可以从NAND FLASH启动程序,它会把第一块的前4KB复制到内部SRAM中然后从SRAM执行,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到SDRAM中运行(NAND FLASH地址不是线性的,程序不能直接运行,必须拷贝到线性RAM中)
3.NAND启动和NOR启动:
需要检测硬件启动方式,启动方式是由硬件OM0管脚决定的,软件无法检测硬件电平状态,但可以根据CPU的启动特性来检测。
3.1 NAND启动:
如果配置为NAND FLASH启动(启动模式选择开关拔到nand端,此时OM0管脚拉低)S3C2440的NAND控制器会自动把NAND FLASH中的前4K代码数据搬到内部SRAM中(地址为0x40000000),同时还把这块SRAM地址映射到了0x00000000地址。CPU从0x00000000位置开始运行程序。 【从NAND FLASH启动CPU时,CPU会通过内部的硬件将NAND FLASH开始的4KB数据复制到称为“Steppingstone”的4KB的内部RAM中(起始地址为0),然后跳到地址0开始执行】
3.2 NOR启动:
如果配置为NOR FLASH启动(启动模式选择开关拔到nor端,此时OM0管脚拉高),0x00000000就是NOR FLASH实际的起始地址,NOR FLASH中的程序就从这里开始运行,不涉及到数据拷贝和地址映射。
3.3 总结:
NAND启动时,地址0x00000000为内部SRAM映射的地址;
NOR启动时,地址0x00000000为NOR FLASH的实际起始地址。向NOR FLASH中写数据需要特定的命令时序,而向内存中写数据可以直接向内存地址赋值。
4.从Nand Flash启动U-BOOT的基本原理
4.1 前4K问题
如果S3C2410被配置成从Nand Flash启动(配置由硬件工程师在电路板设置), S3C2410的Nand Flash控制器有一个特殊的功能,在S3C2410上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部RAM中,并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动。这个过程不需要程序干涉。程序员需要完成的工作,是把最核心的启动程序放在Nand Flash的前4K中。
4.2 启动程序的安排
由于Nand Flash控制器从Nand Flash中搬移到内部RAM的代码是有限的,所以在启动代码的前4K里,我们必须完成S3C2410的核心配置以及把启动代码(U-BOOT)剩余部分搬到RAM中运行。
u-boot源码不支持从nand flash启动,可是s3c2410支持从nand flash启动,开发板(sbc-2410x)加电后s3c2410将nand flash的前4k(保存有u-boot的部分功能–拷贝功能–把nand flash中的内容拷贝到SDRAM)拷贝到sram(s3c2410芯片内的sram)。这就需要修改u-boot源码,增加u-boot的功能: 使u-boot在得到执行权后能够将其自身拷贝到开发板上SDRAM中,以便处理器能够执行u-boot。
Nand Flash的命令、地址、数据都通过I/O口发送,管脚复用,这样做的好处是,可以明显减少NAND FLASH的管脚数目,将来如果设计者想将NAND FLASH更换为更高密度、更大容量的,也不必改动电路板。
5.为什么NOR启动要将sp设置为0x40000000+4096
用NOR启动时,片内的存储控制器的BANK0-BANK7这8个BANK都对应了其他用途,所以设计者在BANK7结束的地址0x40000000的地方作为NOR FLASH的启动地址,而NAND FLASH启动的地址则是0x00000000。
因为对于启动文件.S来说,4K的空间是足够存放,代码段、BSS…和堆栈段了,因为堆栈的SP是从高地址往低地址移动的,所以要将堆栈的起始地址放在堆栈段的高地址。
你也可以不用设置成4096,但要保证堆栈的长度不能和下面其他段重叠,若重叠,就会出BUG,保险值是4096(4K,见上图),因为SRAM就是4K设计的。