forked from Imagelibrary/rtems
414 lines
15 KiB
ArmAsm
414 lines
15 KiB
ArmAsm
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
|
|
/*
|
|
* uC5282 startup code
|
|
*
|
|
* This file contains the entry point for the application.
|
|
* The name of this entry point is compiler dependent.
|
|
* It jumps to the BSP which is responsible for performing
|
|
* all initialization.
|
|
*/
|
|
|
|
/*
|
|
* COPYRIGHT (c) 1989-2014.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <bsp.h>
|
|
#include <rtems/asm.h>
|
|
|
|
#define SRAM_SIZE (64*1024)
|
|
#define DEFAULT_IPSBAR 0x40000000
|
|
|
|
BEGIN_CODE
|
|
#define INITIAL_STACK __SRAMBASE+SRAM_SIZE-4
|
|
|
|
PUBLIC (INTERRUPT_VECTOR)
|
|
SYM(INTERRUPT_VECTOR):
|
|
.long INITIAL_STACK | 0: Initial 'SSP'
|
|
.long start | 1: Initial PC
|
|
.long SYM(_uhoh) | 2: Bus error
|
|
.long SYM(_uhoh) | 3: Address error
|
|
.long SYM(_uhoh) | 4: Illegal instruction
|
|
.long SYM(_uhoh) | 5: Zero division
|
|
.long SYM(_uhoh) | 6: CHK, CHK2 instruction
|
|
.long SYM(_uhoh) | 7: TRAPcc, TRAPV instructions
|
|
.long SYM(_uhoh) | 8: Privilege violation
|
|
.long SYM(_uhoh) | 9: Trace
|
|
.long SYM(_uhoh) | 10: Line 1010 emulator
|
|
.long SYM(_uhoh) | 11: Line 1111 emulator
|
|
.long SYM(_uhoh) | 12: Hardware breakpoint
|
|
.long SYM(_uhoh) | 13: Reserved for coprocessor violation
|
|
.long SYM(_uhoh) | 14: Format error
|
|
.long SYM(_uhoh) | 15: Uninitialized interrupt
|
|
.long SYM(_uhoh) | 16: Unassigned, reserved
|
|
.long SYM(_uhoh) | 17:
|
|
.long SYM(_uhoh) | 18:
|
|
.long SYM(_uhoh) | 19:
|
|
.long SYM(_uhoh) | 20:
|
|
.long SYM(_uhoh) | 21:
|
|
.long SYM(_uhoh) | 22:
|
|
.long SYM(_uhoh) | 23:
|
|
.long SYM(_spuriousInterrupt) | 24: Spurious interrupt
|
|
.long SYM(_uhoh) | 25: Level 1 interrupt autovector
|
|
.long SYM(_uhoh) | 26: Level 2 interrupt autovector
|
|
.long SYM(_uhoh) | 27: Level 3 interrupt autovector
|
|
.long SYM(_uhoh) | 28: Level 4 interrupt autovector
|
|
.long SYM(_uhoh) | 29: Level 5 interrupt autovector
|
|
.long SYM(_uhoh) | 30: Level 6 interrupt autovector
|
|
.long SYM(_uhoh) | 31: Level 7 interrupt autovector
|
|
.long SYM(_uhoh) | 32: Trap instruction (0-15)
|
|
.long SYM(_uhoh) | 33:
|
|
.long SYM(_uhoh) | 34:
|
|
.long SYM(_uhoh) | 35:
|
|
.long SYM(_uhoh) | 36:
|
|
.long SYM(_uhoh) | 37:
|
|
.long SYM(_uhoh) | 38:
|
|
.long SYM(_uhoh) | 39:
|
|
.long SYM(_uhoh) | 40:
|
|
.long SYM(_uhoh) | 41:
|
|
.long SYM(_uhoh) | 42:
|
|
.long SYM(_uhoh) | 43:
|
|
.long SYM(_uhoh) | 44:
|
|
.long SYM(_uhoh) | 45:
|
|
.long SYM(_uhoh) | 46:
|
|
.long SYM(_uhoh) | 47:
|
|
.long SYM(_uhoh) | 48: Reserved for coprocessor
|
|
.long SYM(_uhoh) | 49:
|
|
.long SYM(_uhoh) | 50:
|
|
.long SYM(_uhoh) | 51:
|
|
.long SYM(_uhoh) | 52:
|
|
.long SYM(_uhoh) | 53:
|
|
.long SYM(_uhoh) | 54:
|
|
.long SYM(_uhoh) | 55:
|
|
.long SYM(_uhoh) | 56:
|
|
.long SYM(_uhoh) | 57:
|
|
.long SYM(_uhoh) | 58:
|
|
.long SYM(_uhoh) | 59: Unassigned, reserved
|
|
.long SYM(_uhoh) | 60:
|
|
.long SYM(_uhoh) | 61:
|
|
.long SYM(_uhoh) | 62:
|
|
.long SYM(_uhoh) | 63:
|
|
.long SYM(_spuriousInterrupt) | 64: User spurious handler
|
|
.long SYM(_uhoh) | 65:
|
|
.long SYM(_uhoh) | 66:
|
|
.long SYM(_uhoh) | 67:
|
|
.long SYM(_uhoh) | 68:
|
|
.long SYM(_uhoh) | 69:
|
|
.long SYM(_uhoh) | 70:
|
|
.long SYM(_uhoh) | 71:
|
|
.long SYM(_uhoh) | 72:
|
|
.long SYM(_uhoh) | 73:
|
|
.long SYM(_uhoh) | 74:
|
|
.long SYM(_uhoh) | 75:
|
|
.long SYM(_uhoh) | 76:
|
|
.long SYM(_uhoh) | 77:
|
|
.long SYM(_uhoh) | 78:
|
|
.long SYM(_uhoh) | 79:
|
|
.long SYM(_uhoh) | 80:
|
|
.long SYM(_uhoh) | 81:
|
|
.long SYM(_uhoh) | 82:
|
|
.long SYM(_uhoh) | 83:
|
|
.long SYM(_uhoh) | 84:
|
|
.long SYM(_uhoh) | 85:
|
|
.long SYM(_uhoh) | 86:
|
|
.long SYM(_uhoh) | 87:
|
|
.long SYM(_uhoh) | 88:
|
|
.long SYM(_uhoh) | 89:
|
|
.long SYM(_uhoh) | 90:
|
|
.long SYM(_uhoh) | 91:
|
|
.long SYM(_uhoh) | 92:
|
|
.long SYM(_uhoh) | 93:
|
|
.long SYM(_uhoh) | 94:
|
|
.long SYM(_uhoh) | 95:
|
|
.long SYM(_uhoh) | 96:
|
|
.long SYM(_uhoh) | 97:
|
|
.long SYM(_uhoh) | 98:
|
|
.long SYM(_uhoh) | 99:
|
|
.long SYM(_uhoh) | 100:
|
|
.long SYM(_uhoh) | 101:
|
|
.long SYM(_uhoh) | 102:
|
|
.long SYM(_uhoh) | 103:
|
|
.long SYM(_uhoh) | 104:
|
|
.long SYM(_uhoh) | 105:
|
|
.long SYM(_uhoh) | 106:
|
|
.long SYM(_uhoh) | 107:
|
|
.long SYM(_uhoh) | 108:
|
|
.long SYM(_uhoh) | 109:
|
|
.long SYM(_uhoh) | 110:
|
|
.long SYM(_uhoh) | 111:
|
|
.long SYM(_uhoh) | 112:
|
|
.long SYM(_uhoh) | 113:
|
|
.long SYM(_uhoh) | 114:
|
|
.long SYM(_uhoh) | 115:
|
|
.long SYM(_uhoh) | 116:
|
|
.long SYM(_uhoh) | 117:
|
|
.long SYM(_uhoh) | 118:
|
|
.long SYM(_uhoh) | 119:
|
|
.long SYM(_uhoh) | 120:
|
|
.long SYM(_uhoh) | 121:
|
|
.long SYM(_uhoh) | 122:
|
|
.long SYM(_uhoh) | 123:
|
|
.long SYM(_uhoh) | 124:
|
|
.long SYM(_uhoh) | 125:
|
|
.long SYM(_uhoh) | 126:
|
|
.long SYM(_uhoh) | 127:
|
|
.long SYM(_uhoh) | 128:
|
|
.long SYM(_uhoh) | 129:
|
|
.long SYM(_uhoh) | 130:
|
|
.long SYM(_uhoh) | 131:
|
|
.long SYM(_uhoh) | 132:
|
|
.long SYM(_uhoh) | 133:
|
|
.long SYM(_uhoh) | 134:
|
|
.long SYM(_uhoh) | 135:
|
|
.long SYM(_uhoh) | 136:
|
|
.long SYM(_uhoh) | 137:
|
|
.long SYM(_uhoh) | 138:
|
|
.long SYM(_uhoh) | 139:
|
|
.long SYM(_uhoh) | 140:
|
|
.long SYM(_uhoh) | 141:
|
|
.long SYM(_uhoh) | 142:
|
|
.long SYM(_uhoh) | 143:
|
|
.long SYM(_uhoh) | 144:
|
|
.long SYM(_uhoh) | 145:
|
|
.long SYM(_uhoh) | 146:
|
|
.long SYM(_uhoh) | 147:
|
|
.long SYM(_uhoh) | 148:
|
|
.long SYM(_uhoh) | 149:
|
|
.long SYM(_uhoh) | 150:
|
|
.long SYM(_uhoh) | 151:
|
|
.long SYM(_uhoh) | 152:
|
|
.long SYM(_uhoh) | 153:
|
|
.long SYM(_uhoh) | 154:
|
|
.long SYM(_uhoh) | 155:
|
|
.long SYM(_uhoh) | 156:
|
|
.long SYM(_uhoh) | 157:
|
|
.long SYM(_uhoh) | 158:
|
|
.long SYM(_uhoh) | 159:
|
|
.long SYM(_uhoh) | 160:
|
|
.long SYM(_uhoh) | 161:
|
|
.long SYM(_uhoh) | 162:
|
|
.long SYM(_uhoh) | 163:
|
|
.long SYM(_uhoh) | 164:
|
|
.long SYM(_uhoh) | 165:
|
|
.long SYM(_uhoh) | 166:
|
|
.long SYM(_uhoh) | 167:
|
|
.long SYM(_uhoh) | 168:
|
|
.long SYM(_uhoh) | 169:
|
|
.long SYM(_uhoh) | 170:
|
|
.long SYM(_uhoh) | 171:
|
|
.long SYM(_uhoh) | 172:
|
|
.long SYM(_uhoh) | 173:
|
|
.long SYM(_uhoh) | 174:
|
|
.long SYM(_uhoh) | 175:
|
|
.long SYM(_uhoh) | 176:
|
|
.long SYM(_uhoh) | 177:
|
|
.long SYM(_uhoh) | 178:
|
|
.long SYM(_uhoh) | 179:
|
|
.long SYM(_uhoh) | 180:
|
|
.long SYM(_uhoh) | 181:
|
|
.long SYM(_uhoh) | 182:
|
|
.long SYM(_uhoh) | 183:
|
|
.long SYM(_uhoh) | 184:
|
|
.long SYM(_uhoh) | 185:
|
|
.long SYM(_uhoh) | 186:
|
|
.long SYM(_uhoh) | 187:
|
|
.long SYM(_uhoh) | 188:
|
|
.long SYM(_uhoh) | 189:
|
|
.long SYM(_uhoh) | 190:
|
|
.long SYM(_uhoh) | 191:
|
|
.long SYM(_uhoh) | 192:
|
|
.long SYM(_uhoh) | 193:
|
|
.long SYM(_uhoh) | 194:
|
|
.long SYM(_uhoh) | 195:
|
|
.long SYM(_uhoh) | 196:
|
|
.long SYM(_uhoh) | 197:
|
|
.long SYM(_uhoh) | 198:
|
|
.long SYM(_uhoh) | 199:
|
|
.long SYM(_uhoh) | 200:
|
|
.long SYM(_uhoh) | 201:
|
|
.long SYM(_uhoh) | 202:
|
|
.long SYM(_uhoh) | 203:
|
|
.long SYM(_uhoh) | 204:
|
|
.long SYM(_uhoh) | 205:
|
|
.long SYM(_uhoh) | 206:
|
|
.long SYM(_uhoh) | 207:
|
|
.long SYM(_uhoh) | 208:
|
|
.long SYM(_uhoh) | 209:
|
|
.long SYM(_uhoh) | 210:
|
|
.long SYM(_uhoh) | 211:
|
|
.long SYM(_uhoh) | 212:
|
|
.long SYM(_uhoh) | 213:
|
|
.long SYM(_uhoh) | 214:
|
|
.long SYM(_uhoh) | 215:
|
|
.long SYM(_uhoh) | 216:
|
|
.long SYM(_uhoh) | 217:
|
|
.long SYM(_uhoh) | 218:
|
|
.long SYM(_uhoh) | 219:
|
|
.long SYM(_uhoh) | 220:
|
|
.long SYM(_uhoh) | 221:
|
|
.long SYM(_uhoh) | 222:
|
|
.long SYM(_uhoh) | 223:
|
|
.long SYM(_uhoh) | 224:
|
|
.long SYM(_uhoh) | 225:
|
|
.long SYM(_uhoh) | 226:
|
|
.long SYM(_uhoh) | 227:
|
|
.long SYM(_uhoh) | 228:
|
|
.long SYM(_uhoh) | 229:
|
|
.long SYM(_uhoh) | 230:
|
|
.long SYM(_uhoh) | 231:
|
|
.long SYM(_uhoh) | 232:
|
|
.long SYM(_uhoh) | 233:
|
|
.long SYM(_uhoh) | 234:
|
|
.long SYM(_uhoh) | 235:
|
|
.long SYM(_uhoh) | 236:
|
|
.long SYM(_uhoh) | 237:
|
|
.long SYM(_uhoh) | 238:
|
|
.long SYM(_uhoh) | 239:
|
|
.long SYM(_uhoh) | 240:
|
|
.long SYM(_uhoh) | 241:
|
|
.long SYM(_uhoh) | 242:
|
|
.long SYM(_uhoh) | 243:
|
|
.long SYM(_uhoh) | 244:
|
|
.long SYM(_uhoh) | 245:
|
|
.long SYM(_uhoh) | 246:
|
|
.long SYM(_uhoh) | 247:
|
|
.long SYM(_uhoh) | 248:
|
|
.long SYM(_uhoh) | 249:
|
|
.long SYM(_uhoh) | 250:
|
|
.long SYM(_uhoh) | 251:
|
|
.long SYM(_uhoh) | 252:
|
|
.long SYM(_uhoh) | 253:
|
|
.long SYM(_uhoh) | 254:
|
|
.long SYM(_uhoh) | 255:
|
|
|
|
/*
|
|
* Default trap handler
|
|
* With an oscilloscope you can see AS* stop
|
|
*/
|
|
.align 4
|
|
PUBLIC (_uhoh)
|
|
SYM(_uhoh):
|
|
nop | Leave spot for breakpoint
|
|
stop #0x2700 | Stop with interrupts disabled
|
|
bra.w SYM(_uhoh) | Stuck forever
|
|
|
|
.align 4
|
|
PUBLIC (_spuriousInterrupt)
|
|
SYM(_spuriousInterrupt):
|
|
addql #1,SYM(_M68kSpuriousInterruptCount)
|
|
rte
|
|
/***************************************************************************
|
|
Function : start
|
|
|
|
Description : setup the internal SRAM for use and setup the INITIAL STACK ptr.
|
|
Also enable the internal peripherals
|
|
***************************************************************************/
|
|
.align 4
|
|
PUBLIC (start)
|
|
SYM(start):
|
|
move.w #0x0000,d0 | Turn off watchdog timer
|
|
move.w d0, (0x40140000)
|
|
move.w #0x2000,d0 | Set system frequency to 58960000
|
|
move.w d0, (0x40120000)
|
|
move.w #0x2700,sr | Disable interrupts
|
|
|
|
move.l #__SRAMBASE+1,d0 | Enable the MCF5282 internal SRAM
|
|
movec d0,%rambar | ...so we have a stack
|
|
move.l #(INITIAL_STACK),sp | Overwrite the fake stack pointer
|
|
|
|
/*
|
|
* If we're being started by the debugger, and the debugger has
|
|
* moved the IPSBAR, we're doomed........
|
|
*/
|
|
move.l #__IPSBAR+1,d0 | Enable the MCF5282 internal peripherals
|
|
move.l d0,DEFAULT_IPSBAR
|
|
|
|
/*
|
|
* Remainder of the startup code is handled by C code
|
|
*/
|
|
jmp SYM(Init5282) | Start C code (which never returns)
|
|
|
|
/***************************************************************************
|
|
Function : CopyDataClearBSSAndStart
|
|
|
|
Description : Copy DATA segment, Copy SRAM segment, clear BSS segment,
|
|
start C program. Assume that DATA and BSS sizes are multiples of 4.
|
|
***************************************************************************/
|
|
.align 4
|
|
|
|
PUBLIC (CopyDataClearBSSAndStart)
|
|
SYM(CopyDataClearBSSAndStart):
|
|
lea SYM(_data_dest_start),a0 | Get start of DATA in RAM
|
|
lea SYM(_data_src_start),a2 | Get start of DATA in ROM
|
|
cmpl a0,a2 | Are they the same?
|
|
beq.s NODATACOPY | Yes, no copy necessary
|
|
lea SYM(_data_dest_end),a1 | Get end of DATA in RAM
|
|
bra.s DATACOPYLOOPTEST | Branch into copy loop
|
|
DATACOPYLOOP:
|
|
movel a2@+,a0@+ | Copy word from ROM to RAM
|
|
DATACOPYLOOPTEST:
|
|
cmpl a1,a0 | Done?
|
|
bcs.s DATACOPYLOOP | No, skip
|
|
NODATACOPY:
|
|
|
|
/* Now, clear BSS */
|
|
lea _clear_start,a0 | Get start of BSS
|
|
lea _clear_end,a1 | Get end of BSS
|
|
clrl d0 | Value to set
|
|
bra.s ZEROLOOPTEST | Branch into clear loop
|
|
ZEROLOOP:
|
|
movel d0,a0@+ | Clear a word
|
|
ZEROLOOPTEST:
|
|
cmpl a1,a0 | Done?
|
|
bcs.s ZEROLOOP | No, skip
|
|
|
|
|
|
/*
|
|
* Right : Now we're ready to boot RTEMS
|
|
*/
|
|
move.l #_ISR_Stack_area_end,sp | Use configuration defined stack
|
|
clrl d0 | Pass in null to all boot_card() params
|
|
movel d0,a7@- | command line
|
|
jsr SYM(boot_card) | Call C boot_card function to startup RTEMS
|
|
movel a7@+,d0
|
|
MULTI_TASK_EXIT:
|
|
nop
|
|
nop
|
|
trap #14
|
|
bra MULTI_TASK_EXIT
|
|
|
|
END_CODE
|
|
|
|
.align 2
|
|
BEGIN_DATA_DCL
|
|
.align 2
|
|
PUBLIC (_M68kSpuriousInterruptCount)
|
|
SYM (_M68kSpuriousInterruptCount):
|
|
.long 0
|
|
END_DATA_DCL
|
|
|
|
END
|
|
|