summaryrefslogtreecommitdiff
path: root/board/delta/lowlevel_init.S
blob: 35716f245efcead117b57388bda8cae4b9fa5e5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
/*
 * Most of this taken from Redboot hal_platform_setup.h with cleanup
 *
 * NOTE: I haven't clean this up considerably, just enough to get it
 * running. See hal_platform_setup.h for the source. See
 * board/cradle/lowlevel_init.S for another PXA250 setup that is
 * much cleaner.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <config.h>
#include <version.h>
#include <asm/arch/pxa-regs.h>

DRAM_SIZE:  .long   CFG_DRAM_SIZE

/* wait for coprocessor write complete */
   .macro CPWAIT reg
   mrc  p15,0,\reg,c2,c0,0
   mov  \reg,\reg
   sub  pc,pc,#4
   .endm


.macro wait time
	ldr             r2, =OSCR
	mov             r3, #0
	str             r3, [r2]
0:
	ldr             r3, [r2]
	cmp             r3, \time
	bls             0b
.endm


#define SDRAM_CMD_NOP	0x40000000

.macro do_nop_cmd num
	ldr		r2, =MDMRS
	ldr		r3, =SDRAM_CMD_NOP
	ldr		r4, =0x0
loop:	
	str		r3, [r2]
	add		r4, r4, #1
	cmp		r4, \num
	bls		loop
.endm
	
/*
 * 	Memory setup
 */

.globl lowlevel_init
lowlevel_init:
	/* Set up GPIO pins first ----------------------------------------- */
	mov      r10, lr
	
        /*  Configure GPIO  Pins 97, 98 UART1 / altern. Fkt. 1 */
	ldr		r0, =GPIO97
	ldr		r1, =0x801
	str		r1, [r0]

	ldr		r0, =GPIO98
	ldr		r1, =0x801
	str		r1, [r0]
		
        /* tebrandt - ASCR, clear the RDH bit */
	ldr             r0, =ASCR	
	ldr             r1, [r0]
	bic             r1, r1, #0x80000000
	str             r1, [r0]
	
	/* ---------------------------------------------------------------- */
	/* Enable memory interface                                          */
	/* ---------------------------------------------------------------- */

	/* ---------------------------------------------------------------- */
	/* Step 1: Wait for at least 200 microsedonds to allow internal     */
	/*         clocks to settle. Only necessary after hard reset...     */
	/*         FIXME: can be optimized later                            */
	/* ---------------------------------------------------------------- */
	wait #300
	
mem_init:

#define NEW_SDRAM_INIT 1
#ifdef NEW_SDRAM_INIT

	/* Configure ACCR Register - enable DMEMC Clock at 260 / 2 MHz */
	ldr		r0, =ACCR
	ldr		r1, [r0]
	orr		r1, r1, #0x3000
	str		r1, [r0]
	ldr		r1, [r0]

	/* 2. Programm MDCNFG, leaving DMCEN de-asserted */
	ldr		r0, =MDCNFG
	ldr		r1, =(MDCNFG_DMAP | MDCNFG_DTYPE | MDCNFG_DTC_2 | MDCNFG_DCSE0 | MDCNFG_DRAC_13)
	/* 	ldr		r1, =0x80000403 */
	str		r1, [r0]
	ldr		r1, [r0]	/* delay until written */

	/* 3. wait nop power up waiting period (200ms) 
	 * optimization: Steps 4+6 can be done during this
	 */
	wait #300

	/* 4. Perform an initial Rcomp-calibration cycle */
	ldr		r0, =RCOMP
	ldr		r1, =0x80000000
	str		r1, [r0]
	ldr		r1, [r0]	/* delay until written */
	/* missing: program for automatic rcomp evaluation cycles */

	/* 5. DDR DRAM strobe delay calibration */
	ldr		r0, =DDR_HCAL
	ldr		r1, =0x88000007
	str		r1, [r0]
	wait		#5
	ldr		r1, [r0]	/* delay until written */

	/* Set MDMRS */
	ldr		r0, =MDMRS
	ldr		r1, =0x60000023
	str		r1, [r0]
	wait	#300
	
	/* Configure MDREFR */
	ldr		r0, =MDREFR
	ldr		r1, =0x00000006
	str		r1, [r0]
	ldr		r1, [r0]

	/* Enable the dynamic memory controller */
	ldr		r0, =MDCNFG
	ldr		r1, [r0]
	orr		r1, r1, #MDCNFG_DMCEN
	str		r1, [r0]


