9711|29

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SDRAM的检测 [复制链接]

各位英雄:
     我的PDA系统基于PXA255+WCE4.2平台,硬件上有128M的SDRAM连接,但是现在系统只能使用64M的SDRAM作为内存,如果修改内存为128M,系统无法启动。初步分析,或者硬件上出现问题,即硬件上有64M的SDRAM是坏的;或者系统内核定制时,修改为128M内存无效。
     
     现在我想检测剩余的64M内存是否可以正常进行读写,以确定硬件上是否有问题;如果全部的128M内存SDRAM都可以进行正常读写,就说明SDRAM正常,问题就出于内核上;
     
     请教各位英雄,如何检测物理内存是否可以正常读写呢?是在系统启动后通过应用软件去实现还是在驱动里或者在EBOOT里完成?

     具体实现时,是不是要参照SDRAM的时序?

     给予小弟指点了!

最新回复

你使用的是PXA 我是三星,内存控制器不同,我没有PXA板子做实验。我唯一能帮你就是这些了,至于这个内存控制器到底 是怎么读写内存的,你要仔细看数据手册才行。不过我看atmel的ARM9和三星的内存连线是一样的。 按照你目前的情况已经弄到了内核的一步。为什么会挂掉。有可能bootloader都还不行。有可能是内存映射表没有搞好。  详情 回复 发表于 2008-12-16 11:36
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
pxa255的一个SDCS只支持64MB SDRAM,在同一个SDCS上,即使接128MB也是没用的,只能识别低64MB。
如果这128MB是分别接在两个SDCS上的,正好符合每个SDCS支持64MB的定义。不过估计内核需要重新定制一遍,需要正确的将高64MB的物理地址映射到虚拟地址中去。至少我们做了4年,都没这样用过,不好多说什么。
btw,pxa255到2010年停产,而且marvell不再提供技术支持。即使是pxa270也已经不支持了。
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
CE下定制>64M的内核,好像是比较麻烦,看过一篇文章是这样说的,不是简单的改改那个值就可以的!!!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
应该有测试工具的,SJF2440。EXE这类工具就有SDRAM的测试功能!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
我的办法是
在ADS下调试成功了才到内核。一下子跳到内核,太难了。
——首先弄个128M的内存初始化文件,如果使用JLINK/JTAG仿真成功,说明内存硬件接线没有问题,然后打开ADS 的内存窗口,看能否写入数据,一般在最高,最低地址写入,总之你多尝试几次,就可以了,如果不行,说明内存硬件接线或者内存没有初始化成功。
搞定这步以后,你就进内核改一些内存映射文件等等。good luck
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 gooogleman 的回复:
我的办法是
在ADS下调试成功了才到内核。一下子跳到内核,太难了。
——首先弄个128M的内存初始化文件,如果使用JLINK/JTAG仿真成功,说明内存硬件接线没有问题,然后打开ADS 的内存窗口,看能否写入数据,一般在最高,最低地址写入,总之你多尝试几次,就可以了,如果不行,说明内存硬件接线或者内存没有初始化成功。
搞定这步以后,你就进内核改一些内存映射文件等等。good luck
这个要顶一一下。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

7
 
各位的高见让小弟受益匪浅...

首先,我的128M SDRAM是分2个BANK接的,每个BANK 128M。

其次,我的开发环境是Platform Builder4.2,能够用ADS去调试吗?我的EBOOT已经固化在NOR FLASH上了,具体该怎么去下载测试呢?肯定要设置下‘Debug Settings’吧?

再次,128M内存初始化文件是?怎么使用呢?

最后,在没有操作系统的情况下,读写SDRAM,时序怎么控制呢?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 daigua04 的回复:
各位的高见让小弟受益匪浅...

首先,我的128M SDRAM是分2个BANK接的,每个BANK 128M。

其次,我的开发环境是Platform Builder4.2,能够用ADS去调试吗?我的EBOOT已经固化在NOR FLASH上了,具体该怎么去下载测试呢?肯定要设置下‘Debug Settings’吧?

再次,128M内存初始化文件是?怎么使用呢?

最后,在没有操作系统的情况下,读写SDRAM,时序怎么控制呢?


在程序跑动之前,这个内存就要跑起来,
你的bootloader都没有启动,操作系统再厉害也启动不了。
PB下的东西不能用ADS调试的。
你的是什么平台?什么芯片?

如果是三星的2410/2440内存接两个bank估计有问题,硬件都不对。

对三星来说,都提供一份测试的ADS代码,你在上面改动就可以了。

 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
gooogleman,看帖子不专心啊,lz已经说了是PXA255/wince4.2了,呵呵。

