u-boot分析(七)----内存初始化

u-boot分析(七)

  上篇博文我们按照210的启动流程,分析到了时钟初始化,今天我们继续按照u-boot的启动流程对内存的初始化进行分析。

今天我们会用到的文档:

1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949

2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965

3.        210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)

4.        内存芯片手册:大家根据自己的内存芯片去找相应的芯片手册

内存的初始化也是比较复杂我们今天会通过以下几点,对内存的初始化进行介绍:

1.      内存基本分类

2.      深入认识内存

3.      编程分析

内存基本分类

为了让大家对内存有个初步的认识,简单介绍其分类

1.       DRAM

有小电容组成,需要刷新(充电),所以导致速度较慢

1)        SDRAM(2440常用)

2)        DDR(6410常用)

3)        DDR2(210常用)

4)        其他衍生产品

以上几种都是速度依次增高。

2.       SRAM

不用刷新,速度快,价格昂贵,比如我们前面提到的垫脚石就是采用的是SRAM

深入认识DRAM

1.       表结构:

内存的内部结构如同一张表格,我们称为l-bank类似与下图,其中每个单元格中可以存放数据

2.       内存寻址

内存经过以下信息进行寻址

1)        L-Bank

一方面由于技术、成本等原因,不可能只做一个全容量的L-Bank,而另一方面由于SDRAM的工作原理限制,单一的L-Bank将会造成非常严重的寻址冲突,大幅降低内存效率。所以人们在SDRAM内部分割成多个L-Bank。

因此我们在寻址时就要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择行列地址进行寻址。

2)        行地址(Row

3)        列地址(Column

上面已经说明了内存的寻址方法,其实其内部构造如下图

3.       内存芯片容量的计算

内存芯片的容量就是所有的L-Bank中的存储单元的总容量,那么我们可以得到总的存储单元数量

存储单元数量=行数×列数(一个L-Bank的存储单元数量)×L-Bank的数量

那么如何知道一个存储单元的容量呢?其实在内存芯片的文档中都会有说明,大家可以自己找找看。大家也可以参考其芯片命名进行计算,这里有篇博文简单分析了常见内存芯片的命名规则http://blog.chinaunix.net/uid-20964486-id-1831487.html

经过上述内容我们对内存有了一定的了解,接下来我们分析其编程方法。

编程分析

我们的芯片通过存储控制器对内存进行访问,我们对内存的初始化起始就是对控制器的初始化,所以我们知道怎么对存储控制器进行初始化,下面以210为例进行分析

1.       初始化流程

通过阅读210的芯片手册(2440、6410也有类似的东西),很轻松我们在可以找到其给出的初始化配置过程

2.       内存的位置

本以为拿到了内存的初始化流程,就可以开始写代码了,但是在写的过程中会发现其有部分硬件的东西需要了解一下,首先是内存的位置,再以前的博文中说过地址布局的问题,下面以210为例进行分析:

从上图可知210的DRAM分为两个区域,DRAM0和DRAM1总共为1.5G大小,分别通过DMC0和DMC1进行控制,我们要根据自己手头的板子进行确定。

3.       代码分析

有了上面的DDR2的初始化流程和地址布局的分析,我们就不难理解210内存的初始化代码,由于u-boot代码太多看着不太清楚,我将自己按照流程写的代码给大家分享一下

  1 #define DMC_PHYCONTROL0 0xf0000018
  2 #define DMC_PHYCONTROL1 0xf000001c
  3 #define DMC_CONCONTROL  0xf0000000
  4 #define DMC_MEMCONTROL  0xf0000004
  5 #define DMC_MEMCONFIG0  0xf0000008
  6 #define DMC_MEMCONFIG1  0xf000000c
  7 #define DMC_PRECHCONFIG 0xf0000014
  8 #define DMC_TIMINGAREF     0xf0000030
  9 #define DMC_TIMINGROW     0xf0000034
 10 #define DMC_TIMINGDATA     0xf0000038
 11 #define DMC_TIMINGPOWER 0xf000003c
 12 #define DMC_PHYSTATUS   0xf0000040
 13 #define DMC_DIRECTCMD     0xf0000010
 14 #define DMC_PWRDNCONFIG 0xf0000028
 15
 16 #define DMC0_MEMCONTROL            0x00202400
 17 #define DMC0_MEMCONFIG_0        0x20F00313
 18 #define DMC0_MEMCONFIG_1        0x00F00313
 19
 20 #define DMC0_TIMINGA_REF        0x00000618
 21 #define DMC0_TIMING_ROW         0x2B34438A
 22 #define DMC0_TIMING_DATA        0x24240000
 23 #define DMC0_TIMING_PWR         0x0BDC0343
 24
 25
 26
 27 .globl init_mem
 28 init_mem:
 29     @ step 2.1
 30     ldr    r0, =DMC_PHYCONTROL0
 31     ldr    r1, =0x00101000
 32     str    r1, [r0]
 33
 34     ldr    r0, =DMC_PHYCONTROL1
 35     ldr    r1, =0x00000086
 36     str    r1, [r0]
 37
 38     @ step 2.2
 39     ldr    r0, =DMC_PHYCONTROL0
 40     ldr    r1, =0x00101002
 41     str    r1, [r0]
 42
 43
 44
 45     @ step 4
 46     ldr    r0, =DMC_PHYCONTROL0
 47     ldr    r1, =0x00101003
 48     str    r1, [r0]
 49
 50     @ step 5
 51     ldr    r0, =DMC_CONCONTROL
 52     ldr    r1, =0x0FFF1350
 53     str    r1, [r0]
 54
 55     @ step 6
 56     ldr    r0, =DMC_MEMCONTROL
 57     ldr    r1, =DMC0_MEMCONTROL
 58     str    r1, [r0]
 59
 60     @ step 7
 61     ldr    r0, =DMC_MEMCONFIG0
 62     ldr    r1, =DMC0_MEMCONFIG_0
 63     str    r1, [r0]
 64
 65     @ step 8
 66     ldr    r0, =DMC_PRECHCONFIG
 67     ldr    r1, =0xFF000000
 68     str    r1, [r0]
 69
 70     @ step 9.1
 71     ldr    r0, =DMC_TIMINGAREF
 72     ldr    r1, =DMC0_TIMINGA_REF
 73     str    r1, [r0]
 74
 75     @ step 9.2
 76     ldr    r0, =DMC_TIMINGROW
 77     ldr    r1, =DMC0_TIMING_ROW
 78     str    r1, [r0]
 79
 80     @ step 9.3
 81     ldr    r0, =DMC_TIMINGDATA
 82     ldr    r1, =DMC0_TIMING_DATA
 83     str    r1, [r0]
 84
 85     @ step 9.4
 86     ldr    r0, =DMC_TIMINGPOWER
 87     ldr    r1, =DMC0_TIMING_PWR
 88     str    r1, [r0]
 89
 90     @ step 11
 91 wait_lock:
 92     ldr    r0, =DMC_PHYSTATUS
 93     ldr    r1, [r0]
 94     and    r2, r1, #0x4
 95     cmp    r2, #0x4
 96     bne    wait_lock
 97
 98     @ step 14
 99     ldr    r0, =DMC_DIRECTCMD
100     ldr    r1, =0x07000000
101     str    r1, [r0]
102
103     @ step 16
104     ldr    r1, =0x01000000
105     str    r1, [r0]
106
107     @ step 17
108     ldr    r1, =0x00020000
109     str    r1, [r0]
110
111     @ step 18
112     ldr    r1, =0x00030000
113     str    r1, [r0]
114
115     @ step 19
116     ldr    r1, =0x00010400
117     str    r1, [r0]
118
119     @ step 20
120     ldr    r1, =0x00000542
121     str    r1, [r0]
122
123     @ step 21
124     ldr    r1, =0x01000000
125     str    r1, [r0]
126
127     @ step 22.1
128     ldr    r1, =0x05000000
129     str    r1, [r0]
130
131     @ step 22.2
132     ldr    r1, =0x05000000
133     str    r1, [r0]
134
135     @ step 23
136     ldr    r1, =0x00000442
137     str    r1, [r0]
138
139     @ step 25.1
140     ldr    r1, =0x00010780
141     str    r1, [r0]
142
143     @ step 25.2
144     ldr    r1, =0x00010400
145     str    r1, [r0]
146
147     @ step 26, repeat step14~step25
148     ldr    r1, =0x07100000
149     str    r1, [r0]
150
151     ldr    r1, =0x01100000
152     str    r1, [r0]
153
154     ldr    r1, =0x00120000
155     str    r1, [r0]
156
157     ldr    r1, =0x00130000
158     str    r1, [r0]
159
160     ldr    r1, =0x00110400
161     str    r1, [r0]
162
163     ldr    r1, =0x00100542
164     str    r1, [r0]
165
166     ldr    r1, =0x01100000
167     str    r1, [r0]
168
169     ldr    r1, =0x05100000
170     str    r1, [r0]
171
172     ldr    r1, =0x05100000
173     str    r1, [r0]
174
175     ldr    r1, =0x00100442
176     str    r1, [r0]
177
178     ldr    r1, =0x00110780
179     str    r1, [r0]
180
181     ldr    r1, =0x00110400
182     str    r1, [r0]
183
184     @ step 27
185     ldr     r0, =DMC_CONCONTROL
186     ldr    r1, =0x0FF02030
187     str    r1, [r0]
188
189     ldr     r0, =DMC_PWRDNCONFIG
190     ldr    r1, =0xFFFF00FF
191     str    r1, [r0]
192
193     ldr     r0, =DMC_CONCONTROL
194     ldr    r1, =0x00202400
195     str    r1, [r0]
196
197     mov    pc, lr
时间: 2024-11-08 21:54:06

u-boot分析(七)----内存初始化的相关文章

【嵌入式开发】裸机引导操作系统和ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

[嵌入式开发]ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 ) 一. 内存 简介 1. 两大内存分类 ( 1 ) DRAM 简介 ( 定期刷新 | 速度慢 | 成本低 ) DRAM 简介 : 1.硬件描述 : DRAM 基本由一个个小电容基本原件组成, 电容的两端保留电荷; 2.优缺点描述 : ① 优点 : 成本很低, 很便宜; ② 缺点 : 需要 定期刷新数据, 速度较慢; a.