#else /* NEW_SDRAM_INIT */
	
	/* configure the MEMCLKCFG register */
        ldr             r1, =MEMCLKCFG
        ldr             r2, =0x00010001
        str             r2, [r1]             @ WRITE
        ldr             r2, [r1]             @ DELAY UNTIL WRITTEN
        
	/* set CSADRCFG[0] to data flash SRAM mode */
	ldr             r1, =CSADRCFG0
	ldr             r2, =0x00320809
	str             r2, [r1]             @ WRITE
	ldr             r2, [r1]             @ DELAY UNTIL WRITTEN
        
	/* set CSADRCFG[1] to data flash SRAM mode */
	ldr             r1, =CSADRCFG1
	ldr             r2, =0x00320809
	str             r2, [r1]             @ WRITE
	ldr             r2, [r1]             @ DELAY UNTIL WRITTEN
        
	/* set MSC 0 register for SRAM memory */
        ldr             r1, =MSC0
        ldr             r2, =0x11191119
        str             r2, [r1]             @ WRITE
        ldr             r2, [r1]             @ DELAY UNTIL WRITTEN
         
	/* set CSADRCFG[2] to data flash SRAM mode */
	ldr             r1, =CSADRCFG2
	ldr             r2, =0x00320809
	str             r2, [r1]             @ WRITE
	ldr             r2, [r1]             @ DELAY UNTIL WRITTEN
        
	/* set CSADRCFG[3] to VLIO mode */
        ldr             r1, =CSADRCFG3
        ldr             r2, =0x0032080B
        str             r2, [r1]             @ WRITE
        ldr             r2, [r1]             @ DELAY UNTIL WRITTEN

	/* set MSC 1 register for VLIO memory */
        ldr             r1, =MSC1
        ldr             r2, =0x123C1119
        str             r2, [r1]             @ WRITE
        ldr             r2, [r1]             @ DELAY UNTIL WRITTEN

