S3C2440和S5PV210是很多 嵌入式爱好者入门的arm处理器,网上的资料也很多。今天我们就来聊聊S3C2440和S5PV210的启动流程,上一篇博客我介绍了uboot在norflah上的启动流程(重要!这是基础)。今天,我们来聊聊uboot在nandflash上的启动流程。

一. nandflash 与 norflash

同样,你现在肯定心里有疑问 何为norflash?何为nandflash? 他们之间有什么异同?

norflash我上篇博客已经介绍了(再重复一下吧)

1.norflash

norflash:norfalsh是非易失存储器(失去电源供电后norflash里存储的数据依然存在),NORflash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地读取其内部的每一个字节(注意是读取!对于flash不是随意可以写入,一般写入NOR flash流程是:解保护->擦除->写入数据。由于flash特性只能从1翻转到0,无法从0翻转到1。擦除过程就是将flash中的某一个扇区全写0xFFFFFFF,再写入数据),代码指令可以直接在norflash上运行。(重要! 上电后可以读取norfalsh中的数据 写操作无法直接进行 前面我已经说得很清楚了)

多啰嗦几句,对于norflash来说,arm处理器上电后就可以直接读取里面的数据(NORflash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地读取其内部的每一个字节),但是!注意但是!!不能直接写入数据!!!你可以把他看作一个只能<直接>读取的SRAM(只读SRAM)。

2.nandflash

nandflash:其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储。然而NANDFlash的I/O接口并没有随机存取外部地  址总线,它必须以区块性的方式进行读取。

现在总结一下:norflash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地<读取>其内部的每一个字节。

nandflash的I/O接口并没有随机存取外部地址总线,无法向SRAM随机访问地址上的数据。

(了解启动流程,有以上的概念就足够了!具体怎么去取nandflash中的数据,下一篇博客我单独讲解)

二. S3C2440 处理器启动流程

本人英语也不太好,六级没过,说多了都是泪。想看芯片中文数据手册的朋友可以百度

<S3C2440全套中文手册(1-27章).PDF>,翻译得挺不错! 赞一个!!

(比S3C6410中文数据手册翻译得好太多,S3C6410中文数据根本就没法看)

我从三星S3C2440处理器的数据手册中摘出了芯片的存储器映射表,如下图所示:

从图中可以看出OM[1:0]在选择不同值时,地址映射关系是不同的。

当OM[1:0]选择01 或 10时,在SROM(nGCS0)外接的一定是norflash。处理器上电后从0x00000000处取出第一条指令,将ARM处理器的SP(堆栈指针寄存器设置到0x40000FFF处)。在norflash和BootSRAM搭建的程序运行环境中完成时钟和DDR等初始化。

(启动流程和我前一篇介绍的启动流程是一样的)

当OM[1:0]选择00,S3C2440内置的SRAM缓冲器会将nandflash中的前4KB大小的程序自动拷贝到BootSRAM中。之后,处理器从0x00000000处开始执行程序。

(数据手册上就是这么写的! 但是!!)

现在问题又来了:

      1. S3C2440内置的SRAM缓冲器到底是什么?

      2.为什么一定要有内置的SRAM缓冲器才能从nandflash中启动程序?

每次用开发板的时候,人家就告诉你把拨码开关拨到01或10状态从norflash启动,把拨码开关拨到00状态从     nandflash启动。(但是你想过这上面的问题吗?)

1.S3C2440内置的SRAM缓冲器到底是什么?

S3C2440内置的SRAM缓冲器方框图 如下图所示:                                                                                                        

S3C2440A 引导代码可以在外部 NAND Flash 存储器上执行。 为了支持 NAND Flash 的 BootLoader, S3C2440A配备了一个内置的 SRAM 缓冲器,叫做“Steppingstone” 。引导启动时,NAND Flash 存储器的开始 4K 字节将被加载到 Steppingstone 中并且执行加载到 Steppingstone 的引导代码。

通常引导代码会复制 NAND Flash 的内容到 SDRAM 中。通过使用硬件 ECC,有效地检查 NAND Flash 数据。在复制完成的基础上,将在 SDRAM 中执行主程序。                                                                                                                                                                                                                                                                                             