Nouveau源码分析(七): 各SUBDEV/ENGINE初始化 (1)

Nouveau源码分析(七) 虽然各个SUBDEV/EGINE的初始化实际还是在nouveau_drm_load里,但还是换个标题吧. 等把各个SUBDEV/ENGINE之类的说完再换回去. 上次已经按着初始化的顺序介绍了一下各个subdev的用途,现在按顺序,首先来看VBIOS的ctor函数: // /drivers/gpu/drm/nouveau/core/subdev/bios/base.c 537 struct nouveau_oclass 538 nouveau_bios_oclass

JAVA 从GC日志分析堆内存 第七节

JAVA 从GC日志分析堆内存 第七节 在上一章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西.因此这章我们通过分析GC日志来一步步讲解如何细化设置堆内存. 首先我们来了解几个相关的参数: -XX:+PrintGCDetails:用于告诉虚拟机回收垃圾的时候顺便打印日志. -Xloggc:路径 :将打

第3阶段——内核启动分析之start_kernel初始化函数(5)

内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数真正理解需要对linux相关体系有很深的了解后才能明白 代码如下: asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __sto

Linux内存初始化(一)

一.前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众.另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成在十几秒的镜头中,可以让观众很快的了解一个事物的发展脉络.对应到技术层面,慢镜头有点类似情景分析,把每一行代码都详细的进行解析,了解技术的细节.快镜头类似数据流分析,勾勒一个过程中,数据结构的演化.本文采用了快镜头的方法,对内存初始化部分进行描述,不纠缠于具体函数的代码实现,只是希望能给大家一个概略

ok6410内存初始化--未完待续

•DRAM:它的基本原件是小电容,电容可以在两个极板上保留电荷,但是需要定期的充电(刷新),否则数据会丢失.缺点:由于要定期刷新存储介质,存取速度较慢. •SRAM:它是一种具有静止存取功能的内存,不需要定期刷新电路就能保存它内部存储的数据.其优点:存取速度快; 但是缺点是:功耗大,成本高.常用作存储容量不高,但存取速度快的场合,比如steppingstone. 在嵌入式硬件体系中,除了CPU内部的”垫脚石”采用SRAM外,板载内存一般会采用DRAM,而DRAM又可以分为SDRAM,DDR,DD

cocos2d-x 源码分析 : Ref (CCObject) 源码分析 cocos2d-x内存管理策略

源码版本来自3.x,转载请注明 cocos2d-x 源码分析总目录: http://blog.csdn.net/u011225840/article/details/31743129 1.Ref,AutoreleasePool,PoolManager Ref中包含了一个叫referenceCount的引用计数,当一个Ref类的变量被new的时候,其referenceCount的引用计数被置为1. 其中有三个重要的操作,retain,release,autorelease,下面源码分析时会详细说明

SDL2源代码分析1:初始化

打算花一段时间研究一下SDL的内部代码.前面几篇文章<最简单的视音频播放示例1:总述>中记录了视频.音频播放的技术,文中提及了SDL实际上封装了Direct3D,DirectSound这类的底层API.但是SDL究竟是如何封装的呢?这次打算深入其源代码一探究竟,看看它是如何封装这些API的. SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中已经叙述过了,不再重复.这两篇文章中也提

Memcached源码分析之内存管理

先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管理的源代码之前,先宏观上分析一下memcached内存管理的模型是怎样子的: 提个建议,我觉得memcached内存管理的模型与我们平时做作业的作业本“画格子给我们往格子里面写字”的逻辑很像,一本本作业本就是我们的内存空间,而我们往里写的字就是我们要存下来的数据,所以分析的时候可以想像一下用方格作业