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 中写数据须要特定的命令时序,而向内存中写数据能够间接向内存地址赋值。
对于 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。
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 程序大于 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 中执行。
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 设计的。
大家的激励是我持续创作的能源,如果感觉写的不错,欢送关注,点赞,珍藏,转发,谢谢!
如遇到排版错乱的问题,能够通过以下链接拜访我的 CSDN。
CSDN:CSDN 搜寻“嵌入式与 Linux 那些事”
欢送欢送关注我的公众号:嵌入式与 Linux 那些事,支付秋招口试面试大礼包(华为小米等大厂面经,嵌入式知识点总结,口试题目,简历模版等)和 2000G 学习材料。