]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/arm/mx27/karo/v1_0/include/hal_platform_setup.h
RedBoot STK5 Release 2010-03-04
[karo-tx-redboot.git] / packages / hal / arm / mx27 / karo / 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_tx27.h>          // Platform specific hardware definitions
51 #include CYGHWR_MEMORY_LAYOUT_H
52
53 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
54 #define PLATFORM_SETUP1 _platform_setup1
55 #define CYGHWR_HAL_ARM_HAS_MMU
56
57 #ifdef CYG_HAL_STARTUP_ROMRAM
58 #define CYGSEM_HAL_ROM_RESET_USES_JUMP
59 #endif
60
61 #define TX27_NAND_PAGE_SIZE             2048
62 #define TX27_NAND_BLKS_PER_PAGE         64
63
64 #define CYGHWR_HAL_ROM_VADDR            0x0
65
66 #ifndef CYGOPT_HAL_ARM_TX27_DEBUG
67 #define LED_ON
68 #define LED_OFF
69         .macro  LED_CTRL,val
70         .endm
71         .macro  LED_BLINK,val
72         .endm
73         .macro  DELAY,val
74         .endm
75 #else
76 #define CYGHWR_LED_MACRO        LED_BLINK #\x
77 #define LED_ON                  bl      led_on
78 #define LED_OFF                 bl      led_off
79         .macro  DELAY,ms
80         ldr     r10, =\ms
81 111:
82         subs    r10, r10, #1
83         bmi     113f
84         ldr     r9, =3600
85 112:
86         subs    r9, r9, #1
87         bne     112b
88         b       111b
89         .ltorg
90 113:
91         .endm
92
93         .macro LED_CTRL,val
94         // switch user LED (PF13) on STK5
95         ldr     r10, GPIOF_BASE
96         // PTF_DR
97         mov     r9, \val
98         cmp     r9, #0
99         movne   r9, #(1 << 13)  // LED ON
100         moveq   r9, #0          // LED OFF
101         str     r9, [r10, #GPIO_DR]
102         .endm
103
104         .macro LED_BLINK,val
105         mov     r3, \val
106 211:
107         subs    r3, r3, #1
108         bmi     212f
109         LED_CTRL #1
110         DELAY   200
111         LED_CTRL #0
112         DELAY   300
113         b       211b
114 212:
115         DELAY   1000
116         .endm
117 #endif
118
119         .macro LED_INIT
120         // initialize GPIO PF13 for LED on STK5
121         ldr     r10, GPIOF_BASE
122         // PTF_OCR1
123         mov     r9, #(3 << (2 * 13))
124         str     r9, [r10, #GPIO_OCR1]
125         // PTF_GIUS
126         ldr     r9, [r10, #GPIO_GIUS]
127         orr     r9, r9, #(1 << 13)
128         str     r9, [r10, #GPIO_GIUS]
129         // PTF_DDIR
130         mov     r9,#(1 << 13)
131         str     r9, [r10, #GPIO_DDIR]
132         .endm
133
134 // This macro represents the initial startup code for the platform
135 // r11 is reserved to contain chip rev info in this file
136         .macro  _platform_setup1
137 KARO_TX27_SETUP_START:
138         // invalidate I/D cache/TLB
139         mov     r0, #0
140         mcr     15, 0, r0, c7, c7, 0    /* invalidate I cache and D cache */
141         mcr     15, 0, r0, c8, c7, 0    /* invalidate TLBs */
142         mcr     15, 0, r0, c7, c10, 4   /* Data Write Barrier */
143
144 init_aipi_start:
145         init_aipi
146
147         /* configure GPIO PB22 (OSC26M enable) as output high */
148         ldr     r10, GPIOB_BASE
149
150         // PTB_OCR1
151         mov     r9, #(3 << (2 * (22 - 16)))
152         str     r9, [r10, #GPIO_OCR2]
153         // PTB_DR
154         ldr     r9, [r10, #GPIO_DR]
155         orr     r9, r9, #(1 << 22)
156         str     r9, [r10, #GPIO_DR]
157         // PTB_GIUS
158         ldr     r9, [r10, #GPIO_GIUS]
159         orr     r9, r9, #(1 << 22)
160         str     r9, [r10, #GPIO_GIUS]
161         // PTB_DDIR
162         mov     r9,#(1 << 22)
163         str     r9, [r10, #GPIO_DDIR]
164
165         LED_INIT
166
167         // setup System Controls
168         ldr     r0, SOC_SYSCTRL_BASE_W
169         mov     r1, #0x03
170         str     r1, [r0, #(SOC_SYSCTRL_PCSR - SOC_SYSCTRL_BASE)]
171         // select 2kpage NAND (NF_FMS), CSD0, CS3
172         mvn     r1, #(FMCR_SDCS1_SEL | FMCR_NF_16BIT | FMCR_SLCDC_SEL)
173         str     r1, [r0, #(SOC_SYSCTRL_FMCR - SOC_SYSCTRL_BASE)]
174
175 init_max_start:
176         init_max
177 init_drive_strength_start:
178         init_drive_strength
179
180         // check if sdram has been setup
181         cmp     pc, #SDRAM_BASE_ADDR
182         blo     init_clock_start
183         cmp     pc, #(SDRAM_BASE_ADDR + SDRAM_SIZE)
184         blo     HWInitialise_skip_SDRAM_setup
185
186 init_clock_start:
187         init_clock
188 init_sdram_start:
189         LED_BLINK #1
190         setup_sdram_ddr
191         LED_BLINK #2
192 HWInitialise_skip_SDRAM_setup:
193         ldr     r0, NFC_BASE_W
194         add     r2, r0, #0x800          // 2K window
195         cmp     pc, r0
196         blo     Normal_Boot_Continue
197         cmp     pc, r2
198         bhi     Normal_Boot_Continue
199
200 NAND_Boot_Start:
201         /* Copy image from flash to SDRAM first */
202         ldr     r1, MXC_REDBOOT_RAM_START
203 1:
204         ldmia   r0!, {r3-r10}
205         stmia   r1!, {r3-r10}
206         cmp     r0, r2
207         blo     1b
208
209         LED_ON
210         ldr     r1, MXC_REDBOOT_RAM_START
211         ldr     r0, NFC_BASE_W
212 2:
213         ldr     r3, [r1], #4
214         ldr     r4, [r0], #4
215         cmp     r3, r4
216         bne     3f
217
218         cmp     r0, r2
219         blo     2b
220         LED_OFF
221         b       4f
222 3:
223         LED_BLINK #3
224         b       3b
225 4:
226         LED_ON
227         /* Jump to SDRAM */
228         bl      jump_to_sdram
229         LED_OFF
230 NAND_Copy_Main:
231         ldr     r0, NFC_BASE_W  //r0: nfc base. Reloaded after each page copying
232         mov     r1, #TX27_NAND_PAGE_SIZE //r1: starting flash addr to be copied. Updated constantly
233         add     r2, r0, #TX27_NAND_PAGE_SIZE //r2: end of 1st RAM buf. Doesn't change
234         add     r4, r0, #0xE00  //r4: NFC register base. Doesn't change
235         ldr     r5, MXC_REDBOOT_RAM_START
236         add     r6, r5, #REDBOOT_IMAGE_SIZE //r6: end of SDRAM address for copying. Doesn't change
237         add     r5, r5, r1      //r5: starting SDRAM address for copying. Updated constantly
238
239         // enable ECC, disable interrupts
240         mov     r3, #(NAND_FLASH_CONFIG1_INT_MSK | NAND_FLASH_CONFIG1_ECC_EN)
241         strh    r3, [r4, #NAND_FLASH_CONFIG1_REG_OFF]
242
243         //unlock internal buffer
244         mov     r3, #0x2
245         strh    r3, [r4, #0xA]
246
247 Nfc_Read_Page:
248         LED_ON
249         mov     r8, #0
250         strh    r8, [r4, #RAM_BUFFER_ADDRESS_REG_OFF]
251
252         mov     r3, #0x0
253         bl      nfc_cmd_input
254
255         LED_ON
256         mov     r3, #0
257         bl      nfc_addr_input
258         LED_ON
259         mov     r3, #0
260         bl      nfc_addr_input  //2nd addr cycle
261         LED_ON
262         mov     r3, r1, lsr #11
263         bl      nfc_addr_input  //3rd addr cycle
264         LED_ON
265         mov     r3, r1, lsr #19
266         bl      nfc_addr_input  //4th addr cycle
267
268         LED_ON
269         mov     r3, #0x30
270         bl      nfc_cmd_input
271
272         LED_ON
273         bl      nfc_data_output
274         LED_ON
275         strh    r8, [r4, #RAM_BUFFER_ADDRESS_REG_OFF]
276         bl      nfc_data_output
277         LED_ON
278         strh    r8, [r4, #RAM_BUFFER_ADDRESS_REG_OFF]
279         bl      nfc_data_output
280         LED_ON
281         strh    r8, [r4, #RAM_BUFFER_ADDRESS_REG_OFF]
282         bl      nfc_data_output
283 #if 1
284         // check for bad block
285         mov     r3, r1, lsl #(32-17)    // get rid of block number
286         cmp     r3, #(TX27_NAND_PAGE_SIZE << (32-17)) // check if not first or second page in block
287         bhi     Copy_Good_Blk
288 #else
289         b       Copy_Good_Blk
290 #endif
291         add     r9, r0, #TX27_NAND_PAGE_SIZE            //r3 -> spare area buf 0
292         ldrh    r9, [r9, #0x4]
293         and     r9, r9, #0xFF00
294         cmp     r9, #0xFF00
295         beq     Copy_Good_Blk
296         // really sucks. Bad block!!!!
297         cmp     r3, #0x0
298         beq     Skip_bad_block
299         // even suckier since we already read the first page!
300         sub     r5, r5, #TX27_NAND_PAGE_SIZE    //rewind 1 page for the sdram pointer
301         sub     r1, r1, #TX27_NAND_PAGE_SIZE            //rewind 1 page for the flash pointer
302 Skip_bad_block:
303 #ifdef CYGOPT_HAL_ARM_TX27_DEBUG
304         LED_BLINK #1
305         b Skip_bad_block
306 #endif
307         add     r1, r1, #(TX27_NAND_BLKS_PER_PAGE*TX27_NAND_PAGE_SIZE)
308         b       Nfc_Read_Page
309
310 Copy_Good_Blk:
311         // copying page
312 1:
313         ldmia   r0!, {r7-r14}
314         stmia   r5!, {r7-r14}
315         cmp     r0, r2
316         blo     1b
317
318         LED_ON
319         LED_OFF
320         cmp     r5, r6
321         bge     NAND_Copy_Main_done
322
323         add     r1, r1, #TX27_NAND_PAGE_SIZE
324         ldr     r0, NFC_BASE_W
325         b       Nfc_Read_Page
326 NAND_Copy_Main_done:
327
328 Normal_Boot_Continue:
329 //      bl      jump_to_sdram
330 // Code and all data used up to here must fit within the first 2KiB of FLASH ROM!
331 #ifdef CYG_HAL_STARTUP_ROMRAM   /* enable running from RAM */
332         /* Copy image from flash to SDRAM first */
333         ldr     r0, =0xFFFFF000
334         and     r0, r0, pc
335         ldr     r1, MXC_REDBOOT_RAM_START
336         cmp     r0, r1
337         beq     HWInitialise_skip_SDRAM_copy
338
339         add     r2, r0, #REDBOOT_IMAGE_SIZE
340 1:
341         ldmia   r0!, {r7-r14}
342         stmia   r1!, {r7-r14}
343         cmp     r0, r2
344         ble     1b
345
346         bl      jump_to_sdram
347 Now_in_SDRAM:
348         LED_BLINK #3
349 #endif /* CYG_HAL_STARTUP_ROMRAM */
350
351 HWInitialise_skip_SDRAM_copy:
352         LED_BLINK #2
353
354 init_cs0_sync_start:
355         init_cs0_sync
356
357 NAND_ClockSetup:
358         ldr     r1, =(SOC_CRM_BASE)
359         ldr     r2, [r1, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
360         bic     r2, r2, #0x0200
361         orr     r2, r2, #0x01C0
362         ldr     r1, =(SOC_CRM_BASE)
363         str     r2, [r1, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
364
365 /* end of NAND clock divider setup */
366
367         // TLSbo76381: enable USB/PP/DMA burst override bits in GPCR
368         ldr     r1, =(SOC_SYSCTRL_GPCR)
369         ldr     r2, [r1]
370         orr     r2, r2, #0x700
371         str     r2, [r1]
372
373         // Set up a stack [for calling C code]
374         ldr     r1, =__startup_stack
375         ldr     r2, =RAM_BANK0_BASE
376         orr     sp, r1, r2
377
378         LED_ON
379         // Create MMU tables
380         bl      hal_mmu_init
381         LED_OFF
382
383         // Enable MMU
384         ldr     r2, =10f
385         mrc     MMU_CP, 0, r1, MMU_Control, c0          // get c1 value to r1 first
386         orr     r1, r1, #7                              // enable MMU bit
387         mcr     MMU_CP, 0, r1, MMU_Control, c0
388         b       9f
389         .align  5
390 9:
391         mov     pc,r2   /* Change address spaces */
392 10:
393         nop
394         .endm                   // _platform_setup1
395
396 #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
397 #define PLATFORM_SETUP1
398 #endif
399
400         .macro init_clock
401         ldr     r0, SOC_CRM_BASE_W
402         // disable MPLL/SPLL first
403         ldr     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
404         bic     r1, r1, #0x3
405         str     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
406
407         // configure MPCTL0
408         ldr     r1, CRM_MPCTL0_VAL2_W
409         str     r1, [r0, #(SOC_CRM_MPCTL0 - SOC_CRM_BASE)]
410
411         // configure SPCTL0
412         ldr     r1, CRM_SPCTL0_VAL2_W
413         str     r1, [r0, #(SOC_CRM_SPCTL0 - SOC_CRM_BASE)]
414
415         ldr r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
416 #ifdef PLL_REF_CLK_32768HZ
417         // Make sure to use CKIL
418         bic     r1, r1, #(3 << 16)
419 #else
420         orr     r1, r1, #(3 << 16)              // select 26MHz
421 #endif
422         orr     r1, r1, #0x000C0000             // restart SPLL and MPLL
423         orr     r1, r1, #0x00000003             // enable SPLL and MPLL
424         str     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
425
426         // add some delay here
427         mov     r1, #0x1000
428 1:
429         subs    r1, r1, #0x1
430         bne     1b
431
432         ldr     r1, SOC_CRM_CSCR2_W
433         str     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
434
435         // Set divider of H264_CLK to zero, NFC to 3.
436         ldr     r1, [r0, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
437         bic     r1, r1, #0x0000FC00
438         str     r1, [r0, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
439
440         /* Configure PCDR1 */
441         ldr     r1, SOC_CRM_PCDR1_W
442         str     r1, [r0, #(SOC_CRM_PCDR1 - SOC_CRM_BASE)]
443
444         // Configure PCCR0 and PCCR1
445         ldr     r1, SOC_CRM_PCCR0_W
446         str     r1, [r0, #(SOC_CRM_PCCR0 - SOC_CRM_BASE)]
447
448         ldr     r1, [r0, #(SOC_CRM_PCCR1 - SOC_CRM_BASE)]
449         orr     r1, r1, #0x0780
450         str     r1, [r0, #(SOC_CRM_PCCR1 - SOC_CRM_BASE)]
451         // make default CLKO to be FCLK
452         ldr     r1, [r0, #(SOC_CRM_CCSR - SOC_CRM_BASE)]
453         and     r1, r1, #0xFFFFFFE0
454         orr     r1, r1, #0x7
455         str     r1, [r0, #(SOC_CRM_CCSR - SOC_CRM_BASE)]
456         .endm //init_clock
457
458         .macro init_cs0
459         ldr     r1, SOC_CS0_CTL_BASE_W
460         ldr     r2, CS0_CSCRU_VAL
461         str     r2, [r1, #CSCRU_OFFSET]
462         ldr     r2, CS0_CSCRL_VAL
463         str     r2, [r1, #CSCRL_OFFSET]
464         ldr     r2, CS0_CSCRA_VAL
465         str     r2, [r1, #CSCRA_OFFSET]
466         .endm // init_cs0
467
468         /* CS0 sync mode setup */
469         .macro init_cs0_sync
470         /*
471         * Sync mode (AHB Clk = 133MHz ; BCLK = 44.3MHz):
472         */
473         ldr     r0, =SOC_CS0_CTL_BASE
474         ldr     r1, CS0_CSCRU_SYNC_VAL
475         str     r1, [r0, #CSCRU_OFFSET]
476         ldr     r1, CS0_CSCRL_SYNC_VAL
477         str     r1, [r0, #CSCRL_OFFSET]
478         ldr     r1, CS0_CSCRA_SYNC_VAL
479         str     r1, [r0, #CSCRA_OFFSET]
480         .endm /* init_cs0_sync */
481
482         .macro init_cs4 /* ADS board expanded IOs */
483         ldr     r1, SOC_CS4_CTL_BASE_W
484         ldr     r2, CS4_CSCRU_VAL
485         str     r2, [r1, #CSCRU_OFFSET]
486         ldr     r2, CS4_CSCRL_VAL
487         str     r2, [r1, #CSCRL_OFFSET]
488         ldr     r2, CS4_CSCRA_VAL
489         str     r2, [r1, #CSCRA_OFFSET]
490         .endm   /* init_cs4 */
491
492         .macro init_aipi
493         // setup AIPI1 and AIPI2
494         mov     r0, #SOC_AIPI1_BASE
495         ldr     r1, AIPI1_PSR0_VAL
496         str     r1, [r0]  /* PSR0 */
497         ldr     r2, AIPI1_PSR1_VAL
498         str     r2, [r0, #4]  /* PSR1 */
499         // set r0 = AIPI2 base
500         add     r0, r0, #0x20000
501         mov     r1, #0x0
502         str     r1, [r0]  /* PSR0 */
503         mvn     r2, #0
504         str     r2, [r0, #4]  /* PSR1 */
505         .endm // init_aipi
506
507         .macro init_max
508         ldr     r0, SOC_MAX_BASE_W
509         add     r1, r0, #MAX_SLAVE_PORT1_OFFSET
510         add     r2, r0, #MAX_SLAVE_PORT2_OFFSET
511         add     r0, r0, #MAX_SLAVE_PORT0_OFFSET
512
513         /* MPR and AMPR */
514         ldr     r6, SOC_MAX_MPR_VAL     /* Priority SLCD>EMMA>DMA>Codec>DAHB>IAHB */
515         str     r6, [r0, #MAX_SLAVE_MPR_OFFSET]   /* same for all slave ports */
516         str     r6, [r0, #MAX_SLAVE_AMPR_OFFSET]
517         str     r6, [r1, #MAX_SLAVE_MPR_OFFSET]
518         str     r6, [r1, #MAX_SLAVE_AMPR_OFFSET]
519         str     r6, [r2, #MAX_SLAVE_MPR_OFFSET]
520         str     r6, [r2, #MAX_SLAVE_AMPR_OFFSET]
521         .endm //init_max
522
523         .macro init_drive_strength
524         ldr     r0, SOC_SYSCTRL_BASE_W
525         ldr     r1, DS_DSCR_VAL
526         str     r1, [r0, #(SOC_SYSCTRL_DSCR3 - SOC_SYSCTRL_BASE)]
527         str     r1, [r0, #(SOC_SYSCTRL_DSCR5 - SOC_SYSCTRL_BASE)]
528         str     r1, [r0, #(SOC_SYSCTRL_DSCR6 - SOC_SYSCTRL_BASE)]
529         ldr     r1, DS_DSCR7_VAL
530         str     r1, [r0, #(SOC_SYSCTRL_DSCR7 - SOC_SYSCTRL_BASE)]
531         ldr     r1, DS_DSCR8_VAL
532         str     r1, [r0, #(SOC_SYSCTRL_DSCR8 - SOC_SYSCTRL_BASE)]
533         .endm   // init_drive_strength
534
535         .macro setup_sdram_ddr
536         // SDRAM controller base address
537         ldr     r0, SOC_ESDCTL_BASE_W
538         // base address of SDRAM for SET MODE commands written to SDRAM via address lines
539         mov     r2, #SOC_CSD0_BASE
540
541         mov     r1, #(1 << 1)           // SDRAM controller reset
542         str     r1, [r0, #ESDCTL_ESDMISC]
543 1:
544         // wait until SDRAMRDY bit is set indicating SDRAM is usable
545         ldr     r1, [r0, #ESDCTL_ESDMISC]
546         tst     r1, #(1 << 31)
547         beq     1b
548
549         mov     r1, #(1 << 3)           @ delay line soft reset
550         str     r1, [r0, #ESDCTL_ESDMISC]
551 1:
552         // wait until SDRAMRDY bit is set indicating SDRAM is usable
553         ldr     r1, [r0, #ESDCTL_ESDMISC]
554         tst     r1, #(1 << 31)
555         beq     1b
556
557         mov     r1, #(1 << 2)           @ enable DDR pipeline
558         str     r1, [r0, #ESDCTL_ESDMISC]
559
560         ldr     r1, SDRAM_ESDCFG0_VAL
561         str     r1, [r0, #ESDCTL_ESDCFG0]
562
563         ldr     r1, SDRAM_DLY_VAL
564         str     r1, [r0, #ESDCTL_ESDCDLY1]
565         str     r1, [r0, #ESDCTL_ESDCDLY2]
566         str     r1, [r0, #ESDCTL_ESDCDLY3]
567         str     r1, [r0, #ESDCTL_ESDCDLY4]
568         str     r1, [r0, #ESDCTL_ESDCDLY5]
569
570         ldr     r1, SDRAM_PRE_ALL_CMD
571         str     r1, [r0, #ESDCTL_ESDCTL0]
572
573         str     r1, [r2, #(1 << 10)]    @ contents of r1 irrelevant, data written via A0-A11
574
575         ldr     r1, SDRAM_AUTO_REF_CMD
576         str     r1, [r0, #ESDCTL_ESDCTL0]
577         @ initiate 2 auto refresh cycles
578         .rept 2
579         str     r1, [r2]
580         .endr
581
582         ldr     r1, SDRAM_SET_MODE_REG_CMD
583         str     r1, [r0, #ESDCTL_ESDCTL0]
584
585         @ address offset for extended mode register
586         add     r3, r2, #(2 << 24)
587         @ select drive strength via extended mode register:
588         @ 0=full 1=half 2=quarter 3=3-quarter
589         ldrb    r1, [r2, #(0 << 5)]
590
591         ldrb    r1, [r2, #0x033]        @ write to SDRAM MODE register (via A0-A12)
592
593         ldr     r1, SDRAM_NORMAL_MODE
594         str     r1, [r0, #ESDCTL_ESDCTL0]
595
596         str     r1, [r2]
597         mov     r1, #((1 << 3) | (1 << 2) | (1 << 5))
598         str     r1, [r0, #ESDCTL_ESDMISC]
599         .endm   // setup_sdram_ddr
600
601 #ifdef CYGOPT_HAL_ARM_TX27_DEBUG
602 led_on:
603         ldr     r10, GPIOF_BASE
604         // PTF_DR
605         mov     r9, #(1 << 13)  // LED ON
606         str     r9, [r10, #GPIO_DR]
607         mov     pc, lr
608
609 led_off:
610         ldr     r10, GPIOF_BASE
611         // PTF_DR
612         mov     r9, #0          // LED OFF
613         str     r9, [r10, #GPIO_DR]
614         mov     pc, lr
615 #endif
616         
617 nfc_cmd_input:
618         strh    r3, [r4, #NAND_FLASH_CMD_REG_OFF]
619         mov     r3, #NAND_FLASH_CONFIG2_FCMD_EN
620         strh    r3, [r4, #NAND_FLASH_CONFIG2_REG_OFF]
621         b       nfc_wait_op_done
622
623 nfc_addr_input:
624         and     r3, r3, #0xFF
625         strh    r3, [r4, #NAND_FLASH_ADD_REG_OFF]
626         mov     r3, #NAND_FLASH_CONFIG2_FADD_EN
627         strh    r3, [r4, #NAND_FLASH_CONFIG2_REG_OFF]
628         b       nfc_wait_op_done
629
630 nfc_data_output:
631         mov     r3, #FDO_PAGE_SPARE_VAL
632         strh    r3, [r4, #NAND_FLASH_CONFIG2_REG_OFF]
633         add     r8, r8, #1
634         b       nfc_wait_op_done
635
636 nfc_wait_op_done:
637 311:
638         ldrh    r3, [r4, #NAND_FLASH_CONFIG2_REG_OFF]
639         ands    r3, r3, #NAND_FLASH_CONFIG2_INT_DONE
640         movne   r3, #0x0
641         strneh  r3, [r4, #NAND_FLASH_CONFIG2_REG_OFF]
642         movne   pc, lr
643         b       311b
644
645 jump_to_sdram:
646         b       1f
647         .align  5
648 1:
649         mcr     15, 0, r0, c7, c7, 0    /* invalidate I cache and D cache */
650         mcr     15, 0, r0, c8, c7, 0    /* invalidate TLBs */
651         mcr     15, 0, r0, c7, c10, 4   /* Data Write Barrier */
652         ldr     r0, SDRAM_ADDR_MASK
653         ldr     r1, MXC_REDBOOT_RAM_START
654         and     r0, lr, r0
655         sub     r0, r1, r0
656         add     lr, lr, r0
657         mov     pc, lr
658
659 #define PLATFORM_VECTORS         _platform_vectors
660         .macro  _platform_vectors
661         .globl  _KARO_MAGIC
662 _KARO_MAGIC:
663         .ascii  "KARO_CE6"
664         .globl  _KARO_STRUCT_SIZE
665 _KARO_STRUCT_SIZE:
666         .word   0       // reserve space structure length
667
668         .globl  _KARO_CECFG_START
669 _KARO_CECFG_START:
670         .rept   1024/4
671         .word   0       // reserve space for CE configuration
672         .endr
673
674         .globl  _KARO_CECFG_END
675 _KARO_CECFG_END:
676         .endm
677
678         .align  5
679         .ascii  "KARO TX27 " __DATE__ " " __TIME__
680         .align
681
682 /* SDRAM configuration */
683 #define RA_BITS         2       /* row addr bits - 11 */
684 #define CA_BITS         (SDRAM_SIZE / SZ_64M)   /* 0-2: col addr bits - 8 3: rsrvd */
685 #define DSIZ            2       /* 0: D[31..16] 1: D[15..D0] 2: D[31..0] 3: rsrvd */
686 #define SREFR           3       /* 0: disabled 1-5: 2^n rows/clock *: rsrvd */
687 #define PWDT            1       /* 0: disabled 1: precharge pwdn
688                                    2: pwdn after 64 clocks 3: pwdn after 128 clocks */
689 #define FP              0       /* 0: not full page 1: full page */
690 #define BL              1       /* 0: 4(not for LPDDR) 1: 8 */
691 #define PRCT            5       /* 0: disabled *: clks / 2 (0..63) */
692 #define ESDCTLVAL       (0x80000000 | (RA_BITS << 24) | (CA_BITS << 20) |               \
693                          (DSIZ << 16) | (SREFR << 13) | (PWDT << 10) | (FP << 8) |      \
694                          (BL << 7) | (PRCT << 0))
695
696 /* SDRAM timing definitions */
697 #define SDRAM_CLK       133
698 #define NS_TO_CK(ns)    (((ns) * SDRAM_CLK + 999) / 1000)
699
700         .macro          CK_VAL, name, clks, offs
701         .iflt           \clks - \offs
702         .set            \name, 0
703         .else
704         .ifle           \clks - 16
705         .set            \name, \clks - \offs
706         .else
707         .set            \name, 0
708         .endif
709         .endif
710         .endm
711
712         .macro          NS_VAL, name, ns, offs
713         .iflt           \ns - \offs
714         .set            \name, 0
715         .else
716         CK_VAL          \name, NS_TO_CK(\ns), \offs
717         .endif
718         .endm
719
720 #if SDRAM_SIZE <= SZ_64M
721 /* MT46H16M32LF-75 */
722 CK_VAL  tXP,    2, 1    /* clks - 1 (0..7)  */
723 CK_VAL  tWTR,   2, 1    /* clks - 1 (0..1)  */
724 NS_VAL  tRP,    23, 2   /* clks - 2 (0..3)  */
725 CK_VAL  tMRD,   2, 1    /* clks - 1 (0..3)  */
726 NS_VAL  tWR,    15, 2   /* clks - 2 (0..1)  */
727 NS_VAL  tRAS,   45, 1   /* clks - 1 (0..15) */
728 CK_VAL  tCAS,   3, 0    /* clks - 1 (0..3)  */
729 NS_VAL  tRRD,   15, 1   /* clks - 1 (0..3)  */
730 NS_VAL  tRCD,   23, 1   /* clks - 1 (0..7) */
731 /* tRC is actually max(tRC,tRFC,tXSR) */
732 NS_VAL  tRC,    120, 1  /* 0: 20 *: clks - 1 (0..15) */
733 #else
734 /* MT46H32M32LF-6 or -75 */
735 NS_VAL  tXP,    25, 1   /* clks - 1 (0..7)  */
736 CK_VAL  tWTR,   1, 1    /* clks - 1 (0..1)  */
737 NS_VAL  tRP,    23, 2   /* clks - 2 (0..3)  */
738 CK_VAL  tMRD,   2, 1    /* clks - 1 (0..3)  */
739 NS_VAL  tWR,    15, 2   /* clks - 2 (0..1)  */
740 NS_VAL  tRAS,   45, 1   /* clks - 1 (0..15) */
741 CK_VAL  tCAS,   3, 0    /* clks - 1 (0..3)  */
742 NS_VAL  tRRD,   15, 1   /* clks - 1 (0..3)  */
743 NS_VAL  tRCD,   23, 1   /* clks - 1 (0..7) */
744 NS_VAL  tRC,    138, 1  /* 0: 20 *: clks - 1 (0..15) */
745 #endif
746
747 #define ESDCFGVAL       ((tXP << 21) | (tWTR << 20) | (tRP << 18) | (tMRD << 16) |      \
748                          (tWR << 15) | (tRAS << 12) | (tRRD << 10) | (tCAS << 8) |      \
749                          (tRCD << 4) | (tRC << 0))
750
751 // All these constants need to be in the first 2KiB of FLASH
752 GPIOB_BASE:                     .word   0x10015100
753 GPIOF_BASE:                     .word   0x10015500
754 SDRAM_ADDR_MASK:                .word   0xffff0000
755 MXC_REDBOOT_RAM_START:          .word   SDRAM_BASE_ADDR + SDRAM_SIZE - REDBOOT_OFFSET
756 SOC_SYSCTRL_BASE_W:             .word   SOC_SYSCTRL_BASE
757 SOC_MAX_BASE_W:                 .word   SOC_MAX_BASE
758 SOC_MAX_MPR_VAL:                .word   0x00302145
759 SOC_CRM_BASE_W:                 .word   SOC_CRM_BASE
760 CRM_MPCTL0_VAL2_W:              .word   CRM_MPCTL0_VAL2
761 CRM_SPCTL0_VAL2_W:              .word   CRM_SPCTL0_VAL2
762 SOC_CRM_CSCR2_W:                .word   CRM_CSCR_VAL2
763 SOC_CRM_PCDR1_W:                .word   0x09030913      // p1=20 p2=10 p3=4 p4=10
764 SOC_CRM_PCCR0_W:                .word   0x3108480F
765 SOC_CS4_CTL_BASE_W:             .word   SOC_CS4_CTL_BASE
766 CS4_CSCRU_VAL:                  .word   0x0000DCF6
767 CS4_CSCRL_VAL:                  .word   0x444A4541
768 CS4_CSCRA_VAL:                  .word   0x44443302
769 NFC_BASE_W:                     .word   NFC_BASE
770 SOC_ESDCTL_BASE_W:              .word   SOC_ESDCTL_BASE
771 SDRAM_ESDCFG0_VAL:              .word   ESDCFGVAL
772 SDRAM_DLY_VAL:                  .word   0x002c0000
773 SDRAM_PRE_ALL_CMD:              .word   0x92120000
774 SDRAM_AUTO_REF_CMD:             .word   0xA2120000
775 SDRAM_SET_MODE_REG_CMD:         .word   0xB2120000
776 SDRAM_NORMAL_MODE:              .word   ESDCTLVAL
777 CS0_CSCRU_VAL:                  .word   0x0000CC03
778 CS0_CSCRL_VAL:                  .word   0xA0330D01
779 CS0_CSCRA_VAL:                  .word   0x00220800
780 CS0_CSCRU_SYNC_VAL:             .word   0x23524E80
781 CS0_CSCRL_SYNC_VAL:             .word   0x10000D03
782 CS0_CSCRA_SYNC_VAL:             .word   0x00720900
783 CS0_BASE_ADDR_W:                .word   CS0_BASE_ADDR
784 SOC_CS0_CTL_BASE_W:             .word   SOC_CS0_CTL_BASE
785 DS_DSCR_VAL:                    .word   0x55555555
786 DS_DSCR7_VAL:                   .word   0x00005005
787 DS_DSCR8_VAL:                   .word   0x15555555
788 AIPI1_PSR0_VAL:                 .word   0x20040304
789 AIPI1_PSR1_VAL:                 .word   0xDFFBFCFB
790
791 /*----------------------------------------------------------------------*/
792 /* end of hal_platform_setup.h                                          */
793 #endif /* CYGONCE_HAL_PLATFORM_SETUP_H */