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