当复位时,NAND Flash 控制器将通过引脚状态(NCON(先进闪存), GPG13(页大小),GPG14(地址周期),GPG15(总线宽度)—请参考引脚配置)来获取连接的 NAND Flash 的信息,在发生掉电或系统复位后,NAND Flash控制器自动加载 4K 字节的 BootLoader 代码。在加载完 BootLoader 代码后,Steppingstone 中的 BootLoader 代码已经执行了。

(当自动引导启动期间,ECC 不会去检测,所以,NAND Flash 的开始 4KB 不应当包含位相关的错误。)

看完上面一大段我摘取自数据手册的资料(maybe  你可能依然思路不是很清晰)

我来总结一下:对于norflash带有sram的接口,上电后处理器可以从0x00000000处读取出需要执行的指令。但是,换成nandflash处理器上电后无法直接读取里面的指令(nandflash根本没有在处理器地址空间上映射的地址,只能通过nandflash控制器去读取)。S3C2440的解决方案就是:内置一个SRAM 缓冲器(Steppingstone),上电后SRAM缓冲器自动去将nandflash中的前4KB大小的数据给拷贝到芯片内置的BootSram中(注意!! 芯片设计时,内部硬件实现,与我后面提到的bootrom无关)。之后,处理器从BootSram中取出指令。

2. 为什么一定要有内置的SRAM缓冲器才能从nandflash中启动程序?

所以,当OM[1:0]选择00,S3C2440会启用内部的SRAM缓冲器会将nandflash中的前4KB大小的程序自动拷贝到BootSRAM中。之后,处理器从0x00000000(BootSRAM的起始地址)处开始执行程序。

当OM[1:0]选择01 或 10时,在SROM(nGCS0)外接的一定是norflash。处理器上电后从0x00000000处取出第一条指令(norflash 可以直接读取里面的数据 也就不需要使用SRAM缓冲器)  。

这里我想多说几句!

对于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。

最终,都是需要将uboot的镜像给搬运到SDRAM的顶端去运行。对于norflash直接就可以读取,搬运

过程就类似:

[cpp] view plain copy print ?
  1. <strong>    int i;
  2. volatile char * norflash_base_addr = 0x000000000;
  3. volatile char * ddr_base_addr = 0x300000000;
  4. for (i = 0 ; i < length ; i++)
  5. {
  6. *(ddr_base_addr + i) = *(norflash_base_addr + i);
  7. }</strong>
     int i;volatile char * norflash_base_addr = 0x000000000;volatile char * ddr_base_addr = 0x300000000;for (i = 0 ; i < length ; i++){*(ddr_base_addr + i) = *(norflash_base_addr + i);} 

uboot里面搬运过程就如上面所写,只不过它是用汇编写的。

但是,对于nandflash这样做可以吗?

绝对是不可以的(nandflash根本就没有地址总线与arm相连,arm处理器上压根就没有地址可以去访问,只能通过nandflash控制器去访问),所以对于从nandflash启动,在做uboot移植时,需要去编写nandflash读取的函数。控制nandflash控制器去将nandflash中的uboot镜像给搬运到ddr中。一上电SRAM缓冲器自动将nandflash中4KB大小的数据搬运到BootSRAM中(硬件完成)。之后,当需要将uboot镜像从nandflash搬运到ddr中,只能你自己在移植时用代码实现(代码完成)。(理清楚思路,两次搬运的原因以及实现方式)

你是否明白了呢?  就如同我之前说过的,了解处理器的启动流程和处理器的架构无关,主要是了解各种存储器的特性以及详细阅读芯片数据手册。

(重要!  启动代码  比如设置arm处理器异常向量表  关闭看门狗  关闭开启I/D  cache 等  这个才是与处理器架构密切相关   后面的博客我会一段一段的分析)

