天天看點

linux檢視記憶體是單通道還是雙通道,android /linux如何識别S5pv210 雙通道不連續的記憶體?...

這位哥設定寄存器映射硬體記憶體連續的方法倒是不錯

linux檢視記憶體是單通道還是雙通道,android /linux如何識别S5pv210 雙通道不連續的記憶體?...

不過我不相信linux不支援不連續的實體記憶體接法。

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