Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:47

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  mcf5235 startup code
0005  *
0006  *  This file contains the entry point for the application.
0007  *  The name of this entry point is compiler dependent.
0008  *  It jumps to the BSP which is responsible for performing
0009  *  all initialization.
0010  *
0011  *  COPYRIGHT (c) 1989-1998.
0012  *  On-Line Applications Research Corporation (OAR).
0013  *
0014  * Redistribution and use in source and binary forms, with or without
0015  * modification, are permitted provided that the following conditions
0016  * are met:
0017  * 1. Redistributions of source code must retain the above copyright
0018  *    notice, this list of conditions and the following disclaimer.
0019  * 2. Redistributions in binary form must reproduce the above copyright
0020  *    notice, this list of conditions and the following disclaimer in the
0021  *    documentation and/or other materials provided with the distribution.
0022  *
0023  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0024  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0026  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0027  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0028  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0029  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0030  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0031  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0032  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0033  * POSSIBILITY OF SUCH DAMAGE.
0034  */
0035 
0036 #include <rtems/asm.h>
0037 
0038 #define SRAM_SIZE (64*1024)
0039 #define DEFAULT_IPSBAR  0x40000000
0040 
0041 BEGIN_CODE
0042 #define INITIAL_STACK __SRAMBASE+SRAM_SIZE-4
0043 
0044     PUBLIC (INTERRUPT_VECTOR)
0045 SYM(INTERRUPT_VECTOR):
0046     .long   INITIAL_STACK   |   0: Initial 'SSP'
0047     .long   start           |   1: Initial PC
0048     .long   SYM(_uhoh)      |   2: Bus error
0049     .long   SYM(_uhoh)      |   3: Address error
0050     .long   SYM(_uhoh)      |   4: Illegal instruction
0051     .long   SYM(_uhoh)      |   5: Zero division
0052     .long   SYM(_uhoh)      |   6: CHK, CHK2 instruction
0053     .long   SYM(_uhoh)      |   7: TRAPcc, TRAPV instructions
0054     .long   SYM(_uhoh)      |   8: Privilege violation
0055     .long   SYM(_uhoh)      |   9: Trace
0056     .long   SYM(_uhoh)      |  10: Line 1010 emulator
0057     .long   SYM(_uhoh)      |  11: Line 1111 emulator
0058     .long   SYM(_uhoh)      |  12: Hardware breakpoint
0059     .long   SYM(_uhoh)      |  13: Reserved for coprocessor violation
0060     .long   SYM(_uhoh)      |  14: Format error
0061     .long   SYM(_uhoh)      |  15: Uninitialized interrupt
0062     .long   SYM(_uhoh)      |  16: Unassigned, reserved
0063     .long   SYM(_uhoh)      |  17:
0064     .long   SYM(_uhoh)      |  18:
0065     .long   SYM(_uhoh)      |  19:
0066     .long   SYM(_uhoh)      |  20:
0067     .long   SYM(_uhoh)      |  21:
0068     .long   SYM(_uhoh)      |  22:
0069     .long   SYM(_uhoh)      |  23:
0070     .long   SYM(_spuriousInterrupt) |  24: Spurious interrupt
0071     .long   SYM(_uhoh)      |  25: Level 1 interrupt autovector
0072     .long   SYM(_uhoh)      |  26: Level 2 interrupt autovector
0073     .long   SYM(_uhoh)      |  27: Level 3 interrupt autovector
0074     .long   SYM(_uhoh)      |  28: Level 4 interrupt autovector
0075     .long   SYM(_uhoh)      |  29: Level 5 interrupt autovector
0076     .long   SYM(_uhoh)      |  30: Level 6 interrupt autovector
0077     .long   SYM(_uhoh)      |  31: Level 7 interrupt autovector
0078     .long   SYM(_uhoh)      |  32: Trap instruction (0-15)
0079     .long   SYM(_uhoh)      |  33:
0080     .long   SYM(_uhoh)      |  34:
0081     .long   SYM(_uhoh)      |  35:
0082     .long   SYM(_uhoh)      |  36:
0083     .long   SYM(_uhoh)      |  37:
0084     .long   SYM(_uhoh)      |  38:
0085     .long   SYM(_uhoh)      |  39:
0086     .long   SYM(_uhoh)      |  40:
0087     .long   SYM(_uhoh)      |  41:
0088     .long   SYM(_uhoh)      |  42:
0089     .long   SYM(_uhoh)      |  43:
0090     .long   SYM(_uhoh)      |  44:
0091     .long   SYM(_uhoh)      |  45:
0092     .long   SYM(_uhoh)      |  46:
0093     .long   SYM(_uhoh)      |  47:
0094     .long   SYM(_uhoh)      |  48: Reserved for coprocessor
0095     .long   SYM(_uhoh)      |  49:
0096     .long   SYM(_uhoh)      |  50:
0097     .long   SYM(_uhoh)      |  51:
0098     .long   SYM(_uhoh)      |  52:
0099     .long   SYM(_uhoh)      |  53:
0100     .long   SYM(_uhoh)      |  54:
0101     .long   SYM(_uhoh)      |  55:
0102     .long   SYM(_uhoh)      |  56:
0103     .long   SYM(_uhoh)      |  57:
0104     .long   SYM(_uhoh)      |  58:
0105     .long   SYM(_uhoh)      |  59: Unassigned, reserved
0106     .long   SYM(_uhoh)      |  60:
0107     .long   SYM(_uhoh)      |  61:
0108     .long   SYM(_uhoh)      |  62:
0109     .long   SYM(_uhoh)      |  63:
0110     .long   SYM(_spuriousInterrupt) |  64: User spurious handler
0111     .long   SYM(_uhoh)      |  65:
0112     .long   SYM(_uhoh)      |  66:
0113     .long   SYM(_uhoh)      |  67:
0114     .long   SYM(_uhoh)      |  68:
0115     .long   SYM(_uhoh)      |  69:
0116     .long   SYM(_uhoh)      |  70:
0117     .long   SYM(_uhoh)      |  71:
0118     .long   SYM(_uhoh)      |  72:
0119     .long   SYM(_uhoh)      |  73:
0120     .long   SYM(_uhoh)      |  74:
0121     .long   SYM(_uhoh)      |  75:
0122     .long   SYM(_uhoh)      |  76:
0123     .long   SYM(_uhoh)      |  77:
0124     .long   SYM(_uhoh)      |  78:
0125     .long   SYM(_uhoh)      |  79:
0126     .long   SYM(_uhoh)      |  80:
0127     .long   SYM(_uhoh)      |  81:
0128     .long   SYM(_uhoh)      |  82:
0129     .long   SYM(_uhoh)      |  83:
0130     .long   SYM(_uhoh)      |  84:
0131     .long   SYM(_uhoh)      |  85:
0132     .long   SYM(_uhoh)      |  86:
0133     .long   SYM(_uhoh)      |  87:
0134     .long   SYM(_uhoh)      |  88:
0135     .long   SYM(_uhoh)      |  89:
0136     .long   SYM(_uhoh)      |  90:
0137     .long   SYM(_uhoh)      |  91:
0138     .long   SYM(_uhoh)      |  92:
0139     .long   SYM(_uhoh)      |  93:
0140     .long   SYM(_uhoh)      |  94:
0141     .long   SYM(_uhoh)      |  95:
0142     .long   SYM(_uhoh)      |  96:
0143     .long   SYM(_uhoh)      |  97:
0144     .long   SYM(_uhoh)      |  98:
0145     .long   SYM(_uhoh)      |  99:
0146     .long   SYM(_uhoh)      | 100:
0147     .long   SYM(_uhoh)      | 101:
0148     .long   SYM(_uhoh)      | 102:
0149     .long   SYM(_uhoh)      | 103:
0150     .long   SYM(_uhoh)      | 104:
0151     .long   SYM(_uhoh)      | 105:
0152     .long   SYM(_uhoh)      | 106:
0153     .long   SYM(_uhoh)      | 107:
0154     .long   SYM(_uhoh)      | 108:
0155     .long   SYM(_uhoh)      | 109:
0156     .long   SYM(_uhoh)      | 110:
0157     .long   SYM(_uhoh)      | 111:
0158     .long   SYM(_uhoh)      | 112:
0159     .long   SYM(_uhoh)      | 113:
0160     .long   SYM(_uhoh)      | 114:
0161     .long   SYM(_uhoh)      | 115:
0162     .long   SYM(_uhoh)      | 116:
0163     .long   SYM(_uhoh)      | 117:
0164     .long   SYM(_uhoh)      | 118:
0165     .long   SYM(_uhoh)      | 119:
0166     .long   SYM(_uhoh)      | 120:
0167     .long   SYM(_uhoh)      | 121:
0168     .long   SYM(_uhoh)      | 122:
0169     .long   SYM(_uhoh)      | 123:
0170     .long   SYM(_uhoh)      | 124:
0171     .long   SYM(_uhoh)      | 125:
0172     .long   SYM(_uhoh)      | 126:
0173     .long   SYM(_uhoh)      | 127:
0174     .long   SYM(_uhoh)      | 128:
0175     .long   SYM(_uhoh)      | 129:
0176     .long   SYM(_uhoh)      | 130:
0177     .long   SYM(_uhoh)      | 131:
0178     .long   SYM(_uhoh)      | 132:
0179     .long   SYM(_uhoh)      | 133:
0180     .long   SYM(_uhoh)      | 134:
0181     .long   SYM(_uhoh)      | 135:
0182     .long   SYM(_uhoh)      | 136:
0183     .long   SYM(_uhoh)      | 137:
0184     .long   SYM(_uhoh)      | 138:
0185     .long   SYM(_uhoh)      | 139:
0186     .long   SYM(_uhoh)      | 140:
0187     .long   SYM(_uhoh)      | 141:
0188     .long   SYM(_uhoh)      | 142:
0189     .long   SYM(_uhoh)      | 143:
0190     .long   SYM(_uhoh)      | 144:
0191     .long   SYM(_uhoh)      | 145:
0192     .long   SYM(_uhoh)      | 146:
0193     .long   SYM(_uhoh)      | 147:
0194     .long   SYM(_uhoh)      | 148:
0195     .long   SYM(_uhoh)      | 149:
0196     .long   SYM(_uhoh)      | 150:
0197     .long   SYM(_uhoh)      | 151:
0198     .long   SYM(_uhoh)      | 152:
0199     .long   SYM(_uhoh)      | 153:
0200     .long   SYM(_uhoh)      | 154:
0201     .long   SYM(_uhoh)      | 155:
0202     .long   SYM(_uhoh)      | 156:
0203     .long   SYM(_uhoh)      | 157:
0204     .long   SYM(_uhoh)      | 158:
0205     .long   SYM(_uhoh)      | 159:
0206     .long   SYM(_uhoh)      | 160:
0207     .long   SYM(_uhoh)      | 161:
0208     .long   SYM(_uhoh)      | 162:
0209     .long   SYM(_uhoh)      | 163:
0210     .long   SYM(_uhoh)      | 164:
0211     .long   SYM(_uhoh)      | 165:
0212     .long   SYM(_uhoh)      | 166:
0213     .long   SYM(_uhoh)      | 167:
0214     .long   SYM(_uhoh)      | 168:
0215     .long   SYM(_uhoh)      | 169:
0216     .long   SYM(_uhoh)      | 170:
0217     .long   SYM(_uhoh)      | 171:
0218     .long   SYM(_uhoh)      | 172:
0219     .long   SYM(_uhoh)      | 173:
0220     .long   SYM(_uhoh)      | 174:
0221     .long   SYM(_uhoh)      | 175:
0222     .long   SYM(_uhoh)      | 176:
0223     .long   SYM(_uhoh)      | 177:
0224     .long   SYM(_uhoh)      | 178:
0225     .long   SYM(_uhoh)      | 179:
0226     .long   SYM(_uhoh)      | 180:
0227     .long   SYM(_uhoh)      | 181:
0228     .long   SYM(_uhoh)      | 182:
0229     .long   SYM(_uhoh)      | 183:
0230     .long   SYM(_uhoh)      | 184:
0231     .long   SYM(_uhoh)      | 185:
0232     .long   SYM(_uhoh)      | 186:
0233     .long   SYM(_uhoh)      | 187:
0234     .long   SYM(_uhoh)      | 188:
0235     .long   SYM(_uhoh)      | 189:
0236     .long   SYM(_uhoh)      | 190:
0237     .long   SYM(_uhoh)      | 191:
0238     .long   SYM(_uhoh)      | 192:
0239     .long   SYM(_uhoh)      | 193:
0240     .long   SYM(_uhoh)      | 194:
0241     .long   SYM(_uhoh)      | 195:
0242     .long   SYM(_uhoh)      | 196:
0243     .long   SYM(_uhoh)      | 197:
0244     .long   SYM(_uhoh)      | 198:
0245     .long   SYM(_uhoh)      | 199:
0246     .long   SYM(_uhoh)      | 200:
0247     .long   SYM(_uhoh)      | 201:
0248     .long   SYM(_uhoh)      | 202:
0249     .long   SYM(_uhoh)      | 203:
0250     .long   SYM(_uhoh)      | 204:
0251     .long   SYM(_uhoh)      | 205:
0252     .long   SYM(_uhoh)      | 206:
0253     .long   SYM(_uhoh)      | 207:
0254     .long   SYM(_uhoh)      | 208:
0255     .long   SYM(_uhoh)      | 209:
0256     .long   SYM(_uhoh)      | 210:
0257     .long   SYM(_uhoh)      | 211:
0258     .long   SYM(_uhoh)      | 212:
0259     .long   SYM(_uhoh)      | 213:
0260     .long   SYM(_uhoh)      | 214:
0261     .long   SYM(_uhoh)      | 215:
0262     .long   SYM(_uhoh)      | 216:
0263     .long   SYM(_uhoh)      | 217:
0264     .long   SYM(_uhoh)      | 218:
0265     .long   SYM(_uhoh)      | 219:
0266     .long   SYM(_uhoh)      | 220:
0267     .long   SYM(_uhoh)      | 221:
0268     .long   SYM(_uhoh)      | 222:
0269     .long   SYM(_uhoh)      | 223:
0270     .long   SYM(_uhoh)      | 224:
0271     .long   SYM(_uhoh)      | 225:
0272     .long   SYM(_uhoh)      | 226:
0273     .long   SYM(_uhoh)      | 227:
0274     .long   SYM(_uhoh)      | 228:
0275     .long   SYM(_uhoh)      | 229:
0276     .long   SYM(_uhoh)      | 230:
0277     .long   SYM(_uhoh)      | 231:
0278     .long   SYM(_uhoh)      | 232:
0279     .long   SYM(_uhoh)      | 233:
0280     .long   SYM(_uhoh)      | 234:
0281     .long   SYM(_uhoh)      | 235:
0282     .long   SYM(_uhoh)      | 236:
0283     .long   SYM(_uhoh)      | 237:
0284     .long   SYM(_uhoh)      | 238:
0285     .long   SYM(_uhoh)      | 239:
0286     .long   SYM(_uhoh)      | 240:
0287     .long   SYM(_uhoh)      | 241:
0288     .long   SYM(_uhoh)      | 242:
0289     .long   SYM(_uhoh)      | 243:
0290     .long   SYM(_uhoh)      | 244:
0291     .long   SYM(_uhoh)      | 245:
0292     .long   SYM(_uhoh)      | 246:
0293     .long   SYM(_uhoh)      | 247:
0294     .long   SYM(_uhoh)      | 248:
0295     .long   SYM(_uhoh)      | 249:
0296     .long   SYM(_uhoh)      | 250:
0297     .long   SYM(_uhoh)      | 251:
0298     .long   SYM(_uhoh)      | 252:
0299     .long   SYM(_uhoh)      | 253:
0300     .long   SYM(_uhoh)      | 254:
0301     .long   SYM(_uhoh)      | 255:
0302 
0303 /*
0304  * Default trap handler
0305  * With an oscilloscope you can see AS* stop
0306  */
0307 .align 4
0308     PUBLIC (_uhoh)
0309 SYM(_uhoh):
0310     nop                     | Leave spot for breakpoint
0311     stop    #0x2700             | Stop with interrupts disabled
0312     bra.w   SYM(_uhoh)          | Stuck forever
0313 
0314 .align 4
0315     PUBLIC (_spuriousInterrupt)
0316 SYM(_spuriousInterrupt):
0317     addql   #1,SYM(_M68kSpuriousInterruptCount)
0318     rte
0319 /***************************************************************************
0320    Function : start
0321 
0322    Description : setup the internal SRAM for use and setup the INITIAL STACK ptr.
0323     Also enable the internal peripherals
0324  ***************************************************************************/
0325 .align 4
0326     PUBLIC (start)
0327 SYM(start):
0328     move.w  #0x0000,d0              | Turn off watchdog timer
0329     move.w  d0, (0x40140000)
0330     move.l  #0x01000000,d0          | Set system frequency to 150 MHz
0331     move.l  d0, (0x40120000)
0332     move.w  #0x2700,sr              | Disable interrupts
0333 
0334     move.l  #__SRAMBASE+1,d0        | Enable the MCF5235 internal SRAM
0335     movec   d0,%rambar              | ...so we have a stack
0336 
0337     move.l  #0x20000201, d0
0338     move.l   d0,(0x40000008)        | set up 2nd RAMBAR to make 2nd port avail to FEC
0339 
0340     move.l  #__IPSBAR+1,d0          | Enable the MCF5235 internal peripherals
0341     move.l  d0,DEFAULT_IPSBAR
0342 
0343     /*
0344      * Remainder of the startup code is handled by C code
0345      */
0346     jmp SYM(Init5235)               | Start C code (which never returns)
0347 
0348 /***************************************************************************
0349    Function : CopyDataClearBSSAndStart
0350 
0351    Description : Copy DATA segment, Copy SRAM segment, clear BSS segment,
0352    start C program. Assume that DATA and BSS sizes are multiples of 4.
0353  ***************************************************************************/
0354 .align 4
0355 
0356     PUBLIC (CopyDataClearBSSAndStart)
0357 SYM(CopyDataClearBSSAndStart):
0358     lea SYM(_data_dest_start),a0    | Get start of DATA in RAM
0359     lea SYM(_data_src_start),a2     | Get start of DATA in ROM
0360     cmpl    a0,a2                   | Are they the same?
0361     beq.s   NODATACOPY              | Yes, no copy necessary
0362     lea SYM(_data_dest_end),a1      | Get end of DATA in RAM
0363     bra.s   DATACOPYLOOPTEST        | Branch into copy loop
0364 DATACOPYLOOP:
0365     movel   a2@+,a0@+               | Copy word from ROM to RAM
0366 DATACOPYLOOPTEST:
0367     cmpl    a1,a0                   | Done?
0368     bcs.s   DATACOPYLOOP            | No, skip
0369 NODATACOPY:
0370 
0371 /* Now, clear BSS */
0372     lea _clear_start,a0             | Get start of BSS
0373     lea _clear_end,a1               | Get end of BSS
0374     clrl    d0                      | Value to set
0375     bra.s   ZEROLOOPTEST            | Branch into clear loop
0376 ZEROLOOP:
0377     movel   d0,a0@+                 | Clear a word
0378 ZEROLOOPTEST:
0379     cmpl    a1,a0                   | Done?
0380     bcs.s   ZEROLOOP                | No, skip
0381 
0382 
0383     /*
0384      * Right : Now we're ready to boot RTEMS
0385      */
0386     move.l  #_ISR_Stack_area_end,sp | Use configuration defined stack
0387     clrl    d0                      | Pass in null to all boot_card() params
0388     movel   d0,a7@-                 | command line
0389     jsr SYM(boot_card)              | Call C boot_card function to startup RTEMS
0390     movel   a7@+,d0
0391 MULTI_TASK_EXIT:
0392     nop
0393     nop
0394     trap    #14
0395     bra     MULTI_TASK_EXIT
0396     .align 2
0397 END_CODE
0398 
0399 BEGIN_DATA_DCL
0400     .align 2
0401     PUBLIC (_M68kSpuriousInterruptCount)
0402 SYM (_M68kSpuriousInterruptCount):
0403     .long   0
0404 END_DATA_DCL
0405 
0406 END
0407