summaryrefslogtreecommitdiffstats
path: root/uc_str912/prj_blinky_complex_startup/startup_generic.S
diff options
context:
space:
mode:
Diffstat (limited to 'uc_str912/prj_blinky_complex_startup/startup_generic.S')
-rw-r--r--uc_str912/prj_blinky_complex_startup/startup_generic.S162
1 files changed, 162 insertions, 0 deletions
diff --git a/uc_str912/prj_blinky_complex_startup/startup_generic.S b/uc_str912/prj_blinky_complex_startup/startup_generic.S
new file mode 100644
index 0000000..711a5d0
--- /dev/null
+++ b/uc_str912/prj_blinky_complex_startup/startup_generic.S
@@ -0,0 +1,162 @@
+#*****************************************************************************
+#*
+#* 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 F_BIT, 0x40 /* when F bit is set, FIQ is disabled */
+ .equ I_BIT, 0x80 /* when I bit is set, IRQ 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
+
+# ---------------------------------------------
OpenPOWER on IntegriCloud