WINCE6.0同一项目有256和512MB的RAM设备,eboot如何判断是256还是512的

时间:2022-02-01 08:01:05
平台:WINCE6.0+I.MX515,有RAM为256MB和512MB的设备(同一个项目,内存大小不一样而已)

问题:
如果不小心把512的系统烧录到256MB的设备上,发现无法正常启动。

要实现的功能:
在eboot实现这样的功能,就是在升级之前先判断当前设备是256还是512,如何能够做到这点,麻烦大家分享下思路

19 个解决方案

#1


写代码判断好像是没有办法,你把256的放512的跑是可以跑的。
怕升错,你自己自己在文件里加标记。

#2



你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~

#3


在257的位置写入12345,再读回,看看是不是12345

#4


引用 2 楼 gooogleman 的回复:
你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~



你都没搞懂人家的意思,人家不是要区分编译出来的256M,512M的NK映像,人家是想在eboot里面的代码判断,当前设备的内存大小。

#5


512的NK烧写在256M内存的设备上,肯定会不能启动。而且好像eboot要和NK匹配,也就是说512M的NK要和512M版本的eboot一起用,你如果用256M的eboot,烧512M的NK到512M内存的设备,也是有问题的。如果是这样的话,是不是会有两个版本的eboot,一个是256M的,一个是512M的,那你根据这个就知道当前设备的内存大小了。。

#6


引用 5 楼 qwqwqw408 的回复:
512的NK烧写在256M内存的设备上,肯定会不能启动。而且好像eboot要和NK匹配,也就是说512M的NK要和512M版本的eboot一起用,你如果用256M的eboot,烧512M的NK到512M内存的设备,也是有问题的。如果是这样的话,是不是会有两个版本的eboot,一个是256M的,一个是512M的,那你根据这个就知道当前设备的内存大小了。。

别人就是不知道用哪个eboot 才造成这样,楼主是要自动识别
想了一下和我以前的需求不同,楼主其实可以这么做:
1、外置一个存储芯片/加密芯片,eboot 读取出内存大小标志,然后eboot编码自动适应256M/512M大小。以前看人好像没有加密芯片之类的芯片也能一个bootloader 自动适应128M/256M内存,不清楚他是怎么判断的,难道是irom 之类的代码去读取一个内存空间判别是大内存还是小内存吗?楼主可以仔细研究一下,过几天我来帖子学习一下。最近要交接工作和面试就暂时不找详细实现方法了。希望对你有用。

#7


引用 4 楼 qwqwqw408 的回复:
Quote: 引用 2 楼 gooogleman 的回复:


你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~



你都没搞懂人家的意思,人家不是要区分编译出来的256M,512M的NK映像,人家是想在eboot里面的代码判断,当前设备的内存大小。

是的,是的,搞错意思了,O(∩_∩)O~

#8


引用 2 楼 gooogleman 的回复:
你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~

你想找哪方面工作?我在深圳这边也没有认识几家,凭你的实力和经验,很多公司抢你的。

#9


引用 3 楼 worldy 的回复:
在257的位置写入12345,再读回,看看是不是12345

这是一种办法,但我担心如果是256MB的,越界访问会引起崩溃,不过,我会尝试过下。

#10


谢谢大家分享这些思路,我的实际应用就是在升级系统之前先判断内存大小,如果要升级的系统是512MB的,但是设备却是256MB的就不让升级,这也就是我提出在eboot想知道设备是256还是512MB的原因。只能要方便实现这个功能就可以了,欢迎大家继续分享。

#11


以前的电脑开机的时候都会检查内存,测试容量,就是这样搞的

#12


引用 10 楼 LoongEmbedded 的回复:
谢谢大家分享这些思路,我的实际应用就是在升级系统之前先判断内存大小,如果要升级的系统是512MB的,但是设备却是256MB的就不让升级,这也就是我提出在eboot想知道设备是256还是512MB的原因。只能要方便实现这个功能就可以了,欢迎大家继续分享。


你的eboot自己弄个const表示是256,还是512.然后升级的时候直接判断bin就行了。在bin文件后面加个标记。
eboot其实不需要判断,你第一次烧自己总不能烧错,如果256烧成512版本,你的eboot根本起不来。

#13


引用 12 楼 accessysq 的回复:
Quote: 引用 10 楼 LoongEmbedded 的回复:

谢谢大家分享这些思路,我的实际应用就是在升级系统之前先判断内存大小,如果要升级的系统是512MB的,但是设备却是256MB的就不让升级,这也就是我提出在eboot想知道设备是256还是512MB的原因。只能要方便实现这个功能就可以了,欢迎大家继续分享。


你的eboot自己弄个const表示是256,还是512.然后升级的时候直接判断bin就行了。在bin文件后面加个标记。
eboot其实不需要判断,你第一次烧自己总不能烧错,如果256烧成512版本,你的eboot根本起不来。

这是一种办法,我也想到了,如果无法做到自动判断,后面就采用这种。

#14


引用 7 楼 gooogleman 的回复:
Quote: 引用 4 楼 qwqwqw408 的回复:

Quote: 引用 2 楼 gooogleman 的回复:


你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~



你都没搞懂人家的意思,人家不是要区分编译出来的256M,512M的NK映像,人家是想在eboot里面的代码判断,当前设备的内存大小。

是的,是的,搞错意思了,O(∩_∩)O~


记得你不是在自己创业的吗?还交接什么工作?

#15


大家还有其他不同的思路分享吗?欢迎欢迎?

#16


另外一种程序判断方法就是在256和512M处判断是否可读可写,注意这种方法和自己的eboot密切相关,系统堆栈可能放在此处, http://blog.csdn.net/evenness/article/details/7818857

#17


楼主解决没有?

我找到以前看到的一篇文章了

你看看吧,也许对你有帮助,我觉得这么做是对的,和你的情况非常相似,以前仔细弄过一段时间linux uboot,感觉linux 体系很多人搞,很强大,你可以找uboot代码来研究一下。

昨天完成了MINI6410的u-boot自动识别256MB和128MB DDR 内存的功能,这里把其中的原理记录一下。

 1、了解DDR SDRAM的原理

首先你必须了解一下DDR SDRAM的原理和外部接口 ,这些在网上有几篇比较经典的文章这里推荐一下:

专家详解:内存工作原理及发展历程

内存的原理和时序(SDRAM、DDR、DDR-Ⅱ、Rambus DRAM)

----------------------------------------------------------------------------------

2、MINI6410的内存硬件结构与寻址关系

在看过上面的文档之后,相信应该对DDR内存有了一个比较完整的认识和理解,下面我们就来讲讲在MINI6410上的内存硬件结构:

对于MINI6410的设计,用了两块引脚兼容的DDR内存芯片来实现128MB内存和256MB内存可共用一个PCB。

128MB内存使用的是两片K4X51163PG(32Mx16bit),形成一个32M×32bit(128MB) 的内存。

256MB内存使用的是两片K4X1G163PE(64Mx16bit),形成一个64M×32bit(256MB) 的内存。

而这两款芯片在引脚上的差别就是K4X51163PG的F7是NC脚,而K4X1G163PE的F7脚是A13 。

这个F7引脚在 128MB内存版本的MINI6410中这个引脚是不连接的,而256MB版本中是通过一个0欧电阻和S3C6410的Xm1ADDR13相连的 。

看了这两个内存芯片和S3C6410(DRAM控制器)的数据手册 的朋友一定知道,这种连接形成一个这样的寻址关系:

128MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[12 :0](行地址):Xm1ADDR[9:0](列地址) 。一共25根地址线刚好可寻址32M空间

256MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[13 :0](行地址):Xm1ADDR[9:0](列地址) 。一共26根地址线刚好可寻址64M空间

而这两种连接和芯片配置也要通过修改S3C6410的DRAM控制器的两个寄存器的参数来匹配。

----------------------------------------------------------------------------------

3、U-boot中内存自适应代码应处的位置

做好了以上的两个知识准备后,我们看看在u-boot中应该在什么位置来识别和自适应不同的内存大小。

