OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [lib/] [libbsp/] [arm/] [vegaplus/] [start/] [start.S] - Rev 1026

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 *  start.S :     RTEMS entry point
 *
 *  Copyright (C) 2000 Canon Research Centre France SA.
 *  Emmanuel Raguet, mailto:raguet@crf.canon.fr
 *
 *  The license and distribution terms for this file may be
 *  found in found in the file LICENSE in this distribution or at
 *  http://www.OARcorp.com/rtems/license.html.
 *
 */
        
/* Register definition */

.equ CNTL_BASE_ADR,      0xF3000 /* Base address of registers */
.equ PORTCNTL,           0x0C60
.equ CSCNTL0_0,          0x0C00  /*  Offset of CS0CNTL */
.equ CSCNTL0_1,          0x0C04  /*  Offset of CS0CNTL */
.equ CSCNTL0_2,          0x0C08  /*  Offset of CS0CNTL */
.equ CSCNTL1_0,          0x0C20  /*  Offset of CS0CNTL */
.equ CSCNTL1_1,          0x0C24  /*  Offset of CS0CNTL */
.equ CSCNTL1_2,          0x0C28  /*  Offset of CS0CNTL */
.equ CNTL_CLK_ADR,       0xF2000 /*  Base address of registers */
.equ CLKCNTL,            0x08F4  /*  Offset of CS0CNTL */
.equ INTHPAI,            0x0800         
.equ INTEOI,             0x0808
.equ EOI,                0x80

/* Some standard definitions...*/

.equ Mode_USR,               0x10
.equ Mode_FIQ,               0x11
.equ Mode_IRQ,               0x12
.equ Mode_SVC,               0x13
.equ Mode_ABT,               0x17
.equ Mode_ABORT,             0x17
.equ Mode_UNDEF,             0x1B
.equ Mode_SYS,               0x1F /*only available on ARM Arch. v4*/

.equ I_Bit,                  0x80
.equ F_Bit,                  0x40


.equ Mode_SVC_MIRQ,     Mode_SVC | I_Bit | F_Bit
.equ Mode_SVC_UIRQ,     Mode_SVC
.equ Mode_IRQ_MIRQ,     Mode_SVC | I_Bit | F_Bit


.equ MARK_STACK,  0    /*Fill every stack with a pattern for debug (0 or 1)*/
 
/*-----------------------------------------------------------------------------
 * Definitions
 ----------------------------------------------------------------------------*/
.equ PID_RAM_Limit,        0x1800

/* stack size definition */
.equ FIQ_StackSize,     0x400           /* FIQ stack size */                   
.equ IRQ_StackSize,     0xE00           /* IRQ stack size */         
.equ SVC_StackSize,     0x200           /* SVC stack size */         
.equ ABORT_StackSize,   0x100           /* ABORT stack size */ 
.equ UNDEF_StackSize,   0x100           /* UNDEF stack size */        

/* sack size address */
.equ Stack_Limit,     PID_RAM_Limit           
.equ SVC_Stack,       Stack_Limit
.equ ABORT_Stack,     Stack_Limit - SVC_StackSize     
.equ UNDEF_Stack,     ABORT_Stack - ABORT_StackSize     
.equ IRQ_Stack,       UNDEF_Stack - UNDEF_StackSize   
.equ FIQ_Stack,       IRQ_Stack - IRQ_StackSize         
.equ END_FIQ,         FIQ_Stack - FIQ_StackSize

        .text
        .globl  _start

/* 
 * This "strange" code is used to switch the memory access
 * from 8 bits to 16 bits, because the vega plus accesses 
 * the memory via 8 bits at reset time
 */
         
_start:
        .long    0x00300010             /*LDR  r3,0x18*/
        .long    0x00E5009F

        .long    0x00400010
        .long    0x00E5009F

        .long    0x004600B0
        .long    0x00E100C3

         .long     0x00400002           /* CS0 = 16 bits*/
         .long   0x00E300A0

         .long   0x004200B0
         .long   0x00E100C3

         .long   0x00000009
         .long   0x00EA0000

         .long   0x003C0000
         .long     0x0000000F

         .long   0x00A60087
         .long   0x00000000

        .code 32

/* --- Initialise external bus*/
Real_start:     
    MOV     r0,#CNTL_BASE_ADR

/*Load timing configuration of CS0*/
    LDR     r1, =0x0804
    STR     r1, [r0,#CSCNTL0_0]
    LDR     r1, =0xC432
    STR     r1, [r0,#CSCNTL1_0]

/* Load timing configuration and access mode of CS1
   NOTE : Important for macro REGION_INIT of Region_init.s 
   if initialisation of data in external RAM */
        LDR     r1, =0x2200
        STR     r1, [r0,#CSCNTL0_1]
        LDR     r1, =0x8022
        STR     r1, [r0,#CSCNTL1_1]

/* Load timing configuration and access mode of CS2 */
        LDR     r1, =0x342
        STR     r1, [r0,#CSCNTL0_2]
        LDR     r1, =0xA2
        STR     r1, [r0,#CSCNTL1_2]
 

        MOV             r0,#CNTL_CLK_ADR
/* Load clock mode 55 MHz */
        LDR     r1, =0x0010
        STR     r1, [r0,#CLKCNTL]

/* Copy data from FLASH to RAM */
        LDR     r0, =_initdata        /* load address of region */
        LDR     r1, =0x400000         /* execution address of region */
        LDR     r2, =_edata           /* copy execution address into r2 */

copy:   
        CMP     r1, r2                /* loop whilst r1 < r2 */
        LDRLO   r3, [r0], #4
        STRLO   r3, [r1], #4
        BLO     copy

/* zero the bss */
        LDR     r1, =__bss_end__       /* get end of ZI region */
        LDR     r0, =__bss_start__     /* load base address of ZI region */
zi_init:        
        MOV     r2, #0
        CMP     r0, r1                 /* loop whilst r0 < r1 */
        STRLOT   r2, [r0], #4
        BLO     zi_init 

        
/* Load basic ARM7 interrupt table */
VectorInit:     
        MOV     R8, #0
        ADR     R9, Vector_Init_Block
        LDMIA   R9!, {R0-R7}    /* Copy the Vectors (8 words) */
        STMIA   R8!, {R0-R7}
        LDMIA   R9!, {R0-R7}    /* Copy the .long'ed addresses (8 words) */
        STMIA   R8!, {R0-R7}

        B       init2

/*******************************************************
 standard exception vectors table
 *** Must be located at address 0 
********************************************************/        

Vector_Init_Block:      
        LDR     PC, Reset_Addr
        LDR     PC, Undefined_Addr
        LDR     PC, SWI_Addr
        LDR     PC, Prefetch_Addr
        LDR     PC, Abort_Addr
        NOP
        LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr

        .globl Reset_Addr
Reset_Addr:     .long   _start 
Undefined_Addr: .long   Undefined_Handler
SWI_Addr:       .long   SWI_Handler
Prefetch_Addr:  .long   Prefetch_Handler
Abort_Addr:     .long   Abort_Handler
                .long   0        
IRQ_Addr:       .long   IRQ_Handler
FIQ_Addr:       .long   FIQ_Handler
        
/* The following handlers do not do anything useful */
        .globl Undefined_Handler
Undefined_Handler:      
        B       Undefined_Handler
        .globl SWI_Handler
SWI_Handler:    
        B       SWI_Handler 
        .globl Prefetch_Handler
Prefetch_Handler:       
        B       Prefetch_Handler
        .globl Abort_Handler
Abort_Handler:  
        B       Abort_Handler
        .globl IRQ_Handler
IRQ_Handler:    
        B       IRQ_Handler
        .globl FIQ_Handler
FIQ_Handler:    
        B       FIQ_Handler

init2 : 
/* --- Initialise stack pointer registers
   Set up the ABORT stack pointer last and stay in SVC mode */
    MOV     r0, #(Mode_ABORT | I_Bit | F_Bit)   /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =ABORT_Stack

/* Enter IRQ mode and set up the IRQ stack pointer */
    MOV     r0, #Mode_IRQ | I_Bit | F_Bit     /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =IRQ_Stack

/* Enter FIQ mode and set up the FIQ stack pointer */
    MOV     r0, #Mode_FIQ | I_Bit | F_Bit     /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =FIQ_Stack

/* Set up the SVC stack pointer last and stay in SVC mode */
    MOV     r0, #Mode_SVC | I_Bit | F_Bit     /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =SVC_Stack

/* --- Now we enter the C code */

    B   boot_card












Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.