955
京東網上商城
嵌入式Linux引導過程之1.4——Xloader的ddr_init
這裏我們來看XLOADER_ENTRY中調用的第二個標號ddr_init處的代碼,這部分代碼的作用是對外部內存SDRAM進行初始化,在我 spearplus開發板中,使用的是DDR SDRAM。在調用ddr_init之前,外部內存是不能用的,因為外部內存的時鍾以及控製寄存器都還沒有初始化,因此此時隻有芯片內部的SRAM以及在 sys_init的時候已經初始化了的Serial Flash、UART以及gmac是可用的。
而ddr_init的作用就是根據板子 使用的外部SDRAM來對外部內存進行初始化,針對不同的板子使用不同的SDRAM的,需要根據特定的SDRAM來定製這個初始化過程,這也是為什麼要把 ddr_init單獨放在一個文件中的原因,便於在不同的外部內存之間的代碼移植。
在這裏,我還有很多不明白的地方,我想是因為我對硬件 不過熟悉的緣故。所以很多代碼隻能夠看到它的表麵,真正代碼想要完成的功能需要結合各個寄存器本身的作用以及對SDRAM初始化的整個過程的定義才能夠看 清楚。但是,這需要閱讀大量的芯片手冊,這對於我來說,至少目前還不具備這種能力和條件,因此暫時先放一放,等到以後真正需要用到的時候再回過頭來仔細研 究。在這裏,我們隻需要明白,這一段代碼,是在對特定的外部內存進行初始化,初始化完成之後,外部內存就可以使用了,將來uboot以及linux kernel的代碼都需要轉移到外部內存之後才可以運行的。
對於我的代碼來說,ddr_init位於Xloader根目錄下麵的ddr/splus_mt47h128m8_3.266_c15_map_async.S中,完整的代碼以及對代碼的粗略分析如下:
1 #define MPMCBase 0xfc600000
2 #define NUM_OF_MPMC_REGS 100
3
4
5 /*****************************************************************************/
6
7 #define MPMCRegsBase 0xfca80000
8 #define DDR_PLL_REG MPMCRegsBase + 0x0020
9 #define PER1_CLKEN MPMCRegsBase + 0x002C
10 #define DDR_PAD_REG MPMCRegsBase + 0x00f0
11 #define DDR_1V8_REG MPMCRegsBase + 0x00e4
12 #define DDR_2V5_REG MPMCRegsBase + 0x00e8
13 #define DDR_3V3_REG MPMCRegsBase + 0x00ec
14
15 #define MPMCBase 0xfc600000
16
17 #define DENALI_CTL_00 MPMCBase + 0x000
18 #define DENALI_CTL_01 MPMCBase + 0x004
19 #define DENALI_CTL_02 MPMCBase + 0x008
20 #define DENALI_CTL_03 MPMCBase + 0x00c
21 #define DENALI_CTL_04 MPMCBase + 0x010
22 #define DENALI_CTL_05 MPMCBase + 0x014
23 #define DENALI_CTL_06 MPMCBase + 0x018
24 #define DENALI_CTL_07 MPMCBase + 0x01c
25 #define DENALI_CTL_08 MPMCBase + 0x020
26 #define DENALI_CTL_09 MPMCBase + 0x024
27 #define DENALI_CTL_10 MPMCBase + 0x028
28 #define DENALI_CTL_11 MPMCBase + 0x02c
29 #define DENALI_CTL_12 MPMCBase + 0x030
30 #define DENALI_CTL_13 MPMCBase + 0x034
31 #define DENALI_CTL_14 MPMCBase + 0x038
32 #define DENALI_CTL_15 MPMCBase + 0x03c
33 #define DENALI_CTL_16 MPMCBase + 0x040
34 #define DENALI_CTL_17 MPMCBase + 0x044
35 #define DENALI_CTL_18 MPMCBase + 0x048
36 #define DENALI_CTL_19 MPMCBase + 0x04c
37 #define DENALI_CTL_20 MPMCBase + 0x050
38 #define DENALI_CTL_21 MPMCBase + 0x054
39 #define DENALI_CTL_22 MPMCBase + 0x058
40 #define DENALI_CTL_23 MPMCBase + 0x05c
41 #define DENALI_CTL_24 MPMCBase + 0x060
42 #define DENALI_CTL_25 MPMCBase + 0x064
43 #define DENALI_CTL_26 MPMCBase + 0x068
44 #define DENALI_CTL_27 MPMCBase + 0x06c
45 #define DENALI_CTL_28 MPMCBase + 0x070
46 #define DENALI_CTL_29 MPMCBase + 0x074
47 #define DENALI_CTL_30 MPMCBase + 0x078
48
49 /*;-----------------------------------------------------------------------------------*/
50 #define DENALI_CTL_31 MPMCBase + 0x07c
51 #define DENALI_CTL_32 MPMCBase + 0x080
52 #define DENALI_CTL_33 MPMCBase + 0x084
53 #define DENALI_CTL_34 MPMCBase + 0x088
54 #define DENALI_CTL_35 MPMCBase + 0x08c
55 #define DENALI_CTL_36 MPMCBase + 0x090
56 #define DENALI_CTL_37 MPMCBase + 0x094
57 #define DENALI_CTL_38 MPMCBase + 0x098
58 #define DENALI_CTL_39 MPMCBase + 0x09c
59 #define DENALI_CTL_40 MPMCBase + 0x0a0
60 #define DENALI_CTL_41 MPMCBase + 0x0a4
61 #define DENALI_CTL_42 MPMCBase + 0x0a8
62 #define DENALI_CTL_43 MPMCBase + 0x0ac
63 #define DENALI_CTL_44 MPMCBase + 0x0b0
64 #define DENALI_CTL_45 MPMCBase + 0x0b4
65 #define DENALI_CTL_46 MPMCBase + 0x0b8
66 #define DENALI_CTL_47 MPMCBase + 0x0bc
67 #define DENALI_CTL_48 MPMCBase + 0x0c0
68 #define DENALI_CTL_49 MPMCBase + 0x0c4
69 #define DENALI_CTL_50 MPMCBase + 0x0c8
70 #define DENALI_CTL_51 MPMCBase + 0x0cc
71 #define DENALI_CTL_52 MPMCBase + 0x0d0
72 #define DENALI_CTL_53 MPMCBase + 0x0d4
73 #define DENALI_CTL_54 MPMCBase + 0x0d8
74 #define DENALI_CTL_55 MPMCBase + 0x0dc
75 #define DENALI_CTL_56 MPMCBase + 0x0e0
76 #define DENALI_CTL_57 MPMCBase + 0x0e4
77 #define DENALI_CTL_58 MPMCBase + 0x0e8
78 #define DENALI_CTL_59 MPMCBase + 0x0ec
79 #define DENALI_CTL_60 MPMCBase + 0x0f0
80 #define DENALI_CTL_61 MPMCBase + 0x0f4
81 #define DENALI_CTL_62 MPMCBase + 0x0f8
82 #define DENALI_CTL_63 MPMCBase + 0x0fc
83 #define DENALI_CTL_64 MPMCBase + 0x100
84 #define DENALI_CTL_65 MPMCBase + 0x104
85 #define DENALI_CTL_66 MPMCBase + 0x108
86 #define DENALI_CTL_67 MPMCBase + 0x10c
87 #define DENALI_CTL_68 MPMCBase + 0x110
88 #define DENALI_CTL_69 MPMCBase + 0x114
89 #define DENALI_CTL_70 MPMCBase + 0x118
90 #define DENALI_CTL_71 MPMCBase + 0x11c
91 #define DENALI_CTL_72 MPMCBase + 0x120
92 #define DENALI_CTL_73 MPMCBase + 0x124
93 #define DENALI_CTL_74 MPMCBase + 0x128
94 #define DENALI_CTL_75 MPMCBase + 0x12c
95 #define DENALI_CTL_76 MPMCBase + 0x130
96 #define DENALI_CTL_77 MPMCBase + 0x134
97 #define DENALI_CTL_78 MPMCBase + 0x138
98 #define DENALI_CTL_79 MPMCBase + 0x13c
99 #define DENALI_CTL_80 MPMCBase + 0x140
100 #define DENALI_CTL_81 MPMCBase + 0x144
101 #define DENALI_CTL_82 MPMCBase + 0x148
102 #define DENALI_CTL_83 MPMCBase + 0x14c
103 #define DENALI_CTL_84 MPMCBase + 0x150
104 #define DENALI_CTL_85 MPMCBase + 0x154
105 #define DENALI_CTL_86 MPMCBase + 0x158
106 #define DENALI_CTL_87 MPMCBase + 0x15c
107 #define DENALI_CTL_88 MPMCBase + 0x160
108 #define DENALI_CTL_89 MPMCBase + 0x164
109 #define DENALI_CTL_90 MPMCBase + 0x168
110 #define DENALI_CTL_91 MPMCBase + 0x16c
111 #define DENALI_CTL_92 MPMCBase + 0x170
112 #define DENALI_CTL_93 MPMCBase + 0x174
113 #define DENALI_CTL_94 MPMCBase + 0x178
114 #define DENALI_CTL_95 MPMCBase + 0x17c
115 #define DENALI_CTL_96 MPMCBase + 0x180
116 #define DENALI_CTL_97 MPMCBase + 0x184
117 #define DENALI_CTL_98 MPMCBase + 0x188
118 #define DENALI_CTL_99 MPMCBase + 0x18c
119
120
121
122
123 /*;; EXPORT MPMC_init*/
124 /*;;MPMC_init ROU*/
125
126 .global ddr_init
127 ddr_init:
128
/* 保存返回地址,用以返回XLOADER_ENTRY */
129 MOV v1, lr /* ; Save lr*/
130
131 /*;;---------- EXT REGS CONFIG --------------*/
132 /*;;---------- DDRCORE disable to switch core frequency -----*/
/* 從這裏開始對DDR進行初始化設置,在設置DDR的頻率之前,首先要disable ddr的時鍾 */
133 LDR a1, = PER1_CLKEN /* PER1_CLKEN為外設時鍾使能寄存器PERIP1_CLK_ENB的地址0xFCA8002C */
134 LDR a2, [a1, #0] /* 載入PERIP1_CLK_ENB寄存器的當前值 */
135 LDR a3, =0x9fffffff /* a3作為掩碼,用於對[0-31]位中的第29、30位清零 */
136 AND a2,a2,a3 /* 將PERIP1_CLK_ENB寄存器的當前值的第29、30位清零,
* 根據手冊第29位是ddr_core_enb,當該位為0時,disable ddr core clock
*/
137 LDR a3, =0x40000000 /* 根據芯片手冊,PERIP1_CLK_ENB的第30位是reserved的,
* 因此這邊將第30位置1以及上麵的將第30位清零顯得沒有意義,
* 可能芯片手冊不是最新的?
*/
138 ORR a2,a2,a3
139 STR a2, [a1, #0] /* 將最新的設置保存至目標寄存器,但不知道為什麼要保存兩遍? */
140 STR a2, [a1, #0]
141
142 /*;;---------- PLL_REG (switch core frequency) ----------*/
/* 這裏對外部內存DDR的時鍾進行設定 */
143 LDR a1, = DDR_PLL_REG /* DDR_PLL_REG為PLL_CLK_CFG(pll clock config)寄存器的地址0xFCA80020 */
144 LDR a2, [a1, #0] /* 載入PLL_CLK_CFG寄存器的當前值 */
145 LDR a3, =0x8fffffff /* a3作為掩碼,用於對[0-31]位中的第28、29、30位清零 */
146 AND a2,a2,a3 /* 將PLL_CLK_CFG寄存器的當前值的第28、29、30位清零,
* 根據手冊可知,PLL_CLK_CFG的第[28-30]位定義了DDR時鍾的工作模式
*/
147 LDR a3, =0x30000000/* ;; VM :Asynchronous mode :clock provided from PLL2*/
/* 將PLL_CLK_CFG的第[28-30]位設置為'b011,查看手冊可知,
* 此處將DDR的時鍾設置成了異步模式,也就是使用由PLL2提供過來的時鍾。
*/
148 ORR a2,a2,a3 /* 設置並保存至LL_CLK_CFG寄存器 */
149 STR a2, [a1, #0]
150
151 /*;;---------- DDRCORE enable after switch core frequency ----------*/
/* 此處所做的工作就是在設置完DDR時鍾的工作模式後重新打開外設時鍾使能寄存器中的DDR控製位 */
152 LDR a1, = PER1_CLKEN
153 LDR a2, [a1, #0]
154 LDR a3, =0xdfffffff /* 我覺得這裏首先將DDR控製位(第29位)清零的做法是完全沒有必要的 */
155 AND a2,a2,a3 /* 因為反正下麵馬上就要將該位置1了,而且按理說在這裏是不可能讀到該位為1的 */
156 LDR a3, =0x20000000 /* 以下三句代碼就是將PERIP1_CLK_ENB寄存器的第29位也就是ddr_core_enb置1 */
157 ORR a2,a2,a3
158 STR a2, [a1, #0] /* 然後保存到PERIP1_CLK_ENB寄存器中 */
159
160 /*;;------------------ PAD_REG ----------------*/
/* 這裏是設置SSTLPAD_CFG_CTR寄存器的低16位值,這個寄存器的每個位的功能比較複雜,
* 我還沒有怎麼看明白,具體可以參考芯片手冊。
*/
161 LDR a1, = DDR_PAD_REG
162 LDR a2, [a1, #0]
163 LDR a3, =0xffff0000
164 AND a2,a2,a3
165 LDR a3, =0x0000eaab3
166 ORR a2,a2,a3
167 STR a2, [a1, #0]
168
169 /*;;------- COMP3V3_REG -------*/
/* 配置COMPCOR_3V3_CFG寄存器,具體每個位的功能參考芯片手冊 */
170 LDR a1, = DDR_3V3_REG
171 LDR a2, [a1, #0]
172 LDR a3, =0x8080ffe0
173 AND a2,a2,a3
174 LDR a3, =0x78000002
175 ORR a2,a2,a3
176 STR a2, [a1, #0]
177
178 /*;;---------- PROGRAMMATION SEQUENCE FOR SSTL COMPENSATION --------------*/
179 /*;;---------- COMPENSATIONS RESET CONFIGS (not required) --------------*/
180 /*;;------- COMP1V8_REG (START)-------*/
/* 配置COMPSSTL_1V8_CFG寄存器,具體每個位的功能參考芯片手冊 */
181 LDR a1, = DDR_1V8_REG
182 LDR a2, [a1, #0]
183 LDR a3, =0x8080ffc0
184 AND a2,a2,a3
185 LDR a3, =0x78000004
186 ORR a2,a2,a3
187 STR a2, [a1, #0]
188 /*;;------- COMP2V5_REG (START) -------*/
/* 配置COMPSSTL_2V5_CFG寄存器,具體每個位的功能參考芯片手冊 */
189 LDR a1, = DDR_2V5_REG
190 LDR a2, [a1, #0]
191 LDR a3, =0x8080ffc0
192 AND a2,a2,a3
193 LDR a3, =0x78000004
194 ORR a2,a2,a3
195 STR a2, [a1, #0]
196
197 /*;;---------- CHECK SELECTED DDR --------*/
/* 從SSTLPAD_CFG_CTR寄存器中讀出第17、18兩位,
* 如果兩位都是1的話則跳轉到SW_check標號處,否則跳轉到HW_check標號處。
* 這在芯片手冊上有說明
*/
198 LDR a1, = DDR_PAD_REG
199 /*;;--- check HW or SW Selection*/
200 LDR a2, [a1, #0]
201 LDR a3, =0x00060000
202 AND a2,a2,a3
203 CMP a2,a3
204 BNE HW_check
205 B SW_check
206 /*;;--- 1V8 SW Check*/
207 SW_check:
/* 如果是SW_check方式,則查看SSTLPAD_CFG_CTR寄存器的最低位,
* 若為0,則表示DDR1 dram interface(SSTL2V5)
* 若為1,則表示DDR2 dram interface(SSTL1V8)
*/
208 LDR a2, [a1, #0]
209 LDR a3, =0x00000001
210 AND a2,a2,a3
211 CMP a2,a3
212 BNE sel_2V5
213 B sel_1V8
214 /* ;;--- 1V8 HW Check*/
215 HW_check:
/* 如果是HW_check方式,則查看SSTLPAD_CFG_CTR寄存器的第15位,
* 若為0,則表示DDR1 dram interface(SSTL2V5)
* 若為1,則表示DDR2 dram interface(SSTL1V8)
*/
216 LDR a2, [a1, #0]
217 LDR a3, =0x00008000
218 AND a2,a2,a3
219 CMP a2,a3
220 BNE sel_2V5
221 B sel_1V8
222
/* 以下分別是sel_1v8和sel_2v5兩種方式,
* 這兩種方式的唯一不同之處就是對兩個寄存器COMPSSTL_1V8_CFG和COMPSSTL_2V5_CFG
* 的設置順序以及設置的值不同,具體這些值代表什麼意思以及這些寄存器的作用,
* 由於我對硬件的隻是不夠,所以看著還是一頭霧水。。。
* 在設置完這兩個寄存器的值以後,sel_1V8就等待直到COMPSSTL_1V8_CFG的第4位為1
* 而sel_2V5則等待直到COMPSSTL_2V5_CFG的第4位為1,
* 最後,都將跳轉到end_comp處。
*/
223 sel_1V8:
224 /*;;------- COMPENSATION 1V8 SELECTED -------*/
225 /*;;------- COMP2V5_REG (IDDQ) -------*/
226 LDR a1, = DDR_2V5_REG
227 LDR a2, [a1, #0]
228 LDR a3, =0x8080ffc0
229 AND a2,a2,a3
230 LDR a3, =0x78000003
231 ORR a2,a2,a3
232 STR a2, [a1, #0]
233 /*;;------- COMP1V8_REG (NORMAL)-------*/
234 LDR a1, = DDR_1V8_REG
235 LDR a2, [a1, #0]
236 LDR a3, =0x8080ffc0
237 AND a2,a2,a3
238 LDR a3, =0x78000010
239 ORR a2,a2,a3
240 STR a2, [a1, #0]
241 /* ;--- OK wait ---*/
242 ok_loop_1V8:
243 LDR a1, = DDR_1V8_REG
244 LDR a2, [a1, #0]
245 LDR a3, =0x00000010
246 AND a2,a2,a3
247 CMP a2,a3
248 BNE ok_loop_1V8
249 B end_comp
250
251
252 sel_2V5:
253 /*;;------- COMPENSATION 2V5 SELECTED -------*/
254 /*;;------- COMP1V8_REG (IDDQ)-------*/
255 LDR a1, = DDR_1V8_REG
256 LDR a2, [a1, #0]
257 LDR a3, =0x8080ffc0
258 AND a2,a2,a3
259 LDR a3, =0x78000003
260 ORR a2,a2,a3
261 STR a2, [a1, #0]
262 /*;;------- COMP2V5_REG (NORMAL) -------*/
263 LDR a1, = DDR_2V5_REG
264 LDR a2, [a1, #0]
265 LDR a3, =0x8080ffc0
266 AND a2,a2,a3
267 LDR a3, =0x78000010
268 ORR a2,a2,a3
269 STR a2, [a1, #0]
270 /* ;--- OK wait ---*/
271 ok_loop_2V5:
272 LDR a1, = DDR_2V5_REG
273 LDR a2, [a1, #0]
274 LDR a3, =0x00000010
275 AND a2,a2,a3
276 CMP a2,a3
277 BNE ok_loop_2V5
278 B end_comp
279
280 end_comp:
/* DENALI_CTL_00-DENALI_CTL_99分別代表寄存器MEM0_CTL-MEM99_CTL
* 這裏根據每個寄存器的手冊說明以及實際需求對這些內存控製寄存器進行了設置
* 由於時間以及能力所限,我無法對這裏的每個寄存器的設置內容進行詳細的說明
* 想要看得更加仔細,可以參考芯片手冊。
* 我們的最終目的是了解整個引導的流程,所以在這裏隻需要知道對內存控製寄存器進行了設置即可。
*/
281
282 /*;;---------- MPMC CONFIG --------------*/
283 LDR a2, =0x00000001
284 LDR a1, = DENALI_CTL_00
285 STR a2, [a1, #0]
286
287 LDR a2, =0x00000000
288 LDR a1, = DENALI_CTL_01
289 STR a2, [a1, #0]
290
291 LDR a2, =0x01000000
292 LDR a1, = DENALI_CTL_02
293 STR a2, [a1, #0]
294
295 LDR a2, =0x00000101
296 LDR a1, = DENALI_CTL_03
297 STR a2, [a1, #0]
298
299 LDR a2, =0x00000001
300 LDR a1, = DENALI_CTL_04
301 STR a2, [a1, #0]
302
303 LDR a2, =0x01000000
304 LDR a1, = DENALI_CTL_05
305 STR a2, [a1, #0]
306
307 LDR a2, =0x00010001
308 LDR a1, = DENALI_CTL_06
309 STR a2, [a1, #0]
310
311 LDR a2, =0x00000100
312 LDR a1, = DENALI_CTL_07
313 STR a2, [a1, #0]
314
315 LDR a2, =0x00010001
316 LDR a1, = DENALI_CTL_08
317 STR a2, [a1, #0]
318
319 LDR a2, =0x00000003
320 LDR a1, = DENALI_CTL_09
321 STR a2, [a1, #0]
322
323 LDR a2, =0x01000201
324 LDR a1, = DENALI_CTL_10
325 STR a2, [a1, #0]
326
327 LDR a2, =0x03000202
328 LDR a1, = DENALI_CTL_11
329 STR a2, [a1, #0]
330
331 LDR a2, =0x03030103
332 LDR a1, = DENALI_CTL_12
333 STR a2, [a1, #0]
334
335 LDR a2, =0x03030302
336 LDR a1, = DENALI_CTL_13
337 STR a2, [a1, #0]
338
339 LDR a2, =0x03040303
340 LDR a1, = DENALI_CTL_14
341 STR a2, [a1, #0]
342
343 LDR a2, =0x03030503
344 LDR a1, = DENALI_CTL_15
345 STR a2, [a1, #0]
346
347 #ifdef LCD
348 LDR a2, =0x02020206
349 #else
350 LDR a2, =0x02030306
351 #endif
352 LDR a1, = DENALI_CTL_16
353 STR a2, [a1, #0]
354
355 LDR a2, =0x03000404
356 LDR a1, = DENALI_CTL_17
357 STR a2, [a1, #0]
358
359 LDR a2, =0x02030202
360 LDR a1, = DENALI_CTL_18
361 STR a2, [a1, #0]
362
363 LDR a2, =0x03000204
364 LDR a1, = DENALI_CTL_19
365 STR a2, [a1, #0]
366
367 LDR a2, =0x0707073f
368 LDR a1, = DENALI_CTL_20
369 STR a2, [a1, #0]
370
371 LDR a2, =0x07070707
372 LDR a1, = DENALI_CTL_21
373 STR a2, [a1, #0]
374
375 LDR a2, =0x06060607
376 LDR a1, = DENALI_CTL_22
377 STR a2, [a1, #0]
378
379 LDR a2, =0x06060606
380 LDR a1, = DENALI_CTL_23
381 STR a2, [a1, #0]
382
383 LDR a2, =0x05050506
384 LDR a1, = DENALI_CTL_24
385 STR a2, [a1, #0]
386
387 LDR a2, =0x05050505
388 LDR a1, = DENALI_CTL_25
389 STR a2, [a1, #0]
390
391 LDR a2, =0x04040405
392 LDR a1, = DENALI_CTL_26
393 STR a2, [a1, #0]
394
395 LDR a2, =0x04040404
396 LDR a1, = DENALI_CTL_27
397 STR a2, [a1, #0]
398
399 LDR a2, =0x03030304
400 LDR a1, = DENALI_CTL_28
401 STR a2, [a1, #0]
402
403 LDR a2, =0x03030303
404 LDR a1, = DENALI_CTL_29
405 STR a2, [a1, #0]
406
407 LDR a2, =0x02020203
408 LDR a1, = DENALI_CTL_30
409 STR a2, [a1, #0]
410
411 LDR a2, =0x02020202
412 LDR a1, = DENALI_CTL_31
413 STR a2, [a1, #0]
414
415 LDR a2, =0x01010102
416 LDR a1, = DENALI_CTL_32
417 STR a2, [a1, #0]
418
419 LDR a2, =0x01010101
420 LDR a1, = DENALI_CTL_33
421 STR a2, [a1, #0]
422
423 LDR a2, =0x08080a01
424 LDR a1, = DENALI_CTL_34
425 STR a2, [a1, #0]
426
427 LDR a2, =0x0000023f
428 LDR a1, = DENALI_CTL_35
429 STR a2, [a1, #0]
430
431 LDR a2, =0x00040800
432 LDR a1, = DENALI_CTL_36
433 STR a2, [a1, #0]
434
435 LDR a2, =0x00000000
436 LDR a1, = DENALI_CTL_37
437 STR a2, [a1, #0]
438
439 LDR a2, =0x00000f02
440 LDR a1, = DENALI_CTL_38
441 STR a2, [a1, #0]
442
443 LDR a2, =0x00001b1b
444 LDR a1, = DENALI_CTL_39
445 STR a2, [a1, #0]
446
447 LDR a2, =0x7f000000
448 LDR a1, = DENALI_CTL_40
449 STR a2, [a1, #0]
450
451 LDR a2, =0x005f0000
452 LDR a1, = DENALI_CTL_41
453 STR a2, [a1, #0]
454
455 LDR a2, =0x1c040b6a
456 LDR a1, = DENALI_CTL_42
457 STR a2, [a1, #0]
458
459 LDR a2, =0x00640064
460 LDR a1, = DENALI_CTL_43
461 STR a2, [a1, #0]
462
463 LDR a2, =0x00640064
464 LDR a1, = DENALI_CTL_44
465 STR a2, [a1, #0]
466
467 LDR a2, =0x00640064
468 LDR a1, = DENALI_CTL_45
469 STR a2, [a1, #0]
470
471 LDR a2, =0x00000064
472 LDR a1, = DENALI_CTL_46
473 STR a2, [a1, #0]
474
475 LDR a2, =0x00200020
476 LDR a1, = DENALI_CTL_47
477 STR a2, [a1, #0]
478
479 LDR a2, =0x00200020
480 LDR a1, = DENALI_CTL_48
481 STR a2, [a1, #0]
482
483 LDR a2, =0x00200020
484 LDR a1, = DENALI_CTL_49
485 STR a2, [a1, #0]
486
487 LDR a2, =0x00200020
488 LDR a1, = DENALI_CTL_50
489 STR a2, [a1, #0]
490
491 LDR a2, =0x00200020
492 LDR a1, = DENALI_CTL_51
493 STR a2, [a1, #0]
494
495 LDR a2, =0x00200020
496 LDR a1, = DENALI_CTL_52
497 STR a2, [a1, #0]
498
499 LDR a2, =0x00200020
500 LDR a1, = DENALI_CTL_53
501 STR a2, [a1, #0]
502
503 LDR a2, =0x000007ff
504 LDR a1, = DENALI_CTL_54
505 STR a2, [a1, #0]
506
507 LDR a2, =0x00000000
508 LDR a1, = DENALI_CTL_55
509 STR a2, [a1, #0]
510
511 LDR a2, =0x47ec00c8
512 LDR a1, = DENALI_CTL_56
513 STR a2, [a1, #0]
514
515 LDR a2, =0x00c8001f
516 LDR a1, = DENALI_CTL_57
517 STR a2, [a1, #0]
518
519 LDR a2, =0x00000000
520 LDR a1, = DENALI_CTL_58
521 STR a2, [a1, #0]
522
523 LDR a2, =0x0000cd98
524 LDR a1, = DENALI_CTL_59
525 STR a2, [a1, #0]
526
527 LDR a2, =0x00000000
528 LDR a1, = DENALI_CTL_60
529 STR a2, [a1, #0]
530
531 LDR a2, =0x03030100
532 LDR a1, = DENALI_CTL_61
533 STR a2, [a1, #0]
534
535 LDR a2, =0x03030303
536 LDR a1, = DENALI_CTL_62
537 STR a2, [a1, #0]
538
539 LDR a2, =0x03030303
540 LDR a1, = DENALI_CTL_63
541 STR a2, [a1, #0]
542
543 LDR a2, =0x03030303
544 LDR a1, = DENALI_CTL_64
545 STR a2, [a1, #0]
546
547 LDR a2, =0x00270000
548 LDR a1, = DENALI_CTL_65
549 STR a2, [a1, #0]
550
551 LDR a2, =0x00250027
552 LDR a1, = DENALI_CTL_66
553 STR a2, [a1, #0]
554
555 LDR a2, =0x00300000
556 LDR a1, = DENALI_CTL_67
557 STR a2, [a1, #0]
558
559 LDR a2, =0x008900b7
560 LDR a1, = DENALI_CTL_68
561 STR a2, [a1, #0]
562
563 LDR a2, =0x003fffff
564 LDR a1, = DENALI_CTL_69
565 STR a2, [a1, #0]
566
567 LDR a2, =0x003fffff
568 LDR a1, = DENALI_CTL_70
569 STR a2, [a1, #0]
570
571 LDR a2, =0x00000000
572 LDR a1, = DENALI_CTL_71
573 STR a2, [a1, #0]
574
575 LDR a2, =0x00000000
576 LDR a1, = DENALI_CTL_72
577 STR a2, [a1, #0]
578
579 LDR a2, =0x003fffff
580 LDR a1, = DENALI_CTL_73
581 STR a2, [a1, #0]
582
583 LDR a2, =0x003fffff
584 LDR a1, = DENALI_CTL_74
585 STR a2, [a1, #0]
586
587 LDR a2, =0x00000000
588 LDR a1, = DENALI_CTL_75
589 STR a2, [a1, #0]
590
591 LDR a2, =0x00000000
592 LDR a1, = DENALI_CTL_76
593 STR a2, [a1, #0]
594
595 LDR a2, =0x003fffff
596 LDR a1, = DENALI_CTL_77
597 STR a2, [a1, #0]
598
599 LDR a2, =0x003fffff
600 LDR a1, = DENALI_CTL_78
601 STR a2, [a1, #0]
602
603 LDR a2, =0x00000000
604 LDR a1, = DENALI_CTL_79
605 STR a2, [a1, #0]
606
607 LDR a2, =0x00000000
608 LDR a1, = DENALI_CTL_80
609 STR a2, [a1, #0]
610
611 LDR a2, =0x003fffff
612 LDR a1, = DENALI_CTL_81
613 STR a2, [a1, #0]
614
615 LDR a2, =0x003fffff
616 LDR a1, = DENALI_CTL_82
617 STR a2, [a1, #0]
618
619 LDR a2, =0x00000000
620 LDR a1, = DENALI_CTL_83
621 STR a2, [a1, #0]
622
623 LDR a2, =0x00000000
624 LDR a1, = DENALI_CTL_84
625 STR a2, [a1, #0]
626
627 LDR a2, =0x003fffff
628 LDR a1, = DENALI_CTL_85
629 STR a2, [a1, #0]
630
631 LDR a2, =0x003fffff
632 LDR a1, = DENALI_CTL_86
633 STR a2, [a1, #0]
634
635 LDR a2, =0x00000000
636 LDR a1, = DENALI_CTL_87
637 STR a2, [a1, #0]
638
639 LDR a2, =0x00000000
640 LDR a1, = DENALI_CTL_88
641 STR a2, [a1, #0]
642
643 LDR a2, =0x003fffff
644 LDR a1, = DENALI_CTL_89
645 STR a2, [a1, #0]
646
647 LDR a2, =0x003fffff
648 LDR a1, = DENALI_CTL_90
649 STR a2, [a1, #0]
650
651 LDR a2, =0x00000000
652 LDR a1, = DENALI_CTL_91
653 STR a2, [a1, #0]
654
655 LDR a2, =0x00000000
656 LDR a1, = DENALI_CTL_92
657 STR a2, [a1, #0]
658
659 LDR a2, =0x003fffff
660 LDR a1, = DENALI_CTL_93
661 STR a2, [a1, #0]
662
663 LDR a2, =0x003fffff
664 LDR a1, = DENALI_CTL_94
665 STR a2, [a1, #0]
666
667 LDR a2, =0x00000000
668 LDR a1, = DENALI_CTL_95
669 STR a2, [a1, #0]
670
671 LDR a2, =0x00000000
672 LDR a1, = DENALI_CTL_96
673 STR a2, [a1, #0]
674
675 LDR a2, =0x00000000
676 LDR a1, = DENALI_CTL_97
677 STR a2, [a1, #0]
678
679 LDR a2, =0x00000000
680 LDR a1, = DENALI_CTL_98
681 STR a2, [a1, #0]
682
683 LDR a2, =0x00000000
684 LDR a1, = DENALI_CTL_99
685 STR a2, [a1, #0]
686
687 /*;;---------- MPMC START ---------------*/
688
689 LDR a2, =0x01000100
690 LDR a1, = DENALI_CTL_07
691 STR a2, [a1, #0]
692
/* 最後,將開頭保存的返回地址給pc,返回到XLOADER_ENTRY中
* 返回之後,外部內存SDRAM就可以使用了。
*/
693 MOV pc, v1 /* ; Restore lr*/
最後更新:2017-04-03 16:48:40