Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * RTEMS generic mcf548x BSP
0005  *
0006  * The file contains the assembly part of MCF548x init code.
0007  *
0008  * Parts of the code has been derived from the "dBUG source code"
0009  * package Freescale is providing for M548X EVBs. The usage of
0010  * the modified or unmodified code and it's integration into the
0011  * generic mcf548x BSP has been done according to the Freescale
0012  * license terms.
0013  *
0014  * The Freescale license terms can be reviewed in the file
0015  *
0016  *    LICENSE.Freescale
0017  *
0018  * The generic mcf548x BSP has been developed on the basic
0019  * structures and modules of the av5282 BSP.
0020  */
0021 
0022 /*
0023  * Copyright (c) 2007 embedded brains GmbH & Co. KG
0024  *
0025  * Redistribution and use in source and binary forms, with or without
0026  * modification, are permitted provided that the following conditions
0027  * are met:
0028  * 1. Redistributions of source code must retain the above copyright
0029  *    notice, this list of conditions and the following disclaimer.
0030  * 2. Redistributions in binary form must reproduce the above copyright
0031  *    notice, this list of conditions and the following disclaimer in the
0032  *    documentation and/or other materials provided with the distribution.
0033  *
0034  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0035  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0036  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0037  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0038  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0039  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0040  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0041  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0042  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0043  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0044  * POSSIBILITY OF SUCH DAMAGE.
0045  */
0046 
0047 /*===============================================================*\
0048 | Includes                                                        |
0049 \*===============================================================*/
0050 #include <rtems/asm.h>
0051 #include <bsp/linker-symbols.h>
0052 
0053 /*===============================================================*\
0054 | External references                                             |
0055 \*===============================================================*/
0056 .extern __MBAR
0057 .extern _CoreSramBase0
0058 .extern _CoreSramBase1
0059 .extern _CoreSramSize1
0060 .extern mcf548x_init
0061 .extern boot_card
0062 
0063 /*===============================================================*\
0064 | Global symbols                                                  |
0065 \*===============================================================*/
0066 
0067 .global interrupt_vector_table
0068 .global spurious_int_count
0069 .global start
0070 
0071 
0072 /*===============================================================*\
0073 | Exception Table                                                 |
0074 \*===============================================================*/
0075 
0076 .section ".vectors","ax"         /* begin of vectors section */
0077 PUBLIC (InterruptVectorTable)
0078 SYM(InterruptVectorTable):
0079 INITSP:     .long   _ISR_Stack_area_end /* Initial SP         */
0080 INITPC:     .long   start           /* Initial PC         */
0081 vector002:  .long   asm_default_interrupt   /* Access Error       */
0082 vector003:  .long   asm_default_interrupt   /* Address Error      */
0083 vector004:  .long   asm_default_interrupt   /* Illegal Instruction    */
0084 vector005:  .long   asm_default_interrupt   /* Reserved       */
0085 vector006:  .long   asm_default_interrupt   /* Reserved       */
0086 vector007:  .long   asm_default_interrupt   /* Reserved       */
0087 vector008:  .long   asm_default_interrupt   /* Privilege Violation    */
0088 vector009:  .long   asm_default_interrupt   /* Trace          */
0089 vector010:  .long   asm_default_interrupt   /* Unimplemented A-Line   */
0090 vector011:  .long   asm_default_interrupt   /* Unimplemented F-Line   */
0091 vector012:  .long   asm_default_interrupt   /* Debug Interrupt    */
0092 vector013:  .long   asm_default_interrupt   /* Reserved       */
0093 vector014:  .long   asm_default_interrupt   /* Format Error       */
0094 vector015:  .long   asm_default_interrupt   /* Unitialized Int.   */
0095 vector016:  .long   asm_default_interrupt   /* Reserved       */
0096 vector017:  .long   asm_default_interrupt   /* Reserved       */
0097 vector018:  .long   asm_default_interrupt   /* Reserved       */
0098 vector019:  .long   asm_default_interrupt   /* Reserved       */
0099 vector020:  .long   asm_default_interrupt   /* Reserved       */
0100 vector021:  .long   asm_default_interrupt   /* Reserved       */
0101 vector022:  .long   asm_default_interrupt   /* Reserved       */
0102 vector023:  .long   asm_default_interrupt   /* Reserved       */
0103 vector024:  .long   asm_spurious_interrupt  /* Spurious Interrupt     */
0104 vector025:  .long   asm_default_interrupt   /* Autovector Level 1     */
0105 vector026:  .long   asm_default_interrupt   /* Autovector Level 2     */
0106 vector027:  .long   asm_default_interrupt   /* Autovector Level 3     */
0107 vector028:  .long   asm_default_interrupt   /* Autovector Level 4     */
0108 vector029:  .long   asm_default_interrupt   /* Autovector Level 5     */
0109 vector030:  .long   asm_default_interrupt   /* Autovector Level 6     */
0110 vector031:  .long   asm_default_interrupt   /* Autovector Level 7     */
0111 vector032:  .long   asm_default_interrupt   /* TRAP #0        */
0112 vector033:  .long   asm_default_interrupt   /* TRAP #1        */
0113 vector034:  .long   asm_default_interrupt   /* TRAP #2        */
0114 vector035:  .long   asm_default_interrupt   /* TRAP #3        */
0115 vector036:  .long   asm_default_interrupt   /* TRAP #4        */
0116 vector037:  .long   asm_default_interrupt   /* TRAP #5        */
0117 vector038:  .long   asm_default_interrupt   /* TRAP #6        */
0118 vector039:  .long   asm_default_interrupt   /* TRAP #7        */
0119 vector040:  .long   asm_default_interrupt   /* TRAP #8        */
0120 vector041:  .long   asm_default_interrupt   /* TRAP #9        */
0121 vector042:  .long   asm_default_interrupt   /* TRAP #10       */
0122 vector043:  .long   asm_default_interrupt   /* TRAP #11       */
0123 vector044:  .long   asm_default_interrupt   /* TRAP #12       */
0124 vector045:  .long   asm_default_interrupt   /* TRAP #13       */
0125 vector046:  .long   asm_default_interrupt   /* TRAP #14       */
0126 vector047:  .long   asm_default_interrupt   /* TRAP #15       */
0127 vector048:  .long   asm_default_interrupt   /* Reserved       */
0128 vector049:  .long   asm_default_interrupt   /* Reserved       */
0129 vector050:  .long   asm_default_interrupt   /* Reserved       */
0130 vector051:  .long   asm_default_interrupt   /* Reserved       */
0131 vector052:  .long   asm_default_interrupt   /* Reserved       */
0132 vector053:  .long   asm_default_interrupt   /* Reserved       */
0133 vector054:  .long   asm_default_interrupt   /* Reserved       */
0134 vector055:  .long   asm_default_interrupt   /* Reserved       */
0135 vector056:  .long   asm_default_interrupt   /* Reserved       */
0136 vector057:  .long   asm_default_interrupt   /* Reserved       */
0137 vector058:  .long   asm_default_interrupt   /* Reserved       */
0138 vector059:  .long   asm_default_interrupt   /* Reserved       */
0139 vector060:  .long   asm_default_interrupt   /* Reserved       */
0140 vector061:  .long   asm_default_interrupt   /* Reserved       */
0141 vector062:  .long   asm_default_interrupt   /* Reserved       */
0142 vector063:  .long   asm_default_interrupt   /* Reserved       */
0143 vector064:  .long   asm_default_interrupt
0144 vector065:  .long   asm_default_interrupt
0145 vector066:  .long   asm_default_interrupt
0146 vector067:  .long   asm_default_interrupt
0147 vector068:  .long   asm_default_interrupt
0148 vector069:  .long   asm_default_interrupt
0149 vector070:  .long   asm_default_interrupt
0150 vector071:  .long   asm_default_interrupt
0151 vector072:  .long   asm_default_interrupt
0152 vector073:  .long   asm_default_interrupt
0153 vector074:  .long   asm_default_interrupt
0154 vector075:  .long   asm_default_interrupt
0155 vector076:  .long   asm_default_interrupt
0156 vector077:  .long   asm_default_interrupt
0157 vector078:  .long   asm_default_interrupt
0158 vector079:  .long   asm_default_interrupt
0159 vector080:  .long   asm_default_interrupt
0160 vector081:  .long   asm_default_interrupt
0161 vector082:  .long   asm_default_interrupt
0162 vector083:  .long   asm_default_interrupt
0163 vector084:  .long   asm_default_interrupt
0164 vector085:  .long   asm_default_interrupt
0165 vector086:  .long   asm_default_interrupt
0166 vector087:  .long   asm_default_interrupt
0167 vector088:  .long   asm_default_interrupt
0168 vector089:  .long   asm_default_interrupt
0169 vector090:  .long   asm_default_interrupt
0170 vector091:  .long   asm_default_interrupt
0171 vector092:  .long   asm_default_interrupt
0172 vector093:  .long   asm_default_interrupt
0173 vector094:  .long   asm_default_interrupt
0174 vector095:  .long   asm_default_interrupt
0175 vector096:  .long   asm_default_interrupt
0176 vector097:  .long   asm_default_interrupt
0177 vector098:  .long   asm_default_interrupt
0178 vector099:  .long   asm_default_interrupt
0179 vector100:  .long   asm_default_interrupt
0180 vector101:  .long   asm_default_interrupt
0181 vector102:  .long   asm_default_interrupt
0182 vector103:  .long   asm_default_interrupt
0183 vector104:  .long   asm_default_interrupt
0184 vector105:  .long   asm_default_interrupt
0185 vector106:  .long   asm_default_interrupt
0186 vector107:  .long   asm_default_interrupt
0187 vector108:  .long   asm_default_interrupt
0188 vector109:  .long   asm_default_interrupt
0189 vector110:  .long   asm_default_interrupt
0190 vector111:  .long   asm_default_interrupt
0191 vector112:  .long   asm_default_interrupt
0192 vector113:  .long   asm_default_interrupt
0193 vector114:  .long   asm_default_interrupt
0194 vector115:  .long   asm_default_interrupt
0195 vector116:  .long   asm_default_interrupt
0196 vector117:  .long   asm_default_interrupt
0197 vector118:  .long   asm_default_interrupt
0198 vector119:  .long   asm_default_interrupt
0199 vector120:  .long   asm_default_interrupt
0200 vector121:  .long   asm_default_interrupt
0201 vector122:  .long   asm_default_interrupt
0202 vector123:  .long   asm_default_interrupt
0203 vector124:  .long   asm_default_interrupt
0204 vector125:  .long   asm_default_interrupt
0205 vector126:  .long   asm_default_interrupt
0206 vector127:  .long   asm_default_interrupt
0207 vector128:  .long   asm_default_interrupt
0208 vector129:  .long   asm_default_interrupt
0209 vector130:  .long   asm_default_interrupt
0210 vector131:  .long   asm_default_interrupt
0211 vector132:  .long   asm_default_interrupt
0212 vector133:  .long   asm_default_interrupt
0213 vector134:  .long   asm_default_interrupt
0214 vector135:  .long   asm_default_interrupt
0215 vector136:  .long   asm_default_interrupt
0216 vector137:  .long   asm_default_interrupt
0217 vector138:  .long   asm_default_interrupt
0218 vector139:  .long   asm_default_interrupt
0219 vector140:  .long   asm_default_interrupt
0220 vector141:  .long   asm_default_interrupt
0221 vector142:  .long   asm_default_interrupt
0222 vector143:  .long   asm_default_interrupt
0223 vector144:  .long   asm_default_interrupt
0224 vector145:  .long   asm_default_interrupt
0225 vector146:  .long   asm_default_interrupt
0226 vector147:  .long   asm_default_interrupt
0227 vector148:  .long   asm_default_interrupt
0228 vector149:  .long   asm_default_interrupt
0229 vector150:  .long   asm_default_interrupt
0230 vector151:  .long   asm_default_interrupt
0231 vector152:  .long   asm_default_interrupt
0232 vector153:  .long   asm_default_interrupt
0233 vector154:  .long   asm_default_interrupt
0234 vector155:  .long   asm_default_interrupt
0235 vector156:  .long   asm_default_interrupt
0236 vector157:  .long   asm_default_interrupt
0237 vector158:  .long   asm_default_interrupt
0238 vector159:  .long   asm_default_interrupt
0239 vector160:  .long   asm_default_interrupt
0240 vector161:  .long   asm_default_interrupt
0241 vector162:  .long   asm_default_interrupt
0242 vector163:  .long   asm_default_interrupt
0243 vector164:  .long   asm_default_interrupt
0244 vector165:  .long   asm_default_interrupt
0245 vector166:  .long   asm_default_interrupt
0246 vector167:  .long   asm_default_interrupt
0247 vector168:  .long   asm_default_interrupt
0248 vector169:  .long   asm_default_interrupt
0249 vector170:  .long   asm_default_interrupt
0250 vector171:  .long   asm_default_interrupt
0251 vector172:  .long   asm_default_interrupt
0252 vector173:  .long   asm_default_interrupt
0253 vector174:  .long   asm_default_interrupt
0254 vector175:  .long   asm_default_interrupt
0255 vector176:  .long   asm_default_interrupt
0256 vector177:  .long   asm_default_interrupt
0257 vector178:  .long   asm_default_interrupt
0258 vector179:  .long   asm_default_interrupt
0259 vector180:  .long   asm_default_interrupt
0260 vector181:  .long   asm_default_interrupt
0261 vector182:  .long   asm_default_interrupt
0262 vector183:  .long   asm_default_interrupt
0263 vector184:  .long   asm_default_interrupt
0264 vector185:  .long   asm_default_interrupt
0265 vector186:  .long   asm_default_interrupt
0266 vector187:  .long   asm_default_interrupt
0267 vector188:  .long   asm_default_interrupt
0268 vector189:  .long   asm_default_interrupt
0269 vector190:  .long   asm_default_interrupt
0270 vector191:  .long   asm_default_interrupt
0271 vector192:  .long   asm_default_interrupt
0272 vector193:  .long   asm_default_interrupt
0273 vector194:  .long   asm_default_interrupt
0274 vector195:  .long   asm_default_interrupt
0275 vector196:  .long   asm_default_interrupt
0276 vector197:  .long   asm_default_interrupt
0277 vector198:  .long   asm_default_interrupt
0278 vector199:  .long   asm_default_interrupt
0279 vector200:  .long   asm_default_interrupt
0280 vector201:  .long   asm_default_interrupt
0281 vector202:  .long   asm_default_interrupt
0282 vector203:  .long   asm_default_interrupt
0283 vector204:  .long   asm_default_interrupt
0284 vector205:  .long   asm_default_interrupt
0285 vector206:  .long   asm_default_interrupt
0286 vector207:  .long   asm_default_interrupt
0287 vector208:  .long   asm_default_interrupt
0288 vector209:  .long   asm_default_interrupt
0289 vector210:  .long   asm_default_interrupt
0290 vector211:  .long   asm_default_interrupt
0291 vector212:  .long   asm_default_interrupt
0292 vector213:  .long   asm_default_interrupt
0293 vector214:  .long   asm_default_interrupt
0294 vector215:  .long   asm_default_interrupt
0295 vector216:  .long   asm_default_interrupt
0296 vector217:  .long   asm_default_interrupt
0297 vector218:  .long   asm_default_interrupt
0298 vector219:  .long   asm_default_interrupt
0299 vector220:  .long   asm_default_interrupt
0300 vector221:  .long   asm_default_interrupt
0301 vector222:  .long   asm_default_interrupt
0302 vector223:  .long   asm_default_interrupt
0303 vector224:  .long   asm_default_interrupt
0304 vector225:  .long   asm_default_interrupt
0305 vector226:  .long   asm_default_interrupt
0306 vector227:  .long   asm_default_interrupt
0307 vector228:  .long   asm_default_interrupt
0308 vector229:  .long   asm_default_interrupt
0309 vector230:  .long   asm_default_interrupt
0310 vector231:  .long   asm_default_interrupt
0311 vector232:  .long   asm_default_interrupt
0312 vector233:  .long   asm_default_interrupt
0313 vector234:  .long   asm_default_interrupt
0314 vector235:  .long   asm_default_interrupt
0315 vector236:  .long   asm_default_interrupt
0316 vector237:  .long   asm_default_interrupt
0317 vector238:  .long   asm_default_interrupt
0318 vector239:  .long   asm_default_interrupt
0319 vector240:  .long   asm_default_interrupt
0320 vector241:  .long   asm_default_interrupt
0321 vector242:  .long   asm_default_interrupt
0322 vector243:  .long   asm_default_interrupt
0323 vector244:  .long   asm_default_interrupt
0324 vector245:  .long   asm_default_interrupt
0325 vector246:  .long   asm_default_interrupt
0326 vector247:  .long   asm_default_interrupt
0327 vector248:  .long   asm_default_interrupt
0328 vector249:  .long   asm_default_interrupt
0329 vector250:  .long   asm_default_interrupt
0330 vector251:  .long   asm_default_interrupt
0331 vector252:  .long   asm_default_interrupt
0332 vector253:  .long   asm_default_interrupt
0333 vector254:  .long   asm_default_interrupt
0334 vector255:  .long   asm_default_interrupt
0335 
0336 /*===============================================================*\
0337 | Start of code                                                   |
0338 \*===============================================================*/
0339 .text
0340 PUBLIC (start)
0341 SYM(start):
0342     move.w  #0x3700,sr              /* disable interrupts */
0343     jmp     start_init
0344 
0345 /*===============================================================*\
0346 | Sspurious interrupt counter                                     |
0347 \*===============================================================*/
0348 .align 4
0349 .data                   /* begin of data section */
0350 PUBLIC (spurious_int_count)
0351 SYM(spurious_int_count):
0352     .long   0               /* spurious interrupt counter */
0353 
0354 /*===============================================================*\
0355 | Function: Default exception handler                             |
0356 +-----------------------------------------------------------------+
0357 | - stop and disable all interrupts                               |
0358 | - loop forever                                                  |
0359 \*===============================================================*/
0360 .text                   /* start of text section */
0361 .align 4
0362 PUBLIC (asm_default_interrupt)
0363 SYM(asm_default_interrupt):
0364     nop
0365     stop    #0x3700                 /* stop */
0366     bra.w   asm_default_interrupt       /* loop forever */
0367 
0368 /*===============================================================*\
0369 | Function: Exception handler for spurious interrupts             |
0370 +-----------------------------------------------------------------+
0371 | - count spurious interrupts                                     |
0372 \*===============================================================*/
0373 .align 4
0374 PUBLIC (asm_spurious_interrupt)
0375 SYM(asm_spurious_interrupt):
0376     add.l   #1,spurious_int_count
0377     rte
0378 
0379 /*===============================================================*\
0380 | Function: start_init                                            |
0381 +-----------------------------------------------------------------+
0382 | - Disable all intterupts                                        |
0383 | - Setup the internal SRAM                                       |
0384 | - Initialize mcf548x peripherals                                |
0385 | - Set initial stack pointer                                     |
0386 | - Boot RTEMS
0387 \*===============================================================*/
0388 .align 4
0389 PUBLIC (start_init)
0390 SYM(start_init):
0391 
0392     move.l  #0x01040100,d0      /* invalidate instruction/data/branch cache, disable all caches */
0393     movec   d0,cacr
0394 
0395     move.l  #_CoreSramBase0,d0      /* initialize RAMBAR0 */
0396     add.l   #0x21,d0                    /* for code & data    */
0397     movec   d0,rambar0
0398 
0399     move.l  #_CoreSramBase1,d0      /* initialize RAMBAR1 */
0400     add.l   #0x21,d0                    /* for code & data    */
0401     movec   d0,rambar1                  /* movec d0,RAMBAR1   */
0402 
0403     move.l  #__MBAR,d0          /* initialize MBAR */
0404     movec   d0,mbar
0405 
0406     move.l  #_CoreSramBase1,d0      /* set sp to end of Core SRAM temporarily */
0407     add.l   #_CoreSramSize1,d0
0408     move.l  d0,sp
0409 
0410     move.l  #0,d0           /* initialize frame pointer */
0411     movea.l d0,a6
0412 
0413     jsr     mcf548x_init        /* Initialize mcf548x peripherals */
0414 
0415     move.l  #_ISR_Stack_area_end,sp /* relocate sp */
0416 
0417     clrl    d0                  /* clear d0 */
0418     movel   d0,a7@-                     /* command line == 0 */
0419 
0420     jsr     boot_card                   /* boot rtems */
0421 
0422     movel   a7@+,d0
0423 
0424 exit_multitasking:
0425     nop
0426     nop
0427     halt
0428     bra     exit_multitasking
0429 
0430 .end                    /* end of start.S module */
0431 
0432 
0433