閱讀955 返回首頁    go 京東網上商城


嵌入式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

  上一篇:go 嵌入式Linux引導過程之1.6——Xloader的Xloader_Entry
  下一篇:go Davinci DM6446開發攻略-UBOOT-2009.03移植2 nand flash的燒寫