以下内容源于朱友鹏嵌入式课程的学习与整理,如有侵权请告知删除。
参考博客:s5pv210——初始化SDRAM - biaohc - 博客园
这里说的SDRAM,简单点理解就是内存。
一、SDRAM的简介
1、SDRAM的含义
SDRAM是Syncronized Dynamic Ramdam Access Memory的缩写,中文意思是“同步动态随机存储器”。我们常说的DDR,严格来说应该叫DDR SDRAM,它是SDRAM的升级版。
2、SDRAM的特点
(1)容量大、价格低、掉电易失性、随机读写、总线式访问(SDRAM通过地址总线和数据总线接口与SoC通信)。
(2)SDRAM 属于动态内存,需要初始化才能使用;而静态内存 SRAM开机上电后就可以直接运行,不需要初始化。P.s.NorFlash和NandFlash类似于SRAM和SDRAM的区别。
3、SDRAM的数据手册
SDRAM在系统中属于SoC外接设备,即外部外设。随着半导体技术发展,很多东西都逐渐集成到SoC内部,但仍在外部的有Flash、SDRAM、网卡芯片、音频编码模块等等。现在有一些高集成度的芯片也试图把这几个集成进去,做成真正的单芯片解决方案。
SDRAM很标准化,做SDRAM的厂商并不多,比较著名的公司有三星与金士顿。
三星官方的数据手册(指用户手册)没有芯片相关的参数设置信息,都是芯片选型与外观封装方面的信息。其中选型是给产品经理来看的,封装和电压等信息是给硬件工程师看的。我们软件工程师最关注的是工作参数信息,但是数据手册没有。
开发板原理图上使用的SDRAM是K4T1G164QQ。其中K表示三星产品,4表示是DRAM,T表示产品号码,1G表示容量(这里是指1Gb,也就是128MB。X210开发板一共用了4片相同的内存,所以总容量是512MB),16表示单芯片是16位宽的,4表示是4bank。
二、S5PV210的SDRAM介绍
1、原理图中SDRAM的相关部分
(1)X210核心板原理图
由X210核心板原理图可知,S5PV210共有2个内存端口,即DRAM0(对应原理图的内存port1)和DRAM1(对应原理图的内存port2)。
(2)X210开发板的内存地址范围
X210开发板最多支持1.5GB的内存。
DRAM0的内存地址范围:0x20000000~0x3FFFFFFF(512MB),对应引脚是Xm1xxxx。
DRAM1的内存地址范围:0x40000000~0x7FFFFFFF(1GB),对应引脚是Xm2xxxx。
实际开发板不需要这么大,比如X210开发板只有512MB内存,在DRAM0端口分布256MB,在DRAM1端口分布256MB。即X210开发板内存的合法地址是0x20000000~0x2FFFFFFF、0x40000000~0x4FFFFFFF。当DDR初始化完成之后,这些地址都可以使用;如果不慎使用不合法地址比0x30004000,则死路一条。
这些地址是可以重新设置的,见博客移植三星官方的uboot到x210开发板的第4部分。
(3)每个DDR端口都由3类总线构成
每个DDR端口都由3类总线构成,即地址总线、控制总线、数据总线。
地址总线是指Xmn_ADDR0~XMnADDR13这14根地址总线。
数据总线是指Xmn_DATA0~XMnDATA31这32根数据线,这说明我们用的是32位的内存。
(4)4片内存芯片
从原理图可以看出整个SDRAM,由4片16位内存芯片组成,每片内存芯片128MB,其中有两片内存芯片并联成32位内存,共256MB内存连接在DMC0,另两个内存芯片也并联成32位内存,共256MB连接在DMC1。
2、数据手册中SDRAM相关部分
下图来自数据手册《NT5TU64M16GG-DDR2-1G-G-R18-Consumer》第10页。
这个框图是128Mb×8结构的,8指的是8bank,每bank128Mbit(16MB),则共128MB。
每个bank内部通过row address(14位)* column address(10位)的方式来综合寻址,则寻址的范围是:2的14次方*2的10次方 = 2的24次方,对应16MB(128Mbit)内存。
210的DDR端口信号中有BA0~BA2,接在内存芯片的BA0~BA2上,这些引脚就是用来选择bank的。
三、汇编初始化SDRAM代码详解
1、SDRAM初始化代码
SDRAM的初始化工作,是由汇编函数sdram_asm_init完成的,它在sdram_init.S文件。
该文件是参考九鼎官方的uboot与九鼎裸机教程中对DDR的初始化内容写的。
注意汇编函数的最后,需要使用返回指令“ mov pc, lr ”。
2、27步初始化DDR
DDR的初始化,与SoC中的DDR控制器有关,也与具体的DDR芯片有关,也与开发板设计时DDR的连接方式有关。
X210开发板的内存连接方式是在DRAM0上连接256MB,在DRAM1上连接了256MB,因此初始化DRAM时分为2部分,第一部分初始化DRAM0,第二部分初始化DRAM1。
S5PV210的DDR初始化步骤,在用户数据手册第599页,可见初始化DDR共需27个步骤。
3、设置IO端口驱动强度
DDR芯片和S5PV210芯片是通过一些引脚连接的。DDR芯片工作时需要一定的驱动信号,这个驱动信号需要一定的电平水平才能抗干扰,所以需要设置这些引脚的驱动能力,使DDR正常工作。DRAM控制器对应的引脚设置为驱动强度2X。
4、DRAM port 时钟设置
代码的第128行到154行,对应27步中的第2到第4步。
主要是开启DLL(目的是为了倍频,因为内存的读取时钟由SoC提供,但频率太低,而内存的读写是很快的),然后等待锁存。
5、DMC0_MEMCONTROL
burst length=4,1chip,……对应值是0x00202400。
6、DMC0_MEMCONFIG_0 \ DMC0_MEMCONFIG_1
它们分别是DRAM0通道中memory chip0、memory chip1的参数设置寄存器。
三星设置DRAM0通道,允许接2片256MB的内存,分别叫memory chip0和memory chip1,分别用这两个寄存器来设置它的参数。按照三星的设计,chip0的地址应该是0x20000000到0x2FFFFFFF,然后chip1的地址应该是0x30000000~0x3FFFFFFF。但是X210开发板实际在DRAM0端口只接了256MB的内存,所以只用了chip0,没有使用chip1。按照这个推论,DMC0_MEMCONFIG_0有用,而DMC0_MEMCONFIG_1无用,所以可以直接给它默认值。
7、DMC_DIRECTCMD
这个寄存器是一个命令寄存器,210通过向这个寄存器写值来向DDR芯片发送命令,这些命令应该都是用来配置DDR芯片工作参数。
总结
DDR配置比较复杂与细致,需要按照DDR控制器的时序要求来做,其中很多参数要结合DDR芯片本身的参数来定,还有些参数是时序参数,要去详细计算。我们对DDR初始化的态度就是学会这种思路和方法,结合文档和代码能看懂,会算一些常见的参数即可。