首 先我们在识别了内存大小之后可能需要重新配置S3C6410的内存控制器。这么一来,这些代码不能在DDR中运行。因为一旦重新配置内存控制器,必然导致 内存暂时无法使用,如果代码在DDR中CPU可能无法得到下一步的代码。所以这些代码要放在u-boot实现自拷贝到内存之前的地方,其实最好的地方就是 在u-boot的SPL部分中初始化内存控制器的代码段中。

这些代码就在:arch/arm/cpu/arm1176/s3c64xx/cpu_init.S

这 个文件是汇编代码,其中的函数mem_ctrl_asm_init是通过start.S中的“bl    lowlevel_init”------>/board/samsung/mini6410/lowlevel_init.S中的 lowlevel_init ”bl    mem_ctrl_asm_init”调用的。mem_ctrl_asm_init函数中的代码对S3C6410的DRAM控制器进行了初始化,并对外部 的DDR内存也进行了初始化,所以内存的识别和自适应代码应该放在这些初始化之后。先识别内存的大小,如果内存大小和原先DRAM控制器的配置不相符,就 修改DRAM控制器的配置。

----------------------------------------------------------------------------------

 

4、内存大小的识别

针对MINI6410的情况,我们只需要识别内存是128MB还是256MB。由于这两种内存大小关系到DRAM控制器的两个寄存器的参数 ,所有我们必须先假设我们的内存大小,再通过读写的方式来证明,如果证明我们的假设是错误的,再修改寄存器的参数。

我移植的U-boot代码中首先假设内存是256MB,并先配置DRAM控制器为256MB内存的参数。如果这时连接的是128MB内存 ,那么就会有这样一个有趣的现象:

由于Xm1ADDR[13 ] 没有连接,所以DDR内存的第一个8M×32bit(32MB)和第二个8M×32bit(32MB)是镜像关系,第三个8M×32bit(32MB)和 第四个8M×32bit(32MB)是镜像关系,以此类推。一共有四个这样的镜像关系,共256MB。如果连接的就是256MB的内存就不会有这样的现 象。所以,只要我们证明了这种现象存在,就证明了我们其实连接的是128MB内存,然后重新配置DRAM控制器为128MB内存的参数就大功告成了。

所以我移植的U-boot代码中首先写一个32bit的测试数据 到第一个8M×32bit(32MB)的某个位置 (比 如0x0地址),然后就去第二个8M×32bit(32MB)相应偏移位置读取,如果数据一致就可以证明镜像关系。但是还不保险,如果就是这么巧(在连接 256MB的内存的情况下)第二个8M×32bit(32MB)相应位置本身就是这个数据怎么办?不要紧,我们再去第二个8M×32bit(32MB)同一位置 写入另一个测试数据 ,然后去第一个8M×32bit(32MB)的那个位置(也就是一开始的那个写入位置)读取数据,如果数据一致就完全可以证明镜像关系。通过这样的两次测试,看看是否要重新配置DRAM控制器参数。

但是我们不能 假设内存是128MB ,并先配置DRAM控制器为128MB内存的参数。如果连接的是256MB的内存,没有任何特殊的现象可以测试到。通过上面的寻址关系,如果连接的是256MB的内存,只是第二、四、六、八(假设Xm1ADDR[13 ]一直是0 )个8M×32bit(32MB)是没法访问的(可以说是内存空洞),这个无法通过读写证明。(通过寻址关系推断,未通过实验证明)

----------------------------------------------------------------------------------

5、关于内存控制器的重配置

如果上面的步骤中测试出了镜像的存在,我们必须重新配置两个寄存器的值,但是如何重新配置,这个三星的数据手册是没有讲的,我通过测试发现可以通过以下的步骤重新配置DRAM控制器:

1、将DRAM控制器设为暂停(Paused)状态;

2、检测P1MEMSTAT,直到确认了暂停(Paused)状态;

3、将DRAM控制器设为配置(Config)状态;

4、检测P1MEMSTAT,直到确认了配置(Config)状态;

5、修改需要重新配置的寄存器

6、将DRAM控制器设为启动(Go)状态;

7、检测P1MEMSTAT,直到确认了就绪(Ready)状态;

----------------------------------------------------------------------------------

 

 

http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=167786

#18


非常感谢,收藏起来,这个功能暂时不急,先处理其他的。

