天天看點

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

根據上面步驟操作,u-boot是無法直接起來的,需要修改頂層Makefile -       @echo "TEXT_BASE = 0x23e00000" > $(obj)board/samsung/smdkc110/config.mk

+       @echo "TEXT_BASE = 0x33e00000" > $(obj)board/samsung/smdkc110/config.mk

并修改配置檔案中 -#define MEMORY_BASE_ADDRESS    0x20000000

+#define MEMORY_BASE_ADDRESS    0x30000000

-#define CFG_UBOOT_BASE         0x23e00000

+#define CFG_UBOOT_BASE         0x33e00000

隻有這樣,u-boot才能起來,如果要加載kernel,還得修改linux的加載位址和核心中的相關配置(Image的入口位址等 Makefile.boot)

繼續閱讀