We just released 2.3...
[kugel-rb.git] / firmware / crt0.S
blobbaa5361c4e939af445263a15b7f9201995ce9eb0
1 /***************************************************************************
2  *             __________               __   ___.
3  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
4  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
5  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
6  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
7  *                     \/            \/     \/    \/            \/
8  * $Id$
9  *
10  * Copyright (C) 2002 by Linus Nielsen Feltzing
11  *
12  * All files in this archive are subject to the GNU General Public License.
13  * See the file COPYING in the source tree root for full license agreement.
14  *
15  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16  * KIND, either express or implied.
17  *
18  ****************************************************************************/
19         #include "config.h"
20         #include "cpu.h"
21         .section .init.text
22         .global start
23 start:
24 #ifdef IRIVER_H100
25         /* Platform:     iRiver H1xx */
26         move.w #0x2700,%sr
28         move.l #MBAR+1,%d0
29         movec.l %d0,%mbar
30         
31         move.l #MBAR2+1,%d0
32         movec.l %d0,%mbar2
34         lea MBAR,%a0
35         lea MBAR2,%a1
36         
37         /* 64K DMA-capable SRAM at 0x10000000
38            DMA is enabled and has priority in both banks
39            All types of accesses are allowed
40            (We might want to restrict that to save power) */
41         move.l #0x1000e001,%d0
42         movec.l %d0,%rambar1
44         /* 32K Non-DMA SRAM at 0x10010000
45            All types of accesses are allowed
46            (We might want to restrict that to save power) */
47         move.l #0x10010001,%d0
48         movec.l %d0,%rambar0
50         /* Chip select 0 - Flash ROM */
51         move.l #0x00000000,%d0 /* CSAR0 - Base = 0x00000000 */
52         move.l %d0,(0x080,%a0)
53         move.l #0x001f0101,%d0 /* CSMR0 - 2M, All access, write protect */
54         move.l %d0,(0x084,%a0)
55         move.l #0x00000d80,%d0 /* CSCR0 - 3 wait states, 16 bits, no bursts */
56         move.l %d0,(0x088,%a0)
57         
58         /* Chip select 1 - LCD controller */
59         move.l #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */
60         move.l %d0,(0x08c,%a0)
61         move.l #0x00000075,%d0 /* CSMR1 - 64K, Only data access */
62         move.l %d0,(0x090,%a0)
63         move.l #0x00002180,%d0 /* CSCR1 - 8 wait states, 16 bits, no bursts */
64         move.l %d0,(0x094,%a0)
65         
66         /* Chip select 2 - ATA controller */
67         move.l #0x20000000,%d0 /* CSAR2 - Base = 0x20000000 */
68         move.l %d0,(0x098,%a0)
69         move.l #0x00000075,%d0 /* CSMR2 - 64K, Only data access */
70         move.l %d0,(0x09c,%a0)
71         move.l #0x00000180,%d0 /* CSCR2 - no wait states, 16 bits, no bursts */
72         move.l %d0,(0x0a0,%a0) /* NOTE:  I'm not sure about the wait states.
73                                   We have to be careful with the access times,
74                                   since IORDY isn't connected to the HDD. */
75         
77         /* Set up the DRAM controller. The refresh is based on the 11.2896MHz
78            clock (5.6448MHz bus frequency). We haven't yet started the PLL */
79         move.l #0x80050000,%d0
80         move.l %d0,(0x100,%a0) /* DCR - Synchronous, 80 cycle refresh */
81         move.l #0x3000a520,%d0
82         move.l %d0,(0x108,%a0) /* DACR0 - Base 0x30000000, Banks on 23 and up,
83                                   CAS latency 3, Refresh enable */
84         move.l #0x01fc0001,%d0
85         move.l %d0,(0x10c,%a0) /* DMR0 - 32Mb */
87         lea    _iramcopy,%a2
88         lea    _iramstart,%a3
89         lea    _iramend,%a4        
90 .iramloop:
91         cmp.l  %a3,%a4
92         beq    .iramloopend
93         move.w (%a2)+,(%a3)+
94         bra    .iramloop
95 .iramloopend:
97         lea    _datacopy,%a2
98         lea    _datastart,%a3
99         lea    _dataend,%a4        
100 .dataloop:
101         cmp.l  %a3,%a4
102         beq    .dataloopend
103         move.w (%a2)+,(%a3)+
104         bra    .dataloop
105 .dataloopend:
107         lea    stackend,%sp
108         jsr    main
109 .hoo:
110         bra    .hoo
112         .section .resetvectors
113 vectors:
114         .long _stackend
115         .long start
116 #else
117         /* Platform:     Archos Jukebox
118          * We begin with some tricks. If we have built our code to be loaded
119          * via the standalone GDB stub, we will have out VBR at some other
120          * location than 0x9000000. We must copy the trap vectors for the
121          * GDB stub to our vector table.
122          * If, on the other hand, we are running standalone we will have
123          * the VBR at 0x9000000, and the copy will not do any harm.
124          */
125         mov.l   vbr_k,r1        
126         mov.l   orig_vbr_k,r2
127         
128         /* Move the invalid instruction vector (4) */
129         mov     #4,r0
130         shll2   r0
131         mov.l   @(r0,r2),r3
132         mov.l   r3,@(r0,r1)
133         
134         /* Move the invalid slot vector (6) */
135         mov     #6,r0
136         shll2   r0
137         mov.l   @(r0,r2),r3
138         mov.l   r3,@(r0,r1)
139         
140         /* Move the bus error vector (9) */
141         mov     #9,r0
142         shll2   r0
143         mov.l   @(r0,r2),r3
144         mov.l   r3,@(r0,r1)
145         
146         /* Move the DMA bus error vector (10) */
147         mov     #10,r0
148         shll2   r0
149         mov.l   @(r0,r2),r3
150         mov.l   r3,@(r0,r1)
151         
152         /* Move the NMI vector as well (11) */
153         mov     #11,r0
154         shll2   r0
155         mov.l   @(r0,r2),r3
156         mov.l   r3,@(r0,r1)
157         
158         /* Move the breakpoint trap vector (32) */
159         mov     #32,r0
160         shll2   r0
161         mov.l   @(r0,r2),r3
162         mov.l   r3,@(r0,r1)
163         
164         /* Move the IO trap vector (33) */
165         mov     #33,r0
166         shll2   r0
167         mov.l   @(r0,r2),r3
168         mov.l   r3,@(r0,r1)
169         
170         /* Move the serial Rx interrupt vector (105) */
171         mov     #105,r0
172         shll2   r0
173         mov.l   @(r0,r2),r3
174         mov.l   r3,@(r0,r1)
176         /* Move the single step trap vector (127) */
177         mov     #127,r0
178         shll2   r0
179         mov.l   @(r0,r2),r3
180         mov.l   r3,@(r0,r1)
181         
182         ldc     r1,vbr
184         /* Now let's get on with the normal business */
185         mov.l   stack_k,r15
187         /* zero out bss */
188         mov.l   edata_k,r0
189         mov.l   end_k,r1
190         mov     #0,r2
191 start_l:
192         mov.l   r2,@r0
193         add     #4,r0
194         cmp/ge  r1,r0
195         bf      start_l
196         nop
198         /* copy the .iram section */
199         mov.l   iramcopy_k,r0
200         mov.l   iram_k,r1
201         mov.l   iramend_k,r2
202 copy_l:
203         mov.l   @r0,r3
204         mov.l   r3,@r1
205         add     #4,r0
206         add     #4,r1
207         cmp/ge  r2,r1
208         bf      copy_l
209         nop
211         /* copy the .data section, for rombased execution */
212         mov.l   datacopy_k,r0
213         mov.l   data_k,r1
214         mov.l   dataend_k,r2
215         /* Don't copy if src and dest are equal */
216         cmp/eq  r0,r1
217         bt      nodatacopy
218 copy_l2:
219         mov.l   @r0,r3
220         mov.l   r3,@r1
221         add     #4,r0
222         add     #4,r1
223         cmp/ge  r2,r1
224         bf      copy_l2
225         nop
226 nodatacopy:
227         /* Munge the main thread stack */
228         mov.l   stack_k,r2
229         mov.l   deadbeef_k,r0
230         mov.l   stackbegin_k,r1
231 munge_loop:
232         mov.l   r0,@r1
233         add     #4,r1
234         cmp/ge  r2,r1
235         bf      munge_loop
236         nop
238         mov     #0,r0
239         ldc     r0,gbr
240         
241         ! call the mainline     
242         mov.l   main_k,r0
243         jsr     @r0
244         nop
245 .hoo:
246     bra .hoo
248         .align 2
249 stack_k:
250         .long   _stackend       
251 stackbegin_k:
252         .long   _stackbegin
253 deadbeef_k:
254         .long   0xdeadbeef
255 edata_k:
256         .long   _edata
257 end_k:
258         .long   _end
259 iramcopy_k:
260         .long   _iramcopy
261 iram_k:
262         .long   _iramstart
263 iramend_k:
264         .long   _iramend
265 datacopy_k:
266         .long   _datacopy
267 data_k:
268         .long   _datastart
269 dataend_k:
270         .long   _dataend
271 main_k:
272         .long   _main
273 vbr_k:
274         .long   vectors
275 orig_vbr_k:
276         .long 0x9000000
278         .section .resetvectors
279 vectors:
280         .long start
281         .long _stackend
282         .long start
283         .long _stackend
284 #endif