norflash/nandflash 启动分析相关推荐

  1. norflash/nandflash 启动分析 转

    S3C2440和S5PV210是很多 嵌入式爱好者入门的arm处理器,网上的资料也很多.今天我们就来聊聊S3C2440和S5PV210的启动流程,上一篇博客我介绍了uboot在norflah上的启动流 ...

  2. (三) u-boot 启动分析_第一阶段

    参考内容点此跳转 本文重点在于分析 uboot 启动流程以及 uboot 自身的细节,比如栈空间的划分.如何设置 tag .如何添加一个自定义命令等.但是不涉及基本的硬件驱动的分析,比如内存初始化.时 ...

  3. nandflash 启动

    S3C2440和S5PV210是很多 嵌入式爱好者入门的arm处理器,网上的资料也很多.今天我们就来聊聊S3C2440和S5PV210的启动流程,上一篇博客我介绍了uboot在norflah上的启动流 ...

  4. 关于SRAM,DRAM,SDRAM,以及NORFLASH,NANDFLASH

    韦东山的视频里面说S3C2440有4KB的内存,这个其实是不正确的,这4KB的RAM严格说不应该叫内存,严格来说芯片外面的64MB的SDRAM才能叫做内存,里面的那4KB只是当nandflash启动的 ...

  5. AM335x Beaglebone black 蚂蚁矿机L3+控制板 u-Boot 启动分析

    AM335x 可以通过控制上电是sysboot 引脚的电平选择启动顺序,官方的beaglebone black 电路如下: 矿板的SYSBOOT[4:0] = 10011,默认启动顺序如下: 默认是从 ...

  6. 20150311 NandFlash驱动分析

    20150311 NandFlash驱动分析 2015-03-11 李海沿 一.结构体详解 MTD体系结构: 在linux中提供了MTD(Memory Technology Device,内存技术设备 ...

  7. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )

    文章目录 一. Launcher 应用 startActivitySafely 方法分析 二. Launcher 中的 startActivity(View v, Intent intent, Obj ...

  8. springboot 启动分析【难点】——如何自动扫描 @SpringBootApplication||如何加载自动配置类 @EnableAutoConfiguration||如何加载前端控制器

    springboot 启动分析[难点] 自动扫描的特点 默认扫描与 启动类 同级的所有包及其子包都可以自动扫描 如果不可要使用@ComponentScan(basePackage={"&qu ...

  9. 全志h3linux移植教程,全志H3启动分析,移植主线UBOOT

    全志H3启动分析,移植主线UBOOT 参考资源 启动流程 因为使用的是外扩SD卡,因此主要参考了这部分内容:Bootable SD card SD卡Layout如下: start sector siz ...

最新文章

  1. 在红帽中安装oracle,在红帽企业Linux 5.4中安装Oracle Database 10g
  2. Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解
  3. extjs中元数据_Extjs中Store小总结
  4. javafx 和swing_集成JavaFX和Swing
  5. JVM——详解类加载过程
  6. 查找-------(HashCode)哈希表的原理
  7. Python 2.x 即将终止支持,是时候和 Python 2 讲再见了
  8. dns文件传输服务器,MOOC云计算 - DNS三部曲之DNS区域传输限制
  9. python计算bmi指数_python 练习题:计算的BMI指数,并根据BMI指数条件选择
  10. html设置字体仿宋GB2312,怎么设置仿宋gb2312字体,仿宋gb2312字体设置教程
  11. plupload上传文件 php,jQuery Plupload上传插件的使用方法详解
  12. uniapp—配置自定义基座
  13. CDR 制作“决战高考”海报
  14. 绿云签约服务的酒店数量超越2万家,同比增长超过15%
  15. WLC-WLC升级(以2504为例)
  16. CSS calc无效
  17. MySQL提示Can‘t connect to MySQL server on localhost (10061)解决方法
  18. 基于 Self-hosted Debug 的调试
  19. 国产操作系统UOS安装教程
  20. Django搭建简单网站

热门文章

  1. 点击事件返回上一页面
  2. Java读取word模板,并动态生成word
  3. 中兴笔试题目总结(一)C++部分
  4. Mysql引擎之MyISAM引擎
  5. html表单验证spry,Spry验证表单教案
  6. 可恶的RunDll广告怎么关闭
  7. 网传外企巨头Oracle北京裁员900多人,良心赔偿N+6
  8. 阿里云域名购买流程和备案流程
  9. 【ELK】02、ElasticSearch基础
  10. Volume Compute In SIMT Hardware Architecture