176 lines
5.6 KiB
ArmAsm
176 lines
5.6 KiB
ArmAsm
/* ------------------------------------------------------------------------- */
|
|
/* */
|
|
/* Copyright 1997-2016 Freescale Semiconductor, Inc. */
|
|
/* Copyright 2016-2019 NXP */
|
|
/* All rights reserved. */
|
|
/* */
|
|
/* SPDX-License-Identifier: BSD-3-Clause */
|
|
/*****************************************************************************/
|
|
/* Version: GCC for ARM Embedded Processors */
|
|
/*****************************************************************************/
|
|
.syntax unified
|
|
.arch armv7-m
|
|
|
|
#include"flexram_config.s"
|
|
|
|
|
|
/* Reset Handler */
|
|
|
|
.thumb_func
|
|
.align 2
|
|
.globl Reset_Handler
|
|
.type Reset_Handler, %function
|
|
Reset_Handler:
|
|
cpsid i /* Mask interrupts */
|
|
.equ VTOR, 0xE000ED08
|
|
ldr r0, =VTOR
|
|
ldr r1, =__isr_vector
|
|
str r1, [r0]
|
|
ldr r2, [r1]
|
|
msr msp, r2
|
|
|
|
/* Reconfigure the memory map, which must match the setting of the linker script */
|
|
dsb
|
|
isb
|
|
ldr r0, =__iomux_gpr17_adr /* load IOMUXC_GPR17 register address to R0 */
|
|
ldr r1, =__iomux_gpr17_value /* move FlexRAM configuration value to R1 */
|
|
str r1,[r0] /* store FLEXRAM configuration value to IOMUXC_GPR17 */
|
|
dsb
|
|
isb
|
|
ldr r0, =__iomux_gpr16_adr /* load IOMUXC_GPR16 register address to R0 */
|
|
ldr r1,[r0] /* load IOMUXC_GPR16 register value to R1 */
|
|
orr r1, r1, #4 /* set corresponding FLEXRAM_BANK_CFG_SEL bit */
|
|
str r1,[r0] /* store the value to IOMUXC_GPR16 (FLEXRAM_BANK_CFG_SEL = '1') */
|
|
dsb
|
|
isb
|
|
|
|
#ifndef __NO_SYSTEM_INIT
|
|
ldr r0,=SystemInit
|
|
blx r0
|
|
#endif
|
|
/* 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
|
|
* __noncachedata_start__/__noncachedata_end__ : none cachable region
|
|
* __ram_function_start__/__ram_function_end__ : ramfunction region
|
|
* copied to. Both must be aligned to 4 bytes boundary. */
|
|
|
|
ldr r1, =__etext
|
|
ldr r2, =__data_start__
|
|
ldr r3, =__data_end__
|
|
|
|
#ifdef __PERFORMANCE_IMPLEMENTATION
|
|
/* Here are two copies of loop implementations. First one favors performance
|
|
* and the second one favors code size. Default uses the second one.
|
|
* Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */
|
|
subs r3, r2
|
|
ble .LC1
|
|
.LC0:
|
|
subs r3, #4
|
|
ldr r0, [r1, r3]
|
|
str r0, [r2, r3]
|
|
bgt .LC0
|
|
.LC1:
|
|
#else /* code size implemenation */
|
|
.LC0:
|
|
cmp r2, r3
|
|
ittt lt
|
|
ldrlt r0, [r1], #4
|
|
strlt r0, [r2], #4
|
|
blt .LC0
|
|
#endif
|
|
#ifdef __STARTUP_INITIALIZE_RAMFUNCTION
|
|
ldr r2, =__ram_function_start__
|
|
ldr r3, =__ram_function_end__
|
|
#ifdef __PERFORMANCE_IMPLEMENTATION
|
|
/* Here are two copies of loop implementations. First one favors performance
|
|
* and the second one favors code size. Default uses the second one.
|
|
* Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */
|
|
subs r3, r2
|
|
ble .LC_ramfunc_copy_end
|
|
.LC_ramfunc_copy_start:
|
|
subs r3, #4
|
|
ldr r0, [r1, r3]
|
|
str r0, [r2, r3]
|
|
bgt .LC_ramfunc_copy_start
|
|
.LC_ramfunc_copy_end:
|
|
#else /* code size implemenation */
|
|
.LC_ramfunc_copy_start:
|
|
cmp r2, r3
|
|
ittt lt
|
|
ldrlt r0, [r1], #4
|
|
strlt r0, [r2], #4
|
|
blt .LC_ramfunc_copy_start
|
|
#endif
|
|
#endif /* __STARTUP_INITIALIZE_RAMFUNCTION */
|
|
#ifdef __STARTUP_INITIALIZE_NONCACHEDATA
|
|
ldr r2, =__noncachedata_start__
|
|
ldr r3, =__noncachedata_init_end__
|
|
#ifdef __PERFORMANCE_IMPLEMENTATION
|
|
/* Here are two copies of loop implementations. First one favors performance
|
|
* and the second one favors code size. Default uses the second one.
|
|
* Define macro "__PERFORMANCE_IMPLEMENTATION" in project to use the first one */
|
|
subs r3, r2
|
|
ble .LC3
|
|
.LC2:
|
|
subs r3, #4
|
|
ldr r0, [r1, r3]
|
|
str r0, [r2, r3]
|
|
bgt .LC2
|
|
.LC3:
|
|
#else /* code size implemenation */
|
|
.LC2:
|
|
cmp r2, r3
|
|
ittt lt
|
|
ldrlt r0, [r1], #4
|
|
strlt r0, [r2], #4
|
|
blt .LC2
|
|
#endif
|
|
/* zero inited ncache section initialization */
|
|
ldr r3, =__noncachedata_end__
|
|
movs r0,0
|
|
.LC4:
|
|
cmp r2,r3
|
|
itt lt
|
|
strlt r0,[r2],#4
|
|
blt .LC4
|
|
#endif /* __STARTUP_INITIALIZE_NONCACHEDATA */
|
|
|
|
#ifdef __STARTUP_CLEAR_BSS
|
|
/* This part of work usually is done in C library startup code. Otherwise,
|
|
* define this macro to enable it in this startup.
|
|
*
|
|
* Loop to zero out BSS section, which uses following symbols
|
|
* in linker script:
|
|
* __bss_start__: start of BSS section. Must align to 4
|
|
* __bss_end__: end of BSS section. Must align to 4
|
|
*/
|
|
ldr r1, =__bss_start__
|
|
ldr r2, =__bss_end__
|
|
|
|
movs r0, 0
|
|
.LC5:
|
|
cmp r1, r2
|
|
itt lt
|
|
strlt r0, [r1], #4
|
|
blt .LC5
|
|
#endif /* __STARTUP_CLEAR_BSS */
|
|
|
|
cpsie i /* Unmask interrupts */
|
|
#ifndef __START
|
|
#define __START _start
|
|
#endif
|
|
#ifndef __ATOLLIC__
|
|
ldr r0,=__START
|
|
blx r0
|
|
#else
|
|
ldr r0,=__libc_init_array
|
|
blx r0
|
|
ldr r0,=main
|
|
bx r0
|
|
#endif
|
|
.pool
|
|
.size Reset_Handler, . - Reset_Handler
|