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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM