]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/arm/mx37/stk5/v1_0/include/hal_platform_setup.h
Initial revision
[karo-tx-redboot.git] / packages / hal / arm / mx37 / stk5 / v1_0 / include / hal_platform_setup.h
1 #ifndef CYGONCE_HAL_PLATFORM_SETUP_H
2 #define CYGONCE_HAL_PLATFORM_SETUP_H
3
4 //=============================================================================
5 //
6 //      hal_platform_setup.h
7 //
8 //      Platform specific support for HAL (assembly code)
9 //
10 //=============================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
15 //
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
19 //
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23 // for more details.
24 //
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
28 //
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
35 //
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
38 //
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //===========================================================================
44
45 #include <pkgconf/system.h>             // System-wide configuration info
46 #include CYGBLD_HAL_VARIANT_H           // Variant specific configuration
47 #include CYGBLD_HAL_PLATFORM_H          // Platform specific configuration
48 #include <cyg/hal/hal_soc.h>            // Variant specific hardware definitions
49 #include <cyg/hal/hal_mmu.h>            // MMU definitions
50 #include <cyg/hal/karo_tx37.h>          // Platform specific hardware definitions
51
52 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
53 #define PLATFORM_SETUP1 _platform_setup1
54 #define CYGHWR_HAL_ARM_HAS_MMU
55
56 #ifdef CYG_HAL_STARTUP_ROMRAM
57 #define CYGSEM_HAL_ROM_RESET_USES_JUMP
58 #endif
59
60 //#define NFC_2K_BI_SWAP
61 #define SDRAM_FULL_PAGE_BIT     0x100
62 #define SDRAM_FULL_PAGE_MODE    0x37
63 #define SDRAM_BURST_MODE        0x33
64
65 #define CYGHWR_HAL_ROM_VADDR    0x0
66
67 #if 0
68 #define UNALIGNED_ACCESS_ENABLE
69 #define SET_T_BIT_DISABLE
70 #define BRANCH_PREDICTION_ENABLE
71 #endif
72
73
74 #define TX37_NAND_PAGE_SIZE      2048
75 #define TX37_NAND_BLKS_PER_PAGE  64
76
77 #define TX37_DEBUG
78
79 #ifndef TX37_DEBUG
80 #define LED_ON
81 #define LED_OFF
82         .macro  LED_CTRL,val
83         .endm
84         .macro  LED_BLINK,val
85         .endm
86 #define DELAY
87 #else
88 #define CYGHWR_LED_MACRO    LED_BLINK #\x
89 #define LED_ON          bl  led_on
90 #define LED_OFF         bl  led_off
91         .macro  DELAY,ms
92         ldr     r10, =\ms
93 111:
94         subs    r10, r10, #1
95         bmi     113f
96         ldr     r9, =3000
97 112:
98         subs    r9, r9, #1
99         bne     112b
100         b       111b
101         .ltorg
102 113:
103         .endm
104
105         .macro LED_CTRL,val
106         // switch user LED (PF13) on STK5
107         ldr r10, GPIO2_BASE_ADDR_W
108         mov     r9, #\val
109         cmp     r9, #0
110         movne   r9, #(1 << 19)  // LED ON
111         moveq   r9, #0  // LED OFF
112         str     r9, [r10, #0x00]        @ GPIO_DR
113         .endm
114
115         .macro LED_BLINK,val
116         mov r2, \val
117 211:
118         subs    r2, r2, #1
119         bmi     212f
120         LED_CTRL 1
121         DELAY   200
122         LED_CTRL 0
123         DELAY   300
124         b       211b
125 212:
126         DELAY   1000
127         .endm
128 #endif
129
130         .macro LED_INIT
131         // initialize GPIO2[19] for LED on STK5
132         ldr r10, IOMUXC_BASE_ADDR_W
133         @ AUD5_RXC = ALT4 (GPIO2[19])
134         mov     r9,     #4
135         str     r9,     [r10, #0x120]
136         ldr     r10,    GPIO2_BASE_ADDR_W
137
138         mov r9, #(1 << 19)
139         str     r9,     [r10, #0x00]    @ GPIO_DR
140
141         mov r9, #(1 << 19)
142         str     r9,     [r10, #0x04]    @ GPIO_GDIR
143         .endm
144
145 //#define ENABLE_IMPRECISE_ABORT
146
147 /*
148 #define PLATFORM_PREAMBLE flash_header
149
150 //flash header & DCD @ 0x400
151 .macro flash_header
152         b reset_vector
153 .org 0x400
154 app_code_jump_v: .long  reset_vector
155 app_code_barker: .long  0xB1
156 app_code_csf:    .long  0
157 dcd_ptr_ptr:     .long  dcd_ptr
158 super_root_key:  .long  0
159 dcd_ptr:         .long  dcd_data
160 app_dest_ptr:    .long  CYGMEM_REGION_rom - REDBOOT_OFFSET
161
162 dcd_data:       .long   0xB17219E9
163 dcd_len:        .long   (49 * 12)
164
165 //DCD
166 //iomux 1
167 // KEY_ROW0 -> EMI_DRAM_D[16]
168 .long 4
169 .long 0xc3fa8008
170 .long 0x1
171 // 2
172 // KEY_ROW1 -> EMI_DRAM_D[17]
173 .long 4
174 .long 0xc3fa800c
175 .long 0x1
176 // 3
177 // KEY_ROW2 -> EMI_DRAM_D[18]
178 .long 4
179 .long 0xc3fa8010
180 .long 0x1
181 // 4
182 // KEY_ROW3 -> EMI_DRAM_D[19]
183 .long 4
184 .long 0xc3fa8014
185 .long 0x1
186 //5
187 // KEY_ROW4 -> EMI_DRAM_D[20]
188 .long 4
189 .long 0xc3fa8018
190 .long 0x1
191 //6
192 // KEY_ROW5 -> EMI_DRAM_D[21]
193 .long 4
194 .long 0xc3fa801c
195 .long 0x1
196 // 7
197 // KEY_ROW6 -> EMI_DRAM_D[22]
198 .long 4
199 .long 0xc3fa8020
200 .long 0x1
201 // 8
202 // KEY_ROW7 -> EMI_DRAM_D[23]
203 .long 4
204 .long 0xc3fa8024
205 .long 0x1
206 // 9
207 // KEY_ROW7
208 // IETM_D0 -> EMI_DRAM_D[24]
209 .long 4
210 .long 0xc3fa8028
211 .long 0x1
212
213 //10
214 // IETM_D1 -> EMI_DRAM_D[25]
215 .long 4
216 .long 0xc3fa802c
217 .long 0x1
218
219 // 11
220 // IETM_D2 -> EMI_DRAM_D[26]
221 .long 4
222 .long 0xc3fa8030
223 .long 0x1
224
225 // 12
226 // IETM_D3 -> EMI_DRAM_D[27]
227 .long 4
228 .long 0xc3fa8034
229 .long 0x1
230
231 // 13
232 // IETM_D4 -> EMI_DRAM_D[28]
233 .long 4
234 .long 0xc3fa8038
235 .long 0x1
236
237 // 14
238 // IETM_D5 -> EMI_DRAM_D[29]
239 .long 4
240 .long 0xc3fa803c
241 .long 0x1
242
243 // 15
244 // IETM_D6 -> EMI_DRAM_D[30]
245 .long 4
246 .long 0xc3fa8040
247 .long 0x1
248
249 // 16
250 // IETM_D7 -> EMI_DRAM_D[31]
251 .long 4
252 .long 0xc3fa8044
253 .long 0x1
254
255 // 17
256 // EIM_EB0 -> DRAM_DQM[2]
257 .long 4
258 .long 0xc3fa8048
259 .long 0x1
260
261 // 18
262 // EIM_EB1 -> DRAM_DQM[3]
263 .long 4
264 .long 0xc3fa804c
265 .long 0x1
266
267 // 19
268 // EIM_ECB -> DRAM_SDQS[2]
269 .long 4
270 .long 0xc3fa805c
271 .long 0x1
272
273 // 20
274 // SW_PAD_CTL_PAD_EIM_ECB -> DDR input type / Pull/Keeper Enabled / Pull /  100KOhm Pull Down / High Drive Strength
275 .long 4
276 .long 0xc3fa82bc
277 .long 0x02c4
278
279 // 21
280 // EIM_LBA -> DRAM_SDQS[3]
281 .long 4
282 .long 0xc3fa8060
283 .long 0x1
284
285 // 22
286 // SW_PAD_CTL_PAD_EIM_LBA -> DDR input type / Pull/Keeper Enabled / Pull /  100KOhm Pull Down / High Drive Strength
287 .long 4
288 .long 0xc3fa82c0
289 .long 0x02c4
290
291 // 23
292 // SW_PAD_CTL_GRP_S7 -> Medium Drive Strength
293 .long 4
294 .long 0xc3fa84a8
295 .long 0x2
296
297 // 24
298 // SW_PAD_CTL_GRP_S8  -> Medium Drive Strength
299 .long 4
300 .long 0xc3fa84b0
301 .long 0x2
302
303 // 25
304 // SW_PAD_CTL_GRP_S9  -> Medium Drive Strength
305 .long 4
306 .long 0xc3fa84b4
307 .long 0x2
308
309 // 26
310 // SW_PAD_CTL_GRP_S10  -> Medium Drive Strength
311 .long 4
312 .long 0xc3fa84e0
313 .long 0x2
314
315 // 27
316 // SW_PAD_CTL_PAD_DRAM_DQM0 -> Medium Drive Strength
317 .long 4
318 .long 0xc3fa8278
319 .long 0x2
320
321 // 28
322 // SW_PAD_CTL_PAD_DRAM_DQM1 -> Medium Drive Strength
323 .long 4
324 .long 0xc3fa827c
325 .long 0x2
326
327 // 29
328 // DRAM_SDQS0  -> Medium Drive Strength
329 .long 4
330 .long 0xc3fa8298
331 .long 0x2
332
333 // 30
334 // DRAM_SDQS1  -> Medium Drive Strength
335 .long 4
336 .long 0xc3fa829c
337 .long 0x2
338
339 // 31
340 // SW_PAD_CTL_GRP_S3  -> Medium Drive Strength
341 .long 4
342 .long 0xc3fa84fc
343 .long 0x2
344
345 // 32
346 // SW_PAD_CTL_GRP_S4  -> Medium Drive Strength
347 .long 4
348 .long 0xc3fa8504
349 .long 0x2
350
351 // 33
352 // SW_PAD_CTL_GRP_S5  -> Medium Drive Strength
353 .long 4
354 .long 0xc3fa848c
355 .long 0x2
356
357 // 34
358 // SW_PAD_CTL_GRP_S6  -> Medium Drive Strength
359 .long 4
360 .long 0xc3fa849c
361 .long 0x2
362
363 // 35
364 // DRAM_SDCLK  -> Medium Drive Strength
365 .long 4
366 .long 0xc3fa8294
367 .long 0x2
368
369 // 36
370 // SW_PAD_CTL_PAD_DRAM_RAS  -> Medium Drive Strength
371 .long 4
372 .long 0xc3fa8280
373 .long 0x2
374
375 // 37
376 // SW_PAD_CTL_PAD_DRAM_CAS  -> Medium Drive Strength
377 .long 4
378 .long 0xc3fa8284
379 .long 0x2
380
381 // 38
382 // SW_PAD_CTL_PAD_DRAM_SDWE -> Medium Drive Strength
383 .long 4
384 .long 0xc3fa8288
385 .long 0x2
386
387 // 39
388 // SW_PAD_CTL_PAD_DRAM_SDCKE0  -> Medium Drive Strength
389 .long 4
390 .long 0xc3fa828c
391 .long 0x2
392
393 // 40
394 // SW_PAD_CTL_PAD_DRAM_SDCKE1  -> Medium Drive Strength
395 .long 4
396 .long 0xc3fa8290
397 .long 0x2
398
399 // set CSD0 1
400 // 41
401 .long 4
402 .long 0xe3fd9000
403 .long 0x80000000
404
405 // Precharge command  2
406 // 42
407 .long 4
408 .long 0xe3fd9014
409 .long 0x04008008
410 // refresh commands 3
411 // 43
412 .long 4
413 .long 0xe3fd9014
414 .long 0x00008010
415
416 // 44
417 .long 4
418 .long 0xe3fd9014
419 .long 0x00008010
420 // LMR with CAS=3 BL=3  5
421 // 45
422 .long 4
423 .long 0xe3fd9014
424 .long 0x00338018
425
426 // 13row 9 col 32 bit sref=4 micro model  6
427 // 46
428 .long 4
429 .long 0xe3fd9000
430 .long 0xB2120000
431
432 // timing parameter 7
433 // 47
434 .long 4
435 .long 0xe3fd9004
436 .long 0x70395729
437
438 // mddr enable RLAT=2  8
439 // 48
440 .long 4
441 .long 0xe3fd9010
442 .long 0x000A0084
443
444 // Normal mode  9
445 // 49
446 .long 4
447 .long 0xe3fd9014
448 .long 0x00000000
449
450 image_len:          .long REDBOOT_IMAGE_SIZE
451 .endm
452 */
453
454 // This macro represents the initial startup code for the platform
455         .macro  _platform_setup1
456 KARO_TX32_SETUP_START:
457 /*
458  *      ARM1136 init
459  *      - invalidate I/D cache/TLB and drain write buffer;
460  *      - invalidate L2 cache
461  *      - unaligned access
462  *      - branch predictions
463  */
464         // mrc p15, 0, r0, c1, c1, 0 // Read Secure Configuration Register data. Why doesn't work???
465         // mcr p15, 0, <Rd>, c1, c1, 0 ; Write Secure Configuration Register data
466 #ifdef ENABLE_IMPRECISE_ABORT
467         mrs     r1, spsr            // save old spsr
468         mrs     r0, cpsr            // read out the cpsr
469         bic     r0, r0, #0x100      // clear the A bit
470         msr     spsr, r0            // update spsr
471         add     lr, pc, #0x8        // update lr
472         movs    pc, lr              // update cpsr
473         nop
474         nop
475         nop
476         nop
477         msr     spsr, r1            // restore old spsr
478 #endif
479         mov     r0, #0
480         mcr     15, 0, r0, c7, c7, 0        /* invalidate I cache and D cache */
481         mcr     15, 0, r0, c8, c7, 0        /* invalidate TLBs */
482         mcr     15, 0, r0, c7, c10, 4       /* Data write barrier */
483
484         /* Also setup the Peripheral Port Remap register inside the core */
485         ldr     r0, ARM_PPMRR       /* start from AIPS 2GB region */
486         mcr     p15, 0, r0, c15, c2, 4
487 #if 0
488         /* Reload data from spare area to 0x400 of main area if booting from NAND */
489         ldr     r0, NFC_BASE_W
490         cmp     pc, r0
491         blo     1f
492         cmp     pc, r1
493         bhi     1f
494 #ifdef BARKER_CODE_SWAP_LOC
495 #if BARKER_CODE_SWAP_LOC != 0x404
496 #error FIXME: the following depends on barker code to be 0x404
497 #endif
498         // Recover the word at 0x404 offset using the one stored in the spare area 0
499         add     r1, r0, #0x400
500         add     r1, r1, #0x4
501         mov     r3, #0x1000
502         ldr     r2, [r0, r3]
503         str     r2, [r1]
504 #endif
505 1:
506 #endif
507 #ifdef L2CC_ENABLED
508         /*** L2 Cache setup/invalidation/disable ***/
509         /* Disable L2 cache first */
510         mov     r0, #L2CC_BASE_ADDR
511         mov     r2, #0
512         str     r2, [r0, #L2_CACHE_CTL_REG]
513         /*
514         * Configure L2 Cache:
515         * - 128k size(16k way)
516         * - 8-way associativity
517         * - 0 ws TAG/VALID/DIRTY
518         * - 4 ws DATA R/W
519         */
520         mov     r2, #0xFF000000
521         add     r2, r2, #0x00F00000
522         ldr     r1, [r0, #L2_CACHE_AUX_CTL_REG]
523         and     r1, r1, r2
524         ldr     r2, L2CACHE_PARAM
525         orr     r1, r1, r2
526         str     r1, [r0, #L2_CACHE_AUX_CTL_REG]
527
528         /* Invalidate L2 */
529         mov     r1, #0xFF
530         str     r1, [r0, #L2_CACHE_INV_WAY_REG]
531 L2_loop:
532         /* Poll Invalidate By Way register */
533         ldr     r2, [r0, #L2_CACHE_INV_WAY_REG]
534         ands    r2, r2, #0xFF
535         bne     L2_loop
536         /*** End of L2 operations ***/
537 #endif
538
539 /*
540  * End of ARM1136 init
541  */
542 init_spba_start:
543         init_spba
544 init_aips_start:
545         init_aips
546 init_max_start:
547         init_max
548 init_m4if_start:
549         init_m4if
550 init_iomux_start:
551         init_iomux
552
553         LED_INIT
554         LED_CTRL 1
555
556         // disable wdog
557         ldr     r0, =0x30
558         ldr     r1, WDOG1_BASE_W
559         strh    r0, [r1]
560
561         /* If SDRAM has been setup, bypass clock/WEIM setup */
562         cmp     pc, #SDRAM_BASE_ADDR
563         blo     external_boot_cont
564         cmp     pc, #(SDRAM_BASE_ADDR + SDRAM_SIZE)
565         blo     internal_boot_cont
566
567 external_boot_cont:
568 init_sdram_start:
569         setup_sdram
570
571 internal_boot_cont:
572 init_clock_start:
573         init_clock
574
575 HWInitialise_skip_SDRAM_setup:
576         ldr     r0, NFC_BASE_W
577         add     r2, r0, #0x1000     // 4K window
578         cmp     pc, r0
579         blo     Normal_Boot_Continue
580         cmp     pc, r2
581         bhs     Normal_Boot_Continue
582
583 NAND_Boot_Start:
584         /* Copy image from flash to SDRAM first */
585         ldr     r1, MXC_REDBOOT_ROM_START
586 1:
587         ldmia   r0!, {r3-r10}
588         stmia   r1!, {r3-r10}
589         cmp     r0, r2
590         blo     1b
591
592         /* Jump to SDRAM */
593         ldr     r1, CONST_0x0FFF
594         and     r0, pc, r1  /* offset of pc */
595         ldr     r1, MXC_REDBOOT_ROM_START
596         add     r1, r1, #0x8
597         add     pc, r0, r1
598         nop
599
600 Now_in_SDRAM:
601 NAND_Copy_Main:
602         // Check if x16/2kb page
603         //      ldr r7, CCM_BASE_ADDR_W
604         //      ldr r7, [r7, #0xC]
605         //      ands r7, r7, #(1 << 30)
606         ldr     r0, NFC_BASE_W                  //r0: nfc base. Reloaded after each page copying
607         mov     r1, #TX37_NAND_PAGE_SIZE        //r1: starting flash addr to be copied. Updated constantly
608                                 // ???? should be dynamic based on the page size kevin todo
609         add     r2, r0, #TX37_NAND_PAGE_SIZE    //r2: end of 3rd RAM buf. Doesn't change ?? dynamic
610
611         ldr     r11, NFC_IP_BASE_W              //r11: NFC IP register base. Doesn't change
612         add     r12, r0, #0x1E00                //r12: NFC AXI register base. Doesn't change
613         ldr     r14, MXC_REDBOOT_ROM_START
614         add     r13, r14, #REDBOOT_IMAGE_SIZE   //r13: end of SDRAM address for copying. Doesn't change
615         add     r14, r14, r1                    //r14: starting SDRAM address for copying. Updated constantly
616
617         //unlock internal buffer
618         mov     r3, #0xFF000000
619         add     r3, r3, #0x00FF0000
620         str     r3, [r11, #0x4]
621         str     r3, [r11, #0x8]
622         str     r3, [r11, #0xC]
623         str     r3, [r11, #0x10]
624         mov     r3, #0x20000        // BLS = 2 -> Buffer Lock Set = unlocked
625         add     r3, r3, #0x4        // WPC = 4 -> write protection command = unlock blocks
626         str     r3, [r11, #0x0]     // kevin - revist for multiple CS ??
627         mov     r3, #0
628         str     r3, [r11, #0x18]
629
630 Nfc_Read_Page:
631         mov     r3, #0x0
632         str     r3, [r12, #0x0]
633         mov     r3, #NAND_LAUNCH_FCMD
634         str     r3, [r12, #0xC]
635         do_wait_op_done
636
637 //  start_nfc_addr_ops(ADDRESS_INPUT_READ_PAGE, addr, nflash_dev_info->base_mask);
638         mov     r4, r1
639         mov     r3, #0
640         do_addr_input   //1st addr cycle
641
642         mov     r3, #0
643         do_addr_input   //2nd addr cycle
644
645         mov     r3, r4, lsr #11
646         and     r3, r3, #0xFF
647         mov     r3, r3, lsl #16
648         do_addr_input   //3rd addr cycle
649
650         mov     r3, r4, lsr #19
651         and     r3, r3, #0xFF
652         mov     r3, r3, lsl #16
653         do_addr_input   //4th addr cycle
654
655         mov     r3, #0x30
656         str     r3, [r12, #0x0]
657         mov     r3, #NAND_LAUNCH_FCMD
658         str     r3, [r12, #0xC]
659         do_wait_op_done
660
661 // write RBA=0 to NFC_CONFIGURATION1
662         mov     r3, #0
663         str     r3, [r12, #0x4]
664
665 //  writel(mode & 0xFF, NAND_LAUNCH_REG)
666         mov     r3, #0x8
667         str     r3, [r12, #0xC]
668         do_wait_op_done
669
670 Copy_Good_Blk:
671         @ copy page
672 1:
673         ldmia   r0!, {r3-r10}
674         stmia   r14!, {r3-r10}
675         cmp     r0, r2
676         blo     1b
677         cmp     r14, r13
678         bge     NAND_Copy_Main_done
679         add     r1, r1, #TX37_NAND_PAGE_SIZE
680         ldr     r0, NFC_BASE_W
681         b       Nfc_Read_Page
682
683 NAND_Copy_Main_done:
684
685 Normal_Boot_Continue:
686 #ifdef CYG_HAL_STARTUP_ROMRAM   /* enable running from RAM */
687         /* Copy image from flash to SDRAM first */
688         ldr     r0, =0xFFFFF000
689         and     r0, r0, pc
690         ldr     r1, MXC_REDBOOT_ROM_START
691         cmp     r0, r1
692         beq     HWInitialise_skip_SDRAM_copy
693
694         add     r2, r0, #REDBOOT_IMAGE_SIZE
695 1:
696         ldmia   r0!, {r3-r10}
697         stmia   r1!, {r3-r10}
698         cmp     r0, r2
699         ble     1b
700
701         /* Jump to SDRAM */
702         ldr     r1, =0xFFFF
703         and     r0, pc, r1      /* offset of pc */
704         ldr     r1, MXC_REDBOOT_ROM_START
705         add     r1, r1, #0x8
706         add     pc, r0, r1
707         nop
708 #endif /* CYG_HAL_STARTUP_ROMRAM */
709
710 HWInitialise_skip_SDRAM_copy:
711 /*
712  * Note:
713  *  IOMUX/PBC setup is done in C function plf_hardware_init() for simplicity
714  */
715 STACK_Setup:
716         // Set up a stack [for calling C code]
717         ldr     r1, =__startup_stack
718         ldr     r2, =RAM_BANK0_BASE
719         orr     sp, r1, r2
720
721         // Create MMU tables
722         bl      hal_mmu_init
723
724         // Enable MMU
725         ldr     r2, =10f
726         mrc     MMU_CP, 0, r1, MMU_Control, c0      // get c1 value to r1 first
727         orr     r1, r1, #7                          // enable MMU bit
728         orr     r1, r1, #0x800                      // enable z bit
729         b       9f
730         .align  5
731 9:
732         mcr     MMU_CP, 0, r1, MMU_Control, c0
733         mov     pc,r2   /* Change address spaces */
734         nop
735 10:
736         .endm                   // _platform_setup1
737
738 #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
739 #define PLATFORM_SETUP1
740 #endif
741         /* Do nothing */
742         .macro  init_spba
743         .endm  /* init_spba */
744
745         /* AIPS setup - Only setup MPROTx registers. The PACR default values are good.*/
746         .macro init_aips
747         /*
748         * Set all MPROTx to be non-bufferable, trusted for R/W,
749         * not forced to user-mode.
750         */
751         ldr r0, AIPS1_CTRL_BASE_ADDR_W
752         ldr r1, AIPS1_PARAM_W
753         str r1, [r0, #0x00]
754         str r1, [r0, #0x04]
755         ldr r0, AIPS2_CTRL_BASE_ADDR_W
756         str r1, [r0, #0x00]
757         str r1, [r0, #0x04]
758         .endm /* init_aips */
759
760         /* MAX (Multi-Layer AHB Crossbar Switch) setup */
761         .macro init_max
762         ldr r0, MAX_BASE_ADDR_W
763 #if 0
764         /* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */
765         ldr r1, MAX_PARAM1
766         str r1, [r0, #0x000]    /* for S0 */
767         str r1, [r0, #0x100]    /* for S1 */
768         str r1, [r0, #0x200]    /* for S2 */
769         str r1, [r0, #0x300]    /* for S3 */
770         str r1, [r0, #0x400]    /* for S4 */
771         /* SGPCR - always park on last master */
772         ldr r1, =0x10
773         str r1, [r0, #0x010]    /* for S0 */
774         str r1, [r0, #0x110]    /* for S1 */
775         str r1, [r0, #0x210]    /* for S2 */
776         str r1, [r0, #0x310]    /* for S3 */
777         str r1, [r0, #0x410]    /* for S4 */
778         /* MGPCR - restore default values */
779         ldr r1, =0x0
780         str r1, [r0, #0x800]    /* for M0 */
781         str r1, [r0, #0x900]    /* for M1 */
782         str r1, [r0, #0xA00]    /* for M2 */
783         str r1, [r0, #0xB00]    /* for M3 */
784         str r1, [r0, #0xC00]    /* for M4 */
785         str r1, [r0, #0xD00]    /* for M5 */
786 #endif
787         .endm /* init_max */
788
789         .macro  init_clock
790         /*
791         * Clock setup
792         * After this step,
793
794         Module      Freq (MHz)
795         ===========================
796         ARM core    532         ap_clk
797         AHB         133         ahb_clk
798         IP          66.5        ipg_clk
799         EMI         133         ddr_clk
800
801         * All other clocks can be figured out based on this.
802         */
803         /*
804         * Step 1: Switch to step clock
805         */
806         ldr     r0, CCM_BASE_ADDR_W
807         mov     r1, #0x00000104
808         str     r1, [r0, #CLKCTL_CCSR]
809
810         /* Step 2: Setup PLL's */
811         /* Set PLL1 to be 532MHz */
812         ldr r0, PLL1_BASE_ADDR_W
813
814         mov r1, #0x1200
815         add r1, r1, #0x22
816         str r1, [r0, #PLL_DP_CTL]       /* Set DPLL ON (set UPEN bit); BRMO=1 */
817         ldr r1, =0x2
818         str r1, [r0, #PLL_DP_CONFIG]  /* Enable auto-restart AREN bit */
819
820         ldr r1, =0x50
821         str r1, [r0, #PLL_DP_OP]
822         ldr r1, =23
823         str r1, [r0, #PLL_DP_MFD]
824         ldr r1, =13
825         str r1, [r0, #PLL_DP_MFN]
826
827         ldr r1, =0x50
828         str r1, [r0, #PLL_DP_HFS_OP]
829         ldr r1, =23
830         str r1, [r0, #PLL_DP_HFS_MFD]
831         ldr r1, =13
832         str r1, [r0, #PLL_DP_HFS_MFN]
833
834         /* Now restart PLL 1 */
835         ldr r1, PLL_VAL_0x1232
836         str r1, [r0, #PLL_DP_CTL]
837 1:
838         ldr r1, [r0, #PLL_DP_CTL]
839         ands r1, r1, #0x1
840         beq 1b
841
842         /*
843         * Step 2: Setup PLL2 to 665 MHz.
844         */
845         ldr r0, PLL2_BASE_ADDR_W
846
847         ldr r1, =0x1200
848         add r1, r1, #0x22
849         str r1, [r0, #PLL_DP_CTL]       /* Set DPLL ON (set UPEN bit); BRMO=1 */
850         ldr r1, =0x2
851         str r1, [r0, #PLL_DP_CONFIG]  /* Enable auto-restart AREN bit */
852
853         ldr r1, =0x60
854         str r1, [r0, #PLL_DP_OP]
855         ldr r1, =95
856         str r1, [r0, #PLL_DP_MFD]
857         ldr r1, =89
858         str r1, [r0, #PLL_DP_MFN]
859
860         ldr r1, =0x60
861         str r1, [r0, #PLL_DP_HFS_OP]
862         ldr r1, =95
863         str r1, [r0, #PLL_DP_HFS_MFD]
864         ldr r1, =89
865         str r1, [r0, #PLL_DP_HFS_MFN]
866
867         /* Now restart PLL 2 */
868         ldr r1, PLL_VAL_0x1232
869         str r1, [r0, #PLL_DP_CTL]
870 1:
871         ldr r1, [r0, #PLL_DP_CTL]
872         ands r1, r1, #0x1
873         beq 1b
874
875         /*
876         * Set PLL 3 to 216MHz
877         */
878         ldr r0, PLL3_BASE_ADDR_W
879
880         ldr r1, PLL_VAL_0x222
881         str r1, [r0, #PLL_DP_CTL]       /* Set DPLL ON (set UPEN bit); BRMO=1 */
882         ldr r1, =0x2
883         str r1, [r0, #PLL_DP_CONFIG]  /* Enable auto-restart AREN bit */
884
885         ldr r1, =0x92
886         str r1, [r0, #PLL_DP_OP]
887         ldr r1, =0x0
888         str r1, [r0, #PLL_DP_MFD]
889         ldr r1, =0x0
890         str r1, [r0, #PLL_DP_MFN]
891
892         ldr r1, =0x91
893         str r1, [r0, #PLL_DP_HFS_OP]
894         ldr r1, =0x0
895         str r1, [r0, #PLL_DP_HFS_MFD]
896         ldr r1, =0x0
897         str r1, [r0, #PLL_DP_HFS_MFN]
898
899         /* Now restart PLL 3 */
900         ldr r1, PLL_VAL_0x232
901         str r1, [r0, #PLL_DP_CTL]
902
903 1:
904         ldr r1, [r0, #PLL_DP_CTL]
905         ands r1, r1, #0x1
906         beq 1b
907         /* End of PLL 3 setup */
908
909         /* Setup the ARM platform clock dividers */
910         ldr r0, PLATFORM_BASE_ADDR_W
911         ldr r1, PLATFORM_CLOCK_DIV_W
912         str r1, [r0, #0x18]
913
914         /*
915         * Step 3: switching to PLL 1 and restore default register values.
916         */
917         ldr r0, CCM_BASE_ADDR_W
918         mov r1, #0x00000100
919         str r1, [r0, #CLKCTL_CCSR]
920
921         mov r1, #0x000A0000
922         add r1, r1, #0x00000F0
923         str r1, [r0, #CLKCTL_CCOSR]
924         /* Use 133MHz for DDR clock */
925         mov r1, #0x1C00
926         str r1, [r0, #CLKCTL_CAMR]
927         /* Use PLL 2 for UART's, get 66.5MHz from it */
928         ldr r1, CCM_VAL_0xA5A6A020
929         str r1, [r0, #CLKCTL_CSCMR1]
930         ldr r1, CCM_VAL_0x01450B21
931         str r1, [r0, #CLKCTL_CSCDR1]
932
933         mov r1, #0x1C
934         str r1, [r0, #CLKCTL_CBCDR7]
935         mov r1, #1
936         str r1, [r0, #4]
937         .endm /* init_clock */
938
939         /* M4IF setup */
940         .macro init_m4if
941         /* Configure M4IF registers, VPU and IPU given higher priority (=0x4)
942         IPU accesses with ID=0x1 given highest priority (=0xA) */
943         ldr r1, M4IF_BASE_W
944         ldr r0, M4IF_0x00000a01
945         str r0, [r1, #M4IF_FIDBP]
946
947         ldr r0, M4IF_0x00000404
948         str r0, [r1, #M4IF_FBPM0]
949         .endm /* init_m4if */
950
951         .macro setup_sdram
952         ldr r0, ESDCTL_BASE_W
953         /* Set CSD0 */
954         mov     r1, #0x80000000
955         str     r1, [r0, #ESDCTL_ESDCTL0]
956 1:
957         @ wait for SDRAM ready
958         ldr     r2, [r0, #ESDCTL_ESDMISC]
959         and     r2, r2, r1
960         beq     1b
961
962         /* Precharge command */
963         ldr     r1, SDRAM_CMD_PRECHG
964         str     r1, [r0, #ESDCTL_ESDSCR]
965
966         /* 2 refresh commands */
967         ldr     r1, SDRAM_CMD_SLFRFSH
968         .rept   2
969         str     r1, [r0, #ESDCTL_ESDSCR]
970         .endr
971
972         /* LMR with CAS Latency=3 and BurstLength=3->8words */
973         ldr     r1, SDRAM_CMD_MODEREG
974         str     r1, [r0, #ESDCTL_ESDSCR]
975
976         /* 13 ROW, 9 COL, 32Bit, SREF=4 */
977         ldr     r1, SDRAM_ESDCTL0_VAL
978         str     r1, [r0, #ESDCTL_ESDCTL0]
979
980         /* Timing parameters */
981         ldr     r1, SDRAM_ESDCFG0_VAL
982         str     r1, [r0, #ESDCTL_ESDCFG0]
983
984         /* MDDR enable, RALAT=1 */
985         ldr     r1, SDRAM_ESDMISC_VAL
986         str     r1, [r0, #ESDCTL_ESDMISC]
987
988         /* Normal mode */
989         mov     r1, #0x00000000
990         str     r1, [r0, #ESDCTL_ESDSCR]
991         .endm
992
993         .macro do_wait_op_done
994 1:
995         ldr     r3, [r11, #0x18]
996         ands    r3, r3, #NFC_IPC_INT
997         beq     1b
998         mov     r3, #0x0
999         str     r3, [r11, #0x18]
1000         .endm   // do_wait_op_done
1001
1002         .macro do_addr_input
1003         str     r3, [r12, #0x0]
1004         mov     r3, #NAND_LAUNCH_FADD
1005         str     r3, [r12, #0xC]
1006         do_wait_op_done
1007         .endm   // do_addr_input
1008
1009         /* To support 133MHz DDR */
1010         .macro  init_iomux
1011         ldr     r0, IOMUXC_BASE_ADDR_W
1012
1013         // DDR signal setup for D16-D31 and drive strength
1014         ldr     r8, =0x1
1015         add     r1, r0, #8
1016         add     r2, r0, #0x4C
1017 1:
1018         stmia r1!, {r8}
1019         cmp     r1, r2
1020         bls     1b
1021
1022         str     r8, [r0, #0x5C]
1023         str     r8, [r0, #0x60]
1024
1025         add     r2, r0, #0x200
1026         mov     r8, #0x2C4
1027         str     r8, [r2, #0xBC]
1028         str     r8, [r2, #0xC0]
1029
1030         ldr     r8, =0x2
1031         str     r8, [r0, #0x4A8]
1032         str     r8, [r0, #0x4B0]
1033         str     r8, [r0, #0x4B4]
1034         str     r8, [r0, #0x4E0]
1035         str     r8, [r0, #0x4FC]
1036         str     r8, [r0, #0x504]
1037         str     r8, [r0, #0x48C]
1038         str     r8, [r0, #0x49C]
1039
1040         add     r1, r0, #0x278
1041         add     r2, r0, #0x29C
1042 2:
1043         stmia   r1!, {r8}
1044         cmp     r1, r2
1045         bls     2b
1046         .endm /* init_iomux */
1047
1048 #define PLATFORM_VECTORS        _platform_vectors
1049         .macro  _platform_vectors
1050         .globl  _board_BCR, _board_CFG
1051 _board_BCR:             .long   0       // Board Control register shadow
1052 _board_CFG:             .long   0       // Board Configuration (read at RESET)
1053         .endm
1054
1055 KaRo_MSG:               .asciz  "KARO TX37 " __DATE__ " " __TIME__ "\n"
1056 ARM_PPMRR:              .word   0x80000016
1057 L2CACHE_PARAM:          .word   0x0003001B
1058 WDOG1_BASE_W:           .word   WDOG1_BASE_ADDR
1059 IIM_SREV_REG_VAL:       .word   IIM_BASE_ADDR + IIM_SREV_OFF
1060 AIPS1_CTRL_BASE_ADDR_W: .word   AIPS1_CTRL_BASE_ADDR
1061 AIPS2_CTRL_BASE_ADDR_W: .word   AIPS2_CTRL_BASE_ADDR
1062 AIPS1_PARAM_W:          .word   0x77777777
1063 MAX_BASE_ADDR_W:        .word   MAX_BASE_ADDR
1064 MAX_PARAM1:             .word   0x00302154
1065 ESDCTL_BASE_W:          .word   ESDCTL_BASE
1066 M4IF_BASE_W:            .word   M4IF_BASE
1067 M4IF_0x00000a01:        .word   0x00000a01
1068 M4IF_0x00000404:        .word   0x00000404
1069 NFC_BASE_W:             .word   NFC_BASE
1070 NFC_IP_BASE_W:          .word   NFC_IP_BASE
1071 SDRAM_CMD_PRECHG:       .word   0x04008008
1072 SDRAM_CMD_SLFRFSH:      .word   0x00008010
1073 SDRAM_CMD_MODEREG:      .word   0x00338018
1074 SDRAM_ESDCTL0_VAL:      .word   0xB2120000
1075 SDRAM_0x899F6BBA:       .word   0x899F6BBA
1076 SDRAM_0x000A1104:       .word   0x000A1104
1077 SDRAM_ESDCFG0_VAL:      .word   0x70395729
1078 SDRAM_ESDMISC_VAL:      .word   0x000A0084
1079 IOMUXC_BASE_ADDR_W:     .word   IOMUXC_BASE_ADDR
1080 GPIO2_BASE_ADDR_W:      .word   GPIO2_BASE_ADDR
1081 MXC_REDBOOT_ROM_START:  .word   SDRAM_BASE_ADDR + SDRAM_SIZE - REDBOOT_OFFSET
1082 SDRAM_ADDR_MASK:        .word   0xfff00000
1083 CONST_0x0FFF:           .word   0x0FFF
1084 CCM_BASE_ADDR_W:        .word   CCM_BASE_ADDR
1085 PLATFORM_BASE_ADDR_W:   .word   PLATFORM_BASE_ADDR
1086 PLATFORM_CLOCK_DIV_W:   .word   0x00077713
1087 CCM_VAL_0x01450B21:     .word   0x01450B21
1088 CCM_VAL_0xA5A6A020:     .word   0xA5A6A020
1089 PLL_VAL_0x222:          .word   0x222
1090 PLL_VAL_0x232:          .word   0x232
1091 PLL1_BASE_ADDR_W:       .word   PLL1_BASE_ADDR
1092 PLL2_BASE_ADDR_W:       .word   PLL2_BASE_ADDR
1093 PLL3_BASE_ADDR_W:       .word   PLL3_BASE_ADDR
1094 PLL_VAL_0x1232:         .word   0x1232
1095
1096 /*--------------------------------------------------------------------------*/
1097 /* end of hal_platform_setup.h                                              */
1098 #endif /* CYGONCE_HAL_PLATFORM_SETUP_H */