两个bank分别接64MB是可以的(注意是64MB,不是128MB)。
PB的程序很难移植到ADS上debug的,架构不同。既然板子都在手上了,那就修改eboot,以此来测试。在eboot里面对0-64MB-128MB空间进行读写测试,分别找几个地址点写、读一下,看看能不能读出正确结果,就知道高64MB有没有配置正确了。

SDRAM初始化是在eboot里的汇编(.s)里面做的,先读原有的,找到配置64MB的,再根据cpu的spec,就知道如何配置另一个SDCS了。

只要配置好SDRAM控制器,对应的时序就由CPU自己产生,不需要你控制。有没有操作系统都一样。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 shuiyan 的回复:
gooogleman,看帖子不专心啊,lz已经说了是PXA255/wince4.2了,呵呵。

两个bank分别接64MB是可以的(注意是64MB,不是128MB)。
PB的程序很难移植到ADS上debug的,架构不同。既然板子都在手上了,那就修改eboot,以此来测试。在eboot里面对0-64MB-128MB空间进行读写测试,分别找几个地址点写、读一下,看看能不能读出正确结果,就知道高64MB有没有配置正确了。

SDRAM初始化是在eboot里的汇编(.s)里面做的,先读原有的,…

O(∩_∩)O哈哈~,真是钻到地下算了。
我就看他后面那个回复,就不管他上次发的了。
------------------------------------------
楼主,如果你的没有ADS程序,那么只能从eboot下手了,除了shuiyan牛人说的以外,eboot下的有些INC文件也是要留意一下。
内存改变了,有些堆栈之类的东西也要移动一下。
还要注意你的手册的内存控制器那章,很多细节都在那里了。
没有ADS,楼主每次都要下载,..........不能单步,非常郁闷的。
good luck!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
PXA255没有用过,但PXA270上面正常的一个片选也只有64M,但它有另一种模式,可以选一个片选是256M的,我当时换128M SDRAM时就是这样换的,不知道255下面是否有也这样的功能?
测试的话在Bootloader里面对相应的地址进行读写操作看看就可以了
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 
各位英雄,都是高手啊!小弟佩服至极...

我写错了,我的每个BANK是64M的,一共2个BANK。

“SDRAM初始化是在eboot里的汇编(.s)里面做的,先读原有的,找到配置64MB的,再根据cpu的spec,就知道如何配置另一个SDCS了。
只要配置好SDRAM控制器,对应的时序就由CPU自己产生,不需要你控制。有没有操作系统都一样。”

这句话让我学到不少,看来我还是要在EBoot中做测试了?不过在EBOOT中做测试比较麻烦,因为每次修改后都需要重新烧录EBOOT,不知道有没有更好的方法?比如EBOOT不修改,建立一个其它的工程下载到板子上执行,能够检测出SDRAM的好坏。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 daigua04 的回复:
知道有没有更好的方法?比如EBOOT不修改,建立一个其它的工程下载到板子上执行,能够检测出SDRAM的好坏。

目前貌似没有这么高级的东西,毕竟你的程序下载之前,内存要初始化好的,即使你有这种软件也要先保证初始化正确才行。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
pxa255没有Large Mode,只能64MB/bank。S3C2440A都支持SDRAM 128MB/BANK的(不过只有2个BANK)。

wince的eboot移植到ADS不是不可以,只是相关的依赖性文件比较多。pxa255/wince4.2可能会好一些,至少那时还没有xllp这样的东西。你可以尝试一下,毕竟eboot只有一个目录,依赖的也只是一些inc而已。不过有些要到public下以及oal下找了。

eboot不修改而想测试,基本是不可能的。不过可以修改一下eboot,允许每次下载的新eboot只在sdram里运行,而不烧录到flash里去,这样就省时间了。当然,因为你现在只调好低64MB的,这个下载的新eboot(不烧到flash里)就只能在低64MB里跑,去测试高64MB是否ok了。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 
英雄!
我的eboot启动时,停留在OEMAddressTable = ××处就死掉了,详细信息如下:

Download successful! Jumping to image at physical 0xA00B9000...
Begin
******************************************************
******************************************************
******************************************************
******************************************************
******************************************************
OEMInitDebugSerial using UART2
Windows CE Kernel for ARM   Built on Mar 13 2003 at 22:54:19
ProcessorType=02d0  Revision=6
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 800b9ef8

然后就死在这里了...

本人知识浅薄,初步断定为内存映射时出现问题;但是根据我的师兄的说法,同样的内核在一套板子上可以,在另外一套上就不行。

ARMInit()中调用OEMInit(),上面那段信息就是在调用OEMInit()之前打印出来的,然后再进入OEMInit()。

SDRAM控制器是在EBOOT的汇编程序中初始化?小弟有两个思路,不知道是否可行?