#19


config.bib写死的啊

#1


写代码判断好像是没有办法,你把256的放512的跑是可以跑的。
怕升错,你自己自己在文件里加标记。

#2



你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~

#3


在257的位置写入12345,再读回,看看是不是12345

#4


引用 2 楼 gooogleman 的回复:
你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~



你都没搞懂人家的意思,人家不是要区分编译出来的256M,512M的NK映像,人家是想在eboot里面的代码判断,当前设备的内存大小。

#5


512的NK烧写在256M内存的设备上,肯定会不能启动。而且好像eboot要和NK匹配,也就是说512M的NK要和512M版本的eboot一起用,你如果用256M的eboot,烧512M的NK到512M内存的设备,也是有问题的。如果是这样的话,是不是会有两个版本的eboot,一个是256M的,一个是512M的,那你根据这个就知道当前设备的内存大小了。。

#6


引用 5 楼 qwqwqw408 的回复:
512的NK烧写在256M内存的设备上,肯定会不能启动。而且好像eboot要和NK匹配,也就是说512M的NK要和512M版本的eboot一起用,你如果用256M的eboot,烧512M的NK到512M内存的设备,也是有问题的。如果是这样的话,是不是会有两个版本的eboot,一个是256M的,一个是512M的,那你根据这个就知道当前设备的内存大小了。。

别人就是不知道用哪个eboot 才造成这样,楼主是要自动识别
想了一下和我以前的需求不同,楼主其实可以这么做:
1、外置一个存储芯片/加密芯片,eboot 读取出内存大小标志,然后eboot编码自动适应256M/512M大小。以前看人好像没有加密芯片之类的芯片也能一个bootloader 自动适应128M/256M内存,不清楚他是怎么判断的,难道是irom 之类的代码去读取一个内存空间判别是大内存还是小内存吗?楼主可以仔细研究一下,过几天我来帖子学习一下。最近要交接工作和面试就暂时不找详细实现方法了。希望对你有用。

#7


引用 4 楼 qwqwqw408 的回复:
Quote: 引用 2 楼 gooogleman 的回复:


你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~



你都没搞懂人家的意思,人家不是要区分编译出来的256M,512M的NK映像,人家是想在eboot里面的代码判断,当前设备的内存大小。

是的,是的,搞错意思了,O(∩_∩)O~

#8


引用 2 楼 gooogleman 的回复:
你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~

你想找哪方面工作?我在深圳这边也没有认识几家,凭你的实力和经验,很多公司抢你的。

#9


引用 3 楼 worldy 的回复:
在257的位置写入12345,再读回,看看是不是12345

这是一种办法,但我担心如果是256MB的,越界访问会引起崩溃,不过,我会尝试过下。

#10


谢谢大家分享这些思路,我的实际应用就是在升级系统之前先判断内存大小,如果要升级的系统是512MB的,但是设备却是256MB的就不让升级,这也就是我提出在eboot想知道设备是256还是512MB的原因。只能要方便实现这个功能就可以了,欢迎大家继续分享。

#11


以前的电脑开机的时候都会检查内存,测试容量,就是这样搞的

#12


引用 10 楼 LoongEmbedded 的回复:
谢谢大家分享这些思路,我的实际应用就是在升级系统之前先判断内存大小,如果要升级的系统是512MB的,但是设备却是256MB的就不让升级,这也就是我提出在eboot想知道设备是256还是512MB的原因。只能要方便实现这个功能就可以了,欢迎大家继续分享。


你的eboot自己弄个const表示是256,还是512.然后升级的时候直接判断bin就行了。在bin文件后面加个标记。
eboot其实不需要判断,你第一次烧自己总不能烧错,如果256烧成512版本,你的eboot根本起不来。

#13


引用 12 楼 accessysq 的回复:
Quote: 引用 10 楼 LoongEmbedded 的回复:

谢谢大家分享这些思路,我的实际应用就是在升级系统之前先判断内存大小,如果要升级的系统是512MB的,但是设备却是256MB的就不让升级,这也就是我提出在eboot想知道设备是256还是512MB的原因。只能要方便实现这个功能就可以了,欢迎大家继续分享。


