2440+WINCE5.0 扩充128M SDRAM的问题。

PowerAll888 2009-11-23 07:50:44
我使用2440+wince5.0的平台,原先使用2片共64M字节的SDRAM,每片256bit,16bit位宽;现在想使用128M SDRAM,所以用了4片和原先一模一样的SDRAM芯片,在硬件连接上4片sdram芯片的BA0都与addr24连接,BA1都与addr25连接,另外其中两片使用CS6作为片选,另外两片使用CS7作为片选。
软件上我主要作了以下几处改动:
1) setpldr程序中对sdram控制器进行配置时将BK76MAP设置为64MB每bank;
2) eboot程序中对sdram控制器进行配置时将BK76MAP设置为64MB每bank;
3) 在oemaddrtab_cfg.inc文件中,对地址的映射关系进行了修改如下:
; modify(mod) 为了支持128M SDRAM
; DCD 0x80000000, 0x30000000, 64
; DCD 0x84000000, 0x10000000, 32
; DCD 0x86000000, 0x18000000, 32
DCD 0x80000000, 0x30000000, 128
4) 在config.bib文件中,做了如下修改:
;;; modify(for 128M SDRAM)
; NK 80200000 01E00000 RAMIMAGE
; RAM 82000000 01E00000 RAM
NK 80200000 01E00000 RAMIMAGE
RAM 82000000 05E00000 RAM
做了上述修改后,我通过eboot下载nk.bin,加载ce时,调试信息输入下面内容后,就不再输出信息,也就是说系统终止在此处了:
Windows CE Kernel for ARM (Thumb Enabled) Built on Feb 8 2007 at 23:36:51
ProcessorType=0920 Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 8020114c
+OEMInit
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
InitDisplay clkval_calc 1
-OEMInit

针对上面的问题,我做了如下几项测试:
1) 在stepldr程序中对30000000~37ffffff的地址进行遍历,先写再读,发现都是正常的,也就是说硬件似乎没有问题,内存的物理地址空间也没有问题;
2) 在eboot中对下面的虚拟地址进行读写测试,对83ff0000~83ffffff测试时候,发现都是正常的,对87ff0000~87ffffff测试的时候,发现都不太正常;我把一级页表的内容全部打印出来,也没有发现什么问题,也就是说在一级页表中对虚拟地址84000000~87ffffff范围的地址映射都是正确的。
我现在对eboot中对87ff0000~87ffffff 这段地址的访问不正常非常困惑,可能这个问题解决了,下载nk.bin启动的问题也就解决了。

哪位高手能指点一下,谢谢!
...全文
525 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooogleman 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 powerall888 的回复:]
乃乃的,郁闷了好几天,终于找到原因了。

我在eboot中B6_MT ,B6_Trcd 和B7_MT ,B7_Trcd 参数设置的不一致,在stepldr程序中却是相同的,把这些参数改成完全一致,虚拟地址都可以正常访问了,也可以正常下载nk.bin文件了。

HeyMe所说的物理地址空间的问题BK76MAP的设置就可以保证连续了。

谢谢各位的回复!!!
[/Quote]

恭喜了,嘿嘿。猛。我是在ADS bootloader下修改,eboot还没有试过呢。
xqhrs232 2009-11-25
  • 打赏
  • 举报
回复
没整过关注一下!!!
PowerAll888 2009-11-25
  • 打赏
  • 举报
回复
lightsoure说“我觉得你在扩展内存的时候,这个地址分配有问题吧,试着改下分配的方式把? ”

不太明白,怎么修改分配方式?是指使用另外的虚拟地址空间吗?
PowerAll888 2009-11-25
  • 打赏
  • 举报
回复
我现在还只是加载了stepldr和eboot程序,所以0x84000000~0x87ffffff地址空间是不会跟其他程序相冲突的,我在eboot的main函数的第一个语句就对0x80000000~0x87ffffff地址空间进行读写测试,发现低64MB可以正确访问,高64MB不能正确访问。 而我在stepldr程序中对0x30000000~0x37ffffff物理地址空间进行读写测试,是没有任何问题的。

