]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/arm/at91/eb55/v2_0/include/hal_platform_setup.h
Initial revision
[karo-tx-redboot.git] / packages / hal / arm / at91 / eb55 / v2_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 // Copyright (C) 2003 Nick Garnett <nickg@calivar.com>
16 //
17 // eCos is free software; you can redistribute it and/or modify it under
18 // the terms of the GNU General Public License as published by the Free
19 // Software Foundation; either version 2 or (at your option) any later version.
20 //
21 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
22 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
24 // for more details.
25 //
26 // You should have received a copy of the GNU General Public License along
27 // with eCos; if not, write to the Free Software Foundation, Inc.,
28 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
29 //
30 // As a special exception, if other files instantiate templates or use macros
31 // or inline functions from this file, or you compile this file and link it
32 // with other works to produce a work based on this file, this file does not
33 // by itself cause the resulting work to be covered by the GNU General Public
34 // License. However the source code for this file must still be made available
35 // in accordance with section (3) of the GNU General Public License.
36 //
37 // This exception does not invalidate any other reasons why a work based on
38 // this file might be covered by the GNU General Public License.
39 //
40 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
41 // at http://sources.redhat.com/ecos/ecos-license/
42 // -------------------------------------------
43 //####ECOSGPLCOPYRIGHTEND####
44 //=============================================================================
45 //#####DESCRIPTIONBEGIN####
46 //
47 // Author(s):   gthomas
48 // Contributors:gthomas, tdrury, nickg
49 // Date:        2001-07-12
50 // Purpose:     AT91/EB55 platform specific support routines
51 // Description:
52 // Usage:       #include <cyg/hal/hal_platform_setup.h>
53 //
54 //####DESCRIPTIONEND####
55 //
56 //===========================================================================*/
57
58 #include <cyg/hal/var_io.h>
59
60 //===========================================================================*/
61                 
62         .macro  _led_init
63         ldr     r0,=AT91_PIOB
64         mov     r1,#0x0000FF00
65         str     r1,[r0,#AT91_PIO_PER]
66         str     r1,[r0,#AT91_PIO_OER]
67         _led    0
68         .endm
69         
70         .macro _led y
71         ldr     r0,=AT91_PIOB
72         mov     r1,#0x0000FF00
73         str     r1,[r0,#AT91_PIO_SODR]
74         mov     r1,#(\y<<8)
75         str     r1,[r0,#AT91_PIO_CODR]
76 #if 0   
77         mov     r0,#0x00100000
78 9:      sub     r0,r0,#1
79         cmp     r0,#0
80         bne     9b
81 #endif        
82         .endm
83
84         .macro  _pclock_init
85         ldr     r0,=AT91_PMC            // Power saving interface
86         ldr     r1,=0xFFFFFFFF          // Enable all peripheral [clocks]
87         str     r1,[r0,#AT91_PMC_PCER]
88         .endm
89
90         .macro  _pio_init
91         ldr     r0,=AT91_PIOA           // Disable PIO (so peripherals can use bits)
92         ldr     r1,=(0x3f<<14)          // Enable UARTS 0/1 to use pins
93         str     r1,[r0,#AT91_PIO_PDR]
94         .endm
95                 
96 #define CYGHWR_LED_MACRO _led \x
97
98 //===========================================================================*/
99                         
100 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
101
102 #define AT91_PMC_CGMR_INIT0     (AT91_PMC_CGMR_MOSC_XTAL        |       \
103                                 AT91_PMC_CGMR_MOSC_ENA          |       \
104                                 AT91_PMC_CGMR_OSC_CNT(47))
105
106 #define AT91_PMC_CGMR_INIT1     (AT91_PMC_CGMR_INIT0            |       \
107                                 AT91_PMC_CGMR_CSS_MOSC)
108
109 #define AT91_PMC_CGMR_INIT2     (AT91_PMC_CGMR_INIT1            |       \
110                                 AT91_PMC_CGMR_PLL_MUL(1)        |       \
111                                 AT91_PMC_CGMR_PLL_CNT(255))
112
113 #define AT91_PMC_CGMR_INIT3     (AT91_PMC_CGMR_INIT0            |       \
114                                 AT91_PMC_CGMR_PLL_MUL(1)        |       \
115                                 AT91_PMC_CGMR_PLL_CNT(3)        |       \
116                                 AT91_PMC_CGMR_CSS_PLL)
117                                                         
118         .macro  _setup
119         _led_init
120
121         // Change system frequency from 32kHz to 32MHz.
122         
123         // First enable the master oscillator to run at 16MHz from
124         // external crystal.
125         ldr     r2,=AT91_PMC
126         ldr     r3,=AT91_PMC_CGMR_INIT0
127         str     r3,[r2,#AT91_PMC_CGMR]
128
129         // Wait for MOSC to stabilize.
130         mov     r4,#AT91_PMC_SR_MOSCS
131 1:
132         ldr     r3,[r2,#AT91_PMC_SR]
133         and     r3,r4,r3
134         cmp     r3,r4 //#AT91_PMC_SR_MOSCS
135         bne     1b
136
137         // Now switch CPU clock to use master oscillator, after this we
138         // should be running at 16MHz.
139         ldr     r3,=AT91_PMC_CGMR_INIT1
140         str     r3,[r2,#AT91_PMC_CGMR]
141
142         // Now enable PLL to run at twice MOSC frequency
143         ldr     r3,=AT91_PMC_CGMR_INIT2
144         str     r3,[r2,#AT91_PMC_CGMR]
145
146         // Wait for PLL to stabilize
147         mov     r4,#AT91_PMC_SR_LOCK
148 2:
149         ldr     r3,[r2,#AT91_PMC_SR]
150         and     r3,r4,r3
151         cmp     r3,r4
152         bne     2b
153
154         // Finally, switch CPU clock from MOSC to PLL 
155         ldr     r3,=AT91_PMC_CGMR_INIT3
156         str     r3,[r2,#AT91_PMC_CGMR]
157
158         // All done, we should be running at 32MHz now
159         
160         ldr     r10,=_InitMemory        // Initialize memory controller
161         movs    r0,pc,lsr #20           // If ROM startup, PC < 0x100000
162         moveq   r10,r10,lsl #12         //   mask address to low 20 bits
163         moveq   r10,r10,lsr #12
164         ldmia   r10!,{r0-r9,r11-r12}    // Table of initialization constants
165 #if defined(CYG_HAL_STARTUP_ROMRAM)
166         ldr     r10,=0x0000FFFF
167         and     r12,r12,r10
168         ldr     r10,=0x01000000
169         orr     r12,r12,r10
170 #endif
171         stmia   r11!,{r0-r9}            // Write to controller
172         mov     pc,r12                  // Change address space, break pipeline
173 _InitMemory:
174         .long   0x01002529  // 0x01000000, 16MB,  2 cycles  after transfer, 16-bit, 6 wait states
175         .long   0x02002121  // 0x02000000, 16MB,  0 cycles after transfer, 16-bit, 1 wait state
176         .long   0x20000000  // unused
177         .long   0x30000000  // unused
178         .long   0x40000000  // unused
179         .long   0x50000000  // unused
180         .long   0x60000000  // unused
181         .long   0x70000000  // unused
182         .long   0x00000001  // REMAP command
183         .long   0x00000000  // Standard read protocol
184         .long   AT91_EBI    // External Bus Interface address
185         .long   10f         // address where to jump
186 10:
187 #if defined(CYG_HAL_STARTUP_ROMRAM)
188         ldr     r0,=0x01000000          // Relocate FLASH/ROM to on-chip RAM
189         ldr     r1,=0x02000000          // RAM base & length
190         ldr     r2,=0x02010000
191 20:     ldr     r3,[r0],#4
192         str     r3,[r1],#4
193         cmp     r1,r2
194         bne     20b
195         ldr     r0,=30f
196         mov     pc,r0
197 30:
198 #endif
199         _pclock_init
200         _pio_init
201         .endm
202
203 #define CYGSEM_HAL_ROM_RESET_USES_JUMP
204
205 #else
206
207         .macro  _setup
208         _led_init
209         _pclock_init
210         _pio_init        
211         .endm
212         
213 #endif
214
215 #define PLATFORM_SETUP1     _setup
216
217         
218 //-----------------------------------------------------------------------------
219 // end of hal_platform_setup.h
220 #endif // CYGONCE_HAL_PLATFORM_SETUP_H