summaryrefslogblamecommitdiffstats
path: root/bsps/m68k/mcf52235/start/start.S
blob: e1d837cab59a6da53aeeb418a4f2bb29838910f1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                           
                                         






                      
 







                                                   
                                              








                                                    
                                        








                                                               






                                        






























































































































































































































































                                                                                 
           
                                                       
                                                           

                                           
  







                                                
  





                     
                   
       
       
 
  















                                                        
                        


                       
                              










                             
                              












                                                         

                                                                  














                                                                    
                                                                

      
                        


















                                                      
                   























                                    
/*
 *  mcf52235 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-1998.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.org/license/LICENSE.
 */

#include <rtems/asm.h>

.extern _StackInit

BEGIN_CODE

    PUBLIC (_INTERRUPT_VECTOR)
SYM(_INTERRUPT_VECTOR):

    .long   _StackInit /* 00 Initial 'SSP' */
    .long   SYM(start) /* 01 Initial PC */
    .long   SYM(_uhoh) /* 02 Access Error */
    .long   SYM(_uhoh) /* 03 Address Error */
    .long   SYM(_uhoh) /* 04 Illegal Instruction */
    .long   SYM(_uhoh) /* 05 Divide by Zero */
    .long   SYM(_uhoh) /* 06 Reserved */
    .long   SYM(_uhoh) /* 07 Reserved */
    .long   SYM(_uhoh) /* 08 Privilege Violation */
    .long   SYM(_uhoh) /* 09 Trace */
    .long   SYM(_uhoh) /* 10 Unimplemented A-Line */
    .long   SYM(_uhoh) /* 11 Unimplemented F-Line */
    .long   SYM(_uhoh) /* 12 Debug Interrupt */
    .long   SYM(_uhoh) /* 13 Reserved */
    .long   SYM(_uhoh) /* 14 Format Error */
    .long   SYM(_uhoh) /* 15 Reserved */
    .long   SYM(_uhoh) /* 16 Reserved */
    .long   SYM(_uhoh) /* 17 Reserved */
    .long   SYM(_uhoh) /* 18 Reserved */
    .long   SYM(_uhoh) /* 19 Reserved */
    .long   SYM(_uhoh) /* 20 Reserved */
    .long   SYM(_uhoh) /* 21 Reserved */
    .long   SYM(_uhoh) /* 22 Reserved */
    .long   SYM(_uhoh) /* 23 Reserved */
    .long   SYM(_spuriousInterrupt) /* 24 Spurious Interrupt */
    .long   SYM(_uhoh) /* 25 Reserved */
    .long   SYM(_uhoh) /* 26 Reserved */
    .long   SYM(_uhoh) /* 27 Reserved */
    .long   SYM(_uhoh) /* 28 Reserved */
    .long   SYM(_uhoh) /* 29 Reserved */
    .long   SYM(_uhoh) /* 30 Reserved */
    .long   SYM(_uhoh) /* 31 Reserved */
    .long   SYM(_uhoh) /* 32 TRAP #0 */
    .long   SYM(_uhoh) /* 33 TRAP #1 */
    .long   SYM(_uhoh) /* 34 TRAP #2 */
    .long   SYM(_uhoh) /* 35 TRAP #3 */
    .long   SYM(_uhoh) /* 36 TRAP #4 */
    .long   SYM(_uhoh) /* 37 TRAP #5 */
    .long   SYM(_uhoh) /* 38 TRAP #6 */
    .long   SYM(_uhoh) /* 39 TRAP #7 */
    .long   SYM(_uhoh) /* 40 TRAP #8 */
    .long   SYM(_uhoh) /* 41 TRAP #9 */
    .long   SYM(_uhoh) /* 42 TRAP #10 */
    .long   SYM(_uhoh) /* 43 TRAP #11 */
    .long   SYM(_uhoh) /* 44 TRAP #12 */
    .long   SYM(_uhoh) /* 45 TRAP #13 */
    .long   SYM(_uhoh) /* 46 TRAP #14 */
    .long   SYM(_uhoh) /* 47 TRAP #15 */
    .long   SYM(_uhoh) /* 48 Reserved */
    .long   SYM(_uhoh) /* 49 Reserved */
    .long   SYM(_uhoh) /* 50 Reserved */
    .long   SYM(_uhoh) /* 51 Reserved */
    .long   SYM(_uhoh) /* 52 Reserved */
    .long   SYM(_uhoh) /* 53 Reserved */
    .long   SYM(_uhoh) /* 54 Reserved */
    .long   SYM(_uhoh) /* 55 Reserved */
    .long   SYM(_uhoh) /* 56 Reserved */
    .long   SYM(_uhoh) /* 57 Reserved */
    .long   SYM(_uhoh) /* 58 Reserved */
    .long   SYM(_uhoh) /* 59 Reserved */
    .long   SYM(_uhoh) /* 60 Reserved */
    .long   SYM(_uhoh) /* 61 Reserved */
    .long   SYM(_uhoh) /* 62 Reserved */
    .long   SYM(_uhoh) /* 63 Reserved */

    /* INTC0 */

    .long   SYM(_uhoh) /* 64*/
    .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*/

    /* INTC1 */

    .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*/

/*
 * We must write the flash configuration here.  This portion of flash is shadowed
 * by some flash registers, so we can't put code here!
 */

    PUBLIC (_FLASH_CONFIGURATION_FIELD)
SYM(_FLASH_CONFIGURATION_FIELD):

_key_upper: .long   0x00000000
_key_lower: .long   0x00000000
_cfm_prot:  .long   0x00000000
_cfm_sacc:  .long   0x00000000
_cfm_dacc:  .long   0x00000000
_cfm_msec:  .long   0x00000000

/*
 * 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

/*
 * Spurious Interrupt Handler
 */
.align 4
    PUBLIC (_spuriousInterrupt)
SYM(_spuriousInterrupt):
    addql   #1, SYM(_M68kSpuriousInterruptCount)
    rte

/*
 * Write VBR Register
 */
.align 4
    PUBLIC (_wr_vbr)
SYM(_wr_vbr):
    move.l  4(sp), d0
    movec   d0, vbr
    nop
    rts

/*
 * Board startup
 * Disable watchdog, interrupts
 * Enable sram
 */
.align 4
    PUBLIC (start)
SYM(start):

    /* Mask off interupts */
    move.w   #0x2700, sr

    /* Save off reset values of D0 and D1 */
    move.l  d0, d6
    move.l  d1, d7

    /* Initialize RAMBAR: locate SRAM and validate it */
    move.l  #RamBase, d0
    add.l   #0x21, d0
    movec   d0, %rambar

    /* Locate Stack Pointer */
    move.l  #_StackInit, sp

    /* Initialize FLASHBAR */
    move.l  #_FlashBase, d0
    cmp.l   #0x00000000, d0
    bne     _change_flashbar
    add.l   #0x61, d0
    movec   d0, %flashbar

_continue_startup:

    /* Locate Stack Pointer */
    move.l  #_StackInit, sp

    /* Save off intial D0 and D1 to RAM */
    move.l  d6, SYM(_d0_reset)
    move.l  d7, SYM(_d1_reset)

    /*
     * Remainder of the startup code is handled by C code
     * This never returns
     */
    jmp SYM(Init52235)

_change_flashbar:
    /*
    * The following sequence is used to set FLASHBAR. Since we may
    * be executing from Flash, we must put the routine into SRAM for
    * execution and then jump back to Flash using the new address.
    *
    * The following instructions are coded into the SRAM:
    *
    * move.l    #(__FLASH + 0x61),d0
    * movec    d0, FLASHBAR
    * jmp        _continue_startup
    *
    * An arbitrary SRAM address is chosen until the real address
    * can be loaded.
    *
    * This routine is not necessary if the default Flash address
    * (0x00000000) is used.
    *
    * If running in SRAM, change_flashbar should not be executed
    */

    move.l  #RamBase, a0

    /* Code "move.l #(__FLASH + 0x61),d0" into SRAM */
    move.w  #0x203C, d0
    move.w  d0, (a0)+
    move.l  #_FlashBase, d0
    add.l   #0x61, d0
    move.l  d0, (a0)+

    /* Code "movec d0,FLASHBAR" into SRAM */
    move.l  #0x4e7b0C04, d0
    move.l  d0, (a0)+

    /* Code "jmp _continue_startup" into SRAM */
    move.w  #0x4EF9, d0
    move.w  d0, (a0)+
    move.l  #_continue_startup, d0
    move.l  d0, (a0)+

    /* Jump to code segment in internal SRAM */
    jmp     RamBase

END_CODE


BEGIN_DATA_DCL

    .align 4

PUBLIC (_M68kSpuriousInterruptCount)
SYM (_M68kSpuriousInterruptCount):
    .long   0

PUBLIC (_d0_reset)
SYM (_d0_reset):
    .long   0

PUBLIC (_d1_reset)
SYM (_d1_reset):
    .long   0

END_DATA_DCL

END