S5PV210之SDRAM初始化详解

参考朱老师教程视频讲解,视频链接地址:http://edu.51cto.com/lecturer/user_id-9584512.html

1、SDRAM定义和特性

SDRAM:Syncronized Dynamic Ramdam Access Memory,同步动态随机存储器
DDR:DDR就是DDR SDRAM,是SDRAM的升级版。(DDR:double rate,双倍速度的SDRAM)
DDR有好多代:DDR1 DDR2 DDR3 DDR4 LPDDR
SDRAM的特性:容量大、价格低、掉电易失性、随机读写、总线式访问。
SDRAM在整个硬件系统中是属于外部设备,通过地址总线和数据总线接口与SoC通信
九鼎的开发板使用的是三星产的K4T1G164QE型号,但是实际贴的是N2T1616G-AC型号,两款芯片兼容。

2、内存地址详解

这里写图片描述

九鼎开发板上使用了4片128MB内存,每片(1Gb = 128MB,共512MB),因为每片内存的数据总线都是16位的,所以由2片128MB的16位内存并联成32位内存,来和SoC进行32位总线通信。
单芯片内存(128MB)有14位地址总线和16位数据总线。分为:地址总线+数据总线+控制总线

3、内存寻址详解

这里写图片描述

在数据手册《NT5TU64M16GG-DDR2-1G-G-R18-Consumer》第10页的block diagram中,详解如上。
采用128Mb * 8 结构,每个Bank可寻址的大小是16MB,BA0-BA2用来选择8个Bank,寻址的方式:Row-Address+Column-Address。
故单内存芯片可寻址的大小为:16MB * 8 = 128MB
两片单芯片内存并联组合成32位数据总线,可与SoC进行总线通信,可寻址的内存大小便为:128MB+128MB= 256MB,在九鼎的开发板上采用了DRAM0+DRAM1分配内存地址,所以DRAM0和DRAM1都是256MB内存大小,合起来就是512MB内存大小。
所以开发板上DRAM0和DRAM1可寻址的有效范围分别为:
DRAM0:0x20000000 - 0x2FFFFFFF (256MB)
DRAM1:0x40000000 - 0x4FFFFFFF (256MB)
其他地址为非法地址,比如:0x30000000

4、SDRAM初始化详解

SDRAM初始化共涉及到两个文件:s5pv21.h 和 sdram_init.s
三星在官方的数据手册里(section 05 memory->DRAM CONTROLLER->1.2.1.3章节中)讲到DDR2的初始化过程,共27步,如下图:

这里写图片描述
这里写图片描述

这两个文件来源于朱老师视频课件,具体代码如下:
s5pv21.h :定义了SDRAM中所有的寄存器地址
sdram_init.s:定义了SDRAM中初始化的过程,此过程完全参考三星原厂要求的这27个步骤
在初始化过程中涉及到的寄存器分别在:
section 02 system->GENERAL PURPOSE INPUT/OUTPUT->2.2章节
section 05 memory->DRAM CONTROLLER->1.4章节
注意:在源码sdram_init.s中,朱老师修改了DMC0_MEMCONTROLDMC0_MEMCONFIG_0两个头文件的值,分别为:

// MemControl   BL=4, 1Chip, DDR2 Type, dynamic self refresh, force precharge, dynamic power down off
#define DMC0_MEMCONTROL     0x00202400 
// MemConfig0   256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed    
#define DMC0_MEMCONFIG_0    0x20F01323  

没修改前的值:

// MemControl   BL=4, 1Chip, DDR2 Type, dynamic self refresh, force precharge, dynamic power down off
#define DMC0_MEMCONTROL     0x00212400  
// MemConfig0   512MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
#define DMC0_MEMCONFIG_0    0x20E01323  

修改的原因:在官方的数据手册中DMC_MEMCONTROL 寄存器中应该如下图设置

S5PV210之SDRAM初始化详解_第1张图片
S5PV210之SDRAM初始化详解_第2张图片

在MemConfig0寄存器中的chip_mask选项中,因为反码的原因,我们选择F0,二进制位0b11110000,代表的意义是前面4个1,后面4个0,反码之后变为0F,二进制位0b00001111,代表的意义是前面4个0,后面4个1。因为我们的DRAM0起始地址为0x2000_0000,故芯片掩码过后是0x2FFF_FFFF,共256M。如果设置成E0,则二进制位11100000,反码后为00011111,掩码过后为0x3FFF_FFFF,共512M。与开发板设置的大小不符,开发板上选择了2片16位数据总线的128MB内存芯片组合成32位数据总线的256MB内存芯片,所以不能设置成E0,而应该设置成F0.

其他的设置都没什么变化,因为没用到DRAM0中的chip1,所以DRAM0中的DMC0_MEMCONFIG_1等寄存器设置采用默认值或者修改没什么影响。
只要DRAM0中的chip0按照三星官方数据手册中的那27步设置就可以了。
在链接规则文件中link.ldr,把其实地址设置为0x20000000, 代码如下

SECTIONS
{
    . = 0x20000000;

    .text : {
        start.o
        sdram_init.o
        * (.text)
    }

    .data : {
        * (.data)
    }

    bss_start = .; 
    .bss : {
        * (.bss)
    }

    bss_end  = .;   
}

代码可在朱老师视频资料中寻找,所在位置:

S5PV210之SDRAM初始化详解_第3张图片

你可能感兴趣的:(Linux学习总结)