S5PV210 内存配置(地址空间和片选)

被内存的事折腾了几天了,昨天在CSDN发了个提问贴,然后顺着一点一点的往下试,既然试出来了。在提问贴里有实验的过程。这就讲一下最终的设置吧。

S5PV210有两个独立的内存控制器:DMC0和DMC1,每个控制器又有两个片选:CS0和CS1。它可以支持16bits和32bits的内存。两个控制器对应的地址空间是
DMC0 0x2000_0000 ~ 0x3FFF_FFFF
DMC1 0x4000_0000 ~ 0x7FFF_FFFF
内存控制器的配置寄存器也分为两块,
DMC0 0xF000_xxxx
DMC1 0xF140_xxxx
这一块主要需要设置的寄存器设置是:MEMCONTROL、MEMCONFIG0、MEMCONFIG1
这些是基本的。然后剩下的就要看你的内存是咋接的了。
我这块开发板用的是4片1Gb x16的内存,两片两片按数据线的高16bits和低16bits组成两组32bits的256M,分别挂载了DMC0的CS0和DMC1的CS1。
然后看一下三个寄存器的相应配置了。

MEMCONTROL里面有个num_chip,这个说白了就是使用了几个CS信号。像我的虽然每个控制器上挂了两块内存,但是他们是按高 16bits和低 16bits组成的32bits挂在CS0上。只用了一个CS0,对于210来说就是一片,所以设置为 0x0 = 1 chip
然后 MEMCONTROL的mem_width,当然就设为 0x2 = 32-bit 了。
其它的mem_type、bl啥的自己看吧,不讲了。

MEMCONFIG0和MEMCONFIG1是一样的,一个设置相应控制器的CS0,一个设置CS1。
MEMCONFIG里面的chip_bank、chip_row、chip_col设置要自己找内存的手册了。这个最好不要设错了,就像我开始把chip_col多设了一根,我写0x21xx_xxxx的值,0x23xx_xxxx的值也会跟着变了(其实内存里面都指向同一个区域了)
chip_map的设置在13.2.2 Address Mapping里面讲了,后来试下来Linear和 Interleaved都能跑,只是在内存里面放的位置不一样吧。
chip_base和chip_mask是最让人疑惑的了,我折腾了半天也都是在这。这两个寄存器合起来,可以决定DMC0/DMC1 CS0和CS1下挂着的内存对应哪一段内存地址。我理解的是当你要放问地址0x21xx_xxxx的地址的时候,DMC0会将访问地址的高8bits 0x21和chip_mask求与,要是等于chip_base,他就会使用相应的控制器的相应的片选去读数据。就像假如
DMC0_MEMCONFIG0   chip_base =  0x20      chip_mask=0xf8
DMC0_MEMCONFIG1   chip_base =  0x28      chip_mask=0xf8
当你要访问的地址是 0x22xx_xxxx的时候,  (0x22 & 0xf8) ==  0x20,所以使用CS0
那要是  0x2exx_xxxx呢?     (0x2e & 0xf8) == 0x28 ,当然使用CS1了。
也就是说CS0对应的是 0x2000_0000 ~ 0x27ff_ffff,128M
CS1对应的是 0x2800_0000 ~ 0x28ff_ffff,128M
同样的每个CS下都是256M呢?
DMC0_MEMCONFIG0   chip_base =  0x20      chip_mask=0xf0          // 0x2000_0000 ~ 0x2fff_ffff     256M
DMC0_MEMCONFIG1   chip_base =  0x30      chip_mask=0xf0          // 0x3000_0000 ~ 0x3fff_ffff     256M
DMC0和DMC1配置一样,但是DMC0只能配置为0x2000_0000~0x3fff_ffff的空间,DMC1只能配置为0x4000_0000~0x5fff_ffff的空间。这是DMC的地址空间决定的,我就是在这郁闷了两天。
我的板子上面DMC0和DMC1上都只使用了CS0,然后我的设置就是
DMC0_MEMCONFIG0   chip_base =  0x20      chip_mask=0xf0          // 0x2000_0000 ~ 0x2fff_ffff     256M
DMC1_MEMCONFIG0   chip_base =  0x40      chip_mask=0xf0          // 0x4000_0000 ~ 0x4fff_ffff     256M  注意,DMC1只能从0x4000_0000开始。
问题又来了,这样内存地址空间不就不连续了嘛?
后来的解决办法,内存的地址空间不从0x2000_0000开始,从0x3000_0000开始,不就正好接上DMC1的了。只是CONFIG_SYS_SDRAM_BASE和CONFIG_SYS_TEXT_BASE相应的改一下
DMC0_MEMCONFIG0   chip_base =  0x30      chip_mask=0xf0          // 0x3000_0000 ~ 0x3fff_ffff     256M
DMC1_MEMCONFIG0   chip_base =  0x40      chip_mask=0xf0          // 0x4000_0000 ~ 0x4fff_ffff     256M

我在u-boot-2011.12上移植的,现在已经跑起来了。内存这部分的初始化,用里面的代码跑不起来。后来还是移植的开发板的,后来发现开发板的这一部分配置也是有问题的。等我有时间了再研究研究这一部分的配置。

原文地址 http://blog.chinaunix.net/uid-122754-id-3144920.html

你可能感兴趣的:(S5PV210 内存配置(地址空间和片选))