1、先改EBOOT,把所有的128M内存都初始化,然后下载64M内核,系统正常启动;可以在驱动或者应用程序里对另外一个BANK的SDRAM进行读写来测试好坏;

2、既然EBOOT中已经初始化了SDRAM控制器,我就在EBOOT中添加读写SDRAM代码;或者在OEMInit()中完成读写,省去要修改EBOOT?
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
建议:
先将系统定制成64MB内存,然后确认能启动系统。
再修改汇编初始化部分,将第二个SDRAM BANK初始化,在eboot的操作列表(启动时敲空格)中增加一个测试test选项,在其中对SDRAM的高64MB进行写、读操作。

这样,既保证系统没问题,又能对sdram测试。测试通过后,再尝试修改内存映射表。
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 shuiyan 的回复:
建议:
先将系统定制成64MB内存,然后确认能启动系统。
再修改汇编初始化部分,将第二个SDRAM BANK初始化,在eboot的操作列表(启动时敲空格)中增加一个测试test选项,在其中对SDRAM的高64MB进行写、读操作。

这样,既保证系统没问题,又能对sdram测试。测试通过后,再尝试修改内存映射表。


赞同,就这样
楼主你想跳过eboot是不可能的。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

18
 
我修改EBOOT,使能全部两个BANK,也就是全部的128M SDRAM空间;同时在EBOOT打印菜单里添加测试SDRAM选项,并把测试数据打印出来,我的测试代码如下:
void TestSdram(void)
{
        DWORD baseaddr;
        DWORD hbaseaddr;
        DWORD curaddr;
        BYTE i,j;

        EdbgOutputDebugString("Test Sdram Begin...\r\n");

        baseaddr=0xA0000000;
        hbaseaddr=0xA4000000;     //低、高64M的起始物理地址

        curaddr=baseaddr;         //往低64M写入100个数并打印
        for(i=1;i<=100;i++)
        {
                EdbgOutputDebugString("Write:%d  ",i);
                *(volatile PUCHAR)curaddr=i; //赋值
                curaddr=curaddr+4;           //地址加4
        }

        curaddr=hbaseaddr;         //往高64M写入100个数并打印
        for(i=1;i<=100;i++)
        {
                EdbgOutputDebugString("Write:%d  ",i);
                *(volatile PUCHAR)curaddr=i; //赋值------------EBOOT执行时,程序死在此处
                curaddr=curaddr+4;           //地址加4
        }

        curaddr=baseaddr;
        EdbgOutputDebugString("\r\n");

        for(i=1;i<=100;i++)        //读出低64M被写入的数据并打印
        {
                j=*(volatile PUCHAR)curaddr; //读取
                EdbgOutputDebugString("Read:%d  ",j);
                curaddr=curaddr+4;          //地址加4
        }

        curaddr=hbaseaddr;
        EdbgOutputDebugString("\r\n");

        for(i=1;i<=100;i++)                      //读出高64M被写入的数据并打印
        {
                j=*(volatile PUCHAR)curaddr; //读取
                EdbgOutputDebugString("Read:%d  ",j);
                curaddr=curaddr+4;          //地址加4
        }

        EdbgOutputDebugString("\r\nTest Sdram End...\r\n");
}

打印信息显示,只有低64M的SDRAM写入了100个数,并打印出来;高64M的SDRAM没有写入,且程序死在*(volatile PUCHAR)curaddr=i;处,也即第2个for循环中,没有一个数能够写入到高64M的SDRAM中,请问两位英雄,这大概是什么问题?由此可以判断高64M内存的硬件有问题吗?还是我的测试代码有问题?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
你直接操作物理地址的啊?怎么没将物理地址映射到虚拟地址?

其实你应该将bank1和bank2的相关寄存器都打印出来,然后进行对比,以此判断确认对bank2的配置是否正确。

然后最好请硬件工程师配合你,用示波器测试bank2上的clk是否正确产生。

当你开始你的测试程序时,用示波器查看对应的SDCS是否正常,clk是否正常,对应的RAS、CAS是否正常,对应的地址、数据总线是否有信号。

这样应该能排除硬件、初始化配置的问题,如果这部分都无法确认没问题,你软件再怎么花精力,都不会有结果。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 14 楼 daigua04 的回复:
英雄!
我的eboot启动时,停留在OEMAddressTable = ××处就死掉了,详细信息如下:

Download successful! Jumping to image at physical 0xA00B9000...
Begin
******************************************************
******************************************************
******************************************************
******************************************************
*************…

这个是刚进入内核。

你的OEMAddressTable 根据你加大的内存改了吗?

这个是要改动的,并且要非常小心,如果移动的不正确会导致启动不了的。系统要根据这个表来实现虚拟内存和物理内存的转换。
在memory.c这个东东里面有它的转换过程。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表