#if 0
	/* This does not work in Zylonite. -SC */
	ldr		r0, =0x15fffff0
	ldr		r1, =0xb10b
	str		r1, [r0]
	str		r1, [r0, #4]
#endif

	/* Configure ACCR Register */
	ldr		r0, =ACCR		@ ACCR
	ldr		r1, =0x0180b108
	str		r1, [r0]
	ldr		r1, [r0]

	/* Configure MDCNFG Register */
	ldr		r0, =MDCNFG		@ MDCNFG
	ldr		r1, =0x403
	str		r1, [r0]
	ldr		r1, [r0]

	/* Perform Resistive Compensation by configuring RCOMP register */
	ldr		r1, =RCOMP		@ RCOMP
	ldr		r2, =0x000000ff
	str		r2, [r1]
	ldr		r2, [r1]

	/* Configure MDMRS Register for SDCS0 */
	ldr		r1, =MDMRS		@ MDMRS
	ldr		r2, =0x60000023
	ldr		r3, [r1]
	orr		r2, r2, r3
	str		r2, [r1]
	ldr		r2, [r1]

	/* Configure MDMRS Register for SDCS1 */
	ldr		r1, =MDMRS		@ MDMRS
	ldr		r2, =0xa0000023
	ldr		r3, [r1]
	orr		r2, r2, r3
	str		r2, [r1]
	ldr		r2, [r1]

	/* Configure MDREFR */
	ldr		r1, =MDREFR		@ MDREFR
	ldr		r2, =0x00000006
	str		r2, [r1]
	ldr		r2, [r1]

	/* Configure EMPI */
	ldr		r1, =EMPI		@ EMPI
	ldr		r2, =0x80000000
	str		r2, [r1]
	ldr		r2, [r1]

	/* Hardware DDR Read-Strobe Delay Calibration */
	ldr             r0, =DDR_HCAL           @ DDR_HCAL
	ldr             r1, =0x803ffc07     @ the offset is correct? -SC
	str             r1, [r0]
	wait		#5
	ldr             r1, [r0]

	/* Here we assume the hardware calibration alwasy be successful. -SC */
	/* Set DMCEN bit in MDCNFG Register */
	ldr		r0, =MDCNFG		@ MDCNFG
	ldr		r1, [r0]
	orr		r1, r1, #0x40000000	@ enable SDRAM for Normal Access
	str		r1, [r0]

#endif /* NEW_SDRAM_INIT */
	
	/* scrub/init SDRAM if enabled/present */
/* 	ldr	r11, =0xa0000000 /\* base address of SDRAM (CFG_DRAM_BASE) *\/ */
/* 	ldr	r12, =0x04000000 /\* size of memory to scrub (CFG_DRAM_SIZE) *\/ */
/* 	mov	r8,r12		 /\* save DRAM size (mk: why???) *\/ */
	ldr	r8, =0xa0000000  /* base address of SDRAM (CFG_DRAM_BASE) */
	ldr	r9, =0x04000000  /* size of memory to scrub (CFG_DRAM_SIZE) */
	mov	r0, #0		 /* scrub with 0x0000:0000 */
	mov	r1, #0
	mov	r2, #0				
	mov	r3, #0
	mov	r4, #0					
	mov	r5, #0
	mov	r6, #0					
	mov	r7, #0
10:     /* fastScrubLoop */
	subs	r9, r9, #32	// 32 bytes/line
	stmia	r8!, {r0-r7}
	beq	15f
	b	10b

15:
	/* Mask all interrupts */
	mov	r1, #0
	mcr	p6, 0, r1, c1, c0, 0	@ ICMR

	/* Disable software and data breakpoints */
	mov	r0, #0
	mcr	p15,0,r0,c14,c8,0  // ibcr0
	mcr	p15,0,r0,c14,c9,0  // ibcr1
	mcr	p15,0,r0,c14,c4,0  // dbcon

	/* Enable all debug functionality */
	mov	r0,#0x80000000
	mcr	p14,0,r0,c10,c0,0  // dcsr

endlowlevel_init:

	mov     pc, lr


/*
@********************************************************************************
@ DDR calibration
@  
@  This function is used to calibrate DQS delay lines.
@ Monahans supports three ways to do it. One is software 
@ calibration. Two is hardware calibration. Three is hybrid
@ calibration.
@
@ TBD
@ -SC
ddr_calibration:

	@ Case 1:	Write the correct delay value once
        @ Configure DDR_SCAL Register
	ldr             r0, =DDR_SCAL           @ DDR_SCAL
q	ldr             r1, =0xaf2f2f2f
	str             r1, [r0]
	ldr             r1, [r0]
*/
/*	@ Case 2:	Software Calibration
	@ Write test pattern to memory
	ldr		r5, =0x0faf0faf         @ Data Pattern
	ldr		r4, =0xa0000000		@ DDR ram
	str		r5, [r4]

	mov		r1, =0x0		@ delay count
	mov		r6, =0x0
	mov		r7, =0x0
ddr_loop1:
	add		r1, r1, =0x1
	cmp		r1, =0xf
	ble		end_loop
	mov		r3, r1
	mov             r0, r1, lsl #30
	orr		r3, r3, r0
	mov             r0, r1, lsl #22
	orr		r3, r3, r0
	mov             r0, r1, lsl #14
	orr		r3, r3, r0
	orr		r3, r3, =0x80000000
	ldr		r2, =DDR_SCAL
	str		r3, [r2]

	ldr		r2, [r4]
	cmp		r2, r5
	bne		ddr_loop1
	mov		r6, r1
ddr_loop2:
	add		r1, r1, =0x1
	cmp		r1, =0xf
	ble		end_loop
        mov             r3, r1
        mov             r0, r1, lsl #30
        orr             r3, r3, r0
        mov             r0, r1, lsl #22
        orr             r3, r3, r0
        mov             r0, r1, lsl #14
        orr             r3, r3, r0
        orr             r3, r3, =0x80000000
        ldr             r2, =DDR_SCAL
        str             r3, [r2]

	ldr		r2, [r4]
	cmp		r2, r5
	be		ddr_loop2
	mov		r7, r2

	add		r3, r6, r7
	lsr		r3, r3, =0x1
        mov             r0, r1, lsl #30
        orr             r3, r3, r0
        mov             r0, r1, lsl #22
        orr             r3, r3, r0
        mov             r0, r1, lsl #14
        orr             r3, r3, r0
        orr             r3, r3, =0x80000000
        ldr             r2, =DDR_SCAL
	
end_loop:

	@ Case 3:	Hardware Calibratoin
	ldr             r0, =DDR_HCAL           @ DDR_HCAL
	ldr             r1, =0x803ffc07     @ the offset is correct? -SC
	str             r1, [r0]
	wait		#5
	ldr             r1, [r0]
	mov		pc, lr	
*/