]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/arm/arm9/innovator/v2_0/include/hal_platform_setup.h
Initial revision
[karo-tx-redboot.git] / packages / hal / arm / arm9 / innovator / v2_0 / include / hal_platform_setup.h
1 #ifndef CYGONCE_HAL_PLATFORM_SETUP_H
2 #define CYGONCE_HAL_PLATFORM_SETUP_H
3 //=============================================================================
4 //
5 //      hal_platform_setup.h
6 //
7 //      Platform specific support for HAL (assembly code)
8 //
9 //=============================================================================
10 //####ECOSGPLCOPYRIGHTBEGIN####
11 // -------------------------------------------
12 // This file is part of eCos, the Embedded Configurable Operating System.
13 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
14 //
15 // eCos is free software; you can redistribute it and/or modify it under
16 // the terms of the GNU General Public License as published by the Free
17 // Software Foundation; either version 2 or (at your option) any later version.
18 //
19 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
20 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
22 // for more details.
23 //
24 // You should have received a copy of the GNU General Public License along
25 // with eCos; if not, write to the Free Software Foundation, Inc.,
26 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
27 //
28 // As a special exception, if other files instantiate templates or use macros
29 // or inline functions from this file, or you compile this file and link it
30 // with other works to produce a work based on this file, this file does not
31 // by itself cause the resulting work to be covered by the GNU General Public
32 // License. However the source code for this file must still be made available
33 // in accordance with section (3) of the GNU General Public License.
34 //
35 // This exception does not invalidate any other reasons why a work based on
36 // this file might be covered by the GNU General Public License.
37 //
38 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
39 // at http://sources.redhat.com/ecos/ecos-license/
40 // -------------------------------------------
41 //####ECOSGPLCOPYRIGHTEND####
42 //=============================================================================
43 //#####DESCRIPTIONBEGIN####
44 //
45 // Author(s):    Patrick Doyle <wpd@delcomsys.com>
46 // Contributors: Patrick Doyle <wpd@delcomsys.com>
47 // Date:         2002-12-02
48 // Purpose:      Innovator platform specific support routines
49 // Description: 
50 // Usage:        #include <cyg/hal/hal_platform_setup.h>
51 //     Only used by "vectors.S"         
52 //
53 //####DESCRIPTIONEND####
54 //
55 //=============================================================================
56
57 #include <pkgconf/system.h>             // System-wide configuration info
58 #include CYGBLD_HAL_VARIANT_H           // Variant specific configuration
59 #include CYGBLD_HAL_PLATFORM_H          // Platform specific configuration
60 #include CYGHWR_MEMORY_LAYOUT_H
61 #include <cyg/hal/hal_mmu.h>            // MMU definitions
62 #include <cyg/hal/innovator.h>          // Platform specific hardware definitions
63
64 #define nDEBUG
65
66 #if defined(CYG_HAL_STARTUP_ROM)
67 #define PLATFORM_SETUP1 _platform_setup1
68 #define CYGHWR_HAL_ARM_HAS_MMU
69 #define CYGSEM_HAL_ROM_RESET_USES_JUMP
70
71 // This is a trick.  If the first two words of SRAM are 0x12345678 and
72 // 0x87654321, then, then the reset routine in FLASH branches to the
73 // third location in SRAM.  This allows us to test startup code (which may
74 // be broken) without writing it to FLASH and rendering the board useless.
75 // (Well, not permanently useless.  Just useless until we track down an
76 // emulator and reload a working copy of RedBoot.)  The nifty thing with
77 // the innovator is that, if you press and hold the reset button for
78 // 2 seconds it triggers a power-on-reset.  The contents of the internal
79 // SRAM are maintained across such a reset.  Thus, we can write our
80 // new test version of RedBoot to SRAM (configured with CYGPRI_HAL_ROM_MLT
81 // set to SRAM) (more on that later), press and hold the reset button,
82 // and see if the new startup code works.
83 //
84 // Now for some notes about this
85 // 1) I am guessing about the "2 seconds" part.  If you press and hold
86 //    the reset button long enough, the FPGA triggers a power-on-reset.
87 //
88 // 2) In order to test the SRAM version of RedBoot, import the
89 //    redboot_SRAM.ecm file (instead of redboot_RAM.ecm or redboot_ROM.ecm)
90 //    and build RedBoot.  If you already have RedBoot in FLASH, you can
91 //    use that to load redboot.bin with a base address of 0x20000000.
92 //    You will be prompted with a "Gee, I don't think 0x20000000 is
93 //    a valid address in RAM, are you sure you want to do this?" message.
94 //    You should answer "Yes".  Here is the command I use:
95 //
96 //    RedBoot> load -v -r -b 0x20000000 redboot.bin
97 //
98 //    You can also use the "sloader" application (loaded via
99 //    Code Composer Studio) to to load the S-Record file for the SRAM
100 //    version of RedBoot.
101 //
102 // 3) I may have seen a case where the code tested fine in SRAM, but didn't
103 //    work when I placed it in FLASH.  But other things could have been
104 //    going on.
105
106 #ifdef CYGPRI_HAL_ROM_MLT_SRAM
107 #define PLATFORM_PREAMBLE _platform_preamble
108         .macro  _platform_preamble
109         .long   0x12345678
110         .long   0x87654321
111         .endm
112 #endif
113
114
115 #if defined(DEBUG) && !defined(CYGPRI_HAL_ROM_MLT_SRAM)
116 // Don't enable these macro when we are executing from SRAM because
117 // they overwrite SRAM.
118
119 #define FAKE_LED_MACRO_SETUP                    \
120         ldr     r0,=0x20000000;                 \
121         ldr     r1,[r0];                        \
122         subs    r2,r1,#0x20000000;              \
123         movlo   r1,#0x20000000;                 \
124         ldr     r4,=0x2002fff8;                 \
125         subs    r2,r1,r4;                       \
126         movhi   r1,#0x20000000;                 \
127         bic     r1,r1,#0x3;                     \
128         add     r1,r1,#4;                       \
129         str     r1, [r0];
130
131 #define FAKE_LED_MACRO(n)                       \
132         ldr     r11,=0x20000000;                \
133         ldr     r11,[r11];                      \
134         ldr     r12,=n;                         \
135         str     r12,[r11]                       
136 #else
137 #define FAKE_LED_MACRO_SETUP
138 #define FAKE_LED_MACRO(n)
139 #endif
140
141 // This macro represents the initial startup code for the platform        
142         .macro  _platform_setup1
143         // See if we should branch to an application stored in
144         // internal SRAM.  We do this by checking for a magic cookie
145         // in the first two locations of SRAM and jumping to the
146         // third location in SRAM if we find it (after zeroing those
147         // two locations so we don't create an infinite reboot loop).
148         ldr     r0,=0x12345678
149         ldr     r1,=0x87654321
150         ldr     r2,=0x20000000
151         ldr     r3,[r2]
152         cmp     r3,r0
153         ldr     r3,[r2,#4]
154         cmpeq   r3,r1
155         ldr     r3,=0
156         streq   r3,[r2],#4
157         streq   r3,[r2],#4
158         moveq   pc,r2
159
160         FAKE_LED_MACRO_SETUP
161         FAKE_LED_MACRO(1)
162
163         //#define PLATFORM_SETUP_FROM_CCS_GEL_SCRIPT
164 #ifdef PLATFORM_SETUP_FROM_CCS_GEL_SCRIPT       
165         // This is the version of _platform_setup adapted from the contents
166         // of the GEL script shipped with Code Composer Studio
167
168         // This is all stolen from the ipaq setup
169
170         // Make sure MMU is OFF
171         mov r0,#INTERNAL_SRAM_BASE // Force cache writeback by reloading
172         add r2,r0,#0x2000          // cache from the internal memory bank
173 123:    ldr r1,[r0],#16
174         cmp r0, r2
175         bne 123b
176         mov r0,#0
177         mov r1,#0x0070          // MMU Control System bit
178         mcr p15,0,r0,c7,c7,0    // Flush data and instruction cache
179         mcr p15,0,r0,c8,c7,0    // Flush ID TLBs
180         mcr p15,0,r0,c9,c0,0    // Flush Read-Buffer
181         mcr p15,0,r0,c7,c10,4   // Drain write buffer
182         mcr p15,0,r0,c13,c0,0   // Disable virtual ID mapping
183         mcr p15,0,r1,c1,c0,0    // Write MMU control register
184         nop; nop; nop; nop
185
186         mov     r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE)
187         msr     cpsr,r0
188
189         // The rest of this is stolen from "init.c" in the sloader program.
190         // FIXME -- add configury
191         // Set up DPLL1:
192         // (reserved)                                 00
193         // IOB        = 1     Initialize on break       1
194         // (reserved)                                    0
195         // PLL_MULT   = 5     60 MHz clock                 0010 1
196         // PLL_DIV    = 00:   CLKOUT = CLKREF                    00
197         // PLL_ENABLE = 1     Enable DPLL                          1
198         // BYPASS_DIV = 00:   CLKOUT = CLKREF                        00
199         // (read only)                                                 00
200         //
201         // 0x2290:                                    0010 0010 1001 0000
202         //
203
204         ldr     r1,=DPLL1_BASE
205         ldr     r2,=0x2290
206         str     r2,[r1,#_DPLL_CTL_REG]
207   /* Wait for lock */
208 1:      ldr     r2,[r1,#_DPLL_CTL_REG]
209         and     r2,r2,#1
210         cmp     r2,#1
211         bne     1b
212
213   /* memif_init() */
214   /* Configure ARM9 Memory Interface */
215   /* Set up CS0 for memory & bus size of 16 bits, asynchronous read,
216    * 3 wait states, and a divide by 2 clock.
217    * Set up CS1, CS2, & CS3 the same way, except with 1 wait state.
218    */
219 /*
220   TC_EMIFS_CS0_CONFIG   = 0x00003339;
221   TC_EMIFS_CS1_CONFIG   = 0x00001139;
222   TC_EMIFS_CS2_CONFIG   = 0x00001139;
223   TC_EMIFS_CS3_CONFIG   = 0x00001139;
224 */
225         ldr     r1,=TC_BASE
226         ldr     r2,=0x3339
227         str     r2,[r1,#0x10]
228         ldr     r2,=0x1149
229         str     r2,[r1,#0x14]
230         ldr     r2,=0x1139
231         str     r2,[r1,#0x18]
232         str     r2,[r1,#0x1c]
233         
234   /* Configure the SDRAM */
235   /* EMIFF (nCS4) configuration */
236   /* TC_EMIFF_SDRAM_CONFIG = 0x000100F4; */
237   /* MRS (nCS4) initialization  */
238   /* TC_EMIFF_MRS          = 0x00000037; */
239         ldr     r2,=0x000100F4
240         str     r2,[r1,#0x20]
241         ldr     r2,=0x00000037
242         str     r2,[r1,#0x24]
243
244   /* Disable ARM9 Watchdog Timer by writing the special sequence to it */
245 /*
246   WATCHDOG_TIMER_MODE = 0x00F5;
247   WATCHDOG_TIMER_MODE = 0x00A0;
248 */
249         ldr     r1,=WATCHDOG_BASE
250         ldr     r2,=0xF5
251         strh    r2,[r1,#0x08]
252         ldr     r2,=0xA0
253         strh    r2,[r1,#0x08]
254   /* Select the 12MHz oscillator for the frequency reference for the
255    * internal timers.  I am doing this today (12/19/02) to simplify my
256    * life -- This way, I don't care what the clock rate of the core is.
257    */
258         ldr     r1,=CLKM_BASE
259         ldrh    r2,[r1,#0x00]   // ARM_CKCTL
260         bic     r2,r2,#0x1000   // Set ARM_TIMXO = 0
261         strh    r2,[r1,#0x00]
262
263   /* Enable the MPUXOR_CK by:
264    * "MPUXOR_CK ... is derived from CK_REF ... and is enabled by EN_XORPCK"
265    *
266    * EN_XORPCK is bit 1 of ARM_IDLECT2
267    */
268 /*
269   CLKM_ARM_IDLECT2 |= 0x0002;
270 */
271         ldrh    r2,[r1,#0x08]
272         orr     r2,r2,#0x0082   // Bits 7 (EN_TIMCK) and 1 (EN_XORPCK)
273         strh    r2,[r1,#0x08]
274         
275   /* Then set the PER_EN bit to 1
276    * 
277    * PER_EN is bit 0 of ARM_RSTCT2
278    */
279 /*
280   CLKM_ARM_RSTCT2 |= 0x0001;
281 */
282         ldrh    r2,[r1,#0x14]
283         orr     r2,r2,#0x0001
284         strh    r2,[r1,#0x14]
285
286   /* Set the "BT_UART_GATING" bit to 1 in the FUNC_MUX_CTRL_0 register.
287    * This enables the TX1 and RTS1 pins.
288    */
289 /*
290   CONFIG_FUNC_MUX_CTRL_0 |= BIT_25;
291 */
292         ldr     r1,=CONFIG_BASE
293         ldr     r3,=0x02000000
294         ldr     r2,[r1,#0x00]
295         orr     r2,r2,r3
296         str     r2,[r1,#0x00]
297
298   /* Set bit 6 of the FPGA Power Control Register.  If I could find some
299    * documentation on this, I could explain better why I am doing this, but
300    * for now, emperical evidence suggests that this disables the "shutdown"
301    * signal to the RS232 level shifter.
302    */
303 /*
304   FPGA_PWR_CTRL_REG |= BIT_06;
305 */
306         ldr     r1,=FPGA_BASE
307         ldrb    r2,[r1,#0x05]
308         orr     r2,r2,#0x20
309 #ifdef ADD_COMPATIBILITY_FOR_THE_EVM_SOMEDAY
310         orr     r2,r2,#0x40
311 #endif
312         strb    r2,[r1,#0x05]
313
314         // Set up a stack [for calling C code]
315 #if defined(CYG_HAL_STARTUP_SLOADER) || defined(CYG_HAL_STARTUP_ROM)
316         // The startup stack is in internal SRAM
317         ldr     sp,=__startup_stack
318         // This _MOST_DEFINATELY_ needs to be fixed
319         orr     sp,sp,#0x10000000
320 #else
321         // The startup stack is in SDRAM, at some virtual address, but
322         // we have not set up the MMU yet, so we need to initialize SP
323         // with the physical address of '__startup_stack'
324 #error "Somehow"
325 #endif
326         bl      hal_mmu_init
327
328         // Enable MMU
329         ldr     r2,=10f
330         ldr     r1,=MMU_Control_Init|MMU_Control_M
331         mcr     MMU_CP,0,r1,MMU_Control,c0
332         mov     pc,r2
333
334         //        mcr     MMU_CP,0,r0,MMU_InvalidateCache,c7,0  // Flush data and instruction cache
335         //      mcr     MMU_CP,0,r0,MMU_TLB,c7,0                // Flush ID TLBs
336 10:     
337         nop
338         nop
339         nop
340
341 #if 0
342         ldr     r3,=0x20000000
343         str     r1,[r3]
344         mrc     MMU_CP,0,r1,MMU_Control,c0
345         str     r1,[r3, #0x04]
346         mrc     p15,0,r1,c15,c1,0
347         str     r1,[r3, #0x08]
348
349 here:
350         //        b       here
351 #endif
352 #else   // PLATFORM_SETUP_FROM_CCS_GEL_SCRIPT
353         // This is all stolen from the ipaq setup
354
355         // Make sure MMU is OFF
356         mov r0,#INTERNAL_SRAM_BASE // Force cache writeback by reloading
357         add r2,r0,#0x2000          // cache from the internal memory bank
358 123:    ldr r1,[r0],#16
359         cmp r0, r2
360         bne 123b
361         mov r0,#0
362         mov r1,#0x0070          // MMU Control System bit
363         mcr p15,0,r0,c7,c7,0    // Flush data and instruction cache
364         mcr p15,0,r0,c8,c7,0    // Flush ID TLBs
365         mcr p15,0,r0,c9,c0,0    // Flush Read-Buffer
366         mcr p15,0,r0,c7,c10,4   // Drain write buffer
367         mcr p15,0,r0,c13,c0,0   // Disable virtual ID mapping
368         mcr p15,0,r1,c1,c0,0    // Write MMU control register
369         nop; nop; nop; nop
370         FAKE_LED_MACRO(2)
371
372         mov     r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE)
373         msr     cpsr,r0
374         FAKE_LED_MACRO(3)
375
376         // This is the platform setup adapted from the rrload setup implied
377         // by head_omap1510.S
378
379 // Disable the Watchdog Timer.
380 // ---------------------------
381         mov  r1, #0xF5
382         ldr  r0, REG_WDT_TIMER_MODE
383         strh r1, [r0]  // Set WDTIM Mode
384         mov  r1, #0xA0
385         strh r1, [r0]  // Set WDTIM Mode
386         FAKE_LED_MACRO(4)
387
388 // setting for DPLL1 control register.
389 // ----------------------------------
390         ldr  r0, REG_DPLL1_CTL
391         mov  r1, #0x10
392         strh r1, [r0]
393 // Continue to loop if bit shows "not locked"
394 poll1:
395         ldrh r1, [r0]
396         ands r1, r1, #0x01
397         beq  poll1
398         FAKE_LED_MACRO(5)
399
400 // Init Arm9 processor.
401 // --------------------
402         mrs r0, cpsr            // Get current mode bits.
403         bic r0, r0, #0x1f        // Clear mode bits.
404         orr r0, r0, #0xd3        // Disable IRQs/FIQs, supervisor mode.
405         msr cpsr, r0            // Enter Supervisor mode.
406         mov r1, #0x81           // Set ARM925T configuration.
407         mcr p15, 0, r1, c15, c1, 0  // Write ARM925T configuration register.
408         FAKE_LED_MACRO(6)
409
410 // Disable All Interrupts
411 // -----------
412         ldr r1, V_0xffffffff
413         ldr r0, REG_IHL1_MIR
414         str r1, [r0]
415         ldr r0, REG_IHL2_MIR
416         str r1, [r0]
417         FAKE_LED_MACRO(7)
418
419 // Determine if this is a 1509 or 1510, then
420 // set the Configuration Registers accordingly
421 // 1509 shows 0, 1510 shows 0x1b47002f
422 // -------------------
423         ldr     r0, REG_IDCODE
424         ldr     r1, [r0]
425         cmp     r1, #0x0
426         beq     omap1509
427         FAKE_LED_MACRO(8)
428         
429 // OK, so we're a 1510.  
430 omap1510:
431 /*
432         Errata for ES1 says to do this:
433
434         1)  Check for power-on or warm reset.
435         2)  Configure SDRAM controller depending on reset type.
436 */
437         // Check for reset type
438         ldr     r0, REG_ARM_SYSST
439         ldrh    r1, [r0]
440         mov     r2, #0x20
441         tst     r2, r1
442         beq     zzz_warm_reset
443         FAKE_LED_MACRO(9)
444
445 POR:
446         // Wait 100mS for SDRAM to stabilize before
447         // configuring SDRAM controller.
448         // Number guessed at.
449         mov     r0, #0x2000
450 1:      subs    r0, r0, #0x1
451         bne     1b
452         FAKE_LED_MACRO(10)
453         
454         b       after_initial_configure_SDRAM
455         
456 zzz_warm_reset:
457         FAKE_LED_MACRO(11)
458       
459         // Set auto-refresh counter value to 1.
460         // Program MRS to appropriate CAS latency
461         // Wait for SDRAM array to be completely
462         // refreshed, 1 cycle * #SDRAM rows.
463         ldr     r0, REG_TC_EMIFF_SDRAM_CONFIG
464         mov     r1, #0x100
465         str     r1, [r0]
466         ldr     r0, REG_TC_EMIFF_MRS
467         ldr     r1, VAL_TC_EMIFF_MRS
468         str     r1, [r0]
469         mov     r2, #0x2000
470 1:      subs    r2, r2, #0x1
471         bne     1b
472         ldr     r0, REG_TC_EMIFF_SDRAM_CONFIG
473         mov     r1, #0x10000
474         str     r1, [r0]     
475                 
476 after_initial_configure_SDRAM:        
477         FAKE_LED_MACRO(12)
478                         
479
480 // Config Spec says to write values
481 // to each of the configuration registers,
482 // then take the chip out of 1509 compatibility mode.
483
484         ldr     r0, REG_PULL_DWN_CTRL_0
485         ldr     r1, VAL_PULL_DWN_CTRL_0
486         str     r1, [r0]
487         ldr     r0, REG_PULL_DWN_CTRL_1
488         ldr     r1, VAL_PULL_DWN_CTRL_1
489         str     r1, [r0]
490         ldr     r0, REG_PULL_DWN_CTRL_2
491         ldr     r1, VAL_PULL_DWN_CTRL_2
492         str     r1, [r0]
493         ldr     r0, REG_PULL_DWN_CTRL_3
494         ldr     r1, VAL_PULL_DWN_CTRL_3
495         str     r1, [r0]
496         ldr     r0, REG_FUNC_MUX_CTRL_4
497         ldr     r1, VAL_FUNC_MUX_CTRL_4
498         str     r1, [r0]
499         ldr     r0, REG_FUNC_MUX_CTRL_5
500         ldr     r1, VAL_FUNC_MUX_CTRL_5
501         str     r1, [r0]
502         ldr     r0, REG_FUNC_MUX_CTRL_6
503         ldr     r1, VAL_FUNC_MUX_CTRL_6
504         str     r1, [r0]
505         ldr     r0, REG_FUNC_MUX_CTRL_7
506         ldr     r1, VAL_FUNC_MUX_CTRL_7
507         str     r1, [r0]
508         ldr     r0, REG_FUNC_MUX_CTRL_8
509         ldr     r1, VAL_FUNC_MUX_CTRL_8
510         str     r1, [r0]
511         ldr     r0, REG_FUNC_MUX_CTRL_9
512         ldr     r1, VAL_FUNC_MUX_CTRL_9
513         str     r1, [r0]
514         ldr     r0, REG_FUNC_MUX_CTRL_A
515         ldr     r1, VAL_FUNC_MUX_CTRL_A
516         str     r1, [r0]
517         ldr     r0, REG_FUNC_MUX_CTRL_B
518         ldr     r1, VAL_FUNC_MUX_CTRL_B
519         str     r1, [r0]
520         ldr     r0, REG_FUNC_MUX_CTRL_C
521         ldr     r1, VAL_FUNC_MUX_CTRL_C
522         str     r1, [r0]
523         ldr     r0, REG_FUNC_MUX_CTRL_D
524         ldr     r1, VAL_FUNC_MUX_CTRL_D
525         str     r1, [r0]
526         ldr     r0, REG_VOLTAGE_CTRL_0
527         ldr     r1, VAL_VOLTAGE_CTRL_0
528         str     r1, [r0]
529         ldr     r0, REG_TEST_DBG_CTRL_0
530         ldr     r1, VAL_TEST_DBG_CTRL_0
531         str     r1, [r0]
532         ldr     r0, REG_MOD_CONF_CTRL_0
533         ldr     r1, VAL_MOD_CONF_CTRL_0
534         str     r1, [r0]
535         FAKE_LED_MACRO(13)
536
537         // Take out of compatibility mode
538         ldr     r0, REG_COMP_MODE_CTRL_0
539         ldr     r1, VAL_COMP_MODE_CTRL_0
540         str     r1, [r0]
541         FAKE_LED_MACRO(14)
542
543         b post_config_registers
544         
545 omap1509:       
546         ldr     r0, REG_FUNC_MUX_CTRL_0
547         ldr     r1, [r0]
548         orr     r1, r1, #0x6000000  // UART_GIGA_GATE bit as well as UART_BT_GATE bit
549         str     r1, [r0]
550 // Errata for ES5.5 says this must be done before DSP or MPU can
551 // access internal RAMs.  This is benign for earlier revs.
552         ldr     r0, REG_FUNC_MUX_CTRL_1
553         mov     r1, #0xc
554         str     r1, [r0]
555         
556 post_config_registers:          
557         FAKE_LED_MACRO(15)
558         mov r0, #0x1800
559 again:        
560         subs r0, r0, #0x1
561         bne again
562         FAKE_LED_MACRO(16)
563
564 // Invalidate cache
565 // -----------------
566         mov r0,#0
567         nop
568         mcr p15, 0x0, r0, c7, c5, 0x0  
569         nop
570         nop
571         nop
572         nop
573         FAKE_LED_MACRO(17)
574
575 //  Enable I-Cache
576 // -------------
577         mrc p15, 0x0, r1, c1, c0, 0x0
578         orr r1, r1, #0x1000
579         nop
580         mcr p15, 0x0, r1, c1, c0, 0x0
581         nop
582         nop
583         nop
584         nop
585         FAKE_LED_MACRO(18)
586
587 // Initialize Traffic Controller (TC)
588 // ----------------------------------
589         ldr r0, REG_TC_IMIF_PRIO
590         mov r1, #0x0
591         str r1, [r0]
592         ldr r0, REG_TC_EMIFS_PRIO
593         str r1, [r0]
594         ldr r0, REG_TC_EMIFF_PRIO
595         str r1, [r0]
596         
597         ldr r0, REG_TC_EMIFS_CONFIG
598         ldr r1, [r0]
599         bic r1, r1, #0x08       /* clear the global power-down enable PDE bit */
600         bic r1, r1, #0x01       /* write protect flash by clearing the WP bit */
601         str r1, [r0]  // EMIFS GlB Configuration. (value 0x12 most likely)
602
603 // Set TC chip select registers
604 // SDRAM value based on 168MHz 1510.
605 // ----------------------------
606         ldr r0, REG_TC_EMIFS_CS1_CONFIG
607         ldr r1, VAL_TC_EMIFS_CS1_CONFIG_PRELIM
608         str r1, [r0]
609         ldr r0, REG_TC_EMIFS_CS2_CONFIG
610         ldr r1, VAL_TC_EMIFS_CS2_CONFIG_PRELIM
611         str r1, [r0]
612         ldr r0, REG_TC_EMIFF_SDRAM_CONFIG
613         ldr r1, VAL_TC_EMIFF_SDRAM_CONFIG
614         str r1, [r0]
615         ldr r0, REG_TC_EMIFF_MRS
616         ldr r1, VAL_TC_EMIFF_MRS
617         str r1, [r0]
618         
619         mov r0,#0x1800
620 again2:        
621         subs r0,r0,#0x1
622         bne again2
623         FAKE_LED_MACRO(19)
624
625  // Next, Enable the RS232 Line Drivers in the FPGA.
626  // Also, power on the audio CODEC's amplifier here,
627  // which will make a noise on the audio output.
628  // This is done here instead of in the kernel so there
629  // isn't a loud popping noise at the start of each
630  // song.
631  // Also, disable the CODEC's clocks.
632  // omap1510-HelenP1 [specific]
633         ldr r0, REG_FPGA_POWER
634         mov r1, #0
635         ldr r2, REG_FPGA_DIP_SWITCH
636         ldrb r3, [r2]
637         cmp r3, #0x8
638         movne r1, #0x62     // Enable the RS232 Line Drivers in the EPLD
639         strb r1, [r0]
640         ldr r0, REG_FPGA_AUDIO
641         mov r1, #0x0     // Disable sound driver (CODEC clocks)
642         strb r1, [r0]
643                  
644         mov r0, #0x1800
645 again0:        
646         subs r0, r0, #0x1
647         bne again0
648         FAKE_LED_MACRO(20)
649
650 // Init RHEA
651 // ----------        
652         ldr r1, V_0x0000ff22
653         mov r0, #0x0
654         str r1, [r0]   // yep, that's really a write to address 0x00000000.
655
656 // *revisit-skranz* is needed?        
657         mov r0, #0x1800
658 again12:        
659         subs r0, r0, #0x1
660         bne again12
661         FAKE_LED_MACRO(21)
662         
663 // Misc 2
664 // ------        
665         mov r1, #0xfb
666         ldr r0, REG_LB_CLOCK_DIV
667         str r1, [r0]
668
669 // *revisit-skranz* is needed?        
670         mov r0, #0x1800
671 again4:        
672         subs r0, r0, #0x1
673         bne again4
674         FAKE_LED_MACRO(22)
675
676 // ARM Clock Module Setup
677 // ----------------------        
678         mov r1, #0x40
679         ldr r0, REG_ARM_IDLECT2
680         strh r1, [r0]  // CLKM, Clock domain control.
681                 
682         mov r1, #0x01  // PER_EN bit
683         ldr r0, REG_ARM_RSTCT2 
684         strh r1, [r0]  // CLKM; Peripheral reset.
685         
686         // Reset CLKM
687 #ifdef ORIGINAL_CODE
688         mov r1, #0x06  // Needed for UART[12]
689 #else
690         mov r1, #0x86  // Needed for UART[12]
691 #endif
692         ldr r0, REG_ARM_IDLECT2
693         strh r1, [r0]  // CLKM, Clock domain control.
694         
695         // Set CLKM to Sync-Scalable
696         mov r1, #0x1000  // Needed for UART[12]
697         ldr r0, REG_ARM_SYSST
698         strh r1, [r0]
699         
700 // *revisit-skranz* is needed?        
701         mov r0, #0x1800
702 again6:        
703         subs r0, r0, #0x1
704         bne again6
705         FAKE_LED_MACRO(23)
706
707         ldr r1, VAL_ARM_CKCTL
708         ldr r0, REG_ARM_CKCTL
709         strh r1, [r0]
710         
711 // setup DPLL1 Control Register
712 // ----------------------------
713         ldr r1, VAL_DPLL1_CTL
714         ldr r0, REG_DPLL1_CTL
715         strh r1, [r0]
716         ands r1, r1, #0x10   // Check if PLL is enabled.
717         beq finish2          // Do not look for lock if BYPASS selected
718 poll2:
719         ldrh r1, [r0]
720         ands r1, r1, #0x01   // Check the LOCK bit.
721         beq poll2            // ...loop until bit goes hi.
722 finish2:         
723         FAKE_LED_MACRO(24)
724         
725         // Setup TC EMIFS configuration.
726         // CS0 value based on 168MHz
727         // ---------------------------------------------------
728         ldr r1, VAL_TC_EMIFS_CS0_CONFIG // increase flash speed.
729         ldr r0, REG_TC_EMIFS_CS0_CONFIG
730         str r1, [r0] // Chip Select 0
731         ldr r1, VAL_TC_EMIFS_CS1_CONFIG
732         ldr r0, REG_TC_EMIFS_CS1_CONFIG
733         str r1, [r0] // Chip Select 1
734         ldr r1, VAL_TC_EMIFS_CS2_CONFIG
735         ldr r0, REG_TC_EMIFS_CS2_CONFIG
736         str r1, [r0] // Chip Select 2
737         ldr r1, VAL_TC_EMIFS_CS3_CONFIG
738         ldr r0, REG_TC_EMIFS_CS3_CONFIG
739         str r1, [r0] // Chip Select 3
740         
741 // *revisit-skranz* is needed?        
742         mov r0, #0x1800
743 again9:        
744         subs r0, r0, #0x1
745         bne again9
746         FAKE_LED_MACRO(25)
747
748         // The following was added by WPD
749         // Set up a stack [for calling C code]
750 #ifdef CYG_HAL_STARTUP_ROM
751         // The startup stack is in internal SRAM
752         ldr     sp,=__startup_stack
753         // This _MOST_DEFINATELY_ needs to be fixed
754         orr     sp,sp,#0x10000000
755 #else
756         // The startup stack is in SDRAM, at some virtual address, but
757         // we have not set up the MMU yet, so we need to initialize SP
758         // with the physical address of '__startup_stack'
759 #error "Somehow"
760 #endif
761         bl      hal_mmu_init
762         FAKE_LED_MACRO(26)
763
764         // Enable MMU
765         ldr     r2,=10f
766         ldr     r1,=MMU_Control_Init|MMU_Control_M
767         mcr     MMU_CP,0,r1,MMU_Control,c0
768         mov     pc,r2
769
770         //        mcr     MMU_CP,0,r0,MMU_InvalidateCache,c7,0  // Flush data and instruction cache
771         //      mcr     MMU_CP,0,r0,MMU_TLB,c7,0                // Flush ID TLBs
772 10:     
773         nop
774         nop
775         nop
776         FAKE_LED_MACRO(27)
777
778 #if 0
779         ldr     r3,=0x20000000
780         str     r1,[r3]
781         mrc     MMU_CP,0,r1,MMU_Control,c0
782         str     r1,[r3, #0x04]
783         mrc     p15,0,r1,c15,c1,0
784         str     r1,[r3, #0x08]
785
786 here:
787         //        b       here
788 #endif
789 #endif
790         .endm
791         
792 #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) || defined(CYG_HAL_STARTUP_REDBOOT)
793 #define PLATFORM_SETUP1
794 #endif
795
796 //-----------------------------------------------------------------------------
797 //-----------------------------------------------------------------------------
798 // end of hal_platform_setup.h
799
800 // ------------------------------------------------------        
801 // --------------Static Data Definitions-----------------
802 // ------------------------------------------------------
803
804 /* inernal OMAP registers */
805         /* interrupt handler level 2 registers */
806 REG_IHL2_MIR:                   /* 32 bits */
807         .word 0xfffe0004
808         /* OMAP configuration registers */
809 REG_FUNC_MUX_CTRL_0:            /* 32 bits */
810         .word 0xfffe1000
811 REG_FUNC_MUX_CTRL_1:            /* 32 bits */
812         .word 0xfffe1004
813 REG_FUNC_MUX_CTRL_2:            /* 32 bits */
814         .word 0xfffe1008
815 REG_COMP_MODE_CTRL_0:           /* 32 bits */
816         .word 0xfffe100c
817 REG_FUNC_MUX_CTRL_3:            /* 32 bits */
818         .word 0xfffe1010
819 REG_FUNC_MUX_CTRL_4:            /* 32 bits */
820         .word 0xfffe1014
821 REG_FUNC_MUX_CTRL_5:            /* 32 bits */
822         .word 0xfffe1018
823 REG_FUNC_MUX_CTRL_6:            /* 32 bits */
824         .word 0xfffe101c
825 REG_FUNC_MUX_CTRL_7:            /* 32 bits */
826         .word 0xfffe1020
827 REG_FUNC_MUX_CTRL_8:            /* 32 bits */
828         .word 0xfffe1024
829 REG_FUNC_MUX_CTRL_9:            /* 32 bits */
830         .word 0xfffe1028
831 REG_FUNC_MUX_CTRL_A:            /* 32 bits */
832         .word 0xfffe102C
833 REG_FUNC_MUX_CTRL_B:            /* 32 bits */
834         .word 0xfffe1030
835 REG_FUNC_MUX_CTRL_C:            /* 32 bits */
836         .word 0xfffe1034
837 REG_FUNC_MUX_CTRL_D:            /* 32 bits */
838         .word 0xfffe1038
839 REG_PULL_DWN_CTRL_0:            /* 32 bits */
840         .word 0xfffe1040
841 REG_PULL_DWN_CTRL_1:            /* 32 bits */
842         .word 0xfffe1044
843 REG_PULL_DWN_CTRL_2:            /* 32 bits */
844         .word 0xfffe1048
845 REG_PULL_DWN_CTRL_3:            /* 32 bits */
846         .word 0xfffe104c
847 REG_VOLTAGE_CTRL_0:             /* 32 bits */
848         .word 0xfffe1060
849 REG_TEST_DBG_CTRL_0:            /* 32 bits */
850         .word 0xfffe1070
851 REG_MOD_CONF_CTRL_0:            /* 32 bits */
852         .word 0xfffe1080
853         /* local bus control registers */
854 REG_LB_CLOCK_DIV:               /* 32 bits */
855         .word 0xfffec10c
856         /* watchdog timer registers */
857 REG_WDT_TIMER_MODE:             /* 16 bits */
858         .word 0xfffec808
859         /* interrupt handler level 1 registers */
860 REG_IHL1_MIR:                   /* 32 bits */
861         .word 0xfffecb04
862         /* traffic controller memory interface registers */
863 REG_TC_IMIF_PRIO:               /* 32 bits */
864         .word 0xfffecc00
865 REG_TC_EMIFS_PRIO:              /* 32 bits */
866         .word 0xfffecc04
867 REG_TC_EMIFF_PRIO:              /* 32 bits */
868         .word 0xfffecc08
869 REG_TC_EMIFS_CONFIG:            /* 32 bits */
870         .word 0xfffecc0c
871 REG_TC_EMIFS_CS0_CONFIG:        /* 32 bits */
872         .word 0xfffecc10
873 REG_TC_EMIFS_CS1_CONFIG:        /* 32 bits */
874         .word 0xfffecc14
875 REG_TC_EMIFS_CS2_CONFIG:        /* 32 bits */
876         .word 0xfffecc18
877 REG_TC_EMIFS_CS3_CONFIG:        /* 32 bits */
878         .word 0xfffecc1c
879 REG_TC_EMIFF_SDRAM_CONFIG:      /* 32 bits */
880         .word 0xfffecc20
881 REG_TC_EMIFF_MRS:               /* 32 bits */
882         .word 0xfffecc24
883         /* MPU clock/reset/power mode control registers */
884 REG_ARM_CKCTL:                  /* 16 bits */
885         .word 0xfffece00
886 REG_ARM_IDLECT2:                /* 16 bits */
887         .word 0xfffece08
888 REG_ARM_RSTCT2:                 /* 16 bits */
889         .word 0xfffece14
890 REG_ARM_SYSST:                  /* 16 bits */
891         .word 0xfffece18
892         /* DPLL control registers */
893 REG_DPLL1_CTL:                  /* 16 bits */
894         .word 0xfffecf00
895         /* identification code register */
896 REG_IDCODE:                     /* 32 bits */
897         .word 0xfffed404
898         
899 /* board-specific registers */
900
901 REG_FPGA_LED_DIGIT:             /* 8 bits (not used on Innovator) */
902         .word 0x08000003
903 REG_FPGA_POWER:                 /* 8 bits */
904         .word 0x08000005
905 REG_FPGA_AUDIO:                 /* 8 bits (not used on Innovator) */
906         .word 0x0800000c
907 REG_FPGA_DIP_SWITCH:            /* 8 bits (not used on Innovator) */
908         .word 0x0800000e
909
910 /* constants */
911
912 VAL_COMP_MODE_CTRL_0:
913         .word 0x0000eaef
914 VAL_FUNC_MUX_CTRL_4:
915         .word 0x00000000
916 VAL_FUNC_MUX_CTRL_5:
917         .word 0x00000000
918 VAL_FUNC_MUX_CTRL_6:
919         .word 0x00000001
920 VAL_FUNC_MUX_CTRL_7:
921         .word 0x00000000
922 VAL_FUNC_MUX_CTRL_8:
923         .word 0x10001200
924 VAL_FUNC_MUX_CTRL_9:
925         .word 0x01201012
926 VAL_FUNC_MUX_CTRL_A:
927         .word 0x00000248
928 VAL_FUNC_MUX_CTRL_B:
929         .word 0x00000248
930 VAL_FUNC_MUX_CTRL_C:
931         .word 0x09000000
932 VAL_FUNC_MUX_CTRL_D:
933         .word 0x00000000
934 VAL_PULL_DWN_CTRL_0:
935         .word 0x11a10000
936 VAL_PULL_DWN_CTRL_1:
937         .word 0x2e047fff
938 VAL_PULL_DWN_CTRL_2:
939         .word 0xffd7d3e6
940 VAL_PULL_DWN_CTRL_3:
941         .word 0x00003f03
942 VAL_VOLTAGE_CTRL_0:
943         .word 0x00000007
944 VAL_TEST_DBG_CTRL_0:
945         /* The OMAP5910 TRM says this register must be 0, but HelenConfRegs 
946          * says to write a 7.  Don't know what the right thing is to do, so 
947          * I'm leaving it at 7 since that's what was already here.
948          */
949         .word 0x00000007
950 VAL_MOD_CONF_CTRL_0:
951         .word 0x0b000008
952 VAL_ARM_CKCTL:
953 #ifdef ORIGINAL_CODE
954         .word 0x110f
955 #else
956         .word 0x010f
957 #endif
958 VAL_DPLL1_CTL:
959         .word 0x2710
960 VAL_TC_EMIFS_CS1_CONFIG_PRELIM:
961         .word 0x00001149
962 VAL_TC_EMIFS_CS2_CONFIG_PRELIM:
963         .word 0x00004158
964 VAL_TC_EMIFS_CS0_CONFIG:     
965         .word 0x002130b0
966 VAL_TC_EMIFS_CS1_CONFIG:   
967         .word 0x0000f559
968 VAL_TC_EMIFS_CS2_CONFIG:   
969         .word 0x000055f0
970 VAL_TC_EMIFS_CS3_CONFIG:   
971         .word 0x00003331
972 VAL_TC_EMIFF_SDRAM_CONFIG:   
973         .word 0x010290fc
974 VAL_TC_EMIFF_MRS:   
975         .word 0x00000027
976
977 V_0xffffffff:
978         .word 0xffffffff
979       
980 V_0x0000ff22:   
981         .word 0x0000ff22
982 #endif // CYGONCE_HAL_PLATFORM_SETUP_H