Subversion Repositories NaviCtrl

Rev

Rev 1 | Blame | Last modification | View Log | RSS feed

#*****************************************************************************
#*
#*      Project:    Generic include file for ARM startup
#*      Filename:   startup.inc
#*      Date:       11.05.2004
#*      Rights:     Hitex Development Tools GmbH
#*                  Greschbachstr. 12
#*                  76229  Karlsruhe
#*
#****************************************************************************

# *** Startup Code (executed after Reset) ***


# Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs

        .equ    Mode_USR,   0x10
        .equ    Mode_FIQ,   0x11
        .equ    Mode_IRQ,   0x12
        .equ    Mode_SVC,   0x13
        .equ    Mode_ABT,   0x17
        .equ    Mode_UND,   0x1B
        .equ    Mode_SYS,   0x1F
            .equ        T_BIT, 0x20        /* when T bit is set, thumb mode active */
        .equ    I_BIT, 0x80        /* when I bit is set, IRQ is disabled */
        .equ    F_BIT, 0x40        /* when F bit is set, FIQ is disabled */

# ---------------------------------------------
# macro definition for stack memory reservation
# ---------------------------------------------
# use this macro to setup the stack
            .macro  setup_stack label1, size, mode_bits

            .lcomm  __range_\label1, (\size - 1) * 4
            .global \label1
            .lcomm  \label1, 4

                    ldr     r0, adr_\label1
            msr     CPSR_c, \mode_bits
            mov     r13, r0

            .endm

# use this macro to define the label for the setup_stack mcaro!
            .macro  stack_adr label1
adr_\label1:
            .word   \label1
            .endm
# ---------------------------------------------
# copy section
# use this macro to copy a section
# parameters:
# - individual name, used to create labels
# - source pointer
# - destination pointer
# - source pointer + length > end address of source
# ---------------------------------------------
            .macro  copy_section sec_name, source, destination, source_end

            ldr     R1, =\source
            ldr     R2, =\destination
            ldr     R3, =\source_end
_cplp_\sec_name:
            cmp     R1, R3
            ldrlo   R0, [R1], #4
            strlo   R0, [R2], #4
            blo     _cplp_\sec_name

            .endm

# ---------------------------------------------
# copy section 2
# use this macro to copy a section
# parameters:
# - individual name, used to create labels
# - source pointer
# - destination pointer
# - destination pointer + length > end address of destination
# ---------------------------------------------
            .macro  copy_section2 sec_name, source, destination, destination_end

            ldr     R1, =\source
            ldr     R2, =\destination
            ldr     R3, =\destination_end
_cplp_\sec_name:
            cmp     R2, R3
            ldrlo   R0, [R1], #4
            strlo   R0, [R2], #4
            blo     _cplp_\sec_name

            .endm

# ---------------------------------------------
# clear section
# use this macro to clear bss sections
# ---------------------------------------------
            .macro  clear_section sec_name, source, source_end

            mov     R0, #0
            ldr     R1, =\source
                ldr     R2, =\source_end
_cllp_\sec_name:
            cmp     R1, R2
            strlo   R0, [R1], #4
                blo     _cllp_\sec_name
            .endm

# ---------------------------------------------
# examples how to use the macros
# ---------------------------------------------
# Setup stacks for the operating modes
# ---------------------------------------------

#            setup_stack  UND_Stack, UND_Stack_Size, #Mode_UND|I_BIT|F_BIT
#            setup_stack  SVC_Stack, SVC_Stack_Size, #Mode_SVC|I_BIT|F_BIT
#            setup_stack  ABT_Stack, ABT_Stack_Size, #Mode_ABT|I_BIT|F_BIT
#            setup_stack  FIQ_Stack, FIQ_Stack_Size, #Mode_FIQ|I_BIT|F_BIT
#            setup_stack  IRQ_Stack, IRQ_Stack_Size, #Mode_IRQ|I_BIT|F_BIT
#            setup_stack  USR_Stack, USR_Stack_Size, #Mode_USR

# ---------------------------------------------
# copy sections
# ---------------------------------------------

# copy code into internal ram
#            copy_section code, __code_start__, RAM_Base_Boot, __code_end__

# Relocate .data section (Copy from ROM to RAM)
#            copy_section data, __data_start__, __data_start__+RAM_Base_Boot, __data_end__

# ---------------------------------------------
# Clear .bss section
# ---------------------------------------------

# Clear .bss section (Zero init)
#            clear_section bss, __bss_start__, __bss_end__

# ---------------------------------------------
# startup delay
# use this macro if you are working with an debugger
# the startup delay avoid problems while
# the application start before the debug interface
# becomes controled by the debugger
# ---------------------------------------------

# a goodf choice for the delay value is
# cpu clock / 100 with ATMEL controllers
# cpu clock / 40  with Philips controllers

            .macro  StartupDelay delay_value

            ldr     R1, =\delay_value
            ldr     R2, =0
__StartDelay:
            sub     R1, R1, #1
            cmp     R1, R2
            bhi     __StartDelay

            .endm

# ---------------------------------------------