你的eboot自己弄个const表示是256,还是512.然后升级的时候直接判断bin就行了。在bin文件后面加个标记。
eboot其实不需要判断,你第一次烧自己总不能烧错,如果256烧成512版本,你的eboot根本起不来。

这是一种办法,我也想到了,如果无法做到自动判断,后面就采用这种。

#14


引用 7 楼 gooogleman 的回复:
Quote: 引用 4 楼 qwqwqw408 的回复:

Quote: 引用 2 楼 gooogleman 的回复:


你这两个镜像编译出来肯定有点不一样的,你用软件打开看看文件头看看有什么差异,用这些差异来判断,以前我是判断NK.nb0,你的估计是NK.bin ,你可以分析一下这些文件格式来处理,总有办法的。
——楼主年纪比我大,还这么有激情,是我的榜样,最近也要去深圳找一份工作有推荐吗?O(∩_∩)O~



你都没搞懂人家的意思,人家不是要区分编译出来的256M,512M的NK映像,人家是想在eboot里面的代码判断,当前设备的内存大小。

是的,是的,搞错意思了,O(∩_∩)O~


记得你不是在自己创业的吗?还交接什么工作?

#15


大家还有其他不同的思路分享吗?欢迎欢迎?

#16


另外一种程序判断方法就是在256和512M处判断是否可读可写,注意这种方法和自己的eboot密切相关,系统堆栈可能放在此处, http://blog.csdn.net/evenness/article/details/7818857

#17


楼主解决没有?

我找到以前看到的一篇文章了

你看看吧,也许对你有帮助,我觉得这么做是对的,和你的情况非常相似,以前仔细弄过一段时间linux uboot,感觉linux 体系很多人搞,很强大,你可以找uboot代码来研究一下。

昨天完成了MINI6410的u-boot自动识别256MB和128MB DDR 内存的功能,这里把其中的原理记录一下。

 1、了解DDR SDRAM的原理

首先你必须了解一下DDR SDRAM的原理和外部接口 ,这些在网上有几篇比较经典的文章这里推荐一下:

专家详解:内存工作原理及发展历程

内存的原理和时序(SDRAM、DDR、DDR-Ⅱ、Rambus DRAM)

----------------------------------------------------------------------------------

2、MINI6410的内存硬件结构与寻址关系

在看过上面的文档之后,相信应该对DDR内存有了一个比较完整的认识和理解,下面我们就来讲讲在MINI6410上的内存硬件结构:

对于MINI6410的设计,用了两块引脚兼容的DDR内存芯片来实现128MB内存和256MB内存可共用一个PCB。

128MB内存使用的是两片K4X51163PG(32Mx16bit),形成一个32M×32bit(128MB) 的内存。

256MB内存使用的是两片K4X1G163PE(64Mx16bit),形成一个64M×32bit(256MB) 的内存。

而这两款芯片在引脚上的差别就是K4X51163PG的F7是NC脚,而K4X1G163PE的F7脚是A13 。

这个F7引脚在 128MB内存版本的MINI6410中这个引脚是不连接的,而256MB版本中是通过一个0欧电阻和S3C6410的Xm1ADDR13相连的 。

看了这两个内存芯片和S3C6410(DRAM控制器)的数据手册 的朋友一定知道,这种连接形成一个这样的寻址关系:

128MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[12 :0](行地址):Xm1ADDR[9:0](列地址) 。一共25根地址线刚好可寻址32M空间

256MB内存版本:Xm1ADDR[15:14](bank):Xm1ADDR[13 :0](行地址):Xm1ADDR[9:0](列地址) 。一共26根地址线刚好可寻址64M空间

而这两种连接和芯片配置也要通过修改S3C6410的DRAM控制器的两个寄存器的参数来匹配。

----------------------------------------------------------------------------------

3、U-boot中内存自适应代码应处的位置

做好了以上的两个知识准备后,我们看看在u-boot中应该在什么位置来识别和自适应不同的内存大小。

