s5pv210——SDRAM的初始化

以下内容源于朱友鹏《物联网大讲坛》课程的学习,以及博客http://www.cnblogs.com/biaohc/p/6346949.html的学习整理,如有侵权,请告知删除。


一、SDRAM引入

1、SDRAM(Syncronized Dynamic Ramdam Access Memory,同步动态随机存储器)

  • DDR:严格来说应该叫DDR SDRAM((DDR:double data rate,双倍速度的SDRAM)),它是SDRAM的升级版。
  • DDR有好多代:DDR1,DDR2,DDR3,DDR4,LPDDR;

2、SDRAM的特性

  • 容量大、价格低、掉电易失性、随机读写、总线式访问;
  • SDRAM / DDR都属于动态内存(相对于静态内存SRAM),都需要先运行一段初始化代码来初始化才能使用,而SRAM开机上电后就可以直接运行;
  • NorFlash和NandFlash(硬盘)类似于SDRAM和SRAM的区别。
  • 由于硬件特性的限制,启动代码比较复杂。研究裸机是为了研究uboot,在uboot中充分利用了硬件的各种特性,处理了硬件复杂性。

3、SDRAM数据手册带读

(1)SDRAM在系统中属于SoC外接设备

  • 外部外设;
  • 随着半导体技术发展,很多东西都逐渐集成到SoC内部。但仍在外部的有:Flash、SDRAM/DDR、网卡芯片如DM9000、音频Codec。

(2)SDRAM通过地址总线和数据总线接口(总线接口)与SoC通信。

(3)SDRAM很标准化,做SDRAM的厂商并不多(三星,金士顿等)。

(4)三星官方的数据手册上没有芯片相关的参数设置信息,都是芯片选型与外观封装方面的信息。

  • 选型是给产品经理来看的;
  • 封装和电压等信息是给硬件工程师看的;
  • 软件工程师最关注的是工作参数信息,但是数据手册没有
(5)开发板原理图上使用的是K4T1G164QQ。
  • K表示三星产品;
  • 4表示是DRAM;
  • T表示产品号码;
  • 1G表示容量(1Gb,等于128MB。X210开发板上一共用了4片相同的内存,所以总容量是128×4=512MB);
  • 16表示单芯片是16位宽的;
  • 4表示是4bank;


二、s5pv210的SDRAM介绍

1、原理图中SDRAM相关部分

(1)S5PV210共有2个内存端口,分别叫DRAM0(对应原理图的内存port1)和DRAM1(对应原理图的内存port2):

  • DRAM0   内存地址范围:0x20000000~0x3FFFFFFF(512MB),对应引脚是Xm1xxxx
  • DRAM1   内存地址范围:0x40000000~0x7FFFFFFF(1024MB),对应引脚是Xm2xxxx

(2)结论

  • 210最多支持内存为1.5GB,如果给210更多的内存CPU就无法识别。
  • 实际开发板不一定要这么多,譬如我们X210开发板就只有512MB内存,连接方法是在DRAM0端口分布256MB,在DRAM1端口分布了256MB。
  • 210开发板上内存合法地址是:0x20000000~0x2FFFFFFF(256MB) + 0x40000000~0x4FFFFFFF(256MB)。当板子上DDR初始化完成之后,这些地址都是可以使用的;如果使用了其他地址譬如0x30004000就是死路一条。但这些地址是可以重新设置的,见博客http://blog.csdn.net/oqqhutu12345678/article/details/70196133的第4部分。

(3)原理图中每个DDR端口都由3类总线构成

s5pv210——SDRAM的初始化

s5pv210——SDRAM的初始化

  • 地址总线(Xmn_ADDR0~XMnADDR13共14根地址总线);
  • 控制总线;
  •  数据总线(Xmn_DATA0~XMnDATA31共32根数据线);
  • 分析:从数据总线的位数可以看出,我们用的是32位的(物理)内存
(4)原理图中画出4片内存芯片的一页,可以看出

s5pv210——SDRAM的初始化s5pv210——SDRAM的初始化

  • X210开发板共使用4片内存(每片1Gb=128MB,共512MB);
  • 每片内存的数据总线都是16位的(单芯片是16位内存);
  • 如何由16位内存得到32位内存呢?可以使用并联方法。在原理图上横向的2颗内存芯片就是并联连接的。并联时地址总线接法一样,但是数据总线要加起来。这样连接相当于在逻辑上可以把这2颗内存芯片看成是一个(这一个芯片是32位的,接在Xm1端口上)。
  • 从原理图可以看出整个SDRAM,由4对16位内存芯片组成,每个内存芯片128MB,其中有两个内存芯片并联成32位内存,共256MB内存连接在DMC0,另两个内存芯片也并联成32位内存,共256MB连接在DMC1。

