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)三星官方的数据手册上没有芯片相关的参数设置信息,都是芯片选型与外观封装方面的信息。
- 选型是给产品经理来看的;
- 封装和电压等信息是给硬件工程师看的;
- 软件工程师最关注的是工作参数信息,但是数据手册没有。
- 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.****.net/oqqhutu12345678/article/details/70196133的第4部分。
(3)原理图中每个DDR端口都由3类总线构成
- 地址总线(Xmn_ADDR0~XMnADDR13共14根地址总线);
- 控制总线;
- 数据总线(Xmn_DATA0~XMnDATA31共32根数据线);
- 分析:从数据总线的位数可以看出,我们用的是32位的(物理)内存。
- 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相关部分
(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.****.net/oqqhutu12345678/article/details/70135880