在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 (新方案)
    在使用了以前的识别方案之后,有网友觉得不好,不保险,有点碰巧的感觉。其实我也一直对这个方案不满意。但是一直没有找到更好的解决方案。今天又有朋友对我说: 觉得那样的做法有点像碰运气,并不是佷正规的方式 所以我决定一定要把这个东西更好的解决掉。我又把 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 的时候写入0x400000000x40001000还会破坏自身的程序。

但是通过上面的图,我想到了解决的办法:
在启动的时候,用程序将0x400000000x40001000中的某些位置清零,如果回读0x000000000x00001000中的相应位置后为零,说明是Nand boot,如果是原来的数据(一定要选非零的位置)就是Nor boot。判断完后如果是nand boot,还要恢复被改动的数据,再进入自拷贝阶段。
   只要检测的位置合理,这方法是可行的。现在的关键是选什么位置的数据最好呢?经过查看源码,我选择了在start.S文件开头,全局中断向量之后的:
. balignl 16 , 0xdeadbeef
选这个数据作为检测位置的理由如下:
1 )他是非零数,而且数据是确定的: 0xdeadbeef
2 )他的位置是固定的: 0x0000003c 0x4000003c );
3 )他在检测程序之前,不会影响程序的向下运行;
4 )他不属于程序,他是一个程序中的魔数( Magic Number ),用魔数来检测也比较合理

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

通过这次的实验,让我有更深刻的理解了24x0的启动机制。
 
二、启动识别 nand flash
    实现识别 nand flash 的识别其实非常简单。 就是在执行 Nand boot 程序的时候, 读取 NFCONF 寄存器的 0 3bit 的数据,以检查硬件上 Nand flash 的配置,然后根据配置跳转到相应的自拷贝程序。
具体的实现请看 u-boot-2009.08 for mini2440 patch release S3C2440 的数据手册。
之前的方法已停用,使用 buserror 的代码后,改为读取芯片 ID 来检测 Nand Flash ,此法更为科学。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值