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.      编程分析

 

l  内存基本分类

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

1.       DRAM

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

1)        SDRAM2440常用)

2)        DDR6410常用)

3)        DDR2210常用)

4)        其他衍生产品

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

2.       SRAM

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

l  深入认识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

 

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

l  编程分析

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

1.       初始化流程

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

2.       内存的位置

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

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

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

 

 

posted @ 2015-01-19 18:09  wrjvszq  阅读(3838)  评论(7编辑  收藏  举报