我原先也想使用2片sdram扩展128M,但是现在厂家似乎都停产此类芯片了,你们使用的sdram芯片现在还有在生产吗?
FrankBIBI 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 heyme 的回复:]
引用 7 楼 powerall888 的回复:
谢谢frankizhong的回复,我原先的内容如下,
;        DCD    0x80000000, 0x30000000, 64      ; 32 MB DRAM BANK 6
;        DCD    0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
;        DCD    0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
修改后变成如下:
        DCD    0x80000000, 0x30000000, 128      ; 32 MB DRAM BANK 6       

pcmcia/pccard的驱动我没有使用,因此地址空间没有任何冲突。

另外,我知道stepldr中没有使用oemaddresstable,因此我在stepldr程序中只是对物理地址空间测试,即对0x30000000~0x37ffffff测试,没有问题;
在eboot中有启用mmu,有用到oemaddresstable,但是我在eboot中对虚拟地址0x84000000~0x87ffffff进行测试时,发现读写不正确;对虚拟地址0x80000000~0x83ffffff能够正确读写;
我因此检查了0x30010000地址的一级页表的所有内容,发现全部正确,就是说虚拟地址的和物理地址的映射关系是正确的;

我现在依然没有找到eboot中不能正确访问地址0x84000000~0x87ffffff的原因,高手帮忙啊!


提出一些看法:
1,你两片接的是CS6片选,也就是每片16Mx16的sdram,所以两片结在一起的时候是16Mx32,也就是你所说的64MB。那么初始化SDRAM的时候有没有把数据长度改成32bit的宽度呢。

2,在片选为CS6的的两片SDRAM里面,你的地址范围应该是0x30000000-0x33ffffff吧?那么映射以后也就是0x80000000-0x83ffffff。这样你不能访问0x84000000~0x87ffffff就很正常了。超出范围了!

3,即使你把sdram扩展成128M,但你的地址是不连续的,那个片选为CS7的两片的起始地址应该是0x38000000开始的地址。
上面说的希望会对你有所帮助!

[/Quote]
恩,很好~有道理,我怎么就想不到呢?呵呵~


学到了~~谢谢你也谢谢楼主!
iwillbeback008 2009-11-25
  • 打赏
  • 举报
回复
可以去参照一下天嵌的最新开发光盘,他们网站主页上有下载!
guopeixin 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 powerall888 的回复:]
乃乃的,郁闷了好几天,终于找到原因了。

我在eboot中B6_MT ,B6_Trcd 和B7_MT ,B7_Trcd 参数设置的不一致,在stepldr程序中却是相同的,把这些参数改成完全一致,虚拟地址都可以正常访问了,也可以正常下载nk.bin文件了。

HeyMe所说的物理地址空间的问题BK76MAP的设置就可以保证连续了。

谢谢各位的回复!!!
[/Quote]
寄存器配置呀,恭喜
PowerAll888 2009-11-25
  • 打赏
  • 举报
回复
乃乃的,郁闷了好几天,终于找到原因了。

我在eboot中B6_MT ,B6_Trcd 和B7_MT ,B7_Trcd 参数设置的不一致,在stepldr程序中却是相同的,把这些参数改成完全一致,虚拟地址都可以正常访问了,也可以正常下载nk.bin文件了。

HeyMe所说的物理地址空间的问题BK76MAP的设置就可以保证连续了。

谢谢各位的回复!!!
gooogleman 2009-11-25
  • 打赏
  • 举报
回复
3,即使你把sdram扩展成128M,但你的地址是不连续的,那个片选为CS7的两片的起始地址应该是0x38000000开始的地址。
不连续的可以使用一个函数实现,我就这样做的。
http://www.armce.com/bbs/thread-758-1-1.html

这里又说明的。
HeyMe 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 powerall888 的回复:]
谢谢frankizhong的回复,我原先的内容如下,
;        DCD    0x80000000, 0x30000000, 64      ; 32 MB DRAM BANK 6
;        DCD    0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
;        DCD    0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
修改后变成如下:
        DCD    0x80000000, 0x30000000, 128      ; 32 MB DRAM BANK 6       

pcmcia/pccard的驱动我没有使用,因此地址空间没有任何冲突。

