ARM 汇编初始化 SDRAM 详解

一、初始化代码框架介绍(函数调用和返回、步骤等)

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

  1. 首先,DDR 初始化和 SoC(准确说是和 SoC 中的 DDR 控制器)有关,也和开发板使用的DDR 芯片有关,和开发板设计时 DDR 的连接方式也有关。
  2. S5PV210 的 DDR 初始化步骤在 SoC 数据手册:section 05_memory 1.2.1.3 DDR2 Initialization sequence for DDR2 memory type 这个章节。可知初始化 DDR 共需 27 个步骤。

在这里插入图片描述

  1. 之前分析过 X210 的内存连接方式是:在 DRAM0 上连接 256MB,在 DRAM1 上连接了256MB 。所以初始化 DRAM 时分为 2 部分,第一部分初始化 DRAM0,第二部分初始化 DRAM1.
  2. 我们的代码不是自己写的,这个代码来自于:第一,九鼎官方的 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中完全相同。

在这里插入图片描述


源自朱有鹏老师.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值