在U-boot下实现自动识别启动Flash的原理(针对S3C24x0)
发布时间:2020-12-15 17:36:35 所属栏目:百科 来源:网络整理
导读:转自:http://blog.chinaunix.net/uid-20543672-id-94363.html tekkamanninja.blog.chinaunix.net 在U-boot下实现自动识别启动Flash的原理(针对S3C24x0) 有网友给我一个建议,是否可以同时支持64MB的flash和128MB的flash,我想了一下觉得可行,再想一下觉
转自:http://blog.chinaunix.net/uid-20543672-id-94363.html
tekkamanninja.blog.chinaunix.net
在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的原理。
(新方案)
在使用了以前的识别方案之后,有网友觉得不好,不保险,有点碰巧的感觉。其实我也一直对这个方案不满意。但是一直没有找到更好的解决方案。今天又有朋友对我说:“ 觉得那样的做法有点像碰运气,并不是佷正规的方式。”所以我决定一定要把这个东西更好的解决掉。我又把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文件开头,全局中断向量之后的:
选这个数据作为检测位置的理由如下: (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,此法更为科学。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读