2、数据手册中SDRAM相关部分

s5pv210——SDRAM的初始化

(1)上图来自数据手册《NT5TU64M16GG-DDR2-1G-G-R18-Consumer》第10页的block diagram。

(2)图解:

  • 这个框图是128Mb×8结构的。这里的8指的是8bank,每bank128Mbit(16MB),则共16MB*8=128MB。
  • 210的DDR端口信号中有BA0~BA2,接在内存芯片的BA0~BA2上,这些引脚就是用来选择bank的。
  • 每个bank内部有128Mb,通过row address(14位)*  column address(10位)的方式来综合寻址(像二维坐标),则一共能寻址的范围是:2的14次方*2的10次方 = 2的24次方,对应16MB(128Mbit)内存。

三、汇编初始化SDRAM详解1

1、初始化代码框架介绍

  • SDRAM的初始化,实际是调用一个函数sdram_asm_init。
  • 函数在sdram_init.S文件中实现,是一个汇编函数。
  • 调用汇编实现的函数在返回时,需要明确使用返回指令(mov pc, lr)。

2、27步初始化DDR2

(1)DDR初始化和SoC(准确说是和SoC中的DDR控制器)有关,也和开发板使用的DDR芯片有关,和开发板设计时DDR的连接方式也有关。

(2)S5PV210的DDR初始化步骤在SoC数据手册:1.2.1.3 DDR2这个章节。P599

  • 初始化DDR共需27个步骤。

(3)X210的内存连接方式是:在DRAM0上连接256MB,在DRAM1上连接了256MB。

  • 初始化DRAM时分为2部分,第一部分初始化DRAM0,第二部分初始化DRAM1。

(4)初始化代码来源sdram_init.S文件

  • 第一,九鼎官方的uboot中;
  • 第二,参考九鼎的裸机教程中对DDR的初始化;
  • 第三,有些参数可以根据自己理解修改过。

3、设置IO端口驱动强度

  • DDR芯片和S5PV210芯片是通过一些引脚连接的。
  • DDR芯片工作时需要一定的驱动信号,这个驱动信号需要一定的电平水平才能抗干扰,所以需要设置这些引脚的驱动能力,使DDR正常工作。
  • DRAM控制器对应的引脚设置为驱动强度2X。

4、DRAM port 时钟设置

  • 从代码第128行到154行。主要是开启DLL(DRAM PLLl)(目的是为了倍频,因为内存的读取时钟由SoC提供,但太低,而内存的读写是很快的),然后等待锁存。
  • 这段代码对应27步中的第2到第4步。


四、汇编初始化SDRAM详解2

1、DMC0_MEMCONTROL

burst length=4,1chip,……对应值是0x00202400

2、DMC0_MEMCONFIG_0

DRAM0通道中memory chip0的参数设置寄存器

3、DMC0_MEMCONFIG_1

DRAM0通道中memory chip1的参数设置寄存器


总结:

  • 三星设置DRAM0通道,允许我们接2片256MB的内存,分别叫memory chip0和memory chip1,分别用这两个寄存器来设置它的参数。按照三星的设计,chip0的地址应该是0x20000000到0x2FFFFFFF,然后chip1的地址应该是0x30000000~0x3FFFFFFF.各自256MB。
  • 但是X210开发板实际在DRAM0端口只接了256MB的内存,所以只用了chip0,没有使用chip1。按照这个推论,DMC0_MEMCONFIG_0有用,而DMC0_MEMCONFIG_1无用,所以可以直接给它默认值。

4、DMC_DIRECTCMD

这个寄存器是个命令寄存器,210通过向这个寄存器写值来向DDR芯片发送命令(通过命令总线),这些命令应该都是用来配置DDR芯片工作参数。


总结:

  • DDR配置过程比较复杂,基本上是按照DDR控制器的时序要求来做的,其中很多参数要结合DDR芯片本身的参数来定,还有些参数是时序参数,要去详细计算。所以DDR配置非常繁琐、细致、专业。
  • 我们对DDR初始化的态度就是:学会这种思路和方法,结合文档和代码能看懂,会算一些常见的参数即可。

5、重定位代码到SDRAM中

DRAM初始化之后,实际上重定位代码过程和之前重定位到SRAM中完全相同,只是链接地址不一样。

假如我们通过usb下载到0xD002_0010,那么运行地址就是0xD002_0010,而在SRAM中重定位是指链接地址在SRAM的地址空间内,重定位到SDRAM中是指链接地址写成SDRAM的地址范围内的一个地址值。

见博客http://blog.csdn.net/oqqhutu12345678/article/details/70135880