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。
椐了解 NOR FLASH 是容量小,速度快,稳定性好,适合做程序存储器。
NAND FLASH 总容量大,适合做数据存储器是不能从NAND FLASH启动的,NAND FLASH是的读写时序是不能直接有ARM硬件产生的,要读写NAND FLASH是要通过程序来实现的,很明显能看出来的就是NAND FLASH只有8个数据、地址复用的数据地址接口。2410/2440可以直接从NAND FLASH启动的,因为它把NAND前面的4K映射到了RAM的空间
NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。
NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。
通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。而且都是在一个总线完成的。
结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash.
装载程序只能从mask rom 或者Nor flash.
三星的2410可以从NAND FLASH启动程序,它会把第一块的前4KB复制到内部SRAM中然后从SRAM执行,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到SDRAM中运行(NAND FLASH地址不是线性的,程序不能直接运行,必须拷贝到线性RAM中)
需要检测硬件启动方式,启动方式是由硬件OM0管脚决定的,软件无法检测硬件电平状态,但可以根据CPU的启动特性来检测。
如果配置为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开始执行】
如果配置为NOR FLASH启动(启动模式选择开关拔到nor端,此时OM0管脚拉高),0x00000000就是NOR FLASH实际的起始地址,NOR FLASH中的程序就从这里开始运行,不涉及到数据拷贝和地址映射。
NAND启动时,地址0x00000000为内部SRAM映射的地址;
NOR启动时,地址0x00000000为NOR FLASH的实际起始地址。向NOR FLASH中写数据需要特定的命令时序,而向内存中写数据可以直接向内存地址赋值。
对于S3C2440处理器 M[1:0]选择01 或 10时:norflash基地址为0x00000000 ,SRAM顶端地址0x40000FFF。上电后处理器直接从0x00000000处取出指令,arm处理器的SP(堆栈指针寄存器)指向0x40000FFF。
OM[1:0]选择00,S3C2440会启用内部的SRAM缓冲器会将nandflash中的前4KB大小的程序自动拷贝到BootSRAM中。BootSRAM基地址0x00000000,顶端0x00000FFF。上电后,arm处理器从0x00000000取出第一条指令,arm处理器的SP(堆栈指针寄存器)指向0x00000FFF。
如果S3C2410被配置成从Nand Flash启动(配置由硬件工程师在电路板设置), S3C2410的Nand Flash控制器有一个特殊的功能,在S3C2410上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部RAM中,并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动。这个过程不需要程序干涉。程序员需要完成的工作,是把最核心的启动程序放在Nand Flash的前4K中。
那么当程序大于 4k 的时候,当我们以 nand flash启动后,前面的4Kb 被拷贝到 片内RAM中去执行(自动完成)。我们在这前4K的程序中初始化SDRAM(SDRAM 使用前需要初始化) ,然后将剩下的程序拷贝到 SDRAM中(不是只有4kb 被拷贝到片内RAM中执行了嘛)然后跳转到 SDRAM中去执行剩下的程序。
那么也就是说 通常当程序大于 4kb的 时候,我们就需要把程序拷贝到SDRAM中去运行。(程序小于4KB 那么也就可以不用拷贝了,以nand flash方式 启动后,程序全被拷贝到 片内4kb的 RAM中去运行。)
那么,既然程序大于4kb的时候需要从nand flash中拷贝到 SDRAM中去运行。自然可以想到 烧到nand flash中的程序前面一部分代码应该 是初始化SDRAM(程序最终需要拷贝到SDRAM中去运行)和 将NAND flash中的剩余的程序拷贝到SDRAM中去(全考过去也行,方便点),然后跳转到SDRAM中执行。
由于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更换为更高密度、更大容量的,也不必改动电路板。
用NOR启动时,片内的存储控制器的BANK0-BANK7这8个BANK都对应了其他用途,所以设计者在BANK7结束的地址0x40000000的地方作为NOR FLASH的启动地址,而NAND FLASH启动的地址则是0x00000000。
因为对于启动文件.S来说,4K的空间是足够存放,代码段、BSS…和堆栈段了,因为堆栈的SP是从高地址往低地址移动的,所以要将堆栈的起始地址放在堆栈段的高地址。
你也可以不用设置成4096,但要保证堆栈的长度不能和下面其他段重叠,若重叠,就会出BUG,保险值是4096(4K,见上图),因为SRAM就是4K设计的。
大家的鼓励是我继续创作的动力,如果觉得写的不错,欢迎关注,点赞,收藏,转发,谢谢!