首 先我们在识别了内存大小之后可能需要重新配置S3C6410的内存控制器。这么一来,这些代码不能在DDR中运行。因为一旦重新配置内存控制器,必然导致 内存暂时无法使用,如果代码在DDR中CPU可能无法得到下一步的代码。所以这些代码要放在u-boot实现自拷贝到内存之前的地方,其实最好的地方就是 在u-boot的SPL部分中初始化内存控制器的代码段中。

这些代码就在:arch/arm/cpu/arm1176/s3c64xx/cpu_init.S

这 个文件是汇编代码,其中的函数mem_ctrl_asm_init是通过start.S中的“bl    lowlevel_init”------>/board/samsung/mini6410/lowlevel_init.S中的 lowlevel_init ”bl    mem_ctrl_asm_init”调用的。mem_ctrl_asm_init函数中的代码对S3C6410的DRAM控制器进行了初始化,并对外部 的DDR内存也进行了初始化,所以内存的识别和自适应代码应该放在这些初始化之后。先识别内存的大小,如果内存大小和原先DRAM控制器的配置不相符,就 修改DRAM控制器的配置。

----------------------------------------------------------------------------------

 

4、内存大小的识别

针对MINI6410的情况,我们只需要识别内存是128MB还是256MB。由于这两种内存大小关系到DRAM控制器的两个寄存器的参数 ,所有我们必须先假设我们的内存大小,再通过读写的方式来证明,如果证明我们的假设是错误的,再修改寄存器的参数。

我移植的U-boot代码中首先假设内存是256MB,并先配置DRAM控制器为256MB内存的参数。如果这时连接的是128MB内存 ,那么就会有这样一个有趣的现象:

由于Xm1ADDR[13 ] 没有连接,所以DDR内存的第一个8M×32bit(32MB)和第二个8M×32bit(32MB)是镜像关系,第三个8M×32bit(32MB)和 第四个8M×32bit(32MB)是镜像关系,以此类推。一共有四个这样的镜像关系,共256MB。如果连接的就是256MB的内存就不会有这样的现 象。所以,只要我们证明了这种现象存在,就证明了我们其实连接的是128MB内存,然后重新配置DRAM控制器为128MB内存的参数就大功告成了。

所以我移植的U-boot代码中首先写一个32bit的测试数据 到第一个8M×32bit(32MB)的某个位置 (比 如0x0地址),然后就去第二个8M×32bit(32MB)相应偏移位置读取,如果数据一致就可以证明镜像关系。但是还不保险,如果就是这么巧(在连接 256MB的内存的情况下)第二个8M×32bit(32MB)相应位置本身就是这个数据怎么办?不要紧,我们再去第二个8M×32bit(32MB)同一位置 写入另一个测试数据 ,然后去第一个8M×32bit(32MB)的那个位置(也就是一开始的那个写入位置)读取数据,如果数据一致就完全可以证明镜像关系。通过这样的两次测试,看看是否要重新配置DRAM控制器参数。

但是我们不能 假设内存是128MB ,并先配置DRAM控制器为128MB内存的参数。如果连接的是256MB的内存,没有任何特殊的现象可以测试到。通过上面的寻址关系,如果连接的是256MB的内存,只是第二、四、六、八(假设Xm1ADDR[13 ]一直是0 )个8M×32bit(32MB)是没法访问的(可以说是内存空洞),这个无法通过读写证明。(通过寻址关系推断,未通过实验证明)

----------------------------------------------------------------------------------

5、关于内存控制器的重配置

如果上面的步骤中测试出了镜像的存在,我们必须重新配置两个寄存器的值,但是如何重新配置,这个三星的数据手册是没有讲的,我通过测试发现可以通过以下的步骤重新配置DRAM控制器:

1、将DRAM控制器设为暂停(Paused)状态;

2、检测P1MEMSTAT,直到确认了暂停(Paused)状态;

3、将DRAM控制器设为配置(Config)状态;

4、检测P1MEMSTAT,直到确认了配置(Config)状态;

5、修改需要重新配置的寄存器

6、将DRAM控制器设为启动(Go)状态;

7、检测P1MEMSTAT,直到确认了就绪(Ready)状态;

----------------------------------------------------------------------------------

 

 

http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=167786

#18


非常感谢,收藏起来,这个功能暂时不急,先处理其他的。

#19


config.bib写死的啊

#20