ARM 汇编初始化 SDRAM 详解
创始人
2024-04-22 00:41:01
0

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

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,······  对应值是0x00202400DMC0_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中完全相同。

在这里插入图片描述


源自朱有鹏老师.

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...