一、初始化代码框架介绍(函数调用和返回、步骤等)
SDRAM 初始化使用一个函数 sdram_asm_init ,函数在 sdram_init.S 文件中实现,是一个汇编函数。
强调:汇编实现的函数在返回时需要明确使用返回指令(mov pc, lr)
$ ls -l
total 59
-rw-r--r-- 1 luokaijie 197121 365 Jul 8 2015 Makefile
-rw-r--r-- 1 luokaijie 197121 1048 Jul 8 2015 led.c
-rw-r--r-- 1 luokaijie 197121 198 Jul 8 2015 link.lds
-rw-r--r-- 1 luokaijie 197121 2627 Jun 29 2015 mkv210_image.c
-rw-r--r-- 1 luokaijie 197121 28513 May 24 2012 s5pv210.h
-rw-r--r-- 1 luokaijie 197121 12809 Jul 10 2015 sdram_init.S
-rw-r--r-- 1 luokaijie 197121 2102 Jul 10 2015 start.S
-rwxr-xr-x 1 luokaijie 197121 72 Jun 29 2015 write2sd*
1、27 步初始化 DDR2
- 首先,DDR 初始化和 SoC(准确说是和 SoC 中的 DDR 控制器)有关,也和开发板使用的DDR 芯片有关,和开发板设计时 DDR 的连接方式也有关。
- S5PV210 的 DDR 初始化步骤在 SoC 数据手册:
section 05_memory 1.2.1.3 DDR2 Initialization sequence for DDR2 memory type
这个章节。可知初始化 DDR 共需 27 个步骤。
- 之前分析过 X210 的内存连接方式是:在 DRAM0 上连接 256MB,在 DRAM1 上连接了256MB 。所以初始化 DRAM 时分为 2 部分,第一部分初始化 DRAM0,第二部分初始化 DRAM1.
- 我们的代码不是自己写的,这个代码来自于:第一,九鼎官方的 uboot 中;第二,参考了九鼎的裸机教程中对 DDR 的初始化;第三,有些参数是朱有鹏根据自己理解修改过的。
2、设置 IO 端口驱动强度
因为 DDR 芯片和 S5PV210 之间是通过很多总线连接的,总线的物理表现就是很多个引脚,也就是说 DDR 芯片和 S5PV210 芯片是通过一些引脚连接的。DDR 芯片工作时需要一定的驱动信号,这个驱动信号需要一定的电平水平才能抗干扰,所以需要设置这些引脚的驱动能力,使 DDR正常工作。
DRAM 控制器对应的引脚设置为驱动强度 2X(我也不知道为什么是2X,什么时候设置成3X 4X?,这东西只能问 DDR 芯片厂商或者 SoC 厂商,我们一般是参考原厂给的代码)
3、DRAM port 时钟设置
从代码第 128 行到 154 行。主要是开启 DLL(dram pll)然后等待锁存。
这段代码对应 27 步中的第 2 到第 4 步。
4、DMC0_MEMCONTROL
DMC0_MEMCONTROL
burst length=4,1chip,······ 对应值是0x00202400
DMC0_MEMCONFIG_0
DRAM0 通道中 memory chip0 的参数设置寄存器
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 .(我们虽然是2片芯片,然后这两片是并联形成 32 位内存的,逻辑上只能算 1 片)。按照这个推论,DMC0_MEMCONFIG_0 有用,而 DMC0_MEMCONFIG_1 无用,所以我直接给他了默认值。
5、DMC_DIRECTCMD
这个寄存器是个命令寄存器,我们 210 通过向这个寄存器写值来向 DDR 芯片发送命令(通过命令总线),这些命令应该都是用来配置 DDR 芯片工作参数。
总结:DDR 配置过程比较复杂,基本上是按照 DDR 控制器的时序要求来做的,其中很多参数要结合 DDR 芯片本身的参数来定,还有些参数是时序参数,要去详细计算。所以 DDR 配置非常繁琐、细致、专业。所以我们对 DDR 初始化的态度就是:学会这种思路和方法,结合文档和代码能看懂,会算一些常见的参数即可。
6、重定位代码到 SDRAM 中
DRAM 初始化之后,实际上重定位代码过程和之前重定位到SRAM中完全相同。
源自朱有鹏老师.