另外,我知道stepldr中没有使用oemaddresstable,因此我在stepldr程序中只是对物理地址空间测试,即对0x30000000~0x37ffffff测试,没有问题;
在eboot中有启用mmu,有用到oemaddresstable,但是我在eboot中对虚拟地址0x84000000~0x87ffffff进行测试时,发现读写不正确;对虚拟地址0x80000000~0x83ffffff能够正确读写;
我因此检查了0x30010000地址的一级页表的所有内容,发现全部正确,就是说虚拟地址的和物理地址的映射关系是正确的;

我现在依然没有找到eboot中不能正确访问地址0x84000000~0x87ffffff的原因,高手帮忙啊!

[/Quote]
提出一些看法:
1,你两片接的是CS6片选,也就是每片16Mx16的sdram,所以两片结在一起的时候是16Mx32,也就是你所说的64MB。那么初始化SDRAM的时候有没有把数据长度改成32bit的宽度呢。

2,在片选为CS6的的两片SDRAM里面,你的地址范围应该是0x30000000-0x33ffffff吧?那么映射以后也就是0x80000000-0x83ffffff。这样你不能访问0x84000000~0x87ffffff就很正常了。超出范围了!

3,即使你把sdram扩展成128M,但你的地址是不连续的,那个片选为CS7的两片的起始地址应该是0x38000000开始的地址。
上面说的希望会对你有所帮助!
FrankBIBI 2009-11-25
  • 打赏
  • 举报
回复
4片的扩展方式我没实践过,你可以看下bootloader中的eboot下的startup.s文件,关于eboot启动的做的内容吧,说实话这个我还没看过,我也是个新人 - -!我看过u-boot中的过程,在重定位后,建堆栈,清bss区,然后就跳到了start_armboot下的board.c进行相关硬件的初始化。我想eboot下也差不多吧~呵呵~(错了别骂我)。

内存的分配方式:g_oalAddressTable下
DCD 0x91800000, 0x58000000, 1 ; A/D convert register
DCD 0x91900000, 0x59000000, 1 ; SPI register
DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register
DCD 0x92000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0
DCD 0x00000000, 0x00000000, 0 ; end of table
你可以试下从0x92000000增加哦~就是用这个后面的虚拟地址对应扩展物理内存的地址:举例例如原先是
DCD 0x80000000, 0x30000000, 64
那现在扩展64M,就是DCD 0X94000000 0X34000000,64;

你试下吧~4片的搞懂了 别忘记来这里贴下怎么弄好的~我们等着学习学习。。。
gooogleman 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lightsoure 的回复:]
DCD    0x80000000, 0x30000000, 64      ; 32 MB DRAM BANK 6
修改后变成如下:
DCD    0x80000000, 0x30000000, 128      ; 32 MB DRAM BANK 6
那你的物理地址和虚拟地址都往上生了,物理地址到了0X37ffffff,虚拟地址到了0X87ffffff,0x84000000~0x87ffffff所对应的段不是已经有其它程序段占用了,会冲突?
虚拟地址0x80000000~0x83ffffff能够正确读写,是因为本来就是扩展的内存段,肯定读写正确的.我觉得你在扩展内存的时候,这个地址分配有问题吧,试着改下分配的方式把?
(我只做过2片64M扩展128的修改,4片的没试过,错的地方请见谅)呵呵~
[/Quote]

我也是,嘿嘿。
FrankBIBI 2009-11-24
  • 打赏
  • 举报
回复
DCD 0x80000000, 0x30000000, 64 ; 32 MB DRAM BANK 6
修改后变成如下:
DCD 0x80000000, 0x30000000, 128 ; 32 MB DRAM BANK 6
那你的物理地址和虚拟地址都往上生了,物理地址到了0X37ffffff,虚拟地址到了0X87ffffff,0x84000000~0x87ffffff所对应的段不是已经有其它程序段占用了,会冲突?
虚拟地址0x80000000~0x83ffffff能够正确读写,是因为本来就是扩展的内存段,肯定读写正确的.我觉得你在扩展内存的时候,这个地址分配有问题吧,试着改下分配的方式把?
(我只做过2片64M扩展128的修改,4片的没试过,错的地方请见谅)呵呵~
PowerAll888 2009-11-24
  • 打赏
  • 举报
回复
谢谢frankizhong的回复,我原先的内容如下,
; DCD 0x80000000, 0x30000000, 64 ; 32 MB DRAM BANK 6
; DCD 0x84000000, 0x10000000, 32 ; nGCS2: PCMCIA/PCCARD
; DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
修改后变成如下:
DCD 0x80000000, 0x30000000, 128 ; 32 MB DRAM BANK 6

pcmcia/pccard的驱动我没有使用,因此地址空间没有任何冲突。

另外,我知道stepldr中没有使用oemaddresstable,因此我在stepldr程序中只是对物理地址空间测试,即对0x30000000~0x37ffffff测试,没有问题;
在eboot中有启用mmu,有用到oemaddresstable,但是我在eboot中对虚拟地址0x84000000~0x87ffffff进行测试时,发现读写不正确;对虚拟地址0x80000000~0x83ffffff能够正确读写;
我因此检查了0x30010000地址的一级页表的所有内容,发现全部正确,就是说虚拟地址的和物理地址的映射关系是正确的;

我现在依然没有找到eboot中不能正确访问地址0x84000000~0x87ffffff的原因,高手帮忙啊!
frankizhong 2009-11-24
  • 打赏
  • 举报
回复
oemaddrtab_cfg.inc这个表一般在bootloader中不使用,通常是在Kernel\oal\startup.s中使用。
frankizhong 2009-11-24
  • 打赏
  • 举报
回复
你原先oemaddrtab_cfg.inc表中的0x84000000 - 0x88000000地址中影射的是什么,是否有冲突。
PowerAll888 2009-11-24
  • 打赏
  • 举报
回复
我个人认为是否修改stepldr堆栈地址空间0x33ff0000,对我在eboot中测试虚拟地址0x87ff0000的访问似乎关系不大;我现在对eboot程序中不能正确读写0x84000000~0x87ffffff虚拟地址空间感到非常困惑,我把一级页表(起始地址在0x30010000)中的4k个描述符的内容全部打出来检查了一遍,也看不出有任何问题。
PowerAll888 2009-11-24
  • 打赏
  • 举报
回复
我在option.h文件中作了下面的修改:
//modify(mod) 为了支持128M SDRAM
//#define _ISR_STARTADDRESS 0x33ffff00
//#define _MMUTT_STARTADDRESS 0x33ff8000
//#define _STACK_BASEADDRESS 0x33ff8000
//#define HEAPEND 0x33ff0000
#define _ISR_STARTADDRESS 0x37ffff00
#define _MMUTT_STARTADDRESS 0x37ff8000
#define _STACK_BASEADDRESS 0x37ff8000
#define HEAPEND 0x37ff0000
在option.inc文件中作了下面的修改:
;_STACK_BASEADDRESS EQU 0x33ff8000
;_MMUTT_STARTADDRESS EQU 0x33ff8000
;_ISR_STARTADDRESS EQU 0x33ffff00
_STACK_BASEADDRESS EQU 0x37ff8000
_MMUTT_STARTADDRESS EQU 0x37ff8000
_ISR_STARTADDRESS EQU 0x37ffff00
在stepldr.bib文件中作了下面的修改:
;modify(mod) for 128M SDRAM
; STACK 33ff5800 00001000 RESERVED
; RAM 33ff0000 00001000 RAM
STACK 37ff5800 00001000 RESERVED
RAM 37ff0000 00001000 RAM

修改后,重新编译了stepldr和eboot,但是测试的结果和以前一模一样,没有任何改善。

高手们继续帮忙啊!
gooogleman 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 veabol 的回复:]
stepldr的汇编文件设置栈空间之类的也需要修改的
[/Quote]

对,必须往后移动。

我使用ADS bootloader修改 128M SDRAM也是要这样做的。

内存控制器修改
MMU映射。

以及 堆栈等等都要涉及的。

gooogleman
博说医械研发 2009-11-23
  • 打赏
  • 举报
回复
stepldr的汇编文件设置栈空间之类的也需要修改的

19,520

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