/* | |
Copyright (c) 2015, Nordic Semiconductor ASA | |
All rights reserved. | |
Redistribution and use in source and binary forms, with or without | |
modification, are permitted provided that the following conditions are met: | |
* Redistributions of source code must retain the above copyright notice, this | |
list of conditions and the following disclaimer. | |
* 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. | |
* Neither the name of Nordic Semiconductor ASA nor the names of its | |
contributors may be used to endorse or promote products derived from | |
this software without specific prior written permission. | |
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 HOLDER 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. | |
*/ | |
/* | |
NOTE: Template files (including this one) are application specific and therefore | |
expected to be copied into the application project folder prior to its use! | |
*/ | |
.syntax unified | |
.arch armv6-m | |
.section .stack | |
.align 3 | |
.equ Stack_Size, 432 | |
.globl __StackTop | |
.globl __StackLimit | |
__StackLimit: | |
.space Stack_Size | |
.size __StackLimit, . - __StackLimit | |
__StackTop: | |
.size __StackTop, . - __StackTop | |
.section .heap | |
.align 3 | |
#ifdef __HEAP_SIZE | |
.equ Heap_Size, __HEAP_SIZE | |
#else | |
.equ Heap_Size, 0 | |
#endif | |
.globl __HeapBase | |
.globl __HeapLimit | |
__HeapBase: | |
.if Heap_Size | |
.space Heap_Size | |
.endif | |
.size __HeapBase, . - __HeapBase | |
__HeapLimit: | |
.size __HeapLimit, . - __HeapLimit | |
.section .isr_vector | |
.align 2 | |
.globl __isr_vector | |
__isr_vector: | |
.long __StackTop /* Top of Stack */ | |
.long Reset_Handler /* Reset Handler */ | |
.long _NMI_Handler /* NMI Handler */ | |
.long _HardFault_Handler /* Hard Fault Handler */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long _SVC_Handler /* SVCall Handler */ | |
.long 0 /* Reserved */ | |
.long 0 /* Reserved */ | |
.long _PendSV_Handler /* PendSV Handler */ | |
.long _SysTick_Handler /* SysTick Handler */ | |
/* External Interrupts */ | |
.long _POWER_CLOCK_IRQHandler | |
.long _RADIO_IRQHandler | |
.long _UART0_IRQHandler | |
.long _SPI0_TWI0_IRQHandler | |
.long _SPI1_TWI1_IRQHandler | |
.long 0 /*Reserved */ | |
.long _GPIOTE_IRQHandler | |
.long _ADC_IRQHandler | |
.long _TIMER0_IRQHandler | |
.long _TIMER1_IRQHandler | |
.long _TIMER2_IRQHandler | |
.long _RTC0_IRQHandler | |
.long _TEMP_IRQHandler | |
.long _RNG_IRQHandler | |
.long _ECB_IRQHandler | |
.long _CCM_AAR_IRQHandler | |
.long _WDT_IRQHandler | |
.long _RTC1_IRQHandler | |
.long _QDEC_IRQHandler | |
.long _LPCOMP_IRQHandler | |
.long _SWI0_IRQHandler | |
.long _SWI1_IRQHandler | |
.long _SWI2_IRQHandler | |
.long _SWI3_IRQHandler | |
.long _SWI4_IRQHandler | |
.long _SWI5_IRQHandler | |
.long 0 /*Reserved */ | |
.long 0 /*Reserved */ | |
.long 0 /*Reserved */ | |
.long 0 /*Reserved */ | |
.long 0 /*Reserved */ | |
.long 0 /*Reserved */ | |
.size __isr_vector, . - __isr_vector | |
/* Reset Handler */ | |
.equ NRF_POWER_RAMON_ADDRESS, 0x40000524 | |
.equ NRF_POWER_RAMONB_ADDRESS, 0x40000554 | |
.equ NRF_POWER_RAMONx_RAMxON_ONMODE_Msk, 0x3 | |
.text | |
.thumb | |
.thumb_func | |
.align 1 | |
.globl Reset_Handler | |
.type Reset_Handler, %function | |
Reset_Handler: | |
.fnstart | |
/* Make sure ALL RAM banks are powered on */ | |
MOVS R1, #NRF_POWER_RAMONx_RAMxON_ONMODE_Msk | |
LDR R0, =NRF_POWER_RAMON_ADDRESS | |
LDR R2, [R0] | |
ORRS R2, R1 | |
STR R2, [R0] | |
LDR R0, =NRF_POWER_RAMONB_ADDRESS | |
LDR R2, [R0] | |
ORRS R2, R1 | |
STR R2, [R0] | |
/* Clear BSS */ | |
subs r0, r0 | |
ldr r2, =__bss_start__ | |
ldr r3, =__bss_end__ | |
.bss_zero_loop: | |
cmp r2, r3 | |
bhs .data_copy_loop | |
stmia r2!, {r0} | |
b .bss_zero_loop | |
/* Loop to copy data from read only memory to RAM. The ranges | |
* of copy from/to are specified by following symbols evaluated in | |
* linker script. | |
* __etext: End of code section, i.e., begin of data sections to copy from. | |
* __data_start__/__data_end__: RAM address range that data should be | |
* copied to. Both must be aligned to 4 bytes boundary. */ | |
.data_copy_loop: | |
ldr r1, =__etext | |
ldr r2, =__data_start__ | |
ldr r3, =__data_end__ | |
subs r3, r2 | |
ble .LC0 | |
.LC1: | |
subs r3, 4 | |
ldr r0, [r1,r3] | |
str r0, [r2,r3] | |
bgt .LC1 | |
.LC0: | |
LDR R0, =__HeapBase | |
LDR R1, =__HeapLimit | |
BL _sbrkInit | |
LDR R0, =SystemInit | |
BLX R0 | |
BL hal_system_init | |
LDR R0, =_start | |
BX R0 | |
.pool | |
.cantunwind | |
.fnend | |
.size Reset_Handler,.-Reset_Handler | |
.section ".text" | |
/* Dummy Exception Handlers (infinite loops which can be modified) */ | |
.weak NMI_Handler | |
.type NMI_Handler, %function | |
NMI_Handler: | |
B . | |
.size NMI_Handler, . - NMI_Handler | |
.weak SVC_Handler | |
.type SVC_Handler, %function | |
SVC_Handler: | |
B . | |
.size SVC_Handler, . - SVC_Handler | |
.weak PendSV_Handler | |
.type PendSV_Handler, %function | |
PendSV_Handler: | |
B . | |
.size PendSV_Handler, . - PendSV_Handler | |
.weak SysTick_Handler | |
.type SysTick_Handler, %function | |
SysTick_Handler: | |
B . | |
.size SysTick_Handler, . - SysTick_Handler | |
/* Default handler. This uses the vector in the relocated vector table */ | |
.globl Default_Handler | |
.type Default_Handler, %function | |
Default_Handler: | |
LDR R2, =__vector_tbl_reloc__ | |
MRS R0, PSR | |
MOVS R1, #0x3F | |
ANDS R0, R1 | |
LSLS R0, R0, #2 | |
LDR R0, [R0, R2] | |
BX R0 | |
.size Default_Handler, . - Default_Handler | |
/* | |
* All of the following IRQ Handlers will point to the default handler unless | |
* they are defined elsewhere. | |
*/ | |
.macro IRQ handler | |
.weak \handler | |
.set \handler, Default_Handler | |
.endm | |
IRQ _NMI_Handler | |
IRQ _HardFault_Handler | |
IRQ _SVC_Handler | |
IRQ _PendSV_Handler | |
IRQ _SysTick_Handler | |
IRQ _POWER_CLOCK_IRQHandler | |
IRQ _RADIO_IRQHandler | |
IRQ _UART0_IRQHandler | |
IRQ _SPI0_TWI0_IRQHandler | |
IRQ _SPI1_TWI1_IRQHandler | |
IRQ _GPIOTE_IRQHandler | |
IRQ _ADC_IRQHandler | |
IRQ _TIMER0_IRQHandler | |
IRQ _TIMER1_IRQHandler | |
IRQ _TIMER2_IRQHandler | |
IRQ _RTC0_IRQHandler | |
IRQ _TEMP_IRQHandler | |
IRQ _RNG_IRQHandler | |
IRQ _ECB_IRQHandler | |
IRQ _CCM_AAR_IRQHandler | |
IRQ _WDT_IRQHandler | |
IRQ _RTC1_IRQHandler | |
IRQ _QDEC_IRQHandler | |
IRQ _LPCOMP_IRQHandler | |
IRQ _SWI0_IRQHandler | |
IRQ _SWI1_IRQHandler | |
IRQ _SWI2_IRQHandler | |
IRQ _SWI3_IRQHandler | |
IRQ _SWI4_IRQHandler | |
IRQ _SWI5_IRQHandler | |
.end |