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地址线和数据线分开,来了地址和控制信号,数据就出来。.net
NAND Flash地址线和数据线在一块儿,须要用程序来控制,才能出数据。设计
通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。并且都是在一个总线完成的。指针
结论是:ARM没法从NAND直接启动。除非装载完程序,才能使用NAND Flash.
装载程序只能从mask rom 或者Nor flash。blog
三星的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设计的。
你们的鼓励是我继续创做的动力,若是以为写的不错,欢迎关注,点赞,收藏,转发,谢谢!
如遇到排版错乱的问题,能够经过如下连接访问个人CSDN。
CSDN:CSDN搜索“嵌入式与Linux那些事”
欢迎欢迎关注个人公众号:嵌入式与Linux那些事,领取秋招笔试面试大礼包(华为小米等大厂面经,嵌入式知识点总结,笔试题目,简历模版等)和2000G学习资料。