`
wodamazi
  • 浏览: 1416318 次
文章分类
社区版块
存档分类
最新评论

在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)

 
阅读更多
在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)

原文出自点击打开原文

有网友给我一个建议,是否可以同时支持64MB的flash和128MB的flash,我想了一下觉得可行,再想一下觉得还可以实现自动识别Nor
boot 还是 Nand boot。 所以在移植u-boot-2009.08的时候,我决定实现这两个功能。
其实实现这两个功能是只需要修改start.S文件和nand_read.c文件即可,关键在于检测手段,以下分别介绍我在u-boot-2009.08中实现的S3C2440启动识别flash的原理。


一、启动识别nand boot or Nor boot(此办法已废止,更好的方法如下)
找到识别 nand boot 和 nor boot 的方法,其实也是在自己犯的一个错误中找到的。
当我在使用nand boot的时候,想使用操作Nor flash的命令,但是一用就死机,我一开始以为是操作flash的程序错了.
但我找了半天都没有找到错误,最后终于发现:原来这是S3C2440芯片的机制的问题,在硬件上设为Nand boot的时候,作为Nor boot的那个分区没有被映射到相应的地址.
也就是说,将mini2440的启动选择开关打在Nand boot的时候,Nor flash硬件上是不可用的。但是在Nand boot启动后,你再把开关拨到Nor boot,又可以操作Nor flash了。
在将mini2440的启动开关打在nand boot的时候,读取nor flash,得到的都是0。
利用这一点,我在启动的时候,只需读取nor flash中4K(和nand boot原理有关)之后的一段数据,如果都是0,证明是Nand boot,否则为Nor boot。
4K之后多少和uboot有关,太后面了可能出现连续的0,所以我用16进制查看器看了下uboot的bin文件,确定在8K左右不可能出现连续16个字的0。
所以我在一启动的时候读取地址为0x2000处的数据,如果检测到非零数,就启动Nor boot的自拷贝程序,否则跳到Nand boot程序。
一、启动识别nand boot or Nor boot(新方案)
在使用了以前的识别方案之后,有网友觉得不好,不保险,有点碰巧的感觉。其实我也一直对这个方案不满意。但是一直没有找到更好的解决方案。今天又有朋友对我说:“觉得那样的做法有点像碰运气,并不是佷正规的方式”所以我决定一定要把这个东西更好的解决掉。我又把2440的数据手册的《第五章 存储器控制器》看了一遍,最后在Nor boot和Nand boot的启动的存储器映射上找到了出路,下面我慢慢道来:
先请大家看《第五章 存储器控制器》中的《Figure 5-1. S3C2440A Memory Map after Reset》(也就是那个映射图),从理论上来讲,对于0x40000000以后的内存,只有在Nor boot的时候才存在;而在nand
boot 的时候他被映射到了0x00000000,在
0x40000000以后不存在内存。如果我们在启动的时候,将一些特定的数据写入0x40000000~0x40001000之间,那么按照数据手册上的说法,如果回读的结果和写入的一致说明是nor boot,否则就是nand boot!
这种办法理论上是通的,但是实际上,那个图是错的!!通过我的实验,正真的映射图如下:
从上图我们可以看出,无论是Nor boot还是nand boot ,这4K的内部SRAM都被映射到了0x40000000,而在nand boot的时候,这块内存同时还被映射到了0x00000000那么一开始提出的办法就不可行了,而且在nand boot 的时候写入0x40000000~0x40001000还会破坏自身的程序。

但是通过上面的图,我想到了解决的办法:
在启动的时候,用程序
0x40000000~0x40001000中的某些位置清零,如果回读0x00000000~0x00001000中的相应位置后为零,说明是Nand boot,如果是原来的数据(一定要选非零的位置)就是Nor boot。判断完后如果是nand boot,还要恢复被改动的数据,再进入自拷贝阶段。
只要检测的位置合理,这方法是可行的。现在的关键是选什么位置的数据最好呢?经过查看源码,我选择了在start.S文件开头,全局中断向量之后的:

.balignl 16,0xdeadbeef


选这个数据作为检测位置的理由如下:
(1)他是非零数,而且数据是确定的:0xdeadbeef;
(2)他的位置是固定的:
0x0000003c0x4000003c);
(3)他在检测程序之前,不会影响程序的向下运行;
(4)他不属于程序,他是一个程序中的魔数(Magic Number),用魔数来检测也比较合理


所以我最后的检测步骤是:
在启动的时候,将0x4000003c位置开始的四个字节清零,然后读取0x0000003c位置开始的四个字节。如果回读的结果为零,说明是nand boot,否则就是Nor boot(为了保险还可以判断是否为0xdeadbeef,不是的话就说明有未知错误,死循环!)。但是最后有一点很重要:如果是Nand boot,必须要复原清零的数据。原因是:在nand boot过后,会核对内部SRAM中的4K程序,和从Nand中拷贝到SDRAM的前4K程序是否一致,如果不一致会进入死循环。

通过这次的实验,让我有更深刻的理解了24x0的启动机制。
分享到:
评论

相关推荐

    s3c2410开发板u-boot移植详细配置nandflash启动

    s3c2410开发板u-boot移植详细配置nandflash启动

    论文研究-U-BOOT从NAND Flash启动的实现 .pdf

    U-BOOT从NAND Flash启动的实现,王磊,何小刚,U-BOOT是一款功能强大的引导装载程序,但不支持从NAND flash启动。针对这一点本文提出了一种使其支持从NAND flash启动的方法。本文分析了U

    基于S3C2440的u-boot移植详解

    基于S3C2440的u-boot移植详解

    黄刚博客--友善之臂mini2440-u-boot从nand flash启动6博客全集

    黄刚-u-boot-2009.08-nand flash-mini2440本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载等 。。。。

    u-boot开源代码

    start.S是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。 ◆ disk:disk驱动的分区处理代码。 ◆ doc:文档。 ◆ drivers:通用设备驱动程序,比如各种网卡、支持CFI的...

    u-boot源码分析

    本文从以下几个方面粗浅地分析u-boot并移植到FS2410板上: ...实现了NOR Flash和NAND Flash启动,网络功能。  这些认识源于自己移植u-boot过程中查找的资料和对源码的简单阅读。下面主要以smdk2410为分析对象。

    最新u-boot:u-boot-2012.07 mini2440移植(nandflash启动)

    本人原创, 最新u-boot-2012.07 mini2440基于nandflash启动的移植, 新鲜出炉, 与旧版本不同, 本资源是基于nand_boot函数移植的, 应该说这种移植方法才是u-boot官方推荐的nandflash启动方法。 不多吹了, 见运行...

    U-Boot启动参数解析

    本文为U-Boot启动参数的解析,分别讲述了: (1) SD卡启动脚本 (2) SD卡 (3) NAND FLASH (4) SPI FLASH

    U-BOOT启动流程详解

    开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。函数调用顺序如图6.3所示。 看一下board/smsk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是cpu/arm920t/...

    不死 U-Boot

    ** 凡在 U-Boot 控制台 [系统信息] 页中看到已识别出 Flash 型号,则表明使用此 Flash 没有问题 U-Boot 适用的硬件配置、机型、及原厂固件如下: [u-boot-ar2317.bin] 硬件配置: AR2317 + 88E6060 AR2317 + AR...

    U-Boot启动流程分析与S3C2440上的移植.pdf

    U-Boot启动流程分析与S3C2440上的移植.pdf

    U-Boot详解 U-Boot详解

    U-Boot详解 U-Boot详解 U-Boot详解 U-Boot详解

    tp-link741n_v1解锁U-boot的OpenWRT固件、不死U-boot及刷入工具

    包括: 1、解锁U-boot的固件openwr-ar71xx-generic-tl-wr741nd-v1-squashfs-factory.bin,功能简单,只为方便刷入不死U-boot 2、适用wr741nd-v1的不死U-boot及其升级版breed 3、刷入工具

    u-boot在S3C2410移植

    u-boot在s3c2410开发板上移植(NAND Flash Boot)过程 1)u-boot版本1.1.3,gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9) 2)在Makefile中加入 bks2410_config : unconfig @./mkconfig $(@:_config=) arm arm...

    u-boot-2009.11

    6、自动识别S3C2440的启动方式是Nor boot还是Nand boot,调用不同的自拷贝程序,实现不论是Nor boot还是Nand boot,都可以烧写同一个bin文件。(nor flash为SST39VF1601) 7、支持烧写yaffs文件系统映象 8、添加支持...

    RISC-V U-Boot启动流程图.pdf

    RISC-V U-Boot启动流程图.pdf

    u-boot-1.1.6.tar.bz & u-boot-1.1.6_jz2440.patch

    u-boot-1.1.6.tar.bz & u-boot-1.1.6_jz2440.patch

    u-boot-u-boot-2013.01.y.zip

    当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

    从Nand Flash启动U-BOOT的基本原理

    S3C2410被配置成从NAND闪存启动,上电后,S3C...根据U-BOOT的执行流程图,可知要实现从NAND闪存中启动U-BOOT,首先需要初始化NAND闪存,并从NAND闪存中把U-BOOT搬移到RAM中,最后需要让U-BOOT支持NAND闪存的命令操作。

    u-boot.bin_tekkaman_2009.11.bz2

    u-boot.bin_tekkaman_2009.11.bz2 参考网站:Tekkaman Ninja ...已经针对mini2440 编译好的U-boot-2009.11 的bin文件在Tekkaman Ninja 的博客中有,可以直接烧入, 链接:u-boot.bin_tekkaman_2009.11.tar.bz2

Global site tag (gtag